Function calling in filters works - somehow. Calling syntax is

currently very ugly, beware. Variables are not really local - that
needs to be fixed.
This commit is contained in:
Pavel Machek 1999-07-01 09:11:21 +00:00
parent 39369d6fbe
commit 6542ece91a
4 changed files with 53 additions and 7 deletions

View file

@ -8,6 +8,11 @@ router id 62.168.0.1;
define xyzzy = 120+10; define xyzzy = 120+10;
function callme (int arg1; int arg2;)
{
print "Function callme called arguments " arg1 " and " arg2;
}
function startup () function startup ()
int i; int i;
{ {
@ -30,9 +35,10 @@ int i;
print " false = " 5 ~ [ 2, 3, 4, 7..11 ]; print " false = " 5 ~ [ 2, 3, 4, 7..11 ];
print "IPsets: true = " 1.2.3.4 ~ [ 1.2.3.3..1.2.3.5 ]; print "IPsets: true = " 1.2.3.4 ~ [ 1.2.3.3..1.2.3.5 ];
print " false = " 1.2.3.4 ~ [ 1.2.3.3, 1.2.3.5 ]; print " false = " 1.2.3.4 ~ [ 1.2.3.3, 1.2.3.5 ];
callme ( 1, 2, );
print "done"; print "done";
# quitbird; quitbird;
print "*** FAIL: this is unreachable"; print "*** FAIL: this is unreachable";
} }

View file

@ -52,6 +52,7 @@ struct symbol {
struct symbol *next; struct symbol *next;
int class; int class;
int aux; int aux;
void *aux2;
void *def; void *def;
char name[1]; char name[1];
}; };

View file

@ -1,7 +1,7 @@
/* /*
* BIRD - filters * BIRD - filters
* *
* Copyright 1998 Pavel Machek * Copyright 1998,1999 Pavel Machek
* *
* Can be freely distributed and used under the terms of the GNU GPL. * Can be freely distributed and used under the terms of the GNU GPL.
*/ */
@ -29,11 +29,12 @@ CF_KEYWORDS(FUNCTION, PRINT, CONST,
FILTER FILTER
) )
%type <x> term block cmds cmd function_body ifthen constant print_one print_list %type <x> term block cmds cmd function_body ifthen constant print_one print_list var_list
%type <f> filter filter_body %type <f> filter filter_body
%type <i> type break_command %type <i> type break_command
%type <e> set_item set_items %type <e> set_item set_items
%type <v> set_atom %type <v> set_atom
%type <s> decls function_params
CF_GRAMMAR CF_GRAMMAR
@ -63,10 +64,12 @@ type:
} }
; ;
decls: /* EMPTY */ decls: /* EMPTY */ { $$ = NULL; }
| type SYM ';' decls { | type SYM ';' decls {
cf_define_symbol($2, SYM_VARIABLE | $1, NULL); cf_define_symbol($2, SYM_VARIABLE | $1, NULL);
printf( "New variable %s type %x\n", $2->name, $1 ); printf( "New variable %s type %x\n", $2->name, $1 );
$2->aux = $4;
$$=$2;
} }
; ;
@ -88,7 +91,7 @@ filter:
; ;
function_params: function_params:
'(' decls ')' { printf( "Have function parameters\n" ); } '(' decls ')' { printf( "Have function parameters\n" ); $$=$2; }
; ;
function_body: function_body:
@ -104,6 +107,8 @@ function_def:
cf_define_symbol($2, SYM_FUNCTION, $4); cf_define_symbol($2, SYM_FUNCTION, $4);
if (!strcasecmp($2->name, "startup")) if (!strcasecmp($2->name, "startup"))
startup_func = $4; startup_func = $4;
$2->aux = $3;
$2->aux2 = $4;
printf("Hmm, we've got one function here - %s\n", $2->name); printf("Hmm, we've got one function here - %s\n", $2->name);
} }
; ;
@ -173,7 +178,7 @@ term:
$$->a2.p = &($1->aux); $$->a2.p = &($1->aux);
break; break;
default: default:
cf_error("Can not use this class of symbol as variable" ); cf_error("Can not use this class of symbol as variable." );
} }
} }
| constant { $$ = $1; } | constant { $$ = $1; }
@ -216,6 +221,16 @@ print_list: /* EMPTY */ { $$ = NULL; }
} }
; ;
var_list: /* EMPTY */ { $$ = NULL; }
| term ',' var_list {
$$ = f_new_inst();
$$->code = 's';
$$->a1.p = NULL;
$$->a2.p = $1;
$$->next = $3;
}
;
cmd: cmd:
ifthen { ifthen {
$$ = $1; $$ = $1;
@ -237,6 +252,26 @@ cmd:
$$->a2.p = $3; $$->a2.p = $3;
} }
| break_command print_list ';' { $$ = f_new_inst(); $$->code = 'p,'; $$->a1.p = $2; $$->a2.i = $1; } | break_command print_list ';' { $$ = f_new_inst(); $$->code = 'p,'; $$->a1.p = $2; $$->a2.i = $1; }
| SYM '(' var_list ')' ';' {
struct symbol *sym;
struct f_inst *inst = $3;
if ($1->class != SYM_FUNCTION)
cf_error("You can not call something which is not function. Really.");
printf("You are calling function %s\n", $1->name);
$$ = f_new_inst();
$$->code = 'ca';
$$->a1.p = inst;
$$->a2.p = $1->aux2;
sym = $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;
inst = inst->next;
}
}
; ;
CF_END CF_END

View file

@ -250,6 +250,10 @@ interpret(struct f_inst *what)
default: bug( "Unknown prefix to conversion\n" ); default: bug( "Unknown prefix to conversion\n" );
} }
break; break;
case 'ca': /* CALL */
ONEARG;
res = interpret(what->a2.p);
break;
default: default:
bug( "Unknown instruction %d (%c)", what->code, what->code & 0xff); bug( "Unknown instruction %d (%c)", what->code, what->code & 0xff);
} }