diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2013-06-11 21:55:13 -0700 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2013-06-11 23:27:33 -0700 |
commit | 8b5370313dcc00a45ea5c3e8b4c497bc00fd8e13 (patch) | |
tree | 15e8a4841af992e17794f26fc7991ed40c35bd51 /src/map/script.hpp | |
parent | 8c6072df499ef9068346fbe8313b63dbba1e4e82 (diff) | |
download | tmwa-8b5370313dcc00a45ea5c3e8b4c497bc00fd8e13.tar.gz tmwa-8b5370313dcc00a45ea5c3e8b4c497bc00fd8e13.tar.bz2 tmwa-8b5370313dcc00a45ea5c3e8b4c497bc00fd8e13.tar.xz tmwa-8b5370313dcc00a45ea5c3e8b4c497bc00fd8e13.zip |
Allegedly remove all manual memory management
Diffstat (limited to 'src/map/script.hpp')
-rw-r--r-- | src/map/script.hpp | 90 |
1 files changed, 76 insertions, 14 deletions
diff --git a/src/map/script.hpp b/src/map/script.hpp index 4caf58e..171f8a3 100644 --- a/src/map/script.hpp +++ b/src/map/script.hpp @@ -2,43 +2,105 @@ #define SCRIPT_HPP #include <cstdint> +#include <cstring> // for inlined get_str - TODO remove #include <string> +#include <vector> #include "../common/db.hpp" +#include "../common/dumb_ptr.hpp" -enum class ScriptCode : uint8_t; +enum class ByteCode : uint8_t; +struct str_data_t; + +class ScriptBuffer +{ + std::vector<ByteCode> script_buf; +public: + // construction methods used only by script.cpp + void add_scriptc(ByteCode a); + void add_scriptb(uint8_t a); + void add_scripti(uint32_t a); + void add_scriptl(str_data_t *a); + void set_label(str_data_t *ld, int pos_); + const char *parse_simpleexpr(const char *p); + const char *parse_subexpr(const char *p, int limit); + const char *parse_expr(const char *p); + const char *parse_line(const char *p); + void parse_script(const char *src, int line); + + // consumption methods used only by script.cpp + ByteCode operator[](size_t i) const { return script_buf[i]; } + const char *get_str(size_t i) const + { + return reinterpret_cast<const char *>(&script_buf[i]); + } + + // method used elsewhere +}; + +struct ScriptPointer +{ + const ScriptBuffer *code; + size_t pos; + + ScriptPointer() + : code() + , pos() + {} + + ScriptPointer(const ScriptBuffer *c, size_t p) + : code(c) + , pos(p) + {} + + ByteCode peek() const { return (*code)[pos]; } + ByteCode pop() { return (*code)[pos++]; } + const char *pops() + { + const char *rv = code->get_str(pos); + pos += strlen(rv); + return rv; + } +}; struct script_data { - ScriptCode type; - union + ByteCode type; + union uu { int num; - const char *str; - const ScriptCode *script; + dumb_string str; + // Not a ScriptPointer - pos is stored in a separate slot, + // to avoid exploding the struct for everyone. + const ScriptBuffer *script; + + uu() { memset(this, '\0', sizeof(*this)); } + ~uu() = default; + uu(const uu&) = default; + uu& operator = (const uu&) = default; } u; }; struct script_stack { - int sp, sp_max; - struct script_data *stack_data; + std::vector<struct script_data> stack_datav; }; +enum class ScriptEndState; // future improvements coming! class ScriptState { public: struct script_stack *stack; int start, end; - int pos, state; + ScriptEndState state; int rid, oid; - const ScriptCode *script, *new_script; - int defsp, new_pos, new_defsp; + ScriptPointer scriptp, new_scriptp; + int defsp, new_defsp; }; -const ScriptCode *parse_script(const char *, int); +std::unique_ptr<const ScriptBuffer> parse_script(const char *, int); typedef struct argrec { const char *name; @@ -52,13 +114,13 @@ typedef struct argrec _aru(const char *z) : s(z) {} } v; } argrec_t; -int run_script_l(const ScriptCode *, int, int, int, int, argrec_t *args); -int run_script(const ScriptCode *, int, int, int); +int run_script_l(ScriptPointer, int, int, int, argrec_t *args); +int run_script(ScriptPointer, int, int); extern Map<std::string, int> scriptlabel_db; extern -DMap<std::string, const ScriptCode *> userfunc_db; +UPMap<std::string, const ScriptBuffer> userfunc_db; void script_config_read(); void do_init_script(void); |