2016-03-31 19:24:12 +02:00

91 lines
2.1 KiB
C++

#include <cstdio>
#include <string>
using namespace std;
#define NB_VAL_PER_LINE 256
#define FILE_BEGIN "#include <string>\n\
#include <unordered_map>\n\
\n\
namespace Resource {\n\
std::unordered_map<std::string, const char*> *resourceFilesData;\n"
#define FILE_MID "\nvoid initResourceData()\n\
{\n\
resourceFilesData = new std::unordered_map<std::string, const char*>();\n"
#define FILE_END "\n\
}\n\
\n\
const char* get(const std::string &fileName)\n\
{\n\
if(resourceFilesData->count(fileName) > 0)\n\
return (*resourceFilesData)[fileName];\n\
else\n\
return NULL;\n\
}\n\
}\n"
unsigned int n = 0;
bool addFile(const string &inFile, FILE *out)
{
FILE *in = fopen(inFile.c_str(), "r");
if(in == NULL)
{
fprintf(stderr, "can't open \"%s\" for readingn", inFile.c_str());
return false;
}
fprintf(out, "\nconst char data%d[] = {\n", n);
char ptr[NB_VAL_PER_LINE];
size_t nbRead;
do
{
nbRead = fread(ptr, sizeof(char), NB_VAL_PER_LINE, in);
for(unsigned int i=0; i<nbRead; ++i)
fprintf(out, i ? ",0x%x" : "\t0x%x", ptr[i]);
fprintf(out, "\n");
}
while(nbRead == NB_VAL_PER_LINE);
fprintf(out, "};\n");
++n;
fclose(in);
return true;
}
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("usage : %s RESOURCE_FILE.cpp [LIST_OF_FILES_TO_BAKE]\n", argv[0]);
return EXIT_SUCCESS;
}
FILE *out = fopen(argv[1], "w");
if(out == NULL)
{
fprintf(stderr, "can't open \"%s\" for writing\n", argv[1]);
return EXIT_FAILURE;
}
fprintf(out, FILE_BEGIN);
for(int i=2; i<argc; ++i)
{
if(!addFile(argv[i], out))
{
fclose(out);
return EXIT_FAILURE;
}
else
printf("successfully added \"%s\" to \"%s\".\n", argv[i], argv[1]);
}
fprintf(out, FILE_MID);
for(int i=0; i<n; ++i)
fprintf(out, "\t(*resourceFilesData)[\"%s\"] = data%d;\n", argv[2+i], i);
fprintf(out, FILE_END);
fclose(out);
printf("successfully created resource file \"%s\".\n", argv[1]);
return EXIT_SUCCESS;
}