]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Add interface for running filters (please comment!), avoid bison warnings
authorPavel Machek <pavel@ucw.cz>
Tue, 2 Mar 1999 19:49:28 +0000 (19:49 +0000)
committerPavel Machek <pavel@ucw.cz>
Tue, 2 Mar 1999 19:49:28 +0000 (19:49 +0000)
filter/config.Y
filter/f-util.c
filter/filter.h

index 45f65b5099503123f3507f283f408caa51a06970..73a75888a84b9282099a251887a8d798e127cab3 100644 (file)
@@ -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;
  }
index 65b8b52ade0903705013419dc520c38d045458b5..66bf5f1bb716fb351d3db9a5f40b240a19ccf0a1 100644 (file)
@@ -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;
+}
index 09cd7a2327cb907b4e0020a50f20e256d8f033ce..aed264739e29360025c644fb232ee7904bc63729 100644 (file)
 /* 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