diff --git a/tools/common.h b/tools/common.h index 6825fbb97..147e2520e 100644 --- a/tools/common.h +++ b/tools/common.h @@ -27,7 +27,7 @@ void usage_exit(int status) { int getopt_long_index; #define getopt_long(argc, argv, optstring, longopts) getopt_long(argc, argv, optstring, longopts, &getopt_long_index) -void *malloc_verbose(size_t size) { +void *xmalloc(size_t size) { errno = 0; void *m = malloc(size); if (!m) { @@ -36,7 +36,7 @@ void *malloc_verbose(size_t size) { return m; } -void *calloc_verbose(size_t size) { +void *xcalloc(size_t size) { errno = 0; void *m = calloc(size, 1); if (!m) { @@ -45,7 +45,16 @@ void *calloc_verbose(size_t size) { return m; } -FILE *fopen_verbose(const char *filename, char rw) { +void *xrealloc(void *m, size_t size) { + errno = 0; + m = realloc(m, size); + if (!m) { + error_exit("Could not allocate %zu bytes: %s\n", size, strerror(errno)); + } + return m; +} + +FILE *xfopen(const char *filename, char rw) { char mode[3] = {rw, 'b', '\0'}; errno = 0; FILE *f = fopen(filename, mode); @@ -55,7 +64,7 @@ FILE *fopen_verbose(const char *filename, char rw) { return f; } -void fread_verbose(uint8_t *data, size_t size, const char *filename, FILE *f) { +void xfread(uint8_t *data, size_t size, const char *filename, FILE *f) { errno = 0; if (fread(data, 1, size, f) != size) { fclose(f); @@ -63,7 +72,7 @@ void fread_verbose(uint8_t *data, size_t size, const char *filename, FILE *f) { } } -void fwrite_verbose(const uint8_t *data, size_t size, const char *filename, FILE *f) { +void xfwrite(const uint8_t *data, size_t size, const char *filename, FILE *f) { errno = 0; if (fwrite(data, 1, size, f) != size) { fclose(f); @@ -71,7 +80,7 @@ void fwrite_verbose(const uint8_t *data, size_t size, const char *filename, FILE } } -long file_size_verbose(const char *filename, FILE *f) { +long xfsize(const char *filename, FILE *f) { long size = -1; errno = 0; if (!fseek(f, 0, SEEK_END)) { @@ -87,24 +96,24 @@ long file_size_verbose(const char *filename, FILE *f) { } uint8_t *read_u8(const char *filename, long *size) { - FILE *f = fopen_verbose(filename, 'r'); - *size = file_size_verbose(filename, f); - uint8_t *data = malloc_verbose(*size); - fread_verbose(data, *size, filename, f); + FILE *f = xfopen(filename, 'r'); + *size = xfsize(filename, f); + uint8_t *data = xmalloc(*size); + xfread(data, *size, filename, f); fclose(f); return data; } void write_u8(const char *filename, uint8_t *data, size_t size) { - FILE *f = fopen_verbose(filename, 'w'); - fwrite_verbose(data, size, filename, f); + FILE *f = xfopen(filename, 'w'); + xfwrite(data, size, filename, f); fclose(f); } -uint32_t read_png_width_verbose(const char *filename) { - FILE *f = fopen_verbose(filename, 'r'); +uint32_t read_png_width(const char *filename) { + FILE *f = xfopen(filename, 'r'); uint8_t header[16] = {0}; - fread_verbose(header, sizeof(header), filename, f); + xfread(header, sizeof(header), filename, f); static uint8_t expected_header[16] = { 0x89, 'P', 'N', 'G', '\r', '\n', 0x1A, '\n', // signature 0, 0, 0, 13, // IHDR chunk length @@ -115,7 +124,7 @@ uint32_t read_png_width_verbose(const char *filename) { error_exit("Not a valid PNG file: \"%s\"\n", filename); } uint8_t bytes[4] = {0}; - fread_verbose(bytes, sizeof(bytes), filename, f); + xfread(bytes, sizeof(bytes), filename, f); fclose(f); return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]; } diff --git a/tools/gfx.c b/tools/gfx.c index 2928637c0..7fbbfaab7 100644 --- a/tools/gfx.c +++ b/tools/gfx.c @@ -61,7 +61,7 @@ void parse_args(int argc, char *argv[]) { break; case 'r': for (char *token = strtok(optarg, ","); token; token = strtok(NULL, ",")) { - options.preserved = realloc(options.preserved, ++options.num_preserved * sizeof(*options.preserved)); + options.preserved = xrealloc(options.preserved, ++options.num_preserved * sizeof(*options.preserved)); options.preserved[options.num_preserved-1] = strtoul(token, NULL, 0); } break; @@ -212,7 +212,7 @@ const uint8_t flipped[256] = { }; bool flip_exists(const uint8_t *tile, const uint8_t *tiles, int tile_size, int num_tiles, bool xflip, bool yflip) { - uint8_t flip[tile_size]; + uint8_t flip[tile_size]; // VLA memset(flip, 0, tile_size); int half_size = tile_size / 2; for (int i = 0; i < tile_size; i++) { @@ -250,7 +250,7 @@ void interleave(struct Graphic *graphic, int width) { int tile_size = options.depth * 8; int width_tiles = width / 8; int num_tiles = graphic->size / tile_size; - uint8_t *interleaved = malloc(graphic->size); + uint8_t *interleaved = xmalloc(graphic->size); for (int i = 0; i < num_tiles; i++) { int row = i / width_tiles; int tile = i * 2 - (row % 2 ? width_tiles * (row + 1) - 1 : width_tiles * row); @@ -280,7 +280,7 @@ int main(int argc, char *argv[]) { if (!options.png_file) { error_exit("--interleave needs --png to infer dimensions"); } - int width = read_png_width_verbose(options.png_file); + int width = read_png_width(options.png_file); interleave(&graphic, width); } if (options.remove_duplicates) { diff --git a/tools/png_dimensions.c b/tools/png_dimensions.c index aea9c0d09..261582c12 100644 --- a/tools/png_dimensions.c +++ b/tools/png_dimensions.c @@ -4,7 +4,7 @@ #include "common.h" uint8_t read_png_dimensions(const char *filename) { - uint32_t width_px = read_png_width_verbose(filename); + uint32_t width_px = read_png_width(filename); if (width_px != 40 && width_px != 48 && width_px != 56) { error_exit("Not a valid width for \"%s\": %" PRIu32 " px\n", filename, width_px); } diff --git a/tools/pokemon_animation.c b/tools/pokemon_animation.c index 1d2d8c6cd..2c8ad6446 100644 --- a/tools/pokemon_animation.c +++ b/tools/pokemon_animation.c @@ -78,21 +78,21 @@ void make_frames(const uint8_t *tilemap, long tilemap_size, int width, struct Fr int num_tiles_per_frame = width * width; int num_frames = tilemap_size / num_tiles_per_frame - 1; - frames->frames = malloc_verbose((sizeof *frames->frames) * num_frames); + frames->frames = xmalloc((sizeof *frames->frames) * num_frames); frames->num_frames = num_frames; - bitmasks->bitmasks = malloc_verbose((sizeof *bitmasks->bitmasks) * num_frames); + bitmasks->bitmasks = xmalloc((sizeof *bitmasks->bitmasks) * num_frames); bitmasks->num_bitmasks = 0; const uint8_t *first_frame = &tilemap[0]; const uint8_t *this_frame = &tilemap[num_tiles_per_frame]; for (int i = 0; i < num_frames; i++) { - struct Frame *frame = malloc_verbose(sizeof *frame); - frame->data = malloc_verbose(num_tiles_per_frame); + struct Frame *frame = xmalloc(sizeof *frame); + frame->data = xmalloc(num_tiles_per_frame); frame->size = 0; - struct Bitmask *bitmask = malloc_verbose(sizeof *bitmask); - bitmask->data = calloc_verbose((num_tiles_per_frame + 7) / 8); + struct Bitmask *bitmask = xmalloc(sizeof *bitmask); + bitmask->data = xcalloc((num_tiles_per_frame + 7) / 8); bitmask->bitlength = 0; for (int j = 0; j < num_tiles_per_frame; j++) { diff --git a/tools/pokemon_animation_graphics.c b/tools/pokemon_animation_graphics.c index c8c126475..32078d4c9 100644 --- a/tools/pokemon_animation_graphics.c +++ b/tools/pokemon_animation_graphics.c @@ -40,7 +40,7 @@ void parse_args(int argc, char *argv[], struct Options *options) { #define TILE_SIZE 16 void transpose_tiles(uint8_t *tiles, int width, int size) { - uint8_t *new_tiles = malloc_verbose(size); + uint8_t *new_tiles = xmalloc(size); for (int i = 0; i < size; i++) { int j = i / TILE_SIZE * width * TILE_SIZE; j = (j / size) * TILE_SIZE + j % size + i % TILE_SIZE; @@ -91,7 +91,7 @@ void write_graphics(const char *filename, const uint8_t *tiles, long tiles_size, // Ensure space for a duplicate of tile 0 at the end max_size += TILE_SIZE; } - uint8_t *data = malloc_verbose(max_size); + uint8_t *data = xmalloc(max_size); int num_tiles = 0; #define DATA_APPEND_TILES(tile, length) do { \ @@ -119,7 +119,7 @@ void write_graphics(const char *filename, const uint8_t *tiles, long tiles_size, void write_tilemap(const char *filename, const uint8_t *tiles, long tiles_size, int num_tiles_per_frame, bool girafarig) { int size = tiles_size / TILE_SIZE; - uint8_t *data = malloc_verbose(size); + uint8_t *data = xmalloc(size); int num_tiles = num_tiles_per_frame; // Copy the first frame directly diff --git a/tools/scan_includes.c b/tools/scan_includes.c index cb24be2d7..3e93cbad7 100644 --- a/tools/scan_includes.c +++ b/tools/scan_includes.c @@ -34,9 +34,9 @@ void scan_file(const char *filename, bool strict) { } } - long size = file_size_verbose(filename, f); - char *contents = malloc_verbose(size + 1); - fread_verbose((uint8_t *)contents, size, filename, f); + long size = xfsize(filename, f); + char *contents = xmalloc(size + 1); + xfread((uint8_t *)contents, size, filename, f); fclose(f); contents[size] = '\0';