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(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 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, atoi(equal + 1));
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 *)setStmt, (void *)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 *)setStmt, (void *)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
504 exp = ParseExpressionString(line);
506 exp.destType = ProcessTypeString(info, false);
507 ProcessExpressionType(exp);
508 ComputeExpression(exp);
509 op = GetOperand(exp);
510 defaultArg.expression.ui64 = op.ui64;
517 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
518 if(!strcmp(line, "[Data member]")) info = (void *)TemplateMemberType::dataMember;
519 else if(!strcmp(line, "[Method]")) info = (void *)TemplateMemberType::method;
520 else if(!strcmp(line, "[Property]")) info = (void *)TemplateMemberType::prop;
522 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
523 if(regClass && strcmp(line, "[None]"))
525 defaultArg.memberString = CopyString(line);
530 eClass_AddTemplateParameter(regClass, name, type, info, defaultArg);
531 if(type == TemplateParameterType::type || type == TemplateParameterType::expression)
533 if(type == TemplateParameterType::type || type == TemplateParameterType::identifier)
534 delete defaultArg.dataTypeString;
537 eClass_DoneAddingTemplateParameters(regClass);
542 inheritanceAccess = publicAccess;
543 classType = normalClass;
550 else if(!strcmp(line, "[Defined Expressions]"))
555 if(!f.GetLine(line, sizeof(line))) break;
556 TrimLSpaces(line, line);
557 if(!strcmp(line, ".")) break;
558 if(!strcmp(line, "[Value]"))
560 f.GetLine(line, sizeof(line));
561 TrimLSpaces(line, line);
562 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
563 eSystem_RegisterDefine(name, line, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
565 else if(line[0] != '[')
571 else if(!strcmp(line, "[Defined Functions]"))
576 if(!f.GetLine(line, sizeof(line))) break;
577 TrimLSpaces(line, line);
578 if(!strcmp(line, ".")) break;
579 if(!strcmp(line, "[Type]"))
581 f.GetLine(line, sizeof(line));
582 TrimLSpaces(line, line);
583 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
584 eSystem_RegisterFunction(name, line, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
586 else if(line[0] != '[')
592 else if(!strcmp(line, "[Defined Data]"))
597 if(!f.GetLine(line, sizeof(line))) break;
598 TrimLSpaces(line, line);
599 if(!strcmp(line, ".")) break;
600 if(!strcmp(line, "[Type]"))
602 f.GetLine(line, sizeof(line));
603 TrimLSpaces(line, line);
605 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
608 NameSpace * nameSpace = globalData;
611 // Register Global Data
612 for(c = 0; name[c]; c++)
614 if(name[c] == '.' || (name[c] == ':' && name[c+1] == ':'))
616 NameSpace * newSpace;
618 char * spaceName = new char[c - start + 1];
619 strncpy(spaceName, name + start, c - start);
620 spaceName[c-start] = '\0';
622 newSpace = (NameSpace *)nameSpace->nameSpaces.FindString(spaceName);
625 newSpace = new0 NameSpace[1];
626 newSpace->classes.CompareKey = (void *)BinaryTree::CompareString;
627 newSpace->defines.CompareKey = (void *)BinaryTree::CompareString;
628 newSpace->functions.CompareKey = (void *)BinaryTree::CompareString;
629 newSpace->nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
630 newSpace->name = spaceName;
631 newSpace->parent = nameSpace;
632 nameSpace->nameSpaces.Add((BTNode)newSpace);
636 nameSpace = newSpace;
637 if(name[c] == ':') c++;
644 //if(!(data = (GlobalData)nameSpace->functions.FindString(name)))
645 data = (GlobalData)nameSpace->functions.FindString(name + start);
650 fullName = CopyString(name),
651 dataTypeString = CopyString(line),
652 module = privateModule
654 data.key = (uintptr)(data.fullName + start);
655 // Reusing functions here...
656 nameSpace->functions.Add((BTNode)data);
658 else if(strcmp(data.dataTypeString, line))
660 DataRedefinition redefinition { };
661 strcpy(redefinition.name, name);
662 strcpy(redefinition.type1, data.dataTypeString);
663 strcpy(redefinition.type2, line);
664 dataRedefinitions.Add(redefinition);
669 else if(line[0] != '[')
675 else if(!strcmp(line, "[Imported Modules]"))
677 ImportType moduleImportType = normalImport;
678 AccessMode importAccess = publicAccess;
681 if(!f.GetLine(line, sizeof(line))) break;
682 TrimLSpaces(line, line);
683 if(!strcmp(line, ".")) break;
684 if(!strcmp(line, "[Static]")) moduleImportType = staticImport;
685 else if(!strcmp(line, "[Remote]")) moduleImportType = remoteImport;
686 else if(!strcmp(line, "[Private]")) importAccess = privateAccess;
687 else if(line[0] != '[')
689 if(importType != preDeclImport && importType != comCheckImport)
690 ImportModule(line, moduleImportType, importAccess, loadDllOnly);
692 ImportModule(line, comCheckImport, importAccess, loadDllOnly);
693 if(!strcmp(line, "ecere"))
694 ecereImported = true;
695 moduleImportType = normalImport;
696 importAccess = publicAccess;
704 else if(importType != comCheckImport)
706 char sysFileName[MAX_LOCATION];
707 GetSystemPathBuffer(sysFileName, fileName);
708 Compiler_Error($"Couldn't open %s\n", sysFileName);
710 return globalInstance;
713 Map<String, List<Module> > loadedModules { };
715 // (Same function as in actual compiler)
716 public void ImportModule(char * name, ImportType importType, AccessMode importAccess, bool loadDllOnly)
718 ImportedModule module = null;
719 char moduleName[MAX_FILENAME];
721 strncpy(moduleName, name, MAX_FILENAME-1);
722 moduleName[MAX_FILENAME-1] = 0;
723 StripExtension(moduleName);
725 for(module = defines->first; module; module = module.next)
727 if(module.type == moduleDefinition && !strcmpi(module.name, moduleName))
730 if((!module || (module.dllOnly && !loadDllOnly)) && strlen(name) < MAX_FILENAME)
732 char ext[MAX_EXTENSION];
733 Module loadedModule = null;
734 char symFile[MAX_LOCATION];
737 GetExtension(name, ext);
739 strcpy(symFile, symbolsDir ? symbolsDir : "");
740 PathCat(symFile, name);
741 ChangeExtension(symFile, "sym", symFile);
743 if(!strcmp(ext, "dll") || !strcmp(ext, "dll") || !ext[0])
745 if(importType != comCheckImport)
751 module = ImportedModule
753 name = CopyString(moduleName),
754 type = moduleDefinition,
755 importType = importType,
756 importAccess = importAccess
758 precompDefines->Add(module);
760 module = ImportedModule
762 name = CopyString(moduleName),
763 type = moduleDefinition,
764 importType = importType,
765 importAccess = importAccess
767 defines->AddName(module);
769 module.dllOnly = loadDllOnly;
771 if(ext[0] || !FileExists(symFile))
773 bool skipLoad = false;
774 List<Module> list = null;
776 char file[MAX_FILENAME];
778 StripExtension(file);
780 // Load an extra instance of any shared module to ensure freeing up a
781 // module loaded in another file will not invalidate our objects.
782 if(!inCompiler && !inPreCompiler && !inSymbolGen)
784 MapIterator<String, List<Module> > it { map = loadedModules };
785 if(!it.Index(file, false))
787 Module firstModule = eModule_LoadStrict(__thisModule.application, file, importAccess);
791 list.Add(firstModule);
792 loadedModules[file] = list;
803 loadedModule = eModule_LoadStrict(privateModule, file, importAccess);
806 loadedModule.importType = importType;
807 module.dllOnly = false; // If this is truly a dll, no need to reload it again...
808 if(list) list.Add(loadedModule);
814 if(!loadedModule && (!strcmp(ext, "ec") || !strcmp(ext, "sym") || !ext[0]))
822 module = ImportedModule
824 name = CopyString(moduleName),
825 type = moduleDefinition,
826 importType = importType,
827 importAccess = importAccess
829 precompDefines->Add(module);
831 module = ImportedModule
833 name = CopyString(moduleName),
834 type = moduleDefinition,
835 importType = importType,
836 importAccess = importAccess
838 defines->AddName(module);
840 module.dllOnly = loadDllOnly;
845 if(inIDE && !FileExists(symFile) && sourceDirs /*ide.workspace*/ /*ide.projectView*/)
847 for(dir : sourceDirs)
849 char configDir[MAX_FILENAME];
850 strcpy(symFile, dir);
851 // PathCat(symFile, "Debug");
852 PathCat(symFile, "obj");
853 sprintf(configDir, "debug.%s", (GetRuntimePlatform() == win32) ? "win32" : "linux");
854 PathCat(symFile, configDir);
856 PathCat(symFile, name);
857 ChangeExtension(symFile, "sym", symFile);
858 if(FileExists(symFile))
863 // ADDED THIS HERE TO HELP FINDING SYMBOLS IN DOCUMENTOR... HURTS ANYTHING?
864 if(!FileExists(symFile))
866 char fileName[MAX_FILENAME];
867 GetLastDirectory(symFile, fileName);
868 strcpy(symFile, symbolsDir ? symbolsDir : "");
869 PathCat(symFile, fileName);
872 module.globalInstance = LoadSymbols(symFile, importType, loadDllOnly);
878 int FindIncludeFileID(char * includeFile)
881 for(c = 0; c<numIncludes; c++)
882 if(!fstrcmp(includes[c], includeFile))
887 int GetIncludeFileID(char * includeFile)
889 int found = FindIncludeFileID(includeFile);
893 includes = renew includes char *[numIncludes+1];
894 includes[numIncludes++] = CopyString(includeFile);
898 char * GetIncludeFileFromID(int id)
900 return includes[id-1];
903 // TODO: Add parameter to check system dirs before project dirs
904 File OpenIncludeFile(char * includeFile)
907 char location[MAX_FILENAME];
908 StripLastDirectory(sourceFileStack[(include_stack_ptr >= 0) ? include_stack_ptr : 0], location);
909 PathCat(location, includeFile);
910 file = FileOpen(location, read);
913 strcpy(sourceFileStack[include_stack_ptr + 1], location);
917 // TODO: Add support for project dirs as well as system dirs
918 NamedItem includeDir;
921 for(includeDir = includeDirs->first; includeDir; includeDir = includeDir.next)
923 strcpy(location, includeDir.name);
924 PathCat(location, includeFile);
925 file = FileOpen(location, read);
930 if(!file && sysIncludeDirs)
932 for(includeDir = sysIncludeDirs->first; includeDir; includeDir = includeDir.next)
934 strcpy(location, includeDir.name);
935 PathCat(location, includeFile);
936 file = FileOpen(location, read);
945 public void FreeIncludeFiles()
948 for(c = 0; c<numIncludes; c++)
954 public void FreeGlobalData(NameSpace globalDataList)
959 for(;(ns = (NameSpace *)globalDataList.nameSpaces.root);)
962 globalDataList.nameSpaces.Remove((BTNode)ns);
966 for(;(data = (GlobalData)globalDataList.functions.root);)
968 globalDataList.functions.Remove(data);
970 FreeSymbol(data.symbol);
971 FreeType(data.dataType);
972 delete data.fullName;
973 delete data.dataTypeString;
978 public void CheckDataRedefinitions()
980 // Delaying this because conflict with main parser...
981 DataRedefinition redefinition;
982 for(redefinition = dataRedefinitions.first; redefinition; redefinition = redefinition.next)
984 // Added this check to resolve namespaces...
985 Type type1 = ProcessTypeString(redefinition.type1, false);
986 Type type2 = ProcessTypeString(redefinition.type2, false);
987 char type1String[1024] = "";
988 char type2String[1024] = "";
989 PrintType(type1, type1String, false, true);
990 PrintType(type2, type2String, false, true);
991 if(strcmp(type1String, type2String))
992 Compiler_Warning($"Redefinition of %s (defining as %s, already defined as %s)\n", redefinition.name, type1String, type2String);
996 dataRedefinitions.Free(null);