Fixed some memory errors and leaks in asset builder.
This commit is contained in:
parent
c730276f82
commit
1c3c3e8b59
|
|
@ -6,7 +6,7 @@
|
||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
|
|
||||||
int parse_png_for_header(const char *input_file_name, asset_header_def_t *asset_header_def);
|
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)
|
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)
|
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(fwrite(&asset_file_header->assets_number, sizeof(size_t), 1, output_file) != 1)
|
||||||
if(ret != 1)
|
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
|
|
||||||
for(size_t i = 0; i < asset_file_header->assets_number; i++)
|
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;
|
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(fwrite(asset_file_header->assets_header_def[i].name, sizeof(unsigned char), name_length, output_file) != name_length)
|
||||||
if(ret != name_length)
|
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
|
|
||||||
ret = fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file);
|
if(fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file) != 1)
|
||||||
if(ret != 1)
|
|
||||||
return WRITE_FAILED;
|
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"))
|
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;
|
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");
|
FILE *input_file = fopen(file_name, "rb");
|
||||||
|
|
||||||
if(!input_file)
|
if(!input_file)
|
||||||
{
|
|
||||||
return OPEN_FAILED;
|
return OPEN_FAILED;
|
||||||
}
|
|
||||||
|
|
||||||
// Check png autenticity.
|
// Check png autenticity.
|
||||||
unsigned char sig[8];
|
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))
|
if(!png_check_sig(sig, 8))
|
||||||
{
|
{
|
||||||
fclose(input_file);
|
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;
|
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");
|
FILE *input_file = fopen(input_file_name, "rb");
|
||||||
|
|
||||||
if(!input_file)
|
if(!input_file)
|
||||||
{
|
{
|
||||||
fclose(input_file);
|
|
||||||
return OPEN_FAILED;
|
return OPEN_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check png autenticity.
|
// Check png autenticity.
|
||||||
unsigned char sig[8];
|
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))
|
if(!png_check_sig(sig, 8))
|
||||||
{
|
{
|
||||||
fclose(input_file);
|
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);
|
size_t row_length = png_get_rowbytes(png_ptr, info_ptr);
|
||||||
|
|
||||||
// Write image size.
|
// Write image size.
|
||||||
size_t ret = fwrite(&width, sizeof(size_t), 1, output_file);
|
if(fwrite(&width, sizeof(size_t), 1, output_file) != 1)
|
||||||
if(!ret)
|
|
||||||
{
|
{
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fwrite(&height, sizeof(size_t), 1, output_file);
|
if(fwrite(&height, sizeof(size_t), 1, output_file) != 1)
|
||||||
if(!ret)
|
|
||||||
{
|
{
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,42 @@ void print_error(const char *content)
|
||||||
{
|
{
|
||||||
printf("\033[31merror\033[m: %s\n", 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ typedef enum error_t {
|
||||||
NO_EXTENSION,
|
NO_EXTENSION,
|
||||||
EXTENSION_UNSUPPORTED,
|
EXTENSION_UNSUPPORTED,
|
||||||
OPEN_FAILED,
|
OPEN_FAILED,
|
||||||
|
READ_FAILED,
|
||||||
WRITE_FAILED,
|
WRITE_FAILED,
|
||||||
BAD_SIGNATURE,
|
BAD_SIGNATURE,
|
||||||
MEMORY_ALLOC_FAILED,
|
MEMORY_ALLOC_FAILED,
|
||||||
|
|
@ -17,4 +18,6 @@ typedef enum error_t {
|
||||||
|
|
||||||
void print_error(const char *content);
|
void print_error(const char *content);
|
||||||
|
|
||||||
|
void print_error_description(error_t error);
|
||||||
|
|
||||||
#endif // ERROR_H
|
#endif // ERROR_H
|
||||||
|
|
@ -6,11 +6,16 @@
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
int exit_status = EXIT_SUCCESS;
|
||||||
|
|
||||||
|
FILE *output_asset_file = NULL;
|
||||||
|
|
||||||
// Verify arguments minimum number.
|
// Verify arguments minimum number.
|
||||||
if(argc < 3)
|
if(argc < 3)
|
||||||
{
|
{
|
||||||
puts("\033[33musage\033[m: asset_builder output_file input_file [input_file_2 ...]");
|
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.
|
// Header size and content.
|
||||||
|
|
@ -18,6 +23,13 @@ int main(int argc, char *argv[])
|
||||||
asset_file_header.assets_number = argc - 2;
|
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.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));
|
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.
|
// Set assets name.
|
||||||
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
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_dot = strrchr(file_name, '.');
|
||||||
const char *file_name_ext = file_name_dot ? file_name_dot + 1 : 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);
|
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.
|
// 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.
|
// 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)
|
if(!output_asset_file)
|
||||||
{
|
{
|
||||||
print_error("could not create output 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++)
|
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
||||||
|
|
@ -54,35 +67,10 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if(ret)
|
if(ret)
|
||||||
{
|
{
|
||||||
switch(ret)
|
print_error_description(ret);
|
||||||
{
|
|
||||||
case NO_EXTENSION:
|
|
||||||
print_error("file does not have an extension."); break;
|
|
||||||
|
|
||||||
case EXTENSION_UNSUPPORTED:
|
exit_status = EXIT_FAILURE;
|
||||||
print_error("extension not yet supported."); break;
|
goto end;
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate absolute position of assets in the file.
|
// 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))
|
if(write_header_to_file(&asset_file_header, output_asset_file))
|
||||||
{
|
{
|
||||||
print_error("can't write to output file.");
|
print_error("can't write to output file.");
|
||||||
fclose(output_asset_file);
|
exit_status = EXIT_FAILURE;
|
||||||
return EXIT_FAILURE;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
||||||
|
|
@ -104,40 +92,24 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if(ret)
|
if(ret)
|
||||||
{
|
{
|
||||||
switch(ret)
|
print_error_description(ret);
|
||||||
{
|
|
||||||
case NO_EXTENSION:
|
|
||||||
print_error("file does not have an extension."); break;
|
|
||||||
|
|
||||||
case EXTENSION_UNSUPPORTED:
|
exit_status = EXIT_FAILURE;
|
||||||
print_error("extension not yet supported."); break;
|
goto end;
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue