diff --git a/filter/config.Y b/filter/config.Y index ca792593..8cecf936 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -27,6 +27,9 @@ static inline u32 pair_b(u32 p) { return p & 0xFFFF; } cf_error("Can't empty %s: not an attribute", sym->name); \ f_generate_complex(fi_code, sym->attribute, arg); \ }) + +#define f_generate_complex_default(fi_code, da, arg, def) \ + f_new_inst(FI_EA_SET, f_new_inst(fi_code, f_new_inst(FI_DEFAULT, f_new_inst(FI_EA_GET, da), f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = def })), arg), da) /* @@ -902,10 +905,10 @@ cmd: } | attr_bit '=' term ';' { $$ = f_new_inst(FI_CONDITION, $3, - f_generate_complex(FI_BITOR, $1.class, - f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = (1U << $1.bit)})), - f_generate_complex(FI_BITAND, $1.class, - f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = ~(1U << $1.bit)})) + f_generate_complex_default(FI_BITOR, $1.class, + f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = (1U << $1.bit)}), 0), + f_generate_complex_default(FI_BITAND, $1.class, + f_new_inst(FI_CONSTANT, (struct f_val) { .type = T_INT, .val.i = ~(1U << $1.bit)}), 0) ); } | break_command print_list ';' { diff --git a/filter/f-inst.c b/filter/f-inst.c index 9ff5f79a..e7b642ab 100644 --- a/filter/f-inst.c +++ b/filter/f-inst.c @@ -768,6 +768,18 @@ ea_unset_attr(fs->eattrs, 1, da); } + INST(FI_DEFAULT, 2, 1) { + ARG_ANY(1); + ARG_ANY(2); + + log(L_INFO "Type of arg 1 is: %d", v1.type); + + if (v1.type == T_VOID) + RESULT_VAL(v2); + else + RESULT_VAL(v1); + } + INST(FI_LENGTH, 1, 1) { /* Get length of */ ARG_ANY(1); switch(v1.type) { diff --git a/nest/rt-attr.c b/nest/rt-attr.c index ed3aaf01..cec1d7cf 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -836,7 +836,7 @@ ea_normalize(ea_list *e, int overlay) ea_merge(e, t, overlay); ea_sort(t); - return t->count ? t : NULL; + return t->count ? t : t->next; } /** @@ -1075,11 +1075,6 @@ ea_show(struct cli *c, const eattr *e) struct ea_class *cls = ea_class_global[e->id]; ASSERT_DIE(cls); - pos += bsprintf(pos, "%s", cls->name); - - *pos++ = ':'; - *pos++ = ' '; - if (e->undef) return; else if (cls->format) @@ -1115,7 +1110,7 @@ ea_show(struct cli *c, const eattr *e) bsprintf(pos, "", e->type); } - cli_printf(c, -1012, "\t%s", buf); + cli_printf(c, -1012, "\t%s: %s", cls->name, buf); } static void