]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
New syntax for bgp_path
authorOndrej Zajicek <santiago@crfreenet.org>
Sat, 14 Mar 2009 11:43:10 +0000 (12:43 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Sat, 14 Mar 2009 11:43:10 +0000 (12:43 +0100)
client/client.c
conf/cf-lex.l
conf/confbase.Y
filter/config.Y
filter/filter.c
filter/test.conf

index 6e465bce3bd584e106eba0e213d5ac12e31e90ec..6a217c7fa4d98fbafbae6d396f293a9a9fc74e00 100644 (file)
@@ -168,22 +168,28 @@ input_complete(int arg UNUSED, int key UNUSED)
 static int
 input_help(int arg, int key UNUSED)
 {
-  int i, in_string, in_path;
+  int i, in_string, in_bracket;
 
   if (arg != 1)
     return rl_insert(arg, '?');
 
-  in_string = in_path = 0;
+  in_string = in_bracket = 0;
   for (i = 0; i < rl_point; i++)
     {
+   
       if (rl_line_buffer[i] == '"')
        in_string = ! in_string;
-      else if ((rl_line_buffer[i] == '|') && (! in_string))
-       in_path = ! in_path;
+      else if (! in_string)
+        {
+         if (rl_line_buffer[i] == '[')
+           in_bracket++;
+         else if (rl_line_buffer[i] == ']')
+           in_bracket--;
+        }
     }
 
   /* `?' inside string or path -> insert */
-  if (in_string || in_path)
+  if (in_string || in_bracket)
     return rl_insert(1, '?');
 
   rl_begin_undo_group();               /* HACK: We want to display `?' at point position */
index edca7a251cabc4617f5d7196005af3d634e5853e..c68a42e4dc074f46be23db2e349a9ee6f44d3670 100644 (file)
@@ -200,6 +200,9 @@ WHITE [ \t]
 \&\& return AND;
 \|\| return OR;
 
+\[\= return PO;
+\=\] return PC;
+
 %%
 
 static int
index fa178d876247a55a64be34b1066c49e5a314a612..e6401f47ada5b9841798c928122239684bf3e625 100644 (file)
@@ -45,6 +45,7 @@ CF_DECLS
 
 %token END CLI_MARKER INVALID_TOKEN
 %token GEQ LEQ NEQ AND OR
+%token PO PC
 %token <i> NUM ENUM
 %token <i32> RTRID
 %token <a> IPA
@@ -57,7 +58,7 @@ CF_DECLS
 %type <px> prefix prefix_or_ipa
 
 %nonassoc PREFIX_DUMMY
-%nonassoc '=' '<' '>' '~' '.' GEQ LEQ NEQ AND OR
+%nonassoc '=' '<' '>' '~' '.' GEQ LEQ NEQ AND OR PO PC
 %left '+' '-'
 %left '*' '/' '%'
 %left '!'
index fa2453d47df4f5d72757ed457e20df7516d26527..688464d9593d91c4ed32a66132f0876a9e2a4391 100644 (file)
@@ -268,7 +268,7 @@ switch_body: /* EMPTY */ { $$ = NULL; }
 /* CONST '(' expr ')' { $$ = f_new_inst(); $$->code = 'c'; $$->aux = T_INT; $$->a2.i = $3; } */
 
 bgp_path:
-   '|' bgp_path_tail1 '|' { $$ = $2; }
+   PO  bgp_path_tail1 PC  { $$ = $2; }
  | '/' bgp_path_tail2 '/' { $$ = $2; }
  | OR                            { $$ = NULL; } /* special case because of || is a different token */
  ;
index 785a0876e4c9be6c61182cc861c387c7dc01bf63..623ab291bde55f870924afd67ad9dbe0cff7fcaa 100644 (file)
@@ -83,9 +83,9 @@ pm_format(struct f_path_mask *p, byte *buf, unsigned int size)
        }
 
       if (p->any)
-       buf += bsprintf(buf, "");
+       buf += bsprintf(buf, " *");
       else
-       buf += bsprintf(buf, "%u ", p->val);
+       buf += bsprintf(buf, " %u", p->val);
 
       p = p->next;
     }
@@ -252,7 +252,7 @@ val_print(struct f_val v)
   case T_ENUM: PRINTF( "(enum %x)%d", v.type, v.val.i ); break;
   case T_PATH: as_path_format(v.val.ad, buf2, 1020); PRINTF( "(path %s)", buf2 ); break;
   case T_CLIST: int_set_format(v.val.ad, 1, buf2, 1020); PRINTF( "(clist %s)", buf2 ); break;
-  case T_PATH_MASK: pm_format(v.val.path_mask, buf2, 1020); PRINTF( "(pathmask %s)", buf2 ); break;
+  case T_PATH_MASK: pm_format(v.val.path_mask, buf2, 1020); PRINTF( "(pathmask%s)", buf2 ); break;
   default: PRINTF( "[unknown type %x]", v.type );
 #undef PRINTF
   }
index 73a651964b30239d3cba20d6d39cb26ded7408a0..96859e5363613f7ac138a4b012fb6104eaceb3e6 100644 (file)
@@ -31,24 +31,35 @@ function fifteen()
 }
 
 function paths()
-bgpmask p;
+bgpmask pm1;
+bgpmask pm2;
 bgppath p2;
 clist l;
 {
-       p = / 4 3 2 1 /;
-       print "Testing path masks: ", p;
+       pm1 =  / 4 3 2 1 /;
+       pm2 = [= 4 3 2 1 =];
+       print "Testing path masks: ", pm1, " ", pm2;
        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;
+       print "Should be true: ", p2 ~ pm1, " ", p2 ~ pm2;
        print "4 = ", p2.len;
        p2 = prepend( p2, 5 );
-       print "Should be false: ", p2 ~ p;
-       print "Should be true: ", p2 ~ / ? 4 3 2 1 /, p2, / ? 4 3 2 1 /;
-       print "Should be true: ", p2 ~ / ? 4 3 ? 1 /, p2, / ? 4 3 ? 1 /;
+       print "Should be false: ", p2 ~ pm1, " ", p2 ~ pm2;
+       print "Should be true: ", p2 ~  / ? 4 3 2 1 /,  " ", p2, " ",  / ? 4 3 2 1 /;
+       print "Should be true: ", p2 ~ [= * 4 3 * 1 =], " ", p2, " ", [= * 4 3 * 1 =];
        print "5 = ", p2.len;
+       
+       pm1 = [= 1 2 * 3 4 5 =];
+       p2 = prepend( + empty +, 5 );
+       p2 = prepend( p2, 4 );
+       p2 = prepend( p2, 3 );
+       p2 = prepend( p2, 3 );
+       p2 = prepend( p2, 2 );
+       p2 = prepend( p2, 1 );
+       print "Should be true: ", p2 ~ pm1, " ", p2, " ", pm1;
 
        l = - empty -;
        l = add( l, (1,2) );