diff --git a/client/client.c b/client/client.c index 6e465bce..6a217c7f 100644 --- a/client/client.c +++ b/client/client.c @@ -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 */ diff --git a/conf/cf-lex.l b/conf/cf-lex.l index edca7a25..c68a42e4 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -200,6 +200,9 @@ WHITE [ \t] \&\& return AND; \|\| return OR; +\[\= return PO; +\=\] return PC; + %% static int diff --git a/conf/confbase.Y b/conf/confbase.Y index fa178d87..e6401f47 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -45,6 +45,7 @@ CF_DECLS %token END CLI_MARKER INVALID_TOKEN %token GEQ LEQ NEQ AND OR +%token PO PC %token NUM ENUM %token RTRID %token IPA @@ -57,7 +58,7 @@ CF_DECLS %type prefix prefix_or_ipa %nonassoc PREFIX_DUMMY -%nonassoc '=' '<' '>' '~' '.' GEQ LEQ NEQ AND OR +%nonassoc '=' '<' '>' '~' '.' GEQ LEQ NEQ AND OR PO PC %left '+' '-' %left '*' '/' '%' %left '!' diff --git a/filter/config.Y b/filter/config.Y index fa2453d4..688464d9 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -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 */ ; diff --git a/filter/filter.c b/filter/filter.c index 785a0876..623ab291 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -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 } diff --git a/filter/test.conf b/filter/test.conf index 73a65196..96859e53 100644 --- a/filter/test.conf +++ b/filter/test.conf @@ -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) );