From b9d70dc84e488212328103438bdf4e369c7d27a1 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 15 Jan 1999 16:49:17 +0000 Subject: [PATCH] Filters, second try. This time they have their own directory. --- conf/Makefile | 4 +- conf/confbase.Y | 2 +- filter/Makefile | 5 +++ filter/config.Y | 100 +++++++++++++++++++++++++++++++++++++++++++++ filter/f-util.c | 67 ++++++++++++++++++++++++++++++ filter/filter.h | 21 ++++++++++ sysdep/unix/main.c | 2 +- 7 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 filter/Makefile create mode 100644 filter/config.Y create mode 100644 filter/f-util.c create mode 100644 filter/filter.h diff --git a/conf/Makefile b/conf/Makefile index be1e1a47..270d5567 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 b8749aaf..75c98f0b 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 00000000..1e7fb684 --- /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 00000000..265463d3 --- /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 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 00000000..df6babb7 --- /dev/null +++ b/filter/f-util.c @@ -0,0 +1,67 @@ +/* + * Filters: utility functions + * + * Copyright 1998 Pavel Machek + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#include +#include +#include +#include + +#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 00000000..499be0a1 --- /dev/null +++ b/filter/filter.h @@ -0,0 +1,21 @@ +/* + * BIRD Internet Routing Daemon -- Configuration File Handling + * + * (c) 1998 Martin Mares + * + * 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 cb7bf3d3..2eac89e3 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"