OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
C4ScenarioObjectsScriptHost Class Reference

#include <C4ScriptHost.h>

Inheritance diagram for C4ScenarioObjectsScriptHost:
[legend]
Collaboration diagram for C4ScenarioObjectsScriptHost:
[legend]

Public Member Functions

 C4ScenarioObjectsScriptHost ()
 
void Clear ()
 
bool Delete () override
 
C4PropListStaticGetPropList () override
 
const C4PropListStaticGetPropList () const
 
virtual bool Load (C4Group &hGroup, const char *szFilename, const char *szLanguage, C4LangStringTable *pLocalTable)
 
bool Load (C4Group &hGroup, const char *szFilename, const char *szLanguage=nullptr)
 
bool Load (C4GroupSet &hGroupSet, const char *szFilename, const char *szLanguage=nullptr)
 
virtual bool LoadData (const char *szFilename, const char *szData, class C4LangStringTable *pLocalTable)
 
void Reg2List (C4AulScriptEngine *pEngine)
 
const char * GetScript () const
 
bool IsReady ()
 
std::string Translate (const std::string &text) const
 
bool IsWarningEnabled (const char *pos, C4AulWarningId warning) const
 
const char * GetFilePath () const
 
const char * GetData () const
 
const StdStrBufGetDataBuf () const
 
size_t GetDataSize () const
 
bool GetLanguageString (const char *szLanguage, StdStrBuf &rTarget)
 

Public Attributes

std::list< C4ScriptHost * > SourceScripts
 
StdCopyStrBuf ScriptName
 

Protected Member Functions

void Unreg ()
 
void MakeScript ()
 
virtual bool ReloadScript (const char *szPath, const char *szLanguage)
 
bool Preparse ()
 
virtual bool Parse ()
 
virtual void UnLink ()
 
void UnlinkOwnedFunctions ()
 
void DeleteOwnedPropLists ()
 
void Warn (const char *pMsg,...) GNUC_FORMAT_ATTRIBUTE_O
 
virtual void AddEngineFunctions ()
 
void CopyPropList (C4Set< C4Property > &from, C4PropListStatic *to)
 
bool ResolveIncludes (C4DefList *rDefs)
 
bool ResolveAppends (C4DefList *rDefs)
 
void DoAppend (C4Def *def)
 
void EnableWarning (const char *pos, C4AulWarningId warning, bool enable=true)
 
virtual void OnLoad ()
 
void CopyFilePathFromGroup (const C4Group &hGroup)
 
void FinishLoad (const StdStrBuf &, C4Group &hGroup)
 

Protected Attributes

C4AulScriptEngineEngine {nullptr}
 
C4ScriptHostPrev {nullptr}
 
C4ScriptHostNext {nullptr}
 
std::list< StdCopyStrBufIncludes
 
std::list< StdCopyStrBufAppends
 
bool Resolving
 
bool IncludesResolved
 
StdStrBuf Script
 
C4LangStringTablestringTable
 
C4Set< C4PropertyLocalValues
 
C4AulScriptState State {ASS_NONE}
 
std::vector< C4ValueownedFunctions
 
std::vector< C4ValueownedPropLists
 
StdCopyStrBuf Data
 
StdCopyStrBuf Filename
 
StdCopyStrBuf FilePath
 

Detailed Description

Definition at line 131 of file C4ScriptHost.h.

Constructor & Destructor Documentation

C4ScenarioObjectsScriptHost::C4ScenarioObjectsScriptHost ( )

Definition at line 273 of file C4ScriptHost.cpp.

273  : C4ExtraScriptHost(::Strings.RegString("ScenarioObjects"))
274 {
275  // Note that "ScenarioObjects" is a fake key name under which you cannot access this prop list from script.
276  // It's just given to have a proper name when script errors are reported.
277 }
C4String * RegString(StdStrBuf String)
C4StringTable Strings
Definition: C4Globals.cpp:42
C4ExtraScriptHost(C4String *parent_key_name=nullptr)

Member Function Documentation

virtual void C4ScriptHost::AddEngineFunctions ( )
inlineprotectedvirtualinherited

Reimplemented in C4MapScriptHost.

Definition at line 82 of file C4ScriptHost.h.

Referenced by C4ScriptHost::Preparse().

82 {}; // add any engine functions specific to this script host

Here is the caller graph for this function:

void C4ExtraScriptHost::Clear ( )
inherited

Definition at line 259 of file C4ScriptHost.cpp.

References C4Value::_getPropList(), C4ScriptHost::Clear(), and C4PropList::Clear().

Referenced by C4ExtraScriptHost::~C4ExtraScriptHost().

260 {
262  ParserPropList._getPropList()->Clear();
263 }
void Clear()
Definition: C4PropList.h:66
C4PropList * _getPropList() const
Definition: C4Value.h:129

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ComponentHost::CopyFilePathFromGroup ( const C4Group hGroup)
protectedinherited

Definition at line 120 of file C4ComponentHost.cpp.

References StdStrBuf::Append(), StdStrBuf::AppendBackslash(), C4Config::AtRelativePath(), Config, StdStrBuf::Copy(), C4ComponentHost::Filename, C4ComponentHost::FilePath, StdStrBuf::getData(), and C4Group::GetFullName().

Referenced by C4ComponentHost::FinishLoad(), and C4ComponentHost::Load().

121 {
125 }
const char * getData() const
Definition: StdBuf.h:442
C4Config Config
Definition: C4Config.cpp:833
StdCopyStrBuf FilePath
void AppendBackslash()
Definition: StdBuf.cpp:248
StdStrBuf GetFullName() const
Definition: C4Group.cpp:2078
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:519
StdCopyStrBuf Filename
const char * AtRelativePath(const char *szFilename)
Definition: C4Config.cpp:656
void Copy()
Definition: StdBuf.h:467

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ScriptHost::CopyPropList ( C4Set< C4Property > &  from,
C4PropListStatic to 
)
protectedinherited

Definition at line 1681 of file C4AulParse.cpp.

References C4Value::_getPropList(), C4ScriptHost::C4AulScriptFunc, C4V_Array, C4V_Function, C4V_PropList, C4VFunction(), C4VPropList(), C4Set< T >::First(), C4PropList::GetFunc(), C4Value::getFunction(), C4PropListStatic::GetParent(), C4Value::GetType(), C4PropList::IsStatic(), C4Property::Key, C4AulFunc::Name, C4PropList::NewStatic(), C4Set< T >::Next(), C4StringTable::P, P_Prototype, C4AulScriptFunc::pOrgScript, C4AulScriptFunc::SetOverloaded(), C4PropList::SetPropertyByS(), C4AulFunc::SFunc(), Strings, and C4Property::Value.

Referenced by C4ScriptHost::Parse().

1682 {
1683  // append all funcs and local variable initializations
1684  const C4Property * prop = from.First();
1685  while (prop)
1686  {
1687  switch(prop->Value.GetType())
1688  {
1689  case C4V_Function:
1690  {
1691  C4AulScriptFunc * sf = prop->Value.getFunction()->SFunc();
1692  if (sf)
1693  {
1694  C4AulScriptFunc *sfc;
1695  if (sf->pOrgScript != this)
1696  sfc = new C4AulScriptFunc(to, *sf);
1697  else
1698  sfc = sf;
1699  sfc->SetOverloaded(to->GetFunc(sf->Name));
1700  to->SetPropertyByS(prop->Key, C4VFunction(sfc));
1701  }
1702  else
1703  {
1704  // engine function
1705  to->SetPropertyByS(prop->Key, prop->Value);
1706  }
1707  }
1708  break;
1709  case C4V_PropList:
1710  {
1711  C4PropListStatic * p = prop->Value._getPropList()->IsStatic();
1712  assert(p);
1713  if (prop->Key != &::Strings.P[P_Prototype])
1714  if (!p || p->GetParent() != to)
1715  {
1716  p = C4PropList::NewStatic(nullptr, to, prop->Key);
1717  CopyPropList(prop->Value._getPropList()->Properties, p);
1718  }
1719  to->SetPropertyByS(prop->Key, C4VPropList(p));
1720  }
1721  break;
1722  case C4V_Array: // FIXME: copy the array if necessary
1723  default:
1724  to->SetPropertyByS(prop->Key, prop->Value);
1725  }
1726  prop = from.Next(prop);
1727  }
1728 }
C4String P[P_LAST]
C4Value Value
Definition: C4PropList.h:55
C4AulFunc * GetFunc(C4PropertyName k) const
Definition: C4PropList.h:105
C4ScriptHost * pOrgScript
virtual class C4PropListStatic * IsStatic()
Definition: C4PropList.h:85
void CopyPropList(C4Set< C4Property > &from, C4PropListStatic *to)
T const * Next(T const *p) const
C4V_Type GetType() const
Definition: C4Value.h:161
C4StringTable Strings
Definition: C4Globals.cpp:42
C4Value C4VPropList(C4PropList *p)
Definition: C4Value.h:245
friend class C4AulScriptFunc
Definition: C4ScriptHost.h:110
static C4PropListStatic * NewStatic(C4PropList *prototype, const C4PropListStatic *parent, C4String *key)
Definition: C4PropList.cpp:70
C4String * Key
Definition: C4PropList.h:54
void SetOverloaded(C4AulFunc *)
C4Value C4VFunction(C4AulFunc *pFn)
Definition: C4Value.h:250
virtual void SetPropertyByS(C4String *k, const C4Value &to)
Definition: C4PropList.cpp:952
T const * First() const
C4RefCntPointer< C4String > Name
Definition: C4AulFunc.h:60
C4PropList * _getPropList() const
Definition: C4Value.h:129
virtual C4AulScriptFunc * SFunc()
Definition: C4AulFunc.h:65
C4AulFunc * getFunction() const
Definition: C4Value.h:119
const C4PropListStatic * GetParent() const
Definition: C4PropList.h:270

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ExtraScriptHost::Delete ( )
inlineoverridevirtualinherited

Reimplemented from C4ScriptHost.

Definition at line 126 of file C4ScriptHost.h.

126 { return true; }
void C4ScriptHost::DeleteOwnedPropLists ( )
protectedinherited

Definition at line 118 of file C4ScriptHost.cpp.

References C4PropList::Clear(), C4PropList::Delete(), and C4ScriptHost::ownedPropLists.

Referenced by C4ScriptHost::Clear(), and C4ScriptHost::UnLink().

119 {
120  // delete all static proplists associated to this script host.
121  // Note that just clearing the vector is not enough in case of
122  // cyclic references.
123  for (C4Value& value: ownedPropLists)
124  {
125  C4PropList* plist = value.getPropList();
126  if (plist)
127  {
128  if (plist->Delete()) delete plist;
129  else plist->Clear();
130  }
131  }
132  ownedPropLists.clear();
133 }
void Clear()
Definition: C4PropList.h:66
virtual bool Delete()
Definition: C4PropList.h:90
std::vector< C4Value > ownedPropLists
Definition: C4ScriptHost.h:101

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ScriptHost::DoAppend ( C4Def def)
protectedinherited

Definition at line 28 of file C4AulLink.cpp.

References C4ScriptHost::Includes, C4Def::Script, C4ScriptHost::SourceScripts, and C4ScriptHost::Warn().

Referenced by C4ScriptHost::ResolveAppends().

29 {
30  if (std::find(def->Script.SourceScripts.begin(), def->Script.SourceScripts.end(), this) == def->Script.SourceScripts.end())
31  {
32  def->Script.SourceScripts.push_back(this);
33  if (!Includes.empty())
34  {
35  Warn("#appendto contains #include");
36  // Try to fullfil #include, but it won't work properly: #appendtos
37  // are always appended, but #includes are prepended to the script.
38  def->Script.Includes.insert(def->Script.Includes.end(), Includes.begin(), Includes.end());
39  }
40 
41  }
42 }
std::list< StdCopyStrBuf > Includes
Definition: C4ScriptHost.h:79
void Warn(const char *pMsg,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: C4AulParse.cpp:123
C4DefScriptHost Script
Definition: C4Def.h:181
std::list< C4ScriptHost * > SourceScripts
Definition: C4ScriptHost.h:56

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ScriptHost::EnableWarning ( const char *  pos,
C4AulWarningId  warning,
bool  enable = true 
)
protectedinherited

Definition at line 1767 of file C4AulParse.cpp.

1768 {
1769  auto entry = enabledWarnings.emplace(pos, decltype(enabledWarnings)::mapped_type{});
1770  if (entry.second)
1771  {
1772  // If there was no earlier entry for this position, copy the previous
1773  // warning state
1774  assert(entry.first != enabledWarnings.begin());
1775  auto previous = entry.first;
1776  --previous;
1777  entry.first->second = previous->second;
1778  }
1779  entry.first->second.set(static_cast<size_t>(warning), enable);
1780 }
void C4ComponentHost::FinishLoad ( const StdStrBuf name,
C4Group hGroup 
)
protectedinherited

Definition at line 99 of file C4ComponentHost.cpp.

References C4ComponentHost::CopyFilePathFromGroup(), C4ComponentHost::Data, StdStrBuf::EnsureUnicode(), C4ComponentHost::Filename, C4ComponentHost::FilePath, C4Group::FindEntry(), StdStrBuf::getData(), StdStrBuf::getSize(), LogF(), StdStrBuf::Move(), C4ComponentHost::OnLoad(), and StdStrBuf::Shrink().

Referenced by C4ComponentHost::Load().

100 {
101  // Store actual filename
102  hGroup.FindEntry(name.getData(), &Filename);
103  CopyFilePathFromGroup(hGroup);
104 
105  if (Data.EnsureUnicode())
106  {
107  LogF("WARNING: File is not encoded as UTF-8 (%s)", FilePath.getData());
108  }
109  // Skip those stupid "zero width no-break spaces" (also known as Byte Order Marks)
110  if (Data[0] == '\xEF' && Data[1] == '\xBB' && Data[2] == '\xBF')
111  {
112  Data.Move(3,Data.getSize()-3);
113  Data.Shrink(3);
114  }
115  // Notify
116  OnLoad();
117 }
const char * getData() const
Definition: StdBuf.h:442
bool FindEntry(const char *szWildCard, StdStrBuf *sFileName=nullptr, size_t *iSize=nullptr)
Definition: C4Group.cpp:1774
StdCopyStrBuf FilePath
void CopyFilePathFromGroup(const C4Group &hGroup)
StdCopyStrBuf Data
virtual void OnLoad()
size_t getSize() const
Definition: StdBuf.h:444
bool EnsureUnicode()
Definition: StdBuf.cpp:421
void Shrink(size_t iShrink)
Definition: StdBuf.h:503
StdCopyStrBuf Filename
void Move(size_t iFrom, size_t inSize, size_t iTo=0)
Definition: StdBuf.h:471
bool LogF(const char *strMessage,...)
Definition: C4Log.cpp:250

Here is the call graph for this function:

Here is the caller graph for this function:

const char* C4ComponentHost::GetData ( ) const
inlineinherited

Definition at line 30 of file C4ComponentHost.h.

References C4ComponentHost::Data, and StdStrBuf::getData().

Referenced by C4Game::CompileRuntimeData(), C4Game::InitGame(), C4RankSystem::Load(), C4ScenarioListLoader::Entry::Load(), C4Player::LoadRuntimeData(), C4ObjectInfoList::New(), and C4Game::OpenScenario().

30 { return Data.getData(); }
const char * getData() const
Definition: StdBuf.h:442
StdCopyStrBuf Data

Here is the call graph for this function:

Here is the caller graph for this function:

const StdStrBuf& C4ComponentHost::GetDataBuf ( ) const
inlineinherited

Definition at line 31 of file C4ComponentHost.h.

References C4ComponentHost::Data.

Referenced by C4Game::CompileRuntimeData(), C4Language::HasStringTable(), and C4ScriptHost::MakeScript().

31 { return Data; }
StdCopyStrBuf Data

Here is the caller graph for this function:

size_t C4ComponentHost::GetDataSize ( ) const
inlineinherited

Definition at line 32 of file C4ComponentHost.h.

References C4ComponentHost::Data, and StdStrBuf::getLength().

Referenced by C4RankSystem::Load().

32 { return Data.getLength(); }
StdCopyStrBuf Data
size_t getLength() const
Definition: StdBuf.h:445

Here is the call graph for this function:

Here is the caller graph for this function:

const char* C4ComponentHost::GetFilePath ( ) const
inlineinherited

Definition at line 28 of file C4ComponentHost.h.

References C4ComponentHost::FilePath, and StdStrBuf::getData().

Referenced by C4ScriptHost::Load(), C4Player::LoadRuntimeData(), C4ScriptHost::ReloadScript(), and C4LangStringTable::ReplaceStrings().

28 { return FilePath.getData(); }
const char * getData() const
Definition: StdBuf.h:442
StdCopyStrBuf FilePath

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ComponentHost::GetLanguageString ( const char *  szLanguage,
StdStrBuf rTarget 
)
inherited

Definition at line 127 of file C4ComponentHost.cpp.

References StdStrBuf::Copy(), C4ComponentHost::Data, StdStrBuf::getData(), SAppend(), SCharPos(), SCopySegment(), and SSearch().

Referenced by C4DefList::Load(), C4ScenarioListLoader::Entry::Load(), and C4Game::OpenScenario().

128 {
129  const char *cptr;
130  // No good parameters
131  if (!szLanguage || !Data) return false;
132  // Search for two-letter language identifier in text body, i.e. "DE:"
133  char langindex[4] = "";
134  for (int clseg=0; SCopySegment(szLanguage ? szLanguage : "", clseg, langindex, ',', 2); clseg++)
135  {
136  SAppend(":",langindex);
137  if ((cptr = SSearch(Data.getData(),langindex)))
138  {
139  // Return the according string
140  int iEndPos = SCharPos('\r', cptr);
141  if (iEndPos<0) iEndPos = SCharPos('\n', cptr);
142  if (iEndPos<0) iEndPos = strlen(cptr);
143  rTarget.Copy(cptr, iEndPos);
144  return true;
145  }
146  }
147  // Language string not found
148  return false;
149 }
const char * getData() const
Definition: StdBuf.h:442
void SAppend(const char *szSource, char *szTarget, int iMaxL)
Definition: Standard.cpp:257
bool SCopySegment(const char *szString, int iSegment, char *sTarget, char cSeparator, int iMaxL, bool fSkipWhitespace)
Definition: Standard.cpp:273
const char * SSearch(const char *szString, const char *szIndex)
Definition: Standard.cpp:363
StdCopyStrBuf Data
int SCharPos(char cTarget, const char *szInStr, int iIndex)
Definition: Standard.cpp:233
void Copy()
Definition: StdBuf.h:467

Here is the call graph for this function:

Here is the caller graph for this function:

const C4PropListStatic* C4ScriptHost::GetPropList ( ) const
inlineinherited

Definition at line 51 of file C4ScriptHost.h.

References C4ScriptHost::GetPropList().

Referenced by C4ScriptHost::GetPropList().

51 { return const_cast<C4ScriptHost*>(this)->GetPropList(); }
virtual C4PropListStatic * GetPropList()
Definition: C4ScriptHost.h:50

Here is the call graph for this function:

Here is the caller graph for this function:

C4PropListStatic * C4ExtraScriptHost::GetPropList ( )
overridevirtualinherited

Reimplemented from C4ScriptHost.

Definition at line 265 of file C4ScriptHost.cpp.

References C4Value::_getPropList(), and C4PropList::IsStatic().

Referenced by C4Game::InitGame(), and C4Game::InitScriptEngine().

266 {
267  return ParserPropList._getPropList()->IsStatic();
268 }
virtual class C4PropListStatic * IsStatic()
Definition: C4PropList.h:85
C4PropList * _getPropList() const
Definition: C4Value.h:129

Here is the call graph for this function:

Here is the caller graph for this function:

const char* C4ScriptHost::GetScript ( ) const
inlineinherited

Definition at line 52 of file C4ScriptHost.h.

References StdStrBuf::getData(), and C4ScriptHost::Script.

Referenced by C4AulParseError::C4AulParseError(), C4AulScriptFunc::GetLineOfCode(), and C4AulScriptContext::ReturnDump().

52 { return Script.getData(); }
const char * getData() const
Definition: StdBuf.h:442
StdStrBuf Script
Definition: C4ScriptHost.h:90

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ScriptHost::IsReady ( )
inlineinherited

Definition at line 53 of file C4ScriptHost.h.

References ASS_PARSED, and C4ScriptHost::State.

Referenced by C4GUI::FrameDecoration::SetByDef().

53 { return State == ASS_PARSED; } // whether script calls may be done
C4AulScriptState State
Definition: C4ScriptHost.h:93

Here is the caller graph for this function:

bool C4ScriptHost::IsWarningEnabled ( const char *  pos,
C4AulWarningId  warning 
) const
inherited

Definition at line 1782 of file C4AulParse.cpp.

1783 {
1784  assert(!enabledWarnings.empty());
1785  if (enabledWarnings.empty())
1786  return false;
1787 
1788  // find nearest set of warnings at or before the current position
1789  auto entry = enabledWarnings.upper_bound(pos);
1790  assert(entry != enabledWarnings.begin());
1791  if (entry != enabledWarnings.begin())
1792  {
1793  --entry;
1794  }
1795 
1796  return entry->second.test(static_cast<size_t>(warning));
1797 }
bool C4ComponentHost::Load ( C4Group hGroup,
const char *  szFilename,
const char *  szLanguage = nullptr 
)
inherited

Definition at line 23 of file C4ComponentHost.cpp.

References _MAX_FNAME, C4ComponentHost::Clear(), StdStrBuf::Copy(), C4ComponentHost::CopyFilePathFromGroup(), C4ComponentHost::Data, C4ComponentHost::Filename, C4ComponentHost::FinishLoad(), StdStrBuf::Format(), StdStrBuf::getData(), StdStrBuf::getMData(), C4Group::LoadEntryString(), SCopySegment(), SReplaceChar(), and SSearch().

Referenced by C4Game::CompileRuntimeData(), C4Game::InitScriptEngine(), C4ScriptHost::Load(), C4ScenarioListLoader::Entry::Load(), C4Language::LoadComponentHost(), and C4Game::LoadScenarioComponents().

26 {
27  // Clear any old stuff
28  Clear();
29  // Store filename
30  if (fname)
31  Filename.Copy(fname);
32  // Load component - try all segmented filenames
33  char strEntry[_MAX_FNAME+1];
34  StdStrBuf strEntryWithLanguage;
35  for (int iFilename = 0; SCopySegment(Filename.getData(), iFilename, strEntry, '|'); iFilename++)
36  {
37  // Try to insert all language codes provided into the filename
38  char strCode[3] = "";
39  for (int iLang = 0; SCopySegment(szLanguage ? szLanguage : "", iLang, strCode, ',', 2); iLang++)
40  {
41  // Insert language code
42  strEntryWithLanguage.Format(strEntry, strCode);
43  if (hGroup.LoadEntryString(strEntryWithLanguage, &Data))
44  {
45  FinishLoad(strEntryWithLanguage, hGroup);
46  // Got it
47  return true;
48  }
49  // Couldn't insert language code anyway - no point in trying other languages
50  if (!SSearch(strEntry, "%s")) break;
51  }
52  }
53  // Truncate any additional segments from stored filename
54  SReplaceChar(Filename.getMData(), '|', 0);
55  CopyFilePathFromGroup(hGroup);
56  // Not loaded
57  return false;
58 }
const char * getData() const
Definition: StdBuf.h:442
void FinishLoad(const StdStrBuf &, C4Group &hGroup)
bool SCopySegment(const char *szString, int iSegment, char *sTarget, char cSeparator, int iMaxL, bool fSkipWhitespace)
Definition: Standard.cpp:273
const char * SSearch(const char *szString, const char *szIndex)
Definition: Standard.cpp:363
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: StdBuf.cpp:174
void CopyFilePathFromGroup(const C4Group &hGroup)
char * getMData()
Definition: StdBuf.h:443
StdCopyStrBuf Data
#define _MAX_FNAME
bool LoadEntryString(const char *szEntryName, StdStrBuf *Buf)
Definition: C4Group.cpp:1932
StdCopyStrBuf Filename
void Copy()
Definition: StdBuf.h:467
void SReplaceChar(char *str, char fc, char tc)
Definition: Standard.cpp:348

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ComponentHost::Load ( C4GroupSet hGroupSet,
const char *  szFilename,
const char *  szLanguage = nullptr 
)
inherited

Definition at line 60 of file C4ComponentHost.cpp.

References _MAX_FNAME, C4ComponentHost::Clear(), StdStrBuf::Copy(), C4ComponentHost::CopyFilePathFromGroup(), C4ComponentHost::Data, C4ComponentHost::Filename, C4GroupSet::FindEntry(), C4ComponentHost::FinishLoad(), StdStrBuf::Format(), StdStrBuf::getData(), C4GroupSet::GetGroup(), StdStrBuf::getMData(), C4GroupSet::LoadEntryString(), SCopySegment(), SReplaceChar(), and SSearch().

63 {
64  // Clear any old stuff
65  Clear();
66  // Store filename
67  if (fname)
68  Filename.Copy(fname);
69  // Load component - try all segmented filenames
70  char strEntry[_MAX_FNAME+1];
71  StdStrBuf strEntryWithLanguage;
72  for (int iFilename = 0; SCopySegment(Filename.getData(), iFilename, strEntry, '|'); iFilename++)
73  {
74  // Try to insert all language codes provided into the filename
75  char strCode[3] = "";
76  for (int iLang = 0; SCopySegment(szLanguage ? szLanguage : "", iLang, strCode, ',', 2); iLang++)
77  {
78  // Insert language code
79  strEntryWithLanguage.Format(strEntry, strCode);
80  if (hGroupSet.LoadEntryString(strEntryWithLanguage, &Data))
81  {
82  C4Group *pGroup = hGroupSet.FindEntry(strEntryWithLanguage.getData());
83  FinishLoad(strEntryWithLanguage, *pGroup);
84  // Got it
85  return true;
86  }
87  // Couldn't insert language code anyway - no point in trying other languages
88  if (!SSearch(strEntry, "%s")) break;
89  }
90  }
91  // Truncate any additional segments from stored filename
92  SReplaceChar(Filename.getMData(), '|', 0);
93  // for error message purposes, the first group failed to provide the desired file
94  CopyFilePathFromGroup(*hGroupSet.GetGroup(0));
95  // Not loaded
96  return false;
97 }
const char * getData() const
Definition: StdBuf.h:442
void FinishLoad(const StdStrBuf &, C4Group &hGroup)
bool SCopySegment(const char *szString, int iSegment, char *sTarget, char cSeparator, int iMaxL, bool fSkipWhitespace)
Definition: Standard.cpp:273
const char * SSearch(const char *szString, const char *szIndex)
Definition: Standard.cpp:363
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: StdBuf.cpp:174
void CopyFilePathFromGroup(const C4Group &hGroup)
char * getMData()
Definition: StdBuf.h:443
StdCopyStrBuf Data
C4Group * FindEntry(const char *szWildcard, int32_t *pPriority=nullptr, int32_t *pID=nullptr)
Definition: C4GroupSet.cpp:175
#define _MAX_FNAME
bool LoadEntryString(const char *szEntryName, StdStrBuf *rBuf)
Definition: C4GroupSet.cpp:225
StdCopyStrBuf Filename
void Copy()
Definition: StdBuf.h:467
void SReplaceChar(char *str, char fc, char tc)
Definition: Standard.cpp:348
C4Group * GetGroup(int32_t iIndex)
Definition: C4GroupSet.cpp:259

Here is the call graph for this function:

bool C4ScriptHost::Load ( C4Group hGroup,
const char *  szFilename,
const char *  szLanguage,
C4LangStringTable pLocalTable 
)
virtualinherited

Reimplemented in C4MapScriptHost, and C4GameScriptHost.

Definition at line 162 of file C4ScriptHost.cpp.

References C4LangStringTable::AddRef(), C4LangStringTable::DelRef(), C4ComponentHost::GetFilePath(), C4ComponentHost::Load(), C4ScriptHost::MakeScript(), StdStrBuf::Ref(), C4ScriptHost::ScriptName, and C4ScriptHost::stringTable.

Referenced by C4Game::InitGame(), C4Game::InitScriptEngine(), C4GameScriptHost::Load(), C4Def::Load(), C4MapScriptHost::Load(), C4Game::LoadAdditionalSystemGroup(), C4ScriptHost::ReloadScript(), and C4ScenarioSection::ScenarioLoad().

164 {
165  // Base load
166  bool fSuccess = C4ComponentHost::Load(hGroup,szFilename,szLanguage);
167  // String Table
168  if (stringTable != pLocalTable)
169  {
171  stringTable = pLocalTable;
173  }
174  // set name
176  // preparse script
177  MakeScript();
178  // Success
179  return fSuccess;
180 }
bool Load(C4Group &hGroup, const char *szFilename, const char *szLanguage=nullptr)
void Ref(const char *pnData)
Definition: StdBuf.h:455
const char * GetFilePath() const
C4LangStringTable * stringTable
Definition: C4ScriptHost.h:91
StdCopyStrBuf ScriptName
Definition: C4ScriptHost.h:57

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ScriptHost::LoadData ( const char *  szFilename,
const char *  szData,
class C4LangStringTable pLocalTable 
)
virtualinherited

Reimplemented in C4MapScriptHost, and C4GameScriptHost.

Definition at line 182 of file C4ScriptHost.cpp.

References C4LangStringTable::AddRef(), StdStrBuf::Clear(), StdStrBuf::Copy(), C4LangStringTable::DelRef(), C4ScriptHost::Preparse(), C4LangStringTable::ReplaceStrings(), C4ScriptHost::Script, C4ScriptHost::ScriptName, C4ScriptHost::stringTable, and StdStrBuf::Take().

Referenced by C4GameScriptHost::LoadData(), and C4MapScriptHost::LoadData().

183 {
184  // String Table
185  if (stringTable != pLocalTable)
186  {
188  stringTable = pLocalTable;
190  }
191  ScriptName.Copy(szFilename);
192 
193  StdStrBuf tempScript;
194  tempScript.Copy(szData);
195 
196  Script.Clear();
197  if(stringTable)
198  stringTable->ReplaceStrings(tempScript, Script);
199  else
200  Script.Take(tempScript);
201 
202  Preparse();
203  return true;
204 }
void Clear()
Definition: StdBuf.h:466
void Take(char *pnData)
Definition: StdBuf.h:457
void ReplaceStrings(StdStrBuf &rBuf)
bool Preparse()
Definition: C4AulParse.cpp:679
C4LangStringTable * stringTable
Definition: C4ScriptHost.h:91
void Copy()
Definition: StdBuf.h:467
StdCopyStrBuf ScriptName
Definition: C4ScriptHost.h:57
StdStrBuf Script
Definition: C4ScriptHost.h:90

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ScriptHost::MakeScript ( )
protectedinherited

Definition at line 206 of file C4ScriptHost.cpp.

References StdStrBuf::Clear(), C4ComponentHost::GetDataBuf(), C4ScriptHost::Preparse(), StdStrBuf::Ref(), C4LangStringTable::ReplaceStrings(), C4ScriptHost::Script, and C4ScriptHost::stringTable.

Referenced by C4ScriptHost::Load().

207 {
208  // clear prev
209  Script.Clear();
210 
211  // create script
212  if (stringTable)
213  {
215  }
216  else
217  {
218  Script.Ref(GetDataBuf());
219  }
220 
221  // preparse script
222  Preparse();
223 }
void Clear()
Definition: StdBuf.h:466
const StdStrBuf & GetDataBuf() const
void ReplaceStrings(StdStrBuf &rBuf)
void Ref(const char *pnData)
Definition: StdBuf.h:455
bool Preparse()
Definition: C4AulParse.cpp:679
C4LangStringTable * stringTable
Definition: C4ScriptHost.h:91
StdStrBuf Script
Definition: C4ScriptHost.h:90

Here is the call graph for this function:

Here is the caller graph for this function:

virtual void C4ComponentHost::OnLoad ( )
inlineprotectedvirtualinherited

Reimplemented in C4LangStringTable.

Definition at line 39 of file C4ComponentHost.h.

Referenced by C4ComponentHost::Clear(), and C4ComponentHost::FinishLoad().

39 {}

Here is the caller graph for this function:

bool C4ScriptHost::Parse ( )
protectedvirtualinherited

Reimplemented in C4DefScriptHost.

Definition at line 1730 of file C4AulParse.cpp.

References C4ScriptHost::Appends, ASS_LINKED, ASS_PARSED, C4AulCompiler::Compile(), C4ScriptHost::CopyPropList(), C4ScriptHost::Engine, StdStrBuf::getData(), C4PropList::GetDef(), StdStrBuf::getLength(), C4ScriptHost::GetPropList(), StdStrBuf::getPtr(), C4Def::IncludeDefinition(), C4AulScriptEngine::lineCnt, C4ScriptHost::Script, SGetLine(), C4ScriptHost::SourceScripts, and C4ScriptHost::State.

Referenced by C4DefScriptHost::Parse().

1731 {
1732  // check state
1733  if (State != ASS_LINKED) return false;
1734 
1735  if (!Appends.empty())
1736  {
1737  // #appendto scripts are not allowed to contain global functions or belong to definitions
1738  // so their contents are not reachable
1739  return true;
1740  }
1741 
1742  C4PropListStatic * p = GetPropList();
1743 
1744  for (auto & SourceScript : SourceScripts)
1745  {
1746  CopyPropList(SourceScript->LocalValues, p);
1747  if (SourceScript == this)
1748  continue;
1749  // definition appends
1750  if (GetPropList() && GetPropList()->GetDef() && SourceScript->GetPropList() && SourceScript->GetPropList()->GetDef())
1751  GetPropList()->GetDef()->IncludeDefinition(SourceScript->GetPropList()->GetDef());
1752  }
1753 
1754  // generate bytecode
1755  for (auto &s : SourceScripts)
1756  C4AulCompiler::Compile(this, s, s->ast.get());
1757 
1758  // save line count
1760 
1761  // finished
1762  State = ASS_PARSED;
1763 
1764  return true;
1765 }
const char * getData() const
Definition: StdBuf.h:442
int SGetLine(const char *szText, const char *cpPosition)
Definition: Standard.cpp:473
std::list< StdCopyStrBuf > Appends
Definition: C4ScriptHost.h:80
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:76
virtual C4PropListStatic * GetPropList()
Definition: C4ScriptHost.h:50
void IncludeDefinition(C4Def *pIncludeDef)
Definition: C4Def.cpp:631
virtual C4Def const * GetDef() const
Definition: C4PropList.cpp:685
void CopyPropList(C4Set< C4Property > &from, C4PropListStatic *to)
static void Compile(C4AulScriptFunc *out, const ::aul::ast::Function *f)
const char * getPtr(size_t i) const
Definition: StdBuf.h:448
size_t getLength() const
Definition: StdBuf.h:445
std::list< C4ScriptHost * > SourceScripts
Definition: C4ScriptHost.h:56
#define s
C4AulScriptState State
Definition: C4ScriptHost.h:93
StdStrBuf Script
Definition: C4ScriptHost.h:90

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ScriptHost::Preparse ( )
protectedinherited

Definition at line 679 of file C4AulParse.cpp.

References C4ScriptHost::AddEngineFunctions(), C4ScriptHost::Appends, ASS_NONE, ASS_PREPARSED, C4VPropList(), C4Set< T >::Clear(), C4ScriptHost::Engine, StdStrBuf::getData(), C4ScriptHost::GetPropList(), C4AulScriptEngine::GetPropList(), C4ScriptHost::Includes, C4ScriptHost::IncludesResolved, C4ScriptHost::LocalValues, P_Prototype, C4AulParse::Parse_Script(), C4AulCompiler::Preparse(), C4ScriptHost::Script, C4PropList::SetProperty(), and C4ScriptHost::State.

Referenced by C4ScriptHost::LoadData(), and C4ScriptHost::MakeScript().

680 {
681  // handle easiest case first
682  if (State < ASS_NONE) return false;
683 
684  // clear stuff
685  Includes.clear(); Appends.clear();
686 
687  GetPropList()->C4PropList::Clear();
689  LocalValues.Clear();
690 
691  // Add any engine functions specific to this script
693 
694  // Insert default warnings
695  assert(enabledWarnings.empty());
696  auto &warnings = enabledWarnings[Script.getData()];
697 #define DIAG(id, text, enabled) warnings.set(static_cast<size_t>(C4AulWarningId::id), enabled);
698 #include "C4AulWarnings.h"
699 #undef DIAG
700 
701  C4AulParse parser(this);
702  ast = parser.Parse_Script(this);
703 
704  C4AulCompiler::Preparse(this, this, ast.get());
705 
706  // #include will have to be resolved now...
707  IncludesResolved = false;
708 
709  // Parse will write the properties back after the ones from included scripts
710  GetPropList()->Properties.Swap(&LocalValues);
711 
712  // return success
713  this->State = ASS_PREPARSED;
714  return true;
715 }
const char * getData() const
Definition: StdBuf.h:442
bool IncludesResolved
Definition: C4ScriptHost.h:88
C4PropListStatic * GetPropList()
Definition: C4Aul.h:151
std::list< StdCopyStrBuf > Appends
Definition: C4ScriptHost.h:80
static void Preparse(C4ScriptHost *out, C4ScriptHost *source, const ::aul::ast::Script *s)
void SetProperty(C4PropertyName k, const C4Value &to)
Definition: C4PropList.h:120
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:76
void Clear()
virtual C4PropListStatic * GetPropList()
Definition: C4ScriptHost.h:50
virtual void AddEngineFunctions()
Definition: C4ScriptHost.h:82
C4Value C4VPropList(C4PropList *p)
Definition: C4Value.h:245
std::list< StdCopyStrBuf > Includes
Definition: C4ScriptHost.h:79
C4Set< C4Property > LocalValues
Definition: C4ScriptHost.h:92
C4AulScriptState State
Definition: C4ScriptHost.h:93
StdStrBuf Script
Definition: C4ScriptHost.h:90

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ScriptHost::Reg2List ( C4AulScriptEngine pEngine)
inherited

Definition at line 144 of file C4ScriptHost.cpp.

References C4AulScriptEngine::Child0, C4AulScriptEngine::ChildL, C4ScriptHost::Engine, C4ScriptHost::Next, and C4ScriptHost::Prev.

Referenced by C4MapScriptHost::InitFunctionMap(), C4Game::InitScriptEngine(), C4GameScriptHost::Load(), C4Def::Load(), C4Game::LoadAdditionalSystemGroup(), C4GameScriptHost::LoadData(), and C4ScenarioSection::ScenarioLoad().

145 {
146  // already regged? (def reloaded)
147  if (Engine) return;
148  // reg to list
149  if ((Engine = pEngine))
150  {
151  if ((Prev = Engine->ChildL))
152  Prev->Next = this;
153  else
154  Engine->Child0 = this;
155  Engine->ChildL = this;
156  }
157  else
158  Prev = nullptr;
159  Next = nullptr;
160 }
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:76
C4ScriptHost * ChildL
Definition: C4Aul.h:121
C4ScriptHost * Next
Definition: C4ScriptHost.h:77
C4ScriptHost * Prev
Definition: C4ScriptHost.h:77
C4ScriptHost * Child0
Definition: C4Aul.h:121

Here is the caller graph for this function:

bool C4ScriptHost::ReloadScript ( const char *  szPath,
const char *  szLanguage 
)
protectedvirtualinherited

Definition at line 225 of file C4ScriptHost.cpp.

References _MAX_PATH, C4ComponentHost::GetFilePath(), GetParentPath(), C4ScriptHost::Load(), C4Group::Open(), SEqualNoCase(), and C4ScriptHost::stringTable.

Referenced by C4AulScriptEngine::ReloadScript().

226 {
227  // this?
228  if (SEqualNoCase(szPath, GetFilePath()) || (stringTable && SEqualNoCase(szPath, stringTable->GetFilePath())))
229  {
230  // try reload
231  char szParentPath[_MAX_PATH + 1]; C4Group ParentGrp;
232  if (GetParentPath(szPath, szParentPath))
233  if (ParentGrp.Open(szParentPath))
234  if (Load(ParentGrp, nullptr, szLanguage, stringTable))
235  return true;
236  }
237  return false;
238 }
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
Definition: Standard.cpp:207
#define _MAX_PATH
bool GetParentPath(const char *szFilename, char *szBuffer)
Definition: StdFile.cpp:189
bool Open(const char *szGroupName, bool fCreate=false)
Definition: C4Group.cpp:514
virtual bool Load(C4Group &hGroup, const char *szFilename, const char *szLanguage, C4LangStringTable *pLocalTable)
const char * GetFilePath() const
C4LangStringTable * stringTable
Definition: C4ScriptHost.h:91

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ScriptHost::ResolveAppends ( C4DefList rDefs)
protectedinherited

Definition at line 46 of file C4AulLink.cpp.

References C4ScriptHost::Appends, ASS_PREPARSED, C4ScriptHost::DoAppend(), C4DefList::GetByName(), C4DefList::GetDef(), C4DefList::GetDefCount(), C4ScriptHost::GetPropList(), C4ScriptHost::State, and C4ScriptHost::Warn().

47 {
48  // resolve local appends
49  if (State != ASS_PREPARSED) return false;
50  for (auto & Append : Appends)
51  {
52  if (Append != "*" || !rDefs)
53  {
54  C4Def *Def = rDefs ? rDefs->GetByName(Append) : nullptr;
55  if (Def)
56  {
57  DoAppend(Def);
58  }
59  else
60  {
61  // save id in buffer because AulWarn will use the buffer of C4IdText
62  // to get the id of the object in which the error occurs...
63  // (stupid static buffers...)
64  Warn("#appendto %s not found", Append.getData());
65  }
66  }
67  else
68  {
69  // append to all defs
70  for (int i = 0; i < rDefs->GetDefCount(); i++)
71  {
72  C4Def *pDef = rDefs->GetDef(i);
73  if (!pDef) break;
74  if (pDef == GetPropList()) continue;
75  // append
76  DoAppend(pDef);
77  }
78  }
79  }
80  return true;
81 }
C4Def * GetDef(int32_t Index)
std::list< StdCopyStrBuf > Appends
Definition: C4ScriptHost.h:80
int32_t GetDefCount()
virtual C4PropListStatic * GetPropList()
Definition: C4ScriptHost.h:50
void DoAppend(C4Def *def)
Definition: C4AulLink.cpp:28
Definition: C4Def.h:98
C4Def * GetByName(const StdStrBuf &)
void Warn(const char *pMsg,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: C4AulParse.cpp:123
C4AulScriptState State
Definition: C4ScriptHost.h:93

Here is the call graph for this function:

bool C4ScriptHost::ResolveIncludes ( C4DefList rDefs)
protectedinherited

Definition at line 83 of file C4AulLink.cpp.

References ASS_LINKED, ASS_PREPARSED, C4ScriptHost::Engine, C4DefList::GetByName(), C4AulScriptEngine::GetErrorHandler(), C4ScriptHost::Includes, C4ScriptHost::IncludesResolved, C4AulErrorHandler::OnError(), C4ScriptHost::ResolveIncludes(), C4ScriptHost::Resolving, s, C4Def::Script, C4ScriptHost::SourceScripts, C4ScriptHost::State, and C4ScriptHost::Warn().

Referenced by C4ScriptHost::ResolveIncludes().

84 {
85  // Had been preparsed?
86  if (State != ASS_PREPARSED) return false;
87  // has already been resolved?
88  if (IncludesResolved) return true;
89  // catch circular includes
90  if (Resolving)
91  {
92  Engine->GetErrorHandler()->OnError(C4AulParseError(this, "Circular include chain detected - ignoring all includes!").what());
93  IncludesResolved = true;
94  State = ASS_LINKED;
95  return false;
96  }
97  Resolving=true;
98  // append all includes to local script
99  for (std::list<StdCopyStrBuf>::reverse_iterator i = Includes.rbegin(); i != Includes.rend(); ++i)
100  {
101  C4Def *Def = rDefs ? rDefs->GetByName(*i) : nullptr;
102  if (Def)
103  {
104  // resolve #includes in included script first (#include-chains :( )
105  if (!Def->Script.IncludesResolved)
106  if (!Def->Script.ResolveIncludes(rDefs))
107  continue; // skip this #include
108 
109  for (std::list<C4ScriptHost *>::reverse_iterator s = Def->Script.SourceScripts.rbegin(); s != Def->Script.SourceScripts.rend(); ++s)
110  {
111  if (std::find(SourceScripts.begin(), SourceScripts.end(), *s) == SourceScripts.end())
112  SourceScripts.push_front(*s);
113  }
114  }
115  else
116  {
117  // save id in buffer because AulWarn will use the buffer of C4IdText
118  // to get the id of the object in which the error occurs...
119  // (stupid static buffers...)
120  Warn("#include %s not found", i->getData());
121  }
122  }
123  IncludesResolved = true;
124  // includes/appends are resolved now (for this script)
125  Resolving=false;
126  State = ASS_LINKED;
127  return true;
128 }
bool IncludesResolved
Definition: C4ScriptHost.h:88
C4AulErrorHandler * GetErrorHandler() const
Definition: C4Aul.h:173
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:76
std::list< StdCopyStrBuf > Includes
Definition: C4ScriptHost.h:79
Definition: C4Def.h:98
bool ResolveIncludes(C4DefList *rDefs)
Definition: C4AulLink.cpp:83
C4Def * GetByName(const StdStrBuf &)
virtual void OnError(const char *msg)=0
void Warn(const char *pMsg,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: C4AulParse.cpp:123
C4DefScriptHost Script
Definition: C4Def.h:181
std::list< C4ScriptHost * > SourceScripts
Definition: C4ScriptHost.h:56
#define s
C4AulScriptState State
Definition: C4ScriptHost.h:93

Here is the call graph for this function:

Here is the caller graph for this function:

std::string C4ScriptHost::Translate ( const std::string &  text) const
inherited

Definition at line 240 of file C4ScriptHost.cpp.

References C4ScriptHost::stringTable, and C4LangStringTable::Translate().

241 {
242  if (stringTable)
243  return stringTable->Translate(text);
245 }
const std::string & Translate(const std::string &text) const
C4LangStringTable * stringTable
Definition: C4ScriptHost.h:91

Here is the call graph for this function:

void C4ScriptHost::UnLink ( )
protectedvirtualinherited

Definition at line 130 of file C4AulLink.cpp.

References ASS_PREPARSED, C4VPropList(), C4ScriptHost::DeleteOwnedPropLists(), C4ScriptHost::Engine, C4ScriptHost::GetPropList(), C4AulScriptEngine::GetPropList(), C4ScriptHost::IncludesResolved, P_Prototype, C4PropList::SetProperty(), and C4ScriptHost::State.

131 {
132  C4PropList * p = GetPropList();
133  if (p)
134  {
135  p->C4PropList::Clear();
137  }
138 
139  // Delete cyclic references of owned proplists
141 
142  // includes will have to be re-resolved now
143  IncludesResolved = false;
144 
146 }
bool IncludesResolved
Definition: C4ScriptHost.h:88
C4PropListStatic * GetPropList()
Definition: C4Aul.h:151
void SetProperty(C4PropertyName k, const C4Value &to)
Definition: C4PropList.h:120
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:76
virtual C4PropListStatic * GetPropList()
Definition: C4ScriptHost.h:50
C4Value C4VPropList(C4PropList *p)
Definition: C4Value.h:245
void DeleteOwnedPropLists()
C4AulScriptState State
Definition: C4ScriptHost.h:93

Here is the call graph for this function:

void C4ScriptHost::UnlinkOwnedFunctions ( )
protectedinherited

Definition at line 72 of file C4ScriptHost.cpp.

References C4V_Function, C4VFunction(), C4Value::getFunction(), C4PropList::GetPropertyByS(), C4ScriptHost::GetPropList(), C4ScriptHost::ownedFunctions, C4AulScriptFunc::OwnerOverloaded, C4PropList::ResetProperty(), ScriptEngine, C4PropList::SetPropertyByS(), C4AulFunc::SFunc(), C4AulScriptFunc::SFunc(), and C4PropList::Thaw().

Referenced by C4ScriptHost::Clear().

73 {
74  // Remove owned functions from their parents. This solves a problem
75  // where overloading a definition would unload the C4ScriptHost, but
76  // keep around global functions, which then contained dangling pointers.
77  for (const auto &box : ownedFunctions)
78  {
79  assert(box.GetType() == C4V_Function);
80  C4AulScriptFunc *func = box._getFunction()->SFunc();
81  C4PropList *parent = func->Parent;
82  if (parent == GetPropList())
83  continue;
84  assert(parent == &::ScriptEngine);
85  C4Value v;
86  parent->GetPropertyByS(func->Name, &v);
87  if (v.getFunction() == func)
88  {
89  // If the function we're deleting is the top-level function in
90  // the inheritance chain, promote the next one in its stead;
91  // if there is no overloaded function, remove the property.
92  parent->Thaw();
93  if (func->OwnerOverloaded)
94  parent->SetPropertyByS(func->Name, C4VFunction(func->OwnerOverloaded));
95  else
96  parent->ResetProperty(func->Name);
97  }
98  else
99  {
100  C4AulScriptFunc *func_chain = v.getFunction()->SFunc();
101  assert(func_chain != func);
102  while (func_chain)
103  {
104  // Unlink the removed function from the inheritance chain
105  if (func_chain->OwnerOverloaded == func)
106  {
107  func_chain->OwnerOverloaded = func->OwnerOverloaded;
108  break;
109  }
110  assert(func_chain->OwnerOverloaded && "Removed function not found in inheritance chain");
111  func_chain = func_chain->OwnerOverloaded->SFunc();
112  }
113  }
114  }
115  ownedFunctions.clear();
116 }
virtual void ResetProperty(C4String *k)
Definition: C4PropList.cpp:973
void Thaw()
Definition: C4PropList.h:129
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
virtual C4PropListStatic * GetPropList()
Definition: C4ScriptHost.h:50
C4AulFunc * OwnerOverloaded
virtual bool GetPropertyByS(const C4String *k, C4Value *pResult) const
Definition: C4PropList.cpp:757
C4AulScriptFunc * SFunc() override
C4Value C4VFunction(C4AulFunc *pFn)
Definition: C4Value.h:250
virtual void SetPropertyByS(C4String *k, const C4Value &to)
Definition: C4PropList.cpp:952
virtual C4AulScriptFunc * SFunc()
Definition: C4AulFunc.h:65
std::vector< C4Value > ownedFunctions
Definition: C4ScriptHost.h:96
C4AulFunc * getFunction() const
Definition: C4Value.h:119

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ScriptHost::Unreg ( )
protectedinherited

Definition at line 135 of file C4ScriptHost.cpp.

References C4AulScriptEngine::Child0, C4AulScriptEngine::ChildL, C4ScriptHost::Engine, C4ScriptHost::Next, and C4ScriptHost::Prev.

Referenced by C4ScriptHost::~C4ScriptHost().

136 {
137  // remove from list
138  if (Prev) Prev->Next = Next; else if (Engine) Engine->Child0 = Next;
139  if (Next) Next->Prev = Prev; else if (Engine) Engine->ChildL = Prev;
140  Prev = Next = nullptr;
141  Engine = nullptr;
142 }
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:76
C4ScriptHost * ChildL
Definition: C4Aul.h:121
C4ScriptHost * Next
Definition: C4ScriptHost.h:77
C4ScriptHost * Prev
Definition: C4ScriptHost.h:77
C4ScriptHost * Child0
Definition: C4Aul.h:121

Here is the caller graph for this function:

void C4ScriptHost::Warn ( const char *  pMsg,
  ... 
)
protectedinherited

Definition at line 123 of file C4AulParse.cpp.

References StdStrBuf::AppendFormat(), C4ScriptHost::Engine, FormatStringV(), StdStrBuf::getData(), C4AulScriptEngine::GetErrorHandler(), C4AulErrorHandler::OnWarning(), and C4ScriptHost::ScriptName.

Referenced by C4ScriptHost::DoAppend(), C4DefScriptHost::Parse(), C4AulParse::Parse_Array(), C4ScriptHost::ResolveAppends(), and C4ScriptHost::ResolveIncludes().

124 {
125  va_list args; va_start(args, pMsg);
126  StdStrBuf Buf = FormatStringV(pMsg, args);
127  Buf.AppendFormat(" (%s)", ScriptName.getData());
129  va_end(args);
130 }
const char * getData() const
Definition: StdBuf.h:442
C4AulErrorHandler * GetErrorHandler() const
Definition: C4Aul.h:173
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:76
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: StdBuf.cpp:190
StdStrBuf FormatStringV(const char *szFmt, va_list args)
Definition: StdBuf.cpp:276
virtual void OnWarning(const char *msg)=0
StdCopyStrBuf ScriptName
Definition: C4ScriptHost.h:57

Here is the call graph for this function:

Here is the caller graph for this function:

Member Data Documentation

StdCopyStrBuf C4ComponentHost::Filename
protectedinherited
StdCopyStrBuf C4ComponentHost::FilePath
protectedinherited
bool C4ScriptHost::IncludesResolved
protectedinherited
C4Set<C4Property> C4ScriptHost::LocalValues
protectedinherited

Definition at line 92 of file C4ScriptHost.h.

Referenced by C4ScriptHost::Clear(), and C4ScriptHost::Preparse().

C4ScriptHost * C4ScriptHost::Next {nullptr}
protectedinherited
std::vector<C4Value> C4ScriptHost::ownedFunctions
protectedinherited
std::vector<C4Value> C4ScriptHost::ownedPropLists
protectedinherited

Definition at line 101 of file C4ScriptHost.h.

Referenced by C4ScriptHost::DeleteOwnedPropLists().

C4ScriptHost* C4ScriptHost::Prev {nullptr}
protectedinherited

Definition at line 77 of file C4ScriptHost.h.

Referenced by C4ScriptHost::Reg2List(), and C4ScriptHost::Unreg().

bool C4ScriptHost::Resolving
protectedinherited

Definition at line 87 of file C4ScriptHost.h.

Referenced by C4ScriptHost::C4ScriptHost(), and C4ScriptHost::ResolveIncludes().

std::list<C4ScriptHost *> C4ScriptHost::SourceScripts
inherited

The documentation for this class was generated from the following files: