示例#1
0
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;
}
示例#2
0
文件: C4AulLink.cpp 项目: ev1313/yaC
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;
}