diff --git a/filter/config.Y b/filter/config.Y index ec29ea7e..eecebf61 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -406,7 +406,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, PREPEND, FIRST, LAST, LAST_NONAGGREGATED, MATCH, EMPTY, FILTER, WHERE, EVAL, - BT_ASSERT, BT_TEST_SUITE) + BT_ASSERT, BT_TEST_SUITE, FORMAT) %nonassoc THEN %nonassoc ELSE @@ -916,6 +916,7 @@ term: | ROA_CHECK '(' rtable ')' { $$ = f_generate_roa_check($3, NULL, NULL); } | ROA_CHECK '(' rtable ',' term ',' term ')' { $$ = f_generate_roa_check($3, $5, $7); } + | FORMAT '(' term ')' { $$ = f_new_inst(); $$->code = P('f','m'); $$->a1.p = $3; } /* | term '.' LEN { $$->code = P('P','l'); } */ diff --git a/filter/filter.c b/filter/filter.c index 88d138a0..145ff4b3 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -563,6 +563,14 @@ f_rta_cow(void) (*f_rte)->attrs = rta_do_cow((*f_rte)->attrs, f_pool); } +static char * +val_format_str(struct f_val v) { + buffer b; + LOG_BUFFER_INIT(b); + val_format(v, &b); + return lp_strdup(f_pool, b.start); +} + static struct tbf rl_runtime_err = TBF_DEFAULT_LOG_LIMITS; #define runtime(fmt, ...) do { \ @@ -1477,6 +1485,13 @@ interpret(struct f_inst *what) break; + case P('f','m'): /* Format */ + ONEARG; + + res.type = T_STRING; + res.val.s = val_format_str(v1); + break; + case P('a','s'): /* Birdtest Assert */ ONEARG;