diff options
Diffstat (limited to 'filter')
-rw-r--r-- | filter/config.Y | 33 | ||||
-rw-r--r-- | filter/filter.c | 13 |
2 files changed, 24 insertions, 22 deletions
diff --git a/filter/config.Y b/filter/config.Y index d131a25..67270b3 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -79,15 +79,11 @@ type: one_decl: type SYM { - $2 = cf_define_symbol($2, SYM_VARIABLE | $1, NULL); + struct f_val * val = cfg_alloc(sizeof(struct f_val)); + val->type = $1; + $2 = cf_define_symbol($2, SYM_VARIABLE | $1, val); DBG( "New variable %s type %x\n", $2->name, $1 ); - $2->aux = 0; - { - struct f_val * val; - val = cfg_alloc(sizeof(struct f_val)); - val->type = $1; - $2->aux2 = val; - } + $2->aux2 = NULL; $$=$2; } ; @@ -96,7 +92,7 @@ one_decl: decls: /* EMPTY */ { $$ = NULL; } | one_decl ';' decls { $$ = $1; - $$->aux = (int) $3; + $$->aux2 = $3; } ; @@ -104,7 +100,7 @@ decls: /* EMPTY */ { $$ = NULL; } declsn: one_decl { $$ = $1; } | declsn ';' one_decl { $$ = $1; - $$->aux = (int) $3; + $$->aux2 = $3; } ; @@ -167,8 +163,7 @@ function_def: cf_push_scope($2); } function_params function_body { $2->def = $5; - $2->aux = (int) $4; - $2->aux2 = $5; + $2->aux2 = $4; DBG("Hmm, we've got one function here - %s\n", $2->name); cf_pop_scope(); } @@ -313,14 +308,14 @@ function_call: $$ = f_new_inst(); $$->code = P('c','a'); $$->a1.p = inst; - $$->a2.p = $1->aux2; - sym = (void *) $1->aux; + $$->a2.p = $1->def; + sym = $1->aux2; while (sym || inst) { if (!sym || !inst) cf_error("Wrong number of arguments for function %s.", $1->name); DBG( "You should pass parameter called %s\n", sym->name); inst->a1.p = sym; - sym = (void *) sym->aux; + sym = sym->aux2; inst = inst->next; } } @@ -377,7 +372,7 @@ term: case SYM_VARIABLE | T_PATH: case SYM_VARIABLE | T_CLIST: $$->code = 'C'; - $$->a1.p = $1->aux2; + $$->a1.p = $1->def; break; default: cf_error("%s: variable expected.", $1->name ); @@ -420,14 +415,14 @@ term: $$ = f_new_inst(); $$->code = P('c','a'); $$->a1.p = inst; - $$->a2.p = $1->aux2; - sym = (void *) $1->aux; + $$->a2.p = $1->def; + sym = $1->aux2; while (sym || inst) { if (!sym || !inst) cf_error("Wrong number of arguments for function %s.", $1->name); DBG( "You should pass parameter called %s\n", sym->name); inst->a1.p = sym; - sym = (void *) sym->aux; + sym = sym->aux2; inst = inst->next; } } diff --git a/filter/filter.c b/filter/filter.c index 6288df7..109c7de 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -437,16 +437,23 @@ interpret(struct f_inst *what) case T_PATH_MASK: if (sym->class != (SYM_VARIABLE | v2.type)) runtime( "Assigning to variable of incompatible type" ); - * (struct f_val *) sym->aux2 = v2; + * (struct f_val *) sym->def = v2; break; default: bug( "Set to invalid type" ); } break; - case 'c': /* integer (or simple type) constant */ + /* some constants have value in a2, some in *a1.p, strange. */ + case 'c': /* integer (or simple type) constant, or string, or set */ res.type = what->aux; - res.val.i = what->a2.i; + + if (res.type == T_SET) + res.val.t = what->a2.p; + else if (res.type == T_STRING) + res.val.s = what->a2.p; + else + res.val.i = what->a2.i; break; case 'C': res = * ((struct f_val *) what->a1.p); |