summaryrefslogtreecommitdiffstats
path: root/filter
diff options
context:
space:
mode:
Diffstat (limited to 'filter')
-rw-r--r--filter/config.Y33
-rw-r--r--filter/filter.c13
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);