diff --git a/assets/asset_builder/src/asset_file.c b/assets/asset_builder/src/asset_file.c index 95d77fc..bdd2439 100644 --- a/assets/asset_builder/src/asset_file.c +++ b/assets/asset_builder/src/asset_file.c @@ -6,7 +6,7 @@ #include "errors.h" int parse_png_for_header(const char *input_file_name, asset_header_def_t *asset_header_def); -int parse_png_for_content(const char *input_file_name, FILE *output_file); +int parse_png_for_content_and_write(const char *input_file_name, FILE *output_file); int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset_header_def) { @@ -29,19 +29,16 @@ int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset int write_header_to_file(asset_file_header_t *asset_file_header, FILE *output_file) { - size_t ret = fwrite(&asset_file_header->assets_number, sizeof(size_t), 1, output_file); - if(ret != 1) + if(fwrite(&asset_file_header->assets_number, sizeof(size_t), 1, output_file) != 1) return WRITE_FAILED; for(size_t i = 0; i < asset_file_header->assets_number; i++) { size_t name_length = strlen(asset_file_header->assets_header_def[i].name) + 1; - ret = fwrite(asset_file_header->assets_header_def[i].name, sizeof(unsigned char), name_length, output_file); - if(ret != name_length) + if(fwrite(asset_file_header->assets_header_def[i].name, sizeof(unsigned char), name_length, output_file) != name_length) return WRITE_FAILED; - ret = fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file); - if(ret != 1) + if(fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file) != 1) return WRITE_FAILED; } @@ -61,7 +58,7 @@ int parse_file_for_content_and_write(const char *input_file_name, FILE *output_f if(!strcmp(file_name_ext, "png")) { - return parse_png_for_content(input_file_name, output_file); + return parse_png_for_content_and_write(input_file_name, output_file); } return EXTENSION_UNSUPPORTED; @@ -73,13 +70,16 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header FILE *input_file = fopen(file_name, "rb"); if(!input_file) - { return OPEN_FAILED; - } // Check png autenticity. unsigned char sig[8]; - fread(sig, 1, 8, input_file); + if(fread(sig, sizeof(unsigned char), 8, input_file) != 8) + { + fclose(input_file); + return READ_FAILED; + } + if(!png_check_sig(sig, 8)) { fclose(input_file); @@ -142,19 +142,23 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header return NO_ERROR; } -int parse_png_for_content(const char *input_file_name, FILE *output_file) +int parse_png_for_content_and_write(const char *input_file_name, FILE *output_file) { FILE *input_file = fopen(input_file_name, "rb"); if(!input_file) { - fclose(input_file); return OPEN_FAILED; } // Check png autenticity. unsigned char sig[8]; - fread(sig, 1, 8, input_file); + if(fread(sig, sizeof(unsigned char), 8, input_file) != 8) + { + fclose(input_file); + return READ_FAILED; + } + if(!png_check_sig(sig, 8)) { fclose(input_file); @@ -187,16 +191,14 @@ int parse_png_for_content(const char *input_file_name, FILE *output_file) size_t row_length = png_get_rowbytes(png_ptr, info_ptr); // Write image size. - size_t ret = fwrite(&width, sizeof(size_t), 1, output_file); - if(!ret) + if(fwrite(&width, sizeof(size_t), 1, output_file) != 1) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(input_file); return WRITE_FAILED; } - ret = fwrite(&height, sizeof(size_t), 1, output_file); - if(!ret) + if(fwrite(&height, sizeof(size_t), 1, output_file) != 1) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(input_file); diff --git a/assets/asset_builder/src/errors.c b/assets/asset_builder/src/errors.c index 7e16409..b9bbad9 100644 --- a/assets/asset_builder/src/errors.c +++ b/assets/asset_builder/src/errors.c @@ -6,3 +6,42 @@ void print_error(const char *content) { printf("\033[31merror\033[m: %s\n", content); } + +void print_error_description(error_t error) +{ + switch(error) + { + case NO_EXTENSION: + print_error("file does not have an extension."); break; + + case EXTENSION_UNSUPPORTED: + print_error("extension not yet supported."); break; + + case OPEN_FAILED: + print_error("failed to open file."); break; + + case READ_FAILED: + print_error("failed to read the input file."); break; + + case WRITE_FAILED: + print_error("failed to write to output file."); break; + + case BAD_SIGNATURE: + print_error("file not valid."); break; + + case MEMORY_ALLOC_FAILED: + print_error("memory allocation failed."); break; + + case PNG_BIT_DEPTH_UNSUPPORTED: + print_error("png bit depth not supported."); break; + + case PNG_COLOR_TYPE_UNSUPPORTED: + print_error("png color type not supported."); break; + + case NO_ERROR: + return; + + default: + print_error("unknown error"); break; + } +} \ No newline at end of file diff --git a/assets/asset_builder/src/headers/errors.h b/assets/asset_builder/src/headers/errors.h index 03f5b35..c3d0e4e 100644 --- a/assets/asset_builder/src/headers/errors.h +++ b/assets/asset_builder/src/headers/errors.h @@ -6,6 +6,7 @@ typedef enum error_t { NO_EXTENSION, EXTENSION_UNSUPPORTED, OPEN_FAILED, + READ_FAILED, WRITE_FAILED, BAD_SIGNATURE, MEMORY_ALLOC_FAILED, @@ -17,4 +18,6 @@ typedef enum error_t { void print_error(const char *content); +void print_error_description(error_t error); + #endif // ERROR_H \ No newline at end of file diff --git a/assets/asset_builder/src/main.c b/assets/asset_builder/src/main.c index 57659c2..e00d550 100644 --- a/assets/asset_builder/src/main.c +++ b/assets/asset_builder/src/main.c @@ -6,11 +6,16 @@ int main(int argc, char *argv[]) { + int exit_status = EXIT_SUCCESS; + + FILE *output_asset_file = NULL; + // Verify arguments minimum number. if(argc < 3) { puts("\033[33musage\033[m: asset_builder output_file input_file [input_file_2 ...]"); - return EXIT_FAILURE; + exit_status = EXIT_FAILURE; + goto end; } // Header size and content. @@ -18,6 +23,13 @@ int main(int argc, char *argv[]) asset_file_header.assets_number = argc - 2; asset_file_header.header_size = sizeof(size_t) + sizeof(size_t) * asset_file_header.assets_number; asset_file_header.assets_header_def = malloc(asset_file_header.assets_number * sizeof(asset_header_def_t)); + if(!asset_file_header.assets_header_def) + { + print_error("memory allocation failed."); + exit_status = EXIT_FAILURE; + goto end; + + } // Set assets name. for(size_t i = 0; i < asset_file_header.assets_number; i++) @@ -30,22 +42,23 @@ int main(int argc, char *argv[]) const char *file_name_dot = strrchr(file_name, '.'); const char *file_name_ext = file_name_dot ? file_name_dot + 1 : file_name; - size_t asset_name_length = strlen(file_base_name) - strlen(file_name_ext) - 1; + size_t asset_name_length = strlen(file_base_name) - strlen(file_name_ext); asset_file_header.assets_header_def[i].name = malloc(asset_name_length); - strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length); + asset_file_header.assets_header_def[i].name[asset_name_length - 1] = '\0'; + strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length - 1); // Update header size. - asset_file_header.header_size += asset_name_length + 1; + asset_file_header.header_size += asset_name_length; } // Parse input files to create header structure and fill output file. - FILE *output_asset_file = fopen(argv[1], "wb"); - + output_asset_file = fopen(argv[1], "wb"); if(!output_asset_file) { print_error("could not create output file."); - return EXIT_FAILURE; + exit_status = EXIT_FAILURE; + goto end; } for(size_t i = 0; i < asset_file_header.assets_number; i++) @@ -54,35 +67,10 @@ int main(int argc, char *argv[]) if(ret) { - switch(ret) - { - case NO_EXTENSION: - print_error("file does not have an extension."); break; + print_error_description(ret); - case EXTENSION_UNSUPPORTED: - print_error("extension not yet supported."); break; - - case OPEN_FAILED: - print_error("failed to open file."); break; - - case BAD_SIGNATURE: - print_error("file not valid."); break; - - case MEMORY_ALLOC_FAILED: - print_error("memory allocation failed."); break; - - case PNG_BIT_DEPTH_UNSUPPORTED: - print_error("png bit depth not supported."); break; - - case PNG_COLOR_TYPE_UNSUPPORTED: - print_error("png color type not supported."); break; - - default: - print_error("unknown error"); break; - } - - fclose(output_asset_file); - return EXIT_FAILURE; + exit_status = EXIT_FAILURE; + goto end; } // Calculate absolute position of assets in the file. @@ -94,8 +82,8 @@ int main(int argc, char *argv[]) if(write_header_to_file(&asset_file_header, output_asset_file)) { print_error("can't write to output file."); - fclose(output_asset_file); - return EXIT_FAILURE; + exit_status = EXIT_FAILURE; + goto end; } for(size_t i = 0; i < asset_file_header.assets_number; i++) @@ -104,40 +92,24 @@ int main(int argc, char *argv[]) if(ret) { - switch(ret) - { - case NO_EXTENSION: - print_error("file does not have an extension."); break; + print_error_description(ret); - case EXTENSION_UNSUPPORTED: - print_error("extension not yet supported."); break; - - case OPEN_FAILED: - print_error("failed to open file."); break; - - case WRITE_FAILED: - print_error("failed to write to output file."); break; - - case BAD_SIGNATURE: - print_error("file not valid."); break; - - case MEMORY_ALLOC_FAILED: - print_error("memory allocation failed."); break; - - case PNG_BIT_DEPTH_UNSUPPORTED: - print_error("png bit depth not supported."); break; - - case PNG_COLOR_TYPE_UNSUPPORTED: - print_error("png color type not supported."); break; - - default: - print_error("unknown error"); break; - } - - fclose(output_asset_file); - return EXIT_FAILURE; + exit_status = EXIT_FAILURE; + goto end; } } - return EXIT_SUCCESS; +end: + if(asset_file_header.assets_header_def) + { + for(size_t i = 0; i < asset_file_header.assets_number; i++) + free(asset_file_header.assets_header_def[i].name); + + free(asset_file_header.assets_header_def); + } + + if(output_asset_file) + fclose(output_asset_file); + + return exit_status; }