5 NameSpace * globalData;
6 public void SetGlobalData(NameSpace * nameSpace) { globalData = nameSpace; }
8 OldList dataRedefinitions;
10 // #define MAX_INCLUDE_DEPTH 30
12 extern char sourceFileStack[MAX_INCLUDE_DEPTH][MAX_LOCATION];
13 extern int include_stack_ptr;
15 static int numIncludes;
16 static char ** includes;
19 public void SetInIDE(bool b) { inIDE = b; }
20 List<String> sourceDirs;
22 public void SetSourceDirs(List<String> list) { sourceDirs = list; }
24 OldList * includeDirs, * sysIncludeDirs;
26 public void SetIncludeDirs(OldList * list) { includeDirs = list; }
27 public void SetSysIncludeDirs(OldList * list) { sysIncludeDirs = list; }
29 // TOFIX: Declaration reordering error if right before above functions
30 // OldList * includeDirs, * sysIncludeDirs;
33 public void SetEcereImported(bool b) { ecereImported = b; } public bool GetEcereImported() { return ecereImported; }
34 bool inPreCompiler = false;
35 public void SetInPreCompiler(bool b) {inPreCompiler = b; }
36 bool inSymbolGen = false;
37 public void SetInSymbolGen(bool b) {inSymbolGen = b; }
38 OldList * precompDefines;
39 public void SetPrecompDefines(OldList * list) { precompDefines = list; }
41 public bool DummyMethod()
46 static void ReadDataMembers(Class regClass, DataMember member, File f)
50 int size = 0, bitPos = -1;
51 AccessMode memberAccess = publicAccess;
55 if(!f.GetLine(line, sizeof(line))) break;
56 TrimLSpaces(line, line);
57 if(!strcmp(line, ".")) break;
60 if(!strcmp(line, "[Size]"))
62 f.GetLine(line, sizeof(line));
63 TrimLSpaces(line, line);
64 size = strtol(line, null, 0);
66 else if(!strcmp(line, "[Pos]"))
68 f.GetLine(line, sizeof(line));
69 TrimLSpaces(line, line);
70 bitPos = strtol(line, null, 0);
72 else if(!strcmp(line, "[Public]"))
73 memberAccess = publicAccess;
74 else if(!strcmp(line, "[Private]"))
75 memberAccess = privateAccess;
76 else if(!strcmp(line, "[Type]"))
78 f.GetLine(line, sizeof(line));
79 TrimLSpaces(line, line);
83 if(!eMember_AddDataMember(member, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
84 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
86 else if(regClass && regClass.type == bitClass)
88 //eClass_AddBitMember(regClass, name, line[0] ? line : 0, size, bitPos);
89 BitMember member = eClass_AddBitMember(regClass, name, line[0] ? line : 0, 0, 0, memberAccess);
95 if(!eClass_AddDataMember(regClass, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
96 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.fullName);
99 else if(!strcmp(line, "[Struct]") || !strcmp(line, "[Union]"))
101 DataMember dataMember = (regClass || member) ? eMember_New((!strcmp(line, "[Union]")) ? unionMember : structMember, memberAccess) : null;
102 ReadDataMembers(null, dataMember, f);
105 if(!eMember_AddMember(member, dataMember))
106 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
110 if(!eClass_AddMember(regClass, dataMember))
111 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.name);
120 memberAccess = publicAccess;
125 // This should register the stuff only...
126 // But also call ImportModule
127 public bool LoadSymbols(char * fileName, ImportType importType, bool loadDllOnly)
129 File f = FileOpenBuffered(fileName, read);
130 bool globalInstance = false;
133 bool ecereCOMModule = false;
134 char moduleName[MAX_LOCATION];
135 GetLastDirectory(fileName, moduleName);
136 // TEMP: UNTIL WE CAN HAVE PER SOURCE FILE PREPROCESSOR DEFINITIONS...
138 !(strcmpi(moduleName, "instance.sym") && strcmpi(moduleName, "BinaryTree.sym") &&
139 strcmpi(moduleName, "dataTypes.sym") && strcmpi(moduleName, "OldList.sym") &&
140 strcmpi(moduleName, "String.sym") && strcmpi(moduleName, "BTNode.sym") &&
141 strcmpi(moduleName, "Array.sym") && strcmpi(moduleName, "AVLTree.sym") &&
142 strcmpi(moduleName, "BuiltInContainer.sym") && strcmpi(moduleName, "Container.sym") &&
143 strcmpi(moduleName, "CustomAVLTree.sym") && strcmpi(moduleName, "LinkList.sym") &&
144 strcmpi(moduleName, "List.sym") && strcmpi(moduleName, "Map.sym") &&
145 strcmpi(moduleName, "Mutex.sym")))
146 ecereCOMModule = true;
151 if(!f.GetLine(line, sizeof(line))) break;
152 TrimLSpaces(line, line);
157 if(!strcmp(line, "[Global Instance]"))
158 globalInstance = true;
159 else if(!strcmp(line, "[Defined Classes]"))
161 Class regClass = null;
163 bool isRemote = false;
164 bool isStatic = false;
165 bool isWatchable = false;
166 ClassType classType = normalClass;
168 bool noExpansion = false;
169 AccessMode inheritanceAccess = publicAccess;
172 if(!f.GetLine(line, sizeof(line))) break;
173 TrimLSpaces(line, line);
174 if(!strcmp(line, ".")) break;
178 if(!strcmp(line, "[Remote]"))
180 else if(!strcmp(line, "[Static]"))
182 else if(!strcmp(line, "[Fixed]"))
184 else if(!strcmp(line, "[No Expansion]"))
186 else if(!strcmp(line, "[Watchable]"))
188 else if(!strcmp(line, "[Enum]"))
189 classType = enumClass;
190 else if(!strcmp(line, "[Bit]"))
191 classType = bitClass;
192 else if(!strcmp(line, "[Struct]"))
193 classType = structClass;
194 else if(!strcmp(line, "[Unit]"))
195 classType = unitClass;
196 else if(!strcmp(line, "[NoHead]"))
197 classType = noHeadClass;
198 else if(!strcmp(line, "[Base]") || !strcmp(line, "[Private Base]"))
200 if(!strcmp(line, "[Private Base]"))
201 inheritanceAccess = privateAccess;
203 f.GetLine(line, sizeof(line));
204 TrimLSpaces(line, line);
206 if(importType == preDeclImport)
208 if(isStatic || loadDllOnly || importType == preDeclImport || importType == comCheckImport)
210 else if(regClass = eSystem_FindClass(privateModule, name), !regClass || regClass.internalDecl || regClass.isRemote)
212 Symbol existingClass = FindClass(name);
213 char * baseName = (classType == normalClass && importType == remoteImport && isRemote) ? "DCOMClientObject" : (!strcmp(line, "[None]") ? null : line);
214 //Symbol baseSymbol = baseName ? FindClass(baseName) : null;
215 //if(baseSymbol && !baseSymbol->registered)
216 /*if(classType != unitClass && classType != bitClass && classType != enumClass && baseName && !eSystem_FindClass(privateModule, baseName))
218 Compiler_Error($"Base class %s undefined\n", baseName);
225 if(!isRemote || (importType != remoteImport) || (!sourceFile || !strstr(sourceFile, ".main.ec")))
227 if(!regClass || regClass.internalDecl)
228 regClass = eSystem_RegisterClass(classType, name, isRemote ? null : baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
229 if(/*importType == Remote && */regClass && isRemote)
230 regClass.isRemote = (importType == remoteImport) ? 1 : 2;
234 if(importType == remoteImport)
236 char className[1024] = "DCOMClient_";
237 strcat(className, name);
239 existingClass = DeclClass(0, name);
240 regClass = eSystem_RegisterClass(classType, className, baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
243 regClass.isRemote = (importType == remoteImport) ? 1 : 3;
246 // Update templated classes
250 for(link = existingClass.templatedClasses.first; link; link = link.next)
252 Symbol symbol = link.data;
253 symbol.registered = eSystem_FindClass(privateModule, symbol.string);
258 regClass.fixed = true;
260 regClass.noExpansion = true;
264 eClass_DestructionWatchable(regClass);
265 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS...
269 if(regClass && existingClass)
271 existingClass.registered = regClass;
272 regClass.symbol = existingClass; // TESTING THIS
273 existingClass.id = MAXINT;
274 existingClass.idCode = MAXINT;
275 existingClass.imported = true;
277 existingClass.module = FindModule(regClass.module);
279 existingClass.module = mainModule;
292 else if(!strcmp(line, "[Enum Values]"))
298 if(!f.GetLine(line, sizeof(line))) break;
299 TrimLSpaces(line, line);
300 if(!strcmp(line, ".")) break;
304 equal = strchr(line, '=');
308 memcpy(name, line, (int)(equal - line));
309 name[equal - line] = '\0';
310 TrimLSpaces(name, name);
311 TrimRSpaces(name, name);
312 eEnum_AddFixedValue(regClass, name, atoi(equal + 1));
316 eEnum_AddValue(regClass, line);
321 else if(!strcmp(line, "[Defined Methods]"))
324 bool isVirtual = false;
325 AccessMode memberAccess = publicAccess;
328 if(!f.GetLine(line, sizeof(line))) break;
329 TrimLSpaces(line, line);
330 if(!strcmp(line, ".")) break;
333 if(!strcmp(line, "[Type]"))
335 f.GetLine(line, sizeof(line));
338 TrimLSpaces(line, line);
340 eClass_AddVirtualMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
342 eClass_AddMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
345 else if(!strcmp(line, "[Virtual]"))
347 else if(!strcmp(line, "[Public]"))
348 memberAccess = publicAccess;
349 else if(!strcmp(line, "[Private]"))
350 memberAccess = privateAccess;
356 memberAccess = publicAccess;
360 else if(!strcmp(line, "[Defined Properties]"))
363 bool setStmt = false, getStmt = false, isVirtual = false, conversion = false;
364 bool isWatchable = false;
365 AccessMode memberAccess = publicAccess;
368 if(!f.GetLine(line, sizeof(line))) break;
369 TrimLSpaces(line, line);
370 if(!strcmp(line, ".")) break;
373 if(!strcmp(line, "[Type]"))
375 // Set type , set , get
376 f.GetLine(line, sizeof(line));
377 TrimLSpaces(line, line);
380 Property prop = eClass_AddProperty(regClass, conversion ? null : name, line[0] ? line : 0, (void *)setStmt, (void *)getStmt, memberAccess);
383 prop.compiled = false;
386 eProperty_Watchable(prop);
387 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS
392 else if(!strcmp(line, "[Set]"))
394 else if(!strcmp(line, "[Get]"))
396 else if(!strcmp(line, "[Watchable]"))
398 else if(!strcmp(line, "[Public]"))
399 memberAccess = publicAccess;
400 else if(!strcmp(line, "[Private]"))
401 memberAccess = privateAccess;
402 else if(!strcmp(line, "[Conversion]"))
405 setStmt = getStmt = isVirtual = isWatchable = false;
411 setStmt = getStmt = isVirtual = conversion = isWatchable = false;
412 memberAccess = publicAccess;
416 else if(!strcmp(line, "[Defined Class Properties]"))
419 bool setStmt = false, getStmt = false;
422 if(!f.GetLine(line, sizeof(line))) break;
423 TrimLSpaces(line, line);
424 if(!strcmp(line, ".")) break;
427 if(!strcmp(line, "[Type]"))
429 // Set type , set , get
430 f.GetLine(line, sizeof(line));
431 TrimLSpaces(line, line);
434 eClass_AddClassProperty(regClass, name, line, (void *)setStmt, (void *)getStmt);
437 else if(!strcmp(line, "[Set]"))
439 else if(!strcmp(line, "[Get]"))
445 setStmt = getStmt = false;
449 else if(!strcmp(line, "[Defined Data Members]"))
451 ReadDataMembers(regClass, null, f);
453 else if(!strcmp(line, "[Template Parameters]"))
458 TemplateParameterType type = TemplateParameterType::type;
459 ClassTemplateArgument defaultArg { };
462 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
463 if(line[0] == '.') break;
466 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
467 if(!strcmp(line, "[Expression]")) type = expression;
468 else if(!strcmp(line, "[Identifier]")) type = identifier;
470 //printf("Inside template parameters\n");
473 case TemplateParameterType::type:
474 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
475 if(regClass && strcmp(line, "[None]"))
477 info = CopyString(line); // FIXME: MEMORY LEAK
480 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
481 // printf("%s\n", line);
483 if(regClass && strcmp(line, "[None]"))
485 defaultArg.dataTypeString = CopyString(line); // FIXME: MEMORY LEAK
489 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
490 // Data type string (reusing base)
491 if(regClass && strcmp(line, "[None]"))
493 info = CopyString(line); // FIXME: MEMORY LEAK
496 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
497 if(regClass && strcmp(line, "[None]"))
501 Location oldLocation = yylloc;
503 File backFileInput = fileInput;
507 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;
516 // TESTING THIS SCANNER RESUME STUFF
518 yylloc = oldLocation;
519 fileInput = backFileInput;
522 fileInput.Seek(yylloc.start.pos, start);
523 resetScannerPos(&yylloc.start);
529 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
530 if(!strcmp(line, "[Data member]")) info = (void *)TemplateMemberType::dataMember;
531 else if(!strcmp(line, "[Method]")) info = (void *)TemplateMemberType::method;
532 else if(!strcmp(line, "[Property]")) info = (void *)TemplateMemberType::prop;
534 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
535 if(regClass && strcmp(line, "[None]"))
537 defaultArg.memberString = CopyString(line);
542 eClass_AddTemplateParameter(regClass, name, type, info, defaultArg);
543 if(type == TemplateParameterType::type || type == TemplateParameterType::expression)
545 if(type == TemplateParameterType::type || type == TemplateParameterType::identifier)
546 delete defaultArg.dataTypeString;
549 eClass_DoneAddingTemplateParameters(regClass);
554 inheritanceAccess = publicAccess;
555 classType = normalClass;
562 else if(!strcmp(line, "[Defined Expressions]"))
567 if(!f.GetLine(line, sizeof(line))) break;
568 TrimLSpaces(line, line);
569 if(!strcmp(line, ".")) break;
570 if(!strcmp(line, "[Value]"))
572 f.GetLine(line, sizeof(line));
573 TrimLSpaces(line, line);
574 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
575 eSystem_RegisterDefine(name, line, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
577 else if(line[0] != '[')
583 else if(!strcmp(line, "[Defined Functions]"))
588 if(!f.GetLine(line, sizeof(line))) break;
589 TrimLSpaces(line, line);
590 if(!strcmp(line, ".")) break;
591 if(!strcmp(line, "[Type]"))
593 f.GetLine(line, sizeof(line));
594 TrimLSpaces(line, line);
595 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
596 eSystem_RegisterFunction(name, line, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
598 else if(line[0] != '[')
604 else if(!strcmp(line, "[Defined Data]"))
609 if(!f.GetLine(line, sizeof(line))) break;
610 TrimLSpaces(line, line);
611 if(!strcmp(line, ".")) break;
612 if(!strcmp(line, "[Type]"))
614 f.GetLine(line, sizeof(line));
615 TrimLSpaces(line, line);
617 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
620 NameSpace * nameSpace = globalData;
623 // Register Global Data
624 for(c = 0; name[c]; c++)
626 if(name[c] == '.' || (name[c] == ':' && name[c+1] == ':'))
628 NameSpace * newSpace;
630 char * spaceName = new char[c - start + 1];
631 strncpy(spaceName, name + start, c - start);
632 spaceName[c-start] = '\0';
634 newSpace = (NameSpace *)nameSpace->nameSpaces.FindString(spaceName);
637 newSpace = new0 NameSpace[1];
638 newSpace->classes.CompareKey = (void *)BinaryTree::CompareString;
639 newSpace->defines.CompareKey = (void *)BinaryTree::CompareString;
640 newSpace->functions.CompareKey = (void *)BinaryTree::CompareString;
641 newSpace->nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
642 newSpace->name = spaceName;
643 newSpace->parent = nameSpace;
644 nameSpace->nameSpaces.Add((BTNode)newSpace);
648 nameSpace = newSpace;
649 if(name[c] == ':') c++;
656 //if(!(data = (GlobalData)nameSpace->functions.FindString(name)))
657 data = (GlobalData)nameSpace->functions.FindString(name + start);
662 fullName = CopyString(name),
663 dataTypeString = CopyString(line),
664 module = privateModule
666 data.key = (uintptr)(data.fullName + start);
667 // Reusing functions here...
668 nameSpace->functions.Add((BTNode)data);
670 else if(strcmp(data.dataTypeString, line))
672 DataRedefinition redefinition { };
673 strcpy(redefinition.name, name);
674 strcpy(redefinition.type1, data.dataTypeString);
675 strcpy(redefinition.type2, line);
676 dataRedefinitions.Add(redefinition);
681 else if(line[0] != '[')
687 else if(!strcmp(line, "[Imported Modules]"))
689 ImportType moduleImportType = normalImport;
690 AccessMode importAccess = publicAccess;
693 if(!f.GetLine(line, sizeof(line))) break;
694 TrimLSpaces(line, line);
695 if(!strcmp(line, ".")) break;
696 if(!strcmp(line, "[Static]")) moduleImportType = staticImport;
697 else if(!strcmp(line, "[Remote]")) moduleImportType = remoteImport;
698 else if(!strcmp(line, "[Private]")) importAccess = privateAccess;
699 else if(line[0] != '[')
701 if(importType != preDeclImport && importType != comCheckImport)
702 ImportModule(line, moduleImportType, importAccess, loadDllOnly);
704 ImportModule(line, comCheckImport, importAccess, loadDllOnly);
705 if(!strcmp(line, "ecere"))
706 ecereImported = true;
707 moduleImportType = normalImport;
708 importAccess = publicAccess;
716 else if(importType != comCheckImport)
718 Compiler_Error($"Couldn't open %s\n", fileName);
720 return globalInstance;
723 Map<String, List<Module> > loadedModules { };
725 // (Same function as in actual compiler)
726 public void ImportModule(char * name, ImportType importType, AccessMode importAccess, bool loadDllOnly)
728 ImportedModule module = null;
729 char moduleName[MAX_FILENAME];
731 strncpy(moduleName, name, MAX_FILENAME-1);
732 moduleName[MAX_FILENAME-1] = 0;
733 StripExtension(moduleName);
735 for(module = defines->first; module; module = module.next)
737 if(module.type == moduleDefinition && !strcmpi(module.name, moduleName))
740 if((!module || (module.dllOnly && !loadDllOnly)) && strlen(name) < MAX_FILENAME)
742 char ext[MAX_EXTENSION];
743 Module loadedModule = null;
744 char symFile[MAX_LOCATION];
747 GetExtension(name, ext);
749 strcpy(symFile, symbolsDir ? symbolsDir : "");
750 PathCat(symFile, name);
751 ChangeExtension(symFile, "sym", symFile);
753 if(!strcmp(ext, "dll") || !strcmp(ext, "dll") || !ext[0])
755 if(importType != comCheckImport)
761 module = ImportedModule
763 name = CopyString(moduleName),
764 type = moduleDefinition,
765 importType = importType,
766 importAccess = importAccess
768 precompDefines->Add(module);
770 module = ImportedModule
772 name = CopyString(moduleName),
773 type = moduleDefinition,
774 importType = importType,
775 importAccess = importAccess
777 defines->AddName(module);
779 module.dllOnly = loadDllOnly;
781 if(ext[0] || !FileExists(symFile))
783 bool skipLoad = false;
784 List<Module> list = null;
786 char file[MAX_FILENAME];
788 StripExtension(file);
790 // Load an extra instance of any shared module to ensure freeing up a
791 // module loaded in another file will not invalidate our objects.
792 if(!inCompiler && !inPreCompiler && !inSymbolGen)
794 MapIterator<String, List<Module> > it { map = loadedModules };
795 if(!it.Index(file, false))
797 Module firstModule = eModule_LoadStrict(__thisModule, file, importAccess);
801 list.Add(firstModule);
802 loadedModules[file] = list;
813 loadedModule = eModule_LoadStrict(privateModule, file, importAccess);
816 loadedModule.importType = importType;
817 module.dllOnly = false; // If this is truly a dll, no need to reload it again...
818 if(list) list.Add(loadedModule);
824 if(!loadedModule && (!strcmp(ext, "ec") || !strcmp(ext, "sym") || !ext[0]))
832 module = ImportedModule
834 name = CopyString(moduleName),
835 type = moduleDefinition,
836 importType = importType,
837 importAccess = importAccess
839 precompDefines->Add(module);
841 module = ImportedModule
843 name = CopyString(moduleName),
844 type = moduleDefinition,
845 importType = importType,
846 importAccess = importAccess
848 defines->AddName(module);
850 module.dllOnly = loadDllOnly;
855 if(inIDE && !FileExists(symFile) && sourceDirs /*ide.workspace*/ /*ide.projectView*/)
857 for(dir : sourceDirs)
859 char configDir[MAX_FILENAME];
860 strcpy(symFile, dir);
861 // PathCat(symFile, "Debug");
862 PathCat(symFile, "obj");
863 sprintf(configDir, "debug.%s", (GetRuntimePlatform() == win32) ? "win32" : "linux");
864 PathCat(symFile, configDir);
866 PathCat(symFile, name);
867 ChangeExtension(symFile, "sym", symFile);
868 if(FileExists(symFile))
873 // ADDED THIS HERE TO HELP FINDING SYMBOLS IN DOCUMENTOR... HURTS ANYTHING?
874 if(!FileExists(symFile))
876 char fileName[MAX_FILENAME];
877 GetLastDirectory(symFile, fileName);
878 strcpy(symFile, symbolsDir ? symbolsDir : "");
879 PathCat(symFile, fileName);
882 module.globalInstance = LoadSymbols(symFile, importType, loadDllOnly);
888 int FindIncludeFileID(char * includeFile)
891 for(c = 0; c<numIncludes; c++)
892 if(!fstrcmp(includes[c], includeFile))
897 int GetIncludeFileID(char * includeFile)
899 int found = FindIncludeFileID(includeFile);
903 includes = renew includes char *[numIncludes+1];
904 includes[numIncludes++] = CopyString(includeFile);
908 char * GetIncludeFileFromID(int id)
910 return includes[id-1];
913 // TODO: Add parameter to check system dirs before project dirs
914 File OpenIncludeFile(char * includeFile)
917 char location[MAX_FILENAME];
918 StripLastDirectory(sourceFileStack[(include_stack_ptr >= 0) ? include_stack_ptr : 0], location);
919 PathCat(location, includeFile);
920 file = FileOpen(location, read);
923 strcpy(sourceFileStack[include_stack_ptr + 1], location);
927 // TODO: Add support for project dirs as well as system dirs
928 NamedItem includeDir;
931 for(includeDir = includeDirs->first; includeDir; includeDir = includeDir.next)
933 strcpy(location, includeDir.name);
934 PathCat(location, includeFile);
935 file = FileOpen(location, read);
942 for(includeDir = sysIncludeDirs->first; includeDir; includeDir = includeDir.next)
944 strcpy(location, includeDir.name);
945 PathCat(location, includeFile);
946 file = FileOpen(location, read);
955 public void FreeIncludeFiles()
958 for(c = 0; c<numIncludes; c++)
964 public void FreeGlobalData(NameSpace globalDataList)
969 for(;(ns = (NameSpace *)globalDataList.nameSpaces.root);)
972 globalDataList.nameSpaces.Remove((BTNode)ns);
976 for(;(data = (GlobalData)globalDataList.functions.root);)
978 globalDataList.functions.Remove(data);
980 FreeSymbol(data.symbol);
981 FreeType(data.dataType);
982 delete data.fullName;
983 delete data.dataTypeString;
988 public void CheckDataRedefinitions()
990 // Delaying this because conflict with main parser...
991 DataRedefinition redefinition;
992 for(redefinition = dataRedefinitions.first; redefinition; redefinition = redefinition.next)
994 // Added this check to resolve namespaces...
995 Type type1 = ProcessTypeString(redefinition.type1, false);
996 Type type2 = ProcessTypeString(redefinition.type2, false);
997 char type1String[1024] = "";
998 char type2String[1024] = "";
999 PrintType(type1, type1String, false, true);
1000 PrintType(type2, type2String, false, true);
1001 if(strcmp(type1String, type2String))
1002 Compiler_Warning($"Redefinition of %s (defining as %s, already defined as %s)\n", redefinition.name, type1String, type2String);
1006 dataRedefinitions.Free(null);