|
- /*
- ==============================================================================
-
- Utility to turn a bunch of binary files into a .cpp file and .h file full of
- data so they can be built directly into an executable.
-
- Copyright 2007 by Julian Storer.
-
- Use this code at your own risk! It carries no warranty!
-
- ==============================================================================
- */
-
- #include "juce_AppConfig.h"
- #include "../../juce_amalgamated.h"
-
-
- //==============================================================================
- static int addFile (const File& file,
- const String& classname,
- OutputStream& headerStream,
- OutputStream& cppStream)
- {
- MemoryBlock mb;
- file.loadFileAsData (mb);
-
- const String name (file.getFileName().toLowerCase()
- .replaceCharacter (' ', '_')
- .replaceCharacter ('.', '_')
- .retainCharacters (T("abcdefghijklmnopqrstuvwxyz_0123456789")));
-
- printf ("Adding %s: %d bytes\n",
- (const char*) name,
- mb.getSize());
-
- headerStream.printf (" extern const char* %s;\r\n"
- " const int %sSize = %d;\r\n\r\n",
- (const char*) name,
- (const char*) name,
- mb.getSize());
-
- static int tempNum = 0;
-
- cppStream.printf ("static const unsigned char temp%d[] = {", ++tempNum);
-
- int i = 0;
- const uint8* const data = (const uint8*) mb.getData();
-
- while (i < mb.getSize() - 1)
- {
- if ((i % 40) != 39)
- cppStream.printf ("%d,", (int) data[i]);
- else
- cppStream.printf ("%d,\r\n ", (int) data[i]);
-
- ++i;
- }
-
- cppStream.printf ("%d,0,0};\r\n", (int) data[i]);
-
- cppStream.printf ("const char* %s::%s = (const char*) temp%d;\r\n\r\n",
- (const char*) classname,
- (const char*) name,
- tempNum);
-
- return mb.getSize();
- }
-
- static bool isHiddenFile (const File& f, const File& root)
- {
- return f.getFileName().endsWithIgnoreCase (T(".scc"))
- || f.getFileName() == T(".svn")
- || f.getFileName().startsWithChar (T('.'))
- || (f.getSize() == 0 && ! f.isDirectory())
- || (f.getParentDirectory() != root && isHiddenFile (f.getParentDirectory(), root));
- }
-
- //==============================================================================
- int main (int argc, char* argv[])
- {
- // If you're running a command-line app, you need to initialise juce manually
- // before calling any Juce functionality..
- initialiseJuce_NonGUI();
-
- printf ("\n BinaryBuilder! Copyright 2007 by Julian Storer - www.rawmaterialsoftware.com\n\n");
-
- if (argc < 4 || argc > 5)
- {
- printf (" Usage: BinaryBuilder sourcedirectory targetdirectory targetclassname [optional wildcard pattern]\n\n");
- printf (" BinaryBuilder will find all files in the source directory, and encode them\n");
- printf (" into two files called (targetclassname).cpp and (targetclassname).h, which it\n");
- printf (" will write into the target directory supplied.\n\n");
- printf (" Any files in sub-directories of the source directory will be put into the\n");
- printf (" resultant class, but #ifdef'ed out using the name of the sub-directory (hard to\n");
- printf (" explain, but obvious when you try it...)\n");
-
- return 0;
- }
-
- const File sourceDirectory (File::getCurrentWorkingDirectory()
- .getChildFile (String (argv[1]).unquoted()));
-
- if (! sourceDirectory.isDirectory())
- {
- String error ("Source directory doesn't exist: ");
- error << sourceDirectory.getFullPathName() << "\n\n";
-
- printf ((const char*) error);
- return 0;
- }
-
- const File destDirectory (File::getCurrentWorkingDirectory()
- .getChildFile (String (argv[2]).unquoted()));
-
- if (! destDirectory.isDirectory())
- {
- String error ("Destination directory doesn't exist: ");
- error << destDirectory.getFullPathName() << "\n\n";
-
- printf ((const char*) error);
- return 0;
- }
-
- String className (argv[3]);
- className = className.trim();
-
- const File headerFile (destDirectory.getChildFile (className).withFileExtension (T(".h")));
- const File cppFile (destDirectory.getChildFile (className).withFileExtension (T(".cpp")));
-
- String message;
- message << "Creating " << headerFile.getFullPathName()
- << " and " << cppFile.getFullPathName()
- << " from files in " << sourceDirectory.getFullPathName()
- << "...\n\n";
-
- printf ((const char*) message);
-
- OwnedArray <File> files;
- sourceDirectory.findChildFiles (files, File::findFiles, true,
- (argc > 4) ? argv[4] : "*");
-
- if (files.size() == 0)
- {
- String error ("Didn't find any source files in: ");
- error << sourceDirectory.getFullPathName() << "\n\n";
- printf ((const char*) error);
- return 0;
- }
-
- headerFile.deleteFile();
- cppFile.deleteFile();
-
- OutputStream* header = headerFile.createOutputStream();
-
- if (header == 0)
- {
- String error ("Couldn't open ");
- error << headerFile.getFullPathName() << " for writing\n\n";
- printf ((const char*) error);
- return 0;
- }
-
- OutputStream* cpp = cppFile.createOutputStream();
-
- if (cpp == 0)
- {
- String error ("Couldn't open ");
- error << cppFile.getFullPathName() << " for writing\n\n";
- printf ((const char*) error);
- return 0;
- }
-
- header->printf ("/* (Auto-generated binary data file). */\r\n\r\n"
- "#ifndef BINARY_%s_H\r\n"
- "#define BINARY_%s_H\r\n\r\n"
- "namespace %s\r\n"
- "{\r\n",
- (const char*) className.toUpperCase(),
- (const char*) className.toUpperCase(),
- (const char*) className);
-
- cpp->printf ("/* (Auto-generated binary data file). */\r\n\r\n"
- "#include \"%s.h\"\r\n\r\n",
- (const char*) className);
-
- int totalBytes = 0;
-
- for (int i = 0; i < files.size(); ++i)
- {
- const File file (*(files[i]));
-
- // (avoid source control files and hidden files..)
- if (! isHiddenFile (file, sourceDirectory))
- {
- if (file.getParentDirectory() != sourceDirectory)
- {
- header->printf (" #ifdef %s\r\n", (const char*) file.getParentDirectory().getFileName().toUpperCase());
- cpp->printf ("#ifdef %s\r\n", (const char*) file.getParentDirectory().getFileName().toUpperCase());
-
- totalBytes += addFile (file, className, *header, *cpp);
-
- header->printf (" #endif\r\n");
- cpp->printf ("#endif\r\n");
- }
- else
- {
- totalBytes += addFile (file, className, *header, *cpp);
- }
- }
- }
-
- header->printf ("};\r\n\r\n"
- "#endif\r\n");
-
- delete header;
- delete cpp;
-
- printf ("\n Total size of binary data: %d bytes\n", totalBytes);
-
- shutdownJuce_NonGUI();
-
- return 0;
- }
|