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 OldList * precompDefines;
40 public void SetPrecompDefines(OldList * list) { precompDefines = list; }
42 public bool DummyMethod()
47 static void ReadDataMembers(Class regClass, DataMember member, File f)
51 int size = 0, bitPos = -1;
52 AccessMode memberAccess = publicAccess;
56 if(!f.GetLine(line, sizeof(line))) break;
57 TrimLSpaces(line, line);
58 if(!strcmp(line, ".")) break;
61 if(!strcmp(line, "[Size]"))
63 f.GetLine(line, sizeof(line));
64 TrimLSpaces(line, line);
65 size = strtol(line, null, 0);
67 else if(!strcmp(line, "[Pos]"))
69 f.GetLine(line, sizeof(line));
70 TrimLSpaces(line, line);
71 bitPos = strtol(line, null, 0);
73 else if(!strcmp(line, "[Public]"))
74 memberAccess = publicAccess;
75 else if(!strcmp(line, "[Private]"))
76 memberAccess = privateAccess;
77 else if(!strcmp(line, "[Type]"))
79 f.GetLine(line, sizeof(line));
80 TrimLSpaces(line, line);
84 if(!eMember_AddDataMember(member, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
85 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
87 else if(regClass && regClass.type == bitClass)
89 //eClass_AddBitMember(regClass, name, line[0] ? line : 0, size, bitPos);
90 BitMember member = eClass_AddBitMember(regClass, name, line[0] ? line : 0, 0, 0, memberAccess);
96 if(!eClass_AddDataMember(regClass, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
97 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.fullName);
100 else if(!strcmp(line, "[Struct]") || !strcmp(line, "[Union]"))
102 DataMember dataMember = (regClass || member) ? eMember_New((!strcmp(line, "[Union]")) ? unionMember : structMember, memberAccess) : null;
103 ReadDataMembers(null, dataMember, f);
106 if(!eMember_AddMember(member, dataMember))
107 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
111 if(!eClass_AddMember(regClass, dataMember))
112 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.name);
121 memberAccess = publicAccess;
126 // This should register the stuff only...
127 // But also call ImportModule
128 public bool LoadSymbols(const char * fileName, ImportType importType, bool loadDllOnly)
130 File f = FileOpenBuffered(fileName, read);
131 bool globalInstance = false;
134 bool ecereCOMModule = false;
135 char moduleName[MAX_LOCATION];
136 GetLastDirectory(fileName, moduleName);
137 // TEMP: UNTIL WE CAN HAVE PER SOURCE FILE PREPROCESSOR DEFINITIONS...
139 !(strcmpi(moduleName, "instance.sym") && strcmpi(moduleName, "BinaryTree.sym") &&
140 strcmpi(moduleName, "dataTypes.sym") && strcmpi(moduleName, "OldList.sym") &&
141 strcmpi(moduleName, "String.sym") && strcmpi(moduleName, "BTNode.sym") &&
142 strcmpi(moduleName, "Array.sym") && strcmpi(moduleName, "AVLTree.sym") &&
143 strcmpi(moduleName, "BuiltInContainer.sym") && strcmpi(moduleName, "Container.sym") &&
144 strcmpi(moduleName, "CustomAVLTree.sym") && strcmpi(moduleName, "LinkList.sym") &&
145 strcmpi(moduleName, "List.sym") && strcmpi(moduleName, "Map.sym") &&
146 strcmpi(moduleName, "Mutex.sym")))
147 ecereCOMModule = true;
152 if(!f.GetLine(line, sizeof(line))) break;
153 TrimLSpaces(line, line);
158 if(!strcmp(line, "[Global Instance]"))
159 globalInstance = true;
160 else if(!strcmp(line, "[Defined Classes]"))
162 Class regClass = null;
164 bool isRemote = false;
165 bool isStatic = false;
166 bool isWatchable = false;
167 ClassType classType = normalClass;
169 bool noExpansion = false;
170 AccessMode inheritanceAccess = publicAccess;
173 if(!f.GetLine(line, sizeof(line))) break;
174 TrimLSpaces(line, line);
175 if(!strcmp(line, ".")) break;
179 if(!strcmp(line, "[Remote]"))
181 else if(!strcmp(line, "[Static]"))
183 else if(!strcmp(line, "[Fixed]"))
185 else if(!strcmp(line, "[No Expansion]"))
187 else if(!strcmp(line, "[Watchable]"))
189 else if(!strcmp(line, "[Enum]"))
190 classType = enumClass;
191 else if(!strcmp(line, "[Bit]"))
192 classType = bitClass;
193 else if(!strcmp(line, "[Struct]"))
194 classType = structClass;
195 else if(!strcmp(line, "[Unit]"))
196 classType = unitClass;
197 else if(!strcmp(line, "[NoHead]"))
198 classType = noHeadClass;
199 else if(!strcmp(line, "[Base]") || !strcmp(line, "[Private Base]"))
201 if(!strcmp(line, "[Private Base]"))
202 inheritanceAccess = privateAccess;
204 f.GetLine(line, sizeof(line));
205 TrimLSpaces(line, line);
207 if(importType == preDeclImport)
209 if(isStatic || loadDllOnly || importType == preDeclImport || importType == comCheckImport)
211 else if(regClass = eSystem_FindClass(privateModule, name), !regClass || regClass.internalDecl || regClass.isRemote)
213 Symbol existingClass = FindClass(name);
214 const char * baseName = (classType == normalClass && importType == remoteImport && isRemote) ? "DCOMClientObject" : (!strcmp(line, "[None]") ? null : line);
215 //Symbol baseSymbol = baseName ? FindClass(baseName) : null;
216 //if(baseSymbol && !baseSymbol->registered)
217 /*if(classType != unitClass && classType != bitClass && classType != enumClass && baseName && !eSystem_FindClass(privateModule, baseName))
219 Compiler_Error($"Base class %s undefined\n", baseName);
226 if(!isRemote || (importType != remoteImport) || (!sourceFile || !strstr(sourceFile, ".main.ec")))
228 if(!regClass || regClass.internalDecl)
229 regClass = eSystem_RegisterClass(classType, name, isRemote ? null : baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
230 if(/*importType == Remote && */regClass && isRemote)
231 regClass.isRemote = (importType == remoteImport) ? 1 : 2;
235 if(importType == remoteImport)
237 char className[1024] = "DCOMClient_";
238 strcat(className, name);
240 existingClass = DeclClass(0, name);
241 regClass = eSystem_RegisterClass(classType, className, baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
244 regClass.isRemote = (importType == remoteImport) ? 1 : 3;
247 // Update templated classes
251 for(link = existingClass.templatedClasses.first; link; link = link.next)
253 Symbol symbol = link.data;
254 symbol.registered = eSystem_FindClass(privateModule, symbol.string);
259 regClass.fixed = true;
261 regClass.noExpansion = true;
265 eClass_DestructionWatchable(regClass);
266 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS...
270 if(regClass && existingClass)
272 existingClass.registered = regClass;
273 regClass.symbol = existingClass; // TESTING THIS
274 existingClass.id = MAXINT;
275 existingClass.idCode = MAXINT;
276 existingClass.imported = true;
278 existingClass.module = FindModule(regClass.module);
280 existingClass.module = mainModule;
293 else if(!strcmp(line, "[Enum Values]"))
299 if(!f.GetLine(line, sizeof(line))) break;
300 TrimLSpaces(line, line);
301 if(!strcmp(line, ".")) break;
305 equal = strchr(line, '=');
309 memcpy(name, line, (int)(equal - line));
310 name[equal - line] = '\0';
311 TrimLSpaces(name, name);
312 TrimRSpaces(name, name);
313 eEnum_AddFixedValue(regClass, name, strtoll(equal + 1, null, 0));
317 eEnum_AddValue(regClass, line);
322 else if(!strcmp(line, "[Defined Methods]"))
325 bool isVirtual = false;
326 AccessMode memberAccess = publicAccess;
329 if(!f.GetLine(line, sizeof(line))) break;
330 TrimLSpaces(line, line);
331 if(!strcmp(line, ".")) break;
334 if(!strcmp(line, "[Type]"))
336 f.GetLine(line, sizeof(line));
339 TrimLSpaces(line, line);
341 eClass_AddVirtualMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
343 eClass_AddMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
346 else if(!strcmp(line, "[Virtual]"))
348 else if(!strcmp(line, "[Public]"))
349 memberAccess = publicAccess;
350 else if(!strcmp(line, "[Private]"))
351 memberAccess = privateAccess;
357 memberAccess = publicAccess;
361 else if(!strcmp(line, "[Defined Properties]"))
364 bool setStmt = false, getStmt = false, isVirtual = false, conversion = false;
365 bool isWatchable = false;
366 AccessMode memberAccess = publicAccess;
369 if(!f.GetLine(line, sizeof(line))) break;
370 TrimLSpaces(line, line);
371 if(!strcmp(line, ".")) break;
374 if(!strcmp(line, "[Type]"))
376 // Set type , set , get
377 f.GetLine(line, sizeof(line));
378 TrimLSpaces(line, line);
381 Property prop = eClass_AddProperty(regClass, conversion ? null : name, line[0] ? line : 0, (void *)(uintptr)setStmt, (void *)(uintptr)getStmt, memberAccess);
384 prop.compiled = false;
387 eProperty_Watchable(prop);
388 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS
393 else if(!strcmp(line, "[Set]"))
395 else if(!strcmp(line, "[Get]"))
397 else if(!strcmp(line, "[Watchable]"))
399 else if(!strcmp(line, "[Public]"))
400 memberAccess = publicAccess;
401 else if(!strcmp(line, "[Private]"))
402 memberAccess = privateAccess;
403 else if(!strcmp(line, "[Conversion]"))
406 setStmt = getStmt = isVirtual = isWatchable = false;
412 setStmt = getStmt = isVirtual = conversion = isWatchable = false;
413 memberAccess = publicAccess;
417 else if(!strcmp(line, "[Defined Class Properties]"))
420 bool setStmt = false, getStmt = false;
423 if(!f.GetLine(line, sizeof(line))) break;
424 TrimLSpaces(line, line);
425 if(!strcmp(line, ".")) break;
428 if(!strcmp(line, "[Type]"))
430 // Set type , set , get
431 f.GetLine(line, sizeof(line));
432 TrimLSpaces(line, line);
435 eClass_AddClassProperty(regClass, name, line, (void *)(uintptr)setStmt, (void *)(uintptr)getStmt);
438 else if(!strcmp(line, "[Set]"))
440 else if(!strcmp(line, "[Get]"))
446 setStmt = getStmt = false;
450 else if(!strcmp(line, "[Defined Data Members]"))
452 ReadDataMembers(regClass, null, f);
454 else if(!strcmp(line, "[Template Parameters]"))
459 TemplateParameterType type = TemplateParameterType::type;
460 ClassTemplateArgument defaultArg { };
463 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
464 if(line[0] == '.') break;
467 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
468 if(!strcmp(line, "[Expression]")) type = expression;
469 else if(!strcmp(line, "[Identifier]")) type = identifier;
471 //printf("Inside template parameters\n");
474 case TemplateParameterType::type:
475 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
476 if(regClass && strcmp(line, "[None]"))
478 info = CopyString(line); // FIXME: MEMORY LEAK
481 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
482 // printf("%s\n", line);
484 if(regClass && strcmp(line, "[None]"))
486 defaultArg.dataTypeString = CopyString(line); // FIXME: MEMORY LEAK
490 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
491 // Data type string (reusing base)
492 if(regClass && strcmp(line, "[None]"))
494 info = CopyString(line); // FIXME: MEMORY LEAK
497 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
498 if(regClass && strcmp(line, "[None]"))
500 LexerBackup backup = pushLexer(); // We currently don't have a separate Lexer instance for TU/Type/Expression
505 exp = ParseExpressionString(line);
509 exp.destType = ProcessTypeString(info, false);
510 ProcessExpressionType(exp);
511 ComputeExpression(exp);
512 op = GetOperand(exp);
513 defaultArg.expression.ui64 = op.ui64;
521 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
522 if(!strcmp(line, "[Data member]")) info = (void *)TemplateMemberType::dataMember;
523 else if(!strcmp(line, "[Method]")) info = (void *)TemplateMemberType::method;
524 else if(!strcmp(line, "[Property]")) info = (void *)TemplateMemberType::prop;
526 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
527 if(regClass && strcmp(line, "[None]"))
529 defaultArg.memberString = CopyString(line);
534 eClass_AddTemplateParameter(regClass, name, type, info, defaultArg);
535 if(type == TemplateParameterType::type || type == TemplateParameterType::expression)
537 if(type == TemplateParameterType::type || type == TemplateParameterType::identifier)
538 delete (void *)defaultArg.dataTypeString;
541 eClass_DoneAddingTemplateParameters(regClass);
546 inheritanceAccess = publicAccess;
547 classType = normalClass;
554 else if(!strcmp(line, "[Defined Expressions]"))
559 if(!f.GetLine(line, sizeof(line))) break;
560 TrimLSpaces(line, line);
561 if(!strcmp(line, ".")) break;
562 if(!strcmp(line, "[Value]"))
564 f.GetLine(line, sizeof(line));
565 TrimLSpaces(line, line);
566 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
567 eSystem_RegisterDefine(name, line, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
569 else if(line[0] != '[')
575 else if(!strcmp(line, "[Defined Functions]"))
580 if(!f.GetLine(line, sizeof(line))) break;
581 TrimLSpaces(line, line);
582 if(!strcmp(line, ".")) break;
583 if(!strcmp(line, "[Type]"))
585 f.GetLine(line, sizeof(line));
586 TrimLSpaces(line, line);
587 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
588 eSystem_RegisterFunction(name, line, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
590 else if(line[0] != '[')
596 else if(!strcmp(line, "[Defined Data]"))
601 if(!f.GetLine(line, sizeof(line))) break;
602 TrimLSpaces(line, line);
603 if(!strcmp(line, ".")) break;
604 if(!strcmp(line, "[Type]"))
606 f.GetLine(line, sizeof(line));
607 TrimLSpaces(line, line);
609 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
612 NameSpace * nameSpace = globalData;
615 // Register Global Data
616 for(c = 0; name[c]; c++)
618 if(name[c] == '.' || (name[c] == ':' && name[c+1] == ':'))
620 NameSpace * newSpace;
622 char * spaceName = new char[c - start + 1];
623 strncpy(spaceName, name + start, c - start);
624 spaceName[c-start] = '\0';
626 newSpace = (NameSpace *)nameSpace->nameSpaces.FindString(spaceName);
629 newSpace = new0 NameSpace[1];
630 newSpace->classes.CompareKey = (void *)BinaryTree::CompareString;
631 newSpace->defines.CompareKey = (void *)BinaryTree::CompareString;
632 newSpace->functions.CompareKey = (void *)BinaryTree::CompareString;
633 newSpace->nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
634 newSpace->name = spaceName;
635 newSpace->parent = nameSpace;
636 nameSpace->nameSpaces.Add((BTNode)newSpace);
640 nameSpace = newSpace;
641 if(name[c] == ':') c++;
648 //if(!(data = (GlobalData)nameSpace->functions.FindString(name)))
649 data = (GlobalData)nameSpace->functions.FindString(name + start);
654 fullName = CopyString(name),
655 dataTypeString = CopyString(line),
656 module = privateModule
658 data.key = (uintptr)(data.fullName + start);
659 // Reusing functions here...
660 nameSpace->functions.Add((BTNode)data);
662 else if(strcmp(data.dataTypeString, line))
664 DataRedefinition redefinition { };
665 strcpy(redefinition.name, name);
666 strcpy(redefinition.type1, data.dataTypeString);
667 strcpy(redefinition.type2, line);
668 dataRedefinitions.Add(redefinition);
673 else if(line[0] != '[')
679 else if(!strcmp(line, "[Imported Modules]"))
681 ImportType moduleImportType = normalImport;
682 AccessMode importAccess = publicAccess;
685 if(!f.GetLine(line, sizeof(line))) break;
686 TrimLSpaces(line, line);
687 if(!strcmp(line, ".")) break;
688 if(!strcmp(line, "[Static]")) moduleImportType = staticImport;
689 else if(!strcmp(line, "[Remote]")) moduleImportType = remoteImport;
690 else if(!strcmp(line, "[Private]")) importAccess = privateAccess;
691 else if(line[0] != '[')
693 if(importType != preDeclImport && importType != comCheckImport)
694 ImportModule(line, moduleImportType, importAccess, loadDllOnly);
696 ImportModule(line, comCheckImport, importAccess, loadDllOnly);
697 if(!strcmp(line, "ecere"))
698 ecereImported = true;
699 moduleImportType = normalImport;
700 importAccess = publicAccess;
708 else if(importType != comCheckImport)
710 char sysFileName[MAX_LOCATION];
711 GetSystemPathBuffer(sysFileName, fileName);
712 Compiler_Error($"Couldn't open %s\n", sysFileName);
714 return globalInstance;
717 Map<String, List<Module> > loadedModules { };
719 // (Same function as in actual compiler)
720 public void ImportModule(const char * name, ImportType importType, AccessMode importAccess, bool loadDllOnly)
722 ImportedModule module = null;
723 char moduleName[MAX_LOCATION];
725 strncpy(moduleName, name, MAX_LOCATION-1);
726 moduleName[MAX_LOCATION-1] = 0;
727 StripExtension(moduleName);
729 for(module = defines->first; module; module = module.next)
731 if(module.type == moduleDefinition && !strcmpi(module.name, moduleName))
734 if((!module || (module.dllOnly && !loadDllOnly)) && strlen(name) < MAX_FILENAME)
736 char ext[MAX_EXTENSION];
737 Module loadedModule = null;
738 char symFile[MAX_LOCATION];
741 GetExtension(name, ext);
743 strcpy(symFile, symbolsDir ? symbolsDir : "");
744 PathCat(symFile, name);
745 ChangeExtension(symFile, "sym", symFile);
747 if(!strcmp(ext, "dll") || !strcmp(ext, "so") || !strcmp(ext, "dylib") || !ext[0])
749 if(importType != comCheckImport)
755 module = ImportedModule
757 name = CopyString(moduleName),
758 type = moduleDefinition,
759 importType = importType,
760 importAccess = importAccess
762 precompDefines->Add(module);
764 module = ImportedModule
766 name = CopyString(moduleName),
767 type = moduleDefinition,
768 importType = importType,
769 importAccess = importAccess
771 defines->AddName(module);
773 module.dllOnly = loadDllOnly;
775 if(ext[0] || !FileExists(symFile))
777 bool skipLoad = false;
778 List<Module> list = null;
780 char file[MAX_LOCATION];
782 StripExtension(file);
785 // Load an extra instance of any shared module to ensure freeing up a
786 // module loaded in another file will not invalidate our objects.
787 if(!inCompiler && !inPreCompiler && !inSymbolGen)
789 MapIterator<String, List<Module> > it { map = loadedModules };
790 if(!it.Index(name /*file*/, false))
792 Module firstModule = eModule_LoadStrict(__thisModule.application, name /*file*/, importAccess);
796 list.Add(firstModule);
797 loadedModules[name /*file*/] = list;
808 loadedModule = eModule_LoadStrict(privateModule, name /*file*/, importAccess);
811 loadedModule.importType = importType;
812 module.dllOnly = false; // If this is truly a dll, no need to reload it again...
813 if(list) list.Add(loadedModule);
819 if(!loadedModule && (!strcmp(ext, "ec") || !strcmp(ext, "sym") || !ext[0]))
827 module = ImportedModule
829 name = CopyString(moduleName),
830 type = moduleDefinition,
831 importType = importType,
832 importAccess = importAccess
834 precompDefines->Add(module);
836 module = ImportedModule
838 name = CopyString(moduleName),
839 type = moduleDefinition,
840 importType = importType,
841 importAccess = importAccess
843 defines->AddName(module);
845 module.dllOnly = loadDllOnly;
850 if(inIDE && !FileExists(symFile) && sourceDirs /*ide.workspace*/ /*ide.projectView*/)
852 for(dir : sourceDirs)
854 char configDir[MAX_FILENAME];
855 strcpy(symFile, dir);
856 // PathCat(symFile, "Debug");
857 PathCat(symFile, "obj");
858 sprintf(configDir, "debug.%s", (GetRuntimePlatform() == win32) ? "win32" : "linux");
859 PathCat(symFile, configDir);
861 PathCat(symFile, name);
862 ChangeExtension(symFile, "sym", symFile);
863 if(FileExists(symFile))
868 // ADDED THIS HERE TO HELP FINDING SYMBOLS IN DOCUMENTOR... HURTS ANYTHING?
869 if(!FileExists(symFile))
871 char fileName[MAX_FILENAME];
872 GetLastDirectory(symFile, fileName);
873 strcpy(symFile, symbolsDir ? symbolsDir : "");
874 PathCat(symFile, fileName);
877 module.globalInstance = LoadSymbols(symFile, importType, loadDllOnly);
883 int FindIncludeFileID(char * includeFile)
886 for(c = 0; c<numIncludes; c++)
887 if(!fstrcmp(includes[c], includeFile))
892 int GetIncludeFileID(char * includeFile)
894 int found = FindIncludeFileID(includeFile);
898 includes = renew includes char *[numIncludes+1];
899 includes[numIncludes++] = CopyString(includeFile);
903 char * GetIncludeFileFromID(int id)
905 return includes[id-1];
908 // TODO: Add parameter to check system dirs before project dirs
909 File OpenIncludeFile(char * includeFile)
912 char location[MAX_FILENAME];
913 StripLastDirectory(sourceFileStack[(include_stack_ptr >= 0) ? include_stack_ptr : 0], location);
914 PathCat(location, includeFile);
915 file = FileOpen(location, read);
918 strcpy(sourceFileStack[include_stack_ptr + 1], location);
922 // TODO: Add support for project dirs as well as system dirs
923 NamedItem includeDir;
926 for(includeDir = includeDirs->first; includeDir; includeDir = includeDir.next)
928 strcpy(location, includeDir.name);
929 PathCat(location, includeFile);
930 file = FileOpen(location, read);
935 if(!file && sysIncludeDirs)
937 for(includeDir = sysIncludeDirs->first; includeDir; includeDir = includeDir.next)
939 strcpy(location, includeDir.name);
940 PathCat(location, includeFile);
941 file = FileOpen(location, read);
950 public void FreeIncludeFiles()
953 for(c = 0; c<numIncludes; c++)
959 public void FreeGlobalData(NameSpace globalDataList)
964 for(;(ns = (NameSpace *)globalDataList.nameSpaces.root);)
967 globalDataList.nameSpaces.Remove((BTNode)ns);
968 delete (void *)ns->name;
971 for(;(data = (GlobalData)globalDataList.functions.root);)
973 globalDataList.functions.Remove(data);
975 FreeSymbol(data.symbol);
976 FreeType(data.dataType);
977 delete data.fullName;
978 delete data.dataTypeString;
983 public void CheckDataRedefinitions()
985 // Delaying this because conflict with main parser...
986 DataRedefinition redefinition;
987 for(redefinition = dataRedefinitions.first; redefinition; redefinition = redefinition.next)
989 // Added this check to resolve namespaces...
990 Type type1 = ProcessTypeString(redefinition.type1, false);
991 Type type2 = ProcessTypeString(redefinition.type2, false);
992 char type1String[1024] = "";
993 char type2String[1024] = "";
994 PrintType(type1, type1String, false, true);
995 PrintType(type2, type2String, false, true);
996 if(strcmp(type1String, type2String))
997 Compiler_Warning($"Redefinition of %s (defining as %s, already defined as %s)\n", redefinition.name, type1String, type2String);
1001 dataRedefinitions.Free(null);