Skip to content

Commit f223179

Browse files
committed
Implemented --registerfile command support for C generated code.
1 parent 1c0b777 commit f223179

File tree

7 files changed

+75
-49
lines changed

7 files changed

+75
-49
lines changed

src/bin2cpp/ArrayGenerator.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace bin2cpp
139139
fprintf(cpp, " const %s & %s() { static %s _instance; return _instance; }\n", getContext().baseClass.c_str(), getterFunctionName.c_str(), className.c_str());
140140
if (mContext.registerFiles)
141141
{
142-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
142+
std::string fileManagerTemplate = getCppFileManagerRegistrationImplementationTemplate();
143143
fprintf(cpp, "%s", fileManagerTemplate.c_str());
144144
}
145145
fprintf(cpp, "}; //%s\n", getContext().codeNamespace.c_str());
@@ -199,7 +199,7 @@ namespace bin2cpp
199199
if ( !input )
200200
return false;
201201

202-
//Uppercase function identifier
202+
//Lowercase function identifier
203203
std::string functionIdentifier = ra::strings::Lowercase(mContext.functionIdentifier);
204204

205205
//Build header and cpp file path
@@ -243,11 +243,8 @@ 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-
}
246+
// File registration predeclaration code
247+
fprintf(fout, "%s", getCFileManagerRegistrationPredeclarationTemplate().c_str());
251248

252249
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
253250
fprintf(fout, "{\n");
@@ -331,14 +328,12 @@ namespace bin2cpp
331328
fprintf(fout, " file->load = %s_load;\n", functionIdentifier.c_str());
332329
fprintf(fout, " file->unload = %s_free;\n", functionIdentifier.c_str());
333330
fprintf(fout, " file->save = %s_save;\n", functionIdentifier.c_str());
334-
335331
if ( mContext.registerFiles )
336332
{
337333
fprintf(fout, " \n");
338-
fprintf(fout, " // register\n");
334+
fprintf(fout, " // register when loaded if static initialisation does not work\n");
339335
fprintf(fout, " bin2c_filemanager_register_file(file);\n");
340336
}
341-
342337
fprintf(fout, "}\n");
343338
fprintf(fout, "\n");
344339
fprintf(fout, "%s* %s(void)\n", mContext.baseClass.c_str(), getGetterFunctionName().c_str());
@@ -347,6 +342,9 @@ namespace bin2cpp
347342
fprintf(fout, " return &%s_file;\n", functionIdentifier.c_str());
348343
fprintf(fout, "}\n");
349344

345+
// File registration implementation code
346+
fprintf(fout, "%s", getCFileManagerRegistrationImplementationTemplate().c_str());
347+
350348
fclose(input);
351349
fclose(fout);
352350

src/bin2cpp/BaseGenerator.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ namespace bin2cpp
166166
return output;
167167
}
168168

169-
std::string BaseGenerator::getFileManagerRegistrationTemplate()
169+
std::string BaseGenerator::getCppFileManagerRegistrationImplementationTemplate()
170170
{
171171
if (!mContext.registerFiles)
172172
return std::string();
@@ -181,6 +181,41 @@ namespace bin2cpp
181181
return output;
182182
}
183183

184+
std::string BaseGenerator::getCFileManagerRegistrationPredeclarationTemplate()
185+
{
186+
if ( !mContext.registerFiles )
187+
return std::string();
188+
189+
std::string output;
190+
output << "extern bool bin2c_filemanager_register_file(" << mContext.baseClass << " * file); \n";
191+
output << "\n";
192+
return output;
193+
}
194+
195+
std::string BaseGenerator::getCFileManagerRegistrationImplementationTemplate()
196+
{
197+
if ( !mContext.registerFiles )
198+
return std::string();
199+
200+
//Lowercase function identifier
201+
std::string functionIdentifier = ra::strings::Lowercase(mContext.functionIdentifier);
202+
203+
std::string output;
204+
output << "#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) // GCC 4.0+ required, Clang supports it by default\n";
205+
output << "__attribute__((constructor))\n";
206+
output << "#endif\n";
207+
output << "void bin2c_register_file_static_init_" << functionIdentifier << "(void)\n";
208+
output << "{\n";
209+
output << " " << mContext.baseClass << "* this_file = bin2c_get_file_" << functionIdentifier << "();\n";
210+
output << " bin2c_filemanager_register_file(this_file);\n";
211+
output << "}\n";
212+
output << "#if _MSC_VER >= 1920 // Visual Studio 2019 or later\n";
213+
output << "#pragma section(\".CRT$XCU\", read)\n";
214+
output << "__declspec(allocate(\".CRT$XCU\")) void (*init_ptr_" << functionIdentifier << ")(void) = bin2c_register_file_static_init_" << functionIdentifier << ";\n";
215+
output << "#endif\n";
216+
return output;
217+
}
218+
184219
std::string BaseGenerator::getClassName()
185220
{
186221
std::string functionIdentifier = ra::strings::CapitalizeFirstCharacter(mContext.functionIdentifier);

src/bin2cpp/BaseGenerator.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ namespace bin2cpp
5757
virtual std::string getHeaderTemplate();
5858
virtual std::string getHeaderTemplate(bool include_source_file);
5959
virtual std::string getSaveMethodTemplate();
60-
virtual std::string getFileManagerRegistrationTemplate();
60+
virtual std::string getCppFileManagerRegistrationImplementationTemplate();
61+
virtual std::string getCFileManagerRegistrationPredeclarationTemplate();
62+
virtual std::string getCFileManagerRegistrationImplementationTemplate();
6163
virtual std::string getClassName();
6264
virtual std::string getClassMacroGuardPrefix();
6365
virtual std::string getImplOfGetFileName();

src/bin2cpp/ManagerGenerator.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,17 @@ namespace bin2cpp
343343
fprintf(fout, "\n");
344344
fprintf(fout, "bool bin2c_filemanager_register_file(%s* file)\n", mContext.baseClass.c_str());
345345
fprintf(fout, "{\n");
346+
fprintf(fout, " // check if already registered\n");
347+
fprintf(fout, " if ( registered_files_count && registered_files )\n");
348+
fprintf(fout, " {\n");
349+
fprintf(fout, " for ( size_t i = 0; i < registered_files_count; i++ )\n");
350+
fprintf(fout, " {\n");
351+
fprintf(fout, " const %s* existing_file = registered_files[i];\n", mContext.baseClass.c_str());
352+
fprintf(fout, " if ( existing_file == file )\n");
353+
fprintf(fout, " return true; // nothing to do\n");
354+
fprintf(fout, " }\n");
355+
fprintf(fout, " }\n");
356+
fprintf(fout, " \n");
346357
fprintf(fout, " // allocate ram\n");
347358
fprintf(fout, " size_t new_ram_size = sizeof(%s**) * (registered_files_count + 1);\n", mContext.baseClass.c_str());
348359
fprintf(fout, " %s** tmp = NULL;\n", mContext.baseClass.c_str());

src/bin2cpp/SegmentGenerator.cpp

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ namespace bin2cpp
149149
fprintf(cpp, " const %s & %s() { static %s _instance; return _instance; }\n", getContext().baseClass.c_str(), getterFunctionName.c_str(), className.c_str());
150150
if (mContext.registerFiles)
151151
{
152-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
152+
std::string fileManagerTemplate = getCppFileManagerRegistrationImplementationTemplate();
153153
fprintf(cpp, "%s", fileManagerTemplate.c_str());
154154
}
155155
fprintf(cpp, "}; //%s\n", getContext().codeNamespace.c_str());
@@ -167,7 +167,7 @@ namespace bin2cpp
167167
if ( !input )
168168
return false;
169169

170-
//Uppercase function identifier
170+
//Lowercase function identifier
171171
std::string functionIdentifier = ra::strings::Lowercase(mContext.functionIdentifier);
172172

173173
//Build header and cpp file path
@@ -211,11 +211,8 @@ 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-
}
214+
// File registration predeclaration code
215+
fprintf(fout, "%s", getCFileManagerRegistrationPredeclarationTemplate().c_str());
219216

220217
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
221218
fprintf(fout, "{\n");
@@ -304,14 +301,12 @@ namespace bin2cpp
304301
fprintf(fout, " file->load = %s_load;\n", functionIdentifier.c_str());
305302
fprintf(fout, " file->unload = %s_free;\n", functionIdentifier.c_str());
306303
fprintf(fout, " file->save = %s_save;\n", functionIdentifier.c_str());
307-
308304
if ( mContext.registerFiles )
309305
{
310306
fprintf(fout, " \n");
311-
fprintf(fout, " // register\n");
307+
fprintf(fout, " // register when loaded if static initialisation does not work\n");
312308
fprintf(fout, " bin2c_filemanager_register_file(file);\n");
313309
}
314-
315310
fprintf(fout, "}\n");
316311
fprintf(fout, "\n");
317312
fprintf(fout, "%s* %s(void)\n", mContext.baseClass.c_str(), getGetterFunctionName().c_str());
@@ -320,11 +315,8 @@ namespace bin2cpp
320315
fprintf(fout, " return &%s_file;\n", functionIdentifier.c_str());
321316
fprintf(fout, "}\n");
322317

323-
//if ( mContext.registerFiles )
324-
//{
325-
// std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
326-
// fprintf(fout, "%s", fileManagerTemplate.c_str());
327-
//}
318+
// File registration implementation code
319+
fprintf(fout, "%s", getCFileManagerRegistrationImplementationTemplate().c_str());
328320

329321
fclose(input);
330322
fclose(fout);

src/bin2cpp/StringGenerator.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ namespace bin2cpp
151151
fprintf(cpp, " const %s & %s() { static %s _instance; return _instance; }\n", getContext().baseClass.c_str(), getterFunctionName.c_str(), className.c_str());
152152
if (mContext.registerFiles)
153153
{
154-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
154+
std::string fileManagerTemplate = getCppFileManagerRegistrationImplementationTemplate();
155155
fprintf(cpp, "%s", fileManagerTemplate.c_str());
156156
}
157157
fprintf(cpp, "}; //%s\n", getContext().codeNamespace.c_str());
@@ -213,11 +213,8 @@ 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-
}
216+
// File registration predeclaration code
217+
fprintf(fout, "%s", getCFileManagerRegistrationPredeclarationTemplate().c_str());
221218

222219
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
223220
fprintf(fout, "{\n");
@@ -330,11 +327,8 @@ namespace bin2cpp
330327
fprintf(fout, " return &%s_file;\n", functionIdentifier.c_str());
331328
fprintf(fout, "}\n");
332329

333-
if ( mContext.registerFiles )
334-
{
335-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
336-
fprintf(fout, "%s", fileManagerTemplate.c_str());
337-
}
330+
// File registration implementation code
331+
fprintf(fout, "%s", getCFileManagerRegistrationImplementationTemplate().c_str());
338332

339333
fclose(input);
340334
fclose(fout);

src/bin2cpp/Win32ResourceGenerator.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ namespace bin2cpp
180180
fprintf(cpp, " const %s & %s() { static %s _instance; return _instance; }\n", getContext().baseClass.c_str(), getterFunctionName.c_str(), className.c_str());
181181
if (mContext.registerFiles)
182182
{
183-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
183+
std::string fileManagerTemplate = getCppFileManagerRegistrationImplementationTemplate();
184184
fprintf(cpp, "%s", fileManagerTemplate.c_str());
185185
}
186186
fprintf(cpp, "}; //%s\n", getContext().codeNamespace.c_str());
@@ -264,11 +264,8 @@ 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-
}
267+
// File registration predeclaration code
268+
fprintf(fout, "%s", getCFileManagerRegistrationPredeclarationTemplate().c_str());
272269

273270
fprintf(fout, "bool %s_load()\n", functionIdentifier.c_str());
274271
fprintf(fout, "{\n");
@@ -374,11 +371,8 @@ namespace bin2cpp
374371
fprintf(fout, " return &%s_file;\n", functionIdentifier.c_str());
375372
fprintf(fout, "}\n");
376373

377-
if ( mContext.registerFiles )
378-
{
379-
std::string fileManagerTemplate = getFileManagerRegistrationTemplate();
380-
fprintf(fout, "%s", fileManagerTemplate.c_str());
381-
}
374+
// File registration implementation code
375+
fprintf(fout, "%s", getCFileManagerRegistrationImplementationTemplate().c_str());
382376

383377
fclose(input);
384378
fclose(fout);

0 commit comments

Comments
 (0)