]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Added f_eval_int() and EVAL configuration command.
authorMartin Mares <mj@ucw.cz>
Mon, 15 May 2000 10:49:38 +0000 (10:49 +0000)
committerMartin Mares <mj@ucw.cz>
Mon, 15 May 2000 10:49:38 +0000 (10:49 +0000)
filter/config.Y
filter/filter.c
filter/filter.h

index 343c1e0717fbd4f58762cdda84923ac2aa51d4c6..4c4a859a72a8e3103db87ad5d952bd4abdc9b2cd 100644 (file)
@@ -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"))
index 5e848d6acac444949c9b2150e43bf1ed9c8256bb..2510b6a3e9ae7013f613a2063cc44ad65cad58b1 100644 (file)
@@ -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)
 {
index a1bf5481093e0b79e0e060b7a031f09a94822cbf..b746063ee4b48b48148dbb17f8613d12d8cf0ccd 100644 (file)
@@ -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);