LEN,
DEFINED,
ADD, DELETE, CONTAINS, RESET,
- APPEND, MATCH,
+ PREPEND, MATCH,
EMPTY,
FILTER, WHERE)
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;
*/
/* 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'); } */
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" );
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." );
#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
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()