menuconfig: Remove superfluous conditionnal
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / scripts / kconfig / mconf.c
CommitLineData
1da177e4
LT
1/*
2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
4 *
5 * Introduced single menu mode (show all sub-menus in one large tree).
6 * 2002-11-06 Petr Baudis <pasky@ucw.cz>
3b9fa093
ACM
7 *
8 * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br>
1da177e4
LT
9 */
10
1da177e4
LT
11#include <ctype.h>
12#include <errno.h>
13#include <fcntl.h>
14#include <limits.h>
1da177e4
LT
15#include <stdarg.h>
16#include <stdlib.h>
17#include <string.h>
564899f9 18#include <signal.h>
1da177e4 19#include <unistd.h>
442ff702 20#include <locale.h>
1da177e4 21
1da177e4 22#include "lkc.h"
2982de69 23#include "lxdialog/dialog.h"
1da177e4 24
3b9fa093 25static const char mconf_readme[] = N_(
1da177e4
LT
26"Overview\n"
27"--------\n"
652cf982
AL
28"This interface let you select features and parameters for the build.\n"
29"Features can either be built-in, modularized, or ignored. Parameters\n"
30"must be entered in as decimal or hexadecimal numbers or text.\n"
1da177e4 31"\n"
b5d609db
ML
32"Menu items beginning with following braces represent features that\n"
33" [ ] can be built in or removed\n"
34" < > can be built in, modularized or removed\n"
35" { } can be built in or modularized (selected by other feature)\n"
36" - - are selected by other feature,\n"
37"while *, M or whitespace inside braces means to build in, build as\n"
38"a module or to exclude the feature respectively.\n"
1da177e4
LT
39"\n"
40"To change any of these features, highlight it with the cursor\n"
41"keys and press <Y> to build it in, <M> to make it a module or\n"
42"<N> to removed it. You may also press the <Space Bar> to cycle\n"
43"through the available options (ie. Y->N->M->Y).\n"
44"\n"
45"Some additional keyboard hints:\n"
46"\n"
47"Menus\n"
48"----------\n"
49"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
50" you wish to change or submenu wish to select and press <Enter>.\n"
51" Submenus are designated by \"--->\".\n"
52"\n"
53" Shortcut: Press the option's highlighted letter (hotkey).\n"
54" Pressing a hotkey more than once will sequence\n"
55" through all visible items which use that hotkey.\n"
56"\n"
57" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
58" unseen options into view.\n"
59"\n"
60"o To exit a menu use the cursor keys to highlight the <Exit> button\n"
61" and press <ENTER>.\n"
62"\n"
63" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
64" using those letters. You may press a single <ESC>, but\n"
65" there is a delayed response which you may find annoying.\n"
66"\n"
67" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
22c7eca6 68" <Exit> and <Help>.\n"
1da177e4
LT
69"\n"
70"o To get help with an item, use the cursor keys to highlight <Help>\n"
22c7eca6 71" and press <ENTER>.\n"
1da177e4
LT
72"\n"
73" Shortcut: Press <H> or <?>.\n"
74"\n"
f9447c49 75"o To toggle the display of hidden options, press <Z>.\n"
22c7eca6 76"\n"
1da177e4
LT
77"\n"
78"Radiolists (Choice lists)\n"
79"-----------\n"
80"o Use the cursor keys to select the option you wish to set and press\n"
81" <S> or the <SPACE BAR>.\n"
82"\n"
83" Shortcut: Press the first letter of the option you wish to set then\n"
84" press <S> or <SPACE BAR>.\n"
85"\n"
86"o To see available help for the item, use the cursor keys to highlight\n"
87" <Help> and Press <ENTER>.\n"
88"\n"
89" Shortcut: Press <H> or <?>.\n"
90"\n"
91" Also, the <TAB> and cursor keys will cycle between <Select> and\n"
92" <Help>\n"
93"\n"
94"\n"
95"Data Entry\n"
96"-----------\n"
97"o Enter the requested information and press <ENTER>\n"
98" If you are entering hexadecimal values, it is not necessary to\n"
99" add the '0x' prefix to the entry.\n"
100"\n"
101"o For help, use the <TAB> or cursor keys to highlight the help option\n"
102" and press <ENTER>. You can try <TAB><H> as well.\n"
103"\n"
104"\n"
105"Text Box (Help Window)\n"
106"--------\n"
107"o Use the cursor keys to scroll up/down/left/right. The VI editor\n"
9d4792c9
BP
108" keys h,j,k,l function here as do <u>, <d>, <SPACE BAR> and <B> for \n"
109" those who are familiar with less and lynx.\n"
1da177e4 110"\n"
9d4792c9 111"o Press <E>, <X>, <q>, <Enter> or <Esc><Esc> to exit.\n"
1da177e4
LT
112"\n"
113"\n"
114"Alternate Configuration Files\n"
115"-----------------------------\n"
116"Menuconfig supports the use of alternate configuration files for\n"
117"those who, for various reasons, find it necessary to switch\n"
652cf982 118"between different configurations.\n"
1da177e4
LT
119"\n"
120"At the end of the main menu you will find two options. One is\n"
121"for saving the current configuration to a file of your choosing.\n"
122"The other option is for loading a previously saved alternate\n"
123"configuration.\n"
124"\n"
125"Even if you don't use alternate configuration files, but you\n"
126"find during a Menuconfig session that you have completely messed\n"
127"up your settings, you may use the \"Load Alternate...\" option to\n"
128"restore your previously saved settings from \".config\" without\n"
129"restarting Menuconfig.\n"
130"\n"
131"Other information\n"
132"-----------------\n"
133"If you use Menuconfig in an XTERM window make sure you have your\n"
134"$TERM variable set to point to a xterm definition which supports color.\n"
135"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n"
136"display correctly in a RXVT window because rxvt displays only one\n"
137"intensity of color, bright.\n"
138"\n"
139"Menuconfig will display larger menus on screens or xterms which are\n"
140"set to display more than the standard 25 row by 80 column geometry.\n"
141"In order for this to work, the \"stty size\" command must be able to\n"
142"display the screen's current row and column geometry. I STRONGLY\n"
143"RECOMMEND that you make sure you do NOT have the shell variables\n"
144"LINES and COLUMNS exported into your environment. Some distributions\n"
145"export those variables via /etc/profile. Some ncurses programs can\n"
146"become confused when those variables (LINES & COLUMNS) don't reflect\n"
147"the true screen size.\n"
148"\n"
149"Optional personality available\n"
150"------------------------------\n"
652cf982
AL
151"If you prefer to have all of the options listed in a single menu, rather\n"
152"than the default multimenu hierarchy, run the menuconfig with\n"
153"MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
1da177e4
LT
154"\n"
155"make MENUCONFIG_MODE=single_menu menuconfig\n"
156"\n"
157"<Enter> will then unroll the appropriate category, or enfold it if it\n"
158"is already unrolled.\n"
159"\n"
160"Note that this mode can eventually be a little more CPU expensive\n"
161"(especially with a larger number of unrolled categories) than the\n"
45897213
SR
162"default mode.\n"
163"\n"
164"Different color themes available\n"
165"--------------------------------\n"
166"It is possible to select different color themes using the variable\n"
167"MENUCONFIG_COLOR. To select a theme use:\n"
168"\n"
169"make MENUCONFIG_COLOR=<theme> menuconfig\n"
170"\n"
171"Available themes are\n"
172" mono => selects colors suitable for monochrome displays\n"
173" blackbg => selects a color scheme with black background\n"
350b5b76
SR
174" classic => theme with blue background. The classic look\n"
175" bluetitle => a LCD friendly version of classic. (default)\n"
45897213 176"\n"),
3b9fa093 177menu_instructions[] = N_(
1da177e4
LT
178 "Arrow keys navigate the menu. "
179 "<Enter> selects submenus --->. "
180 "Highlighted letters are hotkeys. "
181 "Pressing <Y> includes, <N> excludes, <M> modularizes features. "
182 "Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
3b9fa093
ACM
183 "Legend: [*] built-in [ ] excluded <M> module < > module capable"),
184radiolist_instructions[] = N_(
1da177e4
LT
185 "Use the arrow keys to navigate this window or "
186 "press the hotkey of the item you wish to select "
187 "followed by the <SPACE BAR>. "
3b9fa093
ACM
188 "Press <?> for additional information about this option."),
189inputbox_instructions_int[] = N_(
1da177e4
LT
190 "Please enter a decimal value. "
191 "Fractions will not be accepted. "
3b9fa093
ACM
192 "Use the <TAB> key to move from the input field to the buttons below it."),
193inputbox_instructions_hex[] = N_(
1da177e4 194 "Please enter a hexadecimal value. "
3b9fa093
ACM
195 "Use the <TAB> key to move from the input field to the buttons below it."),
196inputbox_instructions_string[] = N_(
1da177e4 197 "Please enter a string value. "
3b9fa093
ACM
198 "Use the <TAB> key to move from the input field to the buttons below it."),
199setmod_text[] = N_(
1da177e4 200 "This feature depends on another which has been configured as a module.\n"
3b9fa093 201 "As a result, this feature will be built as a module."),
3b9fa093 202load_config_text[] = N_(
1da177e4
LT
203 "Enter the name of the configuration file you wish to load. "
204 "Accept the name shown to restore the configuration you "
3b9fa093
ACM
205 "last retrieved. Leave blank to abort."),
206load_config_help[] = N_(
1da177e4 207 "\n"
652cf982 208 "For various reasons, one may wish to keep several different\n"
1da177e4
LT
209 "configurations available on a single machine.\n"
210 "\n"
211 "If you have saved a previous configuration in a file other than the\n"
652cf982
AL
212 "default one, entering its name here will allow you to modify that\n"
213 "configuration.\n"
1da177e4
LT
214 "\n"
215 "If you are uncertain, then you have probably never used alternate\n"
af901ca1 216 "configuration files. You should therefore leave this blank to abort.\n"),
3b9fa093 217save_config_text[] = N_(
1da177e4 218 "Enter a filename to which this configuration should be saved "
3b9fa093
ACM
219 "as an alternate. Leave blank to abort."),
220save_config_help[] = N_(
1da177e4 221 "\n"
652cf982
AL
222 "For various reasons, one may wish to keep different configurations\n"
223 "available on a single machine.\n"
1da177e4
LT
224 "\n"
225 "Entering a file name here will allow you to later retrieve, modify\n"
226 "and use the current configuration as an alternate to whatever\n"
227 "configuration options you have selected at that time.\n"
228 "\n"
229 "If you are uncertain what all this means then you should probably\n"
3b9fa093
ACM
230 "leave this blank.\n"),
231search_help[] = N_(
1da177e4 232 "\n"
59dfa24d 233 "Search for symbols and display their relations.\n"
503af334 234 "Regular expressions are allowed.\n"
1da177e4
LT
235 "Example: search for \"^FOO\"\n"
236 "Result:\n"
237 "-----------------------------------------------------------------\n"
238 "Symbol: FOO [=m]\n"
239 "Prompt: Foo bus is used to drive the bar HW\n"
240 "Defined at drivers/pci/Kconfig:47\n"
241 "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
242 "Location:\n"
bb8187d3 243 " -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
1da177e4
LT
244 " -> PCI support (PCI [=y])\n"
245 " -> PCI access mode (<choice> [=y])\n"
246 "Selects: LIBCRC32\n"
247 "Selected by: BAR\n"
248 "-----------------------------------------------------------------\n"
249 "o The line 'Prompt:' shows the text used in the menu structure for\n"
59dfa24d 250 " this symbol\n"
1da177e4
LT
251 "o The 'Defined at' line tell at what file / line number the symbol\n"
252 " is defined\n"
253 "o The 'Depends on:' line tell what symbols needs to be defined for\n"
254 " this symbol to be visible in the menu (selectable)\n"
255 "o The 'Location:' lines tell where in the menu structure this symbol\n"
256 " is located\n"
257 " A location followed by a [=y] indicate that this is a selectable\n"
258 " menu item - and current value is displayed inside brackets.\n"
259 "o The 'Selects:' line tell what symbol will be automatically\n"
260 " selected if this symbol is selected (y or m)\n"
261 "o The 'Selected by' line tell what symbol has selected this symbol\n"
262 "\n"
263 "Only relevant lines are shown.\n"
264 "\n\n"
265 "Search examples:\n"
59dfa24d
AL
266 "Examples: USB => find all symbols containing USB\n"
267 " ^USB => find all symbols starting with USB\n"
268 " USB$ => find all symbols ending with USB\n"
3b9fa093 269 "\n");
1da177e4 270
1da177e4 271static int indent;
1da177e4
LT
272static struct menu *current_menu;
273static int child_count;
1da177e4 274static int single_menu_mode;
22c7eca6 275static int show_all_options;
1da177e4
LT
276
277static void conf(struct menu *menu);
278static void conf_choice(struct menu *menu);
279static void conf_string(struct menu *menu);
280static void conf_load(void);
281static void conf_save(void);
282static void show_textbox(const char *title, const char *text, int r, int c);
283static void show_helptext(const char *title, const char *text);
284static void show_help(struct menu *menu);
1da177e4 285
95e30f95
SR
286static char filename[PATH_MAX+1];
287static void set_config_filename(const char *config_filename)
288{
289 static char menu_backtitle[PATH_MAX+128];
290 int size;
95e30f95 291
95e30f95 292 size = snprintf(menu_backtitle, sizeof(menu_backtitle),
0954828f 293 "%s - %s", config_filename, rootmenu.prompt->text);
95e30f95
SR
294 if (size >= sizeof(menu_backtitle))
295 menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
296 set_dialog_backtitle(menu_backtitle);
297
298 size = snprintf(filename, sizeof(filename), "%s", config_filename);
299 if (size >= sizeof(filename))
300 filename[sizeof(filename)-1] = '\0';
301}
302
303
1da177e4
LT
304static void search_conf(void)
305{
306 struct symbol **sym_arr;
1da177e4 307 struct gstr res;
0584f9f9 308 char *dialog_input;
2982de69 309 int dres;
1da177e4 310again:
e94c5bde 311 dialog_clear();
2982de69 312 dres = dialog_inputbox(_("Search Configuration Parameter"),
ffb5957b
AL
313 _("Enter " CONFIG_ " (sub)string to search for "
314 "(with or without \"" CONFIG_ "\")"),
2982de69
SR
315 10, 75, "");
316 switch (dres) {
1da177e4
LT
317 case 0:
318 break;
319 case 1:
3b9fa093 320 show_helptext(_("Search Configuration"), search_help);
1da177e4
LT
321 goto again;
322 default:
323 return;
324 }
325
ffb5957b 326 /* strip the prefix if necessary */
0584f9f9 327 dialog_input = dialog_input_result;
ffb5957b
AL
328 if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
329 dialog_input += strlen(CONFIG_);
0584f9f9
BW
330
331 sym_arr = sym_re_search(dialog_input);
1da177e4
LT
332 res = get_relations_str(sym_arr);
333 free(sym_arr);
3b9fa093 334 show_textbox(_("Search Results"), str_get(&res), 0, 0);
1da177e4
LT
335 str_free(&res);
336}
337
338static void build_conf(struct menu *menu)
339{
340 struct symbol *sym;
341 struct property *prop;
342 struct menu *child;
343 int type, tmp, doint = 2;
344 tristate val;
345 char ch;
22c7eca6
LZ
346 bool visible;
347
348 /*
349 * note: menu_is_visible() has side effect that it will
350 * recalc the value of the symbol.
351 */
352 visible = menu_is_visible(menu);
353 if (show_all_options && !menu_has_prompt(menu))
354 return;
355 else if (!show_all_options && !visible)
1da177e4
LT
356 return;
357
358 sym = menu->sym;
359 prop = menu->prompt;
360 if (!sym) {
361 if (prop && menu != current_menu) {
362 const char *prompt = menu_get_prompt(menu);
363 switch (prop->type) {
364 case P_MENU:
365 child_count++;
413f006b 366 prompt = _(prompt);
1da177e4 367 if (single_menu_mode) {
2982de69
SR
368 item_make("%s%*c%s",
369 menu->data ? "-->" : "++>",
370 indent + 1, ' ', prompt);
1da177e4 371 } else
2982de69 372 item_make(" %*c%s --->", indent + 1, ' ', prompt);
1da177e4 373
2982de69
SR
374 item_set_tag('m');
375 item_set_data(menu);
1da177e4
LT
376 if (single_menu_mode && menu->data)
377 goto conf_childs;
378 return;
48874077
SR
379 case P_COMMENT:
380 if (prompt) {
381 child_count++;
413f006b 382 item_make(" %*c*** %s ***", indent + 1, ' ', _(prompt));
48874077
SR
383 item_set_tag(':');
384 item_set_data(menu);
385 }
386 break;
1da177e4
LT
387 default:
388 if (prompt) {
389 child_count++;
413f006b 390 item_make("---%*c%s", indent + 1, ' ', _(prompt));
2982de69
SR
391 item_set_tag(':');
392 item_set_data(menu);
1da177e4
LT
393 }
394 }
395 } else
396 doint = 0;
397 goto conf_childs;
398 }
399
400 type = sym_get_type(sym);
401 if (sym_is_choice(sym)) {
402 struct symbol *def_sym = sym_get_choice_value(sym);
403 struct menu *def_menu = NULL;
404
405 child_count++;
406 for (child = menu->list; child; child = child->next) {
407 if (menu_is_visible(child) && child->sym == def_sym)
408 def_menu = child;
409 }
410
411 val = sym_get_tristate_value(sym);
412 if (sym_is_changable(sym)) {
1da177e4
LT
413 switch (type) {
414 case S_BOOLEAN:
2982de69 415 item_make("[%c]", val == no ? ' ' : '*');
1da177e4
LT
416 break;
417 case S_TRISTATE:
418 switch (val) {
419 case yes: ch = '*'; break;
420 case mod: ch = 'M'; break;
421 default: ch = ' '; break;
422 }
2982de69 423 item_make("<%c>", ch);
1da177e4
LT
424 break;
425 }
2982de69
SR
426 item_set_tag('t');
427 item_set_data(menu);
1da177e4 428 } else {
2982de69
SR
429 item_make(" ");
430 item_set_tag(def_menu ? 't' : ':');
431 item_set_data(menu);
1da177e4
LT
432 }
433
413f006b 434 item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
1da177e4
LT
435 if (val == yes) {
436 if (def_menu) {
413f006b 437 item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
2982de69 438 item_add_str(" --->");
1da177e4
LT
439 if (def_menu->list) {
440 indent += 2;
441 build_conf(def_menu);
442 indent -= 2;
443 }
2982de69 444 }
1da177e4
LT
445 return;
446 }
1da177e4
LT
447 } else {
448 if (menu == current_menu) {
413f006b 449 item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
2982de69
SR
450 item_set_tag(':');
451 item_set_data(menu);
1da177e4
LT
452 goto conf_childs;
453 }
454 child_count++;
455 val = sym_get_tristate_value(sym);
456 if (sym_is_choice_value(sym) && val == yes) {
2982de69
SR
457 item_make(" ");
458 item_set_tag(':');
459 item_set_data(menu);
1da177e4
LT
460 } else {
461 switch (type) {
462 case S_BOOLEAN:
1da177e4 463 if (sym_is_changable(sym))
2982de69 464 item_make("[%c]", val == no ? ' ' : '*');
1da177e4 465 else
b5d609db 466 item_make("-%c-", val == no ? ' ' : '*');
2982de69
SR
467 item_set_tag('t');
468 item_set_data(menu);
1da177e4
LT
469 break;
470 case S_TRISTATE:
1da177e4
LT
471 switch (val) {
472 case yes: ch = '*'; break;
473 case mod: ch = 'M'; break;
474 default: ch = ' '; break;
475 }
b5d609db
ML
476 if (sym_is_changable(sym)) {
477 if (sym->rev_dep.tri == mod)
478 item_make("{%c}", ch);
479 else
480 item_make("<%c>", ch);
481 } else
482 item_make("-%c-", ch);
2982de69
SR
483 item_set_tag('t');
484 item_set_data(menu);
1da177e4
LT
485 break;
486 default:
2982de69
SR
487 tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
488 item_make("(%s)", sym_get_string_value(sym));
1da177e4
LT
489 tmp = indent - tmp + 4;
490 if (tmp < 0)
491 tmp = 0;
413f006b 492 item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
2982de69 493 (sym_has_value(sym) || !sym_is_changable(sym)) ?
413f006b 494 "" : _(" (NEW)"));
2982de69
SR
495 item_set_tag('s');
496 item_set_data(menu);
1da177e4
LT
497 goto conf_childs;
498 }
499 }
413f006b 500 item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
2982de69 501 (sym_has_value(sym) || !sym_is_changable(sym)) ?
413f006b 502 "" : _(" (NEW)"));
1da177e4 503 if (menu->prompt->type == P_MENU) {
2982de69 504 item_add_str(" --->");
1da177e4
LT
505 return;
506 }
1da177e4
LT
507 }
508
509conf_childs:
510 indent += doint;
511 for (child = menu->list; child; child = child->next)
512 build_conf(child);
513 indent -= doint;
514}
515
516static void conf(struct menu *menu)
517{
518 struct menu *submenu;
519 const char *prompt = menu_get_prompt(menu);
520 struct symbol *sym;
2982de69
SR
521 struct menu *active_menu = NULL;
522 int res;
523 int s_scroll = 0;
1da177e4 524
1da177e4 525 while (1) {
2982de69 526 item_reset();
1da177e4
LT
527 current_menu = menu;
528 build_conf(menu);
529 if (!child_count)
530 break;
531 if (menu == &rootmenu) {
2982de69
SR
532 item_make("--- ");
533 item_set_tag(':');
534 item_make(_(" Load an Alternate Configuration File"));
535 item_set_tag('L');
536 item_make(_(" Save an Alternate Configuration File"));
537 item_set_tag('S');
1da177e4 538 }
e94c5bde 539 dialog_clear();
413f006b 540 res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
2982de69 541 _(menu_instructions),
2982de69 542 active_menu, &s_scroll);
c8dc68ad 543 if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
1da177e4 544 break;
2982de69
SR
545 if (!item_activate_selected())
546 continue;
547 if (!item_tag())
1da177e4
LT
548 continue;
549
2982de69
SR
550 submenu = item_data();
551 active_menu = item_data();
c8dc68ad
SR
552 if (submenu)
553 sym = submenu->sym;
554 else
555 sym = NULL;
1da177e4 556
2982de69 557 switch (res) {
1da177e4 558 case 0:
2982de69 559 switch (item_tag()) {
1da177e4
LT
560 case 'm':
561 if (single_menu_mode)
562 submenu->data = (void *) (long) !submenu->data;
563 else
564 conf(submenu);
565 break;
566 case 't':
567 if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
568 conf_choice(submenu);
569 else if (submenu->prompt->type == P_MENU)
570 conf(submenu);
571 break;
572 case 's':
573 conf_string(submenu);
574 break;
575 case 'L':
576 conf_load();
577 break;
578 case 'S':
579 conf_save();
580 break;
581 }
582 break;
583 case 2:
584 if (sym)
585 show_help(submenu);
586 else
413f006b 587 show_helptext(_("README"), _(mconf_readme));
1da177e4
LT
588 break;
589 case 3:
2982de69 590 if (item_is_tag('t')) {
1da177e4
LT
591 if (sym_set_tristate_value(sym, yes))
592 break;
593 if (sym_set_tristate_value(sym, mod))
594 show_textbox(NULL, setmod_text, 6, 74);
595 }
596 break;
597 case 4:
2982de69 598 if (item_is_tag('t'))
1da177e4
LT
599 sym_set_tristate_value(sym, no);
600 break;
601 case 5:
2982de69 602 if (item_is_tag('t'))
1da177e4
LT
603 sym_set_tristate_value(sym, mod);
604 break;
605 case 6:
2982de69 606 if (item_is_tag('t'))
1da177e4 607 sym_toggle_tristate_value(sym);
2982de69 608 else if (item_is_tag('m'))
1da177e4
LT
609 conf(submenu);
610 break;
611 case 7:
612 search_conf();
613 break;
22c7eca6
LZ
614 case 8:
615 show_all_options = !show_all_options;
616 break;
1da177e4
LT
617 }
618 }
619}
620
621static void show_textbox(const char *title, const char *text, int r, int c)
622{
e94c5bde 623 dialog_clear();
c8dc68ad 624 dialog_textbox(title, text, r, c);
1da177e4
LT
625}
626
627static void show_helptext(const char *title, const char *text)
628{
629 show_textbox(title, text, 0, 0);
630}
631
632static void show_help(struct menu *menu)
633{
634 struct gstr help = str_new();
1d525e7c 635
da60fbbc 636 help.max_width = getmaxx(stdscr) - 10;
1d525e7c
CR
637 menu_get_ext_help(menu, &help);
638
413f006b 639 show_helptext(_(menu_get_prompt(menu)), str_get(&help));
1da177e4
LT
640 str_free(&help);
641}
642
1da177e4
LT
643static void conf_choice(struct menu *menu)
644{
413f006b 645 const char *prompt = _(menu_get_prompt(menu));
1da177e4
LT
646 struct menu *child;
647 struct symbol *active;
1da177e4
LT
648
649 active = sym_get_choice_value(menu->sym);
650 while (1) {
2982de69
SR
651 int res;
652 int selected;
653 item_reset();
1da177e4
LT
654
655 current_menu = menu;
656 for (child = menu->list; child; child = child->next) {
657 if (!menu_is_visible(child))
658 continue;
af6c1598
PK
659 if (child->sym)
660 item_make("%s", _(menu_get_prompt(child)));
661 else {
662 item_make("*** %s ***", _(menu_get_prompt(child)));
663 item_set_tag(':');
664 }
2982de69
SR
665 item_set_data(child);
666 if (child->sym == active)
667 item_set_selected(1);
1da177e4 668 if (child->sym == sym_get_choice_value(menu->sym))
2982de69 669 item_set_tag('X');
1da177e4 670 }
e94c5bde 671 dialog_clear();
413f006b 672 res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
2982de69
SR
673 _(radiolist_instructions),
674 15, 70, 6);
675 selected = item_activate_selected();
676 switch (res) {
1da177e4 677 case 0:
2982de69
SR
678 if (selected) {
679 child = item_data();
af6c1598
PK
680 if (!child->sym)
681 break;
682
2982de69
SR
683 sym_set_tristate_value(child->sym, yes);
684 }
1da177e4
LT
685 return;
686 case 1:
2982de69
SR
687 if (selected) {
688 child = item_data();
1da177e4
LT
689 show_help(child);
690 active = child->sym;
691 } else
692 show_help(menu);
693 break;
f3cbcdc9 694 case KEY_ESC:
1da177e4 695 return;
c8dc68ad
SR
696 case -ERRDISPLAYTOOSMALL:
697 return;
1da177e4
LT
698 }
699 }
700}
701
702static void conf_string(struct menu *menu)
703{
704 const char *prompt = menu_get_prompt(menu);
1da177e4
LT
705
706 while (1) {
2982de69 707 int res;
c4143a83 708 const char *heading;
2982de69 709
1da177e4
LT
710 switch (sym_get_type(menu->sym)) {
711 case S_INT:
2982de69 712 heading = _(inputbox_instructions_int);
1da177e4
LT
713 break;
714 case S_HEX:
2982de69 715 heading = _(inputbox_instructions_hex);
1da177e4
LT
716 break;
717 case S_STRING:
2982de69 718 heading = _(inputbox_instructions_string);
1da177e4
LT
719 break;
720 default:
413f006b 721 heading = _("Internal mconf error!");
1da177e4 722 }
e94c5bde 723 dialog_clear();
413f006b 724 res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
2982de69
SR
725 heading, 10, 75,
726 sym_get_string_value(menu->sym));
727 switch (res) {
1da177e4 728 case 0:
2982de69 729 if (sym_set_string_value(menu->sym, dialog_input_result))
1da177e4 730 return;
3b9fa093 731 show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
1da177e4
LT
732 break;
733 case 1:
734 show_help(menu);
735 break;
f3cbcdc9 736 case KEY_ESC:
1da177e4
LT
737 return;
738 }
739 }
740}
741
742static void conf_load(void)
743{
1da177e4
LT
744
745 while (1) {
2982de69 746 int res;
e94c5bde 747 dialog_clear();
2982de69
SR
748 res = dialog_inputbox(NULL, load_config_text,
749 11, 55, filename);
750 switch(res) {
1da177e4 751 case 0:
2982de69 752 if (!dialog_input_result[0])
1da177e4 753 return;
95e30f95
SR
754 if (!conf_read(dialog_input_result)) {
755 set_config_filename(dialog_input_result);
36ef805b 756 sym_set_change_count(1);
1da177e4 757 return;
95e30f95 758 }
3b9fa093 759 show_textbox(NULL, _("File does not exist!"), 5, 38);
1da177e4
LT
760 break;
761 case 1:
3b9fa093 762 show_helptext(_("Load Alternate Configuration"), load_config_help);
1da177e4 763 break;
f3cbcdc9 764 case KEY_ESC:
1da177e4
LT
765 return;
766 }
767 }
768}
769
770static void conf_save(void)
771{
1da177e4 772 while (1) {
2982de69 773 int res;
e94c5bde 774 dialog_clear();
2982de69
SR
775 res = dialog_inputbox(NULL, save_config_text,
776 11, 55, filename);
777 switch(res) {
1da177e4 778 case 0:
2982de69 779 if (!dialog_input_result[0])
1da177e4 780 return;
95e30f95
SR
781 if (!conf_write(dialog_input_result)) {
782 set_config_filename(dialog_input_result);
1da177e4 783 return;
95e30f95 784 }
3b9fa093 785 show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60);
1da177e4
LT
786 break;
787 case 1:
3b9fa093 788 show_helptext(_("Save Alternate Configuration"), save_config_help);
1da177e4 789 break;
f3cbcdc9 790 case KEY_ESC:
1da177e4
LT
791 return;
792 }
793 }
794}
795
564899f9
DB
796static int handle_exit(void)
797{
798 int res;
799
800 dialog_clear();
801 if (conf_get_changed())
802 res = dialog_yesno(NULL,
803 _("Do you wish to save your new configuration ?\n"
804 "<ESC><ESC> to continue."),
805 6, 60);
806 else
807 res = -1;
808
809 end_dialog(saved_x, saved_y);
810
811 switch (res) {
812 case 0:
813 if (conf_write(filename)) {
814 fprintf(stderr, _("\n\n"
815 "Error while writing of the configuration.\n"
816 "Your configuration changes were NOT saved."
817 "\n\n"));
818 return 1;
819 }
820 /* fall through */
821 case -1:
822 printf(_("\n\n"
823 "*** End of the configuration.\n"
824 "*** Execute 'make' to start the build or try 'make help'."
825 "\n\n"));
826 res = 0;
827 break;
828 default:
829 fprintf(stderr, _("\n\n"
830 "Your configuration changes were NOT saved."
831 "\n\n"));
30c4eaaf
LZ
832 if (res != KEY_ESC)
833 res = 0;
564899f9
DB
834 }
835
836 return res;
837}
838
839static void sig_handler(int signo)
840{
841 exit(handle_exit());
842}
843
1da177e4
LT
844int main(int ac, char **av)
845{
1da177e4 846 char *mode;
2982de69 847 int res;
1da177e4 848
3b9fa093
ACM
849 setlocale(LC_ALL, "");
850 bindtextdomain(PACKAGE, LOCALEDIR);
851 textdomain(PACKAGE);
852
564899f9
DB
853 signal(SIGINT, sig_handler);
854
1da177e4
LT
855 conf_parse(av[1]);
856 conf_read(NULL);
857
1da177e4
LT
858 mode = getenv("MENUCONFIG_MODE");
859 if (mode) {
860 if (!strcasecmp(mode, "single_menu"))
861 single_menu_mode = 1;
862 }
863
09af091f
LM
864 if (init_dialog(NULL)) {
865 fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
866 fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
867 return 1;
868 }
869
d802b50f 870 set_config_filename(conf_get_configname());
f3cbcdc9
SR
871 do {
872 conf(&rootmenu);
564899f9 873 res = handle_exit();
f3cbcdc9 874 } while (res == KEY_ESC);
1da177e4 875
564899f9 876 return res;
1da177e4 877}
c4143a83 878