summaryrefslogtreecommitdiffstats
path: root/filter
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>1999-11-10 14:44:29 +0100
committerPavel Machek <pavel@ucw.cz>1999-11-10 14:44:29 +0100
commitcb8034f42cfaa2753152fa1d776cc618d07fedda (patch)
treec4081e222e805be699151bcbccb0ae22bab43f69 /filter
parent2f702671b46fa2ea01021170f685f554e4012782 (diff)
downloadbird-cb8034f42cfaa2753152fa1d776cc618d07fedda.tar
bird-cb8034f42cfaa2753152fa1d776cc618d07fedda.zip
First try on enumerational types.
Mj's noassoc removed: this brings back shift/reduce conflict but it makes parser actually work. Mj please check it. IF/THEN/ELSE still will not work.
Diffstat (limited to 'filter')
-rw-r--r--filter/config.Y41
-rw-r--r--filter/filter.h2
2 files changed, 34 insertions, 9 deletions
diff --git a/filter/config.Y b/filter/config.Y
index 8f41f44..36d6c6f 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -21,6 +21,7 @@ CF_HDR
#include "nest/protocol.h"
#include "nest/iface.h"
#include "nest/route.h"
+#include <string.h>
CF_DECLS
@@ -33,15 +34,18 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, CONST,
LEN,
DEFINED,
IMPOSSIBLE,
+ RTSDUMMY, RTSSTATIC, RTSINHERIT, RTSDEVICE, RTSSTATIC_DEVICE, RTSREDIRECT, RTSRIP, RTSRIP_EXT, RTSOSPF, RTSOSPF_EXT, RTSOSPF_IA, RTSOSPF_BOUNDARY, RTSBGP, RTSPIPE,
FILTER
)
+/* Add these to break parser and make shift/reduce conflict go away :-(
%nonassoc ELSE
%nonassoc THEN
+*/
%type <x> term block cmds cmd function_body constant print_one print_list var_list var_listn any_dynamic
%type <f> filter filter_body
-%type <i> type break_command pair
+%type <i> type break_command pair enum_rts
%type <e> set_item set_items switch_body
%type <v> set_atom prefix prefix_s ipa
%type <s> decls declsn one_decl function_params
@@ -50,7 +54,7 @@ CF_GRAMMAR
CF_ADDTO(conf, filter_def)
filter_def:
- FILTER SYM { cf_push_scope( $2->name ); } filter_body {
+ FILTER SYM { cf_push_scope( $2 ); } filter_body {
cf_define_symbol($2, SYM_FILTER, $4);
$4->name = $2->name;
printf( "We have new filter defined (%s)\n", $2->name );
@@ -79,7 +83,7 @@ one_decl:
type SYM {
cf_define_symbol($2, SYM_VARIABLE | $1, NULL);
printf( "New variable %s type %x\n", $2->name, $1 );
- $2->aux = NULL;
+ $2->aux = 0;
{
struct f_val * val;
val = cfg_alloc(sizeof(struct f_val));
@@ -94,7 +98,7 @@ one_decl:
decls: /* EMPTY */ { $$ = NULL; }
| one_decl ';' decls {
$$ = $1;
- $$->aux = $3;
+ $$->aux = (int) $3;
}
;
@@ -102,7 +106,7 @@ decls: /* EMPTY */ { $$ = NULL; }
declsn: one_decl { $$ = $1; }
| declsn ';' one_decl {
$$ = $3;
- $$->aux = $1;
+ $$->aux = (int) $1;
}
;
@@ -137,12 +141,12 @@ function_body:
CF_ADDTO(conf, function_def)
function_def:
- FUNCTION SYM { printf( "Begining of function %s\n", $2->name ); cf_push_scope($2->name); } function_params function_body {
+ FUNCTION SYM { printf( "Begining of function %s\n", $2->name ); cf_push_scope($2); } function_params function_body {
extern struct f_inst *startup_func;
cf_define_symbol($2, SYM_FUNCTION, $5);
if (!strcasecmp($2->name, "startup"))
startup_func = $5;
- $2->aux = $4;
+ $2->aux = (int) $4;
$2->aux2 = $5;
printf("Hmm, we've got one function here - %s\n", $2->name);
cf_pop_scope();
@@ -227,6 +231,23 @@ switch_body: /* EMPTY */ { $$ = NULL; }
}
;
+enum_rts:
+ RTSDUMMY { $$ = 0; }
+ | RTSSTATIC { $$ = 1; }
+ | RTSINHERIT { $$ = 2; }
+ | RTSDEVICE { $$ = 3; }
+ | RTSSTATIC_DEVICE { $$ = 4; }
+ | RTSREDIRECT { $$ = 5; }
+ | RTSRIP { $$ = 6; }
+ | RTSRIP_EXT { $$ = 7; }
+ | RTSOSPF { $$ = 8; }
+ | RTSOSPF_EXT { $$ = 9; }
+ | RTSOSPF_IA { $$ = 10; }
+ | RTSOSPF_BOUNDARY { $$ = 11; }
+ | RTSBGP { $$ = 12; }
+ | RTSPIPE { $$ = 13; }
+ ;
+
constant:
CONST '(' expr ')' { $$ = f_new_inst(); $$->code = 'c'; $$->a1.i = T_INT; $$->a2.i = $3; }
| NUM { $$ = f_new_inst(); $$->code = 'c'; $$->a1.i = T_INT; $$->a2.i = $1; }
@@ -237,6 +258,8 @@ constant:
| ipa { NEW_F_VAL; $$ = f_new_inst(); $$->code = 'C'; $$->a1.p = val; *val = $1; }
| prefix_s {NEW_F_VAL; $$ = f_new_inst(); $$->code = 'C'; $$->a1.p = val; *val = $1; }
| '[' set_items ']' { printf( "We've got a set here..." ); $$ = f_new_inst(); $$->code = 'c'; $$->a1.i = T_SET; $$->a2.p = build_tree($2); printf( "ook\n" ); }
+
+ | enum_rts { $$ = f_new_inst(); $$->code = 'c'; $$->a1.i = T_ENUM_RTS; $$->a2.i = $1; }
;
any_dynamic:
@@ -363,13 +386,13 @@ cmd:
$$->code = 'ca';
$$->a1.p = inst;
$$->a2.p = $1->aux2;
- sym = $1->aux;
+ sym = (void *) $1->aux;
while (sym || inst) {
if (!sym || !inst)
cf_error("wrong number of arguments for function %s.", $1->name);
printf( "You should pass parameter called %s\n", sym->name);
inst->a1.p = sym;
- sym = sym->aux;
+ sym = (void *) sym->aux;
inst = inst->next;
}
}
diff --git a/filter/filter.h b/filter/filter.h
index ebb0925..189b226 100644
--- a/filter/filter.h
+++ b/filter/filter.h
@@ -97,6 +97,8 @@ void val_print(struct f_val v);
#define T_ENUM_LO 0x30
#define T_ENUM_HI 0x7f
+#define T_ENUM_RTS 0x30
+
#define T_ENUM T_ENUM_LO ... T_ENUM_HI
/* Bigger ones */