Added f_eval_int() and EVAL configuration command.

This commit is contained in:
Martin Mares 2000-05-15 10:49:38 +00:00
parent 9449c91ab2
commit 1c20608e02
3 changed files with 26 additions and 3 deletions

View file

@ -1,7 +1,7 @@
/* /*
* BIRD - filters * 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. * 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, ADD, DELETE, CONTAINS, RESET,
PREPEND, MATCH, PREPEND, MATCH,
EMPTY, EMPTY,
FILTER, WHERE) FILTER, WHERE, EVAL)
%nonassoc THEN %nonassoc THEN
%nonassoc ELSE %nonassoc ELSE
@ -59,6 +59,11 @@ filter_def:
} }
; ;
CF_ADDTO(conf, filter_eval)
filter_eval:
EVAL term { f_eval_int($2); }
;
type: type:
INT { $$ = T_INT; } INT { $$ = T_INT; }
| BOOL { $$ = T_BOOL; } | BOOL { $$ = T_BOOL; }
@ -164,7 +169,7 @@ function_body:
CF_ADDTO(conf, function_def) CF_ADDTO(conf, function_def)
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; extern struct f_inst *startup_func, *test1_func, *test2_func;
cf_define_symbol($2, SYM_FUNCTION, $5); cf_define_symbol($2, SYM_FUNCTION, $5);
if (!strcasecmp($2->name, "__startup")) if (!strcasecmp($2->name, "__startup"))

View file

@ -665,6 +665,23 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc
return res.val.i; 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 void
filters_postconfig(void) filters_postconfig(void)
{ {

View file

@ -71,6 +71,7 @@ struct ea_list;
struct rte; struct rte;
int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool, int flags); 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); char *filter_name(struct filter *filter);
int filter_same(struct filter *new, struct filter *old); int filter_same(struct filter *new, struct filter *old);