diff options
author | Roman Zippel <zippel@linux-m68k.org> | 2003-06-02 03:24:48 -0700 |
---|---|---|
committer | Ben Collins <bcollins@debian.org> | 2003-06-02 03:24:48 -0700 |
commit | 386ebbf28c019d16a08090df495de797ed4a499a (patch) | |
tree | 84d7cb18943bab87b988d94dd37b42311e0f802b /scripts | |
parent | d4f8a4530eb07a1385fd17b0e62a7dce97486f49 (diff) | |
download | history-386ebbf28c019d16a08090df495de797ed4a499a.tar.gz |
[PATCH] expression support
"default" accepts now not only a single symbol but also an expression
which can be assigned to boolean and tristate symbols.
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/kconfig/confdata.c | 10 | ||||
-rw-r--r-- | scripts/kconfig/expr.h | 1 | ||||
-rw-r--r-- | scripts/kconfig/lkc.h | 9 | ||||
-rw-r--r-- | scripts/kconfig/menu.c | 47 | ||||
-rw-r--r-- | scripts/kconfig/symbol.c | 197 | ||||
-rw-r--r-- | scripts/kconfig/zconf.tab.c_shipped | 72 | ||||
-rw-r--r-- | scripts/kconfig/zconf.y | 18 |
7 files changed, 198 insertions, 156 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index c18ab2c384eb4..4d83a5533dd27 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -198,21 +198,21 @@ int conf_read(const char *name) ; } if (sym_is_choice_value(sym)) { - prop = sym_get_choice_prop(sym); + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); switch (sym->user.tri) { case mod: - if (prop->def->user.tri == yes) + if (cs->user.tri == yes) /* warn? */; break; case yes: - if (prop->def->user.tri != no) + if (cs->user.tri != no) /* warn? */; - prop->def->user.val = sym; + cs->user.val = sym; break; case no: break; } - prop->def->user.tri = sym->user.tri; + cs->user.tri = sym->user.tri; } break; case '\n': diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index 3ebdf602cc39d..47d65ea2562a5 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -105,7 +105,6 @@ struct property { struct symbol *sym; enum prop_type type; const char *text; - struct symbol *def; struct expr_value visible; struct expr *expr; struct menu *menu; diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index e3e6fef9c8e22..dd040f7a86276 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -49,9 +49,11 @@ void menu_add_menu(void); void menu_end_menu(void); void menu_add_entry(struct symbol *sym); void menu_end_entry(void); -struct property *create_prop(enum prop_type type); void menu_add_dep(struct expr *dep); -struct property *menu_add_prop(enum prop_type type, char *prompt, struct symbol *def, struct expr *dep); +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep); +void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); void menu_finalize(struct menu *parent); void menu_set_type(int type); struct file *file_lookup(const char *name); @@ -64,6 +66,9 @@ extern struct menu *current_menu; void sym_init(void); void sym_clear_all_valid(void); void sym_set_changed(struct symbol *sym); +struct symbol *sym_check_deps(struct symbol *sym); +struct property *prop_alloc(enum prop_type type, struct symbol *sym); +struct symbol *prop_get_symbol(struct property *prop); static inline tristate sym_get_tristate_value(struct symbol *sym) { diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 0a4e0eb6580c3..a1e14d7510d57 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -99,38 +99,20 @@ void menu_set_type(int type) sym->name ? sym->name : "<choice>", sym_type_name(sym->type), sym_type_name(type)); } -struct property *create_prop(enum prop_type type) +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep) { - struct property *prop; - - prop = malloc(sizeof(*prop)); - memset(prop, 0, sizeof(*prop)); - prop->type = type; - prop->file = current_file; - prop->lineno = zconf_lineno(); - - return prop; -} + struct property *prop = prop_alloc(type, current_entry->sym); -struct property *menu_add_prop(enum prop_type type, char *prompt, struct symbol *def, struct expr *dep) -{ - struct property *prop = create_prop(type); - struct property **propp; - - prop->sym = current_entry->sym; prop->menu = current_entry; prop->text = prompt; - prop->def = def; + prop->expr = expr; prop->visible.expr = menu_check_dep(dep); - if (prompt) + if (prompt) { + if (current_entry->prompt) + fprintf(stderr, "%s:%d: prompt redefined\n", + current_entry->file->name, current_entry->lineno); current_entry->prompt = prop; - - /* append property to the prop list of symbol */ - if (prop->sym) { - for (propp = &prop->sym->prop; *propp; propp = &(*propp)->next) - ; - *propp = prop; } return prop; @@ -138,12 +120,17 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct symbol void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep) { - current_entry->prompt = menu_add_prop(type, prompt, NULL, dep); + menu_add_prop(type, prompt, NULL, dep); +} + +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep) +{ + menu_add_prop(type, NULL, expr, dep); } -void menu_add_default(enum prop_type type, struct symbol *def, struct expr *dep) +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) { - current_entry->prompt = menu_add_prop(type, NULL, def, dep); + menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); } void menu_finalize(struct menu *parent) @@ -231,8 +218,8 @@ void menu_finalize(struct menu *parent) menu->sym->flags |= SYMBOL_CHOICEVAL; current_entry = menu; menu_set_type(sym->type); - menu_add_prop(P_CHOICE, NULL, parent->sym, NULL); - prop = sym_get_choice_prop(parent->sym); + menu_add_symbol(P_CHOICE, sym, NULL); + prop = sym_get_choice_prop(sym); prop->expr = expr_alloc_one(E_CHOICE, prop->expr); prop->expr->right.sym = menu->sym; } diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index b10c7c4550881..0aa5d29679278 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -34,18 +34,9 @@ struct symbol *modules_sym; void sym_add_default(struct symbol *sym, const char *def) { - struct property *prop = create_prop(P_DEFAULT); - struct property **propp; - - prop->sym = sym; - prop->def = sym_lookup(def, 1); + struct property *prop = prop_alloc(P_DEFAULT, sym); - /* append property to the prop list of symbol */ - if (prop->sym) { - for (propp = &prop->sym->prop; *propp; propp = &(*propp)->next) - ; - *propp = prop; - } + prop->expr = expr_alloc_symbol(sym_lookup(def, 1)); } void sym_init(void) @@ -139,7 +130,7 @@ struct property *sym_get_default_prop(struct symbol *sym) return NULL; } -void sym_calc_visibility(struct symbol *sym) +static void sym_calc_visibility(struct symbol *sym) { struct property *prop; tristate visible, oldvisible; @@ -157,11 +148,46 @@ void sym_calc_visibility(struct symbol *sym) } } +static struct symbol *sym_calc_choice(struct symbol *sym) +{ + struct symbol *def_sym; + struct property *prop; + struct expr *e; + + /* is the user choice visible? */ + def_sym = sym->user.val; + if (def_sym) { + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* any of the defaults visible? */ + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri == no) + continue; + def_sym = prop_get_symbol(prop); + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* just get the first visible value */ + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + def_sym = e->right.sym; + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + return NULL; +} + void sym_calc_value(struct symbol *sym) { struct symbol_value newval, oldval; - struct property *prop, *def_prop; - struct symbol *def_sym; + struct property *prop; struct expr *e; if (!sym) @@ -196,36 +222,56 @@ void sym_calc_value(struct symbol *sym) /* set default if recursively called */ sym->curr = newval; - if (sym->visible != no) { - sym->flags |= SYMBOL_WRITE; - if (!sym_has_value(sym)) { - if (!sym_is_choice(sym)) { - prop = sym_get_default_prop(sym); - if (prop) { - sym_calc_value(prop->def); - newval = prop->def->curr; - } - } else - newval.tri = sym->user.tri; - } else - newval = sym->user; - - newval.tri = E_AND(newval.tri, sym->visible); - /* if the symbol is visible and not optionial, - * possibly ignore old user choice. */ - if (!sym_is_optional(sym) && newval.tri == no) - newval.tri = sym->visible; + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: if (sym_is_choice_value(sym) && sym->visible == yes) { prop = sym_get_choice_prop(sym); - newval.tri = (prop->def->curr.val == sym) ? yes : no; + newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; + } else if (sym->visible != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) + newval.tri = sym->user.tri; + else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) + newval.tri = expr_calc_value(prop->expr); + } + newval.tri = E_AND(newval.tri, sym->visible); + /* if the symbol is visible and not optionial, + * possibly ignore old user choice. */ + if (!sym_is_optional(sym) && newval.tri == no) + newval.tri = sym->visible; + } else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) { + sym->flags |= SYMBOL_WRITE; + newval.tri = expr_calc_value(prop->expr); + } + } + break; + case S_STRING: + case S_HEX: + case S_INT: + if (sym->visible != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) { + newval.val = sym->user.val; + break; + } } - } else { prop = sym_get_default_prop(sym); if (prop) { - sym->flags |= SYMBOL_WRITE; - sym_calc_value(prop->def); - newval = prop->def->curr; + struct symbol *ds = prop_get_symbol(prop); + if (ds) { + sym->flags |= SYMBOL_WRITE; + sym_calc_value(ds); + newval.val = ds->curr.val; + } } + break; + default: + ; } switch (sym_get_type(sym)) { @@ -246,44 +292,11 @@ void sym_calc_value(struct symbol *sym) out: sym->curr = newval; + if (sym_is_choice(sym) && newval.tri == yes) + sym->curr.val = sym_calc_choice(sym); - if (sym_is_choice(sym) && newval.tri == yes) { - def_sym = sym->user.val; - if (def_sym) { - sym_calc_visibility(def_sym); - if (def_sym->visible == no) - def_sym = NULL; - } - if (!def_sym) { - for_all_defaults(sym, def_prop) { - def_prop->visible.tri = expr_calc_value(def_prop->visible.expr); - if (def_prop->visible.tri == no) - continue; - sym_calc_visibility(def_prop->def); - if (def_prop->def->visible != no) { - def_sym = def_prop->def; - break; - } - } - } - - if (!def_sym) { - prop = sym_get_choice_prop(sym); - for (e = prop->expr; e; e = e->left.expr) { - sym_calc_visibility(e->right.sym); - if (e->right.sym->visible != no) { - def_sym = e->right.sym; - break; - } - } - } - - newval.val = def_sym; - } - - if (memcmp(&oldval, &newval, sizeof(newval))) + if (memcmp(&oldval, &sym->curr, sizeof(oldval))) sym_set_changed(sym); - sym->curr = newval; if (sym_is_choice(sym)) { int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); @@ -363,10 +376,10 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val) sym_set_changed(sym); } if (sym_is_choice_value(sym) && val == yes) { - struct property *prop = sym_get_choice_prop(sym); + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); - prop->def->user.val = sym; - prop->def->flags &= ~SYMBOL_NEW; + cs->user.val = sym; + cs->flags &= ~SYMBOL_NEW; } sym->user.tri = val; @@ -607,6 +620,36 @@ struct symbol *sym_find(const char *name) return symbol; } +struct property *prop_alloc(enum prop_type type, struct symbol *sym) +{ + struct property *prop; + struct property **propp; + + prop = malloc(sizeof(*prop)); + memset(prop, 0, sizeof(*prop)); + prop->type = type; + prop->sym = sym; + prop->file = current_file; + prop->lineno = zconf_lineno(); + + /* append property to the prop list of symbol */ + if (sym) { + for (propp = &sym->prop; *propp; propp = &(*propp)->next) + ; + *propp = prop; + } + + return prop; +} + +struct symbol *prop_get_symbol(struct property *prop) +{ + if (prop->expr && (prop->expr->type == E_SYMBOL || + prop->expr->type == E_CHOICE)) + return prop->expr->left.sym; + return NULL; +} + const char *prop_get_type_name(enum prop_type type) { switch (type) { diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped index 3665e83cfe69c..f5cdb44e1e12a 100644 --- a/scripts/kconfig/zconf.tab.c_shipped +++ b/scripts/kconfig/zconf.tab.c_shipped @@ -400,7 +400,7 @@ static const yysigned_char yyrhs[] = 81, 80, 32, -1, 23, 76, 32, -1, 24, 81, 80, 32, -1, 26, 76, 32, -1, 27, 76, 32, -1, 25, 76, 32, -1, 19, 77, 80, 32, -1, - 20, 82, 80, 32, -1, 36, 28, 80, 32, -1, + 20, 81, 80, 32, -1, 36, 28, 80, 32, -1, 37, 82, 82, 80, 32, -1, 7, 32, -1, 52, 56, -1, 78, -1, 53, 58, 54, -1, 53, 58, -1, -1, 56, 57, -1, 56, 75, -1, 56, 73, @@ -429,15 +429,15 @@ static const unsigned short yyrline[] = { 0, 94, 94, 95, 98, 99, 100, 101, 102, 103, 104, 105, 109, 110, 111, 112, 113, 114, 120, 128, - 134, 142, 152, 154, 155, 156, 157, 160, 166, 171, - 177, 182, 188, 194, 200, 206, 212, 217, 224, 233, - 239, 248, 249, 255, 257, 258, 259, 260, 263, 269, - 275, 281, 287, 293, 295, 300, 309, 318, 319, 325, - 327, 328, 329, 334, 341, 347, 356, 357, 363, 365, - 366, 367, 368, 371, 377, 384, 391, 398, 404, 411, - 412, 413, 416, 421, 426, 434, 436, 441, 442, 445, - 446, 447, 451, 451, 453, 454, 457, 458, 459, 460, - 461, 462, 463, 466, 467 + 134, 142, 152, 154, 155, 156, 157, 160, 166, 173, + 179, 186, 192, 198, 204, 210, 216, 222, 230, 239, + 245, 254, 255, 261, 263, 264, 265, 266, 269, 275, + 281, 287, 293, 299, 301, 306, 315, 324, 325, 331, + 333, 334, 335, 340, 347, 353, 362, 363, 369, 371, + 372, 373, 374, 377, 383, 390, 397, 404, 410, 417, + 418, 419, 422, 427, 432, 440, 442, 447, 448, 451, + 452, 453, 457, 457, 459, 460, 463, 464, 465, 466, + 467, 468, 469, 472, 473 }; #endif @@ -551,20 +551,20 @@ static const short yydefgoto[] = #define YYPACT_NINF -99 static const short yypact[] = { - -99, 48, -99, -12, 46, 46, -99, 46, -29, -99, + -99, 48, -99, 38, 46, 46, -99, 46, -29, -99, 46, -17, -3, -11, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, - -99, -99, -99, -99, -99, -99, -99, -99, -99, -12, + -99, -99, -99, -99, -99, -99, -99, -99, -99, 38, 12, 15, -99, 18, 51, 62, -99, -99, -11, -11, 4, -24, 138, 138, 160, 121, 110, -4, 81, -4, - -99, -99, -99, -99, -99, -99, 31, -99, -99, -11, - -11, 70, 70, 73, 32, -11, 46, 70, 46, -11, - 46, -11, 46, 46, 46, -99, 80, 70, -99, 16, + -99, -99, -99, -99, -99, -99, -19, -99, -99, -11, + -11, 70, 70, 73, 32, -11, 46, -11, 46, -11, + 46, -11, 46, 46, 46, -99, 36, 70, -99, 95, -99, -99, 96, 46, 106, 46, 46, -99, -99, -99, - -99, -12, -12, -12, -99, -99, -99, -99, -99, -99, + -99, 38, 38, 38, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, 112, -99, -99, -99, -99, -99, -99, 117, -99, -99, -99, -99, -11, 33, 65, 131, - 131, 119, 131, 1, 136, 1, 153, 154, 155, 131, + 1, 119, 131, 1, 136, 1, 153, 154, 155, 131, 70, -99, -99, 131, 131, 156, 157, -99, -99, -99, -99, 101, -99, -99, -11, 158, 159, -99, -99, 161, -99, 162, -99, -99, -99, 163, 131, 164, 165, -99, @@ -590,16 +590,16 @@ static const short yypgoto[] = static const short yytable[] = { 66, 67, 36, 42, 39, 40, 71, 41, 123, 124, - 43, 44, 74, 75, 130, 154, 72, 46, 47, 15, - 16, 121, 122, 48, 140, 45, 127, 128, 112, 141, + 43, 44, 74, 75, 120, 154, 72, 46, 47, 69, + 70, 121, 122, 48, 140, 45, 127, 128, 112, 130, 49, 133, 156, 135, 158, 159, 68, 161, 60, 69, 70, 165, 69, 70, 61, 167, 168, 62, 2, 3, 63, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 46, 47, 13, 14, 120, 152, 48, 126, 178, 69, - 70, 69, 70, 49, 37, 38, 129, 166, 151, 15, + 46, 47, 13, 14, 139, 152, 48, 126, 178, 15, + 16, 69, 70, 49, 37, 38, 129, 166, 151, 15, 16, -67, 114, 64, -67, 5, 101, 7, 8, 102, 10, 11, 12, 143, 65, 13, 103, 153, 46, 47, - 147, 148, 149, 69, 70, 125, 172, 134, 139, 136, + 147, 148, 149, 69, 70, 125, 172, 134, 141, 136, 137, 138, 15, 16, 5, 101, 7, 8, 102, 10, 11, 12, 145, 146, 13, 103, 101, 7, 142, 102, 10, 11, 12, 171, 144, 13, 103, 69, 70, 69, @@ -615,16 +615,16 @@ static const short yytable[] = static const unsigned char yycheck[] = { 48, 49, 3, 32, 4, 5, 30, 7, 71, 72, - 10, 28, 16, 17, 77, 14, 40, 28, 29, 31, - 32, 69, 70, 34, 87, 28, 74, 75, 32, 13, + 10, 28, 16, 17, 33, 14, 40, 28, 29, 38, + 39, 69, 70, 34, 87, 28, 74, 75, 32, 77, 41, 79, 130, 81, 132, 133, 32, 135, 39, 38, 39, 139, 38, 39, 32, 143, 144, 32, 0, 1, 32, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 28, 29, 14, 15, 33, 32, 34, 35, 166, 38, - 39, 38, 39, 41, 28, 29, 76, 140, 126, 31, + 28, 29, 14, 15, 28, 32, 34, 35, 166, 31, + 32, 38, 39, 41, 28, 29, 76, 140, 126, 31, 32, 0, 1, 32, 3, 4, 5, 6, 7, 8, 9, 10, 11, 93, 32, 14, 15, 32, 28, 29, - 101, 102, 103, 38, 39, 32, 154, 80, 28, 82, + 101, 102, 103, 38, 39, 32, 154, 80, 13, 82, 83, 84, 31, 32, 4, 5, 6, 7, 8, 9, 10, 11, 95, 96, 14, 15, 5, 6, 32, 8, 9, 10, 11, 32, 28, 14, 15, 38, 39, 38, @@ -654,7 +654,7 @@ static const unsigned char yystos[] = 75, 5, 8, 15, 45, 54, 78, 45, 55, 60, 66, 78, 32, 75, 1, 45, 55, 65, 66, 78, 33, 81, 81, 82, 82, 32, 35, 81, 81, 77, - 82, 76, 77, 81, 76, 81, 76, 76, 76, 28, + 81, 76, 77, 81, 76, 81, 76, 76, 76, 28, 82, 13, 32, 77, 28, 76, 76, 79, 79, 79, 32, 81, 32, 32, 14, 80, 80, 32, 80, 80, 32, 80, 32, 32, 32, 80, 82, 80, 80, 32, @@ -1340,6 +1340,8 @@ yyreduce: case 28: { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + menu_set_type(S_TRISTATE); printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); ;} break; @@ -1355,6 +1357,8 @@ yyreduce: case 30: { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + menu_set_type(S_BOOLEAN); printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); ;} break; @@ -1386,7 +1390,7 @@ yyreduce: case 34: { - menu_add_prop(P_PROMPT, yyvsp[-2].string, NULL, yyvsp[-1].expr); + menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); ;} break; @@ -1394,7 +1398,7 @@ yyreduce: case 35: { - menu_add_prop(P_DEFAULT, NULL, yyvsp[-2].symbol, yyvsp[-1].expr); + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); ;} break; @@ -1419,7 +1423,7 @@ yyreduce: struct symbol *sym = sym_lookup(NULL, 0); sym->flags |= SYMBOL_CHOICE; menu_add_entry(sym); - menu_add_prop(P_CHOICE, NULL, NULL, NULL); + menu_add_expr(P_CHOICE, NULL, NULL); printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); ;} break; @@ -1453,7 +1457,7 @@ yyreduce: case 48: { - menu_add_prop(P_PROMPT, yyvsp[-2].string, NULL, yyvsp[-1].expr); + menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); ;} break; @@ -1485,7 +1489,7 @@ yyreduce: case 52: { - menu_add_prop(P_DEFAULT, NULL, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); + menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); ;} break; @@ -2031,7 +2035,7 @@ void print_symbol(FILE *out, struct menu *menu) break; case P_DEFAULT: fputs( " default ", out); - print_quoted_string(out, prop->def->name); + expr_fprint(prop->expr, out); if (!expr_is_yes(prop->visible.expr)) { fputs(" if ", out); expr_fprint(prop->visible.expr, out); diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index 5cc2c472d3086..342dd688ebd45 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -165,6 +165,8 @@ config_option: T_TRISTATE prompt_stmt_opt T_EOL config_option: T_DEF_TRISTATE expr if_expr T_EOL { + menu_add_expr(P_DEFAULT, $2, $3); + menu_set_type(S_TRISTATE); printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); }; @@ -176,6 +178,8 @@ config_option: T_BOOLEAN prompt_stmt_opt T_EOL config_option: T_DEF_BOOLEAN expr if_expr T_EOL { + menu_add_expr(P_DEFAULT, $2, $3); + menu_set_type(S_BOOLEAN); printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); }; @@ -199,13 +203,13 @@ config_option: T_STRING prompt_stmt_opt T_EOL config_option: T_PROMPT prompt if_expr T_EOL { - menu_add_prop(P_PROMPT, $2, NULL, $3); + menu_add_prompt(P_PROMPT, $2, $3); printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); }; -config_option: T_DEFAULT symbol if_expr T_EOL +config_option: T_DEFAULT expr if_expr T_EOL { - menu_add_prop(P_DEFAULT, NULL, $2, $3); + menu_add_expr(P_DEFAULT, $2, $3); printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); }; @@ -226,7 +230,7 @@ choice: T_CHOICE T_EOL struct symbol *sym = sym_lookup(NULL, 0); sym->flags |= SYMBOL_CHOICE; menu_add_entry(sym); - menu_add_prop(P_CHOICE, NULL, NULL, NULL); + menu_add_expr(P_CHOICE, NULL, NULL); printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); }; @@ -262,7 +266,7 @@ choice_option_list: choice_option: T_PROMPT prompt if_expr T_EOL { - menu_add_prop(P_PROMPT, $2, NULL, $3); + menu_add_prompt(P_PROMPT, $2, $3); printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); }; @@ -286,7 +290,7 @@ choice_option: T_OPTIONAL T_EOL choice_option: T_DEFAULT T_WORD if_expr T_EOL { - menu_add_prop(P_DEFAULT, NULL, sym_lookup($2, 0), $3); + menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3); printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); }; @@ -593,7 +597,7 @@ void print_symbol(FILE *out, struct menu *menu) break; case P_DEFAULT: fputs( " default ", out); - print_quoted_string(out, prop->def->name); + expr_fprint(prop->expr, out); if (!expr_is_yes(prop->visible.expr)) { fputs(" if ", out); expr_fprint(prop->visible.expr, out); |