xref: /aosp_15_r20/external/toybox/kconfig/conf.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /*
2*cf5a6c84SAndroid Build Coastguard Worker  * Copyright (C) 2002 Roman Zippel <[email protected]>
3*cf5a6c84SAndroid Build Coastguard Worker  * Released under the terms of the GNU GPL v2.0.
4*cf5a6c84SAndroid Build Coastguard Worker  */
5*cf5a6c84SAndroid Build Coastguard Worker 
6*cf5a6c84SAndroid Build Coastguard Worker #include <ctype.h>
7*cf5a6c84SAndroid Build Coastguard Worker #include <stdlib.h>
8*cf5a6c84SAndroid Build Coastguard Worker #include <stdio.h>
9*cf5a6c84SAndroid Build Coastguard Worker #include <string.h>
10*cf5a6c84SAndroid Build Coastguard Worker #include <unistd.h>
11*cf5a6c84SAndroid Build Coastguard Worker #include <time.h>
12*cf5a6c84SAndroid Build Coastguard Worker #include <sys/stat.h>
13*cf5a6c84SAndroid Build Coastguard Worker 
14*cf5a6c84SAndroid Build Coastguard Worker #define LKC_DIRECT_LINK
15*cf5a6c84SAndroid Build Coastguard Worker #include "lkc.h"
16*cf5a6c84SAndroid Build Coastguard Worker 
17*cf5a6c84SAndroid Build Coastguard Worker static void conf(struct menu *menu);
18*cf5a6c84SAndroid Build Coastguard Worker static void check_conf(struct menu *menu);
19*cf5a6c84SAndroid Build Coastguard Worker 
20*cf5a6c84SAndroid Build Coastguard Worker enum {
21*cf5a6c84SAndroid Build Coastguard Worker 	ask_all,
22*cf5a6c84SAndroid Build Coastguard Worker 	ask_new,
23*cf5a6c84SAndroid Build Coastguard Worker 	ask_silent,
24*cf5a6c84SAndroid Build Coastguard Worker 	set_default,
25*cf5a6c84SAndroid Build Coastguard Worker 	set_yes,
26*cf5a6c84SAndroid Build Coastguard Worker 	set_mod,
27*cf5a6c84SAndroid Build Coastguard Worker 	set_no,
28*cf5a6c84SAndroid Build Coastguard Worker 	set_random
29*cf5a6c84SAndroid Build Coastguard Worker } input_mode = ask_all;
30*cf5a6c84SAndroid Build Coastguard Worker char *defconfig_file;
31*cf5a6c84SAndroid Build Coastguard Worker 
32*cf5a6c84SAndroid Build Coastguard Worker static int indent = 1;
33*cf5a6c84SAndroid Build Coastguard Worker static int valid_stdin = 1;
34*cf5a6c84SAndroid Build Coastguard Worker static int conf_cnt;
35*cf5a6c84SAndroid Build Coastguard Worker static char line[128];
36*cf5a6c84SAndroid Build Coastguard Worker static struct menu *rootEntry;
37*cf5a6c84SAndroid Build Coastguard Worker 
38*cf5a6c84SAndroid Build Coastguard Worker static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
39*cf5a6c84SAndroid Build Coastguard Worker 
strip(char * str)40*cf5a6c84SAndroid Build Coastguard Worker static void strip(char *str)
41*cf5a6c84SAndroid Build Coastguard Worker {
42*cf5a6c84SAndroid Build Coastguard Worker 	char *p = str;
43*cf5a6c84SAndroid Build Coastguard Worker 	int l;
44*cf5a6c84SAndroid Build Coastguard Worker 
45*cf5a6c84SAndroid Build Coastguard Worker 	while ((isspace(*p)))
46*cf5a6c84SAndroid Build Coastguard Worker 		p++;
47*cf5a6c84SAndroid Build Coastguard Worker 	l = strlen(p);
48*cf5a6c84SAndroid Build Coastguard Worker 	if (p != str)
49*cf5a6c84SAndroid Build Coastguard Worker 		memmove(str, p, l + 1);
50*cf5a6c84SAndroid Build Coastguard Worker 	if (!l)
51*cf5a6c84SAndroid Build Coastguard Worker 		return;
52*cf5a6c84SAndroid Build Coastguard Worker 	p = str + l - 1;
53*cf5a6c84SAndroid Build Coastguard Worker 	while ((isspace(*p)))
54*cf5a6c84SAndroid Build Coastguard Worker 		*p-- = 0;
55*cf5a6c84SAndroid Build Coastguard Worker }
56*cf5a6c84SAndroid Build Coastguard Worker 
check_stdin(void)57*cf5a6c84SAndroid Build Coastguard Worker static void check_stdin(void)
58*cf5a6c84SAndroid Build Coastguard Worker {
59*cf5a6c84SAndroid Build Coastguard Worker 	if (!valid_stdin && input_mode == ask_silent) {
60*cf5a6c84SAndroid Build Coastguard Worker 		printf(_("aborted!\n\n"));
61*cf5a6c84SAndroid Build Coastguard Worker 		printf(_("Console input/output is redirected. "));
62*cf5a6c84SAndroid Build Coastguard Worker 		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
63*cf5a6c84SAndroid Build Coastguard Worker 		exit(1);
64*cf5a6c84SAndroid Build Coastguard Worker 	}
65*cf5a6c84SAndroid Build Coastguard Worker }
66*cf5a6c84SAndroid Build Coastguard Worker 
conf_askvalue(struct symbol * sym,const char * def)67*cf5a6c84SAndroid Build Coastguard Worker static void conf_askvalue(struct symbol *sym, const char *def)
68*cf5a6c84SAndroid Build Coastguard Worker {
69*cf5a6c84SAndroid Build Coastguard Worker 	enum symbol_type type = sym_get_type(sym);
70*cf5a6c84SAndroid Build Coastguard Worker 	tristate val;
71*cf5a6c84SAndroid Build Coastguard Worker 
72*cf5a6c84SAndroid Build Coastguard Worker 	if (!sym_has_value(sym))
73*cf5a6c84SAndroid Build Coastguard Worker 		printf("(NEW) ");
74*cf5a6c84SAndroid Build Coastguard Worker 
75*cf5a6c84SAndroid Build Coastguard Worker 	line[0] = '\n';
76*cf5a6c84SAndroid Build Coastguard Worker 	line[1] = 0;
77*cf5a6c84SAndroid Build Coastguard Worker 
78*cf5a6c84SAndroid Build Coastguard Worker 	if (!sym_is_changable(sym)) {
79*cf5a6c84SAndroid Build Coastguard Worker 		printf("%s\n", def);
80*cf5a6c84SAndroid Build Coastguard Worker 		line[0] = '\n';
81*cf5a6c84SAndroid Build Coastguard Worker 		line[1] = 0;
82*cf5a6c84SAndroid Build Coastguard Worker 		return;
83*cf5a6c84SAndroid Build Coastguard Worker 	}
84*cf5a6c84SAndroid Build Coastguard Worker 
85*cf5a6c84SAndroid Build Coastguard Worker 	switch (input_mode) {
86*cf5a6c84SAndroid Build Coastguard Worker 	case set_no:
87*cf5a6c84SAndroid Build Coastguard Worker 	case set_mod:
88*cf5a6c84SAndroid Build Coastguard Worker 	case set_yes:
89*cf5a6c84SAndroid Build Coastguard Worker 	case set_random:
90*cf5a6c84SAndroid Build Coastguard Worker 		if (sym_has_value(sym)) {
91*cf5a6c84SAndroid Build Coastguard Worker 			printf("%s\n", def);
92*cf5a6c84SAndroid Build Coastguard Worker 			return;
93*cf5a6c84SAndroid Build Coastguard Worker 		}
94*cf5a6c84SAndroid Build Coastguard Worker 		break;
95*cf5a6c84SAndroid Build Coastguard Worker 	case ask_new:
96*cf5a6c84SAndroid Build Coastguard Worker 	case ask_silent:
97*cf5a6c84SAndroid Build Coastguard Worker 		if (sym_has_value(sym)) {
98*cf5a6c84SAndroid Build Coastguard Worker 			printf("%s\n", def);
99*cf5a6c84SAndroid Build Coastguard Worker 			return;
100*cf5a6c84SAndroid Build Coastguard Worker 		}
101*cf5a6c84SAndroid Build Coastguard Worker 		check_stdin();
102*cf5a6c84SAndroid Build Coastguard Worker 	case ask_all:
103*cf5a6c84SAndroid Build Coastguard Worker 		fflush(stdout);
104*cf5a6c84SAndroid Build Coastguard Worker 		fgets(line, 128, stdin);
105*cf5a6c84SAndroid Build Coastguard Worker 		return;
106*cf5a6c84SAndroid Build Coastguard Worker 	case set_default:
107*cf5a6c84SAndroid Build Coastguard Worker 		printf("%s\n", def);
108*cf5a6c84SAndroid Build Coastguard Worker 		return;
109*cf5a6c84SAndroid Build Coastguard Worker 	default:
110*cf5a6c84SAndroid Build Coastguard Worker 		break;
111*cf5a6c84SAndroid Build Coastguard Worker 	}
112*cf5a6c84SAndroid Build Coastguard Worker 
113*cf5a6c84SAndroid Build Coastguard Worker 	switch (type) {
114*cf5a6c84SAndroid Build Coastguard Worker 	case S_INT:
115*cf5a6c84SAndroid Build Coastguard Worker 	case S_HEX:
116*cf5a6c84SAndroid Build Coastguard Worker 	case S_STRING:
117*cf5a6c84SAndroid Build Coastguard Worker 		printf("%s\n", def);
118*cf5a6c84SAndroid Build Coastguard Worker 		return;
119*cf5a6c84SAndroid Build Coastguard Worker 	default:
120*cf5a6c84SAndroid Build Coastguard Worker 		;
121*cf5a6c84SAndroid Build Coastguard Worker 	}
122*cf5a6c84SAndroid Build Coastguard Worker 	switch (input_mode) {
123*cf5a6c84SAndroid Build Coastguard Worker 	case set_yes:
124*cf5a6c84SAndroid Build Coastguard Worker 		if (sym_tristate_within_range(sym, yes)) {
125*cf5a6c84SAndroid Build Coastguard Worker 			line[0] = 'y';
126*cf5a6c84SAndroid Build Coastguard Worker 			line[1] = '\n';
127*cf5a6c84SAndroid Build Coastguard Worker 			line[2] = 0;
128*cf5a6c84SAndroid Build Coastguard Worker 			break;
129*cf5a6c84SAndroid Build Coastguard Worker 		}
130*cf5a6c84SAndroid Build Coastguard Worker 	case set_mod:
131*cf5a6c84SAndroid Build Coastguard Worker 		if (type == S_TRISTATE) {
132*cf5a6c84SAndroid Build Coastguard Worker 			if (sym_tristate_within_range(sym, mod)) {
133*cf5a6c84SAndroid Build Coastguard Worker 				line[0] = 'm';
134*cf5a6c84SAndroid Build Coastguard Worker 				line[1] = '\n';
135*cf5a6c84SAndroid Build Coastguard Worker 				line[2] = 0;
136*cf5a6c84SAndroid Build Coastguard Worker 				break;
137*cf5a6c84SAndroid Build Coastguard Worker 			}
138*cf5a6c84SAndroid Build Coastguard Worker 		} else {
139*cf5a6c84SAndroid Build Coastguard Worker 			if (sym_tristate_within_range(sym, yes)) {
140*cf5a6c84SAndroid Build Coastguard Worker 				line[0] = 'y';
141*cf5a6c84SAndroid Build Coastguard Worker 				line[1] = '\n';
142*cf5a6c84SAndroid Build Coastguard Worker 				line[2] = 0;
143*cf5a6c84SAndroid Build Coastguard Worker 				break;
144*cf5a6c84SAndroid Build Coastguard Worker 			}
145*cf5a6c84SAndroid Build Coastguard Worker 		}
146*cf5a6c84SAndroid Build Coastguard Worker 	case set_no:
147*cf5a6c84SAndroid Build Coastguard Worker 		if (sym_tristate_within_range(sym, no)) {
148*cf5a6c84SAndroid Build Coastguard Worker 			line[0] = 'n';
149*cf5a6c84SAndroid Build Coastguard Worker 			line[1] = '\n';
150*cf5a6c84SAndroid Build Coastguard Worker 			line[2] = 0;
151*cf5a6c84SAndroid Build Coastguard Worker 			break;
152*cf5a6c84SAndroid Build Coastguard Worker 		}
153*cf5a6c84SAndroid Build Coastguard Worker 	case set_random:
154*cf5a6c84SAndroid Build Coastguard Worker 		do {
155*cf5a6c84SAndroid Build Coastguard Worker 			val = (tristate)(random() % 3);
156*cf5a6c84SAndroid Build Coastguard Worker 		} while (!sym_tristate_within_range(sym, val));
157*cf5a6c84SAndroid Build Coastguard Worker 		switch (val) {
158*cf5a6c84SAndroid Build Coastguard Worker 		case no: line[0] = 'n'; break;
159*cf5a6c84SAndroid Build Coastguard Worker 		case mod: line[0] = 'm'; break;
160*cf5a6c84SAndroid Build Coastguard Worker 		case yes: line[0] = 'y'; break;
161*cf5a6c84SAndroid Build Coastguard Worker 		}
162*cf5a6c84SAndroid Build Coastguard Worker 		line[1] = '\n';
163*cf5a6c84SAndroid Build Coastguard Worker 		line[2] = 0;
164*cf5a6c84SAndroid Build Coastguard Worker 		break;
165*cf5a6c84SAndroid Build Coastguard Worker 	default:
166*cf5a6c84SAndroid Build Coastguard Worker 		break;
167*cf5a6c84SAndroid Build Coastguard Worker 	}
168*cf5a6c84SAndroid Build Coastguard Worker 	printf("%s", line);
169*cf5a6c84SAndroid Build Coastguard Worker }
170*cf5a6c84SAndroid Build Coastguard Worker 
conf_string(struct menu * menu)171*cf5a6c84SAndroid Build Coastguard Worker int conf_string(struct menu *menu)
172*cf5a6c84SAndroid Build Coastguard Worker {
173*cf5a6c84SAndroid Build Coastguard Worker 	struct symbol *sym = menu->sym;
174*cf5a6c84SAndroid Build Coastguard Worker 	const char *def, *help;
175*cf5a6c84SAndroid Build Coastguard Worker 
176*cf5a6c84SAndroid Build Coastguard Worker 	while (1) {
177*cf5a6c84SAndroid Build Coastguard Worker 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
178*cf5a6c84SAndroid Build Coastguard Worker 		printf("(%s) ", sym->name);
179*cf5a6c84SAndroid Build Coastguard Worker 		def = sym_get_string_value(sym);
180*cf5a6c84SAndroid Build Coastguard Worker 		if (sym_get_string_value(sym))
181*cf5a6c84SAndroid Build Coastguard Worker 			printf("[%s] ", def);
182*cf5a6c84SAndroid Build Coastguard Worker 		conf_askvalue(sym, def);
183*cf5a6c84SAndroid Build Coastguard Worker 		switch (line[0]) {
184*cf5a6c84SAndroid Build Coastguard Worker 		case '\n':
185*cf5a6c84SAndroid Build Coastguard Worker 			break;
186*cf5a6c84SAndroid Build Coastguard Worker 		case '?':
187*cf5a6c84SAndroid Build Coastguard Worker 			/* print help */
188*cf5a6c84SAndroid Build Coastguard Worker 			if (line[1] == '\n') {
189*cf5a6c84SAndroid Build Coastguard Worker 				help = nohelp_text;
190*cf5a6c84SAndroid Build Coastguard Worker 				if (menu->sym->help)
191*cf5a6c84SAndroid Build Coastguard Worker 					help = menu->sym->help;
192*cf5a6c84SAndroid Build Coastguard Worker 				printf("\n%s\n", menu->sym->help);
193*cf5a6c84SAndroid Build Coastguard Worker 				def = NULL;
194*cf5a6c84SAndroid Build Coastguard Worker 				break;
195*cf5a6c84SAndroid Build Coastguard Worker 			}
196*cf5a6c84SAndroid Build Coastguard Worker 		default:
197*cf5a6c84SAndroid Build Coastguard Worker 			line[strlen(line)-1] = 0;
198*cf5a6c84SAndroid Build Coastguard Worker 			def = line;
199*cf5a6c84SAndroid Build Coastguard Worker 		}
200*cf5a6c84SAndroid Build Coastguard Worker 		if (def && sym_set_string_value(sym, def))
201*cf5a6c84SAndroid Build Coastguard Worker 			return 0;
202*cf5a6c84SAndroid Build Coastguard Worker 	}
203*cf5a6c84SAndroid Build Coastguard Worker }
204*cf5a6c84SAndroid Build Coastguard Worker 
conf_sym(struct menu * menu)205*cf5a6c84SAndroid Build Coastguard Worker static int conf_sym(struct menu *menu)
206*cf5a6c84SAndroid Build Coastguard Worker {
207*cf5a6c84SAndroid Build Coastguard Worker 	struct symbol *sym = menu->sym;
208*cf5a6c84SAndroid Build Coastguard Worker 	int type;
209*cf5a6c84SAndroid Build Coastguard Worker 	tristate oldval, newval;
210*cf5a6c84SAndroid Build Coastguard Worker 	const char *help;
211*cf5a6c84SAndroid Build Coastguard Worker 
212*cf5a6c84SAndroid Build Coastguard Worker 	while (1) {
213*cf5a6c84SAndroid Build Coastguard Worker 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
214*cf5a6c84SAndroid Build Coastguard Worker 		if (sym->name)
215*cf5a6c84SAndroid Build Coastguard Worker 			printf("(%s) ", sym->name);
216*cf5a6c84SAndroid Build Coastguard Worker 		type = sym_get_type(sym);
217*cf5a6c84SAndroid Build Coastguard Worker 		putchar('[');
218*cf5a6c84SAndroid Build Coastguard Worker 		oldval = sym_get_tristate_value(sym);
219*cf5a6c84SAndroid Build Coastguard Worker 		switch (oldval) {
220*cf5a6c84SAndroid Build Coastguard Worker 		case no:
221*cf5a6c84SAndroid Build Coastguard Worker 			putchar('N');
222*cf5a6c84SAndroid Build Coastguard Worker 			break;
223*cf5a6c84SAndroid Build Coastguard Worker 		case mod:
224*cf5a6c84SAndroid Build Coastguard Worker 			putchar('M');
225*cf5a6c84SAndroid Build Coastguard Worker 			break;
226*cf5a6c84SAndroid Build Coastguard Worker 		case yes:
227*cf5a6c84SAndroid Build Coastguard Worker 			putchar('Y');
228*cf5a6c84SAndroid Build Coastguard Worker 			break;
229*cf5a6c84SAndroid Build Coastguard Worker 		}
230*cf5a6c84SAndroid Build Coastguard Worker 		if (oldval != no && sym_tristate_within_range(sym, no))
231*cf5a6c84SAndroid Build Coastguard Worker 			printf("/n");
232*cf5a6c84SAndroid Build Coastguard Worker 		if (oldval != mod && sym_tristate_within_range(sym, mod))
233*cf5a6c84SAndroid Build Coastguard Worker 			printf("/m");
234*cf5a6c84SAndroid Build Coastguard Worker 		if (oldval != yes && sym_tristate_within_range(sym, yes))
235*cf5a6c84SAndroid Build Coastguard Worker 			printf("/y");
236*cf5a6c84SAndroid Build Coastguard Worker 		if (sym->help)
237*cf5a6c84SAndroid Build Coastguard Worker 			printf("/?");
238*cf5a6c84SAndroid Build Coastguard Worker 		printf("] ");
239*cf5a6c84SAndroid Build Coastguard Worker 		conf_askvalue(sym, sym_get_string_value(sym));
240*cf5a6c84SAndroid Build Coastguard Worker 		strip(line);
241*cf5a6c84SAndroid Build Coastguard Worker 
242*cf5a6c84SAndroid Build Coastguard Worker 		switch (line[0]) {
243*cf5a6c84SAndroid Build Coastguard Worker 		case 'n':
244*cf5a6c84SAndroid Build Coastguard Worker 		case 'N':
245*cf5a6c84SAndroid Build Coastguard Worker 			newval = no;
246*cf5a6c84SAndroid Build Coastguard Worker 			if (!line[1] || !strcmp(&line[1], "o"))
247*cf5a6c84SAndroid Build Coastguard Worker 				break;
248*cf5a6c84SAndroid Build Coastguard Worker 			continue;
249*cf5a6c84SAndroid Build Coastguard Worker 		case 'm':
250*cf5a6c84SAndroid Build Coastguard Worker 		case 'M':
251*cf5a6c84SAndroid Build Coastguard Worker 			newval = mod;
252*cf5a6c84SAndroid Build Coastguard Worker 			if (!line[1])
253*cf5a6c84SAndroid Build Coastguard Worker 				break;
254*cf5a6c84SAndroid Build Coastguard Worker 			continue;
255*cf5a6c84SAndroid Build Coastguard Worker 		case 'y':
256*cf5a6c84SAndroid Build Coastguard Worker 		case 'Y':
257*cf5a6c84SAndroid Build Coastguard Worker 			newval = yes;
258*cf5a6c84SAndroid Build Coastguard Worker 			if (!line[1] || !strcmp(&line[1], "es"))
259*cf5a6c84SAndroid Build Coastguard Worker 				break;
260*cf5a6c84SAndroid Build Coastguard Worker 			continue;
261*cf5a6c84SAndroid Build Coastguard Worker 		case 0:
262*cf5a6c84SAndroid Build Coastguard Worker 			newval = oldval;
263*cf5a6c84SAndroid Build Coastguard Worker 			break;
264*cf5a6c84SAndroid Build Coastguard Worker 		case '?':
265*cf5a6c84SAndroid Build Coastguard Worker 			goto help;
266*cf5a6c84SAndroid Build Coastguard Worker 		default:
267*cf5a6c84SAndroid Build Coastguard Worker 			continue;
268*cf5a6c84SAndroid Build Coastguard Worker 		}
269*cf5a6c84SAndroid Build Coastguard Worker 		if (sym_set_tristate_value(sym, newval))
270*cf5a6c84SAndroid Build Coastguard Worker 			return 0;
271*cf5a6c84SAndroid Build Coastguard Worker help:
272*cf5a6c84SAndroid Build Coastguard Worker 		help = nohelp_text;
273*cf5a6c84SAndroid Build Coastguard Worker 		if (sym->help)
274*cf5a6c84SAndroid Build Coastguard Worker 			help = sym->help;
275*cf5a6c84SAndroid Build Coastguard Worker 		printf("\n%s\n", help);
276*cf5a6c84SAndroid Build Coastguard Worker 	}
277*cf5a6c84SAndroid Build Coastguard Worker }
278*cf5a6c84SAndroid Build Coastguard Worker 
conf_choice(struct menu * menu)279*cf5a6c84SAndroid Build Coastguard Worker static int conf_choice(struct menu *menu)
280*cf5a6c84SAndroid Build Coastguard Worker {
281*cf5a6c84SAndroid Build Coastguard Worker 	struct symbol *sym, *def_sym;
282*cf5a6c84SAndroid Build Coastguard Worker 	struct menu *child;
283*cf5a6c84SAndroid Build Coastguard Worker 	int type;
284*cf5a6c84SAndroid Build Coastguard Worker 	bool is_new;
285*cf5a6c84SAndroid Build Coastguard Worker 
286*cf5a6c84SAndroid Build Coastguard Worker 	sym = menu->sym;
287*cf5a6c84SAndroid Build Coastguard Worker 	type = sym_get_type(sym);
288*cf5a6c84SAndroid Build Coastguard Worker 	is_new = !sym_has_value(sym);
289*cf5a6c84SAndroid Build Coastguard Worker 	if (sym_is_changable(sym)) {
290*cf5a6c84SAndroid Build Coastguard Worker 		conf_sym(menu);
291*cf5a6c84SAndroid Build Coastguard Worker 		sym_calc_value(sym);
292*cf5a6c84SAndroid Build Coastguard Worker 		switch (sym_get_tristate_value(sym)) {
293*cf5a6c84SAndroid Build Coastguard Worker 		case no:
294*cf5a6c84SAndroid Build Coastguard Worker 			return 1;
295*cf5a6c84SAndroid Build Coastguard Worker 		case mod:
296*cf5a6c84SAndroid Build Coastguard Worker 			return 0;
297*cf5a6c84SAndroid Build Coastguard Worker 		case yes:
298*cf5a6c84SAndroid Build Coastguard Worker 			break;
299*cf5a6c84SAndroid Build Coastguard Worker 		}
300*cf5a6c84SAndroid Build Coastguard Worker 	} else {
301*cf5a6c84SAndroid Build Coastguard Worker 		switch (sym_get_tristate_value(sym)) {
302*cf5a6c84SAndroid Build Coastguard Worker 		case no:
303*cf5a6c84SAndroid Build Coastguard Worker 			return 1;
304*cf5a6c84SAndroid Build Coastguard Worker 		case mod:
305*cf5a6c84SAndroid Build Coastguard Worker 			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
306*cf5a6c84SAndroid Build Coastguard Worker 			return 0;
307*cf5a6c84SAndroid Build Coastguard Worker 		case yes:
308*cf5a6c84SAndroid Build Coastguard Worker 			break;
309*cf5a6c84SAndroid Build Coastguard Worker 		}
310*cf5a6c84SAndroid Build Coastguard Worker 	}
311*cf5a6c84SAndroid Build Coastguard Worker 
312*cf5a6c84SAndroid Build Coastguard Worker 	while (1) {
313*cf5a6c84SAndroid Build Coastguard Worker 		int cnt, def;
314*cf5a6c84SAndroid Build Coastguard Worker 
315*cf5a6c84SAndroid Build Coastguard Worker 		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
316*cf5a6c84SAndroid Build Coastguard Worker 		def_sym = sym_get_choice_value(sym);
317*cf5a6c84SAndroid Build Coastguard Worker 		cnt = def = 0;
318*cf5a6c84SAndroid Build Coastguard Worker 		line[0] = 0;
319*cf5a6c84SAndroid Build Coastguard Worker 		for (child = menu->list; child; child = child->next) {
320*cf5a6c84SAndroid Build Coastguard Worker 			if (!menu_is_visible(child))
321*cf5a6c84SAndroid Build Coastguard Worker 				continue;
322*cf5a6c84SAndroid Build Coastguard Worker 			if (!child->sym) {
323*cf5a6c84SAndroid Build Coastguard Worker 				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
324*cf5a6c84SAndroid Build Coastguard Worker 				continue;
325*cf5a6c84SAndroid Build Coastguard Worker 			}
326*cf5a6c84SAndroid Build Coastguard Worker 			cnt++;
327*cf5a6c84SAndroid Build Coastguard Worker 			if (child->sym == def_sym) {
328*cf5a6c84SAndroid Build Coastguard Worker 				def = cnt;
329*cf5a6c84SAndroid Build Coastguard Worker 				printf("%*c", indent, '>');
330*cf5a6c84SAndroid Build Coastguard Worker 			} else
331*cf5a6c84SAndroid Build Coastguard Worker 				printf("%*c", indent, ' ');
332*cf5a6c84SAndroid Build Coastguard Worker 			printf(" %d. %s", cnt, menu_get_prompt(child));
333*cf5a6c84SAndroid Build Coastguard Worker 			if (child->sym->name)
334*cf5a6c84SAndroid Build Coastguard Worker 				printf(" (%s)", child->sym->name);
335*cf5a6c84SAndroid Build Coastguard Worker 			if (!sym_has_value(child->sym))
336*cf5a6c84SAndroid Build Coastguard Worker 				printf(" (NEW)");
337*cf5a6c84SAndroid Build Coastguard Worker 			printf("\n");
338*cf5a6c84SAndroid Build Coastguard Worker 		}
339*cf5a6c84SAndroid Build Coastguard Worker 		printf("%*schoice", indent - 1, "");
340*cf5a6c84SAndroid Build Coastguard Worker 		if (cnt == 1) {
341*cf5a6c84SAndroid Build Coastguard Worker 			printf("[1]: 1\n");
342*cf5a6c84SAndroid Build Coastguard Worker 			goto conf_childs;
343*cf5a6c84SAndroid Build Coastguard Worker 		}
344*cf5a6c84SAndroid Build Coastguard Worker 		printf("[1-%d", cnt);
345*cf5a6c84SAndroid Build Coastguard Worker 		if (sym->help)
346*cf5a6c84SAndroid Build Coastguard Worker 			printf("?");
347*cf5a6c84SAndroid Build Coastguard Worker 		printf("]: ");
348*cf5a6c84SAndroid Build Coastguard Worker 		switch (input_mode) {
349*cf5a6c84SAndroid Build Coastguard Worker 		case ask_new:
350*cf5a6c84SAndroid Build Coastguard Worker 		case ask_silent:
351*cf5a6c84SAndroid Build Coastguard Worker 			if (!is_new) {
352*cf5a6c84SAndroid Build Coastguard Worker 				cnt = def;
353*cf5a6c84SAndroid Build Coastguard Worker 				printf("%d\n", cnt);
354*cf5a6c84SAndroid Build Coastguard Worker 				break;
355*cf5a6c84SAndroid Build Coastguard Worker 			}
356*cf5a6c84SAndroid Build Coastguard Worker 			check_stdin();
357*cf5a6c84SAndroid Build Coastguard Worker 		case ask_all:
358*cf5a6c84SAndroid Build Coastguard Worker 			fflush(stdout);
359*cf5a6c84SAndroid Build Coastguard Worker 			fgets(line, 128, stdin);
360*cf5a6c84SAndroid Build Coastguard Worker 			strip(line);
361*cf5a6c84SAndroid Build Coastguard Worker 			if (line[0] == '?') {
362*cf5a6c84SAndroid Build Coastguard Worker 				printf("\n%s\n", menu->sym->help ?
363*cf5a6c84SAndroid Build Coastguard Worker 					menu->sym->help : nohelp_text);
364*cf5a6c84SAndroid Build Coastguard Worker 				continue;
365*cf5a6c84SAndroid Build Coastguard Worker 			}
366*cf5a6c84SAndroid Build Coastguard Worker 			if (!line[0])
367*cf5a6c84SAndroid Build Coastguard Worker 				cnt = def;
368*cf5a6c84SAndroid Build Coastguard Worker 			else if (isdigit(line[0]))
369*cf5a6c84SAndroid Build Coastguard Worker 				cnt = atoi(line);
370*cf5a6c84SAndroid Build Coastguard Worker 			else
371*cf5a6c84SAndroid Build Coastguard Worker 				continue;
372*cf5a6c84SAndroid Build Coastguard Worker 			break;
373*cf5a6c84SAndroid Build Coastguard Worker 		case set_random:
374*cf5a6c84SAndroid Build Coastguard Worker 			def = (random() % cnt) + 1;
375*cf5a6c84SAndroid Build Coastguard Worker 		case set_default:
376*cf5a6c84SAndroid Build Coastguard Worker 		case set_yes:
377*cf5a6c84SAndroid Build Coastguard Worker 		case set_mod:
378*cf5a6c84SAndroid Build Coastguard Worker 		case set_no:
379*cf5a6c84SAndroid Build Coastguard Worker 			cnt = def;
380*cf5a6c84SAndroid Build Coastguard Worker 			printf("%d\n", cnt);
381*cf5a6c84SAndroid Build Coastguard Worker 			break;
382*cf5a6c84SAndroid Build Coastguard Worker 		}
383*cf5a6c84SAndroid Build Coastguard Worker 
384*cf5a6c84SAndroid Build Coastguard Worker 	conf_childs:
385*cf5a6c84SAndroid Build Coastguard Worker 		for (child = menu->list; child; child = child->next) {
386*cf5a6c84SAndroid Build Coastguard Worker 			if (!child->sym || !menu_is_visible(child))
387*cf5a6c84SAndroid Build Coastguard Worker 				continue;
388*cf5a6c84SAndroid Build Coastguard Worker 			if (!--cnt)
389*cf5a6c84SAndroid Build Coastguard Worker 				break;
390*cf5a6c84SAndroid Build Coastguard Worker 		}
391*cf5a6c84SAndroid Build Coastguard Worker 		if (!child)
392*cf5a6c84SAndroid Build Coastguard Worker 			continue;
393*cf5a6c84SAndroid Build Coastguard Worker 		if (line[strlen(line) - 1] == '?') {
394*cf5a6c84SAndroid Build Coastguard Worker 			printf("\n%s\n", child->sym->help ?
395*cf5a6c84SAndroid Build Coastguard Worker 				child->sym->help : nohelp_text);
396*cf5a6c84SAndroid Build Coastguard Worker 			continue;
397*cf5a6c84SAndroid Build Coastguard Worker 		}
398*cf5a6c84SAndroid Build Coastguard Worker 		sym_set_choice_value(sym, child->sym);
399*cf5a6c84SAndroid Build Coastguard Worker 		if (child->list) {
400*cf5a6c84SAndroid Build Coastguard Worker 			indent += 2;
401*cf5a6c84SAndroid Build Coastguard Worker 			conf(child->list);
402*cf5a6c84SAndroid Build Coastguard Worker 			indent -= 2;
403*cf5a6c84SAndroid Build Coastguard Worker 		}
404*cf5a6c84SAndroid Build Coastguard Worker 		return 1;
405*cf5a6c84SAndroid Build Coastguard Worker 	}
406*cf5a6c84SAndroid Build Coastguard Worker }
407*cf5a6c84SAndroid Build Coastguard Worker 
conf(struct menu * menu)408*cf5a6c84SAndroid Build Coastguard Worker static void conf(struct menu *menu)
409*cf5a6c84SAndroid Build Coastguard Worker {
410*cf5a6c84SAndroid Build Coastguard Worker 	struct symbol *sym;
411*cf5a6c84SAndroid Build Coastguard Worker 	struct property *prop;
412*cf5a6c84SAndroid Build Coastguard Worker 	struct menu *child;
413*cf5a6c84SAndroid Build Coastguard Worker 
414*cf5a6c84SAndroid Build Coastguard Worker 	if (!menu_is_visible(menu))
415*cf5a6c84SAndroid Build Coastguard Worker 		return;
416*cf5a6c84SAndroid Build Coastguard Worker 
417*cf5a6c84SAndroid Build Coastguard Worker 	sym = menu->sym;
418*cf5a6c84SAndroid Build Coastguard Worker 	prop = menu->prompt;
419*cf5a6c84SAndroid Build Coastguard Worker 	if (prop) {
420*cf5a6c84SAndroid Build Coastguard Worker 		const char *prompt;
421*cf5a6c84SAndroid Build Coastguard Worker 
422*cf5a6c84SAndroid Build Coastguard Worker 		switch (prop->type) {
423*cf5a6c84SAndroid Build Coastguard Worker 		case P_MENU:
424*cf5a6c84SAndroid Build Coastguard Worker 			if (input_mode == ask_silent && rootEntry != menu) {
425*cf5a6c84SAndroid Build Coastguard Worker 				check_conf(menu);
426*cf5a6c84SAndroid Build Coastguard Worker 				return;
427*cf5a6c84SAndroid Build Coastguard Worker 			}
428*cf5a6c84SAndroid Build Coastguard Worker 		case P_COMMENT:
429*cf5a6c84SAndroid Build Coastguard Worker 			prompt = menu_get_prompt(menu);
430*cf5a6c84SAndroid Build Coastguard Worker 			if (prompt)
431*cf5a6c84SAndroid Build Coastguard Worker 				printf("%*c\n%*c %s\n%*c\n",
432*cf5a6c84SAndroid Build Coastguard Worker 					indent, '*',
433*cf5a6c84SAndroid Build Coastguard Worker 					indent, '*', prompt,
434*cf5a6c84SAndroid Build Coastguard Worker 					indent, '*');
435*cf5a6c84SAndroid Build Coastguard Worker 		default:
436*cf5a6c84SAndroid Build Coastguard Worker 			;
437*cf5a6c84SAndroid Build Coastguard Worker 		}
438*cf5a6c84SAndroid Build Coastguard Worker 	}
439*cf5a6c84SAndroid Build Coastguard Worker 
440*cf5a6c84SAndroid Build Coastguard Worker 	if (!sym)
441*cf5a6c84SAndroid Build Coastguard Worker 		goto conf_childs;
442*cf5a6c84SAndroid Build Coastguard Worker 
443*cf5a6c84SAndroid Build Coastguard Worker 	if (sym_is_choice(sym)) {
444*cf5a6c84SAndroid Build Coastguard Worker 		conf_choice(menu);
445*cf5a6c84SAndroid Build Coastguard Worker 		if (sym->curr.tri != mod)
446*cf5a6c84SAndroid Build Coastguard Worker 			return;
447*cf5a6c84SAndroid Build Coastguard Worker 		goto conf_childs;
448*cf5a6c84SAndroid Build Coastguard Worker 	}
449*cf5a6c84SAndroid Build Coastguard Worker 
450*cf5a6c84SAndroid Build Coastguard Worker 	switch (sym->type) {
451*cf5a6c84SAndroid Build Coastguard Worker 	case S_INT:
452*cf5a6c84SAndroid Build Coastguard Worker 	case S_HEX:
453*cf5a6c84SAndroid Build Coastguard Worker 	case S_STRING:
454*cf5a6c84SAndroid Build Coastguard Worker 		conf_string(menu);
455*cf5a6c84SAndroid Build Coastguard Worker 		break;
456*cf5a6c84SAndroid Build Coastguard Worker 	default:
457*cf5a6c84SAndroid Build Coastguard Worker 		conf_sym(menu);
458*cf5a6c84SAndroid Build Coastguard Worker 		break;
459*cf5a6c84SAndroid Build Coastguard Worker 	}
460*cf5a6c84SAndroid Build Coastguard Worker 
461*cf5a6c84SAndroid Build Coastguard Worker conf_childs:
462*cf5a6c84SAndroid Build Coastguard Worker 	if (sym)
463*cf5a6c84SAndroid Build Coastguard Worker 		indent += 2;
464*cf5a6c84SAndroid Build Coastguard Worker 	for (child = menu->list; child; child = child->next)
465*cf5a6c84SAndroid Build Coastguard Worker 		conf(child);
466*cf5a6c84SAndroid Build Coastguard Worker 	if (sym)
467*cf5a6c84SAndroid Build Coastguard Worker 		indent -= 2;
468*cf5a6c84SAndroid Build Coastguard Worker }
469*cf5a6c84SAndroid Build Coastguard Worker 
check_conf(struct menu * menu)470*cf5a6c84SAndroid Build Coastguard Worker static void check_conf(struct menu *menu)
471*cf5a6c84SAndroid Build Coastguard Worker {
472*cf5a6c84SAndroid Build Coastguard Worker 	struct symbol *sym;
473*cf5a6c84SAndroid Build Coastguard Worker 	struct menu *child;
474*cf5a6c84SAndroid Build Coastguard Worker 
475*cf5a6c84SAndroid Build Coastguard Worker 	if (!menu_is_visible(menu))
476*cf5a6c84SAndroid Build Coastguard Worker 		return;
477*cf5a6c84SAndroid Build Coastguard Worker 
478*cf5a6c84SAndroid Build Coastguard Worker 	sym = menu->sym;
479*cf5a6c84SAndroid Build Coastguard Worker 	if (sym && !sym_has_value(sym)) {
480*cf5a6c84SAndroid Build Coastguard Worker 		if (sym_is_changable(sym) ||
481*cf5a6c84SAndroid Build Coastguard Worker 		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
482*cf5a6c84SAndroid Build Coastguard Worker 			if (!conf_cnt++)
483*cf5a6c84SAndroid Build Coastguard Worker 				printf(_("*\n* Restart config...\n*\n"));
484*cf5a6c84SAndroid Build Coastguard Worker 			rootEntry = menu_get_parent_menu(menu);
485*cf5a6c84SAndroid Build Coastguard Worker 			conf(rootEntry);
486*cf5a6c84SAndroid Build Coastguard Worker 		}
487*cf5a6c84SAndroid Build Coastguard Worker 	}
488*cf5a6c84SAndroid Build Coastguard Worker 
489*cf5a6c84SAndroid Build Coastguard Worker 	for (child = menu->list; child; child = child->next)
490*cf5a6c84SAndroid Build Coastguard Worker 		check_conf(child);
491*cf5a6c84SAndroid Build Coastguard Worker }
492*cf5a6c84SAndroid Build Coastguard Worker 
main(int ac,char ** av)493*cf5a6c84SAndroid Build Coastguard Worker int main(int ac, char **av)
494*cf5a6c84SAndroid Build Coastguard Worker {
495*cf5a6c84SAndroid Build Coastguard Worker 	int i = 1;
496*cf5a6c84SAndroid Build Coastguard Worker 	const char *name;
497*cf5a6c84SAndroid Build Coastguard Worker 	struct stat tmpstat;
498*cf5a6c84SAndroid Build Coastguard Worker 
499*cf5a6c84SAndroid Build Coastguard Worker 	if (ac > i && av[i][0] == '-') {
500*cf5a6c84SAndroid Build Coastguard Worker 		switch (av[i++][1]) {
501*cf5a6c84SAndroid Build Coastguard Worker 		case 'o':
502*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = ask_new;
503*cf5a6c84SAndroid Build Coastguard Worker 			break;
504*cf5a6c84SAndroid Build Coastguard Worker 		case 's':
505*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = ask_silent;
506*cf5a6c84SAndroid Build Coastguard Worker 			valid_stdin = isatty(0) && isatty(1) && isatty(2);
507*cf5a6c84SAndroid Build Coastguard Worker 			break;
508*cf5a6c84SAndroid Build Coastguard Worker 		case 'd':
509*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = set_default;
510*cf5a6c84SAndroid Build Coastguard Worker 			break;
511*cf5a6c84SAndroid Build Coastguard Worker 		case 'D':
512*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = set_default;
513*cf5a6c84SAndroid Build Coastguard Worker 			defconfig_file = av[i++];
514*cf5a6c84SAndroid Build Coastguard Worker 			if (!defconfig_file) {
515*cf5a6c84SAndroid Build Coastguard Worker 				printf(_("%s: No default config file specified\n"),
516*cf5a6c84SAndroid Build Coastguard Worker 					av[0]);
517*cf5a6c84SAndroid Build Coastguard Worker 				exit(1);
518*cf5a6c84SAndroid Build Coastguard Worker 			}
519*cf5a6c84SAndroid Build Coastguard Worker 			break;
520*cf5a6c84SAndroid Build Coastguard Worker 		case 'n':
521*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = set_no;
522*cf5a6c84SAndroid Build Coastguard Worker 			break;
523*cf5a6c84SAndroid Build Coastguard Worker 		case 'm':
524*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = set_mod;
525*cf5a6c84SAndroid Build Coastguard Worker 			break;
526*cf5a6c84SAndroid Build Coastguard Worker 		case 'y':
527*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = set_yes;
528*cf5a6c84SAndroid Build Coastguard Worker 			break;
529*cf5a6c84SAndroid Build Coastguard Worker 		case 'r':
530*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = set_random;
531*cf5a6c84SAndroid Build Coastguard Worker 			srandom(time(NULL));
532*cf5a6c84SAndroid Build Coastguard Worker 			break;
533*cf5a6c84SAndroid Build Coastguard Worker 		case 'h':
534*cf5a6c84SAndroid Build Coastguard Worker 		case '?':
535*cf5a6c84SAndroid Build Coastguard Worker 			fprintf(stderr, "See README for usage info\n");
536*cf5a6c84SAndroid Build Coastguard Worker 			exit(0);
537*cf5a6c84SAndroid Build Coastguard Worker 		}
538*cf5a6c84SAndroid Build Coastguard Worker 	}
539*cf5a6c84SAndroid Build Coastguard Worker   	name = av[i];
540*cf5a6c84SAndroid Build Coastguard Worker 	if (!name) {
541*cf5a6c84SAndroid Build Coastguard Worker 		printf(_("%s: Kconfig file missing\n"), av[0]);
542*cf5a6c84SAndroid Build Coastguard Worker 		exit(1);
543*cf5a6c84SAndroid Build Coastguard Worker 	}
544*cf5a6c84SAndroid Build Coastguard Worker 	conf_parse(name);
545*cf5a6c84SAndroid Build Coastguard Worker 	//zconfdump(stdout);
546*cf5a6c84SAndroid Build Coastguard Worker 	switch (input_mode) {
547*cf5a6c84SAndroid Build Coastguard Worker 	case set_default:
548*cf5a6c84SAndroid Build Coastguard Worker 		if (!defconfig_file)
549*cf5a6c84SAndroid Build Coastguard Worker 			defconfig_file = conf_get_default_confname();
550*cf5a6c84SAndroid Build Coastguard Worker 		if (conf_read(defconfig_file)) {
551*cf5a6c84SAndroid Build Coastguard Worker 			printf("***\n"
552*cf5a6c84SAndroid Build Coastguard Worker 				"*** Can't find default configuration \"%s\"!\n"
553*cf5a6c84SAndroid Build Coastguard Worker 				"***\n", defconfig_file);
554*cf5a6c84SAndroid Build Coastguard Worker 			exit(1);
555*cf5a6c84SAndroid Build Coastguard Worker 		}
556*cf5a6c84SAndroid Build Coastguard Worker 		break;
557*cf5a6c84SAndroid Build Coastguard Worker 	case ask_silent:
558*cf5a6c84SAndroid Build Coastguard Worker 		if (stat(".config", &tmpstat)) {
559*cf5a6c84SAndroid Build Coastguard Worker 			printf(_("***\n"
560*cf5a6c84SAndroid Build Coastguard Worker 				"*** You have not yet configured your "PROJECT_NAME"!\n"
561*cf5a6c84SAndroid Build Coastguard Worker 				"***\n"
562*cf5a6c84SAndroid Build Coastguard Worker 				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
563*cf5a6c84SAndroid Build Coastguard Worker 				"*** \"make menuconfig\" or \"make xconfig\").\n"
564*cf5a6c84SAndroid Build Coastguard Worker 				"***\n"));
565*cf5a6c84SAndroid Build Coastguard Worker 			exit(1);
566*cf5a6c84SAndroid Build Coastguard Worker 		}
567*cf5a6c84SAndroid Build Coastguard Worker 	case ask_all:
568*cf5a6c84SAndroid Build Coastguard Worker 	case ask_new:
569*cf5a6c84SAndroid Build Coastguard Worker 		conf_read(NULL);
570*cf5a6c84SAndroid Build Coastguard Worker 		break;
571*cf5a6c84SAndroid Build Coastguard Worker 	case set_no:
572*cf5a6c84SAndroid Build Coastguard Worker 	case set_mod:
573*cf5a6c84SAndroid Build Coastguard Worker 	case set_yes:
574*cf5a6c84SAndroid Build Coastguard Worker 	case set_random:
575*cf5a6c84SAndroid Build Coastguard Worker 		name = getenv("KCONFIG_ALLCONFIG");
576*cf5a6c84SAndroid Build Coastguard Worker 		if (name && !stat(name, &tmpstat)) {
577*cf5a6c84SAndroid Build Coastguard Worker 			conf_read_simple(name, S_DEF_USER);
578*cf5a6c84SAndroid Build Coastguard Worker 			break;
579*cf5a6c84SAndroid Build Coastguard Worker 		}
580*cf5a6c84SAndroid Build Coastguard Worker 		switch (input_mode) {
581*cf5a6c84SAndroid Build Coastguard Worker 		case set_no:	 name = "allno.config"; break;
582*cf5a6c84SAndroid Build Coastguard Worker 		case set_mod:	 name = "allmod.config"; break;
583*cf5a6c84SAndroid Build Coastguard Worker 		case set_yes:	 name = "allyes.config"; break;
584*cf5a6c84SAndroid Build Coastguard Worker 		case set_random: name = "allrandom.config"; break;
585*cf5a6c84SAndroid Build Coastguard Worker 		default: break;
586*cf5a6c84SAndroid Build Coastguard Worker 		}
587*cf5a6c84SAndroid Build Coastguard Worker 		if (!stat(name, &tmpstat))
588*cf5a6c84SAndroid Build Coastguard Worker 			conf_read_simple(name, S_DEF_USER);
589*cf5a6c84SAndroid Build Coastguard Worker 		else if (!stat("all.config", &tmpstat))
590*cf5a6c84SAndroid Build Coastguard Worker 			conf_read_simple("all.config", S_DEF_USER);
591*cf5a6c84SAndroid Build Coastguard Worker 		break;
592*cf5a6c84SAndroid Build Coastguard Worker 	default:
593*cf5a6c84SAndroid Build Coastguard Worker 		break;
594*cf5a6c84SAndroid Build Coastguard Worker 	}
595*cf5a6c84SAndroid Build Coastguard Worker 
596*cf5a6c84SAndroid Build Coastguard Worker 	if (input_mode != ask_silent) {
597*cf5a6c84SAndroid Build Coastguard Worker 		rootEntry = &rootmenu;
598*cf5a6c84SAndroid Build Coastguard Worker 		conf(&rootmenu);
599*cf5a6c84SAndroid Build Coastguard Worker 		if (input_mode == ask_all) {
600*cf5a6c84SAndroid Build Coastguard Worker 			input_mode = ask_silent;
601*cf5a6c84SAndroid Build Coastguard Worker 			valid_stdin = 1;
602*cf5a6c84SAndroid Build Coastguard Worker 		}
603*cf5a6c84SAndroid Build Coastguard Worker 	} else if (sym_change_count) {
604*cf5a6c84SAndroid Build Coastguard Worker 		name = getenv("KCONFIG_NOSILENTUPDATE");
605*cf5a6c84SAndroid Build Coastguard Worker 		if (name && *name) {
606*cf5a6c84SAndroid Build Coastguard Worker 			fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n"));
607*cf5a6c84SAndroid Build Coastguard Worker 			return 1;
608*cf5a6c84SAndroid Build Coastguard Worker 		}
609*cf5a6c84SAndroid Build Coastguard Worker 	} else
610*cf5a6c84SAndroid Build Coastguard Worker 		goto skip_check;
611*cf5a6c84SAndroid Build Coastguard Worker 
612*cf5a6c84SAndroid Build Coastguard Worker 	do {
613*cf5a6c84SAndroid Build Coastguard Worker 		conf_cnt = 0;
614*cf5a6c84SAndroid Build Coastguard Worker 		check_conf(&rootmenu);
615*cf5a6c84SAndroid Build Coastguard Worker 	} while (conf_cnt);
616*cf5a6c84SAndroid Build Coastguard Worker 
617*cf5a6c84SAndroid Build Coastguard Worker 	if (!conf_write(NULL)) {
618*cf5a6c84SAndroid Build Coastguard Worker skip_check:
619*cf5a6c84SAndroid Build Coastguard Worker 		if (!(input_mode == ask_silent && conf_write_autoconf()))
620*cf5a6c84SAndroid Build Coastguard Worker 			return 0;
621*cf5a6c84SAndroid Build Coastguard Worker 	}
622*cf5a6c84SAndroid Build Coastguard Worker 	fprintf(stderr, _("\n*** Error writing "PROJECT_NAME" configuration.\n\n"));
623*cf5a6c84SAndroid Build Coastguard Worker 	return 1;
624*cf5a6c84SAndroid Build Coastguard Worker }
625