#ifdef ECERE_STATIC import static "ecere" import static "ec" #else import "ecere" import "ec" #endif #include static Context globalContext { }; static Module privateModule; static ModuleImport mainModule; static OldList _excludedSymbols { offset = (uint)&((Symbol)0).left }; static OldList defines, imports; static NameSpace globalData { classes.CompareKey = (void *)BinaryTree::CompareString; defines.CompareKey = (void *)BinaryTree::CompareString; functions.CompareKey = (void *)BinaryTree::CompareString; nameSpaces.CompareKey = (void *)BinaryTree::CompareString; }; static OldList _precompDefines; static void OutputImports(char * fileName) { File f = FileOpen(fileName, write); if(f) { if(imports.first) { ModuleImport module; f.Printf("[Imported Modules]\n"); for(module = imports.first; module; module = module.next) { ClassImport _class; FunctionImport function; if(module.name) f.Printf(" %s\n", module.name); else f.Printf(" [This]\n"); if(module.importType == staticImport) f.Printf(" [Static]\n"); else if(module.importType == remoteImport) f.Printf(" [Remote]\n"); if(module.importAccess == privateAccess) f.Printf(" [Private]\n"); else f.Printf(" [Public]\n"); if(module.classes.first) { f.Printf(" [Imported Classes]\n"); for(_class = module.classes.first; _class; _class = _class.next) { f.Printf(" %s\n", _class.name); if(_class.itself) { f.Printf(" [Instantiated]\n"); } if(_class.isRemote) { f.Printf(" [Remote]\n"); } if(_class.methods.first) { MethodImport method; f.Printf(" [Imported Methods]\n"); for(method = _class.methods.first; method; method = method.next) { f.Printf(" %s\n", method.name); if(method.isVirtual) f.Printf(" [Virtual]\n"); } f.Printf(" .\n"); } if(_class.properties.first) { PropertyImport prop; f.Printf(" [Imported Properties]\n"); for(prop = _class.properties.first; prop; prop = prop.next) { f.Printf(" %s\n", prop.name); if(prop.isVirtual) f.Printf(" [Virtual]\n"); if(prop.hasSet) f.Printf(" [Set]\n"); if(prop.hasGet) f.Printf(" [Get]\n"); } f.Printf(" .\n"); } } f.Printf(" .\n"); } if(module.functions.first) { f.Printf(" [Imported Functions]\n"); for(function = module.functions.first; function; function = function.next) { f.Printf(" %s\n", function.name); } f.Printf(" .\n"); } } f.Printf(" .\n"); } } delete f; } class CompilerApp : Application { void Main() { char * cppCommand = null; char * cppOptions = null; int cppOptionsLen = 0; /*char ** argv = null; int argc = 0;*/ int c; bool valid = true; char defaultOutputFile[MAX_LOCATION]; Platform targetPlatform = GetRuntimePlatform(); SetSymbolsDir(""); /*for(c = 0; c] [-cpp ] [-o ] [-symbols ] [-I]* [-isystem ]* [-D]* -c \n"); else { DualPipe cppOutput; // TODO: Improve this char command[MAX_F_STRING*3]; SetGlobalData(&globalData); SetExcludedSymbols(&_excludedSymbols); SetGlobalContext(globalContext); SetCurrentContext(globalContext); SetTopContext(globalContext); SetDefines(&::defines); SetImports(&imports); SetInCompiler(true); SetTargetPlatform(targetPlatform); SetEchoOn(false); privateModule = (Module)__ecere_COM_Initialize(true, 1, null); SetPrivateModule(privateModule); globalContext.types.Add((BTNode)Symbol { string = CopyString("uint"), type = ProcessTypeString("unsigned int", false) }); globalContext.types.Add((BTNode)Symbol { string = CopyString("uint64"), type = ProcessTypeString("unsigned int64", false) }); globalContext.types.Add((BTNode)Symbol { string = CopyString("uint32"), type = ProcessTypeString("unsigned int", false) }); globalContext.types.Add((BTNode)Symbol { string = CopyString("uint16"), type = ProcessTypeString("unsigned short", false) }); globalContext.types.Add((BTNode)Symbol { string = CopyString("byte"), type = ProcessTypeString("unsigned char", false) }); { GlobalData data { fullName = CopyString("__thisModule"), dataTypeString = CopyString("Module"), module = privateModule }; data.key = (uint)data.fullName; globalData.functions.Add((BTNode)data); } sprintf(command, "%s%s -x c -E \"%s\"", cppCommand, cppOptions ? cppOptions : "", GetSourceFile()); if((cppOutput = DualPipeOpen({ output = true }, command))) { char impFile[MAX_LOCATION]; ImportedModule module; char mainModuleName[MAX_FILENAME]; int exitCode; OldList * ast; TempFile fileInput { }; SetFileInput(fileInput); imports.Add((mainModule = ModuleImport { })); SetMainModule(mainModule); GetLastDirectory(GetSourceFile(), mainModuleName); #if 0 // TEMP: UNTIL WE CAN HAVE PER SOURCE FILE PREPROCESSOR DEFINITIONS... if(GetBuildingEcereCom() && !(strcmpi(mainModuleName, "instance.ec") && strcmpi(mainModuleName, "BinaryTree.ec") && strcmpi(mainModuleName, "dataTypes.ec") && strcmpi(mainModuleName, "OldList.ec") && strcmpi(mainModuleName, "String.ec") && strcmpi(mainModuleName, "BTNode.ec") && strcmpi(mainModuleName, "Array.ec") && strcmpi(mainModuleName, "AVLTree.ec") && strcmpi(mainModuleName, "BuiltInContainer.ec") && strcmpi(mainModuleName, "Container.ec") && strcmpi(mainModuleName, "CustomAVLTree.ec") && strcmpi(mainModuleName, "LinkList.ec") && strcmpi(mainModuleName, "List.ec") && strcmpi(mainModuleName, "Map.ec") && strcmpi(mainModuleName, "Mutex.ec"))) SetBuildingEcereComModule(true); if(GetBuildingEcereCom() && !(strcmpi(mainModuleName, "instance.ec") && strcmpi(mainModuleName, "BinaryTree.ec") && /*strcmpi(mainModuleName, "dataTypes.ec") && strcmpi(mainModuleName, "OldList.ec") &&*/ /*strcmpi(mainModuleName, "String.ec") && */strcmpi(mainModuleName, "BTNode.ec") && strcmpi(mainModuleName, "Mutex.ec") && strcmpi(mainModuleName, "Thread.ec"))) //if(GetBuildingEcereCom() && !strcmpi(mainModuleName, "instance.ec")) SetMemoryGuard(false); #endif StripExtension(mainModuleName); module = ImportedModule { name = CopyString(mainModuleName), type = moduleDefinition }; ::defines.AddName(module); resetScanner(); while(!cppOutput.Eof()) { char junk[4096]; int count = cppOutput.Read(junk, 1, 4096); fileInput.Write(junk, 1, count); } exitCode = cppOutput.GetExitCode(); delete cppOutput; fileInput.Seek(0, start); #ifdef _DEBUG // SetYydebug(true); #endif // Predeclare all classes { char symFile[MAX_FILENAME]; char symLocation[MAX_LOCATION]; ImportedModule module, next; GetLastDirectory(GetSourceFile(), symFile); ChangeExtension(symFile, "sym", symFile); strcpy(symLocation, GetSymbolsDir()); PathCat(symLocation, symFile); // LoadSymbols(symLocation, normalImport, true); LoadSymbols(symLocation, preDeclImport, false); for(module = ::defines.first; module; module = next) { next = module.next; if(module.type == moduleDefinition && strcmpi(module.name, mainModuleName)) { delete module.name; ::defines.Delete(module); } } if(!GetEcereImported() && !GetBuildingEcereCom()) eModule_LoadStrict(privateModule, "ecereCOM", publicAccess /*privateAccess*/); } ParseEc(); CheckDataRedefinitions(); SetYydebug(false); SetCurrentNameSpace(null); SetDefaultNameSpace(null); SetDeclMode(privateAccess); delete fileInput; SetFileInput(null); ast = GetAST(); if(/*ast /*&& !parseError*/ /*&& */!exitCode) { ProcessDBTableDefinitions(); // *** PASS 0 - Register all classes, methods, properties and members *** // *** Build the constructors, destructors, properties as *** // *** class functions *** PrePreProcessClassDefinitions(); ComputeModuleClasses(privateModule); PreProcessClassDefinitions(); // For classes defined in this module... ComputeModuleClasses(privateModule); // *** PASS 1 - Turn the class functions into functions *** // *** Write the RegisterModule (Register classes) *** ProcessClassDefinitions(); // *** PASS 1.5 - Replace members by this.member, figure out types, do type checking / conversions ComputeDataTypes(); // *** PASS 1.6 - Replace instantiations ProcessInstantiations(); // *** PASS 2 - Replace Member Access *** ProcessMemberAccess(); // *** PASS 3 - Replace pointers to objects by "Instance *" *** ProcessInstanceDeclarations(); strcpy(impFile, GetSymbolsDir()); { char fileName[MAX_FILENAME]; GetLastDirectory(GetSourceFile(), fileName); PathCat(impFile, fileName); ChangeExtension(impFile, "imp", impFile); } if(imports.first) OutputImports(impFile); // For now use precomp to generate sym file only... if(/*!strcmp(targetExt, "c") && */!this.exitCode) { File output = FileOpen(GetOutputFile(), write); if(output) { //output.Printf("#include \n\n"); // Temporary patch, fix with defines or something... /* if(!strstr(GetSourceFile(), "instance.ec")) { output.Printf("#if defined(__GNUC__) && defined(__WIN32__)\n"); output.Printf("#include \n"); output.Printf("#endif\n"); } */ /*output.Printf("#if defined(__GNUC__) \n"); output.Printf("typedef long long int64;\n"); output.Printf("typedef unsigned long long uint64;\n"); output.Printf("#else\n"); output.Printf("typedef __int64 int64;\n"); output.Printf("typedef unsigned __int64 uint64;\n"); output.Printf("#endif\n");*/ output.Printf("#if defined(__GNUC__)\n"); output.Printf("typedef long long int64;\n"); output.Printf("typedef unsigned long long uint64;\n"); output.Printf("#elif defined(__TINYC__)\n"); output.Printf("#include \n"); output.Printf("#define __builtin_va_list va_list\n"); output.Printf("#define __builtin_va_start va_start\n"); output.Printf("#define __builtin_va_end va_end\n"); output.Printf("#ifdef _WIN32\n"); output.Printf("#define strcasecmp stricmp\n"); output.Printf("#define strncasecmp strnicmp\n"); output.Printf("#define __declspec(x) __attribute__((x))\n"); output.Printf("#endif\n"); output.Printf("typedef long long int64;\n"); output.Printf("typedef unsigned long long uint64;\n"); output.Printf("#else\n"); output.Printf("typedef __int64 int64;\n"); output.Printf("typedef unsigned __int64 uint64;\n"); output.Printf("#endif\n"); /*output.Printf("#if defined(__GNUC__) || defined(__TINYC__)\n"); output.Printf("typedef long long int64;\n"); output.Printf("typedef unsigned long long uint64;\n"); output.Printf("#elif defined(__TINYC__)\n"); output.Printf("#else\n"); output.Printf("typedef __int64 int64;\n"); output.Printf("typedef unsigned __int64 uint64;\n"); output.Printf("#endif\n");*/ output.Printf("#ifdef __BIG_ENDIAN__\n"); output.Printf("#define __ENDIAN_PAD(x) (8 - (x))\n"); output.Printf("#else\n"); output.Printf("#define __ENDIAN_PAD(x) 0\n"); output.Printf("#endif\n"); if(ast) OutputTree(ast, output); delete output; } } /* else if(!strcmp(targetExt, "o")) { // Compile right away File output = FileOpen(GetOutputFile(), Write); output.Printf("#include \n\n"); OutputTree(ast, output); delete output; }*/ } else this.exitCode = exitCode; if(ast) { FreeASTTree(ast); } } FreeContext(globalContext); FreeExcludedSymbols(_excludedSymbols); ::defines.Free(FreeModuleDefine); imports.Free(FreeModuleImport); FreeTypeData(privateModule); FreeIncludeFiles(); FreeGlobalData(globalData); delete privateModule; } delete cppCommand; delete cppOptions; /*for(c = 0; c