summaryrefslogtreecommitdiffstats
path: root/filter
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 /filter
parentb79f9215b99c7a54dbb2639c972dda497d141133 (diff)
downloadbird-b9d70dc84e488212328103438bdf4e369c7d27a1.tar
bird-b9d70dc84e488212328103438bdf4e369c7d27a1.zip
Filters, second try. This time they have their own directory.
Diffstat (limited to 'filter')
-rw-r--r--filter/Makefile5
-rw-r--r--filter/config.Y100
-rw-r--r--filter/f-util.c67
-rw-r--r--filter/filter.h21
4 files changed, 193 insertions, 0 deletions
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