From 3b98f3439e33b15bba2036c402f9925340fdb2b9 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Sat, 29 Jun 2013 23:23:43 -0700 Subject: Poison std::string and use the various string classes --- src/map/magic-interpreter-parser.ypp | 63 +++++++++++++++++------------------- 1 file changed, 30 insertions(+), 33 deletions(-) (limited to 'src/map/magic-interpreter-parser.ypp') diff --git a/src/map/magic-interpreter-parser.ypp b/src/map/magic-interpreter-parser.ypp index a392bc7..e6d69b4 100644 --- a/src/map/magic-interpreter-parser.ypp +++ b/src/map/magic-interpreter-parser.ypp @@ -19,21 +19,25 @@ // I still don't get why this is necessary. #define YYLEX_PARAM 0, 0 +// can't use src/warnings.hpp in generated code #pragma GCC diagnostic warning "-Wall" #pragma GCC diagnostic warning "-Wextra" #pragma GCC diagnostic warning "-Wformat" +#ifndef __clang__ +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif static -size_t intern_id(const_string id_name); +size_t intern_id(ZString id_name); static -dumb_ptr fun_expr(const std::string& name, const_array> argv, int line, int column); +dumb_ptr fun_expr(FString name, const_array> argv, int line, int column); static dumb_ptr dot_expr(dumb_ptr lhs, int id); static -void BIN_EXPR(dumb_ptr & x, const std::string& name, dumb_ptr arg1, dumb_ptr arg2, int line, int column) +void BIN_EXPR(dumb_ptr& x, FString name, dumb_ptr arg1, dumb_ptr arg2, int line, int column) { dumb_ptr e[2]; e[0] = arg1; @@ -72,7 +76,7 @@ static void add_teleport_anchor(dumb_ptr anchor, int line_nr); static -dumb_ptr op_effect(const std::string& name, const_array> argv, int line, int column); +dumb_ptr op_effect(FString name, const_array> argv, int line, int column); // in magic-interpreter-lexer.cpp int magic_frontend_lex(YYSTYPE *, YYLTYPE *); @@ -81,13 +85,13 @@ static void install_proc(dumb_ptr proc); static -dumb_ptr call_proc(const_string name, dumb_ptr>> argvp, int line_nr, int column); +dumb_ptr call_proc(ZString name, dumb_ptr>> argvp, int line_nr, int column); static -void bind_constant(const std::string& name, val_t *val, int line_nr); +void bind_constant(FString name, val_t *val, int line_nr); static -val_t *find_constant(const std::string& name); +val_t *find_constant(FString name); } // %code @@ -919,7 +923,7 @@ item_name : STRING { - struct item_data *item = itemdb_searchname($1.c_str()); + struct item_data *item = itemdb_searchname(stringish(ZString($1))); if (!item) { fail(@1.first_line, @1.first_column, "Unknown item `%s'\n", $1.c_str()); @@ -1066,7 +1070,7 @@ effect | SCRIPT_DATA { $$ = new_effect(EFFECT::SCRIPT); - $$->e.e_script = dumb_ptr(parse_script($1.c_str(), @1.first_line).release()); + $$->e.e_script = dumb_ptr(parse_script(ZString($1), @1.first_line).release()); $1.delete_(); if ($$->e.e_script == NULL) fail(@1.first_line, @1.first_column, "Failed to compile script\n"); @@ -1098,9 +1102,8 @@ effect_list %% -size_t intern_id(const_string id_name_) +size_t intern_id(ZString id_name) { - std::string id_name(id_name_.begin(), id_name_.end()); size_t i; for (i = 0; i < magic_conf.varv.size(); i++) if (id_name == magic_conf.varv[i].name) @@ -1173,18 +1176,17 @@ dumb_ptr dot_expr(dumb_ptr expr, int id) return retval; } -dumb_ptr fun_expr(const std::string& name, const_array> argv, int line, int column) +dumb_ptr fun_expr(FString name, const_array> argv, int line, int column) { - int id; dumb_ptr expr; - fun_t *fun = magic_get_fun(name, &id); + fun_t *fun = magic_get_fun(name); if (!fun) fail(line, column, "Unknown function `%s'\n", name.c_str()); - else if (strlen(fun->signature) != argv.size()) + else if (fun->signature.size() != argv.size()) { fail(line, column, "Incorrect number of arguments to function `%s': Expected %zu, found %zu\n", - name.c_str(), strlen(fun->signature), argv.size()); + name.c_str(), fun->signature.size(), argv.size()); fun = NULL; } @@ -1193,7 +1195,7 @@ dumb_ptr fun_expr(const std::string& name, const_array> expr = magic_new_expr(EXPR::FUNAPP); expr->e.e_funapp.line_nr = line; expr->e.e_funapp.column = column; - expr->e.e_funapp.id = id; + expr->e.e_funapp.funp = fun; assert (argv.size() <= MAX_ARGS); expr->e.e_funapp.args_nr = argv.size(); @@ -1212,10 +1214,7 @@ dumb_ptr fun_expr(const std::string& name, const_array> dumb_ptr new_spell(dumb_ptr guard) { - static int spell_counter = 0; - auto retval = dumb_ptr::make(); - retval->index_ = ++spell_counter; retval->spellguard = guard; return retval; } @@ -1288,18 +1287,17 @@ dumb_ptr set_effect_continuation(dumb_ptr src, dumb_ptr op_effect(const std::string& name, const_array> argv, int line, int column) +dumb_ptr op_effect(FString name, const_array> argv, int line, int column) { - int id; dumb_ptr effect; - op_t *op = magic_get_op(name, &id); + op_t *op = magic_get_op(name); if (!op) fail(line, column, "Unknown operation `%s'\n", name.c_str()); - else if (strlen(op->signature) != argv.size()) + else if (op->signature.size() != argv.size()) { fail(line, column, "Incorrect number of arguments to operation `%s': Expected %zu, found %zu\n", - name.c_str(), strlen(op->signature), argv.size()); + name.c_str(), op->signature.size(), argv.size()); op = NULL; } @@ -1308,7 +1306,7 @@ dumb_ptr op_effect(const std::string& name, const_arraye.e_op.line_nr = line; effect->e.e_op.column = column; - effect->e.e_op.id = id; + effect->e.e_op.opp = op; assert (argv.size() <= MAX_ARGS); effect->e.e_op.args_nr = argv.size(); @@ -1321,7 +1319,7 @@ dumb_ptr op_effect(const std::string& name, const_array procs; +std::map procs; // I think this was a memory leak (or undefined behavior) void install_proc(dumb_ptr proc) @@ -1329,9 +1327,8 @@ void install_proc(dumb_ptr proc) procs.insert({proc->name, std::move(*proc)}); } -dumb_ptr call_proc(const_string name_, dumb_ptr>> argvp, int line_nr, int column) +dumb_ptr call_proc(ZString name, dumb_ptr>> argvp, int line_nr, int column) { - std::string name(name_.begin(), name_.end()); auto pi = procs.find(name); if (pi == procs.end()) { @@ -1355,9 +1352,9 @@ dumb_ptr call_proc(const_string name_, dumb_ptr const_defm; +std::map const_defm; -void bind_constant(const std::string& name, val_t *val, int line_nr) +void bind_constant(FString name, val_t *val, int line_nr) { if (!const_defm.insert({name, *val}).second) { @@ -1365,7 +1362,7 @@ void bind_constant(const std::string& name, val_t *val, int line_nr) } } -val_t *find_constant(const std::string& name) +val_t *find_constant(FString name) { auto it = const_defm.find(name); if (it != const_defm.end()) @@ -1379,7 +1376,7 @@ static int error_flag; inline -void INTERN_ASSERT(const char *name, int id) +void INTERN_ASSERT(ZString name, int id) { int zid = intern_id(name); if (zid != id) -- cgit v1.2.3-60-g2f50