mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Terminate RGBGFX when opening a file fails
`std::filebuf::open`'s result must be checked, though that's not obvious.
This commit is contained in:
@@ -254,7 +254,9 @@ static void registerInput(char const *arg) {
|
|||||||
*/
|
*/
|
||||||
static std::vector<size_t> readAtFile(std::string const &path, std::vector<char> &argPool) {
|
static std::vector<size_t> readAtFile(std::string const &path, std::vector<char> &argPool) {
|
||||||
std::filebuf file;
|
std::filebuf file;
|
||||||
file.open(path, std::ios_base::in);
|
if (!file.open(path, std::ios_base::in)) {
|
||||||
|
fatal("Error reading @%s: %s", path.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
static_assert(decltype(file)::traits_type::eof() == EOF,
|
static_assert(decltype(file)::traits_type::eof() == EOF,
|
||||||
"isblank(char_traits<...>::eof()) is UB!");
|
"isblank(char_traits<...>::eof()) is UB!");
|
||||||
|
|||||||
@@ -625,7 +625,9 @@ static std::tuple<DefaultInitVec<size_t>, std::vector<Palette>>
|
|||||||
|
|
||||||
static void outputPalettes(std::vector<Palette> const &palettes) {
|
static void outputPalettes(std::vector<Palette> const &palettes) {
|
||||||
std::filebuf output;
|
std::filebuf output;
|
||||||
output.open(options.palettes, std::ios_base::out | std::ios_base::binary);
|
if (!output.open(options.palettes, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to open \"%s\": %s", options.palettes.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
for (Palette const &palette : palettes) {
|
for (Palette const &palette : palettes) {
|
||||||
for (uint8_t i = 0; i < options.nbColorsPerPal; ++i) {
|
for (uint8_t i = 0; i < options.nbColorsPerPal; ++i) {
|
||||||
@@ -751,7 +753,9 @@ static void outputTileData(Png const &png, DefaultInitVec<AttrmapEntry> const &a
|
|||||||
std::vector<Palette> const &palettes,
|
std::vector<Palette> const &palettes,
|
||||||
DefaultInitVec<size_t> const &mappings) {
|
DefaultInitVec<size_t> const &mappings) {
|
||||||
std::filebuf output;
|
std::filebuf output;
|
||||||
output.open(options.output, std::ios_base::out | std::ios_base::binary);
|
if (!output.open(options.output, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to open \"%s\": %s", options.output.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t remainingTiles = (png.getWidth() / 8) * (png.getHeight() / 8);
|
uint64_t remainingTiles = (png.getWidth() / 8) * (png.getHeight() / 8);
|
||||||
if (remainingTiles <= options.trim) {
|
if (remainingTiles <= options.trim) {
|
||||||
@@ -783,15 +787,21 @@ static void outputMaps(DefaultInitVec<AttrmapEntry> const &attrmap,
|
|||||||
std::optional<std::filebuf> tilemapOutput, attrmapOutput, palmapOutput;
|
std::optional<std::filebuf> tilemapOutput, attrmapOutput, palmapOutput;
|
||||||
if (!options.tilemap.empty()) {
|
if (!options.tilemap.empty()) {
|
||||||
tilemapOutput.emplace();
|
tilemapOutput.emplace();
|
||||||
tilemapOutput->open(options.tilemap, std::ios_base::out | std::ios_base::binary);
|
if (!tilemapOutput->open(options.tilemap, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to open \"%s\": %s", options.tilemap.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!options.attrmap.empty()) {
|
if (!options.attrmap.empty()) {
|
||||||
attrmapOutput.emplace();
|
attrmapOutput.emplace();
|
||||||
attrmapOutput->open(options.attrmap, std::ios_base::out | std::ios_base::binary);
|
if (!attrmapOutput->open(options.attrmap, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to open \"%s\": %s", options.attrmap.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!options.palmap.empty()) {
|
if (!options.palmap.empty()) {
|
||||||
palmapOutput.emplace();
|
palmapOutput.emplace();
|
||||||
palmapOutput->open(options.palmap, std::ios_base::out | std::ios_base::binary);
|
if (!palmapOutput->open(options.palmap, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to open \"%s\": %s", options.palmap.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t tileID = 0;
|
uint8_t tileID = 0;
|
||||||
@@ -887,7 +897,9 @@ static UniqueTiles dedupTiles(Png const &png, DefaultInitVec<AttrmapEntry> &attr
|
|||||||
|
|
||||||
static void outputTileData(UniqueTiles const &tiles) {
|
static void outputTileData(UniqueTiles const &tiles) {
|
||||||
std::filebuf output;
|
std::filebuf output;
|
||||||
output.open(options.output, std::ios_base::out | std::ios_base::binary);
|
if (!output.open(options.output, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to create \"%s\": %s", options.output.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t tileID = 0;
|
uint16_t tileID = 0;
|
||||||
for (auto iter = tiles.begin(), end = tiles.end() - options.trim; iter != end; ++iter) {
|
for (auto iter = tiles.begin(), end = tiles.end() - options.trim; iter != end; ++iter) {
|
||||||
@@ -900,7 +912,9 @@ static void outputTileData(UniqueTiles const &tiles) {
|
|||||||
|
|
||||||
static void outputTilemap(DefaultInitVec<AttrmapEntry> const &attrmap) {
|
static void outputTilemap(DefaultInitVec<AttrmapEntry> const &attrmap) {
|
||||||
std::filebuf output;
|
std::filebuf output;
|
||||||
output.open(options.tilemap, std::ios_base::out | std::ios_base::binary);
|
if (!output.open(options.tilemap, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to create \"%s\": %s", options.tilemap.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
for (AttrmapEntry const &entry : attrmap) {
|
for (AttrmapEntry const &entry : attrmap) {
|
||||||
output.sputc(entry.tileID); // The tile ID has already been converted
|
output.sputc(entry.tileID); // The tile ID has already been converted
|
||||||
@@ -910,7 +924,9 @@ static void outputTilemap(DefaultInitVec<AttrmapEntry> const &attrmap) {
|
|||||||
static void outputAttrmap(DefaultInitVec<AttrmapEntry> const &attrmap,
|
static void outputAttrmap(DefaultInitVec<AttrmapEntry> const &attrmap,
|
||||||
DefaultInitVec<size_t> const &mappings) {
|
DefaultInitVec<size_t> const &mappings) {
|
||||||
std::filebuf output;
|
std::filebuf output;
|
||||||
output.open(options.attrmap, std::ios_base::out | std::ios_base::binary);
|
if (!output.open(options.attrmap, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to create \"%s\": %s", options.attrmap.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
for (AttrmapEntry const &entry : attrmap) {
|
for (AttrmapEntry const &entry : attrmap) {
|
||||||
uint8_t attr = entry.xFlip << 5 | entry.yFlip << 6;
|
uint8_t attr = entry.xFlip << 5 | entry.yFlip << 6;
|
||||||
@@ -923,7 +939,9 @@ static void outputAttrmap(DefaultInitVec<AttrmapEntry> const &attrmap,
|
|||||||
static void outputPalmap(DefaultInitVec<AttrmapEntry> const &attrmap,
|
static void outputPalmap(DefaultInitVec<AttrmapEntry> const &attrmap,
|
||||||
DefaultInitVec<size_t> const &mappings) {
|
DefaultInitVec<size_t> const &mappings) {
|
||||||
std::filebuf output;
|
std::filebuf output;
|
||||||
output.open(options.attrmap, std::ios_base::out | std::ios_base::binary);
|
if (!output.open(options.attrmap, std::ios_base::out | std::ios_base::binary)) {
|
||||||
|
fatal("Failed to create \"%s\": %s", options.attrmap.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
for (AttrmapEntry const &entry : attrmap) {
|
for (AttrmapEntry const &entry : attrmap) {
|
||||||
output.sputc(entry.getPalID(mappings));
|
output.sputc(entry.getPalID(mappings));
|
||||||
|
|||||||
@@ -147,7 +147,9 @@ void reverse() {
|
|||||||
};
|
};
|
||||||
if (!options.palettes.empty()) {
|
if (!options.palettes.empty()) {
|
||||||
std::filebuf file;
|
std::filebuf file;
|
||||||
file.open(options.palettes, std::ios::in | std::ios::binary);
|
if (!file.open(options.palettes, std::ios::in | std::ios::binary)) {
|
||||||
|
fatal("Failed to open \"%s\": %s", options.palettes.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
palettes.clear();
|
palettes.clear();
|
||||||
std::array<uint8_t, sizeof(uint16_t) * 4> buf; // 4 colors
|
std::array<uint8_t, sizeof(uint16_t) * 4> buf; // 4 colors
|
||||||
@@ -232,7 +234,9 @@ void reverse() {
|
|||||||
|
|
||||||
options.verbosePrint(Options::VERB_LOG_ACT, "Writing image...\n");
|
options.verbosePrint(Options::VERB_LOG_ACT, "Writing image...\n");
|
||||||
std::filebuf pngFile;
|
std::filebuf pngFile;
|
||||||
pngFile.open(options.input, std::ios::out | std::ios::binary);
|
if (!pngFile.open(options.input, std::ios::out | std::ios::binary)) {
|
||||||
|
fatal("Failed to create \"%s\": %s", options.input.c_str(), strerror(errno));
|
||||||
|
}
|
||||||
png_structp png = png_create_write_struct(
|
png_structp png = png_create_write_struct(
|
||||||
PNG_LIBPNG_VER_STRING,
|
PNG_LIBPNG_VER_STRING,
|
||||||
const_cast<png_voidp>(static_cast<void const *>(options.input.c_str())), pngError,
|
const_cast<png_voidp>(static_cast<void const *>(options.input.c_str())), pngError,
|
||||||
|
|||||||
Reference in New Issue
Block a user