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 */
#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 YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
@ -354,7 +335,7 @@ void zconffree (void * );
/* Begin user sect3 */
#define zconfwrap(n) 1
#define zconfwrap() 1
#define YY_SKIP_YYWRAP
typedef unsigned char YY_CHAR;
@ -1535,7 +1516,7 @@ static int yy_get_next_buffer (void)
/* Read in more data. */
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);
}
@ -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
* 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.
* @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 */
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_re_search,struct symbol **,(const char *pattern));
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;
if (parent->list) {
if (sym && sym_is_choice(sym)) {
/* find the first choice value and find out choice type */
for (menu = parent->list; menu; menu = menu->next) {
if (menu->sym) {
current_entry = parent;
if (sym->type == S_UNKNOWN)
if (sym->type == S_UNKNOWN) {
/* find the first choice value to find out choice type */
current_entry = parent;
for (menu = parent->list; menu; menu = menu->next) {
if (menu->sym && menu->sym->type != S_UNKNOWN) {
menu_set_type(menu->sym->type);
current_entry = menu;
if (menu->sym->type == S_UNKNOWN)
menu_set_type(sym->type);
break;
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);
} else if (parent->prompt)
parentdep = parent->prompt->visible.expr;
@ -313,50 +317,36 @@ void menu_finalize(struct menu *parent)
}
}
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;
if (!menu->prompt)
menu_warn(menu, "choice value must have a prompt");
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)
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
* depend on the choice being set to Y. The choice
* values' dependencies were propagated to their
* properties above, so the change here must be re-
* propagated. */
* propagated.
*/
if (sym->type == S_TRISTATE && menu->sym->type != S_TRISTATE) {
basedep = expr_alloc_comp(E_EQUAL, sym, &symbol_yes);
basedep = expr_alloc_and(basedep, menu->dep);
basedep = expr_eliminate_dups(basedep);
menu->dep = basedep;
menu->dep = expr_alloc_and(basedep, menu->dep);
for (prop = menu->sym->prop; prop; prop = prop->next) {
if (prop->menu != menu)
continue;
dep = expr_alloc_and(expr_copy(basedep),
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;
}
prop->visible.expr = expr_alloc_and(expr_copy(basedep),
prop->visible.expr);
}
}
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);
prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
prop->expr = expr_alloc_symbol(sym_lookup(def, SYMBOL_CONST));
}
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;
if (sym_is_choice(sym) && newval.tri == yes)
sym->curr.val = sym_calc_choice(sym);
@ -377,6 +374,9 @@ void sym_calc_value(struct symbol *sym)
sym_set_changed(choice_sym);
}
}
if (sym->flags & SYMBOL_AUTO)
sym->flags &= ~SYMBOL_WRITE;
}
void sym_clear_all_valid(void)
@ -651,7 +651,7 @@ bool sym_is_changable(struct symbol *sym)
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;
const char *ptr;
@ -671,11 +671,10 @@ struct symbol *sym_lookup(const char *name, int isconst)
hash &= 0xff;
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
if (!strcmp(symbol->name, name)) {
if ((isconst && symbol->flags & SYMBOL_CONST) ||
(!isconst && !(symbol->flags & SYMBOL_CONST)))
return symbol;
}
if (!strcmp(symbol->name, name) &&
(flags ? symbol->flags & flags
: !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
return symbol;
}
new_name = strdup(name);
} else {
@ -687,8 +686,7 @@ struct symbol *sym_lookup(const char *name, int isconst)
memset(symbol, 0, sizeof(*symbol));
symbol->name = new_name;
symbol->type = S_UNKNOWN;
if (isconst)
symbol->flags |= SYMBOL_CONST;
symbol->flags |= flags;
symbol->next = symbol_hash[hash];
symbol_hash[hash] = symbol;
@ -962,7 +960,7 @@ void prop_add_env(const char *env)
}
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->right.sym = sym;

View File

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

View File

@ -91,7 +91,7 @@ static struct menu *current_menu, *current_entry;
%type <id> end
%type <id> option_name
%type <menu> if_entry menu_entry choice_entry
%type <string> symbol_option_arg
%type <string> symbol_option_arg word_opt
%destructor {
fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@ -239,10 +239,10 @@ symbol_option_arg:
/* choice entry */
choice: T_CHOICE T_EOL
choice: T_CHOICE word_opt T_EOL
{
struct symbol *sym = sym_lookup(NULL, 0);
sym->flags |= SYMBOL_CHOICE;
struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
sym->flags |= SYMBOL_AUTO;
menu_add_entry(sym);
menu_add_expr(P_CHOICE, NULL, NULL);
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); }
| 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)