diff --git a/filter/config.Y b/filter/config.Y index 45f65b50..73a75888 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -22,20 +22,17 @@ CF_DECLS CF_KEYWORDS(FUNCTION, FILTER, PRINTDEBUG, INT, PRINT) %type term +%type cmds CF_GRAMMAR -program: /* EMPTY */ - | program function - ; - CF_ADDTO(conf, function) function: - FUNCTION SYM '(' ')' '{' term '}' { + FUNCTION SYM '(' ')' '{' cmds '}' { extern struct f_instruction *last_func; if ($2->class != SYM_VOID) cf_error("Symbol already defined" ); $2->class = SYM_FUNCTION; - $2->aux = $6; + $2->def = $6; last_func = $6; printf("Hmm, we've got one function here\n"); } @@ -43,23 +40,34 @@ function: CF_ADDTO(conf, filter) filter: - FILTER SYM '{' term '}' { + FILTER SYM '{' cmds '}' { if ($2->class != SYM_VOID) cf_error("Symbol already defined" ); $2->class = SYM_FILTER; - $2->aux = $4; + $2->def = $4; printf( "We have new filter defined (%s)\n", $2->name ) } ; /* Programs */ -term: /* EMPTY */ { $$ = NULL; } - | term ';' term { - $$ = cfg_alloc(sizeof(struct f_instruction)); - printf( "We've got statement here\n" ); - $$->code = ','; - $$->arg1 = $1; - $$->arg2 = $3; +cmds: + term { + if ($1) { + $1->next = NULL; + $$ = $1; + } else $$ = NULL; + } + | term ';' cmds { + if ($1) { + $1->next = $3; + $$ = $1; + } else $$ = $3; + } + ; + +term: + /* EMPTY */ { + $$ = NULL; } | INT SYM { if ($2->class != SYM_VOID) cf_error("Symbol already defined, can not use as variable\n" ); @@ -68,7 +76,7 @@ term: /* EMPTY */ { $$ = NULL; } $$ = NULL; } | SYM '=' expr { - $$ = cfg_alloc(sizeof(struct f_instruction)); + $$ = f_new_inst(); printf( "Ook, we'll set value\n" ); if ($1->class != SYM_VARIABLE_INT) cf_error( "You may only set variables\n" ); @@ -77,14 +85,14 @@ term: /* EMPTY */ { $$ = NULL; } $$->arg2 = $3; } | PRINT '(' SYM ')' { - $$ = cfg_alloc(sizeof(struct f_instruction)); + $$ = f_new_inst(); printf( "Ook, we'll print something\n" ); $$->code = 'p'; $$->arg1 = $3; $$->arg2 = NULL; } | PRINTDEBUG { - $$ = cfg_alloc(sizeof(struct f_instruction)); + $$ = f_new_inst(); $$->code = 'D'; $$->arg1 = $$->arg2 = NULL; } diff --git a/filter/f-util.c b/filter/f-util.c index 65b8b52a..66bf5f1b 100644 --- a/filter/f-util.c +++ b/filter/f-util.c @@ -28,7 +28,7 @@ interpret(struct f_instruction *what) { struct symbol *sym; if (!what) - return 0; + return; switch(what->code) { case ',': interpret(what->arg1); @@ -36,7 +36,7 @@ interpret(struct f_instruction *what) break; case '=': sym = what->arg1; - sym->aux = what->arg2; + sym->aux = (int) what->arg2; break; case 'p': sym = what->arg1; @@ -52,7 +52,11 @@ interpret(struct f_instruction *what) case 'D': printf( "DEBUGGING PRINT\n" ); break; + case '0': + printf( "No operation\n" ); + break; } + interpret(what->next); } void @@ -65,3 +69,24 @@ filters_postconfig(void) } } +struct f_instruction * +f_new_inst(void) +{ + struct f_instruction * ret; + ret = cfg_alloc(sizeof(struct f_instruction)); + ret->code = 0; + ret->arg1 = ret->arg2 = ret->next = NULL; + return ret; +} + +int +f_run(struct symbol *filter, struct rte *rtein, struct rte **rteout) +{ + struct f_instruction *inst; + debug( "Running filter `%s'...", filter->name ); + + inst = filter->def; + interpret(inst); + debug( "done\n" ); + return F_ACCEPT; +} diff --git a/filter/filter.h b/filter/filter.h index 09cd7a23..aed26473 100644 --- a/filter/filter.h +++ b/filter/filter.h @@ -14,10 +14,16 @@ /* Lexer */ struct f_instruction { + struct f_instruction *next; /* Structure is 16 bytes, anyway */ int code; void *arg1, *arg2; }; void filters_postconfig(void); +struct f_instruction *f_new_inst(void); + +#define F_ACCEPT 1 +#define F_REJECT 2 +#define F_MODIFY 3 #endif