diff --git a/filter/config.Y b/filter/config.Y index 343c1e07..4c4a859a 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -1,7 +1,7 @@ /* * BIRD - filters * - * Copyright 1998,1999 Pavel Machek + * Copyright 1998--2000 Pavel Machek * * Can be freely distributed and used under the terms of the GNU GPL. * @@ -33,7 +33,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, ADD, DELETE, CONTAINS, RESET, PREPEND, MATCH, EMPTY, - FILTER, WHERE) + FILTER, WHERE, EVAL) %nonassoc THEN %nonassoc ELSE @@ -59,6 +59,11 @@ filter_def: } ; +CF_ADDTO(conf, filter_eval) +filter_eval: + EVAL term { f_eval_int($2); } + ; + type: INT { $$ = T_INT; } | BOOL { $$ = T_BOOL; } @@ -164,7 +169,7 @@ function_body: CF_ADDTO(conf, function_def) function_def: - FUNCTION SYM { DBG( "Begining of function %s\n", $2->name ); cf_push_scope($2); } function_params function_body { + FUNCTION SYM { DBG( "Beginning of function %s\n", $2->name ); cf_push_scope($2); } function_params function_body { extern struct f_inst *startup_func, *test1_func, *test2_func; cf_define_symbol($2, SYM_FUNCTION, $5); if (!strcasecmp($2->name, "__startup")) diff --git a/filter/filter.c b/filter/filter.c index 5e848d6a..2510b6a3 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -665,6 +665,23 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc return res.val.i; } +int +f_eval_int(struct f_inst *expr) +{ + struct f_val res; + + f_flags = 0; + f_tmp_attrs = NULL; + f_rte = NULL; + f_rte_old = NULL; + f_rta_copy = NULL; + f_pool = NULL; + res = interpret(expr); + if (res.type != T_INT) + cf_error("Integer expression expected"); + return res.val.i; +} + void filters_postconfig(void) { diff --git a/filter/filter.h b/filter/filter.h index a1bf5481..b746063e 100644 --- a/filter/filter.h +++ b/filter/filter.h @@ -71,6 +71,7 @@ struct ea_list; struct rte; int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool, int flags); +int f_eval_int(struct f_inst *expr); char *filter_name(struct filter *filter); int filter_same(struct filter *new, struct filter *old);