From f567e99f3372d86d4feac2626e34ac8e8cbdb1b0 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Mon, 19 Jun 2023 17:24:30 +0200 Subject: [PATCH] Filter: Print instructions take only one value (simplification) --- filter/config.Y | 33 +++++++-------------------------- filter/f-inst.c | 9 ++++----- filter/f-inst.h | 1 + filter/f-util.c | 25 +++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/filter/config.Y b/filter/config.Y index 0014b4bd..9dd59471 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -373,7 +373,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, %nonassoc ELSE %type cmds_int cmd_prep -%type term cmd cmd_var cmds cmds_scoped constant constructor print_list var var_init var_list function_call symbol_value bgp_path_expr bgp_path bgp_path_tail term_dot_method method_name_cont +%type term cmd cmd_var cmds cmds_scoped constant constructor var var_init var_list function_call symbol_value bgp_path_expr bgp_path bgp_path_tail term_dot_method method_name_cont %type dynamic_attr %type static_attr %type filter where_filter @@ -955,16 +955,6 @@ break_command: | ERROR { $$ = F_ERROR; } ; -print_list: /* EMPTY */ { $$ = NULL; } - | term { $$ = $1; } - | term ',' print_list { - ASSERT($1); - ASSERT($1->next == NULL); - $1->next = $3; - $$ = $1; - } - ; - var_init: /* empty */ { $$ = f_const_empty(this_var_type); } | '=' term { $$ = $2; } @@ -1041,23 +1031,14 @@ cmd: | UNSET '(' dynamic_attr ')' ';' { $$ = f_new_inst(FI_EA_UNSET, $3); } - | break_command print_list ';' { - struct f_inst *breaker = f_new_inst(FI_DIE, $1); - if ($2) { - struct f_inst *printer = f_new_inst(FI_PRINT, $2); - struct f_inst *flusher = f_new_inst(FI_FLUSH); - printer->next = flusher; - flusher->next = breaker; - $$ = printer; - } else - $$ = breaker; + | break_command var_list ';' { + $$ = f_print($2, !!$2, $1); } - | PRINT print_list ';' { - $$ = f_new_inst(FI_PRINT, $2); - $$->next = f_new_inst(FI_FLUSH); + | PRINT var_list ';' { + $$ = f_print($2, 1, F_NOP); } - | PRINTN print_list ';' { - $$ = f_new_inst(FI_PRINT, $2); + | PRINTN var_list ';' { + $$ = f_print($2, 0, F_NOP); } | function_call ';' { $$ = f_new_inst(FI_DROP_RESULT, $1); } | CASE term '{' switch_body '}' { diff --git a/filter/f-inst.c b/filter/f-inst.c index e7e19cca..9d71b93a 100644 --- a/filter/f-inst.c +++ b/filter/f-inst.c @@ -613,13 +613,12 @@ LINE(3,0); } - INST(FI_PRINT, 0, 0) { + INST(FI_PRINT, 1, 0) { NEVER_CONSTANT; - VARARG; + ARG_ANY(1); - if (whati->varcount && !(fs->flags & FF_SILENT)) - for (uint i=0; ivarcount; i++) - val_format(&(vv(i)), &fs->buf); + if (!(fs->flags & FF_SILENT)) + val_format(&v1, &fs->buf); } INST(FI_FLUSH, 0, 0) { diff --git a/filter/f-inst.h b/filter/f-inst.h index faee95b0..a7eecafb 100644 --- a/filter/f-inst.h +++ b/filter/f-inst.h @@ -96,6 +96,7 @@ void f_add_lines(const struct f_line_item *what, struct filter_iterator *fit); struct filter *f_new_where(struct f_inst *); struct f_inst *f_for_cycle(struct symbol *var, struct f_inst *term, struct f_inst *block); +struct f_inst *f_print(struct f_inst *vars, int flush, enum filter_return fret); static inline struct f_dynamic_attr f_new_dynamic_attr(u8 type, enum f_type f_type, uint code) /* Type as core knows it, type as filters know it, and code of dynamic attribute */ { return (struct f_dynamic_attr) { .type = type, .f_type = f_type, .ea_code = code }; } /* f_type currently unused; will be handy for static type checking */ diff --git a/filter/f-util.c b/filter/f-util.c index ab5b9094..98b7d1a8 100644 --- a/filter/f-util.c +++ b/filter/f-util.c @@ -75,6 +75,31 @@ f_for_cycle(struct symbol *var, struct f_inst *term, struct f_inst *block) return ms->method->new_inst(term, loop_start); } +struct f_inst * +f_print(struct f_inst *vars, int flush, enum filter_return fret) +{ +#define AX(...) do { struct f_inst *_tmp = f_new_inst(__VA_ARGS__); _tmp->next = output; output = _tmp; } while (0) + struct f_inst *output = NULL; + if (fret != F_NOP) + AX(FI_DIE, fret); + + if (flush) + AX(FI_FLUSH); + + while (vars) + { + struct f_inst *tmp = vars; + vars = vars->next; + tmp->next = NULL; + + AX(FI_PRINT, tmp); + } + + return output; +#undef AX +} + + #define CA_KEY(n) n->name, n->fda.type #define CA_NEXT(n) n->next #define CA_EQ(na,ta,nb,tb) (!strcmp(na,nb) && (ta == tb))