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 already exists %s 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);
98 if(!eClass_AddDataMember(regClass, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
99 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.fullName);
102 else if(!strcmp(line, "[Struct]") || !strcmp(line, "[Union]"))
104 DataMember dataMember = (regClass || member) ? eMember_New((!strcmp(line, "[Union]")) ? unionMember : structMember, memberAccess) : null;
105 ReadDataMembers(null, dataMember, f);
108 if(!eMember_AddMember(member, dataMember))
109 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
113 if(!eClass_AddMember(regClass, dataMember))
114 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.name);
123 memberAccess = publicAccess;
128 // This should register the stuff only...
129 // But also call ImportModule
130 public bool LoadSymbols(const char * fileName, ImportType importType, bool loadDllOnly)
132 File f = FileOpenBuffered(fileName, read);
133 bool globalInstance = false;
136 bool ecereCOMModule = false;
137 char moduleName[MAX_LOCATION];
138 GetLastDirectory(fileName, moduleName);
139 // TEMP: UNTIL WE CAN HAVE PER SOURCE FILE PREPROCESSOR DEFINITIONS...
141 !(strcmpi(moduleName, "instance.sym") && strcmpi(moduleName, "BinaryTree.sym") &&
142 strcmpi(moduleName, "dataTypes.sym") && strcmpi(moduleName, "OldList.sym") &&
143 strcmpi(moduleName, "String.sym") && strcmpi(moduleName, "BTNode.sym") &&
144 strcmpi(moduleName, "Array.sym") && strcmpi(moduleName, "AVLTree.sym") &&
145 strcmpi(moduleName, "BuiltInContainer.sym") && strcmpi(moduleName, "Container.sym") &&
146 strcmpi(moduleName, "CustomAVLTree.sym") && strcmpi(moduleName, "LinkList.sym") &&
147 strcmpi(moduleName, "List.sym") && strcmpi(moduleName, "Map.sym") &&
148 strcmpi(moduleName, "Mutex.sym")))
149 ecereCOMModule = true;
154 if(!f.GetLine(line, sizeof(line))) break;
155 TrimLSpaces(line, line);
160 if(!strcmp(line, "[Global Instance]"))
161 globalInstance = true;
162 else if(!strcmp(line, "[Defined Classes]"))
164 Class regClass = null;
166 bool isRemote = false;
167 bool isStatic = false;
168 bool isWatchable = false;
169 ClassType classType = normalClass;
171 bool noExpansion = false;
172 AccessMode inheritanceAccess = publicAccess;
175 if(!f.GetLine(line, sizeof(line))) break;
176 TrimLSpaces(line, line);
177 if(!strcmp(line, ".")) break;
181 if(!strcmp(line, "[Remote]"))
183 else if(!strcmp(line, "[Static]"))
185 else if(!strcmp(line, "[Fixed]"))
187 else if(!strcmp(line, "[No Expansion]"))
189 else if(!strcmp(line, "[Watchable]"))
191 else if(!strcmp(line, "[Enum]"))
192 classType = enumClass;
193 else if(!strcmp(line, "[Bit]"))
194 classType = bitClass;
195 else if(!strcmp(line, "[Struct]"))
196 classType = structClass;
197 else if(!strcmp(line, "[Unit]"))
198 classType = unitClass;
199 else if(!strcmp(line, "[NoHead]"))
200 classType = noHeadClass;
201 else if(!strcmp(line, "[Base]") || !strcmp(line, "[Private Base]"))
203 if(!strcmp(line, "[Private Base]"))
204 inheritanceAccess = privateAccess;
206 f.GetLine(line, sizeof(line));
207 TrimLSpaces(line, line);
209 if(importType == preDeclImport)
210 DeclClass(null, name);
211 if(isStatic || loadDllOnly || importType == preDeclImport || importType == comCheckImport)
213 else if(regClass = eSystem_FindClass(privateModule, name), !regClass || regClass.internalDecl || regClass.isRemote)
215 Symbol existingClass = FindClass(name);
216 const char * baseName = (classType == normalClass && importType == remoteImport && isRemote) ? "DCOMClientObject" : (!strcmp(line, "[None]") ? null : line);
217 //Symbol baseSymbol = baseName ? FindClass(baseName) : null;
218 //if(baseSymbol && !baseSymbol->registered)
219 /*if(classType != unitClass && classType != bitClass && classType != enumClass && baseName && !eSystem_FindClass(privateModule, baseName))
221 Compiler_Error($"Base class %s undefined\n", baseName);
228 if(!isRemote || (importType != remoteImport) || (!sourceFile || !strstr(sourceFile, ".main.ec")))
230 if(!regClass || regClass.internalDecl)
231 regClass = eSystem_RegisterClass(classType, name, isRemote ? null : baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
232 if(/*importType == Remote && */regClass && isRemote)
233 regClass.isRemote = (importType == remoteImport) ? 1 : 2;
237 if(importType == remoteImport)
239 char className[1024] = "DCOMClient_";
240 strcat(className, name);
242 existingClass = DeclClass(null, name);
243 regClass = eSystem_RegisterClass(classType, className, baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
246 regClass.isRemote = (importType == remoteImport) ? 1 : 3;
249 // Update templated classes
253 for(link = existingClass.templatedClasses.first; link; link = link.next)
255 Symbol symbol = link.data;
256 symbol.registered = eSystem_FindClass(privateModule, symbol.string);
261 regClass.fixed = true;
263 regClass.noExpansion = true;
267 eClass_DestructionWatchable(regClass);
268 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS...
271 if(regClass && existingClass)
273 existingClass.registered = regClass;
274 regClass.symbol = existingClass;
275 existingClass.notYetDeclared = true;
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.
788 // Don't do this for Documentor, because files are loaded with full paths
789 // and won't be recognized as the same libecere that Documentor is actually using,
790 // and since this is loaded from the Documentor app module, it will invalidate classes in use.
791 // We only load one component app at a time for Documentor, so we do not need this trick.
792 if(!inCompiler && !inPreCompiler && !inSymbolGen && !inDocumentor)
794 MapIterator<String, List<Module> > it { map = loadedModules };
795 if(!it.Index(name /*file*/, false))
797 Module firstModule = eModule_LoadStrict(__thisModule.application, name /*file*/, importAccess);
801 list.Add(firstModule);
802 loadedModules[name /*file*/] = list;
813 loadedModule = eModule_LoadStrict(privateModule, name /*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", (__runtimePlatform == win32) ? "win32" : (__runtimePlatform == apple) ? "apple" : "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);
940 if(!file && sysIncludeDirs)
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);
973 delete (void *)ns->name;
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);