9 static define localeDir = "locale";
11 static bool outputPot;
12 static bool disabledPooling;
14 static Platform targetPlatform;
15 static int targetBits;
17 static bool isConsole;
18 static bool isDynamicLibrary;
19 static bool isStaticLibrary;
20 static OldList modules;
21 static File dcomSymbols;
23 static OldList _defines { };
24 static OldList _imports { };
25 static OldList _excludedSymbols { offset = (uint)(uintptr)&((Symbol)0).left };
26 static NameSpace globalData
28 classes.CompareKey = (void *)BinaryTree::CompareString;
29 defines.CompareKey = (void *)BinaryTree::CompareString;
30 functions.CompareKey = (void *)BinaryTree::CompareString;
31 nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
33 static Context theGlobalContext { };
34 static ModuleImport mainModule;
35 static Module privateModule;
37 static char mainModuleName[MAX_LOCATION];
38 static char projectName[MAX_LOCATION];
39 static void LoadImports(const char * fileName)
41 File f = FileOpen(fileName, read);
47 if(!f.GetLine(line, sizeof(line))) break;
48 TrimLSpaces(line, line);
52 if(!strcmp(line, "[Imported Modules]"))
54 ModuleImport module = null;
57 if(!f.GetLine(line, sizeof(line))) break;
58 TrimLSpaces(line, line);
59 if(!strcmp(line, ".")) break;
63 ClassImport _class = null;
64 FunctionImport function = null;
66 if(!strcmp(line, "[This]"))
68 if((mainModule = GetMainModule()))
72 mainModule = ModuleImport { };
73 SetMainModule(mainModule);
75 _imports.AddName(module);
78 else if(!strcmp(line, "[Static]"))
80 module.importType = staticImport;
82 else if(!strcmp(line, "[Remote]"))
84 module.importType = remoteImport;
86 else if(!strcmp(line, "[Private]"))
88 if(module.importAccess != publicAccess)
89 module.importAccess = privateAccess;
91 else if(!strcmp(line, "[Public]"))
93 module.importAccess = publicAccess;
95 else if(!strcmp(line, "[Imported Classes]"))
99 if(!f.GetLine(line, sizeof(line))) break;
100 TrimLSpaces(line, line);
101 if(!strcmp(line, ".")) break;
105 if(!strcmp(line, "[Instantiated]"))
107 _class.itself = true;
109 else if(!strcmp(line, "[Remote]"))
113 else if(!strcmp(line, "[Imported Methods]"))
115 MethodImport method = null;
118 if(!f.GetLine(line, sizeof(line))) break;
119 TrimLSpaces(line, line);
120 if(!strcmp(line, ".")) break;
123 if(!(method = _class.methods.FindName(line, false)))
125 method = MethodImport { name = CopyString(line) };
126 _class.methods.AddName(method);
129 else if(!strcmp(line, "[Virtual]"))
130 method.isVirtual = true;
134 else if(!strcmp(line, "[Imported Properties]"))
136 PropertyImport prop = null;
139 if(!f.GetLine(line, sizeof(line))) break;
140 TrimLSpaces(line, line);
141 if(!strcmp(line, ".")) break;
144 if(!(prop = _class.properties.FindName(line, false)))
146 prop = PropertyImport { name = CopyString(line) };
147 _class.properties.AddName(prop);
150 else if(!strcmp(line, "[Set]"))
152 else if(!strcmp(line, "[Get]"))
154 else if(!strcmp(line, "[Virtual]"))
155 prop.isVirtual = true;
161 if(!(_class = module.classes.FindName(line, false)))
163 _class = ClassImport { name = CopyString(line) };
164 module.classes.AddName(_class);
169 else if(!strcmp(line, "[Imported Functions]"))
173 if(!f.GetLine(line, sizeof(line))) break;
174 TrimLSpaces(line, line);
175 if(!strcmp(line, ".")) break;
182 if(!(function = module.functions.FindName(line, false)))
184 function = FunctionImport { name = CopyString(line) };
185 module.functions.AddName(function);
193 if(!(module = _imports.FindName(line, false)))
195 if(!strcmp(line, "ecereCOM"))
197 module = _imports.FindName("ecere", false);
199 else if(!strcmp(line, "ecere"))
201 module = _imports.FindName("ecereCOM", false);
205 module.name = CopyString("ecere");
210 module = ModuleImport { name = CopyString(line) };
211 _imports.AddName(module);
223 // static Class applicationClass;
224 static Class thisAppClass;
226 class ModuleInfo : struct
228 ModuleInfo prev, next;
234 static bool SeardchModuleName(Module searchIn, char * name)
238 if(searchIn.name && !strcmp(searchIn.name, name))
241 for(subModule = searchIn.modules.first; subModule; subModule = subModule.next)
243 if(SearchModuleName(subModule.module, name))
249 static void WriteMain(const char * fileName)
251 File f = FileOpen(fileName, write);
255 ModuleInfo defModule;
256 bool /*nonInst = false, */anyMethod = false, anyProp = false, anyFunction = false;
257 ImportedModule importedModule;
259 GetLastDirectory(fileName, mainModuleName);
260 StripExtension(mainModuleName);
263 strcpy(projectName, mainModuleName);
264 StripExtension(projectName);
266 FixModuleName(mainModuleName);
268 if(targetPlatform == win32 && !isConsole && !isStaticLibrary && !isDynamicLibrary)
270 //f.Puts("#include <windows.h>\n\n");
272 f.Puts("typedef void * HINSTANCE;\n");
273 f.Puts("#define WINAPI __stdcall\n");
276 for(importedModule = ::_defines.first; importedModule; importedModule = importedModule.next)
278 if(importedModule.type == moduleDefinition)
281 if(importedModule.importType == staticImport)
282 f.Printf("static ", importedModule.name);
283 f.Printf("\"%s\"\n", importedModule.name);
287 f.Puts("default:\n");
288 f.Puts("static Module __currentModule;\n\n");
291 f.Puts("Module __thisModule;\n\n");
293 // TOCHECK: Problem compiling Scrabble.main.ec when binding Client first
298 f.Printf("void __ecereRegisterModule_%s(Module module);\n\n", mainModuleName);
300 for(module = _imports.first; module; module = module.next)
303 FunctionImport function;
304 if(module.importType == staticImport)
306 /*if(targetPlatform == win32)
308 f.Printf("bool __stdcall __ecereDll_Load_%s(Module module);\n", module.name);
309 f.Printf("bool __stdcall __ecereDll_Unload_%s(Module module);\n", module.name);
313 f.Printf("bool __ecereDll_Load_%s(Module module);\n", module.name);
314 f.Printf("bool __ecereDll_Unload_%s(Module module);\n", module.name);
317 for(_class = module.classes.first; _class; _class = _class.next)
321 char className[1024] = "";
322 Class regClass = eSystem_FindClass(privateModule, _class.name);
324 FullClassNameCat(className, _class.name, true);
325 //MangleClassName(className);
328 f.Printf("Class __ecereClass_%s;\n", className);
331 //if(!_class.isRemote)
333 //if(strcmp(_class.name, "SerialBuffer"))
335 for(method = _class.methods.first; method; method = method.next)
337 Method meth = eClass_FindMethod(regClass, method.name, privateModule);
338 if(meth && !meth.dataType)
340 Context context = SetupTemplatesContext(regClass);
341 meth.dataType = ProcessTypeString(meth.dataTypeString, false);
342 FinishTemplatesContext(context);
346 f.Printf("int __ecereVMethodID_%s_%s;\n", className, method.name);
347 else if((!strcmp(_class.name, "float") || !strcmp(_class.name, "double") || module.name) && module.importType != staticImport && (!meth || !meth.dataType.dllExport))
357 sprintf(name, "__ecereMethod_%s_%s", className, method.name);
358 PrintType(type, name, true);
359 f.Printf("%s;\n", name);
362 //f.Printf("void * __ecereMethod_%s_%s;\n", className, method.name);
364 f.Printf("int (*__ecereMethod_%s_%s)();\n", className, method.name);
371 for(prop = _class.properties.first; prop; prop = prop.next)
375 FullClassNameCat(propName, prop.name, true);
376 // strcpy(propName, prop.name);
377 //MangleClassName(propName);
379 if((!strcmp(_class.name, "float") || !strcmp(_class.name, "double") || module.name) && module.importType != staticImport)
382 f.Printf("void * __ecereProp_%s_Set_%s;\n", className, propName);
384 f.Printf("void * __ecereProp_%s_Get_%s;\n", className, propName);
386 f.Printf("Property __ecereProp_%s_%s;\n", className, propName);
391 for(function = module.functions.first; function; function = function.next)
393 GlobalFunction func = eSystem_FindFunction(privateModule, function.name);
394 if(func && !func.dataType)
395 func.dataType = ProcessTypeString(func.dataTypeString, false);
397 if(module.name && module.importType != staticImport && (!func || !func.dataType || !func.dataType.dllExport))
399 char functionName[1024];
401 FullClassNameCat(functionName, function.name, false);
402 f.Printf("void * __ecereFunction_%s;\n", functionName);
408 for(defModule = ::modules.first; defModule; defModule = defModule.next)
410 char moduleName[1024];
411 strcpy(moduleName, defModule.name);
412 FixModuleName(moduleName);
413 f.Printf("void __ecereRegisterModule_%s(Module module);\n", moduleName);
414 f.Printf("void __ecereUnregisterModule_%s(Module module);\n", moduleName);
415 if(defModule.globalInstance)
417 f.Printf("void __ecereCreateModuleInstances_%s();\n", moduleName);
418 f.Printf("void __ecereDestroyModuleInstances_%s();\n", moduleName);
427 // Insert DCOM bindings here
428 dcomSymbols.Seek(0, start);
429 while(!dcomSymbols.Eof())
432 int read = dcomSymbols.Read(buffer, 1, sizeof(buffer));
434 f.Write(buffer, 1, read);
443 /*if(targetPlatform == win32)
444 f.Printf("\nbool __stdcall __ecereDll_Load_%s(Module module)\n{\n", projectName);
446 f.Printf("\nbool __ecereDll_Load_%s(Module module)\n{\n", projectName);
448 else if(isDynamicLibrary)
450 if(targetPlatform == win32)
451 f.Puts("\ndllexport bool __stdcall __ecereDll_Load(Module module)\n{\n");
453 f.Puts("\ndllexport bool __ecereDll_Load(Module module)\n{\n");
455 else if(targetPlatform == win32 && !isConsole)
457 f.Puts("\nint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, char * cmdLine, int show)\n{\n");
460 f.Puts("\nint main(int _argc, char * _argv[])\n{\n");
462 if(!isDynamicLibrary)
464 f.Puts(" int exitCode;\n");
465 f.Puts(" Module module;\n");
468 //if(nonInst || thisAppClass) // We use it all the time to get "Application" for the exit code now...
469 f.Puts(" __attribute__((unused)) Class _class;\n");
472 f.Puts(" Method method;\n");
474 f.Puts(" Property _property;\n");
476 f.Puts(" GlobalFunction function;\n");
482 f.Puts(" eSystem_SetPoolingDisabled(true);\n");
488 f.Puts(" if(!__currentModule)\n");
490 f.Puts(" __currentModule = module;\n");
492 f.Puts(" __thisModule = module;\n");
495 else if(targetPlatform == win32 && !isConsole)
496 f.Puts(" __thisModule = __currentModule = module = __ecere_COM_Initialize(1, 0, null);\n\n");
498 f.Puts(" __thisModule = __currentModule = module = __ecere_COM_Initialize(1, _argc, (void *)_argv);\n\n");
500 // First load all modules
503 for(module = _imports.first; module; module = module.next)
507 //if(strcmp(module.name, "ecereCOM") && strcmp(module.name, "ecere") )
509 if(module.importType == staticImport)
510 f.Printf(" eModule_LoadStatic(module, \"%s\", %s, __ecereDll_Load_%s, __ecereDll_Unload_%s);\n", module.name, (module.importAccess == privateAccess) ? "privateAccess" : "publicAccess", module.name,module.name);
512 f.Printf(" eModule_Load(module, \"%s\", %s);\n", module.name, (module.importAccess == privateAccess) ? "privateAccess" : "publicAccess");
519 // Then define the classes
522 for(defModule = ::modules.first; defModule; defModule = defModule.next)
524 char moduleName[1024];
525 strcpy(moduleName, defModule.name);
526 FixModuleName(moduleName);
527 f.Printf(" __ecereRegisterModule_%s(module);\n", moduleName);
532 // Register Remote Modules
535 f.Printf(" __ecereRegisterModule_%s(module);\n\n", mainModuleName);
541 f.Puts(" if(__currentModule == module)\n");
544 // Then load the imports
545 for(module = _imports.first; module; module = module.next)
548 FunctionImport function;
549 if(module.classes.count)
551 for(_class = module.classes.first; _class; _class = _class.next)
553 Class regClass = eSystem_FindClass(privateModule, _class.name);
555 //if(!_class.isRemote)
560 char className[1024] = "";
561 FullClassNameCat(className, _class.name, true);
562 //MangleClassName(className);
565 sprintf(classID, "__ecereClass_%s", className);
567 strcpy(classID, "_class");
569 if(isDynamicLibrary && !isStaticLibrary)
570 f.Printf(" %s = eSystem_FindClass(__currentModule, \"%s\");\n", classID, _class.name);
572 f.Printf(" %s = eSystem_FindClass(module, \"%s\");\n", classID, _class.name);
574 for(method = _class.methods.first; method; method = method.next)
576 Method meth = eClass_FindMethod(regClass, method.name, privateModule);
577 if(!meth || !meth.dataType.dllExport)
579 if(method.isVirtual || ((!strcmp(_class.name, "float") || !strcmp(_class.name, "double") || module.name) && module.importType != staticImport))
581 f.Printf(" method = eClass_FindMethod(%s, \"%s\", module);\n",
582 classID, method.name);
584 f.Printf(" if(method) __ecereVMethodID_%s_%s = method.vid;\n", className, method.name);
586 f.Printf(" if(method) __ecereMethod_%s_%s = method.function;\n", className, method.name);
591 for(prop = _class.properties.first; prop; prop = prop.next)
595 FullClassNameCat(propName, prop.name, true);
596 // strcpy(propName, prop.name);
597 //MangleClassName(propName);
599 f.Printf(" __ecereProp_%s_%s = _property = eClass_FindProperty(%s, \"%s\", module);\n",
600 className, propName, classID, prop.name);
602 if((!strcmp(_class.name, "float") || !strcmp(_class.name, "double") || module.name) && module.importType != staticImport)
605 f.Printf(" __ecereProp_%s_Set_%s = _property.Set;\n", className, propName);
607 f.Printf(" __ecereProp_%s_Get_%s = _property.Get;\n", className, propName);
614 if(module.functions.count)
616 for(function = module.functions.first; function; function = function.next)
618 GlobalFunction func = eSystem_FindFunction(privateModule, function.name);
619 if(module.name && module.importType != staticImport && (!func || !func.dataType || !func.dataType.dllExport))
621 char functionName[1024];
623 FullClassNameCat(functionName, function.name, false);
625 if(isDynamicLibrary && !isStaticLibrary)
626 f.Printf(" function = eSystem_FindFunction(__currentModule, \"%s\");\n", function.name);
628 f.Printf(" function = eSystem_FindFunction(module, \"%s\");\n", function.name);
630 f.Printf(" if(function) __ecereFunction_%s = function.function;\n", functionName);
638 for(defModule = ::modules.first; defModule; defModule = defModule.next)
639 if(defModule.globalInstance)
641 if(!strcmp(defModule.name, "i18n"))
642 f.Printf(" __ecereCreateModuleInstances_i18n();\n");
647 f.Printf(" LoadTranslatedStrings(\"%s\", \"%s\");\n", projectName, projectName);
649 f.Printf(" LoadTranslatedStrings(null, \"%s\");\n", projectName);
653 //f.Printf(" module._vTbl[10](module);\n");
657 if(!isDynamicLibrary && thisAppClass)
659 f.Printf(" _class = eSystem_FindClass(__currentModule, \"%s\");\n", thisAppClass.name);
660 f.Printf(" eInstance_Evolve((Instance *)&__currentModule, _class);\n");
661 f.Printf(" __thisModule = __currentModule;\n");
666 f.Puts(" if(__currentModule == module)\n");
670 // Then check if there's any global instances to create
673 for(defModule = ::modules.first; defModule; defModule = defModule.next)
674 if(defModule.globalInstance)
676 char moduleName[1024];
677 if(!strcmp(defModule.name, "i18n")) continue;
678 strcpy(moduleName, defModule.name);
679 FixModuleName(moduleName);
680 f.Printf(" __ecereCreateModuleInstances_%s();\n", moduleName);
690 if(!isDynamicLibrary && thisAppClass)
692 f.Printf(" ((void(*)(void *))(void *)__currentModule._vTbl[12])(__currentModule);\n");
697 f.Puts(" return true;\n");
701 /*if(targetPlatform == win32)
702 f.Printf("\nbool __stdcall __ecereDll_Unload_%s(Module module)\n{\n", projectName);
704 f.Printf("\nbool __ecereDll_Unload_%s(Module module)\n{\n", projectName);
708 if(targetPlatform == win32)
709 f.Puts("\ndllexport bool __stdcall __ecereDll_Unload(Module module)\n{\n");
711 f.Puts("\ndllexport bool __ecereDll_Unload(Module module)\n{\n");
717 f.Puts(" if(__currentModule == module)\n");
720 // Then check if there's any global instances to destroy
722 bool destroyI18n = false;
725 for(defModule = ::modules.first; defModule; defModule = defModule.next)
726 if(defModule.globalInstance)
728 char moduleName[1024];
729 if(!strcmp(defModule.name, "i18n")) { destroyI18n = true; continue; }
730 strcpy(moduleName, defModule.name);
731 FixModuleName(moduleName);
732 f.Printf(" __ecereDestroyModuleInstances_%s();\n", moduleName);
738 //f.Printf(" UnloadTranslatedStrings(__currentModule);\n");
739 f.Printf(" UnloadTranslatedStrings(\"%s\");\n", projectName);
741 f.Printf(" __ecereDestroyModuleInstances_i18n();\n");
749 //f.Printf(" module._vTbl[11](module);\n");
754 for(defModule = ::modules.first; defModule; defModule = defModule.next)
756 char moduleName[1024];
757 strcpy(moduleName, defModule.name);
758 FixModuleName(moduleName);
759 f.Printf(" __ecereUnregisterModule_%s(module);\n", moduleName);
763 f.Puts(" if(__currentModule == module)\n");
764 f.Puts(" __currentModule = (void *)0;\n");
767 f.Puts(" if(__thisModule == module)\n");
768 f.Puts(" __thisModule = (void *)0;\n");
772 if(!isDynamicLibrary)
776 " _class = eSystem_FindClass(__currentModule, \"ecere::com::Application\");\n"
777 " exitCode = ((ecere::com::Application)__currentModule).exitCode;\n"
778 " delete __currentModule;\n"
779 " return exitCode;\n");
782 f.Puts(" return true;\n");
788 static Class FindAppClass(NameSpace * nameSpace, bool thisModule)
792 for(link = (BTNamedLink)nameSpace->classes.first; link; link = (BTNamedLink)((BTNode)link).next)
794 Class _class = link.data;
796 applicationClass = eSystem_FindClass(_class.module, "Application");
797 if(_class != applicationClass && eClass_IsDerived(_class, applicationClass) && (!thisModule || _class.module == privateModule))
800 if(strcmp(_class.fullName, "ecere::com::Application") && (!thisModule || _class.module == privateModule))
803 for(base = _class.base; base && base.type != systemClass; base = base.base)
804 if(!strcmp(base.fullName, "ecere::com::Application"))
809 for(ns = (NameSpace *)nameSpace->nameSpaces.first; ns; ns = (NameSpace *)((BTNode)ns).next)
811 Class _class = FindAppClass(ns, thisModule);
812 if(_class) // && _class != applicationClass)
815 return null; //applicationClass;
818 static Class SearchAppClass_Module(Module module)
823 appClass = FindAppClass(module.publicNameSpace, false);
824 if(appClass) return appClass;
825 appClass = FindAppClass(module.privateNameSpace, false);
826 if(appClass) return appClass;
828 for(subModule = module.modules.first; subModule; subModule = subModule.next)
830 appClass = SearchAppClass_Module(subModule.module);
831 if(appClass) return appClass;
836 static void BindDCOMClient()
838 Class dcomClientObjectClass = eSystem_FindClass(privateModule, "ecere::net::DCOMClientObject");
841 if(dcomClientObjectClass && dcomClientObjectClass.derivatives.first)
844 if(!dcomSymbols) dcomSymbols = TempFile { };
848 for(deriv = dcomClientObjectClass.derivatives.first; deriv; deriv = deriv.next)
850 Class _class = deriv.data;
856 DeclareClass(FindClass("ecere::net::DCOMClientObject"), "__ecereClass___ecereNameSpace__ecere__net__DCOMClientObject");
857 f.Printf("class %s : ecere::net::DCOMClientObject\n", _class.fullName);
860 // CLIENT VIRTUAL METHODS BINDINGS
861 if(_class.vTblSize > _class.base.vTblSize)
864 f.Printf(" virtual void CallVirtualMethod(uint __ecereMethodID, SerialBuffer __ecereBuffer)\n");
866 f.Printf(" switch(__ecereMethodID)\n");
869 for(vid = _class.base.vTblSize; vid < _class.vTblSize; vid++)
872 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
874 if(method.type == virtualMethod && method._class == _class && method.vid == vid)
880 method.dataType = ProcessTypeString(method.dataTypeString, false);
881 if(method.dataType && method.dataType.name)
883 f.Printf(" case %d:\n", vid - _class.base.vTblSize);
886 if(method.dataType.returnType.kind != voidType)
889 OldList * specs = MkList();
891 char type[1024] = "";
892 char className[1024];
895 if(method.dataType.returnType.kind == classType)
896 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
899 PrintTypeNoConst(method.dataType.returnType, type, false, true);
900 classSym = FindClass(type);
903 strcpy(className, "__ecereClass_");
904 FullClassNameCat(className, classSym.string, true);
905 //MangleClassName(className);
906 DeclareClass(classSym, className);
908 PrintType(method.dataType.returnType, type, true, true);
910 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
911 resultType = MkTypeName(specs, decl);
914 OutputTypeName(resultType, f, false);
918 for(param = method.dataType.params.first; param; param = param.next)
920 if(param.kind == classType && !strcmp(param._class.string, "String"))
922 // Hardcode 1024 chars max string for now
923 f.Printf(" char %s[1024];\n", param.name);
924 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
925 DeclareClass(FindClass("String"), "__ecereClass_String");
929 TypeName paramTypeName;
930 OldList * specs = MkList();
932 char type[1024] = "";
933 char className[1024];
936 if(param.kind == classType)
937 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
940 PrintTypeNoConst(param, type, false, true);
941 classSym = FindClass(type);
945 strcpy(className, "__ecereClass_");
946 FullClassNameCat(className, classSym.string, true);
947 //MangleClassName(className);
948 DeclareClass(classSym, className);
950 PrintType(param, type, true, true);
952 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier(param.name /*"__ecereResult"*/)));
953 paramTypeName = MkTypeName(specs, decl);
956 OutputTypeName(paramTypeName, f, false);
963 for(param = method.dataType.params.first; param; param = param.next)
965 f.Printf(" __ecereBuffer.Unserialize(");
966 if(param.kind == classType && !strcmp(param._class.string, "String"))
968 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
969 f.Printf("(StaticString)");
976 if(method.dataType.returnType.kind != voidType)
977 f.Printf("__ecereResult = ");
979 // f.Printf("this.instance.%s(", method.name);
980 f.Printf("%s(", method.name);
982 for(param = method.dataType.params.first; param; param = param.next)
986 f.Printf("%s", param.name);
991 for(param = method.dataType.params.first; param; param = param.next)
993 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
995 if(!strcmp(param._class.string, "String"))
997 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
998 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1001 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1004 if(method.dataType.returnType.kind != voidType)
1006 f.Printf(" __ecereBuffer.Serialize(__ecereResult);\n");
1009 for(param = method.dataType.params.first; param; param = param.next)
1011 if(param.kind == classType && strcmp(param._class.string, "String") && param._class.registered &&
1012 (param._class.registered.type == normalClass || param._class.registered.type == noHeadClass))
1014 f.Printf(" delete %s;\n", param.name);
1017 if(method.dataType.returnType.kind == classType && strcmp(method.dataType.returnType._class.string, "String") && method.dataType.returnType._class.registered &&
1018 (method.dataType.returnType._class.registered.type == normalClass || method.dataType.returnType._class.registered.type == noHeadClass))
1020 f.Printf(" delete __ecereResult;\n");
1024 f.Printf(" break;\n");
1036 vid = _class.base.vTblSize;
1038 next = (Method)_class.methods.first;
1039 while(next && ((next.type == virtualMethod) != doVirtual || (doVirtual && next.vid != vid)))
1042 next = (Method)((BTNode)next).next;
1043 if(!next && doVirtual)
1045 if(vid == _class.vTblSize)
1050 next = (Method)_class.methods.first;
1053 for(method = next; method; method = next)
1057 if(!method.dataType)
1058 method.dataType = ProcessTypeString(method.dataTypeString, false);
1060 if(method.dataType.name)
1066 strcpy(name, "__ecereVMethodID_");
1067 FullClassNameCat(name, method._class.fullName, true);
1069 strcat(name, method.name);
1070 DeclareMethod(method, name);
1072 f.Printf("virtual ");
1074 f.Printf("%s\n", method.dataTypeString);
1079 if(method.dataType.returnType.kind != voidType)
1081 TypeName resultType;
1082 OldList * specs = MkList();
1084 char type[1024] = "";
1085 char className[1024];
1088 if(method.dataType.returnType.kind == classType)
1089 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1092 PrintTypeNoConst(method.dataType.returnType, type, false, true);
1093 classSym = FindClass(type);
1097 strcpy(className, "__ecereClass_");
1098 FullClassNameCat(className, classSym.string, true);
1099 //MangleClassName(className);
1100 DeclareClass(classSym, className);
1102 PrintType(method.dataType.returnType, type, true, true);
1104 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1105 resultType = MkTypeName(specs, decl);
1108 OutputTypeName(resultType, f, false);
1109 if(method.dataType.returnType.kind == structType)
1110 f.Printf(" = { 0 }");
1111 else if(method.dataType.returnType.kind == classType && method.dataType.returnType._class.registered && method.dataType.returnType._class.registered.type == structClass)
1117 f.Printf(" incref this;\n");
1118 for(param = method.dataType.params.first; param; param = param.next)
1120 char type[1024] = "";
1121 char className[1024];
1124 if(param.kind == classType)
1125 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1128 PrintTypeNoConst(param, type, false, true);
1129 classSym = FindClass(type);
1132 strcpy(className, "__ecereClass_");
1133 FullClassNameCat(className, classSym.string, true);
1135 //MangleClassName(className);
1136 DeclareClass(classSym, className);
1138 if(param.kind == classType && !strcmp(param._class.string, "String"))
1140 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1141 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1144 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1148 eSystem_FindClass(privateModule, "ecere::net::DCOMClientObject"), "CallMethod", privateModule),
1149 "__ecereMethod___ecereNameSpace__ecere__net__DCOMClientObject_CallMethod");
1151 f.Printf(" if(DCOMClientObject::CallMethod(%d))\n", id++);
1153 for(param = method.dataType.params.first; param; param = param.next)
1155 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1157 if(!strcmp(param._class.string, "String"))
1159 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1160 f.Printf(" __ecereBuffer.Unserialize((StaticString)%s);\n", param.name);
1163 f.Printf(" __ecereBuffer.Unserialize(%s);\n", param.name);
1166 if(method.dataType.returnType.kind != voidType)
1168 if(method.dataType.returnType.kind == classType && !strcmp(method.dataType.returnType._class.string, "String"))
1170 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1171 f.Printf(" __ecereBuffer.Unserialize((StaticString)__ecereResult);\n");
1174 f.Printf(" __ecereBuffer.Unserialize(__ecereResult);\n");
1177 f.Printf(" __ecereBuffer.Free();\n");
1178 f.Printf(" delete this;\n");
1179 if(method.dataType.returnType.kind != voidType)
1181 f.Printf(" return __ecereResult;\n");
1187 next = (Method)((BTNode)method).next;
1188 while(next && ((next.type == virtualMethod) != doVirtual || (doVirtual && next.vid != vid)))
1191 next = (Method)((BTNode)next).next;
1192 if(!next && doVirtual)
1194 if(vid == _class.vTblSize)
1199 next = (Method)_class.methods.first;
1214 static void BindDCOMServer()
1216 bool mutexDeclared = false;
1218 for(_class = privateModule.classes.first; _class; _class = _class.next)
1220 if(_class.isRemote == 3) //)
1227 if(!dcomSymbols) dcomSymbols = TempFile { };
1230 DeclareClass(FindClass("ecere::net::DCOMServerObject"), "__ecereClass___ecereNameSpace__ecere__net__DCOMServerObject");
1233 for(_class = privateModule.classes.first; _class; _class = _class.next)
1235 if(_class.isRemote == 3) //2 && !strncmp(_class.fullName, "DCOMServer_", strlen("DCOMServer_")))
1241 f.Printf("class DCOM%s : ecere::net::DCOMServerObject\n", _class.fullName);
1242 // f.Printf("class DCOM%s\n", _class.fullName);
1245 f.Printf(" %s instance;\n", _class.fullName);
1246 f.Printf(" unsigned int id;\n");
1247 f.Printf(" SerialBuffer buffer { };\n");
1251 f.Printf(" DCOM%s()\n", _class.fullName);
1253 f.Printf(" instance = eInstance_New(class(%s));\n", _class.fullName);
1257 f.Printf(" virtual void CallMethod(uint __ecereMethodID, SerialBuffer __ecereBuffer)\n");
1259 f.Printf(" %s inst = (%s)instance;\n", _class.fullName, _class.fullName);
1260 f.Printf(" incref inst;\n");
1261 f.Printf(" switch(__ecereMethodID)\n");
1264 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1267 method.dataType = ProcessTypeString(method.dataTypeString, false);
1268 if(method.dataType && method.dataType.name)
1270 f.Printf(" case %d:\n", id++);
1274 if(method.dataType.returnType.kind != voidType)
1276 TypeName resultType;
1277 OldList * specs = MkList();
1279 char type[1024] = "";
1280 char className[1024];
1283 if(method.dataType.returnType.kind == classType)
1284 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1287 PrintTypeNoConst(method.dataType.returnType, type, false, true);
1288 classSym = FindClass(type);
1291 strcpy(className, "__ecereClass_");
1292 FullClassNameCat(className, classSym.string, true);
1293 //MangleClassName(className);
1294 DeclareClass(classSym, className);
1296 PrintType(method.dataType.returnType, type, true, true);
1298 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1299 resultType = MkTypeName(specs, decl);
1302 OutputTypeName(resultType, f, false);
1306 for(param = method.dataType.params.first; param; param = param.next)
1308 if(param.kind == classType && !strcmp(param._class.string, "String"))
1310 // Hardcode 1024 chars max string for now
1311 f.Printf(" char %s[1024];\n", param.name);
1312 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1313 DeclareClass(FindClass("String"), "__ecereClass_String");
1317 TypeName paramTypeName;
1318 OldList * specs = MkList();
1320 char type[1024] = "";
1321 char className[1024];
1324 if(param.kind == classType)
1325 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1328 PrintTypeNoConst(param, type, false, true);
1329 classSym = FindClass(type);
1333 strcpy(className, "__ecereClass_");
1334 FullClassNameCat(className, classSym.string, true);
1335 //MangleClassName(className);
1336 DeclareClass(classSym, className);
1338 PrintType(param, type, true, true);
1340 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier(param.name /*"__ecereResult"*/)));
1341 paramTypeName = MkTypeName(specs, decl);
1344 OutputTypeName(paramTypeName, f, false);
1351 for(param = method.dataType.params.first; param; param = param.next)
1353 f.Printf(" __ecereBuffer.Unserialize(");
1354 if(param.kind == classType && !strcmp(param._class.string, "String"))
1356 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1357 f.Printf("(StaticString)");
1364 if(method.dataType.returnType.kind != voidType)
1365 f.Printf("__ecereResult = ");
1367 // f.Printf("this.instance.%s(", method.name);
1368 f.Printf("((%s)instance).%s(", _class.fullName, method.name);
1370 for(param = method.dataType.params.first; param; param = param.next)
1374 f.Printf("%s", param.name);
1379 for(param = method.dataType.params.first; param; param = param.next)
1381 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1383 if(!strcmp(param._class.string, "String"))
1385 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1386 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1389 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1392 if(method.dataType.returnType.kind != voidType)
1394 f.Printf(" __ecereBuffer.Serialize(__ecereResult);\n");
1397 for(param = method.dataType.params.first; param; param = param.next)
1399 if(param.kind == classType && strcmp(param._class.string, "String") && param._class.registered &&
1400 (param._class.registered.type == normalClass || param._class.registered.type == noHeadClass))
1402 f.Printf(" delete %s;\n", param.name);
1405 if(method.dataType.returnType.kind == classType && strcmp(method.dataType.returnType._class.string, "String") && method.dataType.returnType._class.registered &&
1406 (method.dataType.returnType._class.registered.type == normalClass || method.dataType.returnType._class.registered.type == noHeadClass))
1408 f.Printf(" delete __ecereResult;\n");
1412 f.Printf(" break;\n");
1417 f.Printf(" delete inst;\n");
1420 // *** VIRTUAL FUNCTIONS BINDINGS ***
1421 for(vid = _class.base.vTblSize; vid < _class.vTblSize; vid++)
1426 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1427 if(method.type == virtualMethod && method._class == _class && method.vid == vid)
1433 DeclareClass(FindClass("ecere::sys::Mutex"), "__ecereClass___ecereNameSpace__ecere__sys__Mutex");
1436 eSystem_FindClass(privateModule, "ecere::sys::Mutex"), "Wait", privateModule),
1437 "__ecereMethod___ecereNameSpace__ecere__sys__Mutex_Wait");
1440 eSystem_FindClass(privateModule, "ecere::sys::Mutex"), "Release", privateModule),
1441 "__ecereMethod___ecereNameSpace__ecere__sys__Mutex_Release");
1442 mutexDeclared = true;
1446 if(!method.dataType)
1447 method.dataType = ProcessTypeString(method.dataTypeString, false);
1449 if(method.dataType.name)
1451 f.Printf(" virtual %s\n", method.dataTypeString);
1456 f.Printf(" DCOM%s __ecereObject = (void *)_vTbl[-1];\n", _class.fullName);
1457 if(method.dataType.returnType.kind != voidType)
1459 TypeName resultType;
1460 OldList * specs = MkList();
1462 char type[1024] = "";
1463 char className[1024];
1466 if(method.dataType.returnType.kind == classType)
1467 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1470 PrintTypeNoConst(method.dataType.returnType, type, false, true);
1471 classSym = FindClass(type);
1475 strcpy(className, "__ecereClass_");
1476 FullClassNameCat(className, classSym.string, true);
1477 //MangleClassName(className);
1478 DeclareClass(classSym, className);
1480 PrintType(method.dataType.returnType, type, true, true);
1482 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1483 resultType = MkTypeName(specs, decl);
1486 OutputTypeName(resultType, f, false);
1487 if(method.dataType.returnType.kind == structType)
1488 f.Printf(" = { 0 }");
1489 else if(method.dataType.returnType.kind == classType && method.dataType.returnType._class.registered && method.dataType.returnType._class.registered.type == structClass)
1496 f.Printf(" incref __ecereObject;\n");
1497 f.Printf(" __ecereMethod___ecereNameSpace__ecere__sys__Mutex_Wait(__ecereObject.mutex);\n");
1499 //f.Printf(" incref this;\n");
1500 for(param = method.dataType.params.first; param; param = param.next)
1502 char type[1024] = "";
1503 char className[1024];
1506 if(param.kind == classType)
1507 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1510 PrintTypeNoConst(param, type, false, true);
1511 classSym = FindClass(type);
1514 strcpy(className, "__ecereClass_");
1515 FullClassNameCat(className, classSym.string, true);
1516 //MangleClassName(className);
1517 DeclareClass(classSym, className);
1519 if(param.kind == classType && !strcmp(param._class.string, "String"))
1521 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1522 f.Printf(" __ecereObject.argsBuffer.Serialize((StaticString)%s);\n", param.name);
1525 f.Printf(" __ecereObject.argsBuffer.Serialize(%s);\n", param.name);
1530 eSystem_FindClass(privateModule, "ecere::net::DCOMServerObject"), "CallVirtualMethod", privateModule),
1531 "__ecereMethod___ecereNameSpace__ecere__net__DCOMServerObject_CallVirtualMethod");
1533 // Check if this method needs to return anything (hasReturnValue)
1535 bool hasReturnValue = method.dataType.returnType.kind != voidType;
1538 for(param = method.dataType.params.first; param; param = param.next)
1540 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1542 hasReturnValue = true;
1547 f.Printf(" if(__ecereObject.CallVirtualMethod(%d, %s))\n", vid - _class.base.vTblSize,
1548 hasReturnValue ? "true" : "false");
1551 for(param = method.dataType.params.first; param; param = param.next)
1553 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1555 if(!strcmp(param._class.string, "String"))
1557 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1558 f.Printf(" __ecereObject.returnBuffer.Unserialize((StaticString)%s);\n", param.name);
1561 f.Printf(" __ecereObject.returnBuffer.Unserialize(%s);\n", param.name);
1564 if(method.dataType.returnType.kind != voidType)
1566 if(method.dataType.returnType.kind == classType && !strcmp(method.dataType.returnType._class.string, "String"))
1568 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1569 f.Printf(" __ecereObject.returnBuffer.Unserialize((StaticString)__ecereResult);\n");
1572 f.Printf(" __ecereObject.returnBuffer.Unserialize(__ecereResult);\n");
1575 f.Printf(" else\n");
1576 f.Printf(" ((%s)this).%s::%s(", _class.fullName, _class.fullName, method.name);
1577 for(param = method.dataType.params.first; param; param = param.next)
1579 f.Printf("%s", param.name);
1580 if(param.next) f.Printf(", ");
1584 f.Printf(" __ecereObject.returnBuffer.Free();\n");
1585 f.Printf(" __ecereMethod___ecereNameSpace__ecere__sys__Mutex_Release(__ecereObject.mutex);\n");
1586 //f.Printf(" delete this;\n");
1587 f.Printf(" delete __ecereObject;\n");
1588 if(method.dataType.returnType.kind != voidType)
1590 f.Printf(" return __ecereResult;\n");
1595 /*if(vid < _class.vTblSize)
1606 class SymbolgenApp : Application
1611 char ** argv = null;
1616 const char * output = null;
1619 disabledPooling = false;
1620 targetPlatform = __runtimePlatform;
1621 targetBits = GetHostBits();
1624 for(c = 0; c<this.argc; c++)
1626 char * arg = this.argv[c];
1627 int argLen = strlen(arg);
1629 argv = renew argv char *[argc + 1];
1630 argv[argc] = new char[argLen+1];
1631 strcpy(argv[argc], arg);
1633 while(argv[argc][argLen-1] == '\\' && c < this.argc-1)
1640 argv[argc] = renew argv[argc] char[argLen + len + 1];
1642 argv[argc][argLen-1] = ' ';
1643 strcpy(argv[argc] + argLen, arg);
1651 printf("\nArguments given:\n");
1652 for(c=1; c<argc; c++)
1653 printf(" %s", argv[c]);
1655 for(c=1; c<argc; c++)
1656 PrintLn("Arg", c, ": ", argv[c]);
1661 for(c = 1; c<argc; c++)
1663 const char * arg = argv[c];
1666 if(!strcmp(arg + 1, "m32") || !strcmp(arg + 1, "m64"))
1668 targetBits = !strcmp(arg + 1, "m32") ? 32 : 64;
1670 else if(!strcmp(arg + 1, "t32") || !strcmp(arg + 1, "t64"))
1672 targetBits = !strcmp(arg + 1, "t32") ? 32 : 64;
1674 else if(!strcmp(arg+1, "o"))
1676 if(!output && c + 1 < argc)
1684 else if(!strcmp(arg, "-name"))
1688 strcpy(projectName, argv[c+1]);
1694 else if(!strcmp(arg, "-t"))
1697 targetPlatform = argv[c];
1701 else if(!strcmp(arg, "-outputpot"))
1703 else if(!strcmp(arg, "-disabled-pooling"))
1704 disabledPooling = true;
1705 else if(!strcmp(arg, "-console"))
1707 else if(!strcmp(arg, "-dynamiclib"))
1708 isDynamicLibrary = true;
1709 else if(!strcmp(arg, "-staticlib"))
1711 isDynamicLibrary = true; // TOFIX: unmixup
1712 isStaticLibrary = true;
1714 else if(!strcmp(arg, "-symbols"))
1718 SetSymbolsDir(argv[c+1]);
1731 printf($"Syntax:\n ecs [-t <target platform>] <input>[, <input>]* -o <output>\n");
1736 char ext[MAX_EXTENSION];
1737 char symbolModule[MAX_FILENAME];
1738 GetExtension(output, ext);
1739 GetLastDirectory(output, symbolModule);
1741 SetDefines(&::_defines);
1742 SetImports(&_imports);
1743 SetGlobalData(&globalData);
1744 SetExcludedSymbols(&_excludedSymbols);
1745 SetGlobalContext(theGlobalContext);
1746 SetTopContext(theGlobalContext);
1747 SetCurrentContext(theGlobalContext);
1748 SetTargetPlatform(targetPlatform);
1749 SetTargetBits(targetBits);
1750 SetInSymbolGen(true);
1752 privateModule = (Module)__ecere_COM_Initialize((bool)(true | (targetBits == sizeof(uintptr)*8 ? 0 : targetBits == 64 ? 2 : targetBits==32 ? 4 : 0) | 8), 1, null);
1753 SetPrivateModule(privateModule);
1754 mainModule = ModuleImport { };
1755 SetMainModule(mainModule);
1756 _imports.Add(mainModule);
1758 //if(!strcmp(ext, "c"))
1760 //const String symbolsDir = GetSymbolsDir();
1761 // Only generating .pot files when building from release.* directory for now
1762 //bool outputPot = symbolsDir && SearchString(symbolsDir, 0, "release.", false, false);
1763 Map<ContextStringPair, List<String> > intlStrings { };
1764 MapIterator<ContextStringPair, List<String>> it { map = intlStrings };
1766 for(c = 1; c<argc; c++)
1768 const char * file = argv[c];
1775 if(!strcmp(file, "-c"))
1778 else if(file[0] == '@')
1779 f = FileOpen(&file[1], read);
1783 tokens[0] = (char *)file;
1790 while(!count && f.GetLine(line, sizeof(line)))
1791 count = Tokenize(line, sizeof(tokens)/sizeof(tokens[0]), tokens, forArgsPassing);
1795 for(c = 0; c < count; c++)
1797 char ext[MAX_EXTENSION];
1799 GetExtension(file, ext);
1800 if(!strcmp(ext, "imp"))
1807 // What is this supposed to do?
1808 for(c = 1; c<argc; c++)
1810 const char * file = argv[c];
1813 if(!strcmp(file, "-c"))
1818 for(c = 1; c<argc; c++)
1820 const char * file = argv[c];
1827 // Don't even know what it does here?
1828 if(!strcmp(file, "-c"))
1831 else if(file[0] == '@')
1832 f = FileOpen(&file[1], read);
1836 tokens[0] = (char *)file;
1844 while(!count && f.GetLine(line, sizeof(line)))
1845 count = Tokenize(line, sizeof(tokens)/sizeof(tokens[0]), tokens, forArgsPassing);
1849 for(c = 0; c < count; c++)
1851 char ext[MAX_EXTENSION];
1852 char moduleName[MAX_LOCATION];
1856 GetExtension(file, ext);
1858 GetLastDirectory(file, moduleName);
1859 StripExtension(moduleName);
1860 strcat(moduleName, ".ec");
1862 if(fstrcmp(moduleName, symbolModule) && (!strcmp(ext, "sym") || !strcmp(ext, "ec")))
1864 ImportedModule importedModule;
1865 ModuleInfo module { };
1866 char fileName[MAX_FILENAME];
1867 ::modules.Add(module);
1869 GetLastDirectory(file, fileName);
1871 module.name = CopyString(fileName);
1873 StripExtension(module.name);
1875 for(importedModule = ::_defines.first; importedModule; importedModule = importedModule.next)
1877 if(importedModule.type == moduleDefinition && !strcmpi(importedModule.name, module.name) && !(importedModule.importType == remoteImport))
1882 module.globalInstance = importedModule.globalInstance;
1885 importedModule = ImportedModule
1887 name = CopyString(module.name),
1888 type = moduleDefinition,
1889 importType = normalImport
1891 ::_defines.AddName(importedModule);
1893 module.globalInstance = LoadSymbols(file, normalImport, false);
1894 CheckDataRedefinitions();
1900 ChangeExtension(file, "bowl", fileName);
1901 f = FileOpen(fileName, read);
1904 static char line[65536];
1905 List<String> comments { };
1906 String msgid = null, msgstr = null, msgctxt = null;
1909 if(f.GetLine(line, sizeof(line)))
1912 TrimLSpaces(line, line);
1915 comments.Add(CopyString(line));
1917 else if(strstr(line, "msgid \"") == line)
1920 msgid = CopyString(line + 7);
1921 len = strlen(msgid);
1922 if(len) msgid[len-1] = 0;
1924 else if(strstr(line, "msgctxt \"") == line)
1927 msgctxt = CopyString(line + 9);
1928 len = strlen(msgctxt);
1929 if(len) msgctxt[len-1] = 0;
1931 else if(strstr(line, "msgstr \"") == line)
1934 msgstr = CopyString(line + 8);
1935 len = strlen(msgstr);
1936 if(len) msgstr[len-1] = 0;
1941 ContextStringPair pair { msgid, msgctxt };
1943 if(!it.Index(pair, false))
1945 msgid = null; msgctxt = null;
1946 intlStrings[pair] = comments;
1953 comments.RemoveAll();
1973 ComputeModuleClasses(privateModule);
1975 if(!isDynamicLibrary)
1977 // applicationClass = eSystem_FindClass(privateModule, "Application");
1979 thisAppClass = FindAppClass(&privateModule.application.publicNameSpace, true);
1981 thisAppClass = FindAppClass(&privateModule.application.privateNameSpace, true);
1983 thisAppClass = FindAppClass(&privateModule.application.publicNameSpace, false);
1985 thisAppClass = FindAppClass(&privateModule.application.privateNameSpace, false);
1987 thisAppClass = SearchAppClass_Module(privateModule);
1991 if(outputPot && intlStrings.count)
1994 char potFileName[MAX_LOCATION];
1995 //strcpy(potFileName, output);
1996 //StripExtension(potFileName);
1997 strcpy(potFileName, "locale");
1998 PathCat(potFileName, projectName);
1999 ChangeExtension(potFileName, "pot", potFileName);
2000 potFile = FileOpen(potFileName, write);
2004 potFile.Puts("msgid \"\"\n");
2005 potFile.Puts("msgstr \"\"\n");
2006 potFile.Puts("\"Project-Id-Version: \\n\"\n");
2007 potFile.Puts("\"POT-Creation-Date: \\n\"\n");
2008 potFile.Puts("\"PO-Revision-Date: \\n\"\n");
2009 potFile.Puts("\"Last-Translator: \\n\"\n");
2010 potFile.Puts("\"Language-Team: \\n\"\n");
2011 potFile.Puts("\"MIME-Version: 1.0\\n\"\n");
2012 potFile.Puts("\"Content-Type: text/plain; charset=iso-8859-1\\n\"\n");
2013 potFile.Puts("\"Content-Transfer-Encoding: 8bit\\n\"\n");
2014 potFile.Puts("\"X-Poedit-Basepath: ../\\n\"\n");
2017 for(i : intlStrings)
2019 ContextStringPair pair = &i;
2020 List<String> comments = i;
2029 potFile.Puts("msgctxt \""); potFile.Puts(pair.context); potFile.Puts("\"\n");
2031 potFile.Puts("msgid \""); potFile.Puts(pair.string); potFile.Puts("\"\n");
2032 potFile.Puts("msgstr \""); potFile.Puts(pair.string); potFile.Puts("\"\n");
2042 FreeContext(theGlobalContext);
2043 FreeExcludedSymbols(_excludedSymbols);
2045 ::_defines.Free(FreeModuleDefine);
2046 _imports.Free(FreeModuleImport);
2048 //precompDefines.Free(FreeDefinition);
2050 FreeTypeData(privateModule);
2052 FreeGlobalData(globalData);
2054 delete privateModule;
2057 SetSymbolsDir(null); // Free symbols dir
2060 for(c = 0; c<argc; c++)
2065 #if 0 //defined(_DEBUG) && defined(__WIN32__)