summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>1999-01-15 17:49:17 +0100
committerPavel Machek <pavel@ucw.cz>1999-01-15 17:49:17 +0100
commitb9d70dc84e488212328103438bdf4e369c7d27a1 (patch)
tree96afe1e6d460c3ba55b27a92c052800d9616df25
parentb79f9215b99c7a54dbb2639c972dda497d141133 (diff)
downloadbird-b9d70dc84e488212328103438bdf4e369c7d27a1.tar
bird-b9d70dc84e488212328103438bdf4e369c7d27a1.zip
Filters, second try. This time they have their own directory.
-rw-r--r--conf/Makefile4
-rw-r--r--conf/confbase.Y2
-rw-r--r--filter/Makefile5
-rw-r--r--filter/config.Y100
-rw-r--r--filter/f-util.c67
-rw-r--r--filter/filter.h21
-rw-r--r--sysdep/unix/main.c2
7 files changed, 197 insertions, 4 deletions
diff --git a/conf/Makefile b/conf/Makefile
index be1e1a4..270d556 100644
--- a/conf/Makefile
+++ b/conf/Makefile
@@ -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
diff --git a/conf/confbase.Y b/conf/confbase.Y
index b8749aa..75c98f0 100644
--- a/conf/confbase.Y
+++ b/conf/confbase.Y
@@ -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
index 0000000..1e7fb68
--- /dev/null
+++ b/filter/Makefile
@@ -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
index 0000000..265463d
--- /dev/null
+++ b/filter/config.Y
@@ -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
index 0000000..df6babb
--- /dev/null
+++ b/filter/f-util.c
@@ -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
index 0000000..499be0a
--- /dev/null
+++ b/filter/filter.h
@@ -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
diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c
index cb7bf3d..2eac89e 100644
--- a/sysdep/unix/main.c
+++ b/sysdep/unix/main.c
@@ -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"