15257cf54a5810105bc4a75703a06740d756d8e8landley/*
25257cf54a5810105bc4a75703a06740d756d8e8landley * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
35257cf54a5810105bc4a75703a06740d756d8e8landley * Released under the terms of the GNU GPL v2.0.
45257cf54a5810105bc4a75703a06740d756d8e8landley */
55257cf54a5810105bc4a75703a06740d756d8e8landley
65257cf54a5810105bc4a75703a06740d756d8e8landley#include <ctype.h>
75257cf54a5810105bc4a75703a06740d756d8e8landley#include <stdlib.h>
85257cf54a5810105bc4a75703a06740d756d8e8landley#include <stdio.h>
95257cf54a5810105bc4a75703a06740d756d8e8landley#include <string.h>
105257cf54a5810105bc4a75703a06740d756d8e8landley#include <unistd.h>
115257cf54a5810105bc4a75703a06740d756d8e8landley#include <time.h>
125257cf54a5810105bc4a75703a06740d756d8e8landley#include <sys/stat.h>
135257cf54a5810105bc4a75703a06740d756d8e8landley
145257cf54a5810105bc4a75703a06740d756d8e8landley#define LKC_DIRECT_LINK
155257cf54a5810105bc4a75703a06740d756d8e8landley#include "lkc.h"
165257cf54a5810105bc4a75703a06740d756d8e8landley
175257cf54a5810105bc4a75703a06740d756d8e8landleystatic void conf(struct menu *menu);
185257cf54a5810105bc4a75703a06740d756d8e8landleystatic void check_conf(struct menu *menu);
195257cf54a5810105bc4a75703a06740d756d8e8landley
205257cf54a5810105bc4a75703a06740d756d8e8landleyenum {
215257cf54a5810105bc4a75703a06740d756d8e8landley	ask_all,
225257cf54a5810105bc4a75703a06740d756d8e8landley	ask_new,
235257cf54a5810105bc4a75703a06740d756d8e8landley	ask_silent,
245257cf54a5810105bc4a75703a06740d756d8e8landley	set_default,
255257cf54a5810105bc4a75703a06740d756d8e8landley	set_yes,
265257cf54a5810105bc4a75703a06740d756d8e8landley	set_mod,
275257cf54a5810105bc4a75703a06740d756d8e8landley	set_no,
285257cf54a5810105bc4a75703a06740d756d8e8landley	set_random
295257cf54a5810105bc4a75703a06740d756d8e8landley} input_mode = ask_all;
305257cf54a5810105bc4a75703a06740d756d8e8landleychar *defconfig_file;
315257cf54a5810105bc4a75703a06740d756d8e8landley
325257cf54a5810105bc4a75703a06740d756d8e8landleystatic int indent = 1;
335257cf54a5810105bc4a75703a06740d756d8e8landleystatic int valid_stdin = 1;
345257cf54a5810105bc4a75703a06740d756d8e8landleystatic int conf_cnt;
355257cf54a5810105bc4a75703a06740d756d8e8landleystatic char line[128];
365257cf54a5810105bc4a75703a06740d756d8e8landleystatic struct menu *rootEntry;
375257cf54a5810105bc4a75703a06740d756d8e8landley
385257cf54a5810105bc4a75703a06740d756d8e8landleystatic char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
395257cf54a5810105bc4a75703a06740d756d8e8landley
405257cf54a5810105bc4a75703a06740d756d8e8landleystatic void strip(char *str)
415257cf54a5810105bc4a75703a06740d756d8e8landley{
425257cf54a5810105bc4a75703a06740d756d8e8landley	char *p = str;
435257cf54a5810105bc4a75703a06740d756d8e8landley	int l;
445257cf54a5810105bc4a75703a06740d756d8e8landley
455257cf54a5810105bc4a75703a06740d756d8e8landley	while ((isspace(*p)))
465257cf54a5810105bc4a75703a06740d756d8e8landley		p++;
475257cf54a5810105bc4a75703a06740d756d8e8landley	l = strlen(p);
485257cf54a5810105bc4a75703a06740d756d8e8landley	if (p != str)
495257cf54a5810105bc4a75703a06740d756d8e8landley		memmove(str, p, l + 1);
505257cf54a5810105bc4a75703a06740d756d8e8landley	if (!l)
515257cf54a5810105bc4a75703a06740d756d8e8landley		return;
525257cf54a5810105bc4a75703a06740d756d8e8landley	p = str + l - 1;
535257cf54a5810105bc4a75703a06740d756d8e8landley	while ((isspace(*p)))
545257cf54a5810105bc4a75703a06740d756d8e8landley		*p-- = 0;
555257cf54a5810105bc4a75703a06740d756d8e8landley}
565257cf54a5810105bc4a75703a06740d756d8e8landley
575257cf54a5810105bc4a75703a06740d756d8e8landleystatic void check_stdin(void)
585257cf54a5810105bc4a75703a06740d756d8e8landley{
595257cf54a5810105bc4a75703a06740d756d8e8landley	if (!valid_stdin && input_mode == ask_silent) {
605257cf54a5810105bc4a75703a06740d756d8e8landley		printf(_("aborted!\n\n"));
615257cf54a5810105bc4a75703a06740d756d8e8landley		printf(_("Console input/output is redirected. "));
625257cf54a5810105bc4a75703a06740d756d8e8landley		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
635257cf54a5810105bc4a75703a06740d756d8e8landley		exit(1);
645257cf54a5810105bc4a75703a06740d756d8e8landley	}
655257cf54a5810105bc4a75703a06740d756d8e8landley}
665257cf54a5810105bc4a75703a06740d756d8e8landley
675257cf54a5810105bc4a75703a06740d756d8e8landleystatic void conf_askvalue(struct symbol *sym, const char *def)
685257cf54a5810105bc4a75703a06740d756d8e8landley{
695257cf54a5810105bc4a75703a06740d756d8e8landley	enum symbol_type type = sym_get_type(sym);
705257cf54a5810105bc4a75703a06740d756d8e8landley	tristate val;
715257cf54a5810105bc4a75703a06740d756d8e8landley
725257cf54a5810105bc4a75703a06740d756d8e8landley	if (!sym_has_value(sym))
735257cf54a5810105bc4a75703a06740d756d8e8landley		printf("(NEW) ");
745257cf54a5810105bc4a75703a06740d756d8e8landley
755257cf54a5810105bc4a75703a06740d756d8e8landley	line[0] = '\n';
765257cf54a5810105bc4a75703a06740d756d8e8landley	line[1] = 0;
775257cf54a5810105bc4a75703a06740d756d8e8landley
785257cf54a5810105bc4a75703a06740d756d8e8landley	if (!sym_is_changable(sym)) {
795257cf54a5810105bc4a75703a06740d756d8e8landley		printf("%s\n", def);
805257cf54a5810105bc4a75703a06740d756d8e8landley		line[0] = '\n';
815257cf54a5810105bc4a75703a06740d756d8e8landley		line[1] = 0;
825257cf54a5810105bc4a75703a06740d756d8e8landley		return;
835257cf54a5810105bc4a75703a06740d756d8e8landley	}
845257cf54a5810105bc4a75703a06740d756d8e8landley
855257cf54a5810105bc4a75703a06740d756d8e8landley	switch (input_mode) {
865257cf54a5810105bc4a75703a06740d756d8e8landley	case set_no:
875257cf54a5810105bc4a75703a06740d756d8e8landley	case set_mod:
885257cf54a5810105bc4a75703a06740d756d8e8landley	case set_yes:
895257cf54a5810105bc4a75703a06740d756d8e8landley	case set_random:
905257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym_has_value(sym)) {
915257cf54a5810105bc4a75703a06740d756d8e8landley			printf("%s\n", def);
925257cf54a5810105bc4a75703a06740d756d8e8landley			return;
935257cf54a5810105bc4a75703a06740d756d8e8landley		}
945257cf54a5810105bc4a75703a06740d756d8e8landley		break;
955257cf54a5810105bc4a75703a06740d756d8e8landley	case ask_new:
965257cf54a5810105bc4a75703a06740d756d8e8landley	case ask_silent:
975257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym_has_value(sym)) {
985257cf54a5810105bc4a75703a06740d756d8e8landley			printf("%s\n", def);
995257cf54a5810105bc4a75703a06740d756d8e8landley			return;
1005257cf54a5810105bc4a75703a06740d756d8e8landley		}
1015257cf54a5810105bc4a75703a06740d756d8e8landley		check_stdin();
1025257cf54a5810105bc4a75703a06740d756d8e8landley	case ask_all:
1035257cf54a5810105bc4a75703a06740d756d8e8landley		fflush(stdout);
1045257cf54a5810105bc4a75703a06740d756d8e8landley		fgets(line, 128, stdin);
1055257cf54a5810105bc4a75703a06740d756d8e8landley		return;
1065257cf54a5810105bc4a75703a06740d756d8e8landley	case set_default:
1075257cf54a5810105bc4a75703a06740d756d8e8landley		printf("%s\n", def);
1085257cf54a5810105bc4a75703a06740d756d8e8landley		return;
1095257cf54a5810105bc4a75703a06740d756d8e8landley	default:
1105257cf54a5810105bc4a75703a06740d756d8e8landley		break;
1115257cf54a5810105bc4a75703a06740d756d8e8landley	}
1125257cf54a5810105bc4a75703a06740d756d8e8landley
1135257cf54a5810105bc4a75703a06740d756d8e8landley	switch (type) {
1145257cf54a5810105bc4a75703a06740d756d8e8landley	case S_INT:
1155257cf54a5810105bc4a75703a06740d756d8e8landley	case S_HEX:
1165257cf54a5810105bc4a75703a06740d756d8e8landley	case S_STRING:
1175257cf54a5810105bc4a75703a06740d756d8e8landley		printf("%s\n", def);
1185257cf54a5810105bc4a75703a06740d756d8e8landley		return;
1195257cf54a5810105bc4a75703a06740d756d8e8landley	default:
1205257cf54a5810105bc4a75703a06740d756d8e8landley		;
1215257cf54a5810105bc4a75703a06740d756d8e8landley	}
1225257cf54a5810105bc4a75703a06740d756d8e8landley	switch (input_mode) {
1235257cf54a5810105bc4a75703a06740d756d8e8landley	case set_yes:
1245257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym_tristate_within_range(sym, yes)) {
1255257cf54a5810105bc4a75703a06740d756d8e8landley			line[0] = 'y';
1265257cf54a5810105bc4a75703a06740d756d8e8landley			line[1] = '\n';
1275257cf54a5810105bc4a75703a06740d756d8e8landley			line[2] = 0;
1285257cf54a5810105bc4a75703a06740d756d8e8landley			break;
1295257cf54a5810105bc4a75703a06740d756d8e8landley		}
1305257cf54a5810105bc4a75703a06740d756d8e8landley	case set_mod:
1315257cf54a5810105bc4a75703a06740d756d8e8landley		if (type == S_TRISTATE) {
1325257cf54a5810105bc4a75703a06740d756d8e8landley			if (sym_tristate_within_range(sym, mod)) {
1335257cf54a5810105bc4a75703a06740d756d8e8landley				line[0] = 'm';
1345257cf54a5810105bc4a75703a06740d756d8e8landley				line[1] = '\n';
1355257cf54a5810105bc4a75703a06740d756d8e8landley				line[2] = 0;
1365257cf54a5810105bc4a75703a06740d756d8e8landley				break;
1375257cf54a5810105bc4a75703a06740d756d8e8landley			}
1385257cf54a5810105bc4a75703a06740d756d8e8landley		} else {
1395257cf54a5810105bc4a75703a06740d756d8e8landley			if (sym_tristate_within_range(sym, yes)) {
1405257cf54a5810105bc4a75703a06740d756d8e8landley				line[0] = 'y';
1415257cf54a5810105bc4a75703a06740d756d8e8landley				line[1] = '\n';
1425257cf54a5810105bc4a75703a06740d756d8e8landley				line[2] = 0;
1435257cf54a5810105bc4a75703a06740d756d8e8landley				break;
1445257cf54a5810105bc4a75703a06740d756d8e8landley			}
1455257cf54a5810105bc4a75703a06740d756d8e8landley		}
1465257cf54a5810105bc4a75703a06740d756d8e8landley	case set_no:
1475257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym_tristate_within_range(sym, no)) {
1485257cf54a5810105bc4a75703a06740d756d8e8landley			line[0] = 'n';
1495257cf54a5810105bc4a75703a06740d756d8e8landley			line[1] = '\n';
1505257cf54a5810105bc4a75703a06740d756d8e8landley			line[2] = 0;
1515257cf54a5810105bc4a75703a06740d756d8e8landley			break;
1525257cf54a5810105bc4a75703a06740d756d8e8landley		}
1535257cf54a5810105bc4a75703a06740d756d8e8landley	case set_random:
1545257cf54a5810105bc4a75703a06740d756d8e8landley		do {
1555257cf54a5810105bc4a75703a06740d756d8e8landley			val = (tristate)(random() % 3);
1565257cf54a5810105bc4a75703a06740d756d8e8landley		} while (!sym_tristate_within_range(sym, val));
1575257cf54a5810105bc4a75703a06740d756d8e8landley		switch (val) {
1585257cf54a5810105bc4a75703a06740d756d8e8landley		case no: line[0] = 'n'; break;
1595257cf54a5810105bc4a75703a06740d756d8e8landley		case mod: line[0] = 'm'; break;
1605257cf54a5810105bc4a75703a06740d756d8e8landley		case yes: line[0] = 'y'; break;
1615257cf54a5810105bc4a75703a06740d756d8e8landley		}
1625257cf54a5810105bc4a75703a06740d756d8e8landley		line[1] = '\n';
1635257cf54a5810105bc4a75703a06740d756d8e8landley		line[2] = 0;
1645257cf54a5810105bc4a75703a06740d756d8e8landley		break;
1655257cf54a5810105bc4a75703a06740d756d8e8landley	default:
1665257cf54a5810105bc4a75703a06740d756d8e8landley		break;
1675257cf54a5810105bc4a75703a06740d756d8e8landley	}
1685257cf54a5810105bc4a75703a06740d756d8e8landley	printf("%s", line);
1695257cf54a5810105bc4a75703a06740d756d8e8landley}
1705257cf54a5810105bc4a75703a06740d756d8e8landley
1715257cf54a5810105bc4a75703a06740d756d8e8landleyint conf_string(struct menu *menu)
1725257cf54a5810105bc4a75703a06740d756d8e8landley{
1735257cf54a5810105bc4a75703a06740d756d8e8landley	struct symbol *sym = menu->sym;
1745257cf54a5810105bc4a75703a06740d756d8e8landley	const char *def, *help;
1755257cf54a5810105bc4a75703a06740d756d8e8landley
1765257cf54a5810105bc4a75703a06740d756d8e8landley	while (1) {
1775257cf54a5810105bc4a75703a06740d756d8e8landley		printf("%*s%s ", indent - 1, "", menu->prompt->text);
1785257cf54a5810105bc4a75703a06740d756d8e8landley		printf("(%s) ", sym->name);
1795257cf54a5810105bc4a75703a06740d756d8e8landley		def = sym_get_string_value(sym);
1805257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym_get_string_value(sym))
1815257cf54a5810105bc4a75703a06740d756d8e8landley			printf("[%s] ", def);
1825257cf54a5810105bc4a75703a06740d756d8e8landley		conf_askvalue(sym, def);
1835257cf54a5810105bc4a75703a06740d756d8e8landley		switch (line[0]) {
1845257cf54a5810105bc4a75703a06740d756d8e8landley		case '\n':
1855257cf54a5810105bc4a75703a06740d756d8e8landley			break;
1865257cf54a5810105bc4a75703a06740d756d8e8landley		case '?':
1875257cf54a5810105bc4a75703a06740d756d8e8landley			/* print help */
1885257cf54a5810105bc4a75703a06740d756d8e8landley			if (line[1] == '\n') {
1895257cf54a5810105bc4a75703a06740d756d8e8landley				help = nohelp_text;
1905257cf54a5810105bc4a75703a06740d756d8e8landley				if (menu->sym->help)
1915257cf54a5810105bc4a75703a06740d756d8e8landley					help = menu->sym->help;
1925257cf54a5810105bc4a75703a06740d756d8e8landley				printf("\n%s\n", menu->sym->help);
1935257cf54a5810105bc4a75703a06740d756d8e8landley				def = NULL;
1945257cf54a5810105bc4a75703a06740d756d8e8landley				break;
1955257cf54a5810105bc4a75703a06740d756d8e8landley			}
1965257cf54a5810105bc4a75703a06740d756d8e8landley		default:
1975257cf54a5810105bc4a75703a06740d756d8e8landley			line[strlen(line)-1] = 0;
1985257cf54a5810105bc4a75703a06740d756d8e8landley			def = line;
1995257cf54a5810105bc4a75703a06740d756d8e8landley		}
2005257cf54a5810105bc4a75703a06740d756d8e8landley		if (def && sym_set_string_value(sym, def))
2015257cf54a5810105bc4a75703a06740d756d8e8landley			return 0;
2025257cf54a5810105bc4a75703a06740d756d8e8landley	}
2035257cf54a5810105bc4a75703a06740d756d8e8landley}
2045257cf54a5810105bc4a75703a06740d756d8e8landley
2055257cf54a5810105bc4a75703a06740d756d8e8landleystatic int conf_sym(struct menu *menu)
2065257cf54a5810105bc4a75703a06740d756d8e8landley{
2075257cf54a5810105bc4a75703a06740d756d8e8landley	struct symbol *sym = menu->sym;
2085257cf54a5810105bc4a75703a06740d756d8e8landley	int type;
2095257cf54a5810105bc4a75703a06740d756d8e8landley	tristate oldval, newval;
2105257cf54a5810105bc4a75703a06740d756d8e8landley	const char *help;
2115257cf54a5810105bc4a75703a06740d756d8e8landley
2125257cf54a5810105bc4a75703a06740d756d8e8landley	while (1) {
2135257cf54a5810105bc4a75703a06740d756d8e8landley		printf("%*s%s ", indent - 1, "", menu->prompt->text);
2145257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym->name)
2155257cf54a5810105bc4a75703a06740d756d8e8landley			printf("(%s) ", sym->name);
2165257cf54a5810105bc4a75703a06740d756d8e8landley		type = sym_get_type(sym);
2175257cf54a5810105bc4a75703a06740d756d8e8landley		putchar('[');
2185257cf54a5810105bc4a75703a06740d756d8e8landley		oldval = sym_get_tristate_value(sym);
2195257cf54a5810105bc4a75703a06740d756d8e8landley		switch (oldval) {
2205257cf54a5810105bc4a75703a06740d756d8e8landley		case no:
2215257cf54a5810105bc4a75703a06740d756d8e8landley			putchar('N');
2225257cf54a5810105bc4a75703a06740d756d8e8landley			break;
2235257cf54a5810105bc4a75703a06740d756d8e8landley		case mod:
2245257cf54a5810105bc4a75703a06740d756d8e8landley			putchar('M');
2255257cf54a5810105bc4a75703a06740d756d8e8landley			break;
2265257cf54a5810105bc4a75703a06740d756d8e8landley		case yes:
2275257cf54a5810105bc4a75703a06740d756d8e8landley			putchar('Y');
2285257cf54a5810105bc4a75703a06740d756d8e8landley			break;
2295257cf54a5810105bc4a75703a06740d756d8e8landley		}
2305257cf54a5810105bc4a75703a06740d756d8e8landley		if (oldval != no && sym_tristate_within_range(sym, no))
2315257cf54a5810105bc4a75703a06740d756d8e8landley			printf("/n");
2325257cf54a5810105bc4a75703a06740d756d8e8landley		if (oldval != mod && sym_tristate_within_range(sym, mod))
2335257cf54a5810105bc4a75703a06740d756d8e8landley			printf("/m");
2345257cf54a5810105bc4a75703a06740d756d8e8landley		if (oldval != yes && sym_tristate_within_range(sym, yes))
2355257cf54a5810105bc4a75703a06740d756d8e8landley			printf("/y");
2365257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym->help)
2375257cf54a5810105bc4a75703a06740d756d8e8landley			printf("/?");
2385257cf54a5810105bc4a75703a06740d756d8e8landley		printf("] ");
2395257cf54a5810105bc4a75703a06740d756d8e8landley		conf_askvalue(sym, sym_get_string_value(sym));
2405257cf54a5810105bc4a75703a06740d756d8e8landley		strip(line);
2415257cf54a5810105bc4a75703a06740d756d8e8landley
2425257cf54a5810105bc4a75703a06740d756d8e8landley		switch (line[0]) {
2435257cf54a5810105bc4a75703a06740d756d8e8landley		case 'n':
2445257cf54a5810105bc4a75703a06740d756d8e8landley		case 'N':
2455257cf54a5810105bc4a75703a06740d756d8e8landley			newval = no;
2465257cf54a5810105bc4a75703a06740d756d8e8landley			if (!line[1] || !strcmp(&line[1], "o"))
2475257cf54a5810105bc4a75703a06740d756d8e8landley				break;
2485257cf54a5810105bc4a75703a06740d756d8e8landley			continue;
2495257cf54a5810105bc4a75703a06740d756d8e8landley		case 'm':
2505257cf54a5810105bc4a75703a06740d756d8e8landley		case 'M':
2515257cf54a5810105bc4a75703a06740d756d8e8landley			newval = mod;
2525257cf54a5810105bc4a75703a06740d756d8e8landley			if (!line[1])
2535257cf54a5810105bc4a75703a06740d756d8e8landley				break;
2545257cf54a5810105bc4a75703a06740d756d8e8landley			continue;
2555257cf54a5810105bc4a75703a06740d756d8e8landley		case 'y':
2565257cf54a5810105bc4a75703a06740d756d8e8landley		case 'Y':
2575257cf54a5810105bc4a75703a06740d756d8e8landley			newval = yes;
2585257cf54a5810105bc4a75703a06740d756d8e8landley			if (!line[1] || !strcmp(&line[1], "es"))
2595257cf54a5810105bc4a75703a06740d756d8e8landley				break;
2605257cf54a5810105bc4a75703a06740d756d8e8landley			continue;
2615257cf54a5810105bc4a75703a06740d756d8e8landley		case 0:
2625257cf54a5810105bc4a75703a06740d756d8e8landley			newval = oldval;
2635257cf54a5810105bc4a75703a06740d756d8e8landley			break;
2645257cf54a5810105bc4a75703a06740d756d8e8landley		case '?':
2655257cf54a5810105bc4a75703a06740d756d8e8landley			goto help;
2665257cf54a5810105bc4a75703a06740d756d8e8landley		default:
2675257cf54a5810105bc4a75703a06740d756d8e8landley			continue;
2685257cf54a5810105bc4a75703a06740d756d8e8landley		}
2695257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym_set_tristate_value(sym, newval))
2705257cf54a5810105bc4a75703a06740d756d8e8landley			return 0;
2715257cf54a5810105bc4a75703a06740d756d8e8landleyhelp:
2725257cf54a5810105bc4a75703a06740d756d8e8landley		help = nohelp_text;
2735257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym->help)
2745257cf54a5810105bc4a75703a06740d756d8e8landley			help = sym->help;
2755257cf54a5810105bc4a75703a06740d756d8e8landley		printf("\n%s\n", help);
2765257cf54a5810105bc4a75703a06740d756d8e8landley	}
2775257cf54a5810105bc4a75703a06740d756d8e8landley}
2785257cf54a5810105bc4a75703a06740d756d8e8landley
2795257cf54a5810105bc4a75703a06740d756d8e8landleystatic int conf_choice(struct menu *menu)
2805257cf54a5810105bc4a75703a06740d756d8e8landley{
2815257cf54a5810105bc4a75703a06740d756d8e8landley	struct symbol *sym, *def_sym;
2825257cf54a5810105bc4a75703a06740d756d8e8landley	struct menu *child;
2835257cf54a5810105bc4a75703a06740d756d8e8landley	int type;
2845257cf54a5810105bc4a75703a06740d756d8e8landley	bool is_new;
2855257cf54a5810105bc4a75703a06740d756d8e8landley
2865257cf54a5810105bc4a75703a06740d756d8e8landley	sym = menu->sym;
2875257cf54a5810105bc4a75703a06740d756d8e8landley	type = sym_get_type(sym);
2885257cf54a5810105bc4a75703a06740d756d8e8landley	is_new = !sym_has_value(sym);
2895257cf54a5810105bc4a75703a06740d756d8e8landley	if (sym_is_changable(sym)) {
2905257cf54a5810105bc4a75703a06740d756d8e8landley		conf_sym(menu);
2915257cf54a5810105bc4a75703a06740d756d8e8landley		sym_calc_value(sym);
2925257cf54a5810105bc4a75703a06740d756d8e8landley		switch (sym_get_tristate_value(sym)) {
2935257cf54a5810105bc4a75703a06740d756d8e8landley		case no:
2945257cf54a5810105bc4a75703a06740d756d8e8landley			return 1;
2955257cf54a5810105bc4a75703a06740d756d8e8landley		case mod:
2965257cf54a5810105bc4a75703a06740d756d8e8landley			return 0;
2975257cf54a5810105bc4a75703a06740d756d8e8landley		case yes:
2985257cf54a5810105bc4a75703a06740d756d8e8landley			break;
2995257cf54a5810105bc4a75703a06740d756d8e8landley		}
3005257cf54a5810105bc4a75703a06740d756d8e8landley	} else {
3015257cf54a5810105bc4a75703a06740d756d8e8landley		switch (sym_get_tristate_value(sym)) {
3025257cf54a5810105bc4a75703a06740d756d8e8landley		case no:
3035257cf54a5810105bc4a75703a06740d756d8e8landley			return 1;
3045257cf54a5810105bc4a75703a06740d756d8e8landley		case mod:
3055257cf54a5810105bc4a75703a06740d756d8e8landley			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
3065257cf54a5810105bc4a75703a06740d756d8e8landley			return 0;
3075257cf54a5810105bc4a75703a06740d756d8e8landley		case yes:
3085257cf54a5810105bc4a75703a06740d756d8e8landley			break;
3095257cf54a5810105bc4a75703a06740d756d8e8landley		}
3105257cf54a5810105bc4a75703a06740d756d8e8landley	}
3115257cf54a5810105bc4a75703a06740d756d8e8landley
3125257cf54a5810105bc4a75703a06740d756d8e8landley	while (1) {
3135257cf54a5810105bc4a75703a06740d756d8e8landley		int cnt, def;
3145257cf54a5810105bc4a75703a06740d756d8e8landley
3155257cf54a5810105bc4a75703a06740d756d8e8landley		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
3165257cf54a5810105bc4a75703a06740d756d8e8landley		def_sym = sym_get_choice_value(sym);
3175257cf54a5810105bc4a75703a06740d756d8e8landley		cnt = def = 0;
3185257cf54a5810105bc4a75703a06740d756d8e8landley		line[0] = 0;
3195257cf54a5810105bc4a75703a06740d756d8e8landley		for (child = menu->list; child; child = child->next) {
3205257cf54a5810105bc4a75703a06740d756d8e8landley			if (!menu_is_visible(child))
3215257cf54a5810105bc4a75703a06740d756d8e8landley				continue;
3225257cf54a5810105bc4a75703a06740d756d8e8landley			if (!child->sym) {
3235257cf54a5810105bc4a75703a06740d756d8e8landley				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
3245257cf54a5810105bc4a75703a06740d756d8e8landley				continue;
3255257cf54a5810105bc4a75703a06740d756d8e8landley			}
3265257cf54a5810105bc4a75703a06740d756d8e8landley			cnt++;
3275257cf54a5810105bc4a75703a06740d756d8e8landley			if (child->sym == def_sym) {
3285257cf54a5810105bc4a75703a06740d756d8e8landley				def = cnt;
3295257cf54a5810105bc4a75703a06740d756d8e8landley				printf("%*c", indent, '>');
3305257cf54a5810105bc4a75703a06740d756d8e8landley			} else
3315257cf54a5810105bc4a75703a06740d756d8e8landley				printf("%*c", indent, ' ');
3325257cf54a5810105bc4a75703a06740d756d8e8landley			printf(" %d. %s", cnt, menu_get_prompt(child));
3335257cf54a5810105bc4a75703a06740d756d8e8landley			if (child->sym->name)
3345257cf54a5810105bc4a75703a06740d756d8e8landley				printf(" (%s)", child->sym->name);
3355257cf54a5810105bc4a75703a06740d756d8e8landley			if (!sym_has_value(child->sym))
3365257cf54a5810105bc4a75703a06740d756d8e8landley				printf(" (NEW)");
3375257cf54a5810105bc4a75703a06740d756d8e8landley			printf("\n");
3385257cf54a5810105bc4a75703a06740d756d8e8landley		}
3395257cf54a5810105bc4a75703a06740d756d8e8landley		printf("%*schoice", indent - 1, "");
3405257cf54a5810105bc4a75703a06740d756d8e8landley		if (cnt == 1) {
3415257cf54a5810105bc4a75703a06740d756d8e8landley			printf("[1]: 1\n");
3425257cf54a5810105bc4a75703a06740d756d8e8landley			goto conf_childs;
3435257cf54a5810105bc4a75703a06740d756d8e8landley		}
3445257cf54a5810105bc4a75703a06740d756d8e8landley		printf("[1-%d", cnt);
3455257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym->help)
3465257cf54a5810105bc4a75703a06740d756d8e8landley			printf("?");
3475257cf54a5810105bc4a75703a06740d756d8e8landley		printf("]: ");
3485257cf54a5810105bc4a75703a06740d756d8e8landley		switch (input_mode) {
3495257cf54a5810105bc4a75703a06740d756d8e8landley		case ask_new:
3505257cf54a5810105bc4a75703a06740d756d8e8landley		case ask_silent:
3515257cf54a5810105bc4a75703a06740d756d8e8landley			if (!is_new) {
3525257cf54a5810105bc4a75703a06740d756d8e8landley				cnt = def;
3535257cf54a5810105bc4a75703a06740d756d8e8landley				printf("%d\n", cnt);
3545257cf54a5810105bc4a75703a06740d756d8e8landley				break;
3555257cf54a5810105bc4a75703a06740d756d8e8landley			}
3565257cf54a5810105bc4a75703a06740d756d8e8landley			check_stdin();
3575257cf54a5810105bc4a75703a06740d756d8e8landley		case ask_all:
3585257cf54a5810105bc4a75703a06740d756d8e8landley			fflush(stdout);
3595257cf54a5810105bc4a75703a06740d756d8e8landley			fgets(line, 128, stdin);
3605257cf54a5810105bc4a75703a06740d756d8e8landley			strip(line);
3615257cf54a5810105bc4a75703a06740d756d8e8landley			if (line[0] == '?') {
3625257cf54a5810105bc4a75703a06740d756d8e8landley				printf("\n%s\n", menu->sym->help ?
3635257cf54a5810105bc4a75703a06740d756d8e8landley					menu->sym->help : nohelp_text);
3645257cf54a5810105bc4a75703a06740d756d8e8landley				continue;
3655257cf54a5810105bc4a75703a06740d756d8e8landley			}
3665257cf54a5810105bc4a75703a06740d756d8e8landley			if (!line[0])
3675257cf54a5810105bc4a75703a06740d756d8e8landley				cnt = def;
3685257cf54a5810105bc4a75703a06740d756d8e8landley			else if (isdigit(line[0]))
3695257cf54a5810105bc4a75703a06740d756d8e8landley				cnt = atoi(line);
3705257cf54a5810105bc4a75703a06740d756d8e8landley			else
3715257cf54a5810105bc4a75703a06740d756d8e8landley				continue;
3725257cf54a5810105bc4a75703a06740d756d8e8landley			break;
3735257cf54a5810105bc4a75703a06740d756d8e8landley		case set_random:
3745257cf54a5810105bc4a75703a06740d756d8e8landley			def = (random() % cnt) + 1;
3755257cf54a5810105bc4a75703a06740d756d8e8landley		case set_default:
3765257cf54a5810105bc4a75703a06740d756d8e8landley		case set_yes:
3775257cf54a5810105bc4a75703a06740d756d8e8landley		case set_mod:
3785257cf54a5810105bc4a75703a06740d756d8e8landley		case set_no:
3795257cf54a5810105bc4a75703a06740d756d8e8landley			cnt = def;
3805257cf54a5810105bc4a75703a06740d756d8e8landley			printf("%d\n", cnt);
3815257cf54a5810105bc4a75703a06740d756d8e8landley			break;
3825257cf54a5810105bc4a75703a06740d756d8e8landley		}
3835257cf54a5810105bc4a75703a06740d756d8e8landley
3845257cf54a5810105bc4a75703a06740d756d8e8landley	conf_childs:
3855257cf54a5810105bc4a75703a06740d756d8e8landley		for (child = menu->list; child; child = child->next) {
3865257cf54a5810105bc4a75703a06740d756d8e8landley			if (!child->sym || !menu_is_visible(child))
3875257cf54a5810105bc4a75703a06740d756d8e8landley				continue;
3885257cf54a5810105bc4a75703a06740d756d8e8landley			if (!--cnt)
3895257cf54a5810105bc4a75703a06740d756d8e8landley				break;
3905257cf54a5810105bc4a75703a06740d756d8e8landley		}
3915257cf54a5810105bc4a75703a06740d756d8e8landley		if (!child)
3925257cf54a5810105bc4a75703a06740d756d8e8landley			continue;
3935257cf54a5810105bc4a75703a06740d756d8e8landley		if (line[strlen(line) - 1] == '?') {
3945257cf54a5810105bc4a75703a06740d756d8e8landley			printf("\n%s\n", child->sym->help ?
3955257cf54a5810105bc4a75703a06740d756d8e8landley				child->sym->help : nohelp_text);
3965257cf54a5810105bc4a75703a06740d756d8e8landley			continue;
3975257cf54a5810105bc4a75703a06740d756d8e8landley		}
3985257cf54a5810105bc4a75703a06740d756d8e8landley		sym_set_choice_value(sym, child->sym);
3995257cf54a5810105bc4a75703a06740d756d8e8landley		if (child->list) {
4005257cf54a5810105bc4a75703a06740d756d8e8landley			indent += 2;
4015257cf54a5810105bc4a75703a06740d756d8e8landley			conf(child->list);
4025257cf54a5810105bc4a75703a06740d756d8e8landley			indent -= 2;
4035257cf54a5810105bc4a75703a06740d756d8e8landley		}
4045257cf54a5810105bc4a75703a06740d756d8e8landley		return 1;
4055257cf54a5810105bc4a75703a06740d756d8e8landley	}
4065257cf54a5810105bc4a75703a06740d756d8e8landley}
4075257cf54a5810105bc4a75703a06740d756d8e8landley
4085257cf54a5810105bc4a75703a06740d756d8e8landleystatic void conf(struct menu *menu)
4095257cf54a5810105bc4a75703a06740d756d8e8landley{
4105257cf54a5810105bc4a75703a06740d756d8e8landley	struct symbol *sym;
4115257cf54a5810105bc4a75703a06740d756d8e8landley	struct property *prop;
4125257cf54a5810105bc4a75703a06740d756d8e8landley	struct menu *child;
4135257cf54a5810105bc4a75703a06740d756d8e8landley
4145257cf54a5810105bc4a75703a06740d756d8e8landley	if (!menu_is_visible(menu))
4155257cf54a5810105bc4a75703a06740d756d8e8landley		return;
4165257cf54a5810105bc4a75703a06740d756d8e8landley
4175257cf54a5810105bc4a75703a06740d756d8e8landley	sym = menu->sym;
4185257cf54a5810105bc4a75703a06740d756d8e8landley	prop = menu->prompt;
4195257cf54a5810105bc4a75703a06740d756d8e8landley	if (prop) {
4205257cf54a5810105bc4a75703a06740d756d8e8landley		const char *prompt;
4215257cf54a5810105bc4a75703a06740d756d8e8landley
4225257cf54a5810105bc4a75703a06740d756d8e8landley		switch (prop->type) {
4235257cf54a5810105bc4a75703a06740d756d8e8landley		case P_MENU:
4245257cf54a5810105bc4a75703a06740d756d8e8landley			if (input_mode == ask_silent && rootEntry != menu) {
4255257cf54a5810105bc4a75703a06740d756d8e8landley				check_conf(menu);
4265257cf54a5810105bc4a75703a06740d756d8e8landley				return;
4275257cf54a5810105bc4a75703a06740d756d8e8landley			}
4285257cf54a5810105bc4a75703a06740d756d8e8landley		case P_COMMENT:
4295257cf54a5810105bc4a75703a06740d756d8e8landley			prompt = menu_get_prompt(menu);
4305257cf54a5810105bc4a75703a06740d756d8e8landley			if (prompt)
4315257cf54a5810105bc4a75703a06740d756d8e8landley				printf("%*c\n%*c %s\n%*c\n",
4325257cf54a5810105bc4a75703a06740d756d8e8landley					indent, '*',
4335257cf54a5810105bc4a75703a06740d756d8e8landley					indent, '*', prompt,
4345257cf54a5810105bc4a75703a06740d756d8e8landley					indent, '*');
4355257cf54a5810105bc4a75703a06740d756d8e8landley		default:
4365257cf54a5810105bc4a75703a06740d756d8e8landley			;
4375257cf54a5810105bc4a75703a06740d756d8e8landley		}
4385257cf54a5810105bc4a75703a06740d756d8e8landley	}
4395257cf54a5810105bc4a75703a06740d756d8e8landley
4405257cf54a5810105bc4a75703a06740d756d8e8landley	if (!sym)
4415257cf54a5810105bc4a75703a06740d756d8e8landley		goto conf_childs;
4425257cf54a5810105bc4a75703a06740d756d8e8landley
4435257cf54a5810105bc4a75703a06740d756d8e8landley	if (sym_is_choice(sym)) {
4445257cf54a5810105bc4a75703a06740d756d8e8landley		conf_choice(menu);
4455257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym->curr.tri != mod)
4465257cf54a5810105bc4a75703a06740d756d8e8landley			return;
4475257cf54a5810105bc4a75703a06740d756d8e8landley		goto conf_childs;
4485257cf54a5810105bc4a75703a06740d756d8e8landley	}
4495257cf54a5810105bc4a75703a06740d756d8e8landley
4505257cf54a5810105bc4a75703a06740d756d8e8landley	switch (sym->type) {
4515257cf54a5810105bc4a75703a06740d756d8e8landley	case S_INT:
4525257cf54a5810105bc4a75703a06740d756d8e8landley	case S_HEX:
4535257cf54a5810105bc4a75703a06740d756d8e8landley	case S_STRING:
4545257cf54a5810105bc4a75703a06740d756d8e8landley		conf_string(menu);
4555257cf54a5810105bc4a75703a06740d756d8e8landley		break;
4565257cf54a5810105bc4a75703a06740d756d8e8landley	default:
4575257cf54a5810105bc4a75703a06740d756d8e8landley		conf_sym(menu);
4585257cf54a5810105bc4a75703a06740d756d8e8landley		break;
4595257cf54a5810105bc4a75703a06740d756d8e8landley	}
4605257cf54a5810105bc4a75703a06740d756d8e8landley
4615257cf54a5810105bc4a75703a06740d756d8e8landleyconf_childs:
4625257cf54a5810105bc4a75703a06740d756d8e8landley	if (sym)
4635257cf54a5810105bc4a75703a06740d756d8e8landley		indent += 2;
4645257cf54a5810105bc4a75703a06740d756d8e8landley	for (child = menu->list; child; child = child->next)
4655257cf54a5810105bc4a75703a06740d756d8e8landley		conf(child);
4665257cf54a5810105bc4a75703a06740d756d8e8landley	if (sym)
4675257cf54a5810105bc4a75703a06740d756d8e8landley		indent -= 2;
4685257cf54a5810105bc4a75703a06740d756d8e8landley}
4695257cf54a5810105bc4a75703a06740d756d8e8landley
4705257cf54a5810105bc4a75703a06740d756d8e8landleystatic void check_conf(struct menu *menu)
4715257cf54a5810105bc4a75703a06740d756d8e8landley{
4725257cf54a5810105bc4a75703a06740d756d8e8landley	struct symbol *sym;
4735257cf54a5810105bc4a75703a06740d756d8e8landley	struct menu *child;
4745257cf54a5810105bc4a75703a06740d756d8e8landley
4755257cf54a5810105bc4a75703a06740d756d8e8landley	if (!menu_is_visible(menu))
4765257cf54a5810105bc4a75703a06740d756d8e8landley		return;
4775257cf54a5810105bc4a75703a06740d756d8e8landley
4785257cf54a5810105bc4a75703a06740d756d8e8landley	sym = menu->sym;
4795257cf54a5810105bc4a75703a06740d756d8e8landley	if (sym && !sym_has_value(sym)) {
4805257cf54a5810105bc4a75703a06740d756d8e8landley		if (sym_is_changable(sym) ||
4815257cf54a5810105bc4a75703a06740d756d8e8landley		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
4825257cf54a5810105bc4a75703a06740d756d8e8landley			if (!conf_cnt++)
4835257cf54a5810105bc4a75703a06740d756d8e8landley				printf(_("*\n* Restart config...\n*\n"));
4845257cf54a5810105bc4a75703a06740d756d8e8landley			rootEntry = menu_get_parent_menu(menu);
4855257cf54a5810105bc4a75703a06740d756d8e8landley			conf(rootEntry);
4865257cf54a5810105bc4a75703a06740d756d8e8landley		}
4875257cf54a5810105bc4a75703a06740d756d8e8landley	}
4885257cf54a5810105bc4a75703a06740d756d8e8landley
4895257cf54a5810105bc4a75703a06740d756d8e8landley	for (child = menu->list; child; child = child->next)
4905257cf54a5810105bc4a75703a06740d756d8e8landley		check_conf(child);
4915257cf54a5810105bc4a75703a06740d756d8e8landley}
4925257cf54a5810105bc4a75703a06740d756d8e8landley
4935257cf54a5810105bc4a75703a06740d756d8e8landleyint main(int ac, char **av)
4945257cf54a5810105bc4a75703a06740d756d8e8landley{
4955257cf54a5810105bc4a75703a06740d756d8e8landley	int i = 1;
4965257cf54a5810105bc4a75703a06740d756d8e8landley	const char *name;
4975257cf54a5810105bc4a75703a06740d756d8e8landley	struct stat tmpstat;
4985257cf54a5810105bc4a75703a06740d756d8e8landley
4995257cf54a5810105bc4a75703a06740d756d8e8landley	if (ac > i && av[i][0] == '-') {
5005257cf54a5810105bc4a75703a06740d756d8e8landley		switch (av[i++][1]) {
5015257cf54a5810105bc4a75703a06740d756d8e8landley		case 'o':
5025257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = ask_new;
5035257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5045257cf54a5810105bc4a75703a06740d756d8e8landley		case 's':
5055257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = ask_silent;
5065257cf54a5810105bc4a75703a06740d756d8e8landley			valid_stdin = isatty(0) && isatty(1) && isatty(2);
5075257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5085257cf54a5810105bc4a75703a06740d756d8e8landley		case 'd':
5095257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = set_default;
5105257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5115257cf54a5810105bc4a75703a06740d756d8e8landley		case 'D':
5125257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = set_default;
5135257cf54a5810105bc4a75703a06740d756d8e8landley			defconfig_file = av[i++];
5145257cf54a5810105bc4a75703a06740d756d8e8landley			if (!defconfig_file) {
5155257cf54a5810105bc4a75703a06740d756d8e8landley				printf(_("%s: No default config file specified\n"),
5165257cf54a5810105bc4a75703a06740d756d8e8landley					av[0]);
5175257cf54a5810105bc4a75703a06740d756d8e8landley				exit(1);
5185257cf54a5810105bc4a75703a06740d756d8e8landley			}
5195257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5205257cf54a5810105bc4a75703a06740d756d8e8landley		case 'n':
5215257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = set_no;
5225257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5235257cf54a5810105bc4a75703a06740d756d8e8landley		case 'm':
5245257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = set_mod;
5255257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5265257cf54a5810105bc4a75703a06740d756d8e8landley		case 'y':
5275257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = set_yes;
5285257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5295257cf54a5810105bc4a75703a06740d756d8e8landley		case 'r':
5305257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = set_random;
5315257cf54a5810105bc4a75703a06740d756d8e8landley			srandom(time(NULL));
5325257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5335257cf54a5810105bc4a75703a06740d756d8e8landley		case 'h':
5345257cf54a5810105bc4a75703a06740d756d8e8landley		case '?':
5355257cf54a5810105bc4a75703a06740d756d8e8landley			fprintf(stderr, "See README for usage info\n");
5365257cf54a5810105bc4a75703a06740d756d8e8landley			exit(0);
5375257cf54a5810105bc4a75703a06740d756d8e8landley		}
5385257cf54a5810105bc4a75703a06740d756d8e8landley	}
5395257cf54a5810105bc4a75703a06740d756d8e8landley  	name = av[i];
5405257cf54a5810105bc4a75703a06740d756d8e8landley	if (!name) {
5415257cf54a5810105bc4a75703a06740d756d8e8landley		printf(_("%s: Kconfig file missing\n"), av[0]);
5425257cf54a5810105bc4a75703a06740d756d8e8landley		exit(1);
5435257cf54a5810105bc4a75703a06740d756d8e8landley	}
5445257cf54a5810105bc4a75703a06740d756d8e8landley	conf_parse(name);
5455257cf54a5810105bc4a75703a06740d756d8e8landley	//zconfdump(stdout);
5465257cf54a5810105bc4a75703a06740d756d8e8landley	switch (input_mode) {
5475257cf54a5810105bc4a75703a06740d756d8e8landley	case set_default:
5485257cf54a5810105bc4a75703a06740d756d8e8landley		if (!defconfig_file)
5495257cf54a5810105bc4a75703a06740d756d8e8landley			defconfig_file = conf_get_default_confname();
5505257cf54a5810105bc4a75703a06740d756d8e8landley		if (conf_read(defconfig_file)) {
5515257cf54a5810105bc4a75703a06740d756d8e8landley			printf("***\n"
5525257cf54a5810105bc4a75703a06740d756d8e8landley				"*** Can't find default configuration \"%s\"!\n"
5535257cf54a5810105bc4a75703a06740d756d8e8landley				"***\n", defconfig_file);
5545257cf54a5810105bc4a75703a06740d756d8e8landley			exit(1);
5555257cf54a5810105bc4a75703a06740d756d8e8landley		}
5565257cf54a5810105bc4a75703a06740d756d8e8landley		break;
5575257cf54a5810105bc4a75703a06740d756d8e8landley	case ask_silent:
5585257cf54a5810105bc4a75703a06740d756d8e8landley		if (stat(".config", &tmpstat)) {
5595257cf54a5810105bc4a75703a06740d756d8e8landley			printf(_("***\n"
5605257cf54a5810105bc4a75703a06740d756d8e8landley				"*** You have not yet configured your "PROJECT_NAME"!\n"
5615257cf54a5810105bc4a75703a06740d756d8e8landley				"***\n"
5625257cf54a5810105bc4a75703a06740d756d8e8landley				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
5635257cf54a5810105bc4a75703a06740d756d8e8landley				"*** \"make menuconfig\" or \"make xconfig\").\n"
5645257cf54a5810105bc4a75703a06740d756d8e8landley				"***\n"));
5655257cf54a5810105bc4a75703a06740d756d8e8landley			exit(1);
5665257cf54a5810105bc4a75703a06740d756d8e8landley		}
5675257cf54a5810105bc4a75703a06740d756d8e8landley	case ask_all:
5685257cf54a5810105bc4a75703a06740d756d8e8landley	case ask_new:
5695257cf54a5810105bc4a75703a06740d756d8e8landley		conf_read(NULL);
5705257cf54a5810105bc4a75703a06740d756d8e8landley		break;
5715257cf54a5810105bc4a75703a06740d756d8e8landley	case set_no:
5725257cf54a5810105bc4a75703a06740d756d8e8landley	case set_mod:
5735257cf54a5810105bc4a75703a06740d756d8e8landley	case set_yes:
5745257cf54a5810105bc4a75703a06740d756d8e8landley	case set_random:
5755257cf54a5810105bc4a75703a06740d756d8e8landley		name = getenv("KCONFIG_ALLCONFIG");
5765257cf54a5810105bc4a75703a06740d756d8e8landley		if (name && !stat(name, &tmpstat)) {
5775257cf54a5810105bc4a75703a06740d756d8e8landley			conf_read_simple(name, S_DEF_USER);
5785257cf54a5810105bc4a75703a06740d756d8e8landley			break;
5795257cf54a5810105bc4a75703a06740d756d8e8landley		}
5805257cf54a5810105bc4a75703a06740d756d8e8landley		switch (input_mode) {
5815257cf54a5810105bc4a75703a06740d756d8e8landley		case set_no:	 name = "allno.config"; break;
5825257cf54a5810105bc4a75703a06740d756d8e8landley		case set_mod:	 name = "allmod.config"; break;
5835257cf54a5810105bc4a75703a06740d756d8e8landley		case set_yes:	 name = "allyes.config"; break;
5845257cf54a5810105bc4a75703a06740d756d8e8landley		case set_random: name = "allrandom.config"; break;
5855257cf54a5810105bc4a75703a06740d756d8e8landley		default: break;
5865257cf54a5810105bc4a75703a06740d756d8e8landley		}
5875257cf54a5810105bc4a75703a06740d756d8e8landley		if (!stat(name, &tmpstat))
5885257cf54a5810105bc4a75703a06740d756d8e8landley			conf_read_simple(name, S_DEF_USER);
5895257cf54a5810105bc4a75703a06740d756d8e8landley		else if (!stat("all.config", &tmpstat))
5905257cf54a5810105bc4a75703a06740d756d8e8landley			conf_read_simple("all.config", S_DEF_USER);
5915257cf54a5810105bc4a75703a06740d756d8e8landley		break;
5925257cf54a5810105bc4a75703a06740d756d8e8landley	default:
5935257cf54a5810105bc4a75703a06740d756d8e8landley		break;
5945257cf54a5810105bc4a75703a06740d756d8e8landley	}
5955257cf54a5810105bc4a75703a06740d756d8e8landley
5965257cf54a5810105bc4a75703a06740d756d8e8landley	if (input_mode != ask_silent) {
5975257cf54a5810105bc4a75703a06740d756d8e8landley		rootEntry = &rootmenu;
5985257cf54a5810105bc4a75703a06740d756d8e8landley		conf(&rootmenu);
5995257cf54a5810105bc4a75703a06740d756d8e8landley		if (input_mode == ask_all) {
6005257cf54a5810105bc4a75703a06740d756d8e8landley			input_mode = ask_silent;
6015257cf54a5810105bc4a75703a06740d756d8e8landley			valid_stdin = 1;
6025257cf54a5810105bc4a75703a06740d756d8e8landley		}
6035257cf54a5810105bc4a75703a06740d756d8e8landley	} else if (sym_change_count) {
6045257cf54a5810105bc4a75703a06740d756d8e8landley		name = getenv("KCONFIG_NOSILENTUPDATE");
6055257cf54a5810105bc4a75703a06740d756d8e8landley		if (name && *name) {
6065257cf54a5810105bc4a75703a06740d756d8e8landley			fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n"));
6075257cf54a5810105bc4a75703a06740d756d8e8landley			return 1;
6085257cf54a5810105bc4a75703a06740d756d8e8landley		}
6095257cf54a5810105bc4a75703a06740d756d8e8landley	} else
6105257cf54a5810105bc4a75703a06740d756d8e8landley		goto skip_check;
6115257cf54a5810105bc4a75703a06740d756d8e8landley
6125257cf54a5810105bc4a75703a06740d756d8e8landley	do {
6135257cf54a5810105bc4a75703a06740d756d8e8landley		conf_cnt = 0;
6145257cf54a5810105bc4a75703a06740d756d8e8landley		check_conf(&rootmenu);
6155257cf54a5810105bc4a75703a06740d756d8e8landley	} while (conf_cnt);
6165257cf54a5810105bc4a75703a06740d756d8e8landley
6175257cf54a5810105bc4a75703a06740d756d8e8landley	if (!conf_write(NULL)) {
6185257cf54a5810105bc4a75703a06740d756d8e8landleyskip_check:
6195257cf54a5810105bc4a75703a06740d756d8e8landley		if (!(input_mode == ask_silent && conf_write_autoconf()))
6205257cf54a5810105bc4a75703a06740d756d8e8landley			return 0;
6215257cf54a5810105bc4a75703a06740d756d8e8landley	}
6225257cf54a5810105bc4a75703a06740d756d8e8landley	fprintf(stderr, _("\n*** Error writing "PROJECT_NAME" configuration.\n\n"));
6235257cf54a5810105bc4a75703a06740d756d8e8landley	return 1;
6245257cf54a5810105bc4a75703a06740d756d8e8landley}
625