kconfig: add named choice group

As choice dependency are now fully checked, it's quite easy to add support
for named choices. This lifts the restriction that a choice value can only
appear once, although it still has to be within the same group,
but multiple choices can be joined by giving them a name.
While at it I cleaned up a little the choice type logic to simplify it a
bit.

Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
Roman Zippel 2008-02-29 05:11:50 +01:00 committed by Sam Ravnborg
parent 4898117886
commit 5a1aa8a1af
6 changed files with 206 additions and 223 deletions

View File

@ -5,25 +5,6 @@
/* A lexical scanner generated by flex */ /* A lexical scanner generated by flex */
#define yy_create_buffer zconf_create_buffer
#define yy_delete_buffer zconf_delete_buffer
#define yy_flex_debug zconf_flex_debug
#define yy_init_buffer zconf_init_buffer
#define yy_flush_buffer zconf_flush_buffer
#define yy_load_buffer_state zconf_load_buffer_state
#define yy_switch_to_buffer zconf_switch_to_buffer
#define yyin zconfin
#define yyleng zconfleng
#define yylex zconflex
#define yylineno zconflineno
#define yyout zconfout
#define yyrestart zconfrestart
#define yytext zconftext
#define yywrap zconfwrap
#define yyalloc zconfalloc
#define yyrealloc zconfrealloc
#define yyfree zconffree
#define FLEX_SCANNER #define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_MINOR_VERSION 5
@ -354,7 +335,7 @@ void zconffree (void * );
/* Begin user sect3 */ /* Begin user sect3 */
#define zconfwrap(n) 1 #define zconfwrap() 1
#define YY_SKIP_YYWRAP #define YY_SKIP_YYWRAP
typedef unsigned char YY_CHAR; typedef unsigned char YY_CHAR;
@ -1535,7 +1516,7 @@ static int yy_get_next_buffer (void)
/* Read in more data. */ /* Read in more data. */
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
(yy_n_chars), num_to_read ); (yy_n_chars), (size_t) num_to_read );
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
} }
@ -2007,7 +1988,7 @@ YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size )
/** Setup the input buffer state to scan a string. The next call to zconflex() will /** Setup the input buffer state to scan a string. The next call to zconflex() will
* scan from a @e copy of @a str. * scan from a @e copy of @a str.
* @param str a NUL-terminated string to scan * @param yystr a NUL-terminated string to scan
* *
* @return the newly allocated buffer state object. * @return the newly allocated buffer state object.
* @note If you want to scan bytes that may contain NUL values, then use * @note If you want to scan bytes that may contain NUL values, then use

View File

@ -21,7 +21,7 @@ P(menu_get_help,const char *,(struct menu *menu));
/* symbol.c */ /* symbol.c */
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
P(sym_lookup,struct symbol *,(const char *name, int isconst)); P(sym_lookup,struct symbol *,(const char *name, int flags));
P(sym_find,struct symbol *,(const char *name)); P(sym_find,struct symbol *,(const char *name));
P(sym_re_search,struct symbol **,(const char *pattern)); P(sym_re_search,struct symbol **,(const char *pattern));
P(sym_type_name,const char *,(enum symbol_type type)); P(sym_type_name,const char *,(enum symbol_type type));

View File

@ -235,18 +235,22 @@ void menu_finalize(struct menu *parent)
sym = parent->sym; sym = parent->sym;
if (parent->list) { if (parent->list) {
if (sym && sym_is_choice(sym)) { if (sym && sym_is_choice(sym)) {
/* find the first choice value and find out choice type */ if (sym->type == S_UNKNOWN) {
for (menu = parent->list; menu; menu = menu->next) { /* find the first choice value to find out choice type */
if (menu->sym) { current_entry = parent;
current_entry = parent; for (menu = parent->list; menu; menu = menu->next) {
if (sym->type == S_UNKNOWN) if (menu->sym && menu->sym->type != S_UNKNOWN) {
menu_set_type(menu->sym->type); menu_set_type(menu->sym->type);
current_entry = menu; break;
if (menu->sym->type == S_UNKNOWN) }
menu_set_type(sym->type);
break;
} }
} }
/* set the type of the remaining choice values */
for (menu = parent->list; menu; menu = menu->next) {
current_entry = menu;
if (menu->sym && menu->sym->type == S_UNKNOWN)
menu_set_type(sym->type);
}
parentdep = expr_alloc_symbol(sym); parentdep = expr_alloc_symbol(sym);
} else if (parent->prompt) } else if (parent->prompt)
parentdep = parent->prompt->visible.expr; parentdep = parent->prompt->visible.expr;
@ -313,50 +317,36 @@ void menu_finalize(struct menu *parent)
} }
} }
for (menu = parent->list; menu; menu = menu->next) { for (menu = parent->list; menu; menu = menu->next) {
if (sym && sym_is_choice(sym) && menu->sym) { if (sym && sym_is_choice(sym) &&
menu->sym && !sym_is_choice_value(menu->sym)) {
current_entry = menu;
menu->sym->flags |= SYMBOL_CHOICEVAL; menu->sym->flags |= SYMBOL_CHOICEVAL;
if (!menu->prompt) if (!menu->prompt)
menu_warn(menu, "choice value must have a prompt"); menu_warn(menu, "choice value must have a prompt");
for (prop = menu->sym->prop; prop; prop = prop->next) { for (prop = menu->sym->prop; prop; prop = prop->next) {
if (prop->type == P_PROMPT && prop->menu != menu) {
prop_warn(prop, "choice values "
"currently only support a "
"single prompt");
}
if (prop->type == P_DEFAULT) if (prop->type == P_DEFAULT)
prop_warn(prop, "defaults for choice " prop_warn(prop, "defaults for choice "
"values not supported"); "values not supported");
if (prop->menu == menu)
continue;
if (prop->type == P_PROMPT &&
prop->menu->parent->sym != sym)
prop_warn(prop, "choice value used outside its choice group");
} }
current_entry = menu;
if (menu->sym->type == S_UNKNOWN)
menu_set_type(sym->type);
/* Non-tristate choice values of tristate choices must /* Non-tristate choice values of tristate choices must
* depend on the choice being set to Y. The choice * depend on the choice being set to Y. The choice
* values' dependencies were propagated to their * values' dependencies were propagated to their
* properties above, so the change here must be re- * properties above, so the change here must be re-
* propagated. */ * propagated.
*/
if (sym->type == S_TRISTATE && menu->sym->type != S_TRISTATE) { if (sym->type == S_TRISTATE && menu->sym->type != S_TRISTATE) {
basedep = expr_alloc_comp(E_EQUAL, sym, &symbol_yes); basedep = expr_alloc_comp(E_EQUAL, sym, &symbol_yes);
basedep = expr_alloc_and(basedep, menu->dep); menu->dep = expr_alloc_and(basedep, menu->dep);
basedep = expr_eliminate_dups(basedep);
menu->dep = basedep;
for (prop = menu->sym->prop; prop; prop = prop->next) { for (prop = menu->sym->prop; prop; prop = prop->next) {
if (prop->menu != menu) if (prop->menu != menu)
continue; continue;
dep = expr_alloc_and(expr_copy(basedep), prop->visible.expr = expr_alloc_and(expr_copy(basedep),
prop->visible.expr); prop->visible.expr);
dep = expr_eliminate_dups(dep);
dep = expr_trans_bool(dep);
prop->visible.expr = dep;
if (prop->type == P_SELECT) {
struct symbol *es = prop_get_symbol(prop);
dep2 = expr_alloc_symbol(menu->sym);
dep = expr_alloc_and(dep2,
expr_copy(dep));
dep = expr_alloc_or(es->rev_dep.expr, dep);
dep = expr_eliminate_dups(dep);
es->rev_dep.expr = dep;
}
} }
} }
menu_add_symbol(P_CHOICE, sym, NULL); menu_add_symbol(P_CHOICE, sym, NULL);

View File

@ -40,7 +40,7 @@ void sym_add_default(struct symbol *sym, const char *def)
{ {
struct property *prop = prop_alloc(P_DEFAULT, sym); struct property *prop = prop_alloc(P_DEFAULT, sym);
prop->expr = expr_alloc_symbol(sym_lookup(def, 1)); prop->expr = expr_alloc_symbol(sym_lookup(def, SYMBOL_CONST));
} }
void sym_init(void) void sym_init(void)
@ -350,9 +350,6 @@ void sym_calc_value(struct symbol *sym)
; ;
} }
if (sym->flags & SYMBOL_AUTO)
sym->flags &= ~SYMBOL_WRITE;
sym->curr = newval; sym->curr = newval;
if (sym_is_choice(sym) && newval.tri == yes) if (sym_is_choice(sym) && newval.tri == yes)
sym->curr.val = sym_calc_choice(sym); sym->curr.val = sym_calc_choice(sym);
@ -377,6 +374,9 @@ void sym_calc_value(struct symbol *sym)
sym_set_changed(choice_sym); sym_set_changed(choice_sym);
} }
} }
if (sym->flags & SYMBOL_AUTO)
sym->flags &= ~SYMBOL_WRITE;
} }
void sym_clear_all_valid(void) void sym_clear_all_valid(void)
@ -651,7 +651,7 @@ bool sym_is_changable(struct symbol *sym)
return sym->visible > sym->rev_dep.tri; return sym->visible > sym->rev_dep.tri;
} }
struct symbol *sym_lookup(const char *name, int isconst) struct symbol *sym_lookup(const char *name, int flags)
{ {
struct symbol *symbol; struct symbol *symbol;
const char *ptr; const char *ptr;
@ -671,11 +671,10 @@ struct symbol *sym_lookup(const char *name, int isconst)
hash &= 0xff; hash &= 0xff;
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
if (!strcmp(symbol->name, name)) { if (!strcmp(symbol->name, name) &&
if ((isconst && symbol->flags & SYMBOL_CONST) || (flags ? symbol->flags & flags
(!isconst && !(symbol->flags & SYMBOL_CONST))) : !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
return symbol; return symbol;
}
} }
new_name = strdup(name); new_name = strdup(name);
} else { } else {
@ -687,8 +686,7 @@ struct symbol *sym_lookup(const char *name, int isconst)
memset(symbol, 0, sizeof(*symbol)); memset(symbol, 0, sizeof(*symbol));
symbol->name = new_name; symbol->name = new_name;
symbol->type = S_UNKNOWN; symbol->type = S_UNKNOWN;
if (isconst) symbol->flags |= flags;
symbol->flags |= SYMBOL_CONST;
symbol->next = symbol_hash[hash]; symbol->next = symbol_hash[hash];
symbol_hash[hash] = symbol; symbol_hash[hash] = symbol;
@ -962,7 +960,7 @@ void prop_add_env(const char *env)
} }
prop = prop_alloc(P_ENV, sym); prop = prop_alloc(P_ENV, sym);
prop->expr = expr_alloc_symbol(sym_lookup(env, 1)); prop->expr = expr_alloc_symbol(sym_lookup(env, SYMBOL_CONST));
sym_env_list = expr_alloc_one(E_LIST, sym_env_list); sym_env_list = expr_alloc_one(E_LIST, sym_env_list);
sym_env_list->right.sym = sym; sym_env_list->right.sym = sym;

View File

@ -446,16 +446,16 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */ /* YYFINAL -- State number of the termination state. */
#define YYFINAL 3 #define YYFINAL 3
/* YYLAST -- Last index in YYTABLE. */ /* YYLAST -- Last index in YYTABLE. */
#define YYLAST 258 #define YYLAST 259
/* YYNTOKENS -- Number of terminals. */ /* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 35 #define YYNTOKENS 35
/* YYNNTS -- Number of nonterminals. */ /* YYNNTS -- Number of nonterminals. */
#define YYNNTS 45 #define YYNNTS 46
/* YYNRULES -- Number of rules. */ /* YYNRULES -- Number of rules. */
#define YYNRULES 108 #define YYNRULES 110
/* YYNRULES -- Number of states. */ /* YYNRULES -- Number of states. */
#define YYNSTATES 178 #define YYNSTATES 180
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2 #define YYUNDEFTOK 2
@ -507,13 +507,14 @@ static const yytype_uint16 yyprhs[] =
28, 33, 37, 39, 41, 43, 45, 47, 49, 51, 28, 33, 37, 39, 41, 43, 45, 47, 49, 51,
53, 55, 57, 59, 61, 63, 67, 70, 74, 77, 53, 55, 57, 59, 61, 63, 67, 70, 74, 77,
81, 84, 85, 88, 91, 94, 97, 100, 103, 107, 81, 84, 85, 88, 91, 94, 97, 100, 103, 107,
112, 117, 122, 128, 132, 133, 137, 138, 141, 144, 112, 117, 122, 128, 132, 133, 137, 138, 141, 145,
147, 149, 153, 154, 157, 160, 163, 166, 169, 174, 148, 150, 154, 155, 158, 161, 164, 167, 170, 175,
178, 181, 186, 187, 190, 194, 196, 200, 201, 204, 179, 182, 187, 188, 191, 195, 197, 201, 202, 205,
207, 210, 214, 217, 219, 223, 224, 227, 230, 233, 208, 211, 215, 218, 220, 224, 225, 228, 231, 234,
237, 241, 244, 247, 250, 251, 254, 257, 260, 265, 238, 242, 245, 248, 251, 252, 255, 258, 261, 266,
266, 269, 271, 273, 276, 279, 282, 284, 287, 288, 267, 270, 272, 274, 277, 280, 283, 285, 288, 289,
291, 293, 297, 301, 305, 308, 312, 316, 318 292, 294, 298, 302, 306, 309, 313, 317, 319, 321,
322
}; };
/* YYRHS -- A `-1'-separated list of the rules' RHS. */ /* YYRHS -- A `-1'-separated list of the rules' RHS. */
@ -533,24 +534,25 @@ static const yytype_int8 yyrhs[] =
30, -1, 20, 78, 77, 30, -1, 21, 25, 77, 30, -1, 20, 78, 77, 30, -1, 21, 25, 77,
30, -1, 22, 79, 79, 77, 30, -1, 23, 48, 30, -1, 22, 79, 79, 77, 30, -1, 23, 48,
30, -1, -1, 48, 25, 49, -1, -1, 33, 74, 30, -1, -1, 48, 25, 49, -1, -1, 33, 74,
-1, 7, 30, -1, 50, 54, -1, 75, -1, 51, -1, 7, 80, 30, -1, 50, 54, -1, 75, -1,
56, 52, -1, -1, 54, 55, -1, 54, 72, -1, 51, 56, 52, -1, -1, 54, 55, -1, 54, 72,
54, 70, -1, 54, 30, -1, 54, 40, -1, 18, -1, 54, 70, -1, 54, 30, -1, 54, 40, -1,
74, 77, 30, -1, 19, 73, 30, -1, 17, 30, 18, 74, 77, 30, -1, 19, 73, 30, -1, 17,
-1, 20, 25, 77, 30, -1, -1, 56, 39, -1, 30, -1, 20, 25, 77, 30, -1, -1, 56, 39,
14, 78, 76, -1, 75, -1, 57, 60, 58, -1, -1, 14, 78, 76, -1, 75, -1, 57, 60, 58,
-1, 60, 39, -1, 60, 64, -1, 60, 53, -1, -1, -1, 60, 39, -1, 60, 64, -1, 60, 53,
4, 74, 30, -1, 61, 71, -1, 75, -1, 62, -1, 4, 74, 30, -1, 61, 71, -1, 75, -1,
65, 63, -1, -1, 65, 39, -1, 65, 64, -1, 62, 65, 63, -1, -1, 65, 39, -1, 65, 64,
65, 53, -1, 6, 74, 30, -1, 9, 74, 30, -1, 65, 53, -1, 6, 74, 30, -1, 9, 74,
-1, 67, 71, -1, 12, 30, -1, 69, 13, -1, 30, -1, 67, 71, -1, 12, 30, -1, 69, 13,
-1, 71, 72, -1, 71, 30, -1, 71, 40, -1, -1, -1, 71, 72, -1, 71, 30, -1, 71, 40,
16, 24, 78, 30, -1, -1, 74, 77, -1, 25, -1, 16, 24, 78, 30, -1, -1, 74, 77, -1,
-1, 26, -1, 5, 30, -1, 8, 30, -1, 15, 25, -1, 26, -1, 5, 30, -1, 8, 30, -1,
30, -1, 30, -1, 76, 30, -1, -1, 14, 78, 15, 30, -1, 30, -1, 76, 30, -1, -1, 14,
-1, 79, -1, 79, 33, 79, -1, 79, 27, 79, 78, -1, 79, -1, 79, 33, 79, -1, 79, 27,
-1, 29, 78, 28, -1, 34, 78, -1, 78, 31, 79, -1, 29, 78, 28, -1, 34, 78, -1, 78,
78, -1, 78, 32, 78, -1, 25, -1, 26, -1 31, 78, -1, 78, 32, 78, -1, 25, -1, 26,
-1, -1, 25, -1
}; };
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
@ -566,7 +568,8 @@ static const yytype_uint16 yyrline[] =
339, 344, 351, 356, 364, 367, 369, 370, 371, 374, 339, 344, 351, 356, 364, 367, 369, 370, 371, 374,
382, 389, 396, 402, 409, 411, 412, 413, 416, 424, 382, 389, 396, 402, 409, 411, 412, 413, 416, 424,
426, 431, 432, 435, 436, 437, 441, 442, 445, 446, 426, 431, 432, 435, 436, 437, 441, 442, 445, 446,
449, 450, 451, 452, 453, 454, 455, 458, 459 449, 450, 451, 452, 453, 454, 455, 458, 459, 462,
463
}; };
#endif #endif
@ -590,7 +593,8 @@ static const char *const yytname[] =
"if_entry", "if_end", "if_stmt", "if_block", "menu", "menu_entry", "if_entry", "if_end", "if_stmt", "if_block", "menu", "menu_entry",
"menu_end", "menu_stmt", "menu_block", "source_stmt", "comment", "menu_end", "menu_stmt", "menu_block", "source_stmt", "comment",
"comment_stmt", "help_start", "help", "depends_list", "depends", "comment_stmt", "help_start", "help", "depends_list", "depends",
"prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol", 0 "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol",
"word_opt", 0
}; };
#endif #endif
@ -619,7 +623,8 @@ static const yytype_uint8 yyr1[] =
60, 61, 62, 63, 64, 65, 65, 65, 65, 66, 60, 61, 62, 63, 64, 65, 65, 65, 65, 66,
67, 68, 69, 70, 71, 71, 71, 71, 72, 73, 67, 68, 69, 70, 71, 71, 71, 71, 72, 73,
73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77,
78, 78, 78, 78, 78, 78, 78, 79, 79 78, 78, 78, 78, 78, 78, 78, 79, 79, 80,
80
}; };
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@ -629,13 +634,14 @@ static const yytype_uint8 yyr2[] =
4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 3, 2, 3, 2, 3, 1, 1, 1, 1, 1, 3, 2, 3, 2, 3,
2, 0, 2, 2, 2, 2, 2, 2, 3, 4, 2, 0, 2, 2, 2, 2, 2, 2, 3, 4,
4, 4, 5, 3, 0, 3, 0, 2, 2, 2, 4, 4, 5, 3, 0, 3, 0, 2, 3, 2,
1, 3, 0, 2, 2, 2, 2, 2, 4, 3, 1, 3, 0, 2, 2, 2, 2, 2, 4, 3,
2, 4, 0, 2, 3, 1, 3, 0, 2, 2, 2, 4, 0, 2, 3, 1, 3, 0, 2, 2,
2, 3, 2, 1, 3, 0, 2, 2, 2, 3, 2, 3, 2, 1, 3, 0, 2, 2, 2, 3,
3, 2, 2, 2, 0, 2, 2, 2, 4, 0, 3, 2, 2, 2, 0, 2, 2, 2, 4, 0,
2, 1, 1, 2, 2, 2, 1, 2, 0, 2, 2, 1, 1, 2, 2, 2, 1, 2, 0, 2,
1, 3, 3, 3, 2, 3, 3, 1, 1 1, 3, 3, 3, 2, 3, 3, 1, 1, 0,
1
}; };
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@ -643,69 +649,69 @@ static const yytype_uint8 yyr2[] =
means the default is an error. */ means the default is an error. */
static const yytype_uint8 yydefact[] = static const yytype_uint8 yydefact[] =
{ {
3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 109,
0, 0, 0, 0, 0, 0, 12, 16, 13, 14, 0, 0, 0, 0, 0, 0, 12, 16, 13, 14,
18, 15, 17, 0, 19, 0, 4, 31, 22, 31, 18, 15, 17, 0, 19, 0, 4, 31, 22, 31,
23, 52, 62, 5, 67, 20, 84, 75, 6, 24, 23, 52, 62, 5, 67, 20, 84, 75, 6, 24,
84, 21, 8, 11, 91, 92, 0, 0, 93, 0, 84, 21, 8, 11, 91, 92, 0, 0, 93, 0,
48, 94, 0, 0, 0, 107, 108, 0, 0, 0, 110, 0, 94, 0, 0, 0, 107, 108, 0, 0,
100, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 95, 0, 0, 0, 0, 0, 0, 0,
0, 0, 96, 7, 71, 79, 80, 27, 29, 0, 0, 0, 0, 96, 7, 71, 79, 48, 80, 27,
104, 0, 0, 64, 0, 0, 9, 10, 0, 0, 29, 0, 104, 0, 0, 64, 0, 0, 9, 10,
0, 0, 89, 0, 0, 0, 44, 0, 37, 36, 0, 0, 0, 0, 89, 0, 0, 0, 44, 0,
32, 33, 0, 35, 34, 0, 0, 89, 0, 56, 37, 36, 32, 33, 0, 35, 34, 0, 0, 89,
57, 53, 55, 54, 63, 51, 50, 68, 70, 66, 0, 56, 57, 53, 55, 54, 63, 51, 50, 68,
69, 65, 86, 87, 85, 76, 78, 74, 77, 73, 70, 66, 69, 65, 86, 87, 85, 76, 78, 74,
97, 103, 105, 106, 102, 101, 26, 82, 0, 98, 77, 73, 97, 103, 105, 106, 102, 101, 26, 82,
0, 98, 98, 98, 0, 0, 0, 83, 60, 98, 0, 98, 0, 98, 98, 98, 0, 0, 0, 83,
0, 98, 0, 0, 0, 38, 90, 0, 0, 98, 60, 98, 0, 98, 0, 0, 0, 38, 90, 0,
46, 43, 25, 0, 59, 0, 88, 99, 39, 40, 0, 98, 46, 43, 25, 0, 59, 0, 88, 99,
41, 0, 0, 45, 58, 61, 42, 47 39, 40, 41, 0, 0, 45, 58, 61, 42, 47
}; };
/* YYDEFGOTO[NTERM-NUM]. */ /* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] = static const yytype_int16 yydefgoto[] =
{ {
-1, 1, 2, 25, 26, 99, 27, 28, 29, 30, -1, 1, 2, 25, 26, 101, 27, 28, 29, 30,
64, 100, 101, 145, 173, 31, 32, 115, 33, 66, 65, 102, 103, 147, 175, 31, 32, 117, 33, 67,
111, 67, 34, 119, 35, 68, 36, 37, 127, 38, 113, 68, 34, 121, 35, 69, 36, 37, 129, 38,
70, 39, 40, 41, 102, 103, 69, 104, 140, 141, 71, 39, 40, 41, 104, 105, 70, 106, 142, 143,
42, 73, 154, 59, 60 42, 74, 156, 60, 61, 51
}; };
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */ STATE-NUM. */
#define YYPACT_NINF -78 #define YYPACT_NINF -80
static const yytype_int16 yypact[] = static const yytype_int16 yypact[] =
{ {
-78, 33, 130, -78, -28, 73, 73, 7, 73, 36, -80, 2, 132, -80, -13, -1, -1, -2, -1, 9,
41, 73, 26, 52, -4, 58, -78, -78, -78, -78, 33, -1, 27, 40, -3, 38, -80, -80, -80, -80,
-78, -78, -78, 90, -78, 94, -78, -78, -78, -78, -80, -80, -80, 71, -80, 77, -80, -80, -80, -80,
-78, -78, -78, -78, -78, -78, -78, -78, -78, -78, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80,
-78, -78, -78, -78, -78, -78, 74, 85, -78, 96, -80, -80, -80, -80, -80, -80, 57, 61, -80, 63,
-78, -78, 131, 134, 147, -78, -78, -4, -4, 193, -80, 76, -80, 87, 101, 133, -80, -80, -3, -3,
-10, -78, 162, 164, 38, 102, 64, 148, 5, 192, 195, -6, -80, 136, 149, 39, 104, 65, 150, 5,
5, 165, -78, 174, -78, -78, -78, -78, -78, 65, 194, 5, 167, -80, 176, -80, -80, -80, -80, -80,
-78, -4, -4, 174, 103, 103, -78, -78, 175, 185, -80, 68, -80, -3, -3, 176, 72, 72, -80, -80,
197, 73, 73, -4, 194, 103, -78, 231, -78, -78, 177, 187, 78, -1, -1, -3, 196, 72, -80, 222,
-78, -78, 220, -78, -78, 204, 73, 73, 210, -78, -80, -80, -80, -80, 221, -80, -80, 205, -1, -1,
-78, -78, -78, -78, -78, -78, -78, -78, -78, -78, 211, -80, -80, -80, -80, -80, -80, -80, -80, -80,
-78, -78, -78, -78, -78, -78, -78, -78, -78, -78, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80,
-78, -78, 205, -78, -78, -78, -78, -78, -4, 222, -80, -80, -80, -80, 206, -80, -80, -80, -80, -80,
208, 222, 195, 222, 103, 2, 209, -78, -78, 222, -3, 223, 209, 223, 197, 223, 72, 7, 210, -80,
211, 222, 199, -4, 212, -78, -78, 213, 214, 222, -80, 223, 212, 223, 201, -3, 213, -80, -80, 214,
207, -78, -78, 215, -78, 216, -78, 111, -78, -78, 215, 223, 208, -80, -80, 216, -80, 217, -80, 113,
-78, 217, 73, -78, -78, -78, -78, -78 -80, -80, -80, 218, -1, -80, -80, -80, -80, -80
}; };
/* YYPGOTO[NTERM-NUM]. */ /* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] = static const yytype_int16 yypgoto[] =
{ {
-78, -78, -78, -78, 121, -35, -78, -78, -78, -78, -80, -80, -80, -80, 122, -34, -80, -80, -80, -80,
219, -78, -78, -78, -78, -78, -78, -78, -44, -78, 220, -80, -80, -80, -80, -80, -80, -80, 59, -80,
-78, -78, -78, -78, -78, -78, -78, -78, -78, -6, -80, -80, -80, -80, -80, -80, -80, -80, -80, 125,
-78, -78, -78, -78, -78, 183, 218, 21, 143, -5, -80, -80, -80, -80, -80, 183, 219, 22, 142, -5,
146, 196, 69, -53, -77 147, 192, 69, -54, -79, -80
}; };
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
@ -715,62 +721,62 @@ static const yytype_int16 yypgoto[] =
#define YYTABLE_NINF -82 #define YYTABLE_NINF -82
static const yytype_int16 yytable[] = static const yytype_int16 yytable[] =
{ {
46, 47, 43, 49, 79, 80, 52, 134, 135, 6, 46, 47, 3, 49, 81, 82, 53, 136, 137, 6,
7, 8, 9, 10, 11, 12, 13, 84, 144, 14, 7, 8, 9, 10, 11, 12, 13, 43, 146, 14,
15, 55, 56, 85, 118, 57, 126, 160, 132, 133, 15, 86, 56, 57, 44, 45, 58, 87, 48, 134,
58, 110, 161, 3, 123, 24, 123, 48, -28, 88, 135, 59, 162, 112, 50, 24, 125, 163, 125, -28,
142, -28, -28, -28, -28, -28, -28, -28, -28, -28, 90, 144, -28, -28, -28, -28, -28, -28, -28, -28,
89, 53, -28, -28, 90, -28, 91, 92, 93, 94, -28, 91, 54, -28, -28, 92, -28, 93, 94, 95,
95, 96, 120, 97, 128, 88, 50, 159, 98, -49, 96, 97, 98, 52, 99, 55, 90, 161, 62, 100,
-49, 51, -49, -49, -49, -49, 89, 54, -49, -49, -49, -49, 63, -49, -49, -49, -49, 91, 64, -49,
90, 105, 106, 107, 108, 152, 139, 113, 61, 97, -49, 92, 107, 108, 109, 110, 154, 73, 141, 115,
124, 62, 124, 131, 109, 63, 81, 82, 44, 45, 99, 75, 126, 76, 126, 111, 133, 56, 57, 83,
167, 149, -30, 88, 72, -30, -30, -30, -30, -30, 84, 169, 140, 151, -30, 90, 77, -30, -30, -30,
-30, -30, -30, -30, 89, 74, -30, -30, 90, -30, -30, -30, -30, -30, -30, -30, 91, 78, -30, -30,
91, 92, 93, 94, 95, 96, 75, 97, 55, 56, 92, -30, 93, 94, 95, 96, 97, 98, 120, 99,
-2, 4, 98, 5, 6, 7, 8, 9, 10, 11, 128, 79, -2, 4, 100, 5, 6, 7, 8, 9,
12, 13, 81, 82, 14, 15, 16, 17, 18, 19, 10, 11, 12, 13, 83, 84, 14, 15, 16, 17,
20, 21, 22, 7, 8, 23, 10, 11, 12, 13, 18, 19, 20, 21, 22, 7, 8, 23, 10, 11,
24, 76, 14, 15, 77, -81, 88, 177, -81, -81, 12, 13, 24, 80, 14, 15, 88, -81, 90, 179,
-81, -81, -81, -81, -81, -81, -81, 78, 24, -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, 89,
-81, 90, -81, -81, -81, -81, -81, -81, 114, 117, 24, -81, -81, 92, -81, -81, -81, -81, -81, -81,
97, 125, 86, 88, 87, 122, -72, -72, -72, -72, 116, 119, 99, 127, 122, 90, 130, 124, -72, -72,
-72, -72, -72, -72, 130, 136, -72, -72, 90, 153, -72, -72, -72, -72, -72, -72, 132, 138, -72, -72,
156, 157, 158, 116, 121, 137, 129, 97, 163, 143, 92, 155, 158, 159, 160, 118, 123, 139, 131, 99,
165, 138, 122, 72, 81, 82, 81, 82, 171, 166, 165, 145, 167, 148, 124, 73, 83, 84, 83, 84,
81, 82, 146, 147, 148, 151, 153, 82, 155, 162, 173, 168, 83, 84, 149, 150, 153, 155, 84, 157,
172, 164, 168, 169, 170, 174, 175, 176, 65, 112, 164, 174, 166, 170, 171, 172, 176, 177, 178, 66,
150, 0, 0, 0, 0, 83, 0, 0, 71 114, 152, 85, 0, 0, 0, 0, 0, 0, 72
}; };
static const yytype_int16 yycheck[] = static const yytype_int16 yycheck[] =
{ {
5, 6, 30, 8, 57, 58, 11, 84, 85, 4, 5, 6, 0, 8, 58, 59, 11, 86, 87, 4,
5, 6, 7, 8, 9, 10, 11, 27, 95, 14, 5, 6, 7, 8, 9, 10, 11, 30, 97, 14,
15, 25, 26, 33, 68, 29, 70, 25, 81, 82, 15, 27, 25, 26, 25, 26, 29, 33, 30, 83,
34, 66, 30, 0, 69, 30, 71, 30, 0, 1, 84, 34, 25, 67, 25, 30, 70, 30, 72, 0,
93, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 95, 3, 4, 5, 6, 7, 8, 9, 10,
12, 25, 14, 15, 16, 17, 18, 19, 20, 21, 11, 12, 25, 14, 15, 16, 17, 18, 19, 20,
22, 23, 68, 25, 70, 1, 30, 144, 30, 5, 21, 22, 23, 30, 25, 25, 1, 146, 30, 30,
6, 30, 8, 9, 10, 11, 12, 25, 14, 15, 5, 6, 1, 8, 9, 10, 11, 12, 1, 14,
16, 17, 18, 19, 20, 138, 91, 66, 30, 25, 15, 16, 17, 18, 19, 20, 140, 30, 93, 67,
69, 1, 71, 28, 30, 1, 31, 32, 25, 26, 25, 30, 70, 30, 72, 30, 28, 25, 26, 31,
153, 106, 0, 1, 30, 3, 4, 5, 6, 7, 32, 155, 24, 108, 0, 1, 30, 3, 4, 5,
8, 9, 10, 11, 12, 30, 14, 15, 16, 17, 6, 7, 8, 9, 10, 11, 12, 30, 14, 15,
18, 19, 20, 21, 22, 23, 30, 25, 25, 26, 16, 17, 18, 19, 20, 21, 22, 23, 69, 25,
0, 1, 30, 3, 4, 5, 6, 7, 8, 9, 71, 30, 0, 1, 30, 3, 4, 5, 6, 7,
10, 11, 31, 32, 14, 15, 16, 17, 18, 19, 8, 9, 10, 11, 31, 32, 14, 15, 16, 17,
20, 21, 22, 5, 6, 25, 8, 9, 10, 11, 18, 19, 20, 21, 22, 5, 6, 25, 8, 9,
30, 30, 14, 15, 30, 0, 1, 172, 3, 4, 10, 11, 30, 30, 14, 15, 30, 0, 1, 174,
5, 6, 7, 8, 9, 10, 11, 30, 30, 14, 3, 4, 5, 6, 7, 8, 9, 10, 11, 30,
15, 16, 17, 18, 19, 20, 21, 22, 67, 68, 30, 14, 15, 16, 17, 18, 19, 20, 21, 22,
25, 70, 30, 1, 30, 30, 4, 5, 6, 7, 68, 69, 25, 71, 69, 1, 71, 30, 4, 5,
8, 9, 10, 11, 30, 30, 14, 15, 16, 14, 6, 7, 8, 9, 10, 11, 30, 30, 14, 15,
141, 142, 143, 67, 68, 30, 70, 25, 149, 25, 16, 14, 143, 144, 145, 68, 69, 30, 71, 25,
151, 24, 30, 30, 31, 32, 31, 32, 159, 30, 151, 25, 153, 1, 30, 30, 31, 32, 31, 32,
31, 32, 1, 13, 30, 25, 14, 32, 30, 30, 161, 30, 31, 32, 13, 30, 25, 14, 32, 30,
33, 30, 30, 30, 30, 30, 30, 30, 29, 66, 30, 33, 30, 30, 30, 30, 30, 30, 30, 29,
107, -1, -1, -1, -1, 59, -1, -1, 40 67, 109, 60, -1, -1, -1, -1, -1, -1, 40
}; };
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@ -782,19 +788,19 @@ static const yytype_uint8 yystos[] =
20, 21, 22, 25, 30, 38, 39, 41, 42, 43, 20, 21, 22, 25, 30, 38, 39, 41, 42, 43,
44, 50, 51, 53, 57, 59, 61, 62, 64, 66, 44, 50, 51, 53, 57, 59, 61, 62, 64, 66,
67, 68, 75, 30, 25, 26, 74, 74, 30, 74, 67, 68, 75, 30, 25, 26, 74, 74, 30, 74,
30, 30, 74, 25, 25, 25, 26, 29, 34, 78, 25, 80, 30, 74, 25, 25, 25, 26, 29, 34,
79, 30, 1, 1, 45, 45, 54, 56, 60, 71, 78, 79, 30, 1, 1, 45, 45, 54, 56, 60,
65, 71, 30, 76, 30, 30, 30, 30, 30, 78, 71, 65, 71, 30, 76, 30, 30, 30, 30, 30,
78, 31, 32, 76, 27, 33, 30, 30, 1, 12, 30, 78, 78, 31, 32, 76, 27, 33, 30, 30,
16, 18, 19, 20, 21, 22, 23, 25, 30, 40, 1, 12, 16, 18, 19, 20, 21, 22, 23, 25,
46, 47, 69, 70, 72, 17, 18, 19, 20, 30, 30, 40, 46, 47, 69, 70, 72, 17, 18, 19,
40, 55, 70, 72, 39, 52, 75, 39, 53, 58, 20, 30, 40, 55, 70, 72, 39, 52, 75, 39,
64, 75, 30, 40, 72, 39, 53, 63, 64, 75, 53, 58, 64, 75, 30, 40, 72, 39, 53, 63,
30, 28, 78, 78, 79, 79, 30, 30, 24, 74, 64, 75, 30, 28, 78, 78, 79, 79, 30, 30,
73, 74, 78, 25, 79, 48, 1, 13, 30, 74, 24, 74, 73, 74, 78, 25, 79, 48, 1, 13,
73, 25, 78, 14, 77, 30, 77, 77, 77, 79, 30, 74, 73, 25, 78, 14, 77, 30, 77, 77,
25, 30, 30, 77, 30, 77, 30, 78, 30, 30, 77, 79, 25, 30, 30, 77, 30, 77, 30, 78,
30, 77, 33, 49, 30, 30, 30, 74 30, 30, 30, 77, 33, 49, 30, 30, 30, 74
}; };
#define yyerrok (yyerrstatus = 0) #define yyerrok (yyerrstatus = 0)
@ -1781,8 +1787,8 @@ yyreduce:
case 48: case 48:
{ {
struct symbol *sym = sym_lookup(NULL, 0); struct symbol *sym = sym_lookup((yyvsp[(2) - (3)].string), SYMBOL_CHOICE);
sym->flags |= SYMBOL_CHOICE; sym->flags |= SYMBOL_AUTO;
menu_add_entry(sym); menu_add_entry(sym);
menu_add_expr(P_CHOICE, NULL, NULL); menu_add_expr(P_CHOICE, NULL, NULL);
printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
@ -2014,7 +2020,12 @@ yyreduce:
case 108: case 108:
{ (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), 1); free((yyvsp[(1) - (1)].string)); ;} { (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), SYMBOL_CONST); free((yyvsp[(1) - (1)].string)); ;}
break;
case 109:
{ (yyval.string) = NULL; ;}
break; break;

View File

@ -91,7 +91,7 @@ static struct menu *current_menu, *current_entry;
%type <id> end %type <id> end
%type <id> option_name %type <id> option_name
%type <menu> if_entry menu_entry choice_entry %type <menu> if_entry menu_entry choice_entry
%type <string> symbol_option_arg %type <string> symbol_option_arg word_opt
%destructor { %destructor {
fprintf(stderr, "%s:%d: missing end statement for this entry\n", fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@ -239,10 +239,10 @@ symbol_option_arg:
/* choice entry */ /* choice entry */
choice: T_CHOICE T_EOL choice: T_CHOICE word_opt T_EOL
{ {
struct symbol *sym = sym_lookup(NULL, 0); struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
sym->flags |= SYMBOL_CHOICE; sym->flags |= SYMBOL_AUTO;
menu_add_entry(sym); menu_add_entry(sym);
menu_add_expr(P_CHOICE, NULL, NULL); menu_add_expr(P_CHOICE, NULL, NULL);
printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
@ -456,9 +456,12 @@ expr: symbol { $$ = expr_alloc_symbol($1); }
; ;
symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); } symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }
| T_WORD_QUOTE { $$ = sym_lookup($1, 1); free($1); } | T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
; ;
word_opt: /* empty */ { $$ = NULL; }
| T_WORD
%% %%
void conf_parse(const char *name) void conf_parse(const char *name)