diff options
author | Maria Matejka <mq@ucw.cz> | 2018-12-20 14:34:35 +0100 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2019-02-20 22:30:54 +0100 |
commit | 224b77d4f786ea09bb2632476a89f0976baafd64 (patch) | |
tree | 2bf7f5167c7d3b258fd043c71c64c6129883bfbc | |
parent | 8e8b1fe48cfcb92d54e15df5198e8cef9bc3dd8e (diff) |
Filter refactoring: Converted condition to three-args instruction
-rw-r--r-- | filter/config.Y | 12 | ||||
-rw-r--r-- | filter/f-inst.c | 14 | ||||
-rw-r--r-- | filter/filter.c | 2 |
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: |