mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Conf: Symbol implementation converted from void pointers to union
... and consted some declarations.
This commit is contained in:
@@ -451,7 +451,8 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
|
||||
%type <x> term block cmd cmds constant constructor print_one print_list var_list var_listn function_call symbol_value bgp_path_expr bgp_path bgp_path_tail one_decl decls
|
||||
%type <fda> dynamic_attr
|
||||
%type <fsa> static_attr
|
||||
%type <f> filter filter_body where_filter
|
||||
%type <f> filter where_filter
|
||||
%type <fl> filter_body
|
||||
%type <flv> lvalue
|
||||
%type <i> type
|
||||
%type <ecs> ec_kind
|
||||
@@ -467,11 +468,12 @@ CF_GRAMMAR
|
||||
|
||||
conf: filter_def ;
|
||||
filter_def:
|
||||
FILTER CF_SYM_VOID { $2 = cf_define_symbol($2, SYM_FILTER, NULL); cf_push_scope( $2 ); }
|
||||
FILTER CF_SYM_VOID { $2 = cf_define_symbol($2, SYM_FILTER, filter, NULL); cf_push_scope( $2 ); }
|
||||
filter_body {
|
||||
$2->def = $4;
|
||||
$4->name = $2->name;
|
||||
DBG( "We have new filter defined (%s)\n", $2->name );
|
||||
struct filter *f = cfg_alloc(sizeof(struct filter));
|
||||
*f = (struct filter) { .name = $2->name, .root = $4 };
|
||||
$2->filter = f;
|
||||
|
||||
cf_pop_scope();
|
||||
}
|
||||
;
|
||||
@@ -483,14 +485,14 @@ filter_eval:
|
||||
|
||||
conf: custom_attr ;
|
||||
custom_attr: ATTRIBUTE type CF_SYM_VOID ';' {
|
||||
cf_define_symbol($3, SYM_ATTRIBUTE, ca_lookup(new_config->pool, $3->name, $2)->fda);
|
||||
cf_define_symbol($3, SYM_ATTRIBUTE, attribute, ca_lookup(new_config->pool, $3->name, $2)->fda);
|
||||
};
|
||||
|
||||
conf: bt_test_suite ;
|
||||
bt_test_suite:
|
||||
BT_TEST_SUITE '(' CF_SYM_FUNCTION ',' text ')' {
|
||||
struct f_bt_test_suite *t = cfg_allocz(sizeof(struct f_bt_test_suite));
|
||||
t->fn = $3->def;
|
||||
t->fn = $3->function;
|
||||
t->fn_name = $3->name;
|
||||
t->dsc = $5;
|
||||
|
||||
@@ -502,8 +504,8 @@ conf: bt_test_same ;
|
||||
bt_test_same:
|
||||
BT_TEST_SAME '(' CF_SYM_FUNCTION ',' CF_SYM_FUNCTION ',' NUM ')' {
|
||||
struct f_bt_test_suite *t = cfg_allocz(sizeof(struct f_bt_test_suite));
|
||||
t->fn = $3->def;
|
||||
t->cmp = $5->def;
|
||||
t->fn = $3->function;
|
||||
t->cmp = $5->function;
|
||||
t->result = $7;
|
||||
t->fn_name = $3->name;
|
||||
t->dsc = $5->name;
|
||||
@@ -553,7 +555,7 @@ one_decl:
|
||||
type CF_SYM_VOID {
|
||||
struct f_val * val = cfg_alloc(sizeof(struct f_val));
|
||||
val->type = T_VOID;
|
||||
$2 = cf_define_symbol($2, SYM_VARIABLE | $1, val);
|
||||
$2 = cf_define_symbol($2, SYM_VARIABLE | $1, val, val);
|
||||
DBG( "New variable %s type %x\n", $2->name, $1 );
|
||||
$$ = f_new_inst(FI_SET, NULL, $2);
|
||||
}
|
||||
@@ -578,22 +580,24 @@ declsn: one_decl { $$.inst = $1; $$.count = 1; }
|
||||
|
||||
filter_body:
|
||||
function_body {
|
||||
$$ = cfg_alloc(sizeof(struct filter));
|
||||
$$->name = NULL;
|
||||
if ($1[0]) {
|
||||
const struct f_inst *inst[2] = { $1[0], $1[1] };
|
||||
$$->root = f_postfixify_concat(inst, 2);
|
||||
$$ = f_postfixify_concat(inst, 2);
|
||||
}
|
||||
else
|
||||
$$->root = f_postfixify($1[1]);
|
||||
$$ = f_postfixify($1[1]);
|
||||
}
|
||||
;
|
||||
|
||||
filter:
|
||||
CF_SYM_FILTER {
|
||||
$$ = $1->def;
|
||||
$$ = $1->filter;
|
||||
}
|
||||
| filter_body {
|
||||
struct filter *f = cfg_alloc(sizeof(struct filter));
|
||||
*f = (struct filter) { .root = $1 };
|
||||
$$ = f;
|
||||
}
|
||||
| filter_body
|
||||
;
|
||||
|
||||
where_filter:
|
||||
@@ -618,7 +622,7 @@ function_body:
|
||||
conf: function_def ;
|
||||
function_def:
|
||||
FUNCTION CF_SYM_VOID { DBG( "Beginning of function %s\n", $2->name );
|
||||
$2 = cf_define_symbol($2, SYM_FUNCTION, NULL);
|
||||
$2 = cf_define_symbol($2, SYM_FUNCTION, function, NULL);
|
||||
cf_push_scope($2);
|
||||
} function_params function_body {
|
||||
const struct f_inst *catlist[4];
|
||||
@@ -639,9 +643,10 @@ function_def:
|
||||
if ($5[1])
|
||||
catlist[count++] = $5[1];
|
||||
|
||||
$2->def = f_postfixify_concat(catlist, count);
|
||||
$2->aux2 = $4.count;
|
||||
DBG("Hmm, we've got one function here - %s\n", $2->name);
|
||||
struct f_line *fl = f_postfixify_concat(catlist, count);
|
||||
fl->args = $4.count;
|
||||
$2->function = fl;
|
||||
|
||||
cf_pop_scope();
|
||||
}
|
||||
;
|
||||
@@ -693,7 +698,7 @@ set_atom:
|
||||
}
|
||||
| CF_SYM_CONSTANT {
|
||||
if (!f_valid_set_type(SYM_TYPE($1))) cf_error("%s: set-incompatible type", $1->name);
|
||||
$$ = *(struct f_val *)($1->def);
|
||||
$$ = *$1->val;
|
||||
}
|
||||
;
|
||||
|
||||
@@ -856,9 +861,9 @@ function_call:
|
||||
;
|
||||
|
||||
symbol_value:
|
||||
CF_SYM_CONSTANT { $$ = f_new_inst(FI_CONSTANT_INDIRECT, $1->def); }
|
||||
CF_SYM_CONSTANT { $$ = f_new_inst(FI_CONSTANT_INDIRECT, $1->val); }
|
||||
| CF_SYM_VARIABLE { $$ = f_new_inst(FI_VARIABLE, $1); }
|
||||
| CF_SYM_ATTRIBUTE { $$ = f_new_inst(FI_EA_GET, *((struct f_dynamic_attr *) $1->def)); }
|
||||
| CF_SYM_ATTRIBUTE { $$ = f_new_inst(FI_EA_GET, *$1->attribute); }
|
||||
;
|
||||
|
||||
static_attr:
|
||||
@@ -986,7 +991,7 @@ cmd:
|
||||
$$ = f_new_inst(FI_CONDITION, $2, $4, $6);
|
||||
}
|
||||
| CF_SYM_ATTRIBUTE '=' term ';' {
|
||||
$$ = f_new_inst(FI_EA_SET, $3, *((struct f_dynamic_attr *) $1->def));
|
||||
$$ = f_new_inst(FI_EA_SET, $3, *$1->attribute);
|
||||
}
|
||||
| CF_SYM_VARIABLE '=' term ';' {
|
||||
$$ = f_new_inst(FI_SET, $3, $1);
|
||||
|
@@ -188,9 +188,9 @@ const struct symbol *sym;
|
||||
FID_NEW_ARGS
|
||||
, const struct symbol *sym
|
||||
FID_NEW_BODY
|
||||
what->valp = (what->sym = sym)->def;
|
||||
what->valp = (what->sym = sym)->val;
|
||||
FID_POSTFIXIFY_BODY
|
||||
dest->items[pos].vp = (dest->items[pos].sym = what->sym)->def;
|
||||
dest->items[pos].vp = (dest->items[pos].sym = what->sym)->val;
|
||||
FID_SAME_BODY
|
||||
if (strcmp(f1->sym->name, f2->sym->name) || (f1->sym->class != f2->sym->class)) return 0;
|
||||
FID_DUMP_BODY
|
||||
|
@@ -233,7 +233,7 @@
|
||||
/* IP->Quad implicit conversion */
|
||||
if ((sym->class == (SYM_VARIABLE | T_QUAD)) && val_is_ip4(&v1))
|
||||
{
|
||||
*((struct f_val *) sym->def) = (struct f_val) {
|
||||
*(sym->val) = (struct f_val) {
|
||||
.type = T_QUAD,
|
||||
.val.i = ipa_to_u32(v1.val.ip),
|
||||
};
|
||||
@@ -241,7 +241,7 @@
|
||||
}
|
||||
runtime( "Assigning to variable of incompatible type" );
|
||||
}
|
||||
*((struct f_val *) sym->def) = v1;
|
||||
*(sym->val) = v1;
|
||||
}
|
||||
|
||||
/* some constants have value in a[1], some in *a[0].p, strange. */
|
||||
@@ -709,7 +709,7 @@
|
||||
|
||||
/* Postfixify extracts the function body from the symbol */
|
||||
FID_POSTFIXIFY_BODY
|
||||
dest->items[pos].lines[0] = what->sym->def;
|
||||
dest->items[pos].lines[0] = what->sym->function;
|
||||
FID_END
|
||||
|
||||
/* First push the body on stack */
|
||||
@@ -727,8 +727,8 @@
|
||||
for (const struct f_inst *inst = f1; inst; inst = inst->next)
|
||||
count++;
|
||||
|
||||
if (count != sym->aux2)
|
||||
cf_error("Function %s takes %u arguments, got %u.", sym->name, sym->aux2, count);
|
||||
if (count != sym->function->args)
|
||||
cf_error("Function %s takes %u arguments, got %u.", sym->name, sym->function->args, count);
|
||||
FID_END
|
||||
|
||||
/* FIXME: Optimization of function comparison. */
|
||||
|
@@ -59,6 +59,7 @@ struct f_line_item {
|
||||
/* Line of instructions to be unconditionally executed one after another */
|
||||
struct f_line {
|
||||
uint len; /* Line length */
|
||||
u16 args; /* Function: Args required */
|
||||
struct f_line_item items[0]; /* The items themselves */
|
||||
};
|
||||
|
||||
@@ -81,8 +82,8 @@ extern void (*bt_assert_hook)(int result, const struct f_line_item *assert);
|
||||
/* Bird Tests */
|
||||
struct f_bt_test_suite {
|
||||
node n; /* Node in config->tests */
|
||||
struct f_line *fn; /* Root of function */
|
||||
struct f_line *cmp; /* Compare to this function */
|
||||
const struct f_line *fn; /* Root of function */
|
||||
const struct f_line *cmp; /* Compare to this function */
|
||||
const char *fn_name; /* Name of test */
|
||||
const char *dsc; /* Description */
|
||||
int result; /* Desired result */
|
||||
|
@@ -17,8 +17,8 @@
|
||||
|
||||
#define P(a,b) ((a<<8) | b)
|
||||
|
||||
char *
|
||||
filter_name(struct filter *filter)
|
||||
const char *
|
||||
filter_name(const struct filter *filter)
|
||||
{
|
||||
if (!filter)
|
||||
return "ACCEPT";
|
||||
|
@@ -359,15 +359,14 @@ f_eval_buf(const struct f_line *expr, struct linpool *tmp_pool, buffer *buf)
|
||||
/**
|
||||
* filter_same - compare two filters
|
||||
* @new: first filter to be compared
|
||||
* @old: second filter to be compared, notice that this filter is
|
||||
* damaged while comparing.
|
||||
* @old: second filter to be compared
|
||||
*
|
||||
* Returns 1 in case filters are same, otherwise 0. If there are
|
||||
* underlying bugs, it will rather say 0 on same filters than say
|
||||
* 1 on different.
|
||||
*/
|
||||
int
|
||||
filter_same(struct filter *new, struct filter *old)
|
||||
filter_same(const struct filter *new, const struct filter *old)
|
||||
{
|
||||
if (old == new) /* Handle FILTER_ACCEPT and FILTER_REJECT */
|
||||
return 1;
|
||||
|
@@ -48,7 +48,7 @@ struct f_val;
|
||||
struct f_line;
|
||||
struct filter {
|
||||
char *name;
|
||||
struct f_line *root;
|
||||
const struct f_line *root;
|
||||
};
|
||||
|
||||
struct rte;
|
||||
@@ -58,8 +58,8 @@ enum filter_return f_eval_rte(const struct f_line *expr, struct rte **rte, struc
|
||||
uint f_eval_int(const struct f_line *expr);
|
||||
enum filter_return f_eval_buf(const struct f_line *expr, struct linpool *tmp_pool, buffer *buf);
|
||||
|
||||
char *filter_name(struct filter *filter);
|
||||
int filter_same(struct filter *new, struct filter *old);
|
||||
const char *filter_name(const struct filter *filter);
|
||||
int filter_same(const struct filter *new, const struct filter *old);
|
||||
int f_same(const struct f_line *f1, const struct f_line *f2);
|
||||
|
||||
#define FILTER_ACCEPT NULL
|
||||
|
Reference in New Issue
Block a user