bool C4ScriptHost::ResolveIncludes(C4DefList *rDefs) { // Had been preparsed? if (State != ASS_PREPARSED) return false; // has already been resolved? if (IncludesResolved) return true; // catch circular includes if (Resolving) { C4AulParseError(this, "Circular include chain detected - ignoring all includes!").show(); IncludesResolved = true; State = ASS_LINKED; return false; } Resolving=true; // append all includes to local script for (std::list<StdCopyStrBuf>::reverse_iterator i = Includes.rbegin(); i != Includes.rend(); ++i) { C4Def *Def = rDefs ? rDefs->GetByName(*i) : NULL; if (Def) { // resolve #includes in included script first (#include-chains :( ) if (!Def->Script.IncludesResolved) if (!Def->Script.ResolveIncludes(rDefs)) continue; // skip this #include for (std::list<C4ScriptHost *>::reverse_iterator s = Def->Script.SourceScripts.rbegin(); s != Def->Script.SourceScripts.rend(); ++s) { if (std::find(GetScriptHost()->SourceScripts.begin(), GetScriptHost()->SourceScripts.end(), *s) == GetScriptHost()->SourceScripts.end()) GetScriptHost()->SourceScripts.push_front(*s); } } else { // save id in buffer because AulWarn will use the buffer of C4IdText // to get the id of the object in which the error occurs... // (stupid static buffers...) Warn("#include %s not found", i->getData()); } } IncludesResolved = true; // includes/appends are resolved now (for this script) Resolving=false; State = ASS_LINKED; return true; }
BOOL C4AulScript::ResolveIncludes(C4DefList *rDefs) { // resolve children includes for (C4AulScript *s = Child0; s; s = s->Next) s->ResolveIncludes(rDefs); // Had been preparsed? if (State != ASS_PREPARSED) return FALSE; // has already been resolved? if (IncludesResolved) return TRUE; // catch circular includes if (Resolving) { C4AulParseError(this, "Circular include chain detected - ignoring all includes!") .show(); IncludesResolved = true; State = ASS_LINKED; return FALSE; } Resolving = true; // append all includes to local script for (C4AListEntry *i = Includes; i; i = i->next()) { C4Def *Def = rDefs->ID2Def(C4ID(i->Var)); if (Def) { // resolve #includes in included script first (#include-chains :( ) if (!((C4AulScript &)Def->Script).IncludesResolved) if (!Def->Script.ResolveIncludes(rDefs)) continue; // skip this #include Def->Script.AppendTo(*this, false); } else { // save id in buffer because AulWarn will use the buffer of C4IdText // to get the id of the object in which the error occurs... // (stupid static buffers...) char strID[5]; *strID = 0; strcpy(strID, C4IdText(C4ID(i->Var))); Warn("script to #include not found: ", strID); } } IncludesResolved = true; // includes/appends are resolved now (for this script) Resolving = false; State = ASS_LINKED; return TRUE; }