xref: /rk3399_rockchip-uboot/scripts/kconfig/zconf.y (revision 0a9064fb47bb0a239c04b0b63edebfdd3a201fdc)
1*0a9064fbSMasahiro Yamada %{
2*0a9064fbSMasahiro Yamada /*
3*0a9064fbSMasahiro Yamada  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
4*0a9064fbSMasahiro Yamada  * Released under the terms of the GNU GPL v2.0.
5*0a9064fbSMasahiro Yamada  */
6*0a9064fbSMasahiro Yamada 
7*0a9064fbSMasahiro Yamada #include <ctype.h>
8*0a9064fbSMasahiro Yamada #include <stdarg.h>
9*0a9064fbSMasahiro Yamada #include <stdio.h>
10*0a9064fbSMasahiro Yamada #include <stdlib.h>
11*0a9064fbSMasahiro Yamada #include <string.h>
12*0a9064fbSMasahiro Yamada #include <stdbool.h>
13*0a9064fbSMasahiro Yamada 
14*0a9064fbSMasahiro Yamada #include "lkc.h"
15*0a9064fbSMasahiro Yamada 
16*0a9064fbSMasahiro Yamada #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
17*0a9064fbSMasahiro Yamada 
18*0a9064fbSMasahiro Yamada #define PRINTD		0x0001
19*0a9064fbSMasahiro Yamada #define DEBUG_PARSE	0x0002
20*0a9064fbSMasahiro Yamada 
21*0a9064fbSMasahiro Yamada int cdebug = PRINTD;
22*0a9064fbSMasahiro Yamada 
23*0a9064fbSMasahiro Yamada extern int zconflex(void);
24*0a9064fbSMasahiro Yamada static void zconfprint(const char *err, ...);
25*0a9064fbSMasahiro Yamada static void zconf_error(const char *err, ...);
26*0a9064fbSMasahiro Yamada static void zconferror(const char *err);
27*0a9064fbSMasahiro Yamada static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken);
28*0a9064fbSMasahiro Yamada 
29*0a9064fbSMasahiro Yamada struct symbol *symbol_hash[SYMBOL_HASHSIZE];
30*0a9064fbSMasahiro Yamada 
31*0a9064fbSMasahiro Yamada static struct menu *current_menu, *current_entry;
32*0a9064fbSMasahiro Yamada 
33*0a9064fbSMasahiro Yamada %}
34*0a9064fbSMasahiro Yamada %expect 30
35*0a9064fbSMasahiro Yamada 
36*0a9064fbSMasahiro Yamada %union
37*0a9064fbSMasahiro Yamada {
38*0a9064fbSMasahiro Yamada 	char *string;
39*0a9064fbSMasahiro Yamada 	struct file *file;
40*0a9064fbSMasahiro Yamada 	struct symbol *symbol;
41*0a9064fbSMasahiro Yamada 	struct expr *expr;
42*0a9064fbSMasahiro Yamada 	struct menu *menu;
43*0a9064fbSMasahiro Yamada 	const struct kconf_id *id;
44*0a9064fbSMasahiro Yamada }
45*0a9064fbSMasahiro Yamada 
46*0a9064fbSMasahiro Yamada %token <id>T_MAINMENU
47*0a9064fbSMasahiro Yamada %token <id>T_MENU
48*0a9064fbSMasahiro Yamada %token <id>T_ENDMENU
49*0a9064fbSMasahiro Yamada %token <id>T_SOURCE
50*0a9064fbSMasahiro Yamada %token <id>T_CHOICE
51*0a9064fbSMasahiro Yamada %token <id>T_ENDCHOICE
52*0a9064fbSMasahiro Yamada %token <id>T_COMMENT
53*0a9064fbSMasahiro Yamada %token <id>T_CONFIG
54*0a9064fbSMasahiro Yamada %token <id>T_MENUCONFIG
55*0a9064fbSMasahiro Yamada %token <id>T_HELP
56*0a9064fbSMasahiro Yamada %token <string> T_HELPTEXT
57*0a9064fbSMasahiro Yamada %token <id>T_IF
58*0a9064fbSMasahiro Yamada %token <id>T_ENDIF
59*0a9064fbSMasahiro Yamada %token <id>T_DEPENDS
60*0a9064fbSMasahiro Yamada %token <id>T_OPTIONAL
61*0a9064fbSMasahiro Yamada %token <id>T_PROMPT
62*0a9064fbSMasahiro Yamada %token <id>T_TYPE
63*0a9064fbSMasahiro Yamada %token <id>T_DEFAULT
64*0a9064fbSMasahiro Yamada %token <id>T_SELECT
65*0a9064fbSMasahiro Yamada %token <id>T_RANGE
66*0a9064fbSMasahiro Yamada %token <id>T_VISIBLE
67*0a9064fbSMasahiro Yamada %token <id>T_OPTION
68*0a9064fbSMasahiro Yamada %token <id>T_ON
69*0a9064fbSMasahiro Yamada %token <string> T_WORD
70*0a9064fbSMasahiro Yamada %token <string> T_WORD_QUOTE
71*0a9064fbSMasahiro Yamada %token T_UNEQUAL
72*0a9064fbSMasahiro Yamada %token T_CLOSE_PAREN
73*0a9064fbSMasahiro Yamada %token T_OPEN_PAREN
74*0a9064fbSMasahiro Yamada %token T_EOL
75*0a9064fbSMasahiro Yamada 
76*0a9064fbSMasahiro Yamada %left T_OR
77*0a9064fbSMasahiro Yamada %left T_AND
78*0a9064fbSMasahiro Yamada %left T_EQUAL T_UNEQUAL
79*0a9064fbSMasahiro Yamada %nonassoc T_NOT
80*0a9064fbSMasahiro Yamada 
81*0a9064fbSMasahiro Yamada %type <string> prompt
82*0a9064fbSMasahiro Yamada %type <symbol> symbol
83*0a9064fbSMasahiro Yamada %type <expr> expr
84*0a9064fbSMasahiro Yamada %type <expr> if_expr
85*0a9064fbSMasahiro Yamada %type <id> end
86*0a9064fbSMasahiro Yamada %type <id> option_name
87*0a9064fbSMasahiro Yamada %type <menu> if_entry menu_entry choice_entry
88*0a9064fbSMasahiro Yamada %type <string> symbol_option_arg word_opt
89*0a9064fbSMasahiro Yamada 
90*0a9064fbSMasahiro Yamada %destructor {
91*0a9064fbSMasahiro Yamada 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
92*0a9064fbSMasahiro Yamada 		$$->file->name, $$->lineno);
93*0a9064fbSMasahiro Yamada 	if (current_menu == $$)
94*0a9064fbSMasahiro Yamada 		menu_end_menu();
95*0a9064fbSMasahiro Yamada } if_entry menu_entry choice_entry
96*0a9064fbSMasahiro Yamada 
97*0a9064fbSMasahiro Yamada %{
98*0a9064fbSMasahiro Yamada /* Include zconf.hash.c here so it can see the token constants. */
99*0a9064fbSMasahiro Yamada #include "zconf.hash.c"
100*0a9064fbSMasahiro Yamada %}
101*0a9064fbSMasahiro Yamada 
102*0a9064fbSMasahiro Yamada %%
103*0a9064fbSMasahiro Yamada input: nl start | start;
104*0a9064fbSMasahiro Yamada 
105*0a9064fbSMasahiro Yamada start: mainmenu_stmt stmt_list | stmt_list;
106*0a9064fbSMasahiro Yamada 
107*0a9064fbSMasahiro Yamada stmt_list:
108*0a9064fbSMasahiro Yamada 	  /* empty */
109*0a9064fbSMasahiro Yamada 	| stmt_list common_stmt
110*0a9064fbSMasahiro Yamada 	| stmt_list choice_stmt
111*0a9064fbSMasahiro Yamada 	| stmt_list menu_stmt
112*0a9064fbSMasahiro Yamada 	| stmt_list end			{ zconf_error("unexpected end statement"); }
113*0a9064fbSMasahiro Yamada 	| stmt_list T_WORD error T_EOL	{ zconf_error("unknown statement \"%s\"", $2); }
114*0a9064fbSMasahiro Yamada 	| stmt_list option_name error T_EOL
115*0a9064fbSMasahiro Yamada {
116*0a9064fbSMasahiro Yamada 	zconf_error("unexpected option \"%s\"", kconf_id_strings + $2->name);
117*0a9064fbSMasahiro Yamada }
118*0a9064fbSMasahiro Yamada 	| stmt_list error T_EOL		{ zconf_error("invalid statement"); }
119*0a9064fbSMasahiro Yamada ;
120*0a9064fbSMasahiro Yamada 
121*0a9064fbSMasahiro Yamada option_name:
122*0a9064fbSMasahiro Yamada 	T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
123*0a9064fbSMasahiro Yamada ;
124*0a9064fbSMasahiro Yamada 
125*0a9064fbSMasahiro Yamada common_stmt:
126*0a9064fbSMasahiro Yamada 	  T_EOL
127*0a9064fbSMasahiro Yamada 	| if_stmt
128*0a9064fbSMasahiro Yamada 	| comment_stmt
129*0a9064fbSMasahiro Yamada 	| config_stmt
130*0a9064fbSMasahiro Yamada 	| menuconfig_stmt
131*0a9064fbSMasahiro Yamada 	| source_stmt
132*0a9064fbSMasahiro Yamada ;
133*0a9064fbSMasahiro Yamada 
134*0a9064fbSMasahiro Yamada option_error:
135*0a9064fbSMasahiro Yamada 	  T_WORD error T_EOL		{ zconf_error("unknown option \"%s\"", $1); }
136*0a9064fbSMasahiro Yamada 	| error T_EOL			{ zconf_error("invalid option"); }
137*0a9064fbSMasahiro Yamada ;
138*0a9064fbSMasahiro Yamada 
139*0a9064fbSMasahiro Yamada 
140*0a9064fbSMasahiro Yamada /* config/menuconfig entry */
141*0a9064fbSMasahiro Yamada 
142*0a9064fbSMasahiro Yamada config_entry_start: T_CONFIG T_WORD T_EOL
143*0a9064fbSMasahiro Yamada {
144*0a9064fbSMasahiro Yamada 	struct symbol *sym = sym_lookup($2, 0);
145*0a9064fbSMasahiro Yamada 	sym->flags |= SYMBOL_OPTIONAL;
146*0a9064fbSMasahiro Yamada 	menu_add_entry(sym);
147*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
148*0a9064fbSMasahiro Yamada };
149*0a9064fbSMasahiro Yamada 
150*0a9064fbSMasahiro Yamada config_stmt: config_entry_start config_option_list
151*0a9064fbSMasahiro Yamada {
152*0a9064fbSMasahiro Yamada 	menu_end_entry();
153*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
154*0a9064fbSMasahiro Yamada };
155*0a9064fbSMasahiro Yamada 
156*0a9064fbSMasahiro Yamada menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
157*0a9064fbSMasahiro Yamada {
158*0a9064fbSMasahiro Yamada 	struct symbol *sym = sym_lookup($2, 0);
159*0a9064fbSMasahiro Yamada 	sym->flags |= SYMBOL_OPTIONAL;
160*0a9064fbSMasahiro Yamada 	menu_add_entry(sym);
161*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
162*0a9064fbSMasahiro Yamada };
163*0a9064fbSMasahiro Yamada 
164*0a9064fbSMasahiro Yamada menuconfig_stmt: menuconfig_entry_start config_option_list
165*0a9064fbSMasahiro Yamada {
166*0a9064fbSMasahiro Yamada 	if (current_entry->prompt)
167*0a9064fbSMasahiro Yamada 		current_entry->prompt->type = P_MENU;
168*0a9064fbSMasahiro Yamada 	else
169*0a9064fbSMasahiro Yamada 		zconfprint("warning: menuconfig statement without prompt");
170*0a9064fbSMasahiro Yamada 	menu_end_entry();
171*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
172*0a9064fbSMasahiro Yamada };
173*0a9064fbSMasahiro Yamada 
174*0a9064fbSMasahiro Yamada config_option_list:
175*0a9064fbSMasahiro Yamada 	  /* empty */
176*0a9064fbSMasahiro Yamada 	| config_option_list config_option
177*0a9064fbSMasahiro Yamada 	| config_option_list symbol_option
178*0a9064fbSMasahiro Yamada 	| config_option_list depends
179*0a9064fbSMasahiro Yamada 	| config_option_list help
180*0a9064fbSMasahiro Yamada 	| config_option_list option_error
181*0a9064fbSMasahiro Yamada 	| config_option_list T_EOL
182*0a9064fbSMasahiro Yamada ;
183*0a9064fbSMasahiro Yamada 
184*0a9064fbSMasahiro Yamada config_option: T_TYPE prompt_stmt_opt T_EOL
185*0a9064fbSMasahiro Yamada {
186*0a9064fbSMasahiro Yamada 	menu_set_type($1->stype);
187*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
188*0a9064fbSMasahiro Yamada 		zconf_curname(), zconf_lineno(),
189*0a9064fbSMasahiro Yamada 		$1->stype);
190*0a9064fbSMasahiro Yamada };
191*0a9064fbSMasahiro Yamada 
192*0a9064fbSMasahiro Yamada config_option: T_PROMPT prompt if_expr T_EOL
193*0a9064fbSMasahiro Yamada {
194*0a9064fbSMasahiro Yamada 	menu_add_prompt(P_PROMPT, $2, $3);
195*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
196*0a9064fbSMasahiro Yamada };
197*0a9064fbSMasahiro Yamada 
198*0a9064fbSMasahiro Yamada config_option: T_DEFAULT expr if_expr T_EOL
199*0a9064fbSMasahiro Yamada {
200*0a9064fbSMasahiro Yamada 	menu_add_expr(P_DEFAULT, $2, $3);
201*0a9064fbSMasahiro Yamada 	if ($1->stype != S_UNKNOWN)
202*0a9064fbSMasahiro Yamada 		menu_set_type($1->stype);
203*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
204*0a9064fbSMasahiro Yamada 		zconf_curname(), zconf_lineno(),
205*0a9064fbSMasahiro Yamada 		$1->stype);
206*0a9064fbSMasahiro Yamada };
207*0a9064fbSMasahiro Yamada 
208*0a9064fbSMasahiro Yamada config_option: T_SELECT T_WORD if_expr T_EOL
209*0a9064fbSMasahiro Yamada {
210*0a9064fbSMasahiro Yamada 	menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
211*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
212*0a9064fbSMasahiro Yamada };
213*0a9064fbSMasahiro Yamada 
214*0a9064fbSMasahiro Yamada config_option: T_RANGE symbol symbol if_expr T_EOL
215*0a9064fbSMasahiro Yamada {
216*0a9064fbSMasahiro Yamada 	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
217*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
218*0a9064fbSMasahiro Yamada };
219*0a9064fbSMasahiro Yamada 
220*0a9064fbSMasahiro Yamada symbol_option: T_OPTION symbol_option_list T_EOL
221*0a9064fbSMasahiro Yamada ;
222*0a9064fbSMasahiro Yamada 
223*0a9064fbSMasahiro Yamada symbol_option_list:
224*0a9064fbSMasahiro Yamada 	  /* empty */
225*0a9064fbSMasahiro Yamada 	| symbol_option_list T_WORD symbol_option_arg
226*0a9064fbSMasahiro Yamada {
227*0a9064fbSMasahiro Yamada 	const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
228*0a9064fbSMasahiro Yamada 	if (id && id->flags & TF_OPTION)
229*0a9064fbSMasahiro Yamada 		menu_add_option(id->token, $3);
230*0a9064fbSMasahiro Yamada 	else
231*0a9064fbSMasahiro Yamada 		zconfprint("warning: ignoring unknown option %s", $2);
232*0a9064fbSMasahiro Yamada 	free($2);
233*0a9064fbSMasahiro Yamada };
234*0a9064fbSMasahiro Yamada 
235*0a9064fbSMasahiro Yamada symbol_option_arg:
236*0a9064fbSMasahiro Yamada 	  /* empty */		{ $$ = NULL; }
237*0a9064fbSMasahiro Yamada 	| T_EQUAL prompt	{ $$ = $2; }
238*0a9064fbSMasahiro Yamada ;
239*0a9064fbSMasahiro Yamada 
240*0a9064fbSMasahiro Yamada /* choice entry */
241*0a9064fbSMasahiro Yamada 
242*0a9064fbSMasahiro Yamada choice: T_CHOICE word_opt T_EOL
243*0a9064fbSMasahiro Yamada {
244*0a9064fbSMasahiro Yamada 	struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
245*0a9064fbSMasahiro Yamada 	sym->flags |= SYMBOL_AUTO;
246*0a9064fbSMasahiro Yamada 	menu_add_entry(sym);
247*0a9064fbSMasahiro Yamada 	menu_add_expr(P_CHOICE, NULL, NULL);
248*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
249*0a9064fbSMasahiro Yamada };
250*0a9064fbSMasahiro Yamada 
251*0a9064fbSMasahiro Yamada choice_entry: choice choice_option_list
252*0a9064fbSMasahiro Yamada {
253*0a9064fbSMasahiro Yamada 	$$ = menu_add_menu();
254*0a9064fbSMasahiro Yamada };
255*0a9064fbSMasahiro Yamada 
256*0a9064fbSMasahiro Yamada choice_end: end
257*0a9064fbSMasahiro Yamada {
258*0a9064fbSMasahiro Yamada 	if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
259*0a9064fbSMasahiro Yamada 		menu_end_menu();
260*0a9064fbSMasahiro Yamada 		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
261*0a9064fbSMasahiro Yamada 	}
262*0a9064fbSMasahiro Yamada };
263*0a9064fbSMasahiro Yamada 
264*0a9064fbSMasahiro Yamada choice_stmt: choice_entry choice_block choice_end
265*0a9064fbSMasahiro Yamada ;
266*0a9064fbSMasahiro Yamada 
267*0a9064fbSMasahiro Yamada choice_option_list:
268*0a9064fbSMasahiro Yamada 	  /* empty */
269*0a9064fbSMasahiro Yamada 	| choice_option_list choice_option
270*0a9064fbSMasahiro Yamada 	| choice_option_list depends
271*0a9064fbSMasahiro Yamada 	| choice_option_list help
272*0a9064fbSMasahiro Yamada 	| choice_option_list T_EOL
273*0a9064fbSMasahiro Yamada 	| choice_option_list option_error
274*0a9064fbSMasahiro Yamada ;
275*0a9064fbSMasahiro Yamada 
276*0a9064fbSMasahiro Yamada choice_option: T_PROMPT prompt if_expr T_EOL
277*0a9064fbSMasahiro Yamada {
278*0a9064fbSMasahiro Yamada 	menu_add_prompt(P_PROMPT, $2, $3);
279*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
280*0a9064fbSMasahiro Yamada };
281*0a9064fbSMasahiro Yamada 
282*0a9064fbSMasahiro Yamada choice_option: T_TYPE prompt_stmt_opt T_EOL
283*0a9064fbSMasahiro Yamada {
284*0a9064fbSMasahiro Yamada 	if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) {
285*0a9064fbSMasahiro Yamada 		menu_set_type($1->stype);
286*0a9064fbSMasahiro Yamada 		printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
287*0a9064fbSMasahiro Yamada 			zconf_curname(), zconf_lineno(),
288*0a9064fbSMasahiro Yamada 			$1->stype);
289*0a9064fbSMasahiro Yamada 	} else
290*0a9064fbSMasahiro Yamada 		YYERROR;
291*0a9064fbSMasahiro Yamada };
292*0a9064fbSMasahiro Yamada 
293*0a9064fbSMasahiro Yamada choice_option: T_OPTIONAL T_EOL
294*0a9064fbSMasahiro Yamada {
295*0a9064fbSMasahiro Yamada 	current_entry->sym->flags |= SYMBOL_OPTIONAL;
296*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
297*0a9064fbSMasahiro Yamada };
298*0a9064fbSMasahiro Yamada 
299*0a9064fbSMasahiro Yamada choice_option: T_DEFAULT T_WORD if_expr T_EOL
300*0a9064fbSMasahiro Yamada {
301*0a9064fbSMasahiro Yamada 	if ($1->stype == S_UNKNOWN) {
302*0a9064fbSMasahiro Yamada 		menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
303*0a9064fbSMasahiro Yamada 		printd(DEBUG_PARSE, "%s:%d:default\n",
304*0a9064fbSMasahiro Yamada 			zconf_curname(), zconf_lineno());
305*0a9064fbSMasahiro Yamada 	} else
306*0a9064fbSMasahiro Yamada 		YYERROR;
307*0a9064fbSMasahiro Yamada };
308*0a9064fbSMasahiro Yamada 
309*0a9064fbSMasahiro Yamada choice_block:
310*0a9064fbSMasahiro Yamada 	  /* empty */
311*0a9064fbSMasahiro Yamada 	| choice_block common_stmt
312*0a9064fbSMasahiro Yamada ;
313*0a9064fbSMasahiro Yamada 
314*0a9064fbSMasahiro Yamada /* if entry */
315*0a9064fbSMasahiro Yamada 
316*0a9064fbSMasahiro Yamada if_entry: T_IF expr nl
317*0a9064fbSMasahiro Yamada {
318*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
319*0a9064fbSMasahiro Yamada 	menu_add_entry(NULL);
320*0a9064fbSMasahiro Yamada 	menu_add_dep($2);
321*0a9064fbSMasahiro Yamada 	$$ = menu_add_menu();
322*0a9064fbSMasahiro Yamada };
323*0a9064fbSMasahiro Yamada 
324*0a9064fbSMasahiro Yamada if_end: end
325*0a9064fbSMasahiro Yamada {
326*0a9064fbSMasahiro Yamada 	if (zconf_endtoken($1, T_IF, T_ENDIF)) {
327*0a9064fbSMasahiro Yamada 		menu_end_menu();
328*0a9064fbSMasahiro Yamada 		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
329*0a9064fbSMasahiro Yamada 	}
330*0a9064fbSMasahiro Yamada };
331*0a9064fbSMasahiro Yamada 
332*0a9064fbSMasahiro Yamada if_stmt: if_entry if_block if_end
333*0a9064fbSMasahiro Yamada ;
334*0a9064fbSMasahiro Yamada 
335*0a9064fbSMasahiro Yamada if_block:
336*0a9064fbSMasahiro Yamada 	  /* empty */
337*0a9064fbSMasahiro Yamada 	| if_block common_stmt
338*0a9064fbSMasahiro Yamada 	| if_block menu_stmt
339*0a9064fbSMasahiro Yamada 	| if_block choice_stmt
340*0a9064fbSMasahiro Yamada ;
341*0a9064fbSMasahiro Yamada 
342*0a9064fbSMasahiro Yamada /* mainmenu entry */
343*0a9064fbSMasahiro Yamada 
344*0a9064fbSMasahiro Yamada mainmenu_stmt: T_MAINMENU prompt nl
345*0a9064fbSMasahiro Yamada {
346*0a9064fbSMasahiro Yamada 	menu_add_prompt(P_MENU, $2, NULL);
347*0a9064fbSMasahiro Yamada };
348*0a9064fbSMasahiro Yamada 
349*0a9064fbSMasahiro Yamada /* menu entry */
350*0a9064fbSMasahiro Yamada 
351*0a9064fbSMasahiro Yamada menu: T_MENU prompt T_EOL
352*0a9064fbSMasahiro Yamada {
353*0a9064fbSMasahiro Yamada 	menu_add_entry(NULL);
354*0a9064fbSMasahiro Yamada 	menu_add_prompt(P_MENU, $2, NULL);
355*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
356*0a9064fbSMasahiro Yamada };
357*0a9064fbSMasahiro Yamada 
358*0a9064fbSMasahiro Yamada menu_entry: menu visibility_list depends_list
359*0a9064fbSMasahiro Yamada {
360*0a9064fbSMasahiro Yamada 	$$ = menu_add_menu();
361*0a9064fbSMasahiro Yamada };
362*0a9064fbSMasahiro Yamada 
363*0a9064fbSMasahiro Yamada menu_end: end
364*0a9064fbSMasahiro Yamada {
365*0a9064fbSMasahiro Yamada 	if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
366*0a9064fbSMasahiro Yamada 		menu_end_menu();
367*0a9064fbSMasahiro Yamada 		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
368*0a9064fbSMasahiro Yamada 	}
369*0a9064fbSMasahiro Yamada };
370*0a9064fbSMasahiro Yamada 
371*0a9064fbSMasahiro Yamada menu_stmt: menu_entry menu_block menu_end
372*0a9064fbSMasahiro Yamada ;
373*0a9064fbSMasahiro Yamada 
374*0a9064fbSMasahiro Yamada menu_block:
375*0a9064fbSMasahiro Yamada 	  /* empty */
376*0a9064fbSMasahiro Yamada 	| menu_block common_stmt
377*0a9064fbSMasahiro Yamada 	| menu_block menu_stmt
378*0a9064fbSMasahiro Yamada 	| menu_block choice_stmt
379*0a9064fbSMasahiro Yamada ;
380*0a9064fbSMasahiro Yamada 
381*0a9064fbSMasahiro Yamada source_stmt: T_SOURCE prompt T_EOL
382*0a9064fbSMasahiro Yamada {
383*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
384*0a9064fbSMasahiro Yamada 	zconf_nextfile($2);
385*0a9064fbSMasahiro Yamada };
386*0a9064fbSMasahiro Yamada 
387*0a9064fbSMasahiro Yamada /* comment entry */
388*0a9064fbSMasahiro Yamada 
389*0a9064fbSMasahiro Yamada comment: T_COMMENT prompt T_EOL
390*0a9064fbSMasahiro Yamada {
391*0a9064fbSMasahiro Yamada 	menu_add_entry(NULL);
392*0a9064fbSMasahiro Yamada 	menu_add_prompt(P_COMMENT, $2, NULL);
393*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
394*0a9064fbSMasahiro Yamada };
395*0a9064fbSMasahiro Yamada 
396*0a9064fbSMasahiro Yamada comment_stmt: comment depends_list
397*0a9064fbSMasahiro Yamada {
398*0a9064fbSMasahiro Yamada 	menu_end_entry();
399*0a9064fbSMasahiro Yamada };
400*0a9064fbSMasahiro Yamada 
401*0a9064fbSMasahiro Yamada /* help option */
402*0a9064fbSMasahiro Yamada 
403*0a9064fbSMasahiro Yamada help_start: T_HELP T_EOL
404*0a9064fbSMasahiro Yamada {
405*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
406*0a9064fbSMasahiro Yamada 	zconf_starthelp();
407*0a9064fbSMasahiro Yamada };
408*0a9064fbSMasahiro Yamada 
409*0a9064fbSMasahiro Yamada help: help_start T_HELPTEXT
410*0a9064fbSMasahiro Yamada {
411*0a9064fbSMasahiro Yamada 	current_entry->help = $2;
412*0a9064fbSMasahiro Yamada };
413*0a9064fbSMasahiro Yamada 
414*0a9064fbSMasahiro Yamada /* depends option */
415*0a9064fbSMasahiro Yamada 
416*0a9064fbSMasahiro Yamada depends_list:
417*0a9064fbSMasahiro Yamada 	  /* empty */
418*0a9064fbSMasahiro Yamada 	| depends_list depends
419*0a9064fbSMasahiro Yamada 	| depends_list T_EOL
420*0a9064fbSMasahiro Yamada 	| depends_list option_error
421*0a9064fbSMasahiro Yamada ;
422*0a9064fbSMasahiro Yamada 
423*0a9064fbSMasahiro Yamada depends: T_DEPENDS T_ON expr T_EOL
424*0a9064fbSMasahiro Yamada {
425*0a9064fbSMasahiro Yamada 	menu_add_dep($3);
426*0a9064fbSMasahiro Yamada 	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
427*0a9064fbSMasahiro Yamada };
428*0a9064fbSMasahiro Yamada 
429*0a9064fbSMasahiro Yamada /* visibility option */
430*0a9064fbSMasahiro Yamada 
431*0a9064fbSMasahiro Yamada visibility_list:
432*0a9064fbSMasahiro Yamada 	  /* empty */
433*0a9064fbSMasahiro Yamada 	| visibility_list visible
434*0a9064fbSMasahiro Yamada 	| visibility_list T_EOL
435*0a9064fbSMasahiro Yamada ;
436*0a9064fbSMasahiro Yamada 
437*0a9064fbSMasahiro Yamada visible: T_VISIBLE if_expr
438*0a9064fbSMasahiro Yamada {
439*0a9064fbSMasahiro Yamada 	menu_add_visibility($2);
440*0a9064fbSMasahiro Yamada };
441*0a9064fbSMasahiro Yamada 
442*0a9064fbSMasahiro Yamada /* prompt statement */
443*0a9064fbSMasahiro Yamada 
444*0a9064fbSMasahiro Yamada prompt_stmt_opt:
445*0a9064fbSMasahiro Yamada 	  /* empty */
446*0a9064fbSMasahiro Yamada 	| prompt if_expr
447*0a9064fbSMasahiro Yamada {
448*0a9064fbSMasahiro Yamada 	menu_add_prompt(P_PROMPT, $1, $2);
449*0a9064fbSMasahiro Yamada };
450*0a9064fbSMasahiro Yamada 
451*0a9064fbSMasahiro Yamada prompt:	  T_WORD
452*0a9064fbSMasahiro Yamada 	| T_WORD_QUOTE
453*0a9064fbSMasahiro Yamada ;
454*0a9064fbSMasahiro Yamada 
455*0a9064fbSMasahiro Yamada end:	  T_ENDMENU T_EOL	{ $$ = $1; }
456*0a9064fbSMasahiro Yamada 	| T_ENDCHOICE T_EOL	{ $$ = $1; }
457*0a9064fbSMasahiro Yamada 	| T_ENDIF T_EOL		{ $$ = $1; }
458*0a9064fbSMasahiro Yamada ;
459*0a9064fbSMasahiro Yamada 
460*0a9064fbSMasahiro Yamada nl:
461*0a9064fbSMasahiro Yamada 	  T_EOL
462*0a9064fbSMasahiro Yamada 	| nl T_EOL
463*0a9064fbSMasahiro Yamada ;
464*0a9064fbSMasahiro Yamada 
465*0a9064fbSMasahiro Yamada if_expr:  /* empty */			{ $$ = NULL; }
466*0a9064fbSMasahiro Yamada 	| T_IF expr			{ $$ = $2; }
467*0a9064fbSMasahiro Yamada ;
468*0a9064fbSMasahiro Yamada 
469*0a9064fbSMasahiro Yamada expr:	  symbol				{ $$ = expr_alloc_symbol($1); }
470*0a9064fbSMasahiro Yamada 	| symbol T_EQUAL symbol			{ $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
471*0a9064fbSMasahiro Yamada 	| symbol T_UNEQUAL symbol		{ $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
472*0a9064fbSMasahiro Yamada 	| T_OPEN_PAREN expr T_CLOSE_PAREN	{ $$ = $2; }
473*0a9064fbSMasahiro Yamada 	| T_NOT expr				{ $$ = expr_alloc_one(E_NOT, $2); }
474*0a9064fbSMasahiro Yamada 	| expr T_OR expr			{ $$ = expr_alloc_two(E_OR, $1, $3); }
475*0a9064fbSMasahiro Yamada 	| expr T_AND expr			{ $$ = expr_alloc_two(E_AND, $1, $3); }
476*0a9064fbSMasahiro Yamada ;
477*0a9064fbSMasahiro Yamada 
478*0a9064fbSMasahiro Yamada symbol:	  T_WORD	{ $$ = sym_lookup($1, 0); free($1); }
479*0a9064fbSMasahiro Yamada 	| T_WORD_QUOTE	{ $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
480*0a9064fbSMasahiro Yamada ;
481*0a9064fbSMasahiro Yamada 
482*0a9064fbSMasahiro Yamada word_opt: /* empty */			{ $$ = NULL; }
483*0a9064fbSMasahiro Yamada 	| T_WORD
484*0a9064fbSMasahiro Yamada 
485*0a9064fbSMasahiro Yamada %%
486*0a9064fbSMasahiro Yamada 
487*0a9064fbSMasahiro Yamada void conf_parse(const char *name)
488*0a9064fbSMasahiro Yamada {
489*0a9064fbSMasahiro Yamada 	struct symbol *sym;
490*0a9064fbSMasahiro Yamada 	int i;
491*0a9064fbSMasahiro Yamada 
492*0a9064fbSMasahiro Yamada 	zconf_initscan(name);
493*0a9064fbSMasahiro Yamada 
494*0a9064fbSMasahiro Yamada 	sym_init();
495*0a9064fbSMasahiro Yamada 	_menu_init();
496*0a9064fbSMasahiro Yamada 	rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
497*0a9064fbSMasahiro Yamada 
498*0a9064fbSMasahiro Yamada 	if (getenv("ZCONF_DEBUG"))
499*0a9064fbSMasahiro Yamada 		zconfdebug = 1;
500*0a9064fbSMasahiro Yamada 	zconfparse();
501*0a9064fbSMasahiro Yamada 	if (zconfnerrs)
502*0a9064fbSMasahiro Yamada 		exit(1);
503*0a9064fbSMasahiro Yamada 	if (!modules_sym)
504*0a9064fbSMasahiro Yamada 		modules_sym = sym_find( "n" );
505*0a9064fbSMasahiro Yamada 
506*0a9064fbSMasahiro Yamada 	rootmenu.prompt->text = _(rootmenu.prompt->text);
507*0a9064fbSMasahiro Yamada 	rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
508*0a9064fbSMasahiro Yamada 
509*0a9064fbSMasahiro Yamada 	menu_finalize(&rootmenu);
510*0a9064fbSMasahiro Yamada 	for_all_symbols(i, sym) {
511*0a9064fbSMasahiro Yamada 		if (sym_check_deps(sym))
512*0a9064fbSMasahiro Yamada 			zconfnerrs++;
513*0a9064fbSMasahiro Yamada 	}
514*0a9064fbSMasahiro Yamada 	if (zconfnerrs)
515*0a9064fbSMasahiro Yamada 		exit(1);
516*0a9064fbSMasahiro Yamada 	sym_set_change_count(1);
517*0a9064fbSMasahiro Yamada }
518*0a9064fbSMasahiro Yamada 
519*0a9064fbSMasahiro Yamada static const char *zconf_tokenname(int token)
520*0a9064fbSMasahiro Yamada {
521*0a9064fbSMasahiro Yamada 	switch (token) {
522*0a9064fbSMasahiro Yamada 	case T_MENU:		return "menu";
523*0a9064fbSMasahiro Yamada 	case T_ENDMENU:		return "endmenu";
524*0a9064fbSMasahiro Yamada 	case T_CHOICE:		return "choice";
525*0a9064fbSMasahiro Yamada 	case T_ENDCHOICE:	return "endchoice";
526*0a9064fbSMasahiro Yamada 	case T_IF:		return "if";
527*0a9064fbSMasahiro Yamada 	case T_ENDIF:		return "endif";
528*0a9064fbSMasahiro Yamada 	case T_DEPENDS:		return "depends";
529*0a9064fbSMasahiro Yamada 	case T_VISIBLE:		return "visible";
530*0a9064fbSMasahiro Yamada 	}
531*0a9064fbSMasahiro Yamada 	return "<token>";
532*0a9064fbSMasahiro Yamada }
533*0a9064fbSMasahiro Yamada 
534*0a9064fbSMasahiro Yamada static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken)
535*0a9064fbSMasahiro Yamada {
536*0a9064fbSMasahiro Yamada 	if (id->token != endtoken) {
537*0a9064fbSMasahiro Yamada 		zconf_error("unexpected '%s' within %s block",
538*0a9064fbSMasahiro Yamada 			kconf_id_strings + id->name, zconf_tokenname(starttoken));
539*0a9064fbSMasahiro Yamada 		zconfnerrs++;
540*0a9064fbSMasahiro Yamada 		return false;
541*0a9064fbSMasahiro Yamada 	}
542*0a9064fbSMasahiro Yamada 	if (current_menu->file != current_file) {
543*0a9064fbSMasahiro Yamada 		zconf_error("'%s' in different file than '%s'",
544*0a9064fbSMasahiro Yamada 			kconf_id_strings + id->name, zconf_tokenname(starttoken));
545*0a9064fbSMasahiro Yamada 		fprintf(stderr, "%s:%d: location of the '%s'\n",
546*0a9064fbSMasahiro Yamada 			current_menu->file->name, current_menu->lineno,
547*0a9064fbSMasahiro Yamada 			zconf_tokenname(starttoken));
548*0a9064fbSMasahiro Yamada 		zconfnerrs++;
549*0a9064fbSMasahiro Yamada 		return false;
550*0a9064fbSMasahiro Yamada 	}
551*0a9064fbSMasahiro Yamada 	return true;
552*0a9064fbSMasahiro Yamada }
553*0a9064fbSMasahiro Yamada 
554*0a9064fbSMasahiro Yamada static void zconfprint(const char *err, ...)
555*0a9064fbSMasahiro Yamada {
556*0a9064fbSMasahiro Yamada 	va_list ap;
557*0a9064fbSMasahiro Yamada 
558*0a9064fbSMasahiro Yamada 	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
559*0a9064fbSMasahiro Yamada 	va_start(ap, err);
560*0a9064fbSMasahiro Yamada 	vfprintf(stderr, err, ap);
561*0a9064fbSMasahiro Yamada 	va_end(ap);
562*0a9064fbSMasahiro Yamada 	fprintf(stderr, "\n");
563*0a9064fbSMasahiro Yamada }
564*0a9064fbSMasahiro Yamada 
565*0a9064fbSMasahiro Yamada static void zconf_error(const char *err, ...)
566*0a9064fbSMasahiro Yamada {
567*0a9064fbSMasahiro Yamada 	va_list ap;
568*0a9064fbSMasahiro Yamada 
569*0a9064fbSMasahiro Yamada 	zconfnerrs++;
570*0a9064fbSMasahiro Yamada 	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
571*0a9064fbSMasahiro Yamada 	va_start(ap, err);
572*0a9064fbSMasahiro Yamada 	vfprintf(stderr, err, ap);
573*0a9064fbSMasahiro Yamada 	va_end(ap);
574*0a9064fbSMasahiro Yamada 	fprintf(stderr, "\n");
575*0a9064fbSMasahiro Yamada }
576*0a9064fbSMasahiro Yamada 
577*0a9064fbSMasahiro Yamada static void zconferror(const char *err)
578*0a9064fbSMasahiro Yamada {
579*0a9064fbSMasahiro Yamada 	fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
580*0a9064fbSMasahiro Yamada }
581*0a9064fbSMasahiro Yamada 
582*0a9064fbSMasahiro Yamada static void print_quoted_string(FILE *out, const char *str)
583*0a9064fbSMasahiro Yamada {
584*0a9064fbSMasahiro Yamada 	const char *p;
585*0a9064fbSMasahiro Yamada 	int len;
586*0a9064fbSMasahiro Yamada 
587*0a9064fbSMasahiro Yamada 	putc('"', out);
588*0a9064fbSMasahiro Yamada 	while ((p = strchr(str, '"'))) {
589*0a9064fbSMasahiro Yamada 		len = p - str;
590*0a9064fbSMasahiro Yamada 		if (len)
591*0a9064fbSMasahiro Yamada 			fprintf(out, "%.*s", len, str);
592*0a9064fbSMasahiro Yamada 		fputs("\\\"", out);
593*0a9064fbSMasahiro Yamada 		str = p + 1;
594*0a9064fbSMasahiro Yamada 	}
595*0a9064fbSMasahiro Yamada 	fputs(str, out);
596*0a9064fbSMasahiro Yamada 	putc('"', out);
597*0a9064fbSMasahiro Yamada }
598*0a9064fbSMasahiro Yamada 
599*0a9064fbSMasahiro Yamada static void print_symbol(FILE *out, struct menu *menu)
600*0a9064fbSMasahiro Yamada {
601*0a9064fbSMasahiro Yamada 	struct symbol *sym = menu->sym;
602*0a9064fbSMasahiro Yamada 	struct property *prop;
603*0a9064fbSMasahiro Yamada 
604*0a9064fbSMasahiro Yamada 	if (sym_is_choice(sym))
605*0a9064fbSMasahiro Yamada 		fprintf(out, "\nchoice\n");
606*0a9064fbSMasahiro Yamada 	else
607*0a9064fbSMasahiro Yamada 		fprintf(out, "\nconfig %s\n", sym->name);
608*0a9064fbSMasahiro Yamada 	switch (sym->type) {
609*0a9064fbSMasahiro Yamada 	case S_BOOLEAN:
610*0a9064fbSMasahiro Yamada 		fputs("  boolean\n", out);
611*0a9064fbSMasahiro Yamada 		break;
612*0a9064fbSMasahiro Yamada 	case S_TRISTATE:
613*0a9064fbSMasahiro Yamada 		fputs("  tristate\n", out);
614*0a9064fbSMasahiro Yamada 		break;
615*0a9064fbSMasahiro Yamada 	case S_STRING:
616*0a9064fbSMasahiro Yamada 		fputs("  string\n", out);
617*0a9064fbSMasahiro Yamada 		break;
618*0a9064fbSMasahiro Yamada 	case S_INT:
619*0a9064fbSMasahiro Yamada 		fputs("  integer\n", out);
620*0a9064fbSMasahiro Yamada 		break;
621*0a9064fbSMasahiro Yamada 	case S_HEX:
622*0a9064fbSMasahiro Yamada 		fputs("  hex\n", out);
623*0a9064fbSMasahiro Yamada 		break;
624*0a9064fbSMasahiro Yamada 	default:
625*0a9064fbSMasahiro Yamada 		fputs("  ???\n", out);
626*0a9064fbSMasahiro Yamada 		break;
627*0a9064fbSMasahiro Yamada 	}
628*0a9064fbSMasahiro Yamada 	for (prop = sym->prop; prop; prop = prop->next) {
629*0a9064fbSMasahiro Yamada 		if (prop->menu != menu)
630*0a9064fbSMasahiro Yamada 			continue;
631*0a9064fbSMasahiro Yamada 		switch (prop->type) {
632*0a9064fbSMasahiro Yamada 		case P_PROMPT:
633*0a9064fbSMasahiro Yamada 			fputs("  prompt ", out);
634*0a9064fbSMasahiro Yamada 			print_quoted_string(out, prop->text);
635*0a9064fbSMasahiro Yamada 			if (!expr_is_yes(prop->visible.expr)) {
636*0a9064fbSMasahiro Yamada 				fputs(" if ", out);
637*0a9064fbSMasahiro Yamada 				expr_fprint(prop->visible.expr, out);
638*0a9064fbSMasahiro Yamada 			}
639*0a9064fbSMasahiro Yamada 			fputc('\n', out);
640*0a9064fbSMasahiro Yamada 			break;
641*0a9064fbSMasahiro Yamada 		case P_DEFAULT:
642*0a9064fbSMasahiro Yamada 			fputs( "  default ", out);
643*0a9064fbSMasahiro Yamada 			expr_fprint(prop->expr, out);
644*0a9064fbSMasahiro Yamada 			if (!expr_is_yes(prop->visible.expr)) {
645*0a9064fbSMasahiro Yamada 				fputs(" if ", out);
646*0a9064fbSMasahiro Yamada 				expr_fprint(prop->visible.expr, out);
647*0a9064fbSMasahiro Yamada 			}
648*0a9064fbSMasahiro Yamada 			fputc('\n', out);
649*0a9064fbSMasahiro Yamada 			break;
650*0a9064fbSMasahiro Yamada 		case P_CHOICE:
651*0a9064fbSMasahiro Yamada 			fputs("  #choice value\n", out);
652*0a9064fbSMasahiro Yamada 			break;
653*0a9064fbSMasahiro Yamada 		case P_SELECT:
654*0a9064fbSMasahiro Yamada 			fputs( "  select ", out);
655*0a9064fbSMasahiro Yamada 			expr_fprint(prop->expr, out);
656*0a9064fbSMasahiro Yamada 			fputc('\n', out);
657*0a9064fbSMasahiro Yamada 			break;
658*0a9064fbSMasahiro Yamada 		case P_RANGE:
659*0a9064fbSMasahiro Yamada 			fputs( "  range ", out);
660*0a9064fbSMasahiro Yamada 			expr_fprint(prop->expr, out);
661*0a9064fbSMasahiro Yamada 			fputc('\n', out);
662*0a9064fbSMasahiro Yamada 			break;
663*0a9064fbSMasahiro Yamada 		case P_MENU:
664*0a9064fbSMasahiro Yamada 			fputs( "  menu ", out);
665*0a9064fbSMasahiro Yamada 			print_quoted_string(out, prop->text);
666*0a9064fbSMasahiro Yamada 			fputc('\n', out);
667*0a9064fbSMasahiro Yamada 			break;
668*0a9064fbSMasahiro Yamada 		default:
669*0a9064fbSMasahiro Yamada 			fprintf(out, "  unknown prop %d!\n", prop->type);
670*0a9064fbSMasahiro Yamada 			break;
671*0a9064fbSMasahiro Yamada 		}
672*0a9064fbSMasahiro Yamada 	}
673*0a9064fbSMasahiro Yamada 	if (menu->help) {
674*0a9064fbSMasahiro Yamada 		int len = strlen(menu->help);
675*0a9064fbSMasahiro Yamada 		while (menu->help[--len] == '\n')
676*0a9064fbSMasahiro Yamada 			menu->help[len] = 0;
677*0a9064fbSMasahiro Yamada 		fprintf(out, "  help\n%s\n", menu->help);
678*0a9064fbSMasahiro Yamada 	}
679*0a9064fbSMasahiro Yamada }
680*0a9064fbSMasahiro Yamada 
681*0a9064fbSMasahiro Yamada void zconfdump(FILE *out)
682*0a9064fbSMasahiro Yamada {
683*0a9064fbSMasahiro Yamada 	struct property *prop;
684*0a9064fbSMasahiro Yamada 	struct symbol *sym;
685*0a9064fbSMasahiro Yamada 	struct menu *menu;
686*0a9064fbSMasahiro Yamada 
687*0a9064fbSMasahiro Yamada 	menu = rootmenu.list;
688*0a9064fbSMasahiro Yamada 	while (menu) {
689*0a9064fbSMasahiro Yamada 		if ((sym = menu->sym))
690*0a9064fbSMasahiro Yamada 			print_symbol(out, menu);
691*0a9064fbSMasahiro Yamada 		else if ((prop = menu->prompt)) {
692*0a9064fbSMasahiro Yamada 			switch (prop->type) {
693*0a9064fbSMasahiro Yamada 			case P_COMMENT:
694*0a9064fbSMasahiro Yamada 				fputs("\ncomment ", out);
695*0a9064fbSMasahiro Yamada 				print_quoted_string(out, prop->text);
696*0a9064fbSMasahiro Yamada 				fputs("\n", out);
697*0a9064fbSMasahiro Yamada 				break;
698*0a9064fbSMasahiro Yamada 			case P_MENU:
699*0a9064fbSMasahiro Yamada 				fputs("\nmenu ", out);
700*0a9064fbSMasahiro Yamada 				print_quoted_string(out, prop->text);
701*0a9064fbSMasahiro Yamada 				fputs("\n", out);
702*0a9064fbSMasahiro Yamada 				break;
703*0a9064fbSMasahiro Yamada 			default:
704*0a9064fbSMasahiro Yamada 				;
705*0a9064fbSMasahiro Yamada 			}
706*0a9064fbSMasahiro Yamada 			if (!expr_is_yes(prop->visible.expr)) {
707*0a9064fbSMasahiro Yamada 				fputs("  depends ", out);
708*0a9064fbSMasahiro Yamada 				expr_fprint(prop->visible.expr, out);
709*0a9064fbSMasahiro Yamada 				fputc('\n', out);
710*0a9064fbSMasahiro Yamada 			}
711*0a9064fbSMasahiro Yamada 		}
712*0a9064fbSMasahiro Yamada 
713*0a9064fbSMasahiro Yamada 		if (menu->list)
714*0a9064fbSMasahiro Yamada 			menu = menu->list;
715*0a9064fbSMasahiro Yamada 		else if (menu->next)
716*0a9064fbSMasahiro Yamada 			menu = menu->next;
717*0a9064fbSMasahiro Yamada 		else while ((menu = menu->parent)) {
718*0a9064fbSMasahiro Yamada 			if (menu->prompt && menu->prompt->type == P_MENU)
719*0a9064fbSMasahiro Yamada 				fputs("\nendmenu\n", out);
720*0a9064fbSMasahiro Yamada 			if (menu->next) {
721*0a9064fbSMasahiro Yamada 				menu = menu->next;
722*0a9064fbSMasahiro Yamada 				break;
723*0a9064fbSMasahiro Yamada 			}
724*0a9064fbSMasahiro Yamada 		}
725*0a9064fbSMasahiro Yamada 	}
726*0a9064fbSMasahiro Yamada }
727*0a9064fbSMasahiro Yamada 
728*0a9064fbSMasahiro Yamada #include "zconf.lex.c"
729*0a9064fbSMasahiro Yamada #include "util.c"
730*0a9064fbSMasahiro Yamada #include "confdata.c"
731*0a9064fbSMasahiro Yamada #include "expr.c"
732*0a9064fbSMasahiro Yamada #include "symbol.c"
733*0a9064fbSMasahiro Yamada #include "menu.c"
734