Merge patches sent by Robert P. J. Day <rpjday@mindspring.com>.
Warning: the buildroot folks purposedly removed the skip-comment patch but didn't really said why. Keeping it for the sake of having it in svn just in case (removing it will be easier thant not having it at all).
2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
14 #define LKC_DIRECT_LINK
17 static void conf(struct menu *menu);
18 static void check_conf(struct menu *menu);
29 } input_mode = ask_all;
32 static int indent = 1;
33 static int valid_stdin = 1;
35 static char line[128];
36 static struct menu *rootEntry;
38 static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
40 static void strip(char *str)
49 memmove(str, p, l + 1);
57 static void check_stdin(void)
59 if (!valid_stdin && input_mode == ask_silent) {
60 printf(_("aborted!\n\n"));
61 printf(_("Console input/output is redirected. "));
62 printf(_("Run 'make oldconfig' to update configuration.\n\n"));
67 static void conf_askvalue(struct symbol *sym, const char *def)
69 enum symbol_type type = sym_get_type(sym);
72 if (!sym_has_value(sym))
78 if (!sym_is_changable(sym)) {
90 if (sym_has_value(sym)) {
97 if (sym_has_value(sym)) {
104 fgets(line, 128, stdin);
122 switch (input_mode) {
124 if (sym_tristate_within_range(sym, yes)) {
131 if (type == S_TRISTATE) {
132 if (sym_tristate_within_range(sym, mod)) {
139 if (sym_tristate_within_range(sym, yes)) {
147 if (sym_tristate_within_range(sym, no)) {
155 val = (tristate)(random() % 3);
156 } while (!sym_tristate_within_range(sym, val));
158 case no: line[0] = 'n'; break;
159 case mod: line[0] = 'm'; break;
160 case yes: line[0] = 'y'; break;
171 int conf_string(struct menu *menu)
173 struct symbol *sym = menu->sym;
174 const char *def, *help;
177 printf("%*s%s ", indent - 1, "", menu->prompt->text);
178 printf("(%s) ", sym->name);
179 def = sym_get_string_value(sym);
180 if (sym_get_string_value(sym))
181 printf("[%s] ", def);
182 conf_askvalue(sym, def);
188 if (line[1] == '\n') {
191 help = menu->sym->help;
192 printf("\n%s\n", menu->sym->help);
197 line[strlen(line)-1] = 0;
200 if (def && sym_set_string_value(sym, def))
205 static int conf_sym(struct menu *menu)
207 struct symbol *sym = menu->sym;
209 tristate oldval, newval;
213 printf("%*s%s ", indent - 1, "", menu->prompt->text);
215 printf("(%s) ", sym->name);
216 type = sym_get_type(sym);
218 oldval = sym_get_tristate_value(sym);
230 if (oldval != no && sym_tristate_within_range(sym, no))
232 if (oldval != mod && sym_tristate_within_range(sym, mod))
234 if (oldval != yes && sym_tristate_within_range(sym, yes))
239 conf_askvalue(sym, sym_get_string_value(sym));
246 if (!line[1] || !strcmp(&line[1], "o"))
258 if (!line[1] || !strcmp(&line[1], "es"))
269 if (sym_set_tristate_value(sym, newval))
275 printf("\n%s\n", help);
279 static int conf_choice(struct menu *menu)
281 struct symbol *sym, *def_sym;
287 type = sym_get_type(sym);
288 is_new = !sym_has_value(sym);
289 if (sym_is_changable(sym)) {
292 switch (sym_get_tristate_value(sym)) {
301 switch (sym_get_tristate_value(sym)) {
305 printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
315 printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
316 def_sym = sym_get_choice_value(sym);
319 for (child = menu->list; child; child = child->next) {
320 if (!menu_is_visible(child))
323 printf("%*c %s\n", indent, '*', menu_get_prompt(child));
327 if (child->sym == def_sym) {
329 printf("%*c", indent, '>');
331 printf("%*c", indent, ' ');
332 printf(" %d. %s", cnt, menu_get_prompt(child));
333 if (child->sym->name)
334 printf(" (%s)", child->sym->name);
335 if (!sym_has_value(child->sym))
339 printf("%*schoice", indent - 1, "");
344 printf("[1-%d", cnt);
348 switch (input_mode) {
359 fgets(line, 128, stdin);
361 if (line[0] == '?') {
362 printf("\n%s\n", menu->sym->help ?
363 menu->sym->help : nohelp_text);
368 else if (isdigit(line[0]))
374 def = (random() % cnt) + 1;
385 for (child = menu->list; child; child = child->next) {
386 if (!child->sym || !menu_is_visible(child))
393 if (line[strlen(line) - 1] == '?') {
394 printf("\n%s\n", child->sym->help ?
395 child->sym->help : nohelp_text);
398 sym_set_choice_value(sym, child->sym);
408 static void conf(struct menu *menu)
411 struct property *prop;
414 if (!menu_is_visible(menu))
422 switch (prop->type) {
424 if (input_mode == ask_silent && rootEntry != menu) {
429 prompt = menu_get_prompt(menu);
431 printf("%*c\n%*c %s\n%*c\n",
443 if (sym_is_choice(sym)) {
445 if (sym->curr.tri != mod)
464 for (child = menu->list; child; child = child->next)
470 static void check_conf(struct menu *menu)
475 if (!menu_is_visible(menu))
479 if (sym && !sym_has_value(sym)) {
480 if (sym_is_changable(sym) ||
481 (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
483 printf(_("*\n* Restart config...\n*\n"));
484 rootEntry = menu_get_parent_menu(menu);
489 for (child = menu->list; child; child = child->next)
493 int main(int ac, char **av)
499 if (ac > i && av[i][0] == '-') {
500 switch (av[i++][1]) {
502 input_mode = ask_new;
505 input_mode = ask_silent;
506 valid_stdin = isatty(0) && isatty(1) && isatty(2);
509 input_mode = set_default;
512 input_mode = set_default;
513 defconfig_file = av[i++];
514 if (!defconfig_file) {
515 printf(_("%s: No default config file specified\n"),
524 input_mode = set_mod;
527 input_mode = set_yes;
530 input_mode = set_random;
535 fprintf(stderr, "See README for usage info\n");
541 printf(_("%s: Kconfig file missing\n"), av[0]);
546 switch (input_mode) {
549 defconfig_file = conf_get_default_confname();
550 if (conf_read(defconfig_file)) {
552 "*** Can't find default configuration \"%s\"!\n"
553 "***\n", defconfig_file);
558 if (stat(".config", &tmpstat)) {
560 "*** You have not yet configured "PROJECT_NAME"!\n"
562 "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
563 "*** \"make menuconfig\" or \"make xconfig\").\n"
575 name = getenv("KCONFIG_ALLCONFIG");
576 if (name && !stat(name, &tmpstat)) {
577 conf_read_simple(name, S_DEF_USER);
580 switch (input_mode) {
581 case set_no: name = "allno.config"; break;
582 case set_mod: name = "allmod.config"; break;
583 case set_yes: name = "allyes.config"; break;
584 case set_random: name = "allrandom.config"; break;
587 if (!stat(name, &tmpstat))
588 conf_read_simple(name, S_DEF_USER);
589 else if (!stat("all.config", &tmpstat))
590 conf_read_simple("all.config", S_DEF_USER);
596 if (input_mode != ask_silent) {
597 rootEntry = &rootmenu;
599 if (input_mode == ask_all) {
600 input_mode = ask_silent;
603 } else if (conf_get_changed()) {
604 name = getenv("KCONFIG_NOSILENTUPDATE");
606 fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n"));
614 check_conf(&rootmenu);
616 if (conf_write(NULL)) {
617 fprintf(stderr, _("\n*** Error during writing of "PROJECT_NAME" configuration.\n\n"));