diff --git a/build.sh b/build.sh index 6f40e52..83cd5ed 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ -#/bin/sh +#!/usr/bin/env bash set -e echo 'compiling resource_embedder...' set -x -cc -Wall -Wextra -O2 resource_embedder.c -o resource_embedder +gcc -Wall -Wextra -O2 resource_embedder.c -o resource_embedder set +x echo 'done' diff --git a/resource_embedder.c b/resource_embedder.c index 3825a17..9cc2b56 100644 --- a/resource_embedder.c +++ b/resource_embedder.c @@ -33,23 +33,27 @@ 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]=='\\') - base_len--; // remove trailing path separator + base_len--; if(len>base_len){ while(i43) onml=0; - char* _sp1=mult_space(43-onml); + if(onml>47) onml=0; + char* _sp1=mult_space(47-onml); fprintf(out_file, - // "////////////////////////////////////////////////////////////\n" - // "// //\n" - // "//%s%s%s//\n" - // "// //\n" - "////////////////////////////////////////////////////////////\n" - "// This file has been generated by resource_embedder //\n" - "// src: https://github.com/Timerix22/resource_embedder //\n" - "////////////////////////////////////////////////////////////\n" - "// USAGE: //\n" - "// Put inside any .c file //\n" - "// #define EMBEDDED_RESOURCE_POSTFIX your_postfix //\n" + "////////////////////////////////////////////////////////////////\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" - "// Then you can access embedded files through //\n" - "// EmbeddedResourceFile_table_your_postfix. You can put //\n" - "// table content into a hashtable or get it by index. //\n" - "////////////////////////////////////////////////////////////\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", - // mult_space(28-onml/2), outname, mult_space(28-onml/2+onml%2), + out_file_path, _sp1, out_file_path, _sp1); free(_sp1); fprintf(out_file, + "#pragma once\n" "\n" "typedef struct {\n" - " char* path;\n" - " char* data;\n" - " unsigned long long size;\n" - "} EmbeddedResourceFile;\n" + " const char* path;\n" + " const char* data;\n" + " const unsigned long long size;\n" + "} EmbeddedResource;\n" "\n" "#define RSCAT(A,B,C...) A##B##C" "\n" "#ifdef EMBEDDED_RESOURCE_POSTFIX\n" - " #define _EmbeddedResourceFile_table(P) \\\n" - " RSCAT(EmbeddedResourceFile_table_, P)\n" - " #define _EmbeddedResourceFile_table_count(P) \\\n" - " RSCAT(EmbeddedResourceFile_table_, P, _count)\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 _EmbeddedResourceFile_table(P) \\\n" - " EmbeddedResourceFile_table\n" - " #define _EmbeddedResourceFile_table_count(P) \\\n" - " EmbeddedResourceFile_table_count\n" + " #define _EmbeddedResource_table(P) \\\n" + " EmbeddedResource_table\n" + " #define _EmbeddedResource_table_count(P) \\\n" + " EmbeddedResource_table_count\n" "#endif\n" - "extern EmbeddedResourceFile _EmbeddedResourceFile_table(EMBEDDED_RESOURCE_POSTFIX)[];\n" - "extern unsigned int _EmbeddedResourceFile_table_count(EMBEDDED_RESOURCE_POSTFIX);" + "extern const EmbeddedResource _EmbeddedResource_table(EMBEDDED_RESOURCE_POSTFIX)[];\n" + "extern const int _EmbeddedResource_table_count(EMBEDDED_RESOURCE_POSTFIX);\n" "\n" "\n" - "EmbeddedResourceFile _EmbeddedResourceFile_table(EMBEDDED_RESOURCE_POSTFIX)[]={\n"); + "#ifdef EMBEDDED_RESOURCE_DEFINITION\n" + "const EmbeddedResource _EmbeddedResource_table(EMBEDDED_RESOURCE_POSTFIX)[]={\n"); print_line(print_lines, false); } @@ -198,8 +205,8 @@ void process_file(const char* input_file_path, //////////////////////////////////////////////// int main(const int argc, const char * const* argv){ - FILE* out_file=NULL; - const char* out_file_path=NULL; + FILE* out_file=stdout; + const char* out_file_path="stdout"; const char* basedir=""; for(int i=1; i= argc) + exit_with_error("expected an argument after -o"); const char* file_path=argv[++i]; - if(out_file!=NULL) - exit_with_error("can't set out_file to %s, because it is already set to %s", - file_path, out_file_path); out_file_path=file_path; out_file=fopen(out_file_path, "wb"); if(out_file==NULL) @@ -229,12 +234,17 @@ int main(const int argc, const char * const* argv){ fprintf(stderr, "output file has been set to %s\n", out_file_path); } + else if(argis("d")){ + if (i + 1 >= argc) + exit_with_error("expected an argument after -d"); + basedir=argv[++i]; + fprintf(stderr, "basedir is set to: %s\n", basedir); + } + else if(argis("i")){ + if (i + 1 >= argc) + exit_with_error("expected an argument after -i"); const char* input_file_path=argv[++i]; - if(out_file==NULL){ - out_file=stdout; - out_file_path="this_file"; - } char* embedded_path=basedir_exclude(input_file_path, basedir); fprintf(stderr, "input file path: %s\n", arg); fprintf(stderr, "embedded path: %s\n", embedded_path); @@ -246,15 +256,16 @@ int main(const int argc, const char * const* argv){ } if(out_file_path!=NULL){ - bool out_file_set=!streq(out_file_path, "this_file"); + bool out_file_set=!streq(out_file_path, "stdout"); if(!out_file_set) print_line(true, false); fprintf(out_file, "\n};\n\n" - "unsigned int _EmbeddedResourceFile_table_count(EMBEDDED_RESOURCE_POSTFIX)=%u;\n" + "const int _EmbeddedResource_table_count(EMBEDDED_RESOURCE_POSTFIX)=%u;\n" + "#endif // EMBEDDED_RESOURCE_DEFINITION\n" "\n" - "#undef _EmbeddedResourceFile_table\n" - "#undef _EmbeddedResourceFile_table_count\n" + "#undef _EmbeddedResource_table\n" + "#undef _EmbeddedResource_table_count\n" "#undef EMBEDDED_RESOURCE_POSTFIX\n" "#undef RSCAT\n", _input_files_n);