mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-13 00:04:19 +00:00
Converted the BinaryBuilder projects to be auto-generated by the Jucer.
This commit is contained in:
parent
257712c1da
commit
07623e9fa3
18 changed files with 670 additions and 451 deletions
204
extras/binarybuilder/Source/Main.cpp
Normal file
204
extras/binarybuilder/Source/Main.cpp
Normal file
|
|
@ -0,0 +1,204 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
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.
|
||||
|
||||
Use this code at your own risk! It carries no warranty!
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "../JuceLibraryCode/JuceHeader.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")));
|
||||
|
||||
std::cout << "Adding " << (const char*) name << ": "
|
||||
<< (int) mb.getSize() << " bytes" << std::endl;
|
||||
|
||||
headerStream << " extern const char* " << name << ";\r\n"
|
||||
" const int " << name << "Size = "
|
||||
<< (int) mb.getSize() << ";\r\n\r\n";
|
||||
|
||||
static int tempNum = 0;
|
||||
|
||||
cppStream << "static const unsigned char temp" << ++tempNum << "[] = {";
|
||||
|
||||
int i = 0;
|
||||
const uint8* const data = (const uint8*) mb.getData();
|
||||
|
||||
while (i < mb.getSize() - 1)
|
||||
{
|
||||
if ((i % 40) != 39)
|
||||
cppStream << (int) data[i] << ",";
|
||||
else
|
||||
cppStream << (int) data[i] << ",\r\n ";
|
||||
|
||||
++i;
|
||||
}
|
||||
|
||||
cppStream << (int) data[i] << ",0,0};\r\n";
|
||||
|
||||
cppStream << "const char* " << classname << "::" << name
|
||||
<< " = (const char*) temp" << tempNum << ";\r\n\r\n";
|
||||
|
||||
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[])
|
||||
{
|
||||
// This object makes sure that Juce is initialised and shut down correctly
|
||||
// for the scope of this function call. Make sure this declaration is the
|
||||
// first statement of this function.
|
||||
const ScopedJuceInitialiser_NonGUI juceSystemInitialiser;
|
||||
|
||||
std::cout << "\n BinaryBuilder! Copyright 2007 by Julian Storer - www.rawmaterialsoftware.com\n\n";
|
||||
|
||||
if (argc < 4 || argc > 5)
|
||||
{
|
||||
std::cout << " Usage: BinaryBuilder sourcedirectory targetdirectory targetclassname [optional wildcard pattern]\n\n"
|
||||
" BinaryBuilder will find all files in the source directory, and encode them\n"
|
||||
" into two files called (targetclassname).cpp and (targetclassname).h, which it\n"
|
||||
" will write into the target directory supplied.\n\n"
|
||||
" Any files in sub-directories of the source directory will be put into the\n"
|
||||
" resultant class, but #ifdef'ed out using the name of the sub-directory (hard to\n"
|
||||
" explain, but obvious when you try it...)\n";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const File sourceDirectory (File::getCurrentWorkingDirectory()
|
||||
.getChildFile (String (argv[1]).unquoted()));
|
||||
|
||||
if (! sourceDirectory.isDirectory())
|
||||
{
|
||||
std::cout << "Source directory doesn't exist: "
|
||||
<< (const char*) sourceDirectory.getFullPathName()
|
||||
<< std::endl << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const File destDirectory (File::getCurrentWorkingDirectory()
|
||||
.getChildFile (String (argv[2]).unquoted()));
|
||||
|
||||
if (! destDirectory.isDirectory())
|
||||
{
|
||||
std::cout << "Destination directory doesn't exist: "
|
||||
<< (const char*) destDirectory.getFullPathName() << std::endl << std::endl;
|
||||
|
||||
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")));
|
||||
|
||||
std::cout << "Creating " << (const char*) headerFile.getFullPathName()
|
||||
<< " and " << (const char*) cppFile.getFullPathName()
|
||||
<< " from files in " << (const char*) sourceDirectory.getFullPathName()
|
||||
<< "..." << std::endl << std::endl;
|
||||
|
||||
Array <File> files;
|
||||
sourceDirectory.findChildFiles (files, File::findFiles, true,
|
||||
(argc > 4) ? argv[4] : "*");
|
||||
|
||||
if (files.size() == 0)
|
||||
{
|
||||
std::cout << "Didn't find any source files in: "
|
||||
<< (const char*) sourceDirectory.getFullPathName() << std::endl << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
headerFile.deleteFile();
|
||||
cppFile.deleteFile();
|
||||
|
||||
ScopedPointer <OutputStream> header (headerFile.createOutputStream());
|
||||
|
||||
if (header == 0)
|
||||
{
|
||||
std::cout << "Couldn't open "
|
||||
<< (const char*) headerFile.getFullPathName() << " for writing" << std::endl << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ScopedPointer <OutputStream> cpp (cppFile.createOutputStream());
|
||||
|
||||
if (cpp == 0)
|
||||
{
|
||||
std::cout << "Couldn't open "
|
||||
<< (const char*) cppFile.getFullPathName() << " for writing" << std::endl << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*header << "/* (Auto-generated binary data file). */\r\n\r\n"
|
||||
"#ifndef BINARY_" << className.toUpperCase() << "_H\r\n"
|
||||
"#define BINARY_" << className.toUpperCase() << "_H\r\n\r\n"
|
||||
"namespace " << className << "\r\n"
|
||||
"{\r\n";
|
||||
|
||||
*cpp << "/* (Auto-generated binary data file). */\r\n\r\n"
|
||||
"#include \"" << className << ".h\"\r\n\r\n";
|
||||
|
||||
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 << " #ifdef " << file.getParentDirectory().getFileName().toUpperCase() << "\r\n";
|
||||
*cpp << "#ifdef " << file.getParentDirectory().getFileName().toUpperCase() << "\r\n";
|
||||
|
||||
totalBytes += addFile (file, className, *header, *cpp);
|
||||
|
||||
*header << " #endif\r\n";
|
||||
*cpp << "#endif\r\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
totalBytes += addFile (file, className, *header, *cpp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*header << "};\r\n\r\n"
|
||||
"#endif\r\n";
|
||||
|
||||
header = 0;
|
||||
cpp = 0;
|
||||
|
||||
std::cout << std::endl << " Total size of binary data: " << totalBytes << " bytes" << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue