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)&((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(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(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(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 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(" 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 || (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 FixModuleName(moduleName);
675 f.Printf(" __ecereCreateModuleInstances_%s();\n", moduleName);
685 if(!isDynamicLibrary && thisAppClass)
687 f.Printf(" ((void(*)(void *))(void *)__currentModule._vTbl[12])(__currentModule);\n");
692 f.Puts(" return true;\n");
696 /*if(targetPlatform == win32)
697 f.Printf("\nbool __stdcall __ecereDll_Unload_%s(Module module)\n{\n", projectName);
699 f.Printf("\nbool __ecereDll_Unload_%s(Module module)\n{\n", projectName);
703 if(targetPlatform == win32)
704 f.Puts("\ndllexport bool __stdcall __ecereDll_Unload(Module module)\n{\n");
706 f.Puts("\ndllexport bool __ecereDll_Unload(Module module)\n{\n");
712 f.Puts(" if(__currentModule == module)\n");
715 // Then check if there's any global instances to destroy
717 bool destroyI18n = false;
720 for(defModule = ::modules.first; defModule; defModule = defModule.next)
721 if(defModule.globalInstance)
723 char moduleName[1024];
724 if(!strcmp(defModule.name, "i18n")) { destroyI18n = true; continue; }
725 strcpy(moduleName, defModule.name);
726 FixModuleName(moduleName);
727 f.Printf(" __ecereDestroyModuleInstances_%s();\n", moduleName);
733 f.Printf(" UnloadTranslatedStrings(__currentModule);\n");
735 f.Printf(" __ecereDestroyModuleInstances_i18n();\n");
743 //f.Printf(" module._vTbl[11](module);\n");
748 for(defModule = ::modules.first; defModule; defModule = defModule.next)
750 char moduleName[1024];
751 strcpy(moduleName, defModule.name);
752 FixModuleName(moduleName);
753 f.Printf(" __ecereUnregisterModule_%s(module);\n", moduleName);
757 f.Puts(" if(__currentModule == module)\n");
758 f.Puts(" __currentModule = (void *)0;\n");
761 f.Puts(" if(__thisModule == module)\n");
762 f.Puts(" __thisModule = (void *)0;\n");
766 if(!isDynamicLibrary)
770 " _class = eSystem_FindClass(__currentModule, \"ecere::com::Application\");\n"
771 " exitCode = ((ecere::com::Application)__currentModule).exitCode;\n"
772 " delete __currentModule;\n"
773 " return exitCode;\n");
776 f.Puts(" return true;\n");
782 static Class FindAppClass(NameSpace * nameSpace, bool thisModule)
786 for(link = (BTNamedLink)nameSpace->classes.first; link; link = (BTNamedLink)((BTNode)link).next)
788 Class _class = link.data;
790 applicationClass = eSystem_FindClass(_class.module, "Application");
791 if(_class != applicationClass && eClass_IsDerived(_class, applicationClass) && (!thisModule || _class.module == privateModule))
794 if(strcmp(_class.fullName, "ecere::com::Application") && (!thisModule || _class.module == privateModule))
797 for(base = _class.base; base && base.type != systemClass; base = base.base)
798 if(!strcmp(base.fullName, "ecere::com::Application"))
803 for(ns = (NameSpace *)nameSpace->nameSpaces.first; ns; ns = (NameSpace *)((BTNode)ns).next)
805 Class _class = FindAppClass(ns, thisModule);
806 if(_class) // && _class != applicationClass)
809 return null; //applicationClass;
812 static Class SearchAppClass_Module(Module module)
817 appClass = FindAppClass(module.publicNameSpace, false);
818 if(appClass) return appClass;
819 appClass = FindAppClass(module.privateNameSpace, false);
820 if(appClass) return appClass;
822 for(subModule = module.modules.first; subModule; subModule = subModule.next)
824 appClass = SearchAppClass_Module(subModule.module);
825 if(appClass) return appClass;
830 static void BindDCOMClient()
832 Class dcomClientObjectClass = eSystem_FindClass(privateModule, "ecere::net::DCOMClientObject");
835 if(dcomClientObjectClass && dcomClientObjectClass.derivatives.first)
838 if(!dcomSymbols) dcomSymbols = TempFile { };
842 for(deriv = dcomClientObjectClass.derivatives.first; deriv; deriv = deriv.next)
844 Class _class = deriv.data;
850 DeclareClass(FindClass("ecere::net::DCOMClientObject"), "__ecereClass___ecereNameSpace__ecere__net__DCOMClientObject");
851 f.Printf("class %s : ecere::net::DCOMClientObject\n", _class.fullName);
854 // CLIENT VIRTUAL METHODS BINDINGS
855 if(_class.vTblSize > _class.base.vTblSize)
858 f.Printf(" virtual void CallVirtualMethod(uint __ecereMethodID, SerialBuffer __ecereBuffer)\n");
860 f.Printf(" switch(__ecereMethodID)\n");
863 for(vid = _class.base.vTblSize; vid < _class.vTblSize; vid++)
866 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
868 if(method.type == virtualMethod && method._class == _class && method.vid == vid)
874 method.dataType = ProcessTypeString(method.dataTypeString, false);
875 if(method.dataType && method.dataType.name)
877 f.Printf(" case %d:\n", vid - _class.base.vTblSize);
880 if(method.dataType.returnType.kind != voidType)
883 OldList * specs = MkList();
885 char type[1024] = "";
886 char className[1024];
889 if(method.dataType.returnType.kind == classType)
890 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
893 PrintTypeNoConst(method.dataType.returnType, type, false, true);
894 classSym = FindClass(type);
897 strcpy(className, "__ecereClass_");
898 FullClassNameCat(className, classSym.string, true);
899 MangleClassName(className);
900 DeclareClass(classSym, className);
902 PrintType(method.dataType.returnType, type, true, true);
904 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
905 resultType = MkTypeName(specs, decl);
908 OutputTypeName(resultType, f, false);
912 for(param = method.dataType.params.first; param; param = param.next)
914 if(param.kind == classType && !strcmp(param._class.string, "String"))
916 // Hardcode 1024 chars max string for now
917 f.Printf(" char %s[1024];\n", param.name);
918 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
919 DeclareClass(FindClass("String"), "__ecereClass_String");
923 TypeName paramTypeName;
924 OldList * specs = MkList();
926 char type[1024] = "";
927 char className[1024];
930 if(param.kind == classType)
931 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
934 PrintTypeNoConst(param, type, false, true);
935 classSym = FindClass(type);
939 strcpy(className, "__ecereClass_");
940 FullClassNameCat(className, classSym.string, true);
941 MangleClassName(className);
942 DeclareClass(classSym, className);
944 PrintType(param, type, true, true);
946 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier(param.name /*"__ecereResult"*/)));
947 paramTypeName = MkTypeName(specs, decl);
950 OutputTypeName(paramTypeName, f, false);
957 for(param = method.dataType.params.first; param; param = param.next)
959 f.Printf(" __ecereBuffer.Unserialize(");
960 if(param.kind == classType && !strcmp(param._class.string, "String"))
962 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
963 f.Printf("(StaticString)");
970 if(method.dataType.returnType.kind != voidType)
971 f.Printf("__ecereResult = ");
973 // f.Printf("this.instance.%s(", method.name);
974 f.Printf("%s(", method.name);
976 for(param = method.dataType.params.first; param; param = param.next)
980 f.Printf("%s", param.name);
985 for(param = method.dataType.params.first; param; param = param.next)
987 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
989 if(!strcmp(param._class.string, "String"))
991 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
992 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
995 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
998 if(method.dataType.returnType.kind != voidType)
1000 f.Printf(" __ecereBuffer.Serialize(__ecereResult);\n");
1003 for(param = method.dataType.params.first; param; param = param.next)
1005 if(param.kind == classType && strcmp(param._class.string, "String") && param._class.registered &&
1006 (param._class.registered.type == normalClass || param._class.registered.type == noHeadClass))
1008 f.Printf(" delete %s;\n", param.name);
1011 if(method.dataType.returnType.kind == classType && strcmp(method.dataType.returnType._class.string, "String") && method.dataType.returnType._class.registered &&
1012 (method.dataType.returnType._class.registered.type == normalClass || method.dataType.returnType._class.registered.type == noHeadClass))
1014 f.Printf(" delete __ecereResult;\n");
1018 f.Printf(" break;\n");
1030 vid = _class.base.vTblSize;
1032 next = (Method)_class.methods.first;
1033 while(next && ((next.type == virtualMethod) != doVirtual || (doVirtual && next.vid != vid)))
1036 next = (Method)((BTNode)next).next;
1037 if(!next && doVirtual)
1039 if(vid == _class.vTblSize)
1044 next = (Method)_class.methods.first;
1047 for(method = next; method; method = next)
1051 if(!method.dataType)
1052 method.dataType = ProcessTypeString(method.dataTypeString, false);
1054 if(method.dataType.name)
1060 strcpy(name, "__ecereVMethodID_");
1061 FullClassNameCat(name, method._class.fullName, true);
1063 strcat(name, method.name);
1064 DeclareMethod(method, name);
1066 f.Printf("virtual ");
1068 f.Printf("%s\n", method.dataTypeString);
1073 if(method.dataType.returnType.kind != voidType)
1075 TypeName resultType;
1076 OldList * specs = MkList();
1078 char type[1024] = "";
1079 char className[1024];
1082 if(method.dataType.returnType.kind == classType)
1083 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1086 PrintTypeNoConst(method.dataType.returnType, type, false, true);
1087 classSym = FindClass(type);
1091 strcpy(className, "__ecereClass_");
1092 FullClassNameCat(className, classSym.string, true);
1093 MangleClassName(className);
1094 DeclareClass(classSym, className);
1096 PrintType(method.dataType.returnType, type, true, true);
1098 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1099 resultType = MkTypeName(specs, decl);
1102 OutputTypeName(resultType, f, false);
1103 if(method.dataType.returnType.kind == structType)
1104 f.Printf(" = { 0 }");
1105 else if(method.dataType.returnType.kind == classType && method.dataType.returnType._class.registered && method.dataType.returnType._class.registered.type == structClass)
1111 f.Printf(" incref this;\n");
1112 for(param = method.dataType.params.first; param; param = param.next)
1114 char type[1024] = "";
1115 char className[1024];
1118 if(param.kind == classType)
1119 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1122 PrintTypeNoConst(param, type, false, true);
1123 classSym = FindClass(type);
1126 strcpy(className, "__ecereClass_");
1127 FullClassNameCat(className, classSym.string, true);
1129 MangleClassName(className);
1130 DeclareClass(classSym, className);
1132 if(param.kind == classType && !strcmp(param._class.string, "String"))
1134 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1135 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1138 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1142 eSystem_FindClass(privateModule, "ecere::net::DCOMClientObject"), "CallMethod", privateModule),
1143 "__ecereMethod___ecereNameSpace__ecere__net__DCOMClientObject_CallMethod");
1145 f.Printf(" if(DCOMClientObject::CallMethod(%d))\n", id++);
1147 for(param = method.dataType.params.first; param; param = param.next)
1149 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1151 if(!strcmp(param._class.string, "String"))
1153 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1154 f.Printf(" __ecereBuffer.Unserialize((StaticString)%s);\n", param.name);
1157 f.Printf(" __ecereBuffer.Unserialize(%s);\n", param.name);
1160 if(method.dataType.returnType.kind != voidType)
1162 if(method.dataType.returnType.kind == classType && !strcmp(method.dataType.returnType._class.string, "String"))
1164 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1165 f.Printf(" __ecereBuffer.Unserialize((StaticString)__ecereResult);\n");
1168 f.Printf(" __ecereBuffer.Unserialize(__ecereResult);\n");
1171 f.Printf(" __ecereBuffer.Free();\n");
1172 f.Printf(" delete this;\n");
1173 if(method.dataType.returnType.kind != voidType)
1175 f.Printf(" return __ecereResult;\n");
1181 next = (Method)((BTNode)method).next;
1182 while(next && ((next.type == virtualMethod) != doVirtual || (doVirtual && next.vid != vid)))
1185 next = (Method)((BTNode)next).next;
1186 if(!next && doVirtual)
1188 if(vid == _class.vTblSize)
1193 next = (Method)_class.methods.first;
1208 static void BindDCOMServer()
1210 bool mutexDeclared = false;
1212 for(_class = privateModule.classes.first; _class; _class = _class.next)
1214 if(_class.isRemote == 3) //)
1221 if(!dcomSymbols) dcomSymbols = TempFile { };
1224 DeclareClass(FindClass("ecere::net::DCOMServerObject"), "__ecereClass___ecereNameSpace__ecere__net__DCOMServerObject");
1227 for(_class = privateModule.classes.first; _class; _class = _class.next)
1229 if(_class.isRemote == 3) //2 && !strncmp(_class.fullName, "DCOMServer_", strlen("DCOMServer_")))
1235 f.Printf("class DCOM%s : ecere::net::DCOMServerObject\n", _class.fullName);
1236 // f.Printf("class DCOM%s\n", _class.fullName);
1239 f.Printf(" %s instance;\n", _class.fullName);
1240 f.Printf(" unsigned int id;\n");
1241 f.Printf(" SerialBuffer buffer { };\n");
1245 f.Printf(" DCOM%s()\n", _class.fullName);
1247 f.Printf(" instance = eInstance_New(class(%s));\n", _class.fullName);
1251 f.Printf(" virtual void CallMethod(uint __ecereMethodID, SerialBuffer __ecereBuffer)\n");
1253 f.Printf(" %s inst = (%s)instance;\n", _class.fullName, _class.fullName);
1254 f.Printf(" incref inst;\n");
1255 f.Printf(" switch(__ecereMethodID)\n");
1258 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1261 method.dataType = ProcessTypeString(method.dataTypeString, false);
1262 if(method.dataType && method.dataType.name)
1264 f.Printf(" case %d:\n", id++);
1268 if(method.dataType.returnType.kind != voidType)
1270 TypeName resultType;
1271 OldList * specs = MkList();
1273 char type[1024] = "";
1274 char className[1024];
1277 if(method.dataType.returnType.kind == classType)
1278 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1281 PrintTypeNoConst(method.dataType.returnType, type, false, true);
1282 classSym = FindClass(type);
1285 strcpy(className, "__ecereClass_");
1286 FullClassNameCat(className, classSym.string, true);
1287 MangleClassName(className);
1288 DeclareClass(classSym, className);
1290 PrintType(method.dataType.returnType, type, true, true);
1292 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1293 resultType = MkTypeName(specs, decl);
1296 OutputTypeName(resultType, f, false);
1300 for(param = method.dataType.params.first; param; param = param.next)
1302 if(param.kind == classType && !strcmp(param._class.string, "String"))
1304 // Hardcode 1024 chars max string for now
1305 f.Printf(" char %s[1024];\n", param.name);
1306 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1307 DeclareClass(FindClass("String"), "__ecereClass_String");
1311 TypeName paramTypeName;
1312 OldList * specs = MkList();
1314 char type[1024] = "";
1315 char className[1024];
1318 if(param.kind == classType)
1319 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1322 PrintTypeNoConst(param, type, false, true);
1323 classSym = FindClass(type);
1327 strcpy(className, "__ecereClass_");
1328 FullClassNameCat(className, classSym.string, true);
1329 MangleClassName(className);
1330 DeclareClass(classSym, className);
1332 PrintType(param, type, true, true);
1334 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier(param.name /*"__ecereResult"*/)));
1335 paramTypeName = MkTypeName(specs, decl);
1338 OutputTypeName(paramTypeName, f, false);
1345 for(param = method.dataType.params.first; param; param = param.next)
1347 f.Printf(" __ecereBuffer.Unserialize(");
1348 if(param.kind == classType && !strcmp(param._class.string, "String"))
1350 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1351 f.Printf("(StaticString)");
1358 if(method.dataType.returnType.kind != voidType)
1359 f.Printf("__ecereResult = ");
1361 // f.Printf("this.instance.%s(", method.name);
1362 f.Printf("((%s)instance).%s(", _class.fullName, method.name);
1364 for(param = method.dataType.params.first; param; param = param.next)
1368 f.Printf("%s", param.name);
1373 for(param = method.dataType.params.first; param; param = param.next)
1375 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1377 if(!strcmp(param._class.string, "String"))
1379 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1380 f.Printf(" __ecereBuffer.Serialize((StaticString)%s);\n", param.name);
1383 f.Printf(" __ecereBuffer.Serialize(%s);\n", param.name);
1386 if(method.dataType.returnType.kind != voidType)
1388 f.Printf(" __ecereBuffer.Serialize(__ecereResult);\n");
1391 for(param = method.dataType.params.first; param; param = param.next)
1393 if(param.kind == classType && strcmp(param._class.string, "String") && param._class.registered &&
1394 (param._class.registered.type == normalClass || param._class.registered.type == noHeadClass))
1396 f.Printf(" delete %s;\n", param.name);
1399 if(method.dataType.returnType.kind == classType && strcmp(method.dataType.returnType._class.string, "String") && method.dataType.returnType._class.registered &&
1400 (method.dataType.returnType._class.registered.type == normalClass || method.dataType.returnType._class.registered.type == noHeadClass))
1402 f.Printf(" delete __ecereResult;\n");
1406 f.Printf(" break;\n");
1411 f.Printf(" delete inst;\n");
1414 // *** VIRTUAL FUNCTIONS BINDINGS ***
1415 for(vid = _class.base.vTblSize; vid < _class.vTblSize; vid++)
1420 for(method = (Method)_class.methods.first; method; method = (Method)((BTNode)method).next)
1421 if(method.type == virtualMethod && method._class == _class && method.vid == vid)
1427 DeclareClass(FindClass("ecere::sys::Mutex"), "__ecereClass___ecereNameSpace__ecere__sys__Mutex");
1430 eSystem_FindClass(privateModule, "ecere::sys::Mutex"), "Wait", privateModule),
1431 "__ecereMethod___ecereNameSpace__ecere__sys__Mutex_Wait");
1434 eSystem_FindClass(privateModule, "ecere::sys::Mutex"), "Release", privateModule),
1435 "__ecereMethod___ecereNameSpace__ecere__sys__Mutex_Release");
1436 mutexDeclared = true;
1440 if(!method.dataType)
1441 method.dataType = ProcessTypeString(method.dataTypeString, false);
1443 if(method.dataType.name)
1445 f.Printf(" virtual %s\n", method.dataTypeString);
1450 f.Printf(" DCOM%s __ecereObject = (void *)_vTbl[-1];\n", _class.fullName);
1451 if(method.dataType.returnType.kind != voidType)
1453 TypeName resultType;
1454 OldList * specs = MkList();
1456 char type[1024] = "";
1457 char className[1024];
1460 if(method.dataType.returnType.kind == classType)
1461 classSym = method.dataType.returnType._class; // VERIFY THIS FindClass(method.dataType.returnType._class.string);
1464 PrintTypeNoConst(method.dataType.returnType, type, false, true);
1465 classSym = FindClass(type);
1469 strcpy(className, "__ecereClass_");
1470 FullClassNameCat(className, classSym.string, true);
1471 MangleClassName(className);
1472 DeclareClass(classSym, className);
1474 PrintType(method.dataType.returnType, type, true, true);
1476 decl = SpecDeclFromString(type, specs, MkDeclaratorIdentifier(MkIdentifier("__ecereResult")));
1477 resultType = MkTypeName(specs, decl);
1480 OutputTypeName(resultType, f, false);
1481 if(method.dataType.returnType.kind == structType)
1482 f.Printf(" = { 0 }");
1483 else if(method.dataType.returnType.kind == classType && method.dataType.returnType._class.registered && method.dataType.returnType._class.registered.type == structClass)
1490 f.Printf(" incref __ecereObject;\n");
1491 f.Printf(" __ecereMethod___ecereNameSpace__ecere__sys__Mutex_Wait(__ecereObject.mutex);\n");
1493 //f.Printf(" incref this;\n");
1494 for(param = method.dataType.params.first; param; param = param.next)
1496 char type[1024] = "";
1497 char className[1024];
1500 if(param.kind == classType)
1501 classSym = param._class; // VERIFY THIS FindClass(param._class.string);
1504 PrintTypeNoConst(param, type, false, true);
1505 classSym = FindClass(type);
1508 strcpy(className, "__ecereClass_");
1509 FullClassNameCat(className, classSym.string, true);
1510 MangleClassName(className);
1511 DeclareClass(classSym, className);
1513 if(param.kind == classType && !strcmp(param._class.string, "String"))
1515 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1516 f.Printf(" __ecereObject.argsBuffer.Serialize((StaticString)%s);\n", param.name);
1519 f.Printf(" __ecereObject.argsBuffer.Serialize(%s);\n", param.name);
1524 eSystem_FindClass(privateModule, "ecere::net::DCOMServerObject"), "CallVirtualMethod", privateModule),
1525 "__ecereMethod___ecereNameSpace__ecere__net__DCOMServerObject_CallVirtualMethod");
1527 // Check if this method needs to return anything (hasReturnValue)
1529 bool hasReturnValue = method.dataType.returnType.kind != voidType;
1532 for(param = method.dataType.params.first; param; param = param.next)
1534 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1536 hasReturnValue = true;
1541 f.Printf(" if(__ecereObject.CallVirtualMethod(%d, %s))\n", vid - _class.base.vTblSize,
1542 hasReturnValue ? "true" : "false");
1545 for(param = method.dataType.params.first; param; param = param.next)
1547 if(param.kind == classType && ((param._class && param._class.registered && param._class.registered.type == structClass) || !strcmp(param._class.string, "String")) && !param.constant)
1549 if(!strcmp(param._class.string, "String"))
1551 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1552 f.Printf(" __ecereObject.returnBuffer.Unserialize((StaticString)%s);\n", param.name);
1555 f.Printf(" __ecereObject.returnBuffer.Unserialize(%s);\n", param.name);
1558 if(method.dataType.returnType.kind != voidType)
1560 if(method.dataType.returnType.kind == classType && !strcmp(method.dataType.returnType._class.string, "String"))
1562 DeclareClass(FindClass("StaticString"), "__ecereClass_StaticString");
1563 f.Printf(" __ecereObject.returnBuffer.Unserialize((StaticString)__ecereResult);\n");
1566 f.Printf(" __ecereObject.returnBuffer.Unserialize(__ecereResult);\n");
1569 f.Printf(" else\n");
1570 f.Printf(" ((%s)this).%s::%s(", _class.fullName, _class.fullName, method.name);
1571 for(param = method.dataType.params.first; param; param = param.next)
1573 f.Printf("%s", param.name);
1574 if(param.next) f.Printf(", ");
1578 f.Printf(" __ecereObject.returnBuffer.Free();\n");
1579 f.Printf(" __ecereMethod___ecereNameSpace__ecere__sys__Mutex_Release(__ecereObject.mutex);\n");
1580 //f.Printf(" delete this;\n");
1581 f.Printf(" delete __ecereObject;\n");
1582 if(method.dataType.returnType.kind != voidType)
1584 f.Printf(" return __ecereResult;\n");
1589 /*if(vid < _class.vTblSize)
1600 class SymbolgenApp : Application
1605 char ** argv = null;
1610 char * output = null;
1613 disabledPooling = false;
1614 targetPlatform = GetRuntimePlatform();
1615 targetBits = GetHostBits();
1618 for(c = 0; c<this.argc; c++)
1620 char * arg = this.argv[c];
1621 int argLen = strlen(arg);
1623 argv = renew argv char *[argc + 1];
1624 argv[argc] = new char[argLen+1];
1625 strcpy(argv[argc], arg);
1627 while(argv[argc][argLen-1] == '\\' && c < this.argc-1)
1634 argv[argc] = renew argv[argc] char[argLen + len + 1];
1636 argv[argc][argLen-1] = ' ';
1637 strcpy(argv[argc] + argLen, arg);
1645 printf("\nArguments given:\n");
1646 for(c=1; c<argc; c++)
1647 printf(" %s", argv[c]);
1649 for(c=1; c<argc; c++)
1650 PrintLn("Arg", c, ": ", argv[c]);
1655 for(c = 1; c<argc; c++)
1657 char * arg = argv[c];
1660 if(!strcmp(arg + 1, "m32") || !strcmp(arg + 1, "m64"))
1662 targetBits = !strcmp(arg + 1, "m32") ? 32 : 64;
1664 else if(!strcmp(arg + 1, "t32") || !strcmp(arg + 1, "t64"))
1666 targetBits = !strcmp(arg + 1, "t32") ? 32 : 64;
1668 else if(!strcmp(arg+1, "o"))
1670 if(!output && c + 1 < argc)
1678 else if(!strcmp(arg, "-name"))
1682 strcpy(projectName, argv[c+1]);
1688 else if(!strcmp(arg, "-t"))
1691 targetPlatform = argv[c];
1695 else if(!strcmp(arg, "-outputpot"))
1697 else if(!strcmp(arg, "-disabled-pooling"))
1698 disabledPooling = true;
1699 else if(!strcmp(arg, "-console"))
1701 else if(!strcmp(arg, "-dynamiclib"))
1702 isDynamicLibrary = true;
1703 else if(!strcmp(arg, "-staticlib"))
1705 isDynamicLibrary = true; // TOFIX: unmixup
1706 isStaticLibrary = true;
1708 else if(!strcmp(arg, "-symbols"))
1712 SetSymbolsDir(argv[c+1]);
1725 printf($"Syntax:\n ecs [-t <target platform>] <input>[, <input>]* -o <output>\n");
1730 char ext[MAX_EXTENSION];
1731 char symbolModule[MAX_FILENAME];
1732 GetExtension(output, ext);
1733 GetLastDirectory(output, symbolModule);
1735 SetDefines(&::_defines);
1736 SetImports(&_imports);
1737 SetGlobalData(&globalData);
1738 SetExcludedSymbols(&_excludedSymbols);
1739 SetGlobalContext(theGlobalContext);
1740 SetTopContext(theGlobalContext);
1741 SetCurrentContext(theGlobalContext);
1742 SetTargetPlatform(targetPlatform);
1743 SetTargetBits(targetBits);
1744 SetInSymbolGen(true);
1746 privateModule = (Module)__ecere_COM_Initialize(true | (targetBits == sizeof(uintptr)*8 ? 0 : targetBits == 64 ? 2 : targetBits==32 ? 4 : 0) | 8, 1, null);
1747 SetPrivateModule(privateModule);
1748 mainModule = ModuleImport { };
1749 SetMainModule(mainModule);
1750 _imports.Add(mainModule);
1752 //if(!strcmp(ext, "c"))
1754 String symbolsDir = GetSymbolsDir();
1755 // Only generating .pot files when building from release.* directory for now
1756 //bool outputPot = symbolsDir && SearchString(symbolsDir, 0, "release.", false, false);
1757 Map<ContextStringPair, List<String> > intlStrings { };
1758 MapIterator<ContextStringPair, List<String>> it { map = intlStrings };
1760 for(c = 1; c<argc; c++)
1762 char * file = argv[c];
1769 if(!strcmp(file, "-c"))
1772 else if(file[0] == '@')
1773 f = FileOpen(&file[1], read);
1784 while(!count && f.GetLine(line, sizeof(line)))
1785 count = Tokenize(line, sizeof(tokens)/sizeof(tokens[0]), tokens, forArgsPassing);
1789 for(c = 0; c < count; c++)
1791 char ext[MAX_EXTENSION];
1793 GetExtension(file, ext);
1794 if(!strcmp(ext, "imp"))
1801 // What is this supposed to do?
1802 for(c = 1; c<argc; c++)
1804 char * file = argv[c];
1807 if(!strcmp(file, "-c"))
1812 for(c = 1; c<argc; c++)
1814 char * file = argv[c];
1821 // Don't even know what it does here?
1822 if(!strcmp(file, "-c"))
1825 else if(file[0] == '@')
1826 f = FileOpen(&file[1], read);
1838 while(!count && f.GetLine(line, sizeof(line)))
1839 count = Tokenize(line, sizeof(tokens)/sizeof(tokens[0]), tokens, forArgsPassing);
1843 for(c = 0; c < count; c++)
1845 char ext[MAX_EXTENSION];
1846 char moduleName[MAX_LOCATION];
1850 GetExtension(file, ext);
1852 GetLastDirectory(file, moduleName);
1853 StripExtension(moduleName);
1854 strcat(moduleName, ".ec");
1856 if(fstrcmp(moduleName, symbolModule) && (!strcmp(ext, "sym") || !strcmp(ext, "ec")))
1858 ImportedModule importedModule;
1859 ModuleInfo module { };
1860 char fileName[MAX_FILENAME];
1861 ::modules.Add(module);
1863 GetLastDirectory(file, fileName);
1865 module.name = CopyString(fileName);
1867 StripExtension(module.name);
1869 for(importedModule = ::_defines.first; importedModule; importedModule = importedModule.next)
1871 if(importedModule.type == moduleDefinition && !strcmpi(importedModule.name, module.name) && !(importedModule.importType == remoteImport))
1876 module.globalInstance = importedModule.globalInstance;
1879 importedModule = ImportedModule
1881 name = CopyString(module.name),
1882 type = moduleDefinition,
1883 importType = normalImport
1885 ::_defines.AddName(importedModule);
1887 module.globalInstance = LoadSymbols(file, normalImport, false);
1888 CheckDataRedefinitions();
1894 ChangeExtension(file, "bowl", fileName);
1895 f = FileOpen(fileName, read);
1898 static char line[65536];
1899 List<String> comments { };
1900 String msgid = null, msgstr = null, msgctxt = null;
1903 if(f.GetLine(line, sizeof(line)))
1906 TrimLSpaces(line, line);
1909 comments.Add(CopyString(line));
1911 else if(strstr(line, "msgid \"") == line)
1914 msgid = CopyString(line + 7);
1915 len = strlen(msgid);
1916 if(len) msgid[len-1] = 0;
1918 else if(strstr(line, "msgctxt \"") == line)
1921 msgctxt = CopyString(line + 9);
1922 len = strlen(msgctxt);
1923 if(len) msgctxt[len-1] = 0;
1925 else if(strstr(line, "msgstr \"") == line)
1928 msgstr = CopyString(line + 8);
1929 len = strlen(msgstr);
1930 if(len) msgstr[len-1] = 0;
1935 ContextStringPair pair { msgid, msgctxt };
1937 if(!it.Index(pair, false))
1939 msgid = null; msgctxt = null;
1940 intlStrings[pair] = comments;
1947 comments.RemoveAll();
1967 ComputeModuleClasses(privateModule);
1969 if(!isDynamicLibrary)
1971 // applicationClass = eSystem_FindClass(privateModule, "Application");
1973 thisAppClass = FindAppClass(&privateModule.application.publicNameSpace, true);
1975 thisAppClass = FindAppClass(&privateModule.application.privateNameSpace, true);
1977 thisAppClass = FindAppClass(&privateModule.application.publicNameSpace, false);
1979 thisAppClass = FindAppClass(&privateModule.application.privateNameSpace, false);
1981 thisAppClass = SearchAppClass_Module(privateModule);
1985 if(outputPot && intlStrings.count)
1988 char potFileName[MAX_LOCATION];
1989 //strcpy(potFileName, output);
1990 //StripExtension(potFileName);
1991 strcpy(potFileName, "locale");
1992 MakeDir(potFileName);
1993 PathCat(potFileName, projectName);
1994 ChangeExtension(potFileName, "pot", potFileName);
1995 potFile = FileOpen(potFileName, write);
1999 potFile.Puts("msgid \"\"\n");
2000 potFile.Puts("msgstr \"\"\n");
2001 potFile.Puts("\"Project-Id-Version: \\n\"\n");
2002 potFile.Puts("\"POT-Creation-Date: \\n\"\n");
2003 potFile.Puts("\"PO-Revision-Date: \\n\"\n");
2004 potFile.Puts("\"Last-Translator: \\n\"\n");
2005 potFile.Puts("\"Language-Team: \\n\"\n");
2006 potFile.Puts("\"MIME-Version: 1.0\\n\"\n");
2007 potFile.Puts("\"Content-Type: text/plain; charset=iso-8859-1\\n\"\n");
2008 potFile.Puts("\"Content-Transfer-Encoding: 8bit\\n\"\n");
2009 potFile.Puts("\"X-Poedit-Basepath: ../\\n\"\n");
2012 for(i : intlStrings)
2014 ContextStringPair pair = &i;
2015 List<String> comments = i;
2024 potFile.Puts("msgctxt \""); potFile.Puts(pair.context); potFile.Puts("\"\n");
2026 potFile.Puts("msgid \""); potFile.Puts(pair.string); potFile.Puts("\"\n");
2027 potFile.Puts("msgstr \""); potFile.Puts(pair.string); potFile.Puts("\"\n");
2037 FreeContext(theGlobalContext);
2038 FreeExcludedSymbols(_excludedSymbols);
2040 ::_defines.Free(FreeModuleDefine);
2041 _imports.Free(FreeModuleImport);
2043 //precompDefines.Free(FreeDefinition);
2045 FreeTypeData(privateModule);
2047 FreeGlobalData(globalData);
2049 delete privateModule;
2052 SetSymbolsDir(null); // Free symbols dir
2055 for(c = 0; c<argc; c++)