summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2018-12-20 14:34:35 +0100
committerMaria Matejka <mq@ucw.cz>2019-02-20 22:30:54 +0100
commit224b77d4f786ea09bb2632476a89f0976baafd64 (patch)
tree2bf7f5167c7d3b258fd043c71c64c6129883bfbc
parent8e8b1fe48cfcb92d54e15df5198e8cef9bc3dd8e (diff)
Filter refactoring: Converted condition to three-args instruction
-rw-r--r--filter/config.Y12
-rw-r--r--filter/f-inst.c14
-rw-r--r--filter/filter.c2
3 files changed, 12 insertions, 16 deletions
diff --git a/filter/config.Y b/filter/config.Y
index 200c1f41..05c6f899 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -559,7 +559,7 @@ filter:
where_filter:
WHERE term {
- /* Construct 'IF term THEN ACCEPT; REJECT;' */
+ /* Construct 'IF term THEN { ACCEPT; } ELSE { REJECT; }' */
struct filter *f = cfg_alloc(sizeof(struct filter));
struct f_inst *i, *acc, *rej;
acc = f_new_inst(FI_PRINT_AND_DIE); /* ACCEPT */
@@ -571,7 +571,7 @@ where_filter:
i = f_new_inst(FI_CONDITION); /* IF */
i->a1.p = $2;
i->a2.p = acc;
- i->next = rej;
+ i->a3.p = rej;
f->name = NULL;
f->root = i;
$$ = f;
@@ -1005,12 +1005,10 @@ cmd:
$$->a2.p = $4;
}
| IF term THEN block ELSE block {
- struct f_inst *i = f_new_inst(FI_CONDITION);
- i->a1.p = $2;
- i->a2.p = $4;
$$ = f_new_inst(FI_CONDITION);
- $$->a1.p = i;
- $$->a2.p = $6;
+ $$->a1.p = $2;
+ $$->a2.p = $4;
+ $$->a3.p = $6;
}
| SYM '=' term ';' {
DBG( "Ook, we'll set value\n" );
diff --git a/filter/f-inst.c b/filter/f-inst.c
index cee5b8e7..fc960198 100644
--- a/filter/f-inst.c
+++ b/filter/f-inst.c
@@ -259,14 +259,12 @@
ARG_ANY(1);
val_format(v1, &fs->buf);
break;
- case FI_CONDITION: /* ? has really strange error value, so we can implement if ... else nicely :-) */
- ARG(1, T_BOOL);
- if (v1.val.i) {
- ARG_ANY(2);
- res.val.i = 0;
- } else
- res.val.i = 1;
- res.type = T_BOOL;
+ case FI_CONDITION:
+ ARG_T(1, 0, T_BOOL);
+ if (res.val.i)
+ ARG_ANY_T(2,0);
+ else
+ ARG_ANY_T(3,0);
break;
case FI_NOP:
debug( "No operation\n" );
diff --git a/filter/filter.c b/filter/filter.c
index a1bb7415..3b310257 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -793,7 +793,7 @@ i_same(struct f_inst *f1, struct f_inst *f2)
return 0;
break;
case FI_PRINT: case FI_LENGTH: ONEARG; break;
- case FI_CONDITION: TWOARGS; break;
+ case FI_CONDITION: THREEARGS; break;
case FI_NOP: case FI_EMPTY: break;
case FI_PRINT_AND_DIE: ONEARG; A2_SAME; break;
case FI_PREF_GET: