/* FIXME: This is really broken. */ nebu_List* readDirectoryContents(const char *dirname, const char *prefix) { WIN32_FIND_DATA search; HANDLE hSearch; nebu_List *l, *p; char *searchStr; int prefixLen = 0; l = malloc(sizeof(nebu_List)); l->next= NULL; p = l; if(prefix != NULL) { prefixLen = strlen(prefix); } searchStr = malloc(strlen(dirname) + prefixLen + 3); memcpy(searchStr, dirname, strlen(dirname) + 1); strcat(searchStr, "\\"); if(prefix != NULL) { strcat(searchStr, prefix); } strcat(searchStr, "*"); hSearch = FindFirstFile(searchStr, &search); if(hSearch == INVALID_HANDLE_VALUE) { free(l); free(searchStr); return NULL; } else if(!isHiddenFile(&search)) { pushFile(&search, &p); } while( FindNextFile(hSearch, &search) ) { if(!isHiddenFile(&search)) { pushFile(&search, &p); } } if(GetLastError() != ERROR_NO_MORE_FILES) { fprintf(stderr, "[directory] Error: something bad happened\n"); } FindClose(hSearch); free(searchStr); return l; }
static bool isHiddenFile (const File& f, const File& root) { return f.getFileName().endsWithIgnoreCase (".scc") || f.getFileName() == ".svn" || f.getFileName().startsWithChar ('.') || (f.getSize() == 0 && ! f.isDirectory()) || (f.getParentDirectory() != root && isHiddenFile (f.getParentDirectory(), root)); }
//============================================================================== int main (int argc, char* argv[]) { 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: " << 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: " << destDirectory.getFullPathName() << std::endl << std::endl; return 0; } String className (argv[3]); className = className.trim(); const File headerFile (destDirectory.getChildFile (className).withFileExtension (".h")); const File cppFile (destDirectory.getChildFile (className).withFileExtension (".cpp")); std::cout << "Creating " << headerFile.getFullPathName() << " and " << cppFile.getFullPathName() << " from files in " << 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: " << 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 " << headerFile.getFullPathName() << " for writing" << std::endl << std::endl; return 0; } ScopedPointer <OutputStream> cpp (cppFile.createOutputStream()); if (cpp == 0) { std::cout << "Couldn't open " << 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; }