diff --git a/filter/config.Y b/filter/config.Y index cf499b66..182bfa3c 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -996,12 +996,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/filter.c b/filter/filter.c index 6290e74a..47fb81e8 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -898,14 +898,13 @@ interpret(struct f_inst *what) ARG_ANY(1); val_format(v1, &f_buf); break; - case FI_CONDITION: /* ? has really strange error value, so we can implement if ... else nicely :-) */ + case FI_CONDITION: ARG(1, T_BOOL); if (v1.val.i) { ARG_ANY(2); - res.val.i = 0; - } else - res.val.i = 1; - res.type = T_BOOL; + } else { + ARG_ANY(3); + } break; case FI_NOP: debug( "No operation\n" ); @@ -1670,7 +1669,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: