summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--filter/config.Y44
-rw-r--r--filter/f-util.c29
-rw-r--r--filter/filter.h6
3 files changed, 59 insertions, 20 deletions
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 <x> term
+%type <x> 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