summaryrefslogtreecommitdiff
path: root/src/map/magic-interpreter-parser.ypp
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/magic-interpreter-parser.ypp')
-rw-r--r--src/map/magic-interpreter-parser.ypp708
1 files changed, 366 insertions, 342 deletions
diff --git a/src/map/magic-interpreter-parser.ypp b/src/map/magic-interpreter-parser.ypp
index 5fe2646..dd62edf 100644
--- a/src/map/magic-interpreter-parser.ypp
+++ b/src/map/magic-interpreter-parser.ypp
@@ -1,71 +1,84 @@
%code requires {
-#include "magic-expr.hpp"
+#include "magic-interpreter.hpp"
}
%code{
#include "magic-interpreter-parser.hpp"
-#include "magic-interpreter.hpp"
-#include <stdarg.h>
+#include <cstdarg> // exception to "no va_list" rule, even after cxxstdio
+
+#include "../common/cxxstdio.hpp"
+
+#include "itemdb.hpp"
+#include "magic-expr.hpp"
#define YYLEX_PARAM 0, 0
-static int
-intern_id(const char *id_name);
+static
+int intern_id(const char *id_name);
-static expr_t *
-fun_expr(const char *name, int args_nr, expr_t **args, int line, int column);
+static
+expr_t *fun_expr(const char *name, int args_nr, expr_t **args, int line, int column);
-static expr_t *
-dot_expr(expr_t *lhs, int id);
+static
+expr_t *dot_expr(expr_t *lhs, int id);
-#define BIN_EXPR(x, name, arg1, arg2, line, column) { expr_t *e[2]; e[0] = arg1; e[1] = arg2; x = fun_expr(name, 2, e, line, column); }
+static
+void BIN_EXPR(expr_t *& x, const char *name, expr_t *arg1, expr_t *arg2, int line, int column)
+{
+ expr_t *e[2];
+ e[0] = arg1;
+ e[1] = arg2;
+ x = fun_expr(name, 2, e, line, column);
+}
-static int failed_flag = 0;
+static
+int failed_flag = 0;
-static void
-magic_frontend_error(const char *msg);
+static
+void magic_frontend_error(const char *msg);
-static void
-fail(int line, int column, const char *fmt, ...);
+static
+void fail(int line, int column, const char *fmt, ...);
-static spell_t *
-new_spell(spellguard_t *guard);
+static
+spell_t *new_spell(spellguard_t *guard);
-static spellguard_t *
-spellguard_implication(spellguard_t *a, spellguard_t *b);
+static
+spellguard_t *spellguard_implication(spellguard_t *a, spellguard_t *b);
-static spellguard_t *
-new_spellguard(int ty);
+static
+spellguard_t *new_spellguard(SPELLGUARD ty);
-static effect_t *
-new_effect(int ty);
+static
+effect_t *new_effect(EFFECT ty);
-static effect_t *
-set_effect_continuation(effect_t *src, effect_t *continuation);
+static
+effect_t *set_effect_continuation(effect_t *src, effect_t *continuation);
-static void
-add_spell(spell_t *spell, int line_nr);
+static
+void add_spell(spell_t *spell, int line_nr);
-static void
-add_teleport_anchor(teleport_anchor_t *anchor, int line_nr);
+static
+void add_teleport_anchor(teleport_anchor_t *anchor, int line_nr);
-static effect_t *
-op_effect(char *name, int args_nr, expr_t **args, int line, int column);
+static
+effect_t *op_effect(char *name, int args_nr, expr_t **args, int line, int column);
+// in magic-interpreter-lexer.cpp
int magic_frontend_lex(YYSTYPE *, YYLTYPE *);
-static void
-install_proc(proc_t *proc);
+static
+void install_proc(proc_t *proc);
-static effect_t *
-call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column);
+static
+effect_t *call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column);
-static void
-bind_constant(char *name, val_t *val, int line_nr);
+static
+void bind_constant(char *name, val_t *val, int line_nr);
-static val_t *
-find_constant(char *name);
+static
+val_t *find_constant(char *name);
}
@@ -75,6 +88,9 @@ find_constant(char *name);
%union {
int i;
+ SPELL_FLAG spell_flags;
+ SPELLARG spell_arg;
+ FOREACH_FILTER foreach_filter;
char *s;
int op;
magic_conf_t *magic_conf;
@@ -85,7 +101,7 @@ find_constant(char *name);
args_rec_t arg_list;
struct { int letdefs_nr; letdef_t *letdefs; } letdefs;
spell_t *spell;
- struct { int id, ty; } spellarg_def;
+ struct { int id; SPELLARG ty; } spellarg_def;
letdef_t vardef;
spellguard_t *spellguard;
component_t *components;
@@ -152,7 +168,7 @@ find_constant(char *name);
%token SKIP
%token ABORT
%token BREAK
-%token EFFECT
+%token EFFECT_
%token ATEND
%token ATTRIGGER
%token PC_F
@@ -186,15 +202,15 @@ find_constant(char *name);
%type <components> items
%type <components> item_list
%type <i> item_name
-%type <i> selection;
+%type <foreach_filter> selection;
%type <effect> effect
%type <effect> effect_list
%type <effect> maybe_trigger
%type <effect> maybe_end
-%type <i> spell_flags;
+%type <spell_flags> spell_flags;
%type <expr> expr
-%type <i> arg_ty
+%type <spell_arg> arg_ty
%type <proc> proc_formals_list
%type <proc> proc_formals_list_ne
@@ -211,41 +227,41 @@ find_constant(char *name);
%%
-spellconf : /* empty */
+spellconf : /* empty */
{}
| spellconf_option semicolons spellconf
{}
- ;
+ ;
-semicolons : /* empty */
- {}
+semicolons : /* empty */
+ {}
| semicolons ';'
{}
- ;
+ ;
-proc_formals_list : /* empty */
- { CREATE ($$, proc_t, 1); }
- | proc_formals_list_ne
+proc_formals_list : /* empty */
+ { CREATE($$, proc_t, 1); }
+ | proc_formals_list_ne
{ $$ = $1; }
- ;
+ ;
-proc_formals_list_ne : ID
- { CREATE ($$, proc_t, 1);
+proc_formals_list_ne : ID
+ { CREATE($$, proc_t, 1);
$$->args_nr = 1;
$$->args = (int*)malloc(sizeof(int));
$$->args[0] = intern_id($1);
}
- | proc_formals_list_ne ',' ID
+ | proc_formals_list_ne ',' ID
{ $$ = $1;
$$->args = (int*)realloc($$->args, sizeof(int) * (1 + $$->args_nr));
$$->args[$$->args_nr++] = intern_id($3);
}
- ;
+ ;
-spellconf_option : ID '=' expr
- {
+spellconf_option : ID '=' expr
+ {
int var_id;
if (find_constant($1)) {
fail(@1.first_line, 0, "Attempt to redefine constant `%s' as global\n", $1);
@@ -255,8 +271,8 @@ spellconf_option : ID '=' expr
magic_eval(&magic_default_env, &magic_conf.vars[var_id], $3);
}
}
- | CONST ID '=' expr
- {
+ | CONST ID '=' expr
+ {
val_t var;
magic_eval(&magic_default_env, &var, $4);
bind_constant($2, &var, @1.first_line);
@@ -264,7 +280,7 @@ spellconf_option : ID '=' expr
| TELEPORT_ANCHOR ID ':' expr '=' expr
{
teleport_anchor_t *anchor;
- CREATE (anchor, teleport_anchor_t, 1);
+ CREATE(anchor, teleport_anchor_t, 1);
anchor->name = $2;
anchor->invocation = magic_eval_str(&magic_default_env, $4);
anchor->location = $6;
@@ -275,7 +291,7 @@ spellconf_option : ID '=' expr
free(anchor);
failed_flag = 0;
}
- | PROCEDURE ID '(' proc_formals_list ')' '=' effect_list
+ | PROCEDURE ID '(' proc_formals_list ')' '=' effect_list
{
proc_t *proc = $4;
proc->name = $2;
@@ -296,27 +312,27 @@ spellconf_option : ID '=' expr
failed_flag = 0;
}
-spell_flags : /* empty */
- { $$ = 0; }
- | LOCAL spell_flags
- { if ($2 & SPELL_FLAG_LOCAL)
+spell_flags : /* empty */
+ { $$ = SPELL_FLAG::ZERO; }
+ | LOCAL spell_flags
+ { if (bool($2 & SPELL_FLAG::LOCAL))
fail(@1.first_line, @1.first_column, "`LOCAL' specified more than once");
- $$ = $2 | SPELL_FLAG_LOCAL;
+ $$ = $2 | SPELL_FLAG::LOCAL;
}
- | NONMAGIC spell_flags
- { if ($2 & SPELL_FLAG_NONMAGIC)
+ | NONMAGIC spell_flags
+ { if (bool($2 & SPELL_FLAG::NONMAGIC))
fail(@1.first_line, @1.first_column, "`NONMAGIC' specified more than once");
- $$ = $2 | SPELL_FLAG_NONMAGIC;
+ $$ = $2 | SPELL_FLAG::NONMAGIC;
}
- | SILENT spell_flags
- { if ($2 & SPELL_FLAG_SILENT)
+ | SILENT spell_flags
+ { if (bool($2 & SPELL_FLAG::SILENT))
fail(@1.first_line, @1.first_column, "`SILENT' specified more than once");
- $$ = $2 | SPELL_FLAG_SILENT;
+ $$ = $2 | SPELL_FLAG::SILENT;
}
-argopt : /* empty */
- { $$.ty = SPELLARG_NONE; }
+argopt : /* empty */
+ { $$.ty = SPELLARG::NONE; }
| '(' ID ':' arg_ty ')'
{ $$.id = intern_id($2);
$$.ty = $4; }
@@ -324,160 +340,160 @@ argopt : /* empty */
arg_ty : PC_F
- { $$ = SPELLARG_PC; }
+ { $$ = SPELLARG::PC; }
| STRING_TY
- { $$ = SPELLARG_STRING; }
+ { $$ = SPELLARG::STRING; }
;
-value : DIR
- { $$.ty = TY_DIR;
+value : DIR
+ { $$.ty = TYPE::DIR;
$$.v.v_int = $1; }
- | INT
- { $$.ty = TY_INT;
+ | INT
+ { $$.ty = TYPE::INT;
$$.v.v_int = $1; }
- | STRING
- { $$.ty = TY_STRING;
+ | STRING
+ { $$.ty = TYPE::STRING;
$$.v.v_string = $1; }
- ;
+ ;
-expr : value
- { $$ = magic_new_expr(EXPR_VAL);
+expr : value
+ { $$ = magic_new_expr(EXPR::VAL);
$$->e.e_val = $1; }
- | ID
- {
+ | ID
+ {
val_t *val;
if ((val = find_constant($1))) {
- $$ = magic_new_expr(EXPR_VAL);
+ $$ = magic_new_expr(EXPR::VAL);
$$->e.e_val = *val;
} else {
- $$ = magic_new_expr(EXPR_ID);
+ $$ = magic_new_expr(EXPR::ID);
$$->e.e_id = intern_id($1);
}
}
- | area
- { $$ = magic_new_expr(EXPR_AREA);
+ | area
+ { $$ = magic_new_expr(EXPR::AREA);
$$->e.e_area = $1; }
- | expr '+' expr
- { BIN_EXPR($$, "+", $1, $3, @1.first_line, @1.first_column); }
- | expr '-' expr
- { BIN_EXPR($$, "-", $1, $3, @1.first_line, @1.first_column); }
- | expr '*' expr
- { BIN_EXPR($$, "*", $1, $3, @1.first_line, @1.first_column); }
- | expr '%' expr
- { BIN_EXPR($$, "%", $1, $3, @1.first_line, @1.first_column); }
- | expr '/' expr
- { BIN_EXPR($$, "/", $1, $3, @1.first_line, @1.first_column); }
- | expr '<' expr
- { BIN_EXPR($$, ">", $3, $1, @1.first_line, @1.first_column); }
- | expr '>' expr
- { BIN_EXPR($$, ">", $1, $3, @1.first_line, @1.first_column); }
- | expr '&' expr
- { BIN_EXPR($$, "&", $1, $3, @1.first_line, @1.first_column); }
- | expr '^' expr
- { BIN_EXPR($$, "^", $1, $3, @1.first_line, @1.first_column); }
- | expr '|' expr
- { BIN_EXPR($$, "|", $1, $3, @1.first_line, @1.first_column); }
- | expr SHL expr
- { BIN_EXPR($$, "<<", $1, $3, @1.first_line, @1.first_column); }
- | expr SHR expr
- { BIN_EXPR($$, ">>", $1, $3, @1.first_line, @1.first_column); }
- | expr LTE expr
- { BIN_EXPR($$, ">=", $3, $1, @1.first_line, @1.first_column); }
- | expr GTE expr
- { BIN_EXPR($$, ">=", $1, $3, @1.first_line, @1.first_column); }
- | expr ANDAND expr
- { BIN_EXPR($$, "&&", $1, $3, @1.first_line, @1.first_column); }
- | expr OROR expr
- { BIN_EXPR($$, "||", $1, $3, @1.first_line, @1.first_column); }
- | expr EQ expr
- { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
- | expr '=' expr
- { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
- | expr NEQ expr
- { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column);
+ | expr '+' expr
+ { BIN_EXPR($$, "+", $1, $3, @1.first_line, @1.first_column); }
+ | expr '-' expr
+ { BIN_EXPR($$, "-", $1, $3, @1.first_line, @1.first_column); }
+ | expr '*' expr
+ { BIN_EXPR($$, "*", $1, $3, @1.first_line, @1.first_column); }
+ | expr '%' expr
+ { BIN_EXPR($$, "%", $1, $3, @1.first_line, @1.first_column); }
+ | expr '/' expr
+ { BIN_EXPR($$, "/", $1, $3, @1.first_line, @1.first_column); }
+ | expr '<' expr
+ { BIN_EXPR($$, ">", $3, $1, @1.first_line, @1.first_column); }
+ | expr '>' expr
+ { BIN_EXPR($$, ">", $1, $3, @1.first_line, @1.first_column); }
+ | expr '&' expr
+ { BIN_EXPR($$, "&", $1, $3, @1.first_line, @1.first_column); }
+ | expr '^' expr
+ { BIN_EXPR($$, "^", $1, $3, @1.first_line, @1.first_column); }
+ | expr '|' expr
+ { BIN_EXPR($$, "|", $1, $3, @1.first_line, @1.first_column); }
+ | expr SHL expr
+ { BIN_EXPR($$, "<<", $1, $3, @1.first_line, @1.first_column); }
+ | expr SHR expr
+ { BIN_EXPR($$, ">>", $1, $3, @1.first_line, @1.first_column); }
+ | expr LTE expr
+ { BIN_EXPR($$, ">=", $3, $1, @1.first_line, @1.first_column); }
+ | expr GTE expr
+ { BIN_EXPR($$, ">=", $1, $3, @1.first_line, @1.first_column); }
+ | expr ANDAND expr
+ { BIN_EXPR($$, "&&", $1, $3, @1.first_line, @1.first_column); }
+ | expr OROR expr
+ { BIN_EXPR($$, "||", $1, $3, @1.first_line, @1.first_column); }
+ | expr EQ expr
+ { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
+ | expr '=' expr
+ { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column); }
+ | expr NEQ expr
+ { BIN_EXPR($$, "=", $1, $3, @1.first_line, @1.first_column);
$$ = fun_expr("not", 1, &$$, @1.first_line, @1.first_column); }
- | ID '(' arg_list ')'
- { $$ = fun_expr($1, $3.args_nr, $3.args, @1.first_line, @1.first_column);
+ | ID '(' arg_list ')'
+ { $$ = fun_expr($1, $3.args_nr, $3.args, @1.first_line, @1.first_column);
if ($3.args)
free($3.args);
free($1); }
- | '(' expr ')'
- { $$ = $2; }
- | expr '.' ID
- { $$ = dot_expr($1, intern_id($3)); }
- ;
+ | '(' expr ')'
+ { $$ = $2; }
+ | expr '.' ID
+ { $$ = dot_expr($1, intern_id($3)); }
+ ;
-arg_list : /* empty */
- { $$.args_nr = 0; }
- | arg_list_ne
- { $$ = $1; }
- ;
+arg_list : /* empty */
+ { $$.args_nr = 0; }
+ | arg_list_ne
+ { $$ = $1; }
+ ;
-arg_list_ne : expr
- { CREATE($$.args, expr_t *, 1);
+arg_list_ne : expr
+ { CREATE($$.args, expr_t *, 1);
$$.args_nr = 1;
$$.args[0] = $1;
}
- | arg_list_ne ',' expr
- { RECREATE($$.args, expr_t *, 1 + $$.args_nr);
+ | arg_list_ne ',' expr
+ { RECREATE($$.args, expr_t *, 1 + $$.args_nr);
$$.args[$$.args_nr++] = $3;
}
- ;
+ ;
-location : '@' '(' expr ',' expr ',' expr ')'
- { $$.m = $3; $$.x = $5; $$.y = $7; }
- ;
+location : '@' '(' expr ',' expr ',' expr ')'
+ { $$.m = $3; $$.x = $5; $$.y = $7; }
+ ;
-area : location
- { $$.ty = AREA_LOCATION;
+area : location
+ { $$.ty = AREA::LOCATION;
$$.a.a_loc = $1;
- }
- | location '@' '+' '(' expr ',' expr ')'
- { $$.ty = AREA_RECT;
+ }
+ | location '@' '+' '(' expr ',' expr ')'
+ { $$.ty = AREA::RECT;
$$.a.a_rect.loc = $1;
$$.a.a_rect.width = $5;
$$.a.a_rect.height = $7;
}
- | location TOWARDS expr ':' '(' expr ',' expr ')'
- { $$.ty = AREA_BAR;
+ | location TOWARDS expr ':' '(' expr ',' expr ')'
+ { $$.ty = AREA::BAR;
$$.a.a_bar.loc = $1;
$$.a.a_bar.width = $6;
$$.a.a_bar.depth = $8;
$$.a.a_bar.dir = $3;
}
- ;
+ ;
-spelldef : spellbody_list
+spelldef : spellbody_list
{ $$ = new_spell($1); }
- | LET defs IN spellbody_list
+ | LET defs IN spellbody_list
{ $$ = new_spell($4);
$$->letdefs_nr = $2.letdefs_nr;
$$->letdefs = $2.letdefs;
$$->spellguard = $4;
}
- ;
+ ;
-defs : semicolons
- { $$.letdefs_nr = 0;
+defs : semicolons
+ { $$.letdefs_nr = 0;
CREATE($$.letdefs, letdef_t, 1);
}
- | defs def semicolons
- { $$ = $1;
+ | defs def semicolons
+ { $$ = $1;
$$.letdefs_nr++;
- RECREATE ($$.letdefs, letdef_t, $$.letdefs_nr);
+ RECREATE($$.letdefs, letdef_t, $$.letdefs_nr);
$$.letdefs[$1.letdefs_nr] = $2;
}
;
-def : ID '=' expr
- {
+def : ID '=' expr
+ {
if (find_constant($1)) {
fail(@1.first_line, @1.first_column, "Attempt to re-define constant `%s' as LET-bound variable.\n", $1);
free($1);
@@ -486,216 +502,216 @@ def : ID '=' expr
$$.expr = $3;
}
}
- ;
+ ;
-spellbody_list : spellbody
- { $$ = $1; }
- | spellbody '|' spellbody_list
- { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE);
+spellbody_list : spellbody
+ { $$ = $1; }
+ | spellbody '|' spellbody_list
+ { spellguard_t *sg = new_spellguard(SPELLGUARD::CHOICE);
sg->next = $1;
sg->s.s_alt = $3;
$$ = sg;
}
- ;
+ ;
-spellbody : spellguard DARROW spellbody
- { $$ = spellguard_implication($1, $3); }
- | '(' spellbody_list ')'
- { $$ = $2; }
- | EFFECT effect_list maybe_trigger maybe_end
- { spellguard_t *sg = new_spellguard(SPELLGUARD_EFFECT);
+spellbody : spellguard DARROW spellbody
+ { $$ = spellguard_implication($1, $3); }
+ | '(' spellbody_list ')'
+ { $$ = $2; }
+ | EFFECT_ effect_list maybe_trigger maybe_end
+ { spellguard_t *sg = new_spellguard(SPELLGUARD::EFFECT);
sg->s.s_effect.effect = $2;
sg->s.s_effect.at_trigger = $3;
sg->s.s_effect.at_end = $4;
$$ = sg;
}
- ;
+ ;
-maybe_trigger : /* empty */
- { $$ = NULL; }
- | ATTRIGGER effect_list
- { $$ = $2; }
- ;
+maybe_trigger : /* empty */
+ { $$ = NULL; }
+ | ATTRIGGER effect_list
+ { $$ = $2; }
+ ;
-maybe_end : /* empty */
- { $$ = NULL; }
- | ATEND effect_list
- { $$ = $2; }
- ;
+maybe_end : /* empty */
+ { $$ = NULL; }
+ | ATEND effect_list
+ { $$ = $2; }
+ ;
-spellguard : prereq
- { $$ = $1; }
- | spellguard OR spellguard
- { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE);
+spellguard : prereq
+ { $$ = $1; }
+ | spellguard OR spellguard
+ { spellguard_t *sg = new_spellguard(SPELLGUARD::CHOICE);
sg->next = $1;
sg->s.s_alt = $3;
$$ = sg;
}
- | '(' spellguard_list ')'
- { $$ = $2; }
- ;
+ | '(' spellguard_list ')'
+ { $$ = $2; }
+ ;
-spellguard_list : spellguard
- { $$ = $1; }
- | spellguard ',' spellguard_list
- { $$ = spellguard_implication ($1, $3); }
- ;
+spellguard_list : spellguard
+ { $$ = $1; }
+ | spellguard ',' spellguard_list
+ { $$ = spellguard_implication($1, $3); }
+ ;
-prereq : REQUIRE expr
- { $$ = new_spellguard(SPELLGUARD_CONDITION);
+prereq : REQUIRE expr
+ { $$ = new_spellguard(SPELLGUARD::CONDITION);
$$->s.s_condition = $2;
}
- | CATALYSTS items
- { $$ = new_spellguard(SPELLGUARD_CATALYSTS);
+ | CATALYSTS items
+ { $$ = new_spellguard(SPELLGUARD::CATALYSTS);
$$->s.s_catalysts = $2;
}
- | COMPONENTS items
- { $$ = new_spellguard(SPELLGUARD_COMPONENTS);
+ | COMPONENTS items
+ { $$ = new_spellguard(SPELLGUARD::COMPONENTS);
$$->s.s_components = $2;
}
- | MANA expr
- { $$ = new_spellguard(SPELLGUARD_MANA);
+ | MANA expr
+ { $$ = new_spellguard(SPELLGUARD::MANA);
$$->s.s_mana = $2;
}
- | CASTTIME expr
- { $$ = new_spellguard(SPELLGUARD_CASTTIME);
+ | CASTTIME expr
+ { $$ = new_spellguard(SPELLGUARD::CASTTIME);
$$->s.s_casttime = $2;
}
- ;
+ ;
-items : '[' item_list ']'
- { $$ = $2; }
- ;
+items : '[' item_list ']'
+ { $$ = $2; }
+ ;
-item_list : item
- { $$ = NULL;
+item_list : item
+ { $$ = NULL;
magic_add_component(&$$, $1.id, $1.count);
}
- | item_list ',' item
- { $$ = $1;
+ | item_list ',' item
+ { $$ = $1;
magic_add_component(&$$, $3.id, $3.count);
}
- ;
+ ;
-item : INT '*' item_name
- { $$.id = $3; $$.count = $1; }
- | item_name
- { $$.id = $1; $$.count = 1; }
- ;
+item : INT '*' item_name
+ { $$.id = $3; $$.count = $1; }
+ | item_name
+ { $$.id = $1; $$.count = 1; }
+ ;
-item_name : STRING
- { struct item_data *item = itemdb_searchname($1);
+item_name : STRING
+ { struct item_data *item = itemdb_searchname($1);
if (!item) {
- fail (@1.first_line, @1.first_column, "Unknown item `%s'\n", $1);
+ fail(@1.first_line, @1.first_column, "Unknown item `%s'\n", $1);
$$ = 0;
} else
$$ = item->nameid;
- free ($1);
+ free($1);
}
- | INT
- { $$ = $1; }
- ;
-
-
-selection : PC_F
- { $$ = FOREACH_FILTER_PC; }
- | MOB_F
- { $$ = FOREACH_FILTER_MOB; }
- | ENTITY_F
- { $$ = FOREACH_FILTER_ENTITY; }
- | SPELL
- { $$ = FOREACH_FILTER_SPELL; }
- | TARGET_F
- { $$ = FOREACH_FILTER_TARGET; }
- | NPC_F
- { $$ = FOREACH_FILTER_NPC; }
- ;
-
-
-effect : '(' effect_list ')'
- { $$ = $2; }
- | SKIP ';'
- { $$ = new_effect(EFFECT_SKIP); }
- | ABORT ';'
- { $$ = new_effect(EFFECT_ABORT); }
- | END ';'
- { $$ = new_effect(EFFECT_END); }
- | BREAK ';'
- { $$ = new_effect(EFFECT_BREAK); }
- | ID '=' expr ';'
- {
+ | INT
+ { $$ = $1; }
+ ;
+
+
+selection : PC_F
+ { $$ = FOREACH_FILTER::PC; }
+ | MOB_F
+ { $$ = FOREACH_FILTER::MOB; }
+ | ENTITY_F
+ { $$ = FOREACH_FILTER::ENTITY; }
+ | SPELL
+ { $$ = FOREACH_FILTER::SPELL; }
+ | TARGET_F
+ { $$ = FOREACH_FILTER::TARGET; }
+ | NPC_F
+ { $$ = FOREACH_FILTER::NPC; }
+ ;
+
+
+effect : '(' effect_list ')'
+ { $$ = $2; }
+ | SKIP ';'
+ { $$ = new_effect(EFFECT::SKIP); }
+ | ABORT ';'
+ { $$ = new_effect(EFFECT::ABORT); }
+ | END ';'
+ { $$ = new_effect(EFFECT::END); }
+ | BREAK ';'
+ { $$ = new_effect(EFFECT::BREAK); }
+ | ID '=' expr ';'
+ {
if (find_constant($1)) {
fail(@1.first_line, @1.first_column, "Attempt to re-define constant `%s' in assignment.", $1);
free($1);
} else {
- $$ = new_effect(EFFECT_ASSIGN);
+ $$ = new_effect(EFFECT::ASSIGN);
$$->e.e_assign.id = intern_id($1);
$$->e.e_assign.expr = $3;
}
}
- | FOREACH selection ID IN expr DO effect
- { $$ = new_effect(EFFECT_FOREACH);
+ | FOREACH selection ID IN expr DO effect
+ { $$ = new_effect(EFFECT::FOREACH);
$$->e.e_foreach.id = intern_id($3);
$$->e.e_foreach.area = $5;
$$->e.e_foreach.body = $7;
$$->e.e_foreach.filter = $2;
}
- | FOR ID '=' expr TO expr DO effect
- { $$ = new_effect(EFFECT_FOR);
+ | FOR ID '=' expr TO expr DO effect
+ { $$ = new_effect(EFFECT::FOR);
$$->e.e_for.id = intern_id($2);
$$->e.e_for.start = $4;
$$->e.e_for.stop = $6;
$$->e.e_for.body = $8;
}
- | IF expr THEN effect ELSE effect
- { $$ = new_effect(EFFECT_IF);
+ | IF expr THEN effect ELSE effect
+ { $$ = new_effect(EFFECT::IF);
$$->e.e_if.cond = $2;
$$->e.e_if.true_branch = $4;
$$->e.e_if.false_branch = $6;
}
- | IF expr THEN effect
- { $$ = new_effect(EFFECT_IF);
+ | IF expr THEN effect
+ { $$ = new_effect(EFFECT::IF);
$$->e.e_if.cond = $2;
$$->e.e_if.true_branch = $4;
- $$->e.e_if.false_branch = new_effect(EFFECT_SKIP);
+ $$->e.e_if.false_branch = new_effect(EFFECT::SKIP);
}
- | SLEEP expr ';'
- { $$ = new_effect(EFFECT_SLEEP);
+ | SLEEP expr ';'
+ { $$ = new_effect(EFFECT::SLEEP);
$$->e.e_sleep = $2;
}
- | ID '(' arg_list ')' ';'
+ | ID '(' arg_list ')' ';'
{ $$ = op_effect($1, $3.args_nr, $3.args, @1.first_line, @1.first_column);
free($1);
}
- | SCRIPT_DATA
- { $$ = new_effect(EFFECT_SCRIPT);
+ | SCRIPT_DATA
+ { $$ = new_effect(EFFECT::SCRIPT);
$$->e.e_script = parse_script($1, @1.first_line);
free($1);
if ($$->e.e_script == NULL)
fail(@1.first_line, @1.first_column, "Failed to compile script\n");
}
- | CALL ID '(' arg_list ')' ';'
- { $$ = call_proc($2, $4.args_nr, $4.args, @1.first_line, @1.first_column);
+ | CALL ID '(' arg_list ')' ';'
+ { $$ = call_proc($2, $4.args_nr, $4.args, @1.first_line, @1.first_column);
free($2);
}
- ;
+ ;
-effect_list : /* empty */
- { $$ = new_effect(EFFECT_SKIP); }
- | effect semicolons effect_list
- { $$ = set_effect_continuation($1, $3); }
- ;
+effect_list : /* empty */
+ { $$ = new_effect(EFFECT::SKIP); }
+ | effect semicolons effect_list
+ { $$ = set_effect_continuation($1, $3); }
+ ;
%%
@@ -703,8 +719,8 @@ effect_list : /* empty */
/* We do incremental realloc here to store our results. Since this happens only once
* during startup for a relatively manageable set of configs, it should be fine. */
-static int
-intern_id(const char *id_name)
+static
+int intern_id(const char *id_name)
{
int i;
@@ -719,13 +735,13 @@ intern_id(const char *id_name)
RECREATE(magic_conf.var_name, const char *, magic_conf.vars_nr);
magic_conf.var_name[i] = id_name;
RECREATE(magic_conf.vars, val_t, magic_conf.vars_nr);
- magic_conf.vars[i].ty = TY_UNDEF;
+ magic_conf.vars[i].ty = TYPE::UNDEF;
return i;
}
-static void
-add_spell(spell_t *spell, int line_nr)
+static
+void add_spell(spell_t *spell, int line_nr)
{
int index = magic_conf.spells_nr;
int i;
@@ -749,8 +765,8 @@ add_spell(spell_t *spell, int line_nr)
}
-static void
-add_teleport_anchor(teleport_anchor_t *anchor, int line_nr)
+static
+void add_teleport_anchor(teleport_anchor_t *anchor, int line_nr)
{
int index = magic_conf.anchors_nr;
int i;
@@ -777,24 +793,24 @@ static __attribute__((format(printf, 3, 4)))
void fail(int line, int column, const char *fmt, ...)
{
va_list ap;
- fprintf(stderr, "[magic-init] L%d:%d: ", line, column);
+ FPRINTF(stderr, "[magic-init] L%d:%d: ", line, column);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
failed_flag = 1;
}
-static expr_t *
-dot_expr(expr_t *expr, int id)
+static
+expr_t *dot_expr(expr_t *expr, int id)
{
- expr_t *retval = magic_new_expr(EXPR_SPELLFIELD);
+ expr_t *retval = magic_new_expr(EXPR::SPELLFIELD);
retval->e.e_field.id = id;
retval->e.e_field.expr = expr;
return retval;
}
-static expr_t *
-fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
+static
+expr_t *fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
{
int id;
expr_t *expr;
@@ -803,14 +819,14 @@ fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
if (!fun) {
fail(line, column, "Unknown function `%s'\n", name);
} else if (strlen(fun->signature) != args_nr) {
- fail(line, column, "Incorrect number of arguments to function `%s': Expected %d, found %d\n", name, strlen(fun->signature), args_nr);
+ fail(line, column, "Incorrect number of arguments to function `%s': Expected %zu, found %d\n", name, strlen(fun->signature), args_nr);
fun = NULL;
}
if (fun) {
int i;
- expr = magic_new_expr(EXPR_FUNAPP);
+ 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;
@@ -819,15 +835,15 @@ fun_expr(const char *name, int args_nr, expr_t **args, int line, int column)
for (i = 0; i < args_nr; i++)
expr->e.e_funapp.args[i] = args[i];
} else { /* failure */
- expr = magic_new_expr(EXPR_VAL);
- expr->e.e_val.ty = TY_FAIL;
+ expr = magic_new_expr(EXPR::VAL);
+ expr->e.e_val.ty = TYPE::FAIL;
}
return expr;
}
-static spell_t *
-new_spell(spellguard_t *guard)
+static
+spell_t *new_spell(spellguard_t *guard)
{
static int spell_counter = 0;
@@ -837,16 +853,16 @@ new_spell(spellguard_t *guard)
return retval;
}
-static spellguard_t *
-new_spellguard(int ty)
+static
+spellguard_t *new_spellguard(SPELLGUARD ty)
{
spellguard_t *retval = (spellguard_t *)calloc(1, sizeof(spellguard_t));
retval->ty = ty;
return retval;
}
-static spellguard_t *
-spellguard_implication(spellguard_t *a, spellguard_t *b)
+static
+spellguard_t *spellguard_implication(spellguard_t *a, spellguard_t *b)
{
spellguard_t *retval = a;
@@ -864,7 +880,7 @@ spellguard_implication(spellguard_t *a, spellguard_t *b)
return retval;
/* If the premise is a disjunction, b is the continuation of _all_ branches */
- if (a->ty == SPELLGUARD_CHOICE)
+ if (a->ty == SPELLGUARD::CHOICE)
spellguard_implication(a->s.s_alt, b);
if (a->next)
spellguard_implication(a->next, b);
@@ -875,16 +891,16 @@ spellguard_implication(spellguard_t *a, spellguard_t *b)
return retval;
}
-static effect_t *
-new_effect(int ty)
+static
+effect_t *new_effect(EFFECT ty)
{
effect_t *effect = (effect_t *) calloc(1, sizeof(effect_t));
effect->ty = ty;
return effect;
}
-static effect_t *
-set_effect_continuation(effect_t *src, effect_t *continuation)
+static
+effect_t *set_effect_continuation(effect_t *src, effect_t *continuation)
{
effect_t *retval = src;
/* This function is completely analogous to `spellguard_implication' above; read the control flow implications above first before pondering it. */
@@ -894,7 +910,7 @@ set_effect_continuation(effect_t *src, effect_t *continuation)
/* For FOR and FOREACH, we use special stack handlers and thus don't have to set
* the continuation. It's only IF that we need to handle in this fashion. */
- if (src->ty == EFFECT_IF) {
+ if (src->ty == EFFECT::IF) {
set_effect_continuation(src->e.e_if.true_branch, continuation);
set_effect_continuation(src->e.e_if.false_branch, continuation);
}
@@ -906,8 +922,8 @@ set_effect_continuation(effect_t *src, effect_t *continuation)
return retval;
}
-static effect_t *
-op_effect(char *name, int args_nr, expr_t **args, int line, int column)
+static
+effect_t *op_effect(char *name, int args_nr, expr_t **args, int line, int column)
{
int id;
effect_t *effect;
@@ -916,14 +932,14 @@ op_effect(char *name, int args_nr, expr_t **args, int line, int column)
if (!op)
fail(line, column, "Unknown operation `%s'\n", name);
else if (strlen(op->signature) != args_nr) {
- fail(line, column, "Incorrect number of arguments to operation `%s': Expected %d, found %d\n", name, strlen(op->signature), args_nr);
+ fail(line, column, "Incorrect number of arguments to operation `%s': Expected %zu, found %d\n", name, strlen(op->signature), args_nr);
op = NULL;
}
if (op) {
int i;
- effect = new_effect(EFFECT_OP);
+ effect = new_effect(EFFECT::OP);
effect->e.e_op.line_nr = line;
effect->e.e_op.column = column;
effect->e.e_op.id = id;
@@ -932,7 +948,7 @@ op_effect(char *name, int args_nr, expr_t **args, int line, int column)
for (i = 0; i < args_nr; i++)
effect->e.e_op.args[i] = args[i];
} else /* failure */
- effect = new_effect(EFFECT_SKIP);
+ effect = new_effect(EFFECT::SKIP);
return effect;
}
@@ -942,20 +958,20 @@ proc_t *procs = NULL;
int procs_nr = 0;
// I think this is a memory leak, or undefined behavior
-static void
-install_proc(proc_t *proc)
+static
+void install_proc(proc_t *proc)
{
if (!procs) {
procs = proc;
procs_nr = 1;
} else {
- RECREATE (procs, proc_t, 1 + procs_nr);
+ RECREATE(procs, proc_t, 1 + procs_nr);
procs[procs_nr++] = *proc;
}
}
-static effect_t *
-call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column)
+static
+effect_t *call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column)
{
proc_t *p = NULL;
int i;
@@ -969,15 +985,15 @@ call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column)
if (!p) {
fail(line_nr, column, "Unknown procedure `%s'\n", name);
- return new_effect(EFFECT_SKIP);
+ return new_effect(EFFECT::SKIP);
}
if (p->args_nr != args_nr) {
fail(line_nr, column, "Procedure %s/%d invoked with %d parameters\n", name, p->args_nr, args_nr);
- return new_effect(EFFECT_SKIP);
+ return new_effect(EFFECT::SKIP);
}
- retval = new_effect(EFFECT_CALL);
+ retval = new_effect(EFFECT::CALL);
retval->e.e_call.body = p->body;
retval->e.e_call.args_nr = args_nr;
retval->e.e_call.formals = p->args;
@@ -992,8 +1008,8 @@ struct const_def_rec {
int const_defs_nr = 0;
-static void
-bind_constant(char *name, val_t *val, int line_nr)
+static
+void bind_constant(char *name, val_t *val, int line_nr)
{
if (find_constant(name)) {
fail(line_nr, 0, "Redefinition of constant `%s'\n", name);
@@ -1011,8 +1027,8 @@ bind_constant(char *name, val_t *val, int line_nr)
++const_defs_nr;
}
-static val_t *
-find_constant(char *name)
+static
+val_t *find_constant(char *name)
{
int i;
for (i = 0; i < const_defs_nr; i++) {
@@ -1027,8 +1043,16 @@ find_constant(char *name)
-
-#define INTERN_ASSERT(name, id) { int zid = intern_id(name); if (zid != id) fprintf(stderr, "[magic-conf] INTERNAL ERROR: Builtin special var %s interned to %d, not %d as it should be!\n", name, zid, id); error_flag = 1; }
+// FIXME: macro capture
+#define INTERN_ASSERT(name, id) \
+{ \
+ int zid = intern_id(name); \
+ if (zid != id) \
+ FPRINTF(stderr, \
+ "[magic-conf] INTERNAL ERROR: Builtin special var %s interned to %d, not %d as it should be!\n", \
+ name, zid, id); \
+ error_flag = 1; \
+}
extern FILE *magic_frontend_in;
@@ -1063,18 +1087,18 @@ int magic_init(const char *conffile)
magic_frontend_in = fopen(conffile, "r");
if (!magic_frontend_in) {
- fprintf(stderr, "[magic-conf] Magic configuration file `%s' not found -> no magic.\n", conffile);
+ FPRINTF(stderr, "[magic-conf] Magic configuration file `%s' not found -> no magic.\n", conffile);
return 0;
}
magic_frontend_parse();
- if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TY_INT)
+ if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TYPE::INT)
magic_conf.min_casttime = magic_conf.vars[VAR_MIN_CASTTIME].v.v_int;
- if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TY_INT)
+ if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TYPE::INT)
magic_conf.obscure_chance = magic_conf.vars[VAR_OBSCURE_CHANCE].v.v_int;
- printf("[magic-conf] Magic initialised; obscure at %d%%. %d spells, %d teleport anchors.\n",
+ PRINTF("[magic-conf] Magic initialised; obscure at %d%%. %d spells, %d teleport anchors.\n",
magic_conf.obscure_chance, magic_conf.spells_nr, magic_conf.anchors_nr);
if (procs)
@@ -1084,9 +1108,9 @@ int magic_init(const char *conffile)
extern int magic_frontend_lineno;
-static void
-magic_frontend_error(const char *msg)
+static
+void magic_frontend_error(const char *msg)
{
- fprintf(stderr, "[magic-conf] Parse error: %s at line %d\n", msg, magic_frontend_lineno);
+ FPRINTF(stderr, "[magic-conf] Parse error: %s at line %d\n", msg, magic_frontend_lineno);
failed_flag = 1;
}