5 NameSpace * globalData;
6 public void SetGlobalData(NameSpace * nameSpace) { globalData = nameSpace; }
8 OldList dataRedefinitions;
10 // #define MAX_INCLUDE_DEPTH 10
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 OldList * precompDefines;
37 public void SetPrecompDefines(OldList * list) { precompDefines = list; }
39 public bool DummyMethod()
44 static void ReadDataMembers(Class regClass, DataMember member, File f)
48 int size = 0, bitPos = -1;
49 AccessMode memberAccess = publicAccess;
53 if(!f.GetLine(line, sizeof(line))) break;
54 TrimLSpaces(line, line);
55 if(!strcmp(line, ".")) break;
58 if(!strcmp(line, "[Size]"))
60 f.GetLine(line, sizeof(line));
61 TrimLSpaces(line, line);
62 size = strtol(line, null, 0);
64 else if(!strcmp(line, "[Pos]"))
66 f.GetLine(line, sizeof(line));
67 TrimLSpaces(line, line);
68 bitPos = strtol(line, null, 0);
70 else if(!strcmp(line, "[Public]"))
71 memberAccess = publicAccess;
72 else if(!strcmp(line, "[Private]"))
73 memberAccess = privateAccess;
74 else if(!strcmp(line, "[Type]"))
76 f.GetLine(line, sizeof(line));
77 TrimLSpaces(line, line);
81 if(!eMember_AddDataMember(member, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
82 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
84 else if(regClass && regClass.type == bitClass)
86 //eClass_AddBitMember(regClass, name, line[0] ? line : 0, size, bitPos);
87 BitMember member = eClass_AddBitMember(regClass, name, line[0] ? line : 0, 0, 0, memberAccess);
93 if(!eClass_AddDataMember(regClass, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
94 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.fullName);
97 else if(!strcmp(line, "[Struct]") || !strcmp(line, "[Union]"))
99 DataMember dataMember = (regClass || member) ? eMember_New((!strcmp(line, "[Union]")) ? unionMember : structMember, memberAccess) : null;
100 ReadDataMembers(null, dataMember, f);
103 if(!eMember_AddMember(member, dataMember))
104 ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
108 if(!eClass_AddMember(regClass, dataMember))
109 ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.name);
118 memberAccess = publicAccess;
123 // This should register the stuff only...
124 // But also call ImportModule
125 public bool LoadSymbols(char * fileName, ImportType importType, bool loadDllOnly)
127 File f = FileOpenBuffered(fileName, read);
128 bool globalInstance = false;
131 bool ecereCOMModule = false;
132 char moduleName[MAX_LOCATION];
133 GetLastDirectory(fileName, moduleName);
134 // TEMP: UNTIL WE CAN HAVE PER SOURCE FILE PREPROCESSOR DEFINITIONS...
136 !(strcmpi(moduleName, "instance.sym") && strcmpi(moduleName, "BinaryTree.sym") &&
137 strcmpi(moduleName, "dataTypes.sym") && strcmpi(moduleName, "OldList.sym") &&
138 strcmpi(moduleName, "String.sym") && strcmpi(moduleName, "BTNode.sym") &&
139 strcmpi(moduleName, "Array.sym") && strcmpi(moduleName, "AVLTree.sym") &&
140 strcmpi(moduleName, "BuiltInContainer.sym") && strcmpi(moduleName, "Container.sym") &&
141 strcmpi(moduleName, "CustomAVLTree.sym") && strcmpi(moduleName, "LinkList.sym") &&
142 strcmpi(moduleName, "List.sym") && strcmpi(moduleName, "Map.sym") &&
143 strcmpi(moduleName, "Mutex.sym")))
144 ecereCOMModule = true;
149 if(!f.GetLine(line, sizeof(line))) break;
150 TrimLSpaces(line, line);
155 if(!strcmp(line, "[Global Instance]"))
156 globalInstance = true;
157 else if(!strcmp(line, "[Defined Classes]"))
159 Class regClass = null;
161 bool isRemote = false;
162 bool isStatic = false;
163 bool isWatchable = false;
164 ClassType classType = normalClass;
166 bool noExpansion = false;
167 AccessMode inheritanceAccess = publicAccess;
170 if(!f.GetLine(line, sizeof(line))) break;
171 TrimLSpaces(line, line);
172 if(!strcmp(line, ".")) break;
176 if(!strcmp(line, "[Remote]"))
178 else if(!strcmp(line, "[Static]"))
180 else if(!strcmp(line, "[Fixed]"))
182 else if(!strcmp(line, "[No Expansion]"))
184 else if(!strcmp(line, "[Watchable]"))
186 else if(!strcmp(line, "[Enum]"))
187 classType = enumClass;
188 else if(!strcmp(line, "[Bit]"))
189 classType = bitClass;
190 else if(!strcmp(line, "[Struct]"))
191 classType = structClass;
192 else if(!strcmp(line, "[Unit]"))
193 classType = unitClass;
194 else if(!strcmp(line, "[NoHead]"))
195 classType = noHeadClass;
196 else if(!strcmp(line, "[Base]") || !strcmp(line, "[Private Base]"))
198 if(!strcmp(line, "[Private Base]"))
199 inheritanceAccess = privateAccess;
201 f.GetLine(line, sizeof(line));
202 TrimLSpaces(line, line);
204 if(importType == preDeclImport)
206 if(isStatic || loadDllOnly || importType == preDeclImport || importType == comCheckImport)
208 else if(regClass = eSystem_FindClass(privateModule, name), !regClass || regClass.internalDecl || regClass.isRemote)
210 Symbol existingClass = FindClass(name);
211 char * baseName = (classType == normalClass && importType == remoteImport && isRemote) ? "DCOMClientObject" : (!strcmp(line, "[None]") ? null : line);
212 //Symbol baseSymbol = baseName ? FindClass(baseName) : null;
213 //if(baseSymbol && !baseSymbol->registered)
214 /*if(classType != unitClass && classType != bitClass && classType != enumClass && baseName && !eSystem_FindClass(privateModule, baseName))
216 Compiler_Error($"Base class %s undefined\n", baseName);
223 if(!isRemote || (importType != remoteImport) || (!sourceFile || !strstr(sourceFile, ".main.ec")))
225 if(!regClass || regClass.internalDecl)
226 regClass = eSystem_RegisterClass(classType, name, isRemote ? null : baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
227 if(/*importType == Remote && */regClass && isRemote)
228 regClass.isRemote = (importType == remoteImport) ? 1 : 2;
232 if(importType == remoteImport)
234 char className[1024] = "DCOMClient_";
235 strcat(className, name);
237 existingClass = DeclClass(0, name);
238 regClass = eSystem_RegisterClass(classType, className, baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
241 regClass.isRemote = (importType == remoteImport) ? 1 : 3;
244 // Update templated classes
248 for(link = existingClass.templatedClasses.first; link; link = link.next)
250 Symbol symbol = link.data;
251 symbol.registered = eSystem_FindClass(privateModule, symbol.string);
256 regClass.fixed = true;
258 regClass.noExpansion = true;
262 eClass_DestructionWatchable(regClass);
263 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS...
267 if(regClass && existingClass)
269 existingClass.registered = regClass;
270 regClass.symbol = existingClass; // TESTING THIS
271 existingClass.id = MAXINT;
272 existingClass.idCode = MAXINT;
273 existingClass.imported = true;
275 existingClass.module = FindModule(regClass.module);
277 existingClass.module = mainModule;
290 else if(!strcmp(line, "[Enum Values]"))
296 if(!f.GetLine(line, sizeof(line))) break;
297 TrimLSpaces(line, line);
298 if(!strcmp(line, ".")) break;
302 equal = strchr(line, '=');
306 memcpy(name, line, (int)(equal - line));
307 name[equal - line] = '\0';
308 TrimLSpaces(name, name);
309 TrimRSpaces(name, name);
310 eEnum_AddFixedValue(regClass, name, atoi(equal + 1));
314 eEnum_AddValue(regClass, line);
319 else if(!strcmp(line, "[Defined Methods]"))
322 bool isVirtual = false;
323 AccessMode memberAccess = publicAccess;
326 if(!f.GetLine(line, sizeof(line))) break;
327 TrimLSpaces(line, line);
328 if(!strcmp(line, ".")) break;
331 if(!strcmp(line, "[Type]"))
333 f.GetLine(line, sizeof(line));
336 TrimLSpaces(line, line);
338 eClass_AddVirtualMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
340 eClass_AddMethod(regClass, name, line[0] ? line : 0, DummyMethod, memberAccess);
343 else if(!strcmp(line, "[Virtual]"))
345 else if(!strcmp(line, "[Public]"))
346 memberAccess = publicAccess;
347 else if(!strcmp(line, "[Private]"))
348 memberAccess = privateAccess;
354 memberAccess = publicAccess;
358 else if(!strcmp(line, "[Defined Properties]"))
361 bool setStmt = false, getStmt = false, isVirtual = false, conversion = false;
362 bool isWatchable = false;
363 AccessMode memberAccess = publicAccess;
366 if(!f.GetLine(line, sizeof(line))) break;
367 TrimLSpaces(line, line);
368 if(!strcmp(line, ".")) break;
371 if(!strcmp(line, "[Type]"))
373 // Set type , set , get
374 f.GetLine(line, sizeof(line));
375 TrimLSpaces(line, line);
378 Property prop = eClass_AddProperty(regClass, conversion ? null : name, line[0] ? line : 0, (void *)setStmt, (void *)getStmt, memberAccess);
381 prop.compiled = false;
384 eProperty_Watchable(prop);
385 regClass.structSize = regClass.offset; // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS
390 else if(!strcmp(line, "[Set]"))
392 else if(!strcmp(line, "[Get]"))
394 else if(!strcmp(line, "[Watchable]"))
396 else if(!strcmp(line, "[Public]"))
397 memberAccess = publicAccess;
398 else if(!strcmp(line, "[Private]"))
399 memberAccess = privateAccess;
400 else if(!strcmp(line, "[Conversion]"))
403 setStmt = getStmt = isVirtual = isWatchable = false;
409 setStmt = getStmt = isVirtual = conversion = isWatchable = false;
410 memberAccess = publicAccess;
414 else if(!strcmp(line, "[Defined Class Properties]"))
417 bool setStmt = false, getStmt = false;
420 if(!f.GetLine(line, sizeof(line))) break;
421 TrimLSpaces(line, line);
422 if(!strcmp(line, ".")) break;
425 if(!strcmp(line, "[Type]"))
427 // Set type , set , get
428 f.GetLine(line, sizeof(line));
429 TrimLSpaces(line, line);
432 eClass_AddClassProperty(regClass, name, line, (void *)setStmt, (void *)getStmt);
435 else if(!strcmp(line, "[Set]"))
437 else if(!strcmp(line, "[Get]"))
443 setStmt = getStmt = false;
447 else if(!strcmp(line, "[Defined Data Members]"))
449 ReadDataMembers(regClass, null, f);
451 else if(!strcmp(line, "[Template Parameters]"))
456 TemplateParameterType type = TemplateParameterType::type;
457 ClassTemplateArgument defaultArg { };
460 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
461 if(line[0] == '.') break;
464 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
465 if(!strcmp(line, "[Expression]")) type = expression;
466 else if(!strcmp(line, "[Identifier]")) type = identifier;
468 //printf("Inside template parameters\n");
471 case TemplateParameterType::type:
472 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
473 if(regClass && strcmp(line, "[None]"))
475 info = CopyString(line); // FIXME: MEMORY LEAK
478 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
479 // printf("%s\n", line);
481 if(regClass && strcmp(line, "[None]"))
483 defaultArg.dataTypeString = CopyString(line); // FIXME: MEMORY LEAK
487 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
488 // Data type string (reusing base)
489 if(regClass && strcmp(line, "[None]"))
491 info = CopyString(line); // FIXME: MEMORY LEAK
494 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
495 if(regClass && strcmp(line, "[None]"))
499 Location oldLocation = yylloc;
501 File backFileInput = fileInput;
505 exp = ParseExpressionString(line);
507 exp.destType = ProcessTypeString(info, false);
508 ProcessExpressionType(exp);
509 ComputeExpression(exp);
510 op = GetOperand(exp);
511 defaultArg.expression.ui64 = op.ui64;
514 // TESTING THIS SCANNER RESUME STUFF
516 yylloc = oldLocation;
517 fileInput = backFileInput;
520 fileInput.Seek(yylloc.start.pos, start);
521 resetScannerPos(&yylloc.start);
527 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
528 if(!strcmp(line, "[Data member]")) info = (void *)TemplateMemberType::dataMember;
529 else if(!strcmp(line, "[Method]")) info = (void *)TemplateMemberType::method;
530 else if(!strcmp(line, "[Property]")) info = (void *)TemplateMemberType::prop;
532 f.GetLine(line, sizeof(line)); TrimLSpaces(line, line);
533 if(regClass && strcmp(line, "[None]"))
535 defaultArg.memberString = CopyString(line);
540 eClass_AddTemplateParameter(regClass, name, type, info, defaultArg);
541 if(type == TemplateParameterType::type || type == TemplateParameterType::expression)
543 if(type == TemplateParameterType::type || type == TemplateParameterType::identifier)
544 delete defaultArg.dataTypeString;
547 eClass_DoneAddingTemplateParameters(regClass);
552 inheritanceAccess = publicAccess;
553 classType = normalClass;
560 else if(!strcmp(line, "[Defined Expressions]"))
565 if(!f.GetLine(line, sizeof(line))) break;
566 TrimLSpaces(line, line);
567 if(!strcmp(line, ".")) break;
568 if(!strcmp(line, "[Value]"))
570 f.GetLine(line, sizeof(line));
571 TrimLSpaces(line, line);
572 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
573 eSystem_RegisterDefine(name, line, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
575 else if(line[0] != '[')
581 else if(!strcmp(line, "[Defined Functions]"))
586 if(!f.GetLine(line, sizeof(line))) break;
587 TrimLSpaces(line, line);
588 if(!strcmp(line, ".")) break;
589 if(!strcmp(line, "[Type]"))
591 f.GetLine(line, sizeof(line));
592 TrimLSpaces(line, line);
593 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
594 eSystem_RegisterFunction(name, line, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess);
596 else if(line[0] != '[')
602 else if(!strcmp(line, "[Defined Data]"))
607 if(!f.GetLine(line, sizeof(line))) break;
608 TrimLSpaces(line, line);
609 if(!strcmp(line, ".")) break;
610 if(!strcmp(line, "[Type]"))
612 f.GetLine(line, sizeof(line));
613 TrimLSpaces(line, line);
615 if(!loadDllOnly && importType != preDeclImport && importType != comCheckImport)
618 NameSpace * nameSpace = globalData;
621 // Register Global Data
622 for(c = 0; name[c]; c++)
624 if(name[c] == '.' || (name[c] == ':' && name[c+1] == ':'))
626 NameSpace * newSpace;
628 char * spaceName = new char[c - start + 1];
629 strncpy(spaceName, name + start, c - start);
630 spaceName[c-start] = '\0';
632 newSpace = (NameSpace *)nameSpace->nameSpaces.FindString(spaceName);
635 newSpace = new0 NameSpace[1];
636 newSpace->classes.CompareKey = (void *)BinaryTree::CompareString;
637 newSpace->defines.CompareKey = (void *)BinaryTree::CompareString;
638 newSpace->functions.CompareKey = (void *)BinaryTree::CompareString;
639 newSpace->nameSpaces.CompareKey = (void *)BinaryTree::CompareString;
640 newSpace->name = spaceName;
641 newSpace->parent = nameSpace;
642 nameSpace->nameSpaces.Add((BTNode)newSpace);
646 nameSpace = newSpace;
647 if(name[c] == ':') c++;
654 //if(!(data = (GlobalData)nameSpace->functions.FindString(name)))
655 data = (GlobalData)nameSpace->functions.FindString(name + start);
660 fullName = CopyString(name),
661 dataTypeString = CopyString(line),
662 module = privateModule
664 data.key = (uintptr)(data.fullName + start);
665 // Reusing functions here...
666 nameSpace->functions.Add((BTNode)data);
668 else if(strcmp(data.dataTypeString, line))
670 DataRedefinition redefinition { };
671 strcpy(redefinition.name, name);
672 strcpy(redefinition.type1, data.dataTypeString);
673 strcpy(redefinition.type2, line);
674 dataRedefinitions.Add(redefinition);
679 else if(line[0] != '[')
685 else if(!strcmp(line, "[Imported Modules]"))
687 ImportType moduleImportType = normalImport;
688 AccessMode importAccess = publicAccess;
691 if(!f.GetLine(line, sizeof(line))) break;
692 TrimLSpaces(line, line);
693 if(!strcmp(line, ".")) break;
694 if(!strcmp(line, "[Static]")) moduleImportType = staticImport;
695 else if(!strcmp(line, "[Remote]")) moduleImportType = remoteImport;
696 else if(!strcmp(line, "[Private]")) importAccess = privateAccess;
697 else if(line[0] != '[')
699 if(importType != preDeclImport && importType != comCheckImport)
700 ImportModule(line, moduleImportType, importAccess, loadDllOnly);
702 ImportModule(line, comCheckImport, importAccess, loadDllOnly);
703 if(!strcmp(line, "ecere"))
704 ecereImported = true;
705 moduleImportType = normalImport;
706 importAccess = publicAccess;
714 else if(importType != comCheckImport)
716 Compiler_Error($"Couldn't open %s\n", fileName);
718 return globalInstance;
721 Map<String, List<Module> > loadedModules { };
723 // (Same function as in actual compiler)
724 public void ImportModule(char * name, ImportType importType, AccessMode importAccess, bool loadDllOnly)
726 ImportedModule module = null;
727 char moduleName[MAX_FILENAME];
729 strncpy(moduleName, name, MAX_FILENAME-1);
730 moduleName[MAX_FILENAME-1] = 0;
731 StripExtension(moduleName);
733 for(module = defines->first; module; module = module.next)
735 if(module.type == moduleDefinition && !strcmpi(module.name, moduleName))
738 if((!module || (module.dllOnly && !loadDllOnly)) && strlen(name) < MAX_FILENAME)
740 char ext[MAX_EXTENSION];
741 Module loadedModule = null;
742 char symFile[MAX_LOCATION];
745 GetExtension(name, ext);
747 strcpy(symFile, symbolsDir ? symbolsDir : "");
748 PathCat(symFile, name);
749 ChangeExtension(symFile, "sym", symFile);
751 if(!strcmp(ext, "dll") || !strcmp(ext, "dll") || !ext[0])
753 if(importType != comCheckImport)
759 module = ImportedModule
761 name = CopyString(moduleName),
762 type = moduleDefinition,
763 importType = importType,
764 importAccess = importAccess
766 precompDefines->Add(module);
768 module = ImportedModule
770 name = CopyString(moduleName),
771 type = moduleDefinition,
772 importType = importType,
773 importAccess = importAccess
775 defines->AddName(module);
777 module.dllOnly = loadDllOnly;
779 if(ext[0] || !FileExists(symFile))
781 bool skipLoad = false;
782 List<Module> list = null;
784 char file[MAX_FILENAME];
786 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.
792 MapIterator<String, List<Module> > it { map = loadedModules };
793 if(!it.Index(file, false))
795 Module firstModule = eModule_LoadStrict(__thisModule, file, importAccess);
799 list.Add(firstModule);
800 loadedModules[file] = list;
811 loadedModule = eModule_LoadStrict(privateModule, file, importAccess);
814 loadedModule.importType = importType;
815 module.dllOnly = false; // If this is truly a dll, no need to reload it again...
816 if(list) list.Add(loadedModule);
822 if(!loadedModule && (!strcmp(ext, "ec") || !strcmp(ext, "sym") || !ext[0]))
830 module = ImportedModule
832 name = CopyString(moduleName),
833 type = moduleDefinition,
834 importType = importType,
835 importAccess = importAccess
837 precompDefines->Add(module);
839 module = ImportedModule
841 name = CopyString(moduleName),
842 type = moduleDefinition,
843 importType = importType,
844 importAccess = importAccess
846 defines->AddName(module);
848 module.dllOnly = loadDllOnly;
853 if(inIDE && !FileExists(symFile) && sourceDirs /*ide.workspace*/ /*ide.projectView*/)
855 for(dir : sourceDirs)
857 char configDir[MAX_FILENAME];
858 strcpy(symFile, dir);
859 // PathCat(symFile, "Debug");
860 PathCat(symFile, "obj");
861 sprintf(configDir, "debug.%s", (GetRuntimePlatform() == win32) ? "win32" : "linux");
862 PathCat(symFile, configDir);
864 PathCat(symFile, name);
865 ChangeExtension(symFile, "sym", symFile);
866 if(FileExists(symFile))
871 // ADDED THIS HERE TO HELP FINDING SYMBOLS IN DOCUMENTOR... HURTS ANYTHING?
872 if(!FileExists(symFile))
874 char fileName[MAX_FILENAME];
875 GetLastDirectory(symFile, fileName);
876 strcpy(symFile, symbolsDir ? symbolsDir : "");
877 PathCat(symFile, fileName);
880 module.globalInstance = LoadSymbols(symFile, importType, loadDllOnly);
886 int FindIncludeFileID(char * includeFile)
889 for(c = 0; c<numIncludes; c++)
890 if(!fstrcmp(includes[c], includeFile))
895 int GetIncludeFileID(char * includeFile)
897 int found = FindIncludeFileID(includeFile);
901 includes = renew includes char *[numIncludes+1];
902 includes[numIncludes++] = CopyString(includeFile);
906 char * GetIncludeFileFromID(int id)
908 return includes[id-1];
911 // TODO: Add parameter to check system dirs before project dirs
912 File OpenIncludeFile(char * includeFile)
915 char location[MAX_FILENAME];
916 StripLastDirectory(sourceFileStack[(include_stack_ptr >= 0) ? include_stack_ptr : 0], location);
917 PathCat(location, includeFile);
918 file = FileOpen(location, read);
921 strcpy(sourceFileStack[include_stack_ptr + 1], location);
925 // TODO: Add support for project dirs as well as system dirs
926 NamedItem includeDir;
929 for(includeDir = includeDirs->first; includeDir; includeDir = includeDir.next)
931 strcpy(location, includeDir.name);
932 PathCat(location, includeFile);
933 file = FileOpen(location, read);
940 for(includeDir = sysIncludeDirs->first; includeDir; includeDir = includeDir.next)
942 strcpy(location, includeDir.name);
943 PathCat(location, includeFile);
944 file = FileOpen(location, read);
953 public void FreeIncludeFiles()
956 for(c = 0; c<numIncludes; c++)
962 public void FreeGlobalData(NameSpace globalDataList)
967 for(;(ns = (NameSpace *)globalDataList.nameSpaces.root);)
970 globalDataList.nameSpaces.Remove((BTNode)ns);
974 for(;(data = (GlobalData)globalDataList.functions.root);)
976 globalDataList.functions.Remove(data);
978 FreeSymbol(data.symbol);
979 FreeType(data.dataType);
980 delete data.fullName;
981 delete data.dataTypeString;
986 public void CheckDataRedefinitions()
988 // Delaying this because conflict with main parser...
989 DataRedefinition redefinition;
990 for(redefinition = dataRedefinitions.first; redefinition; redefinition = redefinition.next)
992 // Added this check to resolve namespaces...
993 Type type1 = ProcessTypeString(redefinition.type1, false);
994 Type type2 = ProcessTypeString(redefinition.type2, false);
995 char type1String[1024] = "";
996 char type2String[1024] = "";
997 PrintType(type1, type1String, false, true);
998 PrintType(type2, type2String, false, true);
999 if(strcmp(type1String, type2String))
1000 Compiler_Warning($"Redefinition of %s (defining as %s, already defined as %s)\n", redefinition.name, type1String, type2String);
1004 dataRedefinitions.Free(null);