]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Line numbers for runtime errors (what's wrong with cvs? I could not
authorPavel Machek <pavel@ucw.cz>
Tue, 16 May 2000 18:50:51 +0000 (18:50 +0000)
committerPavel Machek <pavel@ucw.cz>
Tue, 16 May 2000 18:50:51 +0000 (18:50 +0000)
commit this from home)

filter/f-util.c
filter/filter.c
filter/filter.h

index ba6e777274c94e9b1cd0a601bdaa845891caefe8..e1824c5f2e0f80a3353b12736e31f9b81f70f195 100644 (file)
@@ -19,6 +19,7 @@ f_new_inst(void)
   ret = cfg_alloc(sizeof(struct f_inst));
   ret->code = ret->aux = 0;
   ret->arg1 = ret->arg2 = ret->next = NULL;
+  ret->lineno = conf_lino;
   return ret;
 }
 
index 344368e68fb89a838525e5160b6f42d0b143c6ca..a805363ad26e3983b80335bef74db0d00c906ab4 100644 (file)
@@ -43,6 +43,8 @@
 
 #define P(a,b) ((a<<8) | b)
 
+struct f_inst *startup_func = NULL, *test1_func, *test2_func;
+
 #define CMP_ERROR 999
 
 static int
@@ -187,7 +189,7 @@ static int f_flags;
 static rta *f_rta_copy;
 
 #define runtime(x) do { \
-    log( L_ERR ); \
+    log( L_ERR "filters, line %d: %s", what->lineno, x); \
     res.type = T_RETURN; \
     res.val.i = F_ERROR; \
     return res; \
@@ -230,22 +232,6 @@ interpret(struct f_inst *what)
     default: runtime( "Usage of unknown type" );
     }
     break;
-  case '-':
-    TWOARGS_C;
-    switch (res.type = v1.type) {
-    case T_VOID: runtime( "Can not operate with values of type void" );
-    case T_INT: res.val.i = v1.val.i - v2.val.i; break;
-    default: runtime( "Usage of unknown type" );
-    }
-    break;
-  case '*':
-    TWOARGS_C;
-    switch (res.type = v1.type) {
-    case T_VOID: runtime( "Can not operate with values of type void" );
-    case T_INT: res.val.i = v1.val.i * v2.val.i; break;
-    default: runtime( "Usage of unknown type" );
-    }
-    break;
   case '/':
     TWOARGS_C;
     switch (res.type = v1.type) {
@@ -598,8 +584,6 @@ i_same(struct f_inst *f1, struct f_inst *f2)
   switch(f1->code) {
   case ',': /* fall through */
   case '+':
-  case '-':
-  case '*':
   case '/':
   case P('!','='):
   case P('=','='):
@@ -681,22 +665,24 @@ 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)
+void
+filters_postconfig(void)
 {
   struct f_val res;
 
-  f_flags = 0;
-  f_tmp_attrs = NULL;
-  f_rte = NULL;
-  f_rte_old = NULL;
-  f_rta_copy = NULL;
-  f_pool = cfg_mem;
-  res = interpret(expr);
-  if (res.type != T_INT)
-    cf_error("Integer expression expected");
-  return res.val.i;
-}
+#if 1
+  if (!i_same(test1_func, test2_func))
+    bug("i_same does not work");
+#endif
+  if (startup_func) {
+    debug( "Launching startup function...\n" );
+    f_pool = lp_new(&root_pool, 1024);
+    res = interpret(startup_func);
+    if (res.type == F_ERROR)
+      die( "Startup function resulted in error." );
+    debug( "done\n" );
+  }
+} 
 
 /**
  * filter_same - compare two filters
index 3a62cd7e30f802bc68d49f81738f2beb068922dc..f17f07654229255ed12d30f24e86e5e7b736fc86 100644 (file)
@@ -25,12 +25,13 @@ struct f_inst {             /* Instruction */
     int i;
     void *p;
   } a2;
+  int lineno;
 };
 
 #define arg1 a1.p
 #define arg2 a2.p
 
-struct f_prefix {
+struct prefix {
   ip_addr ip;
   int len;
 #define LEN_MASK 0xff
@@ -45,7 +46,7 @@ struct f_val {
   union {
     int i;
     /*    ip_addr ip; Folded into prefix */    
-    struct f_prefix px;
+    struct prefix px;
     char *s;
     struct f_tree *t;
     struct adata *ad;
@@ -58,6 +59,7 @@ struct filter {
   struct f_inst *root;
 };
 
+void filters_postconfig(void);
 struct f_inst *f_new_inst(void);
 struct f_inst *f_new_dynamic_attr(int type, int f_type, int code);     /* Type as core knows it, type as filters know it, and code of dynamic attribute */
 struct f_tree *f_new_tree(void);
@@ -70,7 +72,6 @@ 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);