]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filters, second try. This time they have their own directory.
authorPavel Machek <pavel@ucw.cz>
Fri, 15 Jan 1999 16:49:17 +0000 (16:49 +0000)
committerPavel Machek <pavel@ucw.cz>
Fri, 15 Jan 1999 16:49:17 +0000 (16:49 +0000)
conf/Makefile
conf/confbase.Y
filter/Makefile [new file with mode: 0644]
filter/config.Y [new file with mode: 0644]
filter/f-util.c [new file with mode: 0644]
filter/filter.h [new file with mode: 0644]
sysdep/unix/main.c

index be1e1a47005a84a0f7028ed7245853f8a230a0b3..270d556737f1ecbab47aa8720facb6c3e636a7a7 100644 (file)
@@ -1,10 +1,10 @@
-source=cf-parse.tab.c cf-lex.c f-util.c
+source=cf-parse.tab.c cf-lex.c
 root-rel=../
 
 include ../Rules
 
 conf-src=$(srcdir)/conf
-conf-fragments=$(conf-src)/confbase.Y @CONFS@ $(addsuffix /config.Y,$(static-dir-paths)) $(conf-src)/filter.Y
+conf-fragments=$(conf-src)/confbase.Y @CONFS@ $(addsuffix /config.Y,$(static-dir-paths))
 
 ifdef DEBUG
 BISON_DEBUG=-t
index b8749aafb28fdb85aba2d9131e15980a8fa257cc..75c98f0bcb54cd806ea69690c0a764bde6878061 100644 (file)
@@ -16,7 +16,7 @@ CF_HDR
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "nest/route.h"
-#include "conf/filter.h"
+#include "filter/filter.h"
 
 CF_DECLS
 
diff --git a/filter/Makefile b/filter/Makefile
new file mode 100644 (file)
index 0000000..1e7fb68
--- /dev/null
@@ -0,0 +1,5 @@
+source=f-util.c
+root-rel=../
+dir-name=filter
+
+include ../Rules
diff --git a/filter/config.Y b/filter/config.Y
new file mode 100644 (file)
index 0000000..265463d
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ *     BIRD - filters
+ *
+ *     Copyright 1998 Pavel Machek
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+CF_HDR
+
+#include "nest/bird.h"
+#include "filter/filter.h"
+#include "lib/resource.h"
+#include "lib/socket.h"
+#include "lib/timer.h"
+#include "nest/protocol.h"
+#include "nest/iface.h"
+#include "nest/route.h"
+
+CF_DECLS
+
+CF_KEYWORDS(FUNCTION, FILTER, PRINTDEBUG, INT, PRINT)
+
+%type <x> expr
+
+CF_GRAMMAR
+
+config:
+   program { 
+     printf( "Wow, we have full program\n" );
+     return 0;
+   }
+ ;
+
+program: /* EMPTY */
+ | program function
+ ;
+
+CF_ADDTO(conf, function)
+function:
+   FUNCTION SYM '(' ')' '{' expr '}' { 
+     extern struct f_instruction *last_func;
+     if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
+     $2->class = SYM_FUNCTION;
+     $2->aux = $6;
+     last_func = $6;
+     printf("Hmm, we've got one function here\n"); 
+   }
+ ;
+
+CF_ADDTO(conf, filter)
+filter:
+   FILTER SYM '{' expr '}' {
+     if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
+     $2->class = SYM_FILTER;
+     $2->aux = $4;
+     printf( "We have new filter defined (%s)\n", $2->name )
+   }
+ ;
+
+/* Programs */
+
+expr: /* EMPTY */ { $$ = NULL; }
+ | expr ';' expr { 
+     $$ = cfg_alloc(sizeof(struct f_instruction));
+     printf( "We've got statement here\n" );
+     $$->code = ',';
+     $$->arg1 = $1;
+     $$->arg2 = $3;
+   }
+ | INT SYM ';' {
+     if ($2->class != SYM_VOID) cf_error("Symbol already defined, can not use as variable\n" );
+     $2->class = SYM_VARIABLE_INT;
+     printf( "New variable\n" );
+     $$ = NULL;
+   }
+ | SYM '=' cexpr {
+     $$ = cfg_alloc(sizeof(struct f_instruction));
+     printf( "Ook, we'll set value\n" );
+     if ($1->class != SYM_VARIABLE_INT)
+       cf_error( "You may only set variables\n" );
+     $$->code = '=';
+     $$->arg1 = $1;
+     $$->arg2 = $3;
+   }
+ | PRINT '(' SYM ')' {
+     $$ = cfg_alloc(sizeof(struct f_instruction));
+     printf( "Ook, we'll print something\n" );
+     $$->code = 'p';
+     $$->arg1 = $3;
+     $$->arg2 = NULL;
+   }
+ | PRINTDEBUG {
+     $$ = cfg_alloc(sizeof(struct f_instruction));
+     $$->code = 'D';
+     $$->arg1 = $$->arg2 = NULL;
+ }
+ ;
+
+CF_END
diff --git a/filter/f-util.c b/filter/f-util.c
new file mode 100644 (file)
index 0000000..df6babb
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *     Filters: utility functions
+ *
+ *     Copyright 1998 Pavel Machek <pavel@ucw.cz>
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/signal.h>
+
+#include "nest/bird.h"
+#include "lib/lists.h"
+#include "lib/resource.h"
+#include "lib/socket.h"
+#include "nest/route.h"
+#include "nest/protocol.h"
+#include "nest/iface.h"
+#include "conf/conf.h"
+#include "filter/filter.h"
+
+struct f_instruction *last_func = NULL;
+
+static void
+interpret(struct f_instruction *what)
+{
+  struct symbol *sym;
+  if (!what)
+    return 0;
+  switch(what->code) {
+  case ',':
+    interpret(what->arg1);
+    interpret(what->arg2);
+    break;
+  case '=':
+    sym = what->arg1;
+    sym->aux = what->arg2;
+    break;
+  case 'p':
+    sym = what->arg1;
+    switch(sym->class) {
+    case SYM_VARIABLE_INT: 
+      printf( "Printing: %d\n", sym->aux );
+      break;
+    default:
+      printf( "Unknown type passed to print\n" );
+      break;
+    }
+    break;
+  case 'D':
+    printf( "DEBUGGING PRINT\n" );
+    break;
+  }
+}
+
+void
+filters_init(void)
+{
+  if (!last_func)
+    printf( "No function defined\n" );
+  else {
+    interpret(last_func);
+  }
+} 
+
diff --git a/filter/filter.h b/filter/filter.h
new file mode 100644 (file)
index 0000000..499be0a
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ *     BIRD Internet Routing Daemon -- Configuration File Handling
+ *
+ *     (c) 1998 Martin Mares <mj@ucw.cz>
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#ifndef _BIRD_FILT_H_
+#define _BIRD_FILT_H_
+
+#include "lib/resource.h"
+
+/* Lexer */
+
+struct f_instruction {
+  int code;
+  void *arg1, *arg2;
+};
+
+#endif
index cb7bf3d33bcfffe56b2c8e18291a5980d852779e..2eac89e33ff7006841ad4b0ffefde2e48e2cccaa 100644 (file)
@@ -19,7 +19,7 @@
 #include "nest/protocol.h"
 #include "nest/iface.h"
 #include "conf/conf.h"
-#include "conf/filter.h"
+#include "filter/filter.h"
 
 #include "unix.h"
 #include "krt.h"