From b921791be512bffc252ab555e47d48e0fb8261b5 Mon Sep 17 00:00:00 2001 From: Timerix Date: Tue, 30 Jul 2024 19:36:44 +0300 Subject: [PATCH] fixed bugs --- build.sh | 2 +- resource_embedder.c | 169 ++++++++++++++++++++++++-------------------- 2 files changed, 93 insertions(+), 78 deletions(-) diff --git a/build.sh b/build.sh index 83cd5ed..a1f987b 100644 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -set -e +set -eo pipefail echo 'compiling resource_embedder...' set -x gcc -Wall -Wextra -O2 resource_embedder.c -o resource_embedder diff --git a/resource_embedder.c b/resource_embedder.c index 2a28bde..646be68 100644 --- a/resource_embedder.c +++ b/resource_embedder.c @@ -34,7 +34,6 @@ char* basedir_exclude(const char* path, const char* basename){ int len=strlen(path); int base_len=strlen(basename); int i=0; - fprintf(stderr, "len=%i base_len=%i\n", len, base_len); if(len>0 && base_len>0){ // remove trailing path separator if(basename[base_len-1]=='/' || basename[base_len-1]=='\\') @@ -83,74 +82,94 @@ void print_line(bool print_lines, bool start_new_line){ bool _first_file_processed=false; unsigned int _input_files_n=0; +void write_header(FILE* out_file, const char* out_file_path){ + int onml=strlen(out_file_path); + if(onml>47) + onml=0; + char* _sp1=mult_space(47-onml); + fprintf(out_file, + "////////////////////////////////////////////////////////////////\n" + "// This file was generated by resource_embedder //\n" + "// https://timerix.ddns.net:3322/Timerix/resource_embedder //\n" + "////////////////////////////////////////////////////////////////\n" + "// USAGE: //\n" + "// Put it in a SOURCE file to define variables //\n" + "// #define EMBEDDED_RESOURCE_DEFINITION //\n" + "// #define EMBEDDED_RESOURCE_POSTFIX your_postfix //\n" + "// #include \"%s\"%s//\n" + "// //\n" + "// Put it in a HEADER file to declare external variables //\n" + "// #define EMBEDDED_RESOURCE_POSTFIX your_postfix //\n" + "// #include \"%s\"%s//\n" + "// //\n" + "// Then you can access embedded files through //\n" + "// EmbeddedResource_table_your_postfix. You can get table //\n" + "// content by index and put it into a hashtable or a map. //\n" + "////////////////////////////////////////////////////////////////\n" + "\n", + out_file_path, _sp1, + out_file_path, _sp1); + free(_sp1); + fprintf(out_file, + "#pragma once\n" + "#if __cplusplus\n" + "extern \"C\" {\n" + "#endif\n" + "\n" + "#include \n" + "\n" + "typedef struct {\n" + " const char* path;\n" + " const char* data;\n" + " size_t size;\n" + "} EmbeddedResource;\n" + "\n" + "#define RSCAT(A,B,C...) A##B##C" + "\n" + "#ifdef EMBEDDED_RESOURCE_POSTFIX\n" + " #define _EmbeddedResource_table(P) \\\n" + " RSCAT(EmbeddedResource_table_, P)\n" + " #define _EmbeddedResource_table_count(P) \\\n" + " RSCAT(EmbeddedResource_table_, P, _count)\n" + "#else\n" + " #define _EmbeddedResource_table(P) \\\n" + " EmbeddedResource_table\n" + " #define _EmbeddedResource_table_count(P) \\\n" + " EmbeddedResource_table_count\n" + "#endif\n" + "extern const EmbeddedResource _EmbeddedResource_table(EMBEDDED_RESOURCE_POSTFIX)[];\n" + "extern const int _EmbeddedResource_table_count(EMBEDDED_RESOURCE_POSTFIX);\n" + "\n" + "#ifdef EMBEDDED_RESOURCE_DEFINITION\n" + "const EmbeddedResource _EmbeddedResource_table(EMBEDDED_RESOURCE_POSTFIX)[]={\n" + ); +} + +void write_footer(FILE* out_file){ + fprintf(out_file, + "\n};\n\n" + "const int _EmbeddedResource_table_count(EMBEDDED_RESOURCE_POSTFIX)=%u;\n" + "#endif // EMBEDDED_RESOURCE_DEFINITION\n" + "\n" + "#undef _EmbeddedResource_table\n" + "#undef _EmbeddedResource_table_count\n" + "#undef EMBEDDED_RESOURCE_POSTFIX\n" + "#undef RSCAT\n" + "\n" + "#if __cplusplus\n" + "}\n" + "#endif\n", + _input_files_n + ); +} + void process_file(const char* input_file_path, - const char* embedded_file_path, + const char* embedded_file_path, FILE* out_file, const char* out_file_path) { bool print_lines=streq(out_file_path, "stdout"); - if(!_first_file_processed){ - print_line(print_lines, false); - - int onml=strlen(out_file_path); - if(onml>47) onml=0; - char* _sp1=mult_space(47-onml); - fprintf(out_file, - "////////////////////////////////////////////////////////////////\n" - "// This file was generated by resource_embedder //\n" - "// https://timerix.ddns.net:3322/Timerix/resource_embedder //\n" - "////////////////////////////////////////////////////////////////\n" - "// USAGE: //\n" - "// Put it in a SOURCE file to define variables //\n" - "// #define EMBEDDED_RESOURCE_DEFINITION //\n" - "// #define EMBEDDED_RESOURCE_POSTFIX your_postfix //\n" - "// #include \"%s\"%s//\n" - "// //\n" - "// Put it in a HEADER file to declare external variables //\n" - "// #define EMBEDDED_RESOURCE_POSTFIX your_postfix //\n" - "// #include \"%s\"%s//\n" - "// //\n" - "// Then you can access embedded files through //\n" - "// EmbeddedResource_table_your_postfix. You can get table //\n" - "// content by index and put it into a hashtable or a map. //\n" - "////////////////////////////////////////////////////////////////\n" - "\n", - out_file_path, _sp1, - out_file_path, _sp1); - free(_sp1); - fprintf(out_file, - "#pragma once\n" - "#include \n" - "\n" - "typedef struct {\n" - " const char* path;\n" - " const char* data;\n" - " int32_t size;\n" - "} EmbeddedResource;\n" - "\n" - "#define RSCAT(A,B,C...) A##B##C" - "\n" - "#ifdef EMBEDDED_RESOURCE_POSTFIX\n" - " #define _EmbeddedResource_table(P) \\\n" - " RSCAT(EmbeddedResource_table_, P)\n" - " #define _EmbeddedResource_table_count(P) \\\n" - " RSCAT(EmbeddedResource_table_, P, _count)\n" - "#else\n" - " #define _EmbeddedResource_table(P) \\\n" - " EmbeddedResource_table\n" - " #define _EmbeddedResource_table_count(P) \\\n" - " EmbeddedResource_table_count\n" - "#endif\n" - "extern const EmbeddedResource _EmbeddedResource_table(EMBEDDED_RESOURCE_POSTFIX)[];\n" - "extern const int _EmbeddedResource_table_count(EMBEDDED_RESOURCE_POSTFIX);\n" - "\n" - "\n" - "#ifdef EMBEDDED_RESOURCE_DEFINITION\n" - "const EmbeddedResource _EmbeddedResource_table(EMBEDDED_RESOURCE_POSTFIX)[]={\n"); - print_line(print_lines, false); - } - fprintf(stderr, "reading file %s\n", input_file_path); print_line(print_lines, false); @@ -164,18 +183,18 @@ void process_file(const char* input_file_path, // writing input file code header fprintf(out_file, " {\n" - " .path=(char*)\"%s\",\n" - " .data=(char[]){", + " .path=\"%s\",\n" + " .data=(const char[]){", embedded_file_path); // writing input file content int byte=0; - unsigned long long size=0; + size_t size=0; while( (byte=fgetc(input_file)) != EOF ){ if(size%16==0) fprintf(out_file, "\n "); fprintf(out_file, "0x%02X,", byte); - size+=1; + size++; } // trailing zero to use file.data as cstring fprintf(out_file, "0x0"); @@ -234,6 +253,11 @@ int main(const int argc, const char * const* argv){ if(out_file==NULL) exit_with_error("can't open file %s", out_file_path); fprintf(stderr, "output file has been set to %s\n", out_file_path); + + bool print_lines=streq(out_file_path, "stdout"); + print_line(print_lines, false); + write_header(out_file, out_file_path); + print_line(print_lines, false); } else if(argis("d")){ @@ -261,16 +285,7 @@ int main(const int argc, const char * const* argv){ bool out_file_set=!streq(out_file_path, "stdout"); if(!out_file_set) print_line(true, false); - fprintf(out_file, - "\n};\n\n" - "const int _EmbeddedResource_table_count(EMBEDDED_RESOURCE_POSTFIX)=%u;\n" - "#endif // EMBEDDED_RESOURCE_DEFINITION\n" - "\n" - "#undef _EmbeddedResource_table\n" - "#undef _EmbeddedResource_table_count\n" - "#undef EMBEDDED_RESOURCE_POSTFIX\n" - "#undef RSCAT\n", - _input_files_n); + write_footer(out_file); if(!out_file_set) fclose(out_file); print_line(true, false);