OpenClonk
C4ScriptHost.h
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 1998-2000, Matthes Bender
5  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
6  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
7  *
8  * Distributed under the terms of the ISC license; see accompanying file
9  * "COPYING" for details.
10  *
11  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
12  * See accompanying file "TRADEMARK" for details.
13  *
14  * To redistribute this file separately, substitute the full license texts
15  * for the above references.
16  */
17 
18 /* Component host for CAulScript */
19 
20 #ifndef INC_C4ScriptHost
21 #define INC_C4ScriptHost
22 
24 #include "script/C4Aul.h"
25 #include "script/C4AulAST.h"
26 
27 #include <bitset>
28 #include <deque>
29 
30 // aul script state
32 {
33  ASS_NONE, // nothing
34  ASS_PREPARSED, // function list built; CodeSize set
35  ASS_LINKED, // includes and appends resolved
36  ASS_PARSED // byte code generated
37 };
38 
39 // generic script host for objects
41 {
42 public:
43  ~C4ScriptHost() override;
44  virtual bool Delete() { return false; } // do NOT delete this - it's just a class member!
45 
46  void Clear();
47  virtual bool Load(C4Group &hGroup, const char *szFilename,
48  const char *szLanguage, C4LangStringTable *pLocalTable);
49  virtual bool LoadData(const char *szFilename, const char *szData, class C4LangStringTable *pLocalTable);
50  void Reg2List(C4AulScriptEngine *pEngine); // reg to linked list
51  virtual C4PropListStatic * GetPropList() { return nullptr; }
52  const C4PropListStatic *GetPropList() const { return const_cast<C4ScriptHost*>(this)->GetPropList(); }
53  const char *GetScript() const { return Script.getData(); }
54  bool IsReady() { return State == ASS_PARSED; } // whether script calls may be done
55  // Translate a string using the script's lang table
56  std::string Translate(const std::string &text) const;
57  std::deque<C4ScriptHost *> SourceScripts;
58  StdCopyStrBuf ScriptName; // script name
59 
60  bool IsWarningEnabled(const char *pos, C4AulWarningId warning) const;
61 
62 protected:
63  C4ScriptHost();
64  void Unreg(); // remove from list
65  void MakeScript();
66  virtual bool ReloadScript(const char *szPath, const char *szLanguage);
67 
68  bool Preparse(); // preparse script; return if successfull
69  virtual bool Parse(); // parse preparsed script; return if successfull
70  virtual void UnLink(); // reset to unlinked state
71 
72  void UnlinkOwnedFunctions();
73  void DeleteOwnedPropLists();
74 
75  void Warn(const char *pMsg, ...) GNUC_FORMAT_ATTRIBUTE_O;
76 
77  C4AulScriptEngine *Engine{nullptr}; //owning engine
78  C4ScriptHost *Prev{nullptr}, *Next{nullptr}; // tree structure
79 
80  std::list<StdCopyStrBuf> Includes; // include list
81  std::list<StdCopyStrBuf> Appends; // append list
82 
83  virtual void AddEngineFunctions() {}; // add any engine functions specific to this script host
85  bool ResolveIncludes(C4DefList *rDefs); // resolve includes
86  bool ResolveAppends(C4DefList *rDefs); // resolve appends
87  void DoAppend(C4Def *def);
88  bool Resolving; // set while include-resolving, to catch circular includes
90 
91  StdStrBuf Script; // script
94  C4AulScriptState State{ASS_NONE}; // script state
95 
96  // list of all functions generated from code in this script host
97  std::vector<C4Value> ownedFunctions;
98 
99  // list of all static proplists that refer to this script host
100  // filled in at link time and used to delete all proplists
101  // in Clear() even in case of cyclic references.
102  std::vector<C4Value> ownedPropLists;
103 
104  void EnableWarning(const char *pos, C4AulWarningId warning, bool enable = true);
105 
106  friend class C4AulParse;
107  friend class C4AulProfiler;
108  friend class C4AulScriptEngine;
109  friend class C4AulDebug;
110  friend class C4AulCompiler;
111  friend class C4AulScriptFunc;
112 
113 private:
114  std::map<const char*, std::bitset<(size_t)C4AulWarningId::WarningCount>> enabledWarnings;
115  std::unique_ptr<::aul::ast::Script> ast;
116 };
117 
118 // script host for System.ocg scripts and scenario section Objects.c
120 {
121  C4Value ParserPropList;
122 public:
123  C4ExtraScriptHost(C4String *parent_key_name = nullptr);
124  ~C4ExtraScriptHost() override;
125  void Clear();
126 
127  bool Delete() override { return true; }
128  C4PropListStatic * GetPropList() override;
129 };
130 
131 // script host for scenario section Objects.c
133 {
134 public:
136 };
137 
138 // script host for defs
140 {
141 public:
143 
144  void SetDef(C4Def *to_def) { Def=to_def; }
145  bool Parse() override;
146  C4PropListStatic * GetPropList() override;
147 protected:
148  C4Def *Def{nullptr}; // owning def file
149 };
150 
151 
152 // script host for scenario scripts
154 {
155 public:
157  ~C4GameScriptHost() override;
158  bool Load(C4Group &, const char *, const char *, C4LangStringTable *) override;
159  bool LoadData(const char *, const char *, C4LangStringTable *) override;
160  void Clear();
161  C4PropListStatic * GetPropList() override;
162  void Denumerate(C4ValueNumbers * numbers);
163  C4Value Call(const char *szFunction, C4AulParSet *pPars=nullptr, bool fPassError=false);
167 };
168 
170 
171 #endif
C4AulWarningId
Definition: C4Aul.h:30
C4GameScriptHost GameScript
C4AulScriptState
Definition: C4ScriptHost.h:32
@ ASS_PREPARSED
Definition: C4ScriptHost.h:34
@ ASS_LINKED
Definition: C4ScriptHost.h:35
@ ASS_NONE
Definition: C4ScriptHost.h:33
@ ASS_PARSED
Definition: C4ScriptHost.h:36
#define GNUC_FORMAT_ATTRIBUTE_O
Definition: C4Def.h:99
bool Parse() override
C4PropListStatic * GetPropList() override
void SetDef(C4Def *to_def)
Definition: C4ScriptHost.h:144
C4PropListStatic * GetPropList() override
bool Delete() override
Definition: C4ScriptHost.h:127
~C4ExtraScriptHost() override
C4ExtraScriptHost(C4String *parent_key_name=nullptr)
C4PropListStatic * GetPropList() override
C4Value ScenPrototype
Definition: C4ScriptHost.h:165
C4Effect * pScenarioEffects
Definition: C4ScriptHost.h:166
bool Load(C4Group &, const char *, const char *, C4LangStringTable *) override
C4Value Call(const char *szFunction, C4AulParSet *pPars=nullptr, bool fPassError=false)
void Denumerate(C4ValueNumbers *numbers)
~C4GameScriptHost() override
C4Value ScenPropList
Definition: C4ScriptHost.h:164
bool LoadData(const char *, const char *, C4LangStringTable *) override
std::vector< C4Value > ownedPropLists
Definition: C4ScriptHost.h:102
C4Set< C4Property > LocalValues
Definition: C4ScriptHost.h:93
std::vector< C4Value > ownedFunctions
Definition: C4ScriptHost.h:97
bool Preparse()
Definition: C4AulParse.cpp:693
std::string Translate(const std::string &text) const
C4ScriptHost * Next
Definition: C4ScriptHost.h:78
~C4ScriptHost() override
void DoAppend(C4Def *def)
Definition: C4AulLink.cpp:28
virtual bool Load(C4Group &hGroup, const char *szFilename, const char *szLanguage, C4LangStringTable *pLocalTable)
void DeleteOwnedPropLists()
virtual bool Delete()
Definition: C4ScriptHost.h:44
virtual bool ReloadScript(const char *szPath, const char *szLanguage)
bool ResolveIncludes(C4DefList *rDefs)
Definition: C4AulLink.cpp:83
C4AulScriptEngine * Engine
Definition: C4ScriptHost.h:77
const C4PropListStatic * GetPropList() const
Definition: C4ScriptHost.h:52
C4AulScriptState State
Definition: C4ScriptHost.h:94
virtual bool Parse()
bool IsWarningEnabled(const char *pos, C4AulWarningId warning) const
virtual void UnLink()
Definition: C4AulLink.cpp:130
virtual void AddEngineFunctions()
Definition: C4ScriptHost.h:83
C4LangStringTable * stringTable
Definition: C4ScriptHost.h:92
void UnlinkOwnedFunctions()
StdStrBuf Script
Definition: C4ScriptHost.h:91
bool IncludesResolved
Definition: C4ScriptHost.h:89
StdCopyStrBuf ScriptName
Definition: C4ScriptHost.h:58
bool IsReady()
Definition: C4ScriptHost.h:54
void CopyPropList(C4Set< C4Property > &from, C4PropListStatic *to)
std::list< StdCopyStrBuf > Appends
Definition: C4ScriptHost.h:81
std::list< StdCopyStrBuf > Includes
Definition: C4ScriptHost.h:80
bool ResolveAppends(C4DefList *rDefs)
Definition: C4AulLink.cpp:46
virtual C4PropListStatic * GetPropList()
Definition: C4ScriptHost.h:51
void EnableWarning(const char *pos, C4AulWarningId warning, bool enable=true)
std::deque< C4ScriptHost * > SourceScripts
Definition: C4ScriptHost.h:57
void Warn(const char *pMsg,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: C4AulParse.cpp:124
void Reg2List(C4AulScriptEngine *pEngine)
virtual bool LoadData(const char *szFilename, const char *szData, class C4LangStringTable *pLocalTable)
C4ScriptHost * Prev
Definition: C4ScriptHost.h:78
const char * GetScript() const
Definition: C4ScriptHost.h:53
const char * getData() const
Definition: StdBuf.h:442