6 NameSpace * globalData;
7 public void SetGlobalData(NameSpace * nameSpace) { globalData = nameSpace; }
9 OldList dataRedefinitions;
11 // #define MAX_INCLUDE_DEPTH 30
13 extern char sourceFileStack[MAX_INCLUDE_DEPTH][MAX_LOCATION];
14 extern int include_stack_ptr;
16 static int numIncludes;
17 static char ** includes;
20 public void SetInIDE(bool b) { inIDE = b; }
21 List<String> sourceDirs;
23 public void SetSourceDirs(List<String> list) { sourceDirs = list; }
25 OldList * includeDirs, * sysIncludeDirs;
27 public void SetIncludeDirs(OldList * list) { includeDirs = list; }
28 public void SetSysIncludeDirs(OldList * list) { sysIncludeDirs = list; }
30 // TOFIX: Declaration reordering error if right before above functions
31 // OldList * includeDirs, * sysIncludeDirs;
34 public void SetEcereImported(bool b) { ecereImported = b; } public bool GetEcereImported() { return ecereImported; }
35 bool inPreCompiler = false;
36 public void SetInPreCompiler(bool b) {inPreCompiler = b; }
37 bool inSymbolGen = false;
38 public void SetInSymbolGen(bool b) {inSymbolGen = b; }
39 bool inDocumentor = false;
40 public void SetInDocumentor(bool b) { inDocumentor = b; }
41 OldList * precompDefines;
42 public void SetPrecompDefines(OldList * list) { precompDefines = list; }
44 public bool DummyMethod()
49 static void ReadDataMembers(Class regClass, DataMember member, File f)
53 int size = 0, bitPos = -1;
54 AccessMode memberAccess = publicAccess;
58 if(!f.GetLine(line, sizeof(line))) break;
59 TrimLSpaces(line, line);
60 if(!strcmp(line, ".")) break;
63 if(!strcmp(line, "[Size]"))
65 f.GetLine(line, sizeof(line));
66 TrimLSpaces(line, line);
67 size = strtol(line, null, 0);
69 else if(!strcmp(line, "[Pos]"))
71 f.GetLine(line, sizeof(line));
72 TrimLSpaces(line, line);
73 bitPos = strtol(line, null, 0);
75 else if(!strcmp(line, "[Public]"))
76 memberAccess = publicAccess;
77 else if(!strcmp(line, "[Private]"))
78 memberAccess = privateAccess;
79 else if(!strcmp(line, "[Type]"))
81 f.GetLine(line, sizeof(line));
82 TrimLSpaces(line, line);
86 if(!eMember_AddDataMember(member, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
87 ;//Compiler_Error($"Member with same name (%s) already exists in member %s\n", name, member->name);
89 else if(regClass && regClass.type == bitClass)
91 //eClass_AddBitMember(regClass, name, line[0] ? line : 0, size, bitPos);
92 BitMember member = eClass_AddBitMember(regClass, name, line[0] ? line : 0, 0, 0, memberAccess);
101 if(!eClass_AddDataMember(regClass, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
102 ;//Compiler_Error($"Member with same name (%s) already exists in class %s\n", name, regClass.fullName);
105 else if(!strcmp(line, "[Struct]") || !strcmp(line, "[Union]"))
107 DataMember dataMember = (regClass || member) ? eMember_New((!strcmp(line, "[Union]")) ? unionMember : structMember, memberAccess) : null;
108 ReadDataMembers(null, dataMember, f);
111 if(!eMember_AddMember(member, dataMember))
112 ;//Compiler_Error($"Member with same name (%s) already exists in member %s\n", name, member->name);
116 if(!eClass_AddMember(regClass, dataMember))
117 ;//Compiler_Error($"Member with same name (%s) already exists in class %s\n", name, regClass.name);
126 memberAccess = publicAccess;
131 // This should register the stuff only...
132 // But also call ImportModule
133 public bool LoadSymbols(const char * fileName, ImportType importType, bool loadDllOnly)
135 File f = FileOpenBuffered(fileName, read);
136 bool globalInstance = false;
139 bool ecereCOMModule = false;
140 char moduleName[MAX_LOCATION];
141 GetLastDirectory(fileName, moduleName);
142 // TEMP: UNTIL WE CAN HAVE PER SOURCE FILE PREPROCESSOR DEFINITIONS...
144 !(strcmpi(moduleName, "instance.sym") && strcmpi(moduleName, "BinaryTree.sym") &&
145 strcmpi(moduleName, "dataTypes.sym") && strcmpi(moduleName, "OldList.sym") &&
146 strcmpi(moduleName, "String.sym") && strcmpi(moduleName, "BTNode.sym") &&
147 strcmpi(moduleName, "Array.sym") && strcmpi(moduleName, "AVLTree.sym") &&
148 strcmpi(moduleName, "BuiltInContainer.sym") && strcmpi(moduleName, "Container.sym") &&
149 strcmpi(moduleName, "CustomAVLTree.sym") && strcmpi(moduleName, "LinkList.sym") &&
150 strcmpi(moduleName, "List.sym") && strcmpi(moduleName, "Map.sym") &&
151 strcmpi(moduleName, "Mutex.sym")))
152 ecereCOMModule = true;
157 if(!f.GetLine(line, sizeof(line))) break;
158 TrimLSpaces(line, line);
163 if(!strcmp(line, "[Global Instance]"))
164 globalInstance = true;
165 else if(!strcmp(line, "[Defined Classes]"))
167 Class regClass = null;
169 bool isRemote = false;
170 bool isStatic = false;
171 bool isWatchable = false;
172 ClassType classType = normalClass;
174 bool noExpansion = false;
175 AccessMode inheritanceAccess = publicAccess;
178 if(!f.GetLine(line, sizeof(line))) break;
179 TrimLSpaces(line, line);
180 if(!strcmp(line, ".")) break;
184 if(!strcmp(line, "[Remote]"))
186 else if(!strcmp(line, "[Static]"))
188 else if(!strcmp(line, "[Fixed]"))
190 else if(!strcmp(line, "[No Expansion]"))
192 else if(!strcmp(line, "[Watchable]"))
194 else if(!strcmp(line, "[Enum]"))
195 classType = enumClass;
196 else if(!strcmp(line, "[Bit]"))
197 classType = bitClass;
198 else if(!strcmp(line, "[Struct]"))
199 classType = structClass;
200 else if(!strcmp(line, "[Unit]"))
201 classType = unitClass;
202 else if(!strcmp(line, "[NoHead]"))
203 classType = noHeadClass;
204 else if(!strcmp(line, "[Base]") || !strcmp(line, "[Private Base]"))
206 if(!strcmp(line, "[Private Base]"))
207 inheritanceAccess = privateAccess;
209 f.GetLine(line, sizeof(line));
210 TrimLSpaces(line, line);
212 if(importType == preDeclImport)
213 DeclClass(null, name);
214 if(isStatic || loadDllOnly || importType == preDeclImport || importType == comCheckImport)
216 else if(regClass = eSystem_FindClass(privateModule, name), !regClass || regClass.internalDecl || regClass.isRemote)
218 Symbol existingClass = FindClass(name);
219 const char * baseName = (classType == normalClass && importType == remoteImport && isRemote) ? "DCOMClientObject" : (!strcmp(line, "[None]") ? null : line);
220 //Symbol baseSymbol = baseName ? FindClass(baseName) : null;
221 //if(baseSymbol && !baseSymbol->registered)
222 /*if(classType != unitClass && classType != bitClass && classType != enumClass && baseName && !eSystem_FindClass(privateModule, baseName))
224 Compiler_Error($"Base class %s undefined\n", baseName);
231 if(!isRemote || (importType != remoteImport) || (!sourceFile || !strstr(sourceFile, ".main.ec")))
233 if(!regClass || regClass.internalDecl)
234 regClass = eSystem_RegisterClass(classType, name, isRemote ? null : baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
235 if(/*importType == Remote && */regClass && isRemote)
236 regClass.isRemote = (importType == remoteImport) ? 1 : 2;
240 if(importType == remoteImport)
242 char className[1024] = "DCOMClient_";
243 strcat(className, name);
245 existingClass = DeclClass(null, name);
246 regClass = eSystem_RegisterClass(classType, className, baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
249 regClass.isRemote = (importType == remoteImport) ? 1 : 3;
252 // Update templated classes
256 for(link = existingClass.templatedClasses.first; link; link = link.next)
258 Symbol symbol = link.data;
259 symbol.registered = eSystem_FindClass(privateModule, symbol.string);
264 regClass.fixed = true;
266 regClass.noExpansion = true;
270 eClass_DestructionWatchable(regClass);
271 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS...
274 if(regClass && existingClass)
276 existingClass.registered = regClass;
277 regClass.symbol = existingClass;
278 existingClass.notYetDeclared = true;
279 existingClass.imported = true;
281 existingClass.module = FindModule(regClass.module);
283 existingClass.module = mainModule;
296 else if(!strcmp(line, "[Enum Values]"))
302 if(!f.GetLine(line, sizeof(line))) break;
303 TrimLSpaces(line, line);
304 if(!strcmp(line, ".")) break;
308 equal = strchr(line, '=');
312 memcpy(name, line, (int)(equal - line));
313 name[equal - line] = '\0';
314 TrimLSpaces(name, name);
315 TrimRSpaces(name, name);
316 eEnum_AddFixedValue(regClass, name, strtoll(equal + 1, null, 0));
320 eEnum_AddValue(regClass, line);
325 else if(!strcmp(line, "[Defined Methods]"))
328 bool isVirtual = false;
329 AccessMode memberAccess = publicAccess;
332 if(!f.GetLine(line, sizeof(line))) break;
333 TrimLSpaces(line, line);
334 if(!strcmp(line, ".")) break;
337 if(!strcmp(line, "[Type]"))
339 f.GetLine(line, sizeof(line));
342 TrimLSpaces(line, line);
344 eClass_AddVirtualMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
346 eClass_AddMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
349 else if(!strcmp(line, "[Virtual]"))
351 else if(!strcmp(line, "[Public]"))
352 memberAccess = publicAccess;
353 else if(!strcmp(line, "[Private]"))
354 memberAccess = privateAccess;
360 memberAccess = publicAccess;
364 else if(!strcmp(line, "[Defined Properties]"))
367 bool setStmt = false, getStmt = false, isVirtual = false, conversion = false;
368 bool isWatchable = false;
369 AccessMode memberAccess = publicAccess;
372 if(!f.GetLine(line, sizeof(line))) break;
373 TrimLSpaces(line, line);
374 if(!strcmp(line, ".")) break;
377 if(!strcmp(line, "[Type]"))
379 // Set type , set , get
380 f.GetLine(line, sizeof(line));
381 TrimLSpaces(line, line);
384 Property prop = eClass_AddProperty(regClass, conversion ? null : name, line[0] ? line : 0, (void *)(uintptr)setStmt, (void *)(uintptr)getStmt, memberAccess);
387 prop.compiled = false;
390 eProperty_Watchable(prop);
391 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS
396 else if(!strcmp(line, "[Set]"))
398 else if(!strcmp(line, "[Get]"))
400 else if(!strcmp(line, "[Watchable]"))
402 else if(!strcmp(line, "[Public]"))
403 memberAccess = publicAccess;
404 else if(!strcmp(line, "[Private]"))
405 memberAccess = privateAccess;
406 else if(!strcmp(line, "[Conversion]"))
409 setStmt = getStmt = isVirtual = isWatchable = false;
415 setStmt = getStmt = isVirtual = conversion = isWatchable = false;
416 memberAccess = publicAccess;
420 else if(!strcmp(line, "[Defined Class Properties]"))
423 bool setStmt = false, getStmt = false;
426 if(!f.GetLine(line, sizeof(line))) break;
427 TrimLSpaces(line, line);
428 if(!strcmp(line, ".")) break;
431 if(!strcmp(line, "[Type]"))
433 // Set type , set , get
434 f.GetLine(line, sizeof(line));
435 TrimLSpaces(line, line);
438 eClass_AddClassProperty(regClass, name, line, (void *)(uintptr)setStmt, (void *)(uintptr)getStmt);
441 else if(!strcmp(line, "[Set]"))
443 else if(!strcmp(line, "[Get]"))
449 setStmt = getStmt = false;
453 else if(!strcmp(line, "[Defined Data Members]"))
455 ReadDataMembers(regClass, null, f);
457 else if(!strcmp(line, "[Template Parameters]"))
462 TemplateParameterType type = TemplateParameterType::type;
463 ClassTemplateArgument defaultArg { };
466 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
467 if(line[0] == '.') break;
470 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
471 if(!strcmp(line, "[Expression]")) type = expression;
472 else if(!strcmp(line, "[Identifier]")) type = identifier;
474 //printf("Inside template parameters\n");
477 case TemplateParameterType::type:
478 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
479 if(regClass && strcmp(line, "[None]"))
481 info = CopyString(line); // FIXME: MEMORY LEAK
484 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
485 // printf("%s\n", line);
487 if(regClass && strcmp(line, "[None]"))
489 defaultArg.dataTypeString = CopyString(line); // FIXME: MEMORY LEAK
493 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
494 // Data type string (reusing base)
495 if(regClass && strcmp(line, "[None]"))
497 info = CopyString(line); // FIXME: MEMORY LEAK
500 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
501 if(regClass && strcmp(line, "[None]"))
503 LexerBackup backup = pushLexer(); // We currently don't have a separate Lexer instance for TU/Type/Expression
508 exp = ParseExpressionString(line);
512 exp.destType = ProcessTypeString(info, false);
513 ProcessExpressionType(exp);
514 ComputeExpression(exp);
515 op = GetOperand(exp);
516 defaultArg.expression.ui64 = op.ui64;
524 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
525 if(!strcmp(line, "[Data member]")) info = (void *)TemplateMemberType::dataMember;
526 else if(!strcmp(line, "[Method]")) info = (void *)TemplateMemberType::method;
527 else if(!strcmp(line, "[Property]")) info = (void *)TemplateMemberType::prop;
529 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
530 if(regClass && strcmp(line, "[None]"))
532 defaultArg.memberString = CopyString(line);
537 eClass_AddTemplateParameter(regClass, name, type, info, defaultArg);
538 if(type == TemplateParameterType::type || type == TemplateParameterType::expression)
540 if(type == TemplateParameterType::type || type == TemplateParameterType::identifier)
541 delete (void *)defaultArg.dataTypeString;
544 eClass_DoneAddingTemplateParameters(regClass);
549 inheritanceAccess = publicAccess;
550 classType = normalClass;
557 else if(!strcmp(line, "[Defined Expressions]"))
562 if(!f.GetLine(line, sizeof(line))) break;
563 TrimLSpaces(line, line);
564 if(!strcmp(line, ".")) break;
565 if(!strcmp(line, "[Value]"))
567 f.GetLine(line, sizeof(line));
568 TrimLSpaces(line, line);
569 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
570 eSystem_RegisterDefine(name, line, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
572 else if(line[0] != '[')
578 else if(!strcmp(line, "[Defined Functions]"))
583 if(!f.GetLine(line, sizeof(line))) break;
584 TrimLSpaces(line, line);
585 if(!strcmp(line, ".")) break;
586 if(!strcmp(line, "[Type]"))
588 f.GetLine(line, sizeof(line));
589 TrimLSpaces(line, line);
590 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
591 eSystem_RegisterFunction(name, line, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
593 else if(line[0] != '[')
599 else if(!strcmp(line, "[Defined Data]"))
604 if(!f.GetLine(line, sizeof(line))) break;
605 TrimLSpaces(line, line);
606 if(!strcmp(line, ".")) break;
607 if(!strcmp(line, "[Type]"))
609 f.GetLine(line, sizeof(line));
610 TrimLSpaces(line, line);
612 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
615 NameSpace * nameSpace = globalData;
618 // Register Global Data
619 for(c = 0; name[c]; c++)
621 if(name[c] == '.' || (name[c] == ':' && name[c+1] == ':'))
623 NameSpace * newSpace;
625 char * spaceName = new char[c - start + 1];
626 strncpy(spaceName, name + start, c - start);
627 spaceName[c-start] = '\0';
629 newSpace = (NameSpace *)nameSpace->nameSpaces.FindString(spaceName);
632 newSpace = new0 NameSpace[1];
633 newSpace->classes.CompareKey = (void *)BinaryTree::CompareString;
634 newSpace->defines.CompareKey = (void *)BinaryTree::CompareString;
635 newSpace->functions.CompareKey = (void *)BinaryTree::CompareString;
636 newSpace->nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
637 newSpace->name = spaceName;
638 newSpace->parent = nameSpace;
639 nameSpace->nameSpaces.Add((BTNode)newSpace);
643 nameSpace = newSpace;
644 if(name[c] == ':') c++;
651 //if(!(data = (GlobalData)nameSpace->functions.FindString(name)))
652 data = (GlobalData)nameSpace->functions.FindString(name + start);
657 fullName = CopyString(name),
658 dataTypeString = CopyString(line),
659 module = privateModule
661 data.key = (uintptr)(data.fullName + start);
662 // Reusing functions here...
663 nameSpace->functions.Add((BTNode)data);
665 else if(strcmp(data.dataTypeString, line))
667 DataRedefinition redefinition { };
668 strcpy(redefinition.name, name);
669 strcpy(redefinition.type1, data.dataTypeString);
670 strcpy(redefinition.type2, line);
671 dataRedefinitions.Add(redefinition);
676 else if(line[0] != '[')
682 else if(!strcmp(line, "[Imported Modules]"))
684 ImportType moduleImportType = normalImport;
685 AccessMode importAccess = publicAccess;
688 if(!f.GetLine(line, sizeof(line))) break;
689 TrimLSpaces(line, line);
690 if(!strcmp(line, ".")) break;
691 if(!strcmp(line, "[Static]")) moduleImportType = staticImport;
692 else if(!strcmp(line, "[Remote]")) moduleImportType = remoteImport;
693 else if(!strcmp(line, "[Private]")) importAccess = privateAccess;
694 else if(line[0] != '[')
696 if(importType != preDeclImport && importType != comCheckImport)
697 ImportModule(line, moduleImportType, importAccess, loadDllOnly);
699 ImportModule(line, comCheckImport, importAccess, loadDllOnly);
700 if(!strcmp(line, "ecere"))
701 ecereImported = true;
702 moduleImportType = normalImport;
703 importAccess = publicAccess;
711 else if(importType != comCheckImport)
713 char sysFileName[MAX_LOCATION];
714 GetSystemPathBuffer(sysFileName, fileName);
715 Compiler_Error($"Couldn't open %s\n", sysFileName);
717 return globalInstance;
720 Map<String, List<Module> > loadedModules { };
722 // (Same function as in actual compiler)
723 public void ImportModule(const char * name, ImportType importType, AccessMode importAccess, bool loadDllOnly)
725 ImportedModule module = null;
726 char moduleName[MAX_LOCATION];
727 bool isSourceModule = false;
730 char sourceFileModule[MAX_FILENAME];
731 GetLastDirectory(sourceFile, sourceFileModule);
732 StripExtension(sourceFileModule);
733 if(!strcmpi(sourceFileModule, name))
734 isSourceModule = true;
737 strncpy(moduleName, name, MAX_LOCATION-1);
738 moduleName[MAX_LOCATION-1] = 0;
739 StripExtension(moduleName);
741 for(module = defines->first; module; module = module.next)
743 if(module.type == moduleDefinition && !strcmpi(module.name, moduleName) &&
744 ((importType == remoteImport) == (module.importType == remoteImport) || isSourceModule))
747 if((!module || (module.dllOnly && !loadDllOnly)) && strlen(name) < MAX_FILENAME)
749 char ext[MAX_EXTENSION];
750 Module loadedModule = null;
751 char symFile[MAX_LOCATION];
754 GetExtension(name, ext);
756 strcpy(symFile, symbolsDir ? symbolsDir : "");
757 PathCat(symFile, name);
758 ChangeExtension(symFile, "sym", symFile);
760 if(!strcmp(ext, "dll") || !strcmp(ext, "so") || !strcmp(ext, "dylib") || !ext[0])
762 if(importType != comCheckImport)
768 module = ImportedModule
770 name = CopyString(moduleName),
771 type = moduleDefinition,
772 importType = importType,
773 importAccess = importAccess
775 precompDefines->Add(module);
777 module = ImportedModule
779 name = CopyString(moduleName),
780 type = moduleDefinition,
781 importType = importType,
782 importAccess = importAccess
784 defines->AddName(module);
786 module.dllOnly = loadDllOnly;
788 if(ext[0] || !FileExists(symFile))
790 bool skipLoad = false;
791 List<Module> list = null;
793 char file[MAX_LOCATION];
795 StripExtension(file);
798 // Load an extra instance of any shared module to ensure freeing up a
799 // module loaded in another file will not invalidate our objects.
801 // Don't do this for Documentor, because files are loaded with full paths
802 // and won't be recognized as the same libecere that Documentor is actually using,
803 // and since this is loaded from the Documentor app module, it will invalidate classes in use.
804 // We only load one component app at a time for Documentor, so we do not need this trick.
805 if(!inCompiler && !inPreCompiler && !inSymbolGen && !inDocumentor)
807 MapIterator<String, List<Module> > it { map = loadedModules };
808 if(!it.Index(name /*file*/, false))
810 Module firstModule = eModule_LoadStrict(__thisModule.application, name /*file*/, importAccess);
814 list.Add(firstModule);
815 loadedModules[name /*file*/] = list;
826 loadedModule = eModule_LoadStrict(privateModule, name /*file*/, importAccess);
829 loadedModule.importType = importType;
830 module.dllOnly = false; // If this is truly a dll, no need to reload it again...
831 if(list) list.Add(loadedModule);
837 if(!loadedModule && (!strcmp(ext, "ec") || !strcmp(ext, "sym") || !ext[0]))
845 module = ImportedModule
847 name = CopyString(moduleName),
848 type = moduleDefinition,
849 importType = importType,
850 importAccess = importAccess
852 precompDefines->Add(module);
854 module = ImportedModule
856 name = CopyString(moduleName),
857 type = moduleDefinition,
858 importType = importType,
859 importAccess = importAccess
861 defines->AddName(module);
863 module.dllOnly = loadDllOnly;
868 if(inIDE && !FileExists(symFile) && sourceDirs /*ide.workspace*/ /*ide.projectView*/)
870 for(dir : sourceDirs)
872 char configDir[MAX_FILENAME];
873 strcpy(symFile, dir);
874 // PathCat(symFile, "Debug");
875 PathCat(symFile, "obj");
876 sprintf(configDir, "debug.%s", (__runtimePlatform == win32) ? "win32" : (__runtimePlatform == apple) ? "apple" : "linux");
877 PathCat(symFile, configDir);
879 PathCat(symFile, name);
880 ChangeExtension(symFile, "sym", symFile);
881 if(FileExists(symFile))
886 // ADDED THIS HERE TO HELP FINDING SYMBOLS IN DOCUMENTOR... HURTS ANYTHING?
887 if(!FileExists(symFile))
889 char fileName[MAX_FILENAME];
890 GetLastDirectory(symFile, fileName);
891 strcpy(symFile, symbolsDir ? symbolsDir : "");
892 PathCat(symFile, fileName);
895 module.globalInstance = LoadSymbols(symFile, importType, loadDllOnly);
901 int FindIncludeFileID(char * includeFile)
904 for(c = 0; c<numIncludes; c++)
905 if(!fstrcmp(includes[c], includeFile))
910 int GetIncludeFileID(char * includeFile)
912 int found = FindIncludeFileID(includeFile);
916 includes = renew includes char *[numIncludes+1];
917 includes[numIncludes++] = CopyString(includeFile);
921 char * GetIncludeFileFromID(int id)
923 return includes[id-1];
926 // TODO: Add parameter to check system dirs before project dirs
927 File OpenIncludeFile(char * includeFile)
930 char location[MAX_FILENAME];
931 StripLastDirectory(sourceFileStack[(include_stack_ptr >= 0) ? include_stack_ptr : 0], location);
932 PathCat(location, includeFile);
933 file = FileOpen(location, read);
936 strcpy(sourceFileStack[include_stack_ptr + 1], location);
940 // TODO: Add support for project dirs as well as system dirs
941 NamedItem includeDir;
944 for(includeDir = includeDirs->first; includeDir; includeDir = includeDir.next)
946 strcpy(location, includeDir.name);
947 PathCat(location, includeFile);
948 file = FileOpen(location, read);
953 if(!file && sysIncludeDirs)
955 for(includeDir = sysIncludeDirs->first; includeDir; includeDir = includeDir.next)
957 strcpy(location, includeDir.name);
958 PathCat(location, includeFile);
959 file = FileOpen(location, read);
968 public void FreeIncludeFiles()
971 for(c = 0; c<numIncludes; c++)
977 public void FreeGlobalData(NameSpace globalDataList)
982 for(;(ns = (NameSpace *)globalDataList.nameSpaces.root);)
985 globalDataList.nameSpaces.Remove((BTNode)ns);
986 delete (void *)ns->name;
989 for(;(data = (GlobalData)globalDataList.functions.root);)
991 globalDataList.functions.Remove(data);
993 FreeSymbol(data.symbol);
994 FreeType(data.dataType);
995 delete data.fullName;
996 delete data.dataTypeString;
1001 public void CheckDataRedefinitions()
1003 // Delaying this because conflict with main parser...
1004 DataRedefinition redefinition;
1005 for(redefinition = dataRedefinitions.first; redefinition; redefinition = redefinition.next)
1007 // Added this check to resolve namespaces...
1008 Type type1 = ProcessTypeString(redefinition.type1, false);
1009 Type type2 = ProcessTypeString(redefinition.type2, false);
1010 char type1String[1024] = "";
1011 char type2String[1024] = "";
1012 PrintType(type1, type1String, false, true);
1013 PrintType(type2, type2String, false, true);
1014 if(strcmp(type1String, type2String))
1015 Compiler_Warning($"Redefinition of %s (defining as %s, already defined as %s)\n", redefinition.name, type1String, type2String);
1019 dataRedefinitions.Free(null);