9 static define localeDir = "locale";
12 static Platform targetPlatform;
13 static int targetBits;
15 static bool isConsole;
16 static bool isDynamicLibrary;
17 static bool isStaticLibrary;
18 static OldList modules;
19 static File dcomSymbols;
21 static OldList _defines { };
22 static OldList _imports { };
23 static OldList _excludedSymbols { offset = (uint)&((Symbol)0).left };
24 static NameSpace globalData
26 classes.CompareKey = (void *)BinaryTree::CompareString;
27 defines.CompareKey = (void *)BinaryTree::CompareString;
28 functions.CompareKey = (void *)BinaryTree::CompareString;
29 nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
31 static Context theGlobalContext { };
32 static ModuleImport mainModule;
33 static Module privateModule;
35 static char mainModuleName[MAX_LOCATION];
36 static char projectName[MAX_LOCATION];
37 static void LoadImports(char * fileName)
39 File f = FileOpen(fileName, read);
45 if(!f.GetLine(line, sizeof(line))) break;
46 TrimLSpaces(line, line);
50 if(!strcmp(line, "[Imported Modules]"))
52 ModuleImport module = null;
55 if(!f.GetLine(line, sizeof(line))) break;
56 TrimLSpaces(line, line);
57 if(!strcmp(line, ".")) break;
61 ClassImport _class = null;
62 FunctionImport function = null;
64 if(!strcmp(line, "[This]"))
66 if((mainModule = GetMainModule()))
70 mainModule = ModuleImport { };
71 SetMainModule(mainModule);
73 _imports.AddName(module);
76 else if(!strcmp(line, "[Static]"))
78 module.importType = staticImport;
80 else if(!strcmp(line, "[Remote]"))
82 module.importType = remoteImport;
84 else if(!strcmp(line, "[Private]"))
86 if(module.importAccess != publicAccess)
87 module.importAccess = privateAccess;
89 else if(!strcmp(line, "[Public]"))
91 module.importAccess = publicAccess;
93 else if(!strcmp(line, "[Imported Classes]"))
97 if(!f.GetLine(line, sizeof(line))) break;
98 TrimLSpaces(line, line);
99 if(!strcmp(line, ".")) break;
103 if(!strcmp(line, "[Instantiated]"))
105 _class.itself = true;
107 else if(!strcmp(line, "[Remote]"))
111 else if(!strcmp(line, "[Imported Methods]"))
113 MethodImport method = null;
116 if(!f.GetLine(line, sizeof(line))) break;
117 TrimLSpaces(line, line);
118 if(!strcmp(line, ".")) break;
121 if(!(method = _class.methods.FindName(line, false)))
123 method = MethodImport { name = CopyString(line) };
124 _class.methods.AddName(method);
127 else if(!strcmp(line, "[Virtual]"))
128 method.isVirtual = true;
132 else if(!strcmp(line, "[Imported Properties]"))
134 PropertyImport prop = null;
137 if(!f.GetLine(line, sizeof(line))) break;
138 TrimLSpaces(line, line);
139 if(!strcmp(line, ".")) break;
142 if(!(prop = _class.properties.FindName(line, false)))
144 prop = PropertyImport { name = CopyString(line) };
145 _class.properties.AddName(prop);
148 else if(!strcmp(line, "[Set]"))
150 else if(!strcmp(line, "[Get]"))
152 else if(!strcmp(line, "[Virtual]"))
153 prop.isVirtual = true;
159 if(!(_class = module.classes.FindName(line, false)))
161 _class = ClassImport { name = CopyString(line) };
162 module.classes.AddName(_class);
167 else if(!strcmp(line, "[Imported Functions]"))
171 if(!f.GetLine(line, sizeof(line))) break;
172 TrimLSpaces(line, line);
173 if(!strcmp(line, ".")) break;
180 if(!(function = module.functions.FindName(line, false)))
182 function = FunctionImport { name = CopyString(line) };
183 module.functions.AddName(function);
191 if(!(module = _imports.FindName(line, false)))
193 if(!strcmp(line, "ecereCOM"))
195 module = _imports.FindName("ecere", false);
197 else if(!strcmp(line, "ecere"))
199 module = _imports.FindName("ecereCOM", false);
203 module.name = CopyString("ecere");
208 module = ModuleImport { name = CopyString(line) };
209 _imports.AddName(module);
221 // static Class applicationClass;
222 static Class thisAppClass;
224 class ModuleInfo : struct
226 ModuleInfo prev, next;
232 static bool SeardchModuleName(Module searchIn, char * name)
236 if(searchIn.name && !strcmp(searchIn.name, name))
239 for(subModule = searchIn.modules.first; subModule; subModule = subModule.next)
241 if(SearchModuleName(subModule.module, name))
247 static void WriteMain(char * fileName)
249 File f = FileOpen(fileName, write);
253 ModuleInfo defModule;
254 bool nonInst = false, anyMethod = false, anyProp = false, anyFunction = false;
255 ImportedModule importedModule;
257 GetLastDirectory(fileName, mainModuleName);
258 StripExtension(mainModuleName);
261 strcpy(projectName, mainModuleName);
262 StripExtension(projectName);
264 ChangeCh(mainModuleName, '.', '_');
265 ChangeCh(mainModuleName, '-', '_');
266 ChangeCh(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(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(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 ChangeCh(moduleName, ' ', '_');
413 ChangeCh(moduleName, '-', '_');
414 ChangeCh(moduleName, '.', '_');
416 f.Printf("void __ecereRegisterModule_%s(Module module);\n", moduleName);
417 f.Printf("void __ecereUnregisterModule_%s(Module module);\n", moduleName);
418 if(defModule.globalInstance)
420 f.Printf("void __ecereCreateModuleInstances_%s();\n", moduleName);
421 f.Printf("void __ecereDestroyModuleInstances_%s();\n", moduleName);
430 // Insert DCOM bindings here
431 dcomSymbols.Seek(0, start);
432 while(!dcomSymbols.Eof())
435 int read = dcomSymbols.Read(buffer, 1, sizeof(buffer));
437 f.Write(buffer, 1, read);
446 /*if(targetPlatform == win32)
447 f.Printf("\nbool __stdcall __ecereDll_Load_%s(Module module)\n{\n", projectName);
449 f.Printf("\nbool __ecereDll_Load_%s(Module module)\n{\n", projectName);
451 else if(isDynamicLibrary)
453 if(targetPlatform == win32)
454 f.Puts("\ndllexport bool __stdcall __ecereDll_Load(Module module)\n{\n");
456 f.Puts("\ndllexport bool __ecereDll_Load(Module module)\n{\n");
458 else if(targetPlatform == win32 && !isConsole)
460 f.Puts("\nint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, char * cmdLine, int show)\n{\n");
463 f.Puts("\nint main(int _argc, char * _argv[])\n{\n");
465 if(!isDynamicLibrary)
467 f.Puts(" int exitCode;\n");
468 f.Puts(" Module module;\n");
471 //if(nonInst || thisAppClass) // We use it all the time to get "Application" for the exit code now...
472 f.Puts(" Class _class;\n");
475 f.Puts(" Method method;\n");
477 f.Puts(" Property _property;\n");
479 f.Puts(" GlobalFunction function;\n");
485 f.Puts(" if(!__currentModule)\n");
487 f.Puts(" __currentModule = module;\n");
489 f.Puts(" __thisModule = module;\n");
492 else if(targetPlatform == win32 && !isConsole)
493 f.Puts(" __thisModule = __currentModule = module = __ecere_COM_Initialize(1, 0, null);\n\n");
495 f.Puts(" __thisModule = __currentModule = module = __ecere_COM_Initialize(1, _argc, (void *)_argv);\n\n");
497 // First load all modules
500 for(module = _imports.first; module; module = module.next)
504 //if(strcmp(module.name, "ecereCOM") && strcmp(module.name, "ecere") )
506 if(module.importType == staticImport)
507 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);
509 f.Printf(" eModule_Load(module, \"%s\", %s);\n", module.name, (module.importAccess == privateAccess) ? "privateAccess" : "publicAccess");
516 // Then define the classes
519 for(defModule = ::modules.first; defModule; defModule = defModule.next)
521 char moduleName[1024];
522 strcpy(moduleName, defModule.name);
523 ChangeCh(moduleName, ' ', '_');
524 ChangeCh(moduleName, '-', '_');
525 ChangeCh(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 || (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(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");
645 f.Printf(" LoadTranslatedStrings(module, \"%s\");\n", projectName);
648 //f.Printf(" module._vTbl[10](module);\n");
652 if(!isDynamicLibrary && thisAppClass)
654 f.Printf(" _class = eSystem_FindClass(__currentModule, \"%s\");\n", thisAppClass.name);
655 f.Printf(" eInstance_Evolve((Instance *)&__currentModule, _class);\n");
656 f.Printf(" __thisModule = __currentModule;\n");
661 f.Puts(" if(__currentModule == module)\n");
665 // Then check if there's any global instances to create
668 for(defModule = ::modules.first; defModule; defModule = defModule.next)
669 if(defModule.globalInstance)
671 char moduleName[1024];
672 if(!strcmp(defModule.name, "i18n")) continue;
673 strcpy(moduleName, defModule.name);
674 ChangeCh(moduleName, ' ', '_');
675 ChangeCh(moduleName, '-', '_');
676 ChangeCh(moduleName, '.', '_');
678 f.Printf(" __ecereCreateModuleInstances_%s();\n", moduleName);
688 if(!isDynamicLibrary && thisAppClass)
690 f.Printf(" ((void(*)(void *))(void *)__currentModule._vTbl[12])(__currentModule);\n");
695 f.Puts(" return true;\n");
699 /*if(targetPlatform == win32)
700 f.Printf("\nbool __stdcall __ecereDll_Unload_%s(Module module)\n{\n", projectName);
702 f.Printf("\nbool __ecereDll_Unload_%s(Module module)\n{\n", projectName);
706 if(targetPlatform == win32)
707 f.Puts("\ndllexport bool __stdcall __ecereDll_Unload(Module module)\n{\n");
709 f.Puts("\ndllexport bool __ecereDll_Unload(Module module)\n{\n");
715 f.Puts(" if(__currentModule == module)\n");
718 // Then check if there's any global instances to destroy
720 bool destroyI18n = false;
723 for(defModule = ::modules.first; defModule; defModule = defModule.next)
724 if(defModule.globalInstance)
726 char moduleName[1024];
727 if(!strcmp(defModule.name, "i18n")) { destroyI18n = true; continue; }
728 strcpy(moduleName, defModule.name);
729 ChangeCh(moduleName, ' ', '_');
730 ChangeCh(moduleName, '-', '_');
731 ChangeCh(moduleName, '.', '_');
732 f.Printf(" __ecereDestroyModuleInstances_%s();\n", moduleName);
738 f.Printf(" UnloadTranslatedStrings(__currentModule);\n");
740 f.Printf(" __ecereDestroyModuleInstances_i18n();\n");
748 //f.Printf(" module._vTbl[11](module);\n");
753 for(defModule = ::modules.first; defModule; defModule = defModule.next)
755 char moduleName[1024];
756 strcpy(moduleName, defModule.name);
757 ChangeCh(moduleName, ' ', '_');
758 ChangeCh(moduleName, '-', '_');
759 ChangeCh(moduleName, '.', '_');
760 f.Printf(" __ecereUnregisterModule_%s(module);\n", moduleName);
764 f.Puts(" if(__currentModule == module)\n");
765 f.Puts(" __currentModule = (void *)0;\n");
768 f.Puts(" if(__thisModule == module)\n");
769 f.Puts(" __thisModule = (void *)0;\n");
773 if(!isDynamicLibrary)
777 " _class = eSystem_FindClass(__currentModule, \"ecere::com::Application\");\n"
778 " exitCode = ((ecere::com::Application)__currentModule).exitCode;\n"
779 " delete __currentModule;\n"
780 " return exitCode;\n");
783 f.Puts(" return true;\n");
789 static Class FindAppClass(NameSpace * nameSpace, bool thisModule)
793 for(link = (BTNamedLink)nameSpace->classes.first; link; link = (BTNamedLink)((BTNode)link).next)
795 Class _class = link.data;
797 applicationClass = eSystem_FindClass(_class.module, "Application");
798 if(_class != applicationClass && eClass_IsDerived(_class, applicationClass) && (!thisModule || _class.module == privateModule))
801 if(strcmp(_class.fullName, "ecere::com::Application") && (!thisModule || _class.module == privateModule))
804 for(base = _class.base; base && base.type != systemClass; base = base.base)
805 if(!strcmp(base.fullName, "ecere::com::Application"))
810 for(ns = (NameSpace *)nameSpace->nameSpaces.first; ns; ns = (NameSpace *)((BTNode)ns).next)
812 Class _class = FindAppClass(ns, thisModule);
813 if(_class) // && _class != applicationClass)
816 return null; //applicationClass;
819 static Class SearchAppClass_Module(Module module)
824 appClass = FindAppClass(module.publicNameSpace, false);
825 if(appClass) return appClass;
826 appClass = FindAppClass(module.privateNameSpace, false);
827 if(appClass) return appClass;
829 for(subModule = module.modules.first; subModule; subModule = subModule.next)
831 appClass = SearchAppClass_Module(subModule.module);
832 if(appClass) return appClass;
837 static void BindDCOMClient()
839 Class dcomClientObjectClass = eSystem_FindClass(privateModule, "ecere::net::DCOMClientObject");
842 if(dcomClientObjectClass && dcomClientObjectClass.derivatives.first)
845 if(!dcomSymbols) dcomSymbols = TempFile { };
849 for(deriv = dcomClientObjectClass.derivatives.first; deriv; deriv = deriv.next)
851 Class _class = deriv.data;
857 DeclareClass(FindClass("ecere::net::DCOMClientObject"), "__ecereClass___ecereNameSpace__ecere__net__DCOMClientObject");
858 f.Printf("class %s : ecere::net::DCOMClientObject\n", _class.fullName);
861 // CLIENT VIRTUAL METHODS BINDINGS
862 if(_class.vTblSize > _class.base.vTblSize)
865 f.Printf(" virtual void CallVirtualMethod(uint __ecereMethodID, SerialBuffer __ecereBuffer)\n");
867 f.Printf(" switch(__ecereMethodID)\n");
870 for(vid = _class.base.vTblSize; vid < _class.vTblSize; vid++)
873 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
875 if(method.type == virtualMethod && method._class == _class && method.vid == vid)
881 method.dataType = ProcessTypeString(method.dataTypeString, false);
882 if(method.dataType && method.dataType.name)
884 f.Printf(" case %d:\n", vid - _class.base.vTblSize);
887 if(method.dataType.returnType.kind != voidType)
890 OldList * specs = MkList();
892 char type[1024] = "";
893 char className[1024];
896 if(method.dataType.returnType.kind == classType)
897 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
900 PrintType(method.dataType.returnType, type, false, true);
901 classSym = FindClass(type);
904 strcpy(className, "__ecereClass_");
905 FullClassNameCat(className, classSym.string, true);
906 MangleClassName(className);
907 DeclareClass(classSym, className);
909 PrintType(method.dataType.returnType, type, true, true);
911 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
912 resultType = MkTypeName(specs, decl);
915 OutputTypeName(resultType, f);
919 for(param = method.dataType.params.first; param; param = param.next)
921 if(param.kind == classType && !strcmp(param._class.string, "String"))
923 // Hardcode 1024 chars max string for now
924 f.Printf(" char %s[1024];\n", param.name);
925 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
926 DeclareClass(FindClass("String"), "__ecereClass_String");
930 TypeName paramTypeName;
931 OldList * specs = MkList();
933 char type[1024] = "";
934 char className[1024];
937 if(param.kind == classType)
938 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
941 PrintType(param, type, false, true);
942 classSym = FindClass(type);
946 strcpy(className, "__ecereClass_");
947 FullClassNameCat(className, classSym.string, true);
948 MangleClassName(className);
949 DeclareClass(classSym, className);
951 PrintType(param, type, true, true);
953 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier(param.name /*"__ecereResult"*/)));
954 paramTypeName = MkTypeName(specs, decl);
957 OutputTypeName(paramTypeName, f);
964 for(param = method.dataType.params.first; param; param = param.next)
966 f.Printf(" __ecereBuffer.Unserialize(");
967 if(param.kind == classType && !strcmp(param._class.string, "String"))
969 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
970 f.Printf("(StaticString)");
977 if(method.dataType.returnType.kind != voidType)
978 f.Printf("__ecereResult = ");
980 // f.Printf("this.instance.%s(", method.name);
981 f.Printf("%s(", method.name);
983 for(param = method.dataType.params.first; param; param = param.next)
987 f.Printf("%s", param.name);
992 for(param = method.dataType.params.first; param; param = param.next)
994 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
996 if(!strcmp(param._class.string, "String"))
998 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
999 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1002 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1005 if(method.dataType.returnType.kind != voidType)
1007 f.Printf(" __ecereBuffer.Serialize(__ecereResult);\n");
1010 for(param = method.dataType.params.first; param; param = param.next)
1012 if(param.kind == classType && strcmp(param._class.string, "String") && param._class.registered &&
1013 (param._class.registered.type == normalClass || param._class.registered.type == noHeadClass))
1015 f.Printf(" delete %s;\n", param.name);
1018 if(method.dataType.returnType.kind == classType && strcmp(method.dataType.returnType._class.string, "String") && method.dataType.returnType._class.registered &&
1019 (method.dataType.returnType._class.registered.type == normalClass || method.dataType.returnType._class.registered.type == noHeadClass))
1021 f.Printf(" delete __ecereResult;\n");
1025 f.Printf(" break;\n");
1037 vid = _class.base.vTblSize;
1039 next = (Method)_class.methods.first;
1040 while(next && ((next.type == virtualMethod) != doVirtual || (doVirtual && next.vid != vid)))
1043 next = (Method)((BTNode)next).next;
1044 if(!next && doVirtual)
1046 if(vid == _class.vTblSize)
1051 next = (Method)_class.methods.first;
1054 for(method = next; method; method = next)
1058 if(!method.dataType)
1059 method.dataType = ProcessTypeString(method.dataTypeString, false);
1061 if(method.dataType.name)
1067 strcpy(name, "__ecereVMethodID_");
1068 FullClassNameCat(name, method._class.fullName, true);
1070 strcat(name, method.name);
1071 DeclareMethod(method, name);
1073 f.Printf("virtual ");
1075 f.Printf("%s\n", method.dataTypeString);
1080 if(method.dataType.returnType.kind != voidType)
1082 TypeName resultType;
1083 OldList * specs = MkList();
1085 char type[1024] = "";
1086 char className[1024];
1089 if(method.dataType.returnType.kind == classType)
1090 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1093 PrintType(method.dataType.returnType, type, false, true);
1094 classSym = FindClass(type);
1098 strcpy(className, "__ecereClass_");
1099 FullClassNameCat(className, classSym.string, true);
1100 MangleClassName(className);
1101 DeclareClass(classSym, className);
1103 PrintType(method.dataType.returnType, type, true, true);
1105 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1106 resultType = MkTypeName(specs, decl);
1109 OutputTypeName(resultType, f);
1110 if(method.dataType.returnType.kind == structType)
1111 f.Printf(" = { 0 }");
1112 else if(method.dataType.returnType.kind == classType && method.dataType.returnType._class.registered && method.dataType.returnType._class.registered.type == structClass)
1118 f.Printf(" incref this;\n");
1119 for(param = method.dataType.params.first; param; param = param.next)
1121 char type[1024] = "";
1122 char className[1024];
1125 if(param.kind == classType)
1126 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1129 PrintType(param, type, false, true);
1130 classSym = FindClass(type);
1133 strcpy(className, "__ecereClass_");
1134 FullClassNameCat(className, classSym.string, true);
1136 MangleClassName(className);
1137 DeclareClass(classSym, className);
1139 if(param.kind == classType && !strcmp(param._class.string, "String"))
1141 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1142 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1145 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1149 eSystem_FindClass(privateModule, "ecere::net::DCOMClientObject"), "CallMethod", privateModule),
1150 "__ecereMethod___ecereNameSpace__ecere__net__DCOMClientObject_CallMethod");
1152 f.Printf(" if(DCOMClientObject::CallMethod(%d))\n", id++);
1154 for(param = method.dataType.params.first; param; param = param.next)
1156 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1158 if(!strcmp(param._class.string, "String"))
1160 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1161 f.Printf(" __ecereBuffer.Unserialize((StaticString)%s);\n", param.name);
1164 f.Printf(" __ecereBuffer.Unserialize(%s);\n", param.name);
1167 if(method.dataType.returnType.kind != voidType)
1169 if(method.dataType.returnType.kind == classType && !strcmp(method.dataType.returnType._class.string, "String"))
1171 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1172 f.Printf(" __ecereBuffer.Unserialize((StaticString)__ecereResult);\n");
1175 f.Printf(" __ecereBuffer.Unserialize(__ecereResult);\n");
1178 f.Printf(" __ecereBuffer.Free();\n");
1179 f.Printf(" delete this;\n");
1180 if(method.dataType.returnType.kind != voidType)
1182 f.Printf(" return __ecereResult;\n");
1188 next = (Method)((BTNode)method).next;
1189 while(next && ((next.type == virtualMethod) != doVirtual || (doVirtual && next.vid != vid)))
1192 next = (Method)((BTNode)next).next;
1193 if(!next && doVirtual)
1195 if(vid == _class.vTblSize)
1200 next = (Method)_class.methods.first;
1215 static void BindDCOMServer()
1217 bool mutexDeclared = false;
1219 for(_class = privateModule.classes.first; _class; _class = _class.next)
1221 if(_class.isRemote == 3) //)
1228 if(!dcomSymbols) dcomSymbols = TempFile { };
1231 DeclareClass(FindClass("ecere::net::DCOMServerObject"), "__ecereClass___ecereNameSpace__ecere__net__DCOMServerObject");
1234 for(_class = privateModule.classes.first; _class; _class = _class.next)
1236 if(_class.isRemote == 3) //2 && !strncmp(_class.fullName, "DCOMServer_", strlen("DCOMServer_")))
1242 f.Printf("class DCOM%s : ecere::net::DCOMServerObject\n", _class.fullName);
1243 // f.Printf("class DCOM%s\n", _class.fullName);
1246 f.Printf(" %s instance;\n", _class.fullName);
1247 f.Printf(" unsigned int id;\n");
1248 f.Printf(" SerialBuffer buffer { };\n");
1252 f.Printf(" DCOM%s()\n", _class.fullName);
1254 f.Printf(" instance = eInstance_New(class(%s));\n", _class.fullName);
1258 f.Printf(" virtual void CallMethod(uint __ecereMethodID, SerialBuffer __ecereBuffer)\n");
1260 f.Printf(" %s inst = (%s)instance;\n", _class.fullName, _class.fullName);
1261 f.Printf(" incref inst;\n");
1262 f.Printf(" switch(__ecereMethodID)\n");
1265 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1268 method.dataType = ProcessTypeString(method.dataTypeString, false);
1269 if(method.dataType && method.dataType.name)
1271 f.Printf(" case %d:\n", id++);
1275 if(method.dataType.returnType.kind != voidType)
1277 TypeName resultType;
1278 OldList * specs = MkList();
1280 char type[1024] = "";
1281 char className[1024];
1284 if(method.dataType.returnType.kind == classType)
1285 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1288 PrintType(method.dataType.returnType, type, false, true);
1289 classSym = FindClass(type);
1292 strcpy(className, "__ecereClass_");
1293 FullClassNameCat(className, classSym.string, true);
1294 MangleClassName(className);
1295 DeclareClass(classSym, className);
1297 PrintType(method.dataType.returnType, type, true, true);
1299 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1300 resultType = MkTypeName(specs, decl);
1303 OutputTypeName(resultType, f);
1307 for(param = method.dataType.params.first; param; param = param.next)
1309 if(param.kind == classType && !strcmp(param._class.string, "String"))
1311 // Hardcode 1024 chars max string for now
1312 f.Printf(" char %s[1024];\n", param.name);
1313 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1314 DeclareClass(FindClass("String"), "__ecereClass_String");
1318 TypeName paramTypeName;
1319 OldList * specs = MkList();
1321 char type[1024] = "";
1322 char className[1024];
1325 if(param.kind == classType)
1326 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1329 PrintType(param, type, false, true);
1330 classSym = FindClass(type);
1334 strcpy(className, "__ecereClass_");
1335 FullClassNameCat(className, classSym.string, true);
1336 MangleClassName(className);
1337 DeclareClass(classSym, className);
1339 PrintType(param, type, true, true);
1341 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier(param.name /*"__ecereResult"*/)));
1342 paramTypeName = MkTypeName(specs, decl);
1345 OutputTypeName(paramTypeName, f);
1352 for(param = method.dataType.params.first; param; param = param.next)
1354 f.Printf(" __ecereBuffer.Unserialize(");
1355 if(param.kind == classType && !strcmp(param._class.string, "String"))
1357 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1358 f.Printf("(StaticString)");
1365 if(method.dataType.returnType.kind != voidType)
1366 f.Printf("__ecereResult = ");
1368 // f.Printf("this.instance.%s(", method.name);
1369 f.Printf("((%s)instance).%s(", _class.fullName, method.name);
1371 for(param = method.dataType.params.first; param; param = param.next)
1375 f.Printf("%s", param.name);
1380 for(param = method.dataType.params.first; param; param = param.next)
1382 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1384 if(!strcmp(param._class.string, "String"))
1386 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1387 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1390 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1393 if(method.dataType.returnType.kind != voidType)
1395 f.Printf(" __ecereBuffer.Serialize(__ecereResult);\n");
1398 for(param = method.dataType.params.first; param; param = param.next)
1400 if(param.kind == classType && strcmp(param._class.string, "String") && param._class.registered &&
1401 (param._class.registered.type == normalClass || param._class.registered.type == noHeadClass))
1403 f.Printf(" delete %s;\n", param.name);
1406 if(method.dataType.returnType.kind == classType && strcmp(method.dataType.returnType._class.string, "String") && method.dataType.returnType._class.registered &&
1407 (method.dataType.returnType._class.registered.type == normalClass || method.dataType.returnType._class.registered.type == noHeadClass))
1409 f.Printf(" delete __ecereResult;\n");
1413 f.Printf(" break;\n");
1418 f.Printf(" delete inst;\n");
1421 // *** VIRTUAL FUNCTIONS BINDINGS ***
1422 for(vid = _class.base.vTblSize; vid < _class.vTblSize; vid++)
1427 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1428 if(method.type == virtualMethod && method._class == _class && method.vid == vid)
1434 DeclareClass(FindClass("ecere::sys::Mutex"), "__ecereClass___ecereNameSpace__ecere__sys__Mutex");
1437 eSystem_FindClass(privateModule, "ecere::sys::Mutex"), "Wait", privateModule),
1438 "__ecereMethod___ecereNameSpace__ecere__sys__Mutex_Wait");
1441 eSystem_FindClass(privateModule, "ecere::sys::Mutex"), "Release", privateModule),
1442 "__ecereMethod___ecereNameSpace__ecere__sys__Mutex_Release");
1443 mutexDeclared = true;
1447 if(!method.dataType)
1448 method.dataType = ProcessTypeString(method.dataTypeString, false);
1450 if(method.dataType.name)
1452 f.Printf(" virtual %s\n", method.dataTypeString);
1457 f.Printf(" DCOM%s __ecereObject = (void *)_vTbl[-1];\n", _class.fullName);
1458 if(method.dataType.returnType.kind != voidType)
1460 TypeName resultType;
1461 OldList * specs = MkList();
1463 char type[1024] = "";
1464 char className[1024];
1467 if(method.dataType.returnType.kind == classType)
1468 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1471 PrintType(method.dataType.returnType, type, false, true);
1472 classSym = FindClass(type);
1476 strcpy(className, "__ecereClass_");
1477 FullClassNameCat(className, classSym.string, true);
1478 MangleClassName(className);
1479 DeclareClass(classSym, className);
1481 PrintType(method.dataType.returnType, type, true, true);
1483 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1484 resultType = MkTypeName(specs, decl);
1487 OutputTypeName(resultType, f);
1488 if(method.dataType.returnType.kind == structType)
1489 f.Printf(" = { 0 }");
1490 else if(method.dataType.returnType.kind == classType && method.dataType.returnType._class.registered && method.dataType.returnType._class.registered.type == structClass)
1497 f.Printf(" incref __ecereObject;\n");
1498 f.Printf(" __ecereMethod___ecereNameSpace__ecere__sys__Mutex_Wait(__ecereObject.mutex);\n");
1500 //f.Printf(" incref this;\n");
1501 for(param = method.dataType.params.first; param; param = param.next)
1503 char type[1024] = "";
1504 char className[1024];
1507 if(param.kind == classType)
1508 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1511 PrintType(param, type, false, true);
1512 classSym = FindClass(type);
1515 strcpy(className, "__ecereClass_");
1516 FullClassNameCat(className, classSym.string, true);
1517 MangleClassName(className);
1518 DeclareClass(classSym, className);
1520 if(param.kind == classType && !strcmp(param._class.string, "String"))
1522 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1523 f.Printf(" __ecereObject.argsBuffer.Serialize((StaticString)%s);\n", param.name);
1526 f.Printf(" __ecereObject.argsBuffer.Serialize(%s);\n", param.name);
1531 eSystem_FindClass(privateModule, "ecere::net::DCOMServerObject"), "CallVirtualMethod", privateModule),
1532 "__ecereMethod___ecereNameSpace__ecere__net__DCOMServerObject_CallVirtualMethod");
1534 // Check if this method needs to return anything (hasReturnValue)
1536 bool hasReturnValue = method.dataType.returnType.kind != voidType;
1539 for(param = method.dataType.params.first; param; param = param.next)
1541 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1543 hasReturnValue = true;
1548 f.Printf(" if(__ecereObject.CallVirtualMethod(%d, %s))\n", vid - _class.base.vTblSize,
1549 hasReturnValue ? "true" : "false");
1552 for(param = method.dataType.params.first; param; param = param.next)
1554 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1556 if(!strcmp(param._class.string, "String"))
1558 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1559 f.Printf(" __ecereObject.returnBuffer.Unserialize((StaticString)%s);\n", param.name);
1562 f.Printf(" __ecereObject.returnBuffer.Unserialize(%s);\n", param.name);
1565 if(method.dataType.returnType.kind != voidType)
1567 if(method.dataType.returnType.kind == classType && !strcmp(method.dataType.returnType._class.string, "String"))
1569 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1570 f.Printf(" __ecereObject.returnBuffer.Unserialize((StaticString)__ecereResult);\n");
1573 f.Printf(" __ecereObject.returnBuffer.Unserialize(__ecereResult);\n");
1576 f.Printf(" else\n");
1577 f.Printf(" ((%s)this).%s::%s(", _class.fullName, _class.fullName, method.name);
1578 for(param = method.dataType.params.first; param; param = param.next)
1580 f.Printf("%s", param.name);
1581 if(param.next) f.Printf(", ");
1585 f.Printf(" __ecereObject.returnBuffer.Free();\n");
1586 f.Printf(" __ecereMethod___ecereNameSpace__ecere__sys__Mutex_Release(__ecereObject.mutex);\n");
1587 //f.Printf(" delete this;\n");
1588 f.Printf(" delete __ecereObject;\n");
1589 if(method.dataType.returnType.kind != voidType)
1591 f.Printf(" return __ecereResult;\n");
1596 /*if(vid < _class.vTblSize)
1607 class SymbolgenApp : Application
1612 char ** argv = null;
1617 char * output = null;
1619 targetPlatform = GetRuntimePlatform();
1620 targetBits = GetHostBits();
1623 for(c = 0; c<this.argc; c++)
1625 char * arg = this.argv[c];
1626 int argLen = strlen(arg);
1628 argv = renew argv char *[argc + 1];
1629 argv[argc] = new char[argLen+1];
1630 strcpy(argv[argc], arg);
1632 while(argv[argc][argLen-1] == '\\' && c < this.argc-1)
1639 argv[argc] = renew argv[argc] char[argLen + len + 1];
1641 argv[argc][argLen-1] = ' ';
1642 strcpy(argv[argc] + argLen, arg);
1649 for(c = 1; c<argc; c++)
1651 char * arg = argv[c];
1654 if(!strcmp(arg + 1, "m32") || !strcmp(arg + 1, "m64"))
1656 targetBits = !strcmp(arg + 1, "m32") ? 32 : 64;
1658 else if(!strcmp(arg+1, "o"))
1660 if(!output && c + 1 < argc)
1668 else if(!strcmp(arg, "-name"))
1672 strcpy(projectName, argv[c+1]);
1678 else if(!strcmp(arg, "-t"))
1681 targetPlatform = argv[c];
1685 else if(!strcmp(arg, "-console"))
1687 else if(!strcmp(arg, "-dynamiclib"))
1688 isDynamicLibrary = true;
1689 else if(!strcmp(arg, "-staticlib"))
1691 isDynamicLibrary = true; // TOFIX: unmixup
1692 isStaticLibrary = true;
1694 else if(!strcmp(arg, "-symbols"))
1698 SetSymbolsDir(argv[c+1]);
1710 printf($"Syntax:\n ecs [-t <target platform>] <input>[, <input>]* -o <output>\n");
1714 char ext[MAX_EXTENSION];
1715 char symbolModule[MAX_FILENAME];
1716 GetExtension(output, ext);
1717 GetLastDirectory(output, symbolModule);
1719 SetDefines(&::_defines);
1720 SetImports(&_imports);
1721 SetGlobalData(&globalData);
1722 SetExcludedSymbols(&_excludedSymbols);
1723 SetGlobalContext(theGlobalContext);
1724 SetTopContext(theGlobalContext);
1725 SetCurrentContext(theGlobalContext);
1726 SetTargetPlatform(targetPlatform);
1727 SetTargetBits(targetBits);
1729 privateModule = (Module)__ecere_COM_Initialize(true | (targetBits == sizeof(uintptr)*8 ? 0 : targetBits == 64 ? 2 : targetBits==32 ? 4 : 0) | 8, 1, null);
1730 SetPrivateModule(privateModule);
1731 mainModule = ModuleImport { };
1732 SetMainModule(mainModule);
1733 _imports.Add(mainModule);
1735 //if(!strcmp(ext, "c"))
1737 String symbolsDir = GetSymbolsDir();
1738 // Only generating .pot files when building from release.* directory for now
1739 bool outputPot = symbolsDir && SearchString(symbolsDir, 0, "release.", false, false);
1740 Map<ContextStringPair, List<String> > intlStrings { };
1741 MapIterator<ContextStringPair, List<String>> it { map = intlStrings };
1743 for(c = 1; c<argc; c++)
1745 char * file = argv[c];
1748 if(!strcmp(file, "-c"))
1753 char ext[MAX_EXTENSION];
1754 GetExtension(file,ext);
1755 if(!strcmp(ext, "imp"))
1760 // What is this supposed to do?
1761 for(c = 1; c<argc; c++)
1763 char * file = argv[c];
1766 if(!strcmp(file, "-c"))
1771 for(c = 1; c<argc; c++)
1773 char * file = argv[c];
1776 // Don't even know what it does here?
1777 if(!strcmp(file, "-c"))
1782 char ext[MAX_EXTENSION];
1783 char moduleName[MAX_LOCATION];
1785 GetExtension(file,ext);
1787 GetLastDirectory(file, moduleName);
1788 StripExtension(moduleName);
1789 strcat(moduleName, ".ec");
1791 if(fstrcmp(moduleName, symbolModule) && (!strcmp(ext, "sym") || !strcmp(ext, "ec")))
1793 ImportedModule importedModule;
1794 ModuleInfo module { };
1795 char fileName[MAX_FILENAME];
1796 ::modules.Add(module);
1798 GetLastDirectory(file, fileName);
1800 module.name = CopyString(fileName);
1802 StripExtension(module.name);
1804 for(importedModule = ::_defines.first; importedModule; importedModule = importedModule.next)
1806 if(importedModule.type == moduleDefinition && !strcmpi(importedModule.name, module.name) && !(importedModule.importType == remoteImport))
1811 module.globalInstance = importedModule.globalInstance;
1814 importedModule = ImportedModule
1816 name = CopyString(module.name),
1817 type = moduleDefinition,
1818 importType = normalImport
1820 ::_defines.AddName(importedModule);
1822 module.globalInstance = LoadSymbols(file, normalImport, false);
1823 CheckDataRedefinitions();
1829 ChangeExtension(file, "bowl", fileName);
1830 f = FileOpen(fileName, read);
1833 static char line[65536];
1834 List<String> comments { };
1835 String msgid = null, msgstr = null, msgctxt = null;
1838 if(f.GetLine(line, sizeof(line)))
1841 TrimLSpaces(line, line);
1844 comments.Add(CopyString(line));
1846 else if(strstr(line, "msgid \"") == line)
1849 msgid = CopyString(line + 7);
1850 len = strlen(msgid);
1851 if(len) msgid[len-1] = 0;
1853 else if(strstr(line, "msgctxt \"") == line)
1856 msgctxt = CopyString(line + 9);
1857 len = strlen(msgctxt);
1858 if(len) msgctxt[len-1] = 0;
1860 else if(strstr(line, "msgstr \"") == line)
1863 msgstr = CopyString(line + 8);
1864 len = strlen(msgstr);
1865 if(len) msgstr[len-1] = 0;
1870 ContextStringPair pair { msgid, msgctxt };
1872 if(!it.Index(pair, false))
1874 msgid = null; msgctxt = null;
1875 intlStrings[pair] = comments;
1882 comments.RemoveAll();
1900 ComputeModuleClasses(privateModule);
1902 if(!isDynamicLibrary)
1904 // applicationClass = eSystem_FindClass(privateModule, "Application");
1906 thisAppClass = FindAppClass(&privateModule.application.publicNameSpace, true);
1908 thisAppClass = FindAppClass(&privateModule.application.privateNameSpace, true);
1910 thisAppClass = FindAppClass(&privateModule.application.publicNameSpace, false);
1912 thisAppClass = FindAppClass(&privateModule.application.privateNameSpace, false);
1914 thisAppClass = SearchAppClass_Module(privateModule);
1918 if(outputPot && intlStrings.count)
1921 char potFileName[MAX_LOCATION];
1922 //strcpy(potFileName, output);
1923 //StripExtension(potFileName);
1924 strcpy(potFileName, "locale");
1925 MakeDir(potFileName);
1926 PathCat(potFileName, projectName);
1927 ChangeExtension(potFileName, "pot", potFileName);
1928 potFile = FileOpen(potFileName, write);
1932 potFile.Puts("msgid \"\"\n");
1933 potFile.Puts("msgstr \"\"\n");
1934 potFile.Puts("\"Project-Id-Version: \\n\"\n");
1935 potFile.Puts("\"POT-Creation-Date: \\n\"\n");
1936 potFile.Puts("\"PO-Revision-Date: \\n\"\n");
1937 potFile.Puts("\"Last-Translator: \\n\"\n");
1938 potFile.Puts("\"Language-Team: \\n\"\n");
1939 potFile.Puts("\"MIME-Version: 1.0\\n\"\n");
1940 potFile.Puts("\"Content-Type: text/plain; charset=iso-8859-1\\n\"\n");
1941 potFile.Puts("\"Content-Transfer-Encoding: 8bit\\n\"\n");
1942 potFile.Puts("\"X-Poedit-Basepath: ../\\n\"\n");
1945 for(i : intlStrings)
1947 ContextStringPair pair = &i;
1948 List<String> comments = i;
1957 potFile.Puts("msgctxt \""); potFile.Puts(pair.context); potFile.Puts("\"\n");
1959 potFile.Puts("msgid \""); potFile.Puts(pair.string); potFile.Puts("\"\n");
1960 potFile.Puts("msgstr \""); potFile.Puts(pair.string); potFile.Puts("\"\n");
1970 FreeContext(theGlobalContext);
1971 FreeExcludedSymbols(_excludedSymbols);
1973 ::_defines.Free(FreeModuleDefine);
1974 _imports.Free(FreeModuleImport);
1976 //precompDefines.Free(FreeDefinition);
1978 FreeTypeData(privateModule);
1980 FreeGlobalData(globalData);
1982 delete privateModule;
1985 SetSymbolsDir(null); // Free symbols dir
1988 for(c = 0; c<argc; c++)