]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Path and path matching seem to work, now.
authorPavel Machek <pavel@ucw.cz>
Mon, 17 Apr 2000 10:42:28 +0000 (10:42 +0000)
committerPavel Machek <pavel@ucw.cz>
Mon, 17 Apr 2000 10:42:28 +0000 (10:42 +0000)
filter/config.Y
filter/filter.c
filter/test.conf

index a4c1392beedf3246392d6abd3f60bba803048ab9..d515d17b6fef905a4d3e5260ad2002c6cc541f2c 100644 (file)
@@ -72,7 +72,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
        LEN,
        DEFINED,
        ADD, DELETE, CONTAINS, RESET,
-       APPEND, MATCH,
+       PREPEND, MATCH,
        EMPTY,
        FILTER, WHERE)
 
@@ -388,6 +388,7 @@ term:
        case SYM_VARIABLE | T_PREFIX:
        case SYM_VARIABLE | T_IP:
        case SYM_VARIABLE | T_PATH_MASK:
+       case SYM_VARIABLE | T_PATH:
         $$->code = 'C';
         $$->a1.p = $1->aux2;
         break;
@@ -417,10 +418,11 @@ term:
 */
 
 /* Paths */
- | term '.' APPEND '(' term ')' { }
+ | term '.' PREPEND '(' term ')' { }
  | term '.' RESET { }
 
- | EMPTY { $$ = f_new_inst(); $$->code = 'E'; $$->aux = T_PATH; }
+ | '+' EMPTY '+' { $$ = f_new_inst(); $$->code = 'E'; $$->aux = T_PATH; }
+ | PREPEND '(' term ',' term ')' { $$ = f_new_inst(); $$->code = P('A','p'); $$->a1.p = $3; $$->a2.p = $5; } 
 
 /* | term '.' LEN { $$->code = P('P','l'); } */
 
index 82fb30419c86066c7d103f09042b5d61d3cf7bd7..d8124b79fb9aeaffedac90d1843df7eeafc453e7 100644 (file)
@@ -253,6 +253,8 @@ interpret(struct f_inst *what)
     case T_IP: 
     case T_PREFIX: 
     case T_PAIR: 
+    case T_PATH:
+    case T_CLIST:
     case T_PATH_MASK:
       if (sym->class != (SYM_VARIABLE | v2.type))
        runtime( "Variable of bad type" );
@@ -584,6 +586,7 @@ filters_postconfig(void)
   struct f_val res;
   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." );
@@ -674,10 +677,9 @@ path_format(u8 *p, int len)
 #define PM_END -1
 #define PM_ASTERIX -2
 
-#define MASK_PLUS do { mask = mask->next; if (mask->val == PM_END) return next == q; \
+#define MASK_PLUS do { mask = mask->next; if (!mask) return next == q; \
                       asterix = (mask->val == PM_ASTERIX); \
-                      printf( "Asterix now %d\n", asterix ); \
-                       if (asterix) { mask = mask->next; if (mask->val == PM_END) { printf( "Quick exit\n" ); return 1; } } \
+                       if (asterix) { mask = mask->next; if (!mask) { return 1; } } \
                       } while(0)
 
 int
index 94ed5566c7084e7eef48ca1143d61665527f8674..55cbf3368e6ed730b8a3b1a68024aaf5060a2f6f 100644 (file)
@@ -31,10 +31,18 @@ function fifteen()
 
 function paths()
 bgpmask p;
+bgppath p2;
 {
-       print "Testing paths";
-       p = / 1 2 3 4 /;
-       print p;
+       p = / 4 3 2 1 /;
+       print "Testing path masks: ", p;
+       p2 = prepend( + empty +, 1 );
+       p2 = prepend( p2, 2 );
+       p2 = prepend( p2, 3 );
+       p2 = prepend( p2, 4 );
+       print "Testing paths: ", p2;
+       print "Should be true: ", p2 ~ p;
+       p2 = prepend( p2, 5 );
+       print "Should be false: ", p2 ~ p;
 }
 
 function startup()