summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>1999-01-15 15:41:51 +0100
committerPavel Machek <pavel@ucw.cz>1999-01-15 15:41:51 +0100
commit72380a3447d2c54730a4a32495e5dd964c34f57e (patch)
tree3f2ff4ddddf46a90428c8a24d02affbee57456a9
parent41183888ee8addbd7887936e3b41974f5824d8ae (diff)
downloadbird-72380a3447d2c54730a4a32495e5dd964c34f57e.tar
bird-72380a3447d2c54730a4a32495e5dd964c34f57e.zip
Filters added. They are unable to do anything interesting for now
(with exception of printing integers to screen), but they exist.
-rw-r--r--conf/Makefile4
-rw-r--r--conf/cf-lex.l2
-rw-r--r--conf/conf.h4
-rw-r--r--conf/confbase.Y25
4 files changed, 22 insertions, 13 deletions
diff --git a/conf/Makefile b/conf/Makefile
index 270d556..be1e1a4 100644
--- a/conf/Makefile
+++ b/conf/Makefile
@@ -1,10 +1,10 @@
-source=cf-parse.tab.c cf-lex.c
+source=cf-parse.tab.c cf-lex.c f-util.c
root-rel=../
include ../Rules
conf-src=$(srcdir)/conf
-conf-fragments=$(conf-src)/confbase.Y @CONFS@ $(addsuffix /config.Y,$(static-dir-paths))
+conf-fragments=$(conf-src)/confbase.Y @CONFS@ $(addsuffix /config.Y,$(static-dir-paths)) $(conf-src)/filter.Y
ifdef DEBUG
BISON_DEBUG=-t
diff --git a/conf/cf-lex.l b/conf/cf-lex.l
index 7c37a00..ab7e6ce 100644
--- a/conf/cf-lex.l
+++ b/conf/cf-lex.l
@@ -245,6 +245,7 @@ cf_allocate(void)
cfg_mem = lp_new(cfg_pool, 1024);
}
+#if 1
char *
cfg_strdup(char *c)
{
@@ -253,4 +254,5 @@ cfg_strdup(char *c)
memcpy(z, c, l);
return z;
}
+#endif
diff --git a/conf/conf.h b/conf/conf.h
index 1e80628..19ed34e 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -36,6 +36,10 @@ struct symbol {
#define SYM_VOID 0
#define SYM_PROTO 1
#define SYM_NUMBER 2
+#define SYM_STAT 3 /* statement */
+#define SYM_VARIABLE_INT 4
+#define SYM_FUNCTION 5
+#define SYM_FILTER 6
void cf_lex_init_tables(void);
int cf_lex(void);
diff --git a/conf/confbase.Y b/conf/confbase.Y
index 0f00587..b8749aa 100644
--- a/conf/confbase.Y
+++ b/conf/confbase.Y
@@ -16,6 +16,7 @@ CF_HDR
#include "nest/protocol.h"
#include "nest/iface.h"
#include "nest/route.h"
+#include "conf/filter.h"
CF_DECLS
@@ -24,6 +25,7 @@ CF_DECLS
ip_addr a;
struct symbol *s;
char *t;
+ struct f_instruction *x;
}
%token END
@@ -32,7 +34,8 @@ CF_DECLS
%token <s> SYM
%token <t> TEXT
-%type <i> expr bool pxlen
+%type <i> cexpr bool pxlen
+%type <x> expr
%left '+' '-'
%left '*' '/' '%'
@@ -55,22 +58,22 @@ conf_entries:
CF_ADDTO(conf, /* EMPTY */)
-/* Expressions */
+/* Constant expressions */
-expr:
+cexpr:
NUM
- | expr '+' expr { $$ = $1 + $3; }
- | expr '-' expr { $$ = $1 - $3; }
- | expr '*' expr { $$ = $1 * $3; }
- | expr '/' expr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); }
- | expr '%' expr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); }
- | '(' expr ')' { $$ = $2; }
+ | cexpr '+' cexpr { $$ = $1 + $3; }
+ | cexpr '-' cexpr { $$ = $1 - $3; }
+ | cexpr '*' cexpr { $$ = $1 * $3; }
+ | cexpr '/' cexpr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); }
+ | cexpr '%' cexpr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); }
+ | '(' cexpr ')' { $$ = $2; }
| SYM { if ($1->class != SYM_NUMBER) cf_error("Number expected"); else $$ = $1->aux; }
;
CF_ADDTO(conf, definition)
definition:
- DEFINE SYM '=' expr {
+ DEFINE SYM '=' cexpr {
if ($2->class != SYM_VOID) cf_error("Symbol already defined");
$2->class = SYM_NUMBER;
$2->aux = $4;
@@ -80,7 +83,7 @@ definition:
/* Switches */
bool:
- expr {$$ = !!$1; }
+ cexpr {$$ = !!$1; }
| ON { $$ = 1; }
| YES { $$ = 1; }
| OFF { $$ = 0; }