Skip to content

Commit 2f61bc5

Browse files
committed
Implemented register files support for C code generators.
1 parent bcfbe55 commit 2f61bc5

File tree

8 files changed

+305
-29
lines changed

8 files changed

+305
-29
lines changed

src/bin2cpp/ArrayGenerator.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,12 @@ namespace bin2cpp
243243
fprintf(fout, "static bool %s_initialized = false;\n", functionIdentifier.c_str());
244244
fprintf(fout, "\n");
245245

246+
if ( mContext.registerFiles )
247+
{
248+
fprintf(fout, "extern bool bin2c_filemanager_register_file(%s * file);\n", mContext.baseClass.c_str());
249+
fprintf(fout, "\n");
250+
}
251+
246252
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
247253
fprintf(fout, "{\n");
248254
fprintf(fout, " if ( %s_file.buffer )\n", functionIdentifier.c_str());
@@ -325,6 +331,14 @@ namespace bin2cpp
325331
fprintf(fout, " file->load = %s_load;\n", functionIdentifier.c_str());
326332
fprintf(fout, " file->unload = %s_free;\n", functionIdentifier.c_str());
327333
fprintf(fout, " file->save = %s_save;\n", functionIdentifier.c_str());
334+
335+
if ( mContext.registerFiles )
336+
{
337+
fprintf(fout, " \n");
338+
fprintf(fout, " // register\n");
339+
fprintf(fout, " bin2c_filemanager_register_file(file);\n");
340+
}
341+
328342
fprintf(fout, "}\n");
329343
fprintf(fout, "\n");
330344
fprintf(fout, "%s* %s(void)\n", mContext.baseClass.c_str(), getGetterFunctionName().c_str());
@@ -333,12 +347,6 @@ namespace bin2cpp
333347
fprintf(fout, " return &%s_file;\n", functionIdentifier.c_str());
334348
fprintf(fout, "}\n");
335349

336-
if ( mContext.registerFiles )
337-
{
338-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
339-
fprintf(fout, "%s", fileManagerTemplate.c_str());
340-
}
341-
342350
fclose(input);
343351
fclose(fout);
344352

src/bin2cpp/BaseGenerator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ namespace bin2cpp
438438
fprintf(header, " bin2c_free_func unload;\n");
439439
fprintf(header, " bin2c_save_func save;\n");
440440
fprintf(header, "} %s;\n", mContext.baseClass.c_str());
441+
fprintf(header, "typedef %s* %sPtr;\n", mContext.baseClass.c_str(), mContext.baseClass.c_str());
441442
fprintf(header, "#endif //%s_EMBEDDEDFILE_STRUCT\n", classMacroGuardPrefix.c_str());
442443
fprintf(header, "%s* %s();\n", mContext.baseClass.c_str(), getGetterFunctionName().c_str());
443444
fprintf(header, "\n");

src/bin2cpp/ManagerGenerator.cpp

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,223 @@ namespace bin2cpp
239239
return true;
240240
}
241241

242+
bool ManagerGenerator::createCHeaderFile(const char* file_path)
243+
{
244+
FILE* fout = fopen(file_path, "w");
245+
if ( !fout )
246+
return false;
247+
248+
//define macro guard a macro matching the filename
249+
std::string macroGuard;
250+
macroGuard += getCppIncludeGuardMacroName(mContext.codeNamespace.c_str()); //prefix the custom namespace for the file manager
251+
if ( !macroGuard.empty() )
252+
macroGuard += "_";
253+
macroGuard += getCppIncludeGuardMacroName(file_path);
254+
255+
std::string classMacroGuardPrefix = getClassMacroGuardPrefix();
256+
std::string fileHeader = getHeaderTemplate(false);
257+
258+
fprintf(fout, "%s", fileHeader.c_str());
259+
fprintf(fout, "#ifndef %s\n", macroGuard.c_str());
260+
fprintf(fout, "#define %s\n", macroGuard.c_str());
261+
fprintf(fout, "\n");
262+
fprintf(fout, "#include <stddef.h>\n");
263+
fprintf(fout, "#include <stdbool.h>\n");
264+
fprintf(fout, "\n");
265+
fprintf(fout, "#ifndef %s_EMBEDDEDFILE_STRUCT\n", classMacroGuardPrefix.c_str());
266+
fprintf(fout, "#define %s_EMBEDDEDFILE_STRUCT\n", classMacroGuardPrefix.c_str());
267+
fprintf(fout, "typedef struct %s %s;\n", mContext.baseClass.c_str(), mContext.baseClass.c_str());
268+
fprintf(fout, "typedef bool(*bin2c_load_func)();\n");
269+
fprintf(fout, "typedef void(*bin2c_free_func)();\n");
270+
fprintf(fout, "typedef bool(*bin2c_save_func)(const char*);\n");
271+
fprintf(fout, "typedef struct %s\n", mContext.baseClass.c_str());
272+
fprintf(fout, "{\n");
273+
fprintf(fout, " size_t size;\n");
274+
fprintf(fout, " const char* file_name;\n");
275+
fprintf(fout, " const char* file_path;\n");
276+
fprintf(fout, " const unsigned char* buffer;\n");
277+
fprintf(fout, " bin2c_load_func load;\n");
278+
fprintf(fout, " bin2c_free_func unload;\n");
279+
fprintf(fout, " bin2c_save_func save;\n");
280+
fprintf(fout, "} %s;\n", mContext.baseClass.c_str());
281+
fprintf(fout, "typedef %s* %sPtr;\n", mContext.baseClass.c_str(), mContext.baseClass.c_str());
282+
fprintf(fout, "#endif //%s_EMBEDDEDFILE_STRUCT\n", classMacroGuardPrefix.c_str());
283+
fprintf(fout, "\n");
284+
fprintf(fout, "size_t bin2c_filemanager_get_file_count();\n");
285+
fprintf(fout, "bool bin2c_filemanager_register_file(%s* file);\n", mContext.baseClass.c_str());
286+
fprintf(fout, "const %s* bin2c_filemanager_get_file(size_t index);\n", mContext.baseClass.c_str());
287+
fprintf(fout, "bool bin2c_filemanager_save_files(const char* directory);\n");
288+
fprintf(fout, "\n");
289+
fprintf(fout, "#endif //%s\n", macroGuard.c_str());
290+
291+
fclose(fout);
292+
293+
return true;
294+
}
295+
296+
bool ManagerGenerator::createCSourceFile(const char* file_path)
297+
{
298+
FILE* fout = fopen(file_path, "w");
299+
if ( !fout )
300+
return false;
301+
302+
//Build header and cpp file path
303+
std::string headerPath = getHeaderFilePath(file_path);
304+
std::string sourcePath = file_path;
305+
306+
std::string fileHeader = getHeaderTemplate(false);
307+
308+
fprintf(fout, "%s", fileHeader.c_str());
309+
fprintf(fout, "#if defined(_WIN32) && !defined(_CRT_SECURE_NO_WARNINGS)\n");
310+
fprintf(fout, "#define _CRT_SECURE_NO_WARNINGS\n");
311+
fprintf(fout, "#endif\n");
312+
fprintf(fout, "\n");
313+
fprintf(fout, "#include \"%s\"\n", mContext.managerHeaderFilename.c_str());
314+
fprintf(fout, "#include <stdlib.h> // for malloc\n");
315+
fprintf(fout, "#include <stdio.h> // for snprintf()\n");
316+
fprintf(fout, "#include <string.h> // strlen\n");
317+
fprintf(fout, "#include <sys/stat.h> // stat\n");
318+
fprintf(fout, "#include <errno.h> // errno, EEXIST\n");
319+
fprintf(fout, "#if defined(_WIN32)\n");
320+
fprintf(fout, "#include <direct.h> // _mkdir\n");
321+
fprintf(fout, "#endif\n");
322+
fprintf(fout, "#if defined(_WIN32)\n");
323+
fprintf(fout, "#define portable_stat _stat\n");
324+
fprintf(fout, "#define portable_mkdir(path) _mkdir(path)\n");
325+
fprintf(fout, "#define PATH_SEPARATOR_CHAR '\\\\'\n");
326+
fprintf(fout, "#define PATH_SEPARATOR_STR \"\\\\\"\n");
327+
fprintf(fout, "#else\n");
328+
fprintf(fout, "#define portable_stat stat\n");
329+
fprintf(fout, "#define portable_mkdir(path) mkdir(path, 0755)\n");
330+
fprintf(fout, "#define PATH_SEPARATOR_CHAR '/'\n");
331+
fprintf(fout, "#define PATH_SEPARATOR_STR \"/\"\n");
332+
fprintf(fout, "#endif\n");
333+
fprintf(fout, "\n");
334+
fprintf(fout, "#define BIN2C_MAX_PATH 32767\n");
335+
fprintf(fout, "\n");
336+
fprintf(fout, "static %s** registered_files = NULL;\n", mContext.baseClass.c_str());
337+
fprintf(fout, "static size_t registered_files_count = 0;\n");
338+
fprintf(fout, "\n");
339+
fprintf(fout, "size_t bin2c_filemanager_get_file_count()\n");
340+
fprintf(fout, "{\n");
341+
fprintf(fout, " return registered_files_count;\n");
342+
fprintf(fout, "}\n");
343+
fprintf(fout, "\n");
344+
fprintf(fout, "bool bin2c_filemanager_register_file(%s* file)\n", mContext.baseClass.c_str());
345+
fprintf(fout, "{\n");
346+
fprintf(fout, " // allocate ram\n");
347+
fprintf(fout, " size_t new_ram_size = sizeof(%s**) * (registered_files_count + 1);\n", mContext.baseClass.c_str());
348+
fprintf(fout, " %s** tmp = NULL;\n", mContext.baseClass.c_str());
349+
fprintf(fout, " if ( registered_files == NULL )\n");
350+
fprintf(fout, " tmp = (%s**)malloc(new_ram_size);\n", mContext.baseClass.c_str());
351+
fprintf(fout, " else\n");
352+
fprintf(fout, " tmp = (%s**)realloc(registered_files, new_ram_size);\n", mContext.baseClass.c_str());
353+
fprintf(fout, " if ( tmp == NULL )\n");
354+
fprintf(fout, " return false;\n");
355+
fprintf(fout, " \n");
356+
fprintf(fout, " registered_files = tmp;\n");
357+
fprintf(fout, " registered_files_count++;\n");
358+
fprintf(fout, " \n");
359+
fprintf(fout, " // insert\n");
360+
fprintf(fout, " registered_files[registered_files_count - 1] = file;\n");
361+
fprintf(fout, " \n");
362+
fprintf(fout, " return true;\n");
363+
fprintf(fout, "}\n");
364+
fprintf(fout, "\n");
365+
fprintf(fout, "const %s* bin2c_filemanager_get_file(size_t index)\n", mContext.baseClass.c_str());
366+
fprintf(fout, "{\n");
367+
fprintf(fout, " if ( index >= registered_files_count )\n");
368+
fprintf(fout, " return NULL;\n");
369+
fprintf(fout, " return registered_files[index];\n");
370+
fprintf(fout, "}\n");
371+
fprintf(fout, "\n");
372+
fprintf(fout, "static inline bool bin2c_filemanager_is_root_directory(const char* path)\n");
373+
fprintf(fout, "{\n");
374+
fprintf(fout, " if ( path == NULL && path[0] == '\0' )\n");
375+
fprintf(fout, " return false;\n");
376+
fprintf(fout, "#if defined(_WIN32)\n");
377+
fprintf(fout, " bool is_drive_letter = ((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z'));\n");
378+
fprintf(fout, " if ( (is_drive_letter && path[1] == ':' && path[2] == '\0') || // test for C:\n");
379+
fprintf(fout, " (is_drive_letter && path[1] == ':' && path[2] == PATH_SEPARATOR_CHAR && path[3] == '\0') ) // test for C:\\ \n");
380+
fprintf(fout, " return true;\n");
381+
fprintf(fout, "#else\n");
382+
fprintf(fout, " if ( path[0] == PATH_SEPARATOR_CHAR )\n");
383+
fprintf(fout, " return true;\n");
384+
fprintf(fout, "#endif\n");
385+
fprintf(fout, " return false;\n");
386+
fprintf(fout, "}\n");
387+
fprintf(fout, "\n");
388+
fprintf(fout, "bool bin2c_filemanager_create_parent_directories(const char* file_path)\n");
389+
fprintf(fout, "{\n");
390+
fprintf(fout, " if ( file_path == NULL )\n");
391+
fprintf(fout, " return false;\n");
392+
fprintf(fout, " char* accumulator = (char*)malloc(BIN2C_MAX_PATH);\n");
393+
fprintf(fout, " if ( accumulator == NULL )\n");
394+
fprintf(fout, " return false;\n");
395+
fprintf(fout, " accumulator[0] = '\0';\n");
396+
fprintf(fout, " size_t length = strlen(file_path);\n");
397+
fprintf(fout, " for ( size_t i = 0; i < length; i++ )\n");
398+
fprintf(fout, " {\n");
399+
fprintf(fout, " if ( file_path[i] == PATH_SEPARATOR_CHAR && !(accumulator[0] == '\0') && !bin2c_filemanager_is_root_directory(accumulator) )\n");
400+
fprintf(fout, " {\n");
401+
fprintf(fout, " int ret = portable_mkdir(accumulator);\n");
402+
fprintf(fout, " if ( ret != 0 && errno != EEXIST )\n");
403+
fprintf(fout, " {\n");
404+
fprintf(fout, " free(accumulator);\n");
405+
fprintf(fout, " return false;\n");
406+
fprintf(fout, " }\n");
407+
fprintf(fout, " }\n");
408+
fprintf(fout, " \n");
409+
fprintf(fout, " // append\n");
410+
fprintf(fout, " char tmp[] = { file_path[i], '\0' };\n");
411+
fprintf(fout, " strcat(accumulator, tmp);\n");
412+
fprintf(fout, " }\n");
413+
fprintf(fout, " free(accumulator);\n");
414+
fprintf(fout, " return true;\n");
415+
fprintf(fout, "}\n");
416+
fprintf(fout, "\n");
417+
fprintf(fout, "bool bin2c_filemanager_save_files(const char * directory)\n");
418+
fprintf(fout, "{\n");
419+
fprintf(fout, " if (directory == NULL)\n");
420+
fprintf(fout, " return false;\n");
421+
fprintf(fout, " char* path = (char*)malloc(BIN2C_MAX_PATH);\n");
422+
fprintf(fout, " if ( path == NULL )\n");
423+
fprintf(fout, " return false;\n");
424+
fprintf(fout, " path[0] = '\0';\n");
425+
fprintf(fout, " for(size_t i=0; i< registered_files_count; i++)\n");
426+
fprintf(fout, " {\n");
427+
fprintf(fout, " const Bin2cFile* f = bin2c_filemanager_get_file(i);\n");
428+
fprintf(fout, " if ( !f )\n");
429+
fprintf(fout, " {\n");
430+
fprintf(fout, " free(path);\n");
431+
fprintf(fout, " return false;\n");
432+
fprintf(fout, " }\n");
433+
fprintf(fout, " \n");
434+
fprintf(fout, " char path[32767] = { 0 };\n");
435+
fprintf(fout, " snprintf(path, sizeof(path), \"%%s%%c%%s\", directory, PATH_SEPARATOR_CHAR, f->file_path);\n");
436+
fprintf(fout, " \n");
437+
fprintf(fout, " if (!bin2c_filemanager_create_parent_directories(path))\n");
438+
fprintf(fout, " {\n");
439+
fprintf(fout, " free(path);\n");
440+
fprintf(fout, " return false;\n");
441+
fprintf(fout, " }\n");
442+
fprintf(fout, " bool saved = f->save(path);\n");
443+
fprintf(fout, " if (!saved)\n");
444+
fprintf(fout, " {\n");
445+
fprintf(fout, " free(path);\n");
446+
fprintf(fout, " return false;\n");
447+
fprintf(fout, " }\n");
448+
fprintf(fout, " }\n");
449+
fprintf(fout, " free(path);\n");
450+
fprintf(fout, " return true;\n");
451+
fprintf(fout, "}\n");
452+
fprintf(fout, "\n");
453+
454+
fclose(fout);
455+
456+
return true;
457+
}
458+
242459
bool ManagerGenerator::printFileContent()
243460
{
244461
return false;

src/bin2cpp/ManagerGenerator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ namespace bin2cpp
4141
virtual const char * getName() const;
4242
virtual bool createCppHeaderFile(const char* header_file_path);
4343
virtual bool createCppSourceFile(const char * cpp_file_path);
44+
virtual bool createCHeaderFile(const char* file_path);
45+
virtual bool createCSourceFile(const char* file_path);
4446
virtual bool printFileContent();
4547
};
4648

src/bin2cpp/SegmentGenerator.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,12 @@ namespace bin2cpp
211211
fprintf(fout, "static bool %s_initialized = false;\n", functionIdentifier.c_str());
212212
fprintf(fout, "\n");
213213

214+
if ( mContext.registerFiles )
215+
{
216+
fprintf(fout, "extern bool bin2c_filemanager_register_file(%s * file);\n", mContext.baseClass.c_str());
217+
fprintf(fout, "\n");
218+
}
219+
214220
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
215221
fprintf(fout, "{\n");
216222
fprintf(fout, " if ( %s_file.buffer )\n", functionIdentifier.c_str());
@@ -264,7 +270,7 @@ namespace bin2cpp
264270
fprintf(fout, "void %s_free()\n", functionIdentifier.c_str());
265271
fprintf(fout, "{\n");
266272
fprintf(fout, " if ( %s_file.buffer )\n", functionIdentifier.c_str());
267-
fprintf(fout, " free(%s_file.buffer);\n", functionIdentifier.c_str());
273+
fprintf(fout, " free((unsigned char*)%s_file.buffer);\n", functionIdentifier.c_str());
268274
fprintf(fout, " %s_file.buffer = NULL;\n", functionIdentifier.c_str());
269275
fprintf(fout, "}\n");
270276
fprintf(fout, "\n");
@@ -298,6 +304,14 @@ namespace bin2cpp
298304
fprintf(fout, " file->load = %s_load;\n", functionIdentifier.c_str());
299305
fprintf(fout, " file->unload = %s_free;\n", functionIdentifier.c_str());
300306
fprintf(fout, " file->save = %s_save;\n", functionIdentifier.c_str());
307+
308+
if ( mContext.registerFiles )
309+
{
310+
fprintf(fout, " \n");
311+
fprintf(fout, " // register\n");
312+
fprintf(fout, " bin2c_filemanager_register_file(file);\n");
313+
}
314+
301315
fprintf(fout, "}\n");
302316
fprintf(fout, "\n");
303317
fprintf(fout, "%s* %s(void)\n", mContext.baseClass.c_str(), getGetterFunctionName().c_str());
@@ -306,11 +320,11 @@ namespace bin2cpp
306320
fprintf(fout, " return &%s_file;\n", functionIdentifier.c_str());
307321
fprintf(fout, "}\n");
308322

309-
if ( mContext.registerFiles )
310-
{
311-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
312-
fprintf(fout, "%s", fileManagerTemplate.c_str());
313-
}
323+
//if ( mContext.registerFiles )
324+
//{
325+
// std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
326+
// fprintf(fout, "%s", fileManagerTemplate.c_str());
327+
//}
314328

315329
fclose(input);
316330
fclose(fout);

src/bin2cpp/StringGenerator.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,12 @@ namespace bin2cpp
213213
fprintf(fout, "static bool %s_initialized = false;\n", functionIdentifier.c_str());
214214
fprintf(fout, "\n");
215215

216+
if ( mContext.registerFiles )
217+
{
218+
fprintf(fout, "extern bool bin2c_filemanager_register_file(%s * file);\n", mContext.baseClass.c_str());
219+
fprintf(fout, "\n");
220+
}
221+
216222
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
217223
fprintf(fout, "{\n");
218224
fprintf(fout, " if ( %s_file.buffer )\n", functionIdentifier.c_str());
@@ -308,6 +314,14 @@ namespace bin2cpp
308314
fprintf(fout, " file->load = %s_load;\n", functionIdentifier.c_str());
309315
fprintf(fout, " file->unload = %s_free;\n", functionIdentifier.c_str());
310316
fprintf(fout, " file->save = %s_save;\n", functionIdentifier.c_str());
317+
318+
if ( mContext.registerFiles )
319+
{
320+
fprintf(fout, " \n");
321+
fprintf(fout, " // register\n");
322+
fprintf(fout, " bin2c_filemanager_register_file(file);\n");
323+
}
324+
311325
fprintf(fout, "}\n");
312326
fprintf(fout, "\n");
313327
fprintf(fout, "%s* %s(void)\n", mContext.baseClass.c_str(), getGetterFunctionName().c_str());

src/bin2cpp/Win32ResourceGenerator.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,12 @@ namespace bin2cpp
264264
fprintf(fout, "static %s %s_info = { 0 };\n", getLocalInfoStructName().c_str(), functionIdentifier.c_str());
265265
fprintf(fout, "\n");
266266

267+
if ( mContext.registerFiles )
268+
{
269+
fprintf(fout, "extern bool bin2c_filemanager_register_file(%s * file);\n", mContext.baseClass.c_str());
270+
fprintf(fout, "\n");
271+
}
272+
267273
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
268274
fprintf(fout, "{\n");
269275
fprintf(fout, " if ( %s_file.buffer )\n", functionIdentifier.c_str());
@@ -351,6 +357,14 @@ namespace bin2cpp
351357
fprintf(fout, " file->load = %s_load;\n", functionIdentifier.c_str());
352358
fprintf(fout, " file->unload = %s_free;\n", functionIdentifier.c_str());
353359
fprintf(fout, " file->save = %s_save;\n", functionIdentifier.c_str());
360+
361+
if ( mContext.registerFiles )
362+
{
363+
fprintf(fout, " \n");
364+
fprintf(fout, " // register\n");
365+
fprintf(fout, " bin2c_filemanager_register_file(file);\n");
366+
}
367+
354368
fprintf(fout, "}\n");
355369
fprintf(fout, "\n");
356370

0 commit comments

Comments
 (0)