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);
101 if(!eClass_AddDataMember(regClass, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
102 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.fullName);
105 else if(!strcmp(line, "[Struct]") || !strcmp(line, "[Union]"))
107 DataMember dataMember = (regClass || member) ? eMember_New((!strcmp(line, "[Union]")) ? unionMember : structMember, memberAccess) : null;
108 ReadDataMembers(null, dataMember, f);
111 if(!eMember_AddMember(member, dataMember))
112 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
116 if(!eClass_AddMember(regClass, dataMember))
117 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.name);
126 memberAccess = publicAccess;
131 // This should register the stuff only...
132 // But also call ImportModule
133 public bool LoadSymbols(const char * fileName, ImportType importType, bool loadDllOnly)
135 File f = FileOpenBuffered(fileName, read);
136 bool globalInstance = false;
139 bool ecereCOMModule = false;
140 char moduleName[MAX_LOCATION];
141 GetLastDirectory(fileName, moduleName);
142 // TEMP: UNTIL WE CAN HAVE PER SOURCE FILE PREPROCESSOR DEFINITIONS...
144 !(strcmpi(moduleName, "instance.sym") && strcmpi(moduleName, "BinaryTree.sym") &&
145 strcmpi(moduleName, "dataTypes.sym") && strcmpi(moduleName, "OldList.sym") &&
146 strcmpi(moduleName, "String.sym") && strcmpi(moduleName, "BTNode.sym") &&
147 strcmpi(moduleName, "Array.sym") && strcmpi(moduleName, "AVLTree.sym") &&
148 strcmpi(moduleName, "BuiltInContainer.sym") && strcmpi(moduleName, "Container.sym") &&
149 strcmpi(moduleName, "CustomAVLTree.sym") && strcmpi(moduleName, "LinkList.sym") &&
150 strcmpi(moduleName, "List.sym") && strcmpi(moduleName, "Map.sym") &&
151 strcmpi(moduleName, "Mutex.sym")))
152 ecereCOMModule = true;
157 if(!f.GetLine(line, sizeof(line))) break;
158 TrimLSpaces(line, line);
163 if(!strcmp(line, "[Global Instance]"))
164 globalInstance = true;
165 else if(!strcmp(line, "[Defined Classes]"))
167 Class regClass = null;
169 bool isRemote = false;
170 bool isStatic = false;
171 bool isWatchable = false;
172 ClassType classType = normalClass;
174 bool noExpansion = false;
175 AccessMode inheritanceAccess = publicAccess;
178 if(!f.GetLine(line, sizeof(line))) break;
179 TrimLSpaces(line, line);
180 if(!strcmp(line, ".")) break;
184 if(!strcmp(line, "[Remote]"))
186 else if(!strcmp(line, "[Static]"))
188 else if(!strcmp(line, "[Fixed]"))
190 else if(!strcmp(line, "[No Expansion]"))
192 else if(!strcmp(line, "[Watchable]"))
194 else if(!strcmp(line, "[Enum]"))
195 classType = enumClass;
196 else if(!strcmp(line, "[Bit]"))
197 classType = bitClass;
198 else if(!strcmp(line, "[Struct]"))
199 classType = structClass;
200 else if(!strcmp(line, "[Unit]"))
201 classType = unitClass;
202 else if(!strcmp(line, "[NoHead]"))
203 classType = noHeadClass;
204 else if(!strcmp(line, "[Base]") || !strcmp(line, "[Private Base]"))
206 if(!strcmp(line, "[Private Base]"))
207 inheritanceAccess = privateAccess;
209 f.GetLine(line, sizeof(line));
210 TrimLSpaces(line, line);
212 if(importType == preDeclImport)
213 DeclClass(null, name);
214 if(isStatic || loadDllOnly || importType == preDeclImport || importType == comCheckImport)
216 else if(regClass = eSystem_FindClass(privateModule, name), !regClass || regClass.internalDecl || regClass.isRemote)
218 Symbol existingClass = FindClass(name);
219 const char * baseName = (classType == normalClass && importType == remoteImport && isRemote) ? "DCOMClientObject" : (!strcmp(line, "[None]") ? null : line);
220 //Symbol baseSymbol = baseName ? FindClass(baseName) : null;
221 //if(baseSymbol && !baseSymbol->registered)
222 /*if(classType != unitClass && classType != bitClass && classType != enumClass && baseName && !eSystem_FindClass(privateModule, baseName))
224 Compiler_Error($"Base class %s undefined\n", baseName);
231 if(!isRemote || (importType != remoteImport) || (!sourceFile || !strstr(sourceFile, ".main.ec")))
233 if(!regClass || regClass.internalDecl)
234 regClass = eSystem_RegisterClass(classType, name, isRemote ? null : baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
235 if(/*importType == Remote && */regClass && isRemote)
236 regClass.isRemote = (importType == remoteImport) ? 1 : 2;
240 if(importType == remoteImport)
242 char className[1024] = "DCOMClient_";
243 strcat(className, name);
245 existingClass = DeclClass(null, name);
246 regClass = eSystem_RegisterClass(classType, className, baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
249 regClass.isRemote = (importType == remoteImport) ? 1 : 3;
252 // Update templated classes
256 for(link = existingClass.templatedClasses.first; link; link = link.next)
258 Symbol symbol = link.data;
259 symbol.registered = eSystem_FindClass(privateModule, symbol.string);
264 regClass.fixed = true;
266 regClass.noExpansion = true;
270 eClass_DestructionWatchable(regClass);
271 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS...
274 if(regClass && existingClass)
276 existingClass.registered = regClass;
277 regClass.symbol = existingClass;
278 existingClass.notYetDeclared = true;
279 existingClass.imported = true;
281 existingClass.module = FindModule(regClass.module);
283 existingClass.module = mainModule;
296 else if(!strcmp(line, "[Enum Values]"))
302 if(!f.GetLine(line, sizeof(line))) break;
303 TrimLSpaces(line, line);
304 if(!strcmp(line, ".")) break;
308 equal = strchr(line, '=');
312 memcpy(name, line, (int)(equal - line));
313 name[equal - line] = '\0';
314 TrimLSpaces(name, name);
315 TrimRSpaces(name, name);
316 eEnum_AddFixedValue(regClass, name, strtoll(equal + 1, null, 0));
320 eEnum_AddValue(regClass, line);
325 else if(!strcmp(line, "[Defined Methods]"))
328 bool isVirtual = false;
329 AccessMode memberAccess = publicAccess;
332 if(!f.GetLine(line, sizeof(line))) break;
333 TrimLSpaces(line, line);
334 if(!strcmp(line, ".")) break;
337 if(!strcmp(line, "[Type]"))
339 f.GetLine(line, sizeof(line));
342 TrimLSpaces(line, line);
344 eClass_AddVirtualMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
346 eClass_AddMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
349 else if(!strcmp(line, "[Virtual]"))
351 else if(!strcmp(line, "[Public]"))
352 memberAccess = publicAccess;
353 else if(!strcmp(line, "[Private]"))
354 memberAccess = privateAccess;
360 memberAccess = publicAccess;
364 else if(!strcmp(line, "[Defined Properties]"))
367 bool setStmt = false, getStmt = false, isVirtual = false, conversion = false;
368 bool isWatchable = false;
369 AccessMode memberAccess = publicAccess;
372 if(!f.GetLine(line, sizeof(line))) break;
373 TrimLSpaces(line, line);
374 if(!strcmp(line, ".")) break;
377 if(!strcmp(line, "[Type]"))
379 // Set type , set , get
380 f.GetLine(line, sizeof(line));
381 TrimLSpaces(line, line);
384 Property prop = eClass_AddProperty(regClass, conversion ? null : name, line[0] ? line : 0, (void *)(uintptr)setStmt, (void *)(uintptr)getStmt, memberAccess);
387 prop.compiled = false;
390 eProperty_Watchable(prop);
391 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS
396 else if(!strcmp(line, "[Set]"))
398 else if(!strcmp(line, "[Get]"))
400 else if(!strcmp(line, "[Watchable]"))
402 else if(!strcmp(line, "[Public]"))
403 memberAccess = publicAccess;
404 else if(!strcmp(line, "[Private]"))
405 memberAccess = privateAccess;
406 else if(!strcmp(line, "[Conversion]"))
409 setStmt = getStmt = isVirtual = isWatchable = false;
415 setStmt = getStmt = isVirtual = conversion = isWatchable = false;
416 memberAccess = publicAccess;
420 else if(!strcmp(line, "[Defined Class Properties]"))
423 bool setStmt = false, getStmt = false;
426 if(!f.GetLine(line, sizeof(line))) break;
427 TrimLSpaces(line, line);
428 if(!strcmp(line, ".")) break;
431 if(!strcmp(line, "[Type]"))
433 // Set type , set , get
434 f.GetLine(line, sizeof(line));
435 TrimLSpaces(line, line);
438 eClass_AddClassProperty(regClass, name, line, (void *)(uintptr)setStmt, (void *)(uintptr)getStmt);
441 else if(!strcmp(line, "[Set]"))
443 else if(!strcmp(line, "[Get]"))
449 setStmt = getStmt = false;
453 else if(!strcmp(line, "[Defined Data Members]"))
455 ReadDataMembers(regClass, null, f);
457 else if(!strcmp(line, "[Template Parameters]"))
462 TemplateParameterType type = TemplateParameterType::type;
463 ClassTemplateArgument defaultArg { };
466 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
467 if(line[0] == '.') break;
470 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
471 if(!strcmp(line, "[Expression]")) type = expression;
472 else if(!strcmp(line, "[Identifier]")) type = identifier;
474 //printf("Inside template parameters\n");
477 case TemplateParameterType::type:
478 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
479 if(regClass && strcmp(line, "[None]"))
481 info = CopyString(line); // FIXME: MEMORY LEAK
484 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
485 // printf("%s\n", line);
487 if(regClass && strcmp(line, "[None]"))
489 defaultArg.dataTypeString = CopyString(line); // FIXME: MEMORY LEAK
493 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
494 // Data type string (reusing base)
495 if(regClass && strcmp(line, "[None]"))
497 info = CopyString(line); // FIXME: MEMORY LEAK
500 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
501 if(regClass && strcmp(line, "[None]"))
503 LexerBackup backup = pushLexer(); // We currently don't have a separate Lexer instance for TU/Type/Expression
508 exp = ParseExpressionString(line);
512 exp.destType = ProcessTypeString(info, false);
513 ProcessExpressionType(exp);
514 ComputeExpression(exp);
515 op = GetOperand(exp);
516 defaultArg.expression.ui64 = op.ui64;
524 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
525 if(!strcmp(line, "[Data member]")) info = (void *)TemplateMemberType::dataMember;
526 else if(!strcmp(line, "[Method]")) info = (void *)TemplateMemberType::method;
527 else if(!strcmp(line, "[Property]")) info = (void *)TemplateMemberType::prop;
529 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
530 if(regClass && strcmp(line, "[None]"))
532 defaultArg.memberString = CopyString(line);
537 eClass_AddTemplateParameter(regClass, name, type, info, defaultArg);
538 if(type == TemplateParameterType::type || type == TemplateParameterType::expression)
540 if(type == TemplateParameterType::type || type == TemplateParameterType::identifier)
541 delete (void *)defaultArg.dataTypeString;
544 eClass_DoneAddingTemplateParameters(regClass);
549 inheritanceAccess = publicAccess;
550 classType = normalClass;
557 else if(!strcmp(line, "[Defined Expressions]"))
562 if(!f.GetLine(line, sizeof(line))) break;
563 TrimLSpaces(line, line);
564 if(!strcmp(line, ".")) break;
565 if(!strcmp(line, "[Value]"))
567 f.GetLine(line, sizeof(line));
568 TrimLSpaces(line, line);
569 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
570 eSystem_RegisterDefine(name, line, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
572 else if(line[0] != '[')
578 else if(!strcmp(line, "[Defined Functions]"))
583 if(!f.GetLine(line, sizeof(line))) break;
584 TrimLSpaces(line, line);
585 if(!strcmp(line, ".")) break;
586 if(!strcmp(line, "[Type]"))
588 f.GetLine(line, sizeof(line));
589 TrimLSpaces(line, line);
590 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
591 eSystem_RegisterFunction(name, line, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
593 else if(line[0] != '[')
599 else if(!strcmp(line, "[Defined Data]"))
604 if(!f.GetLine(line, sizeof(line))) break;
605 TrimLSpaces(line, line);
606 if(!strcmp(line, ".")) break;
607 if(!strcmp(line, "[Type]"))
609 f.GetLine(line, sizeof(line));
610 TrimLSpaces(line, line);
612 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
615 NameSpace * nameSpace = globalData;
618 // Register Global Data
619 for(c = 0; name[c]; c++)
621 if(name[c] == '.' || (name[c] == ':' && name[c+1] == ':'))
623 NameSpace * newSpace;
625 char * spaceName = new char[c - start + 1];
626 strncpy(spaceName, name + start, c - start);
627 spaceName[c-start] = '\0';
629 newSpace = (NameSpace *)nameSpace->nameSpaces.FindString(spaceName);
632 newSpace = new0 NameSpace[1];
633 newSpace->classes.CompareKey = (void *)BinaryTree::CompareString;
634 newSpace->defines.CompareKey = (void *)BinaryTree::CompareString;
635 newSpace->functions.CompareKey = (void *)BinaryTree::CompareString;
636 newSpace->nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
637 newSpace->name = spaceName;
638 newSpace->parent = nameSpace;
639 nameSpace->nameSpaces.Add((BTNode)newSpace);
643 nameSpace = newSpace;
644 if(name[c] == ':') c++;
651 //if(!(data = (GlobalData)nameSpace->functions.FindString(name)))
652 data = (GlobalData)nameSpace->functions.FindString(name + start);
657 fullName = CopyString(name),
658 dataTypeString = CopyString(line),
659 module = privateModule
661 data.key = (uintptr)(data.fullName + start);
662 // Reusing functions here...
663 nameSpace->functions.Add((BTNode)data);
665 else if(strcmp(data.dataTypeString, line))
667 DataRedefinition redefinition { };
668 strcpy(redefinition.name, name);
669 strcpy(redefinition.type1, data.dataTypeString);
670 strcpy(redefinition.type2, line);
671 dataRedefinitions.Add(redefinition);
676 else if(line[0] != '[')
682 else if(!strcmp(line, "[Imported Modules]"))
684 ImportType moduleImportType = normalImport;
685 AccessMode importAccess = publicAccess;
688 if(!f.GetLine(line, sizeof(line))) break;
689 TrimLSpaces(line, line);
690 if(!strcmp(line, ".")) break;
691 if(!strcmp(line, "[Static]")) moduleImportType = staticImport;
692 else if(!strcmp(line, "[Remote]")) moduleImportType = remoteImport;
693 else if(!strcmp(line, "[Private]")) importAccess = privateAccess;
694 else if(line[0] != '[')
696 if(importType != preDeclImport && importType != comCheckImport)
697 ImportModule(line, moduleImportType, importAccess, loadDllOnly);
699 ImportModule(line, comCheckImport, importAccess, loadDllOnly);
700 if(!strcmp(line, "ecere"))
701 ecereImported = true;
702 moduleImportType = normalImport;
703 importAccess = publicAccess;
711 else if(importType != comCheckImport)
713 char sysFileName[MAX_LOCATION];
714 GetSystemPathBuffer(sysFileName, fileName);
715 Compiler_Error($"Couldn't open %s\n", sysFileName);
717 return globalInstance;
720 Map<String, List<Module> > loadedModules { };
722 // (Same function as in actual compiler)
723 public void ImportModule(const char * name, ImportType importType, AccessMode importAccess, bool loadDllOnly)
725 ImportedModule module = null;
726 char moduleName[MAX_LOCATION];
728 strncpy(moduleName, name, MAX_LOCATION-1);
729 moduleName[MAX_LOCATION-1] = 0;
730 StripExtension(moduleName);
732 for(module = defines->first; module; module = module.next)
734 if(module.type == moduleDefinition && !strcmpi(module.name, moduleName))
737 if((!module || (module.dllOnly && !loadDllOnly)) && strlen(name) < MAX_FILENAME)
739 char ext[MAX_EXTENSION];
740 Module loadedModule = null;
741 char symFile[MAX_LOCATION];
744 GetExtension(name, ext);
746 strcpy(symFile, symbolsDir ? symbolsDir : "");
747 PathCat(symFile, name);
748 ChangeExtension(symFile, "sym", symFile);
750 if(!strcmp(ext, "dll") || !strcmp(ext, "so") || !strcmp(ext, "dylib") || !ext[0])
752 if(importType != comCheckImport)
758 module = ImportedModule
760 name = CopyString(moduleName),
761 type = moduleDefinition,
762 importType = importType,
763 importAccess = importAccess
765 precompDefines->Add(module);
767 module = ImportedModule
769 name = CopyString(moduleName),
770 type = moduleDefinition,
771 importType = importType,
772 importAccess = importAccess
774 defines->AddName(module);
776 module.dllOnly = loadDllOnly;
778 if(ext[0] || !FileExists(symFile))
780 bool skipLoad = false;
781 List<Module> list = null;
783 char file[MAX_LOCATION];
785 StripExtension(file);
788 // Load an extra instance of any shared module to ensure freeing up a
789 // module loaded in another file will not invalidate our objects.
791 // Don't do this for Documentor, because files are loaded with full paths
792 // and won't be recognized as the same libecere that Documentor is actually using,
793 // and since this is loaded from the Documentor app module, it will invalidate classes in use.
794 // We only load one component app at a time for Documentor, so we do not need this trick.
795 if(!inCompiler && !inPreCompiler && !inSymbolGen && !inDocumentor)
797 MapIterator<String, List<Module> > it { map = loadedModules };
798 if(!it.Index(name /*file*/, false))
800 Module firstModule = eModule_LoadStrict(__thisModule.application, name /*file*/, importAccess);
804 list.Add(firstModule);
805 loadedModules[name /*file*/] = list;
816 loadedModule = eModule_LoadStrict(privateModule, name /*file*/, importAccess);
819 loadedModule.importType = importType;
820 module.dllOnly = false; // If this is truly a dll, no need to reload it again...
821 if(list) list.Add(loadedModule);
827 if(!loadedModule && (!strcmp(ext, "ec") || !strcmp(ext, "sym") || !ext[0]))
835 module = ImportedModule
837 name = CopyString(moduleName),
838 type = moduleDefinition,
839 importType = importType,
840 importAccess = importAccess
842 precompDefines->Add(module);
844 module = ImportedModule
846 name = CopyString(moduleName),
847 type = moduleDefinition,
848 importType = importType,
849 importAccess = importAccess
851 defines->AddName(module);
853 module.dllOnly = loadDllOnly;
858 if(inIDE && !FileExists(symFile) && sourceDirs /*ide.workspace*/ /*ide.projectView*/)
860 for(dir : sourceDirs)
862 char configDir[MAX_FILENAME];
863 strcpy(symFile, dir);
864 // PathCat(symFile, "Debug");
865 PathCat(symFile, "obj");
866 sprintf(configDir, "debug.%s", (__runtimePlatform == win32) ? "win32" : (__runtimePlatform == apple) ? "apple" : "linux");
867 PathCat(symFile, configDir);
869 PathCat(symFile, name);
870 ChangeExtension(symFile, "sym", symFile);
871 if(FileExists(symFile))
876 // ADDED THIS HERE TO HELP FINDING SYMBOLS IN DOCUMENTOR... HURTS ANYTHING?
877 if(!FileExists(symFile))
879 char fileName[MAX_FILENAME];
880 GetLastDirectory(symFile, fileName);
881 strcpy(symFile, symbolsDir ? symbolsDir : "");
882 PathCat(symFile, fileName);
885 module.globalInstance = LoadSymbols(symFile, importType, loadDllOnly);
891 int FindIncludeFileID(char * includeFile)
894 for(c = 0; c<numIncludes; c++)
895 if(!fstrcmp(includes[c], includeFile))
900 int GetIncludeFileID(char * includeFile)
902 int found = FindIncludeFileID(includeFile);
906 includes = renew includes char *[numIncludes+1];
907 includes[numIncludes++] = CopyString(includeFile);
911 char * GetIncludeFileFromID(int id)
913 return includes[id-1];
916 // TODO: Add parameter to check system dirs before project dirs
917 File OpenIncludeFile(char * includeFile)
920 char location[MAX_FILENAME];
921 StripLastDirectory(sourceFileStack[(include_stack_ptr >= 0) ? include_stack_ptr : 0], location);
922 PathCat(location, includeFile);
923 file = FileOpen(location, read);
926 strcpy(sourceFileStack[include_stack_ptr + 1], location);
930 // TODO: Add support for project dirs as well as system dirs
931 NamedItem includeDir;
934 for(includeDir = includeDirs->first; includeDir; includeDir = includeDir.next)
936 strcpy(location, includeDir.name);
937 PathCat(location, includeFile);
938 file = FileOpen(location, read);
943 if(!file && sysIncludeDirs)
945 for(includeDir = sysIncludeDirs->first; includeDir; includeDir = includeDir.next)
947 strcpy(location, includeDir.name);
948 PathCat(location, includeFile);
949 file = FileOpen(location, read);
958 public void FreeIncludeFiles()
961 for(c = 0; c<numIncludes; c++)
967 public void FreeGlobalData(NameSpace globalDataList)
972 for(;(ns = (NameSpace *)globalDataList.nameSpaces.root);)
975 globalDataList.nameSpaces.Remove((BTNode)ns);
976 delete (void *)ns->name;
979 for(;(data = (GlobalData)globalDataList.functions.root);)
981 globalDataList.functions.Remove(data);
983 FreeSymbol(data.symbol);
984 FreeType(data.dataType);
985 delete data.fullName;
986 delete data.dataTypeString;
991 public void CheckDataRedefinitions()
993 // Delaying this because conflict with main parser...
994 DataRedefinition redefinition;
995 for(redefinition = dataRedefinitions.first; redefinition; redefinition = redefinition.next)
997 // Added this check to resolve namespaces...
998 Type type1 = ProcessTypeString(redefinition.type1, false);
999 Type type2 = ProcessTypeString(redefinition.type2, false);
1000 char type1String[1024] = "";
1001 char type2String[1024] = "";
1002 PrintType(type1, type1String, false, true);
1003 PrintType(type2, type2String, false, true);
1004 if(strcmp(type1String, type2String))
1005 Compiler_Warning($"Redefinition of %s (defining as %s, already defined as %s)\n", redefinition.name, type1String, type2String);
1009 dataRedefinitions.Free(null);