blob: cee4281ad209f8cc97641ee10ae673448a3c8cdc [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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>
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -07007 *
8 * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br>
Linus Torvalds1da177e2005-04-16 15:20:36 -07009 */
10
Linus Torvalds1da177e2005-04-16 15:20:36 -070011#include <ctype.h>
12#include <errno.h>
13#include <fcntl.h>
14#include <limits.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070015#include <stdarg.h>
16#include <stdlib.h>
17#include <string.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <unistd.h>
Jean-Christophe Dubois442ff702005-06-25 14:55:43 -070019#include <locale.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070020
21#define LKC_DIRECT_LINK
22#include "lkc.h"
Sam Ravnborg2982de62006-07-27 22:10:27 +020023#include "lxdialog/dialog.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -070025static const char mconf_readme[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -070026"Overview\n"
27"--------\n"
Arnaud Lacombe652cf982010-08-14 23:51:40 -040028"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"
Linus Torvalds1da177e2005-04-16 15:20:36 -070031"\n"
Matej Laitlb5d609d2007-10-02 13:46:50 -070032"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"
Linus Torvalds1da177e2005-04-16 15:20:36 -070039"\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"
Li Zefan22c7eca2010-04-14 11:46:02 +080068" <Exit> and <Help>.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -070069"\n"
70"o To get help with an item, use the cursor keys to highlight <Help>\n"
Li Zefan22c7eca2010-04-14 11:46:02 +080071" and press <ENTER>.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -070072"\n"
73" Shortcut: Press <H> or <?>.\n"
74"\n"
Li Zefanf9447c42010-05-07 13:57:22 +080075"o To toggle the display of hidden options, press <Z>.\n"
Li Zefan22c7eca2010-04-14 11:46:02 +080076"\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -070077"\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"
108" keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
109" who are familiar with less and lynx.\n"
110"\n"
111"o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
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"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400118"between different configurations.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119"\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"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400151"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"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700154"\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"
Sam Ravnborg45897212006-07-24 22:04:04 +0200162"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"
Sam Ravnborg350b5b72006-07-24 22:19:51 +0200174" classic => theme with blue background. The classic look\n"
175" bluetitle => a LCD friendly version of classic. (default)\n"
Sam Ravnborg45897212006-07-24 22:04:04 +0200176"\n"),
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700177menu_instructions[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178 "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. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700183 "Legend: [*] built-in [ ] excluded <M> module < > module capable"),
184radiolist_instructions[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185 "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>. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700188 "Press <?> for additional information about this option."),
189inputbox_instructions_int[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 "Please enter a decimal value. "
191 "Fractions will not be accepted. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700192 "Use the <TAB> key to move from the input field to the buttons below it."),
193inputbox_instructions_hex[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194 "Please enter a hexadecimal value. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700195 "Use the <TAB> key to move from the input field to the buttons below it."),
196inputbox_instructions_string[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 "Please enter a string value. "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700198 "Use the <TAB> key to move from the input field to the buttons below it."),
199setmod_text[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200 "This feature depends on another which has been configured as a module.\n"
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700201 "As a result, this feature will be built as a module."),
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700202load_config_text[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 "Enter the name of the configuration file you wish to load. "
204 "Accept the name shown to restore the configuration you "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700205 "last retrieved. Leave blank to abort."),
206load_config_help[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207 "\n"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400208 "For various reasons, one may wish to keep several different\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 "configurations available on a single machine.\n"
210 "\n"
211 "If you have saved a previous configuration in a file other than the\n"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400212 "default one, entering its name here will allow you to modify that\n"
213 "configuration.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 "\n"
215 "If you are uncertain, then you have probably never used alternate\n"
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200216 "configuration files. You should therefore leave this blank to abort.\n"),
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700217save_config_text[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218 "Enter a filename to which this configuration should be saved "
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700219 "as an alternate. Leave blank to abort."),
220save_config_help[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 "\n"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400222 "For various reasons, one may wish to keep different configurations\n"
223 "available on a single machine.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224 "\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"
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700230 "leave this blank.\n"),
231search_help[] = N_(
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232 "\n"
Arnaud Lacombe59dfa242010-08-21 00:43:46 -0400233 "Search for symbols and display their relations.\n"
Randy Dunlap503af332005-10-30 15:02:15 -0800234 "Regular expressions are allowed.\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235 "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"
243 " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
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"
Arnaud Lacombe59dfa242010-08-21 00:43:46 -0400250 " this symbol\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 "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"
Arnaud Lacombe59dfa242010-08-21 00:43:46 -0400266 "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"
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700269 "\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271static int indent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700272static struct menu *current_menu;
273static int child_count;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274static int single_menu_mode;
Li Zefan22c7eca2010-04-14 11:46:02 +0800275static int show_all_options;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276
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);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100286static 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;
291 struct symbol *sym;
292
293 sym = sym_lookup("KERNELVERSION", 0);
294 sym_calc_value(sym);
295 size = snprintf(menu_backtitle, sizeof(menu_backtitle),
296 _("%s - Linux Kernel v%s Configuration"),
297 config_filename, sym_get_string_value(sym));
298 if (size >= sizeof(menu_backtitle))
299 menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
300 set_dialog_backtitle(menu_backtitle);
301
302 size = snprintf(filename, sizeof(filename), "%s", config_filename);
303 if (size >= sizeof(filename))
304 filename[sizeof(filename)-1] = '\0';
305}
306
307
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308static void search_conf(void)
309{
310 struct symbol **sym_arr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311 struct gstr res;
Bernhard Walle0584f9f2007-07-09 11:43:56 -0700312 char *dialog_input;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200313 int dres;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314again:
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200315 dialog_clear();
Sam Ravnborg2982de62006-07-27 22:10:27 +0200316 dres = dialog_inputbox(_("Search Configuration Parameter"),
Arnaud Lacombeffb59572010-08-14 23:57:43 -0400317 _("Enter " CONFIG_ " (sub)string to search for "
318 "(with or without \"" CONFIG_ "\")"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200319 10, 75, "");
320 switch (dres) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700321 case 0:
322 break;
323 case 1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700324 show_helptext(_("Search Configuration"), search_help);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325 goto again;
326 default:
327 return;
328 }
329
Arnaud Lacombeffb59572010-08-14 23:57:43 -0400330 /* strip the prefix if necessary */
Bernhard Walle0584f9f2007-07-09 11:43:56 -0700331 dialog_input = dialog_input_result;
Arnaud Lacombeffb59572010-08-14 23:57:43 -0400332 if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
333 dialog_input += strlen(CONFIG_);
Bernhard Walle0584f9f2007-07-09 11:43:56 -0700334
335 sym_arr = sym_re_search(dialog_input);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336 res = get_relations_str(sym_arr);
337 free(sym_arr);
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700338 show_textbox(_("Search Results"), str_get(&res), 0, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 str_free(&res);
340}
341
342static void build_conf(struct menu *menu)
343{
344 struct symbol *sym;
345 struct property *prop;
346 struct menu *child;
347 int type, tmp, doint = 2;
348 tristate val;
349 char ch;
Li Zefan22c7eca2010-04-14 11:46:02 +0800350 bool visible;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351
Li Zefan22c7eca2010-04-14 11:46:02 +0800352 /*
353 * note: menu_is_visible() has side effect that it will
354 * recalc the value of the symbol.
355 */
356 visible = menu_is_visible(menu);
357 if (show_all_options && !menu_has_prompt(menu))
358 return;
359 else if (!show_all_options && !visible)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 return;
361
362 sym = menu->sym;
363 prop = menu->prompt;
364 if (!sym) {
365 if (prop && menu != current_menu) {
366 const char *prompt = menu_get_prompt(menu);
367 switch (prop->type) {
368 case P_MENU:
369 child_count++;
EGRY Gabor413f0062008-01-11 23:50:37 +0100370 prompt = _(prompt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 if (single_menu_mode) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200372 item_make("%s%*c%s",
373 menu->data ? "-->" : "++>",
374 indent + 1, ' ', prompt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375 } else
Sam Ravnborg2982de62006-07-27 22:10:27 +0200376 item_make(" %*c%s --->", indent + 1, ' ', prompt);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377
Sam Ravnborg2982de62006-07-27 22:10:27 +0200378 item_set_tag('m');
379 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700380 if (single_menu_mode && menu->data)
381 goto conf_childs;
382 return;
Sam Ravnborg48874072007-09-18 21:12:26 +0200383 case P_COMMENT:
384 if (prompt) {
385 child_count++;
EGRY Gabor413f0062008-01-11 23:50:37 +0100386 item_make(" %*c*** %s ***", indent + 1, ' ', _(prompt));
Sam Ravnborg48874072007-09-18 21:12:26 +0200387 item_set_tag(':');
388 item_set_data(menu);
389 }
390 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 default:
392 if (prompt) {
393 child_count++;
EGRY Gabor413f0062008-01-11 23:50:37 +0100394 item_make("---%*c%s", indent + 1, ' ', _(prompt));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200395 item_set_tag(':');
396 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397 }
398 }
399 } else
400 doint = 0;
401 goto conf_childs;
402 }
403
404 type = sym_get_type(sym);
405 if (sym_is_choice(sym)) {
406 struct symbol *def_sym = sym_get_choice_value(sym);
407 struct menu *def_menu = NULL;
408
409 child_count++;
410 for (child = menu->list; child; child = child->next) {
411 if (menu_is_visible(child) && child->sym == def_sym)
412 def_menu = child;
413 }
414
415 val = sym_get_tristate_value(sym);
416 if (sym_is_changable(sym)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 switch (type) {
418 case S_BOOLEAN:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200419 item_make("[%c]", val == no ? ' ' : '*');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420 break;
421 case S_TRISTATE:
422 switch (val) {
423 case yes: ch = '*'; break;
424 case mod: ch = 'M'; break;
425 default: ch = ' '; break;
426 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200427 item_make("<%c>", ch);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 break;
429 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200430 item_set_tag('t');
431 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 } else {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200433 item_make(" ");
434 item_set_tag(def_menu ? 't' : ':');
435 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436 }
437
EGRY Gabor413f0062008-01-11 23:50:37 +0100438 item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700439 if (val == yes) {
440 if (def_menu) {
EGRY Gabor413f0062008-01-11 23:50:37 +0100441 item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200442 item_add_str(" --->");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443 if (def_menu->list) {
444 indent += 2;
445 build_conf(def_menu);
446 indent -= 2;
447 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200448 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449 return;
450 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 } else {
452 if (menu == current_menu) {
EGRY Gabor413f0062008-01-11 23:50:37 +0100453 item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200454 item_set_tag(':');
455 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 goto conf_childs;
457 }
458 child_count++;
459 val = sym_get_tristate_value(sym);
460 if (sym_is_choice_value(sym) && val == yes) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200461 item_make(" ");
462 item_set_tag(':');
463 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464 } else {
465 switch (type) {
466 case S_BOOLEAN:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700467 if (sym_is_changable(sym))
Sam Ravnborg2982de62006-07-27 22:10:27 +0200468 item_make("[%c]", val == no ? ' ' : '*');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469 else
Matej Laitlb5d609d2007-10-02 13:46:50 -0700470 item_make("-%c-", val == no ? ' ' : '*');
Sam Ravnborg2982de62006-07-27 22:10:27 +0200471 item_set_tag('t');
472 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 break;
474 case S_TRISTATE:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475 switch (val) {
476 case yes: ch = '*'; break;
477 case mod: ch = 'M'; break;
478 default: ch = ' '; break;
479 }
Matej Laitlb5d609d2007-10-02 13:46:50 -0700480 if (sym_is_changable(sym)) {
481 if (sym->rev_dep.tri == mod)
482 item_make("{%c}", ch);
483 else
484 item_make("<%c>", ch);
485 } else
486 item_make("-%c-", ch);
Sam Ravnborg2982de62006-07-27 22:10:27 +0200487 item_set_tag('t');
488 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489 break;
490 default:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200491 tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
492 item_make("(%s)", sym_get_string_value(sym));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 tmp = indent - tmp + 4;
494 if (tmp < 0)
495 tmp = 0;
EGRY Gabor413f0062008-01-11 23:50:37 +0100496 item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200497 (sym_has_value(sym) || !sym_is_changable(sym)) ?
EGRY Gabor413f0062008-01-11 23:50:37 +0100498 "" : _(" (NEW)"));
Sam Ravnborg2982de62006-07-27 22:10:27 +0200499 item_set_tag('s');
500 item_set_data(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501 goto conf_childs;
502 }
503 }
EGRY Gabor413f0062008-01-11 23:50:37 +0100504 item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200505 (sym_has_value(sym) || !sym_is_changable(sym)) ?
EGRY Gabor413f0062008-01-11 23:50:37 +0100506 "" : _(" (NEW)"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507 if (menu->prompt->type == P_MENU) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200508 item_add_str(" --->");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 return;
510 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 }
512
513conf_childs:
514 indent += doint;
515 for (child = menu->list; child; child = child->next)
516 build_conf(child);
517 indent -= doint;
518}
519
520static void conf(struct menu *menu)
521{
522 struct menu *submenu;
523 const char *prompt = menu_get_prompt(menu);
524 struct symbol *sym;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200525 struct menu *active_menu = NULL;
526 int res;
527 int s_scroll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200530 item_reset();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 current_menu = menu;
532 build_conf(menu);
533 if (!child_count)
534 break;
535 if (menu == &rootmenu) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200536 item_make("--- ");
537 item_set_tag(':');
538 item_make(_(" Load an Alternate Configuration File"));
539 item_set_tag('L');
540 item_make(_(" Save an Alternate Configuration File"));
541 item_set_tag('S');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 }
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200543 dialog_clear();
EGRY Gabor413f0062008-01-11 23:50:37 +0100544 res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200545 _(menu_instructions),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200546 active_menu, &s_scroll);
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200547 if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 break;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200549 if (!item_activate_selected())
550 continue;
551 if (!item_tag())
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552 continue;
553
Sam Ravnborg2982de62006-07-27 22:10:27 +0200554 submenu = item_data();
555 active_menu = item_data();
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200556 if (submenu)
557 sym = submenu->sym;
558 else
559 sym = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560
Sam Ravnborg2982de62006-07-27 22:10:27 +0200561 switch (res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200563 switch (item_tag()) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564 case 'm':
565 if (single_menu_mode)
566 submenu->data = (void *) (long) !submenu->data;
567 else
568 conf(submenu);
569 break;
570 case 't':
571 if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
572 conf_choice(submenu);
573 else if (submenu->prompt->type == P_MENU)
574 conf(submenu);
575 break;
576 case 's':
577 conf_string(submenu);
578 break;
579 case 'L':
580 conf_load();
581 break;
582 case 'S':
583 conf_save();
584 break;
585 }
586 break;
587 case 2:
588 if (sym)
589 show_help(submenu);
590 else
EGRY Gabor413f0062008-01-11 23:50:37 +0100591 show_helptext(_("README"), _(mconf_readme));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 break;
593 case 3:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200594 if (item_is_tag('t')) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 if (sym_set_tristate_value(sym, yes))
596 break;
597 if (sym_set_tristate_value(sym, mod))
598 show_textbox(NULL, setmod_text, 6, 74);
599 }
600 break;
601 case 4:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200602 if (item_is_tag('t'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 sym_set_tristate_value(sym, no);
604 break;
605 case 5:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200606 if (item_is_tag('t'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 sym_set_tristate_value(sym, mod);
608 break;
609 case 6:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200610 if (item_is_tag('t'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611 sym_toggle_tristate_value(sym);
Sam Ravnborg2982de62006-07-27 22:10:27 +0200612 else if (item_is_tag('m'))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613 conf(submenu);
614 break;
615 case 7:
616 search_conf();
617 break;
Li Zefan22c7eca2010-04-14 11:46:02 +0800618 case 8:
619 show_all_options = !show_all_options;
620 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 }
622 }
623}
624
625static void show_textbox(const char *title, const char *text, int r, int c)
626{
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200627 dialog_clear();
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200628 dialog_textbox(title, text, r, c);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629}
630
631static void show_helptext(const char *title, const char *text)
632{
633 show_textbox(title, text, 0, 0);
634}
635
636static void show_help(struct menu *menu)
637{
638 struct gstr help = str_new();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639
Vadim Bendebury (вб)da60fbb2009-12-20 00:29:49 -0800640 help.max_width = getmaxx(stdscr) - 10;
Cheng Renquan1d525e72009-07-12 16:11:45 +0800641 menu_get_ext_help(menu, &help);
642
EGRY Gabor413f0062008-01-11 23:50:37 +0100643 show_helptext(_(menu_get_prompt(menu)), str_get(&help));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644 str_free(&help);
645}
646
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647static void conf_choice(struct menu *menu)
648{
EGRY Gabor413f0062008-01-11 23:50:37 +0100649 const char *prompt = _(menu_get_prompt(menu));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 struct menu *child;
651 struct symbol *active;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652
653 active = sym_get_choice_value(menu->sym);
654 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200655 int res;
656 int selected;
657 item_reset();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658
659 current_menu = menu;
660 for (child = menu->list; child; child = child->next) {
661 if (!menu_is_visible(child))
662 continue;
Peter Korsgaardaf6c1592009-02-15 22:15:16 +0100663 if (child->sym)
664 item_make("%s", _(menu_get_prompt(child)));
665 else {
666 item_make("*** %s ***", _(menu_get_prompt(child)));
667 item_set_tag(':');
668 }
Sam Ravnborg2982de62006-07-27 22:10:27 +0200669 item_set_data(child);
670 if (child->sym == active)
671 item_set_selected(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 if (child->sym == sym_get_choice_value(menu->sym))
Sam Ravnborg2982de62006-07-27 22:10:27 +0200673 item_set_tag('X');
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 }
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200675 dialog_clear();
EGRY Gabor413f0062008-01-11 23:50:37 +0100676 res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200677 _(radiolist_instructions),
678 15, 70, 6);
679 selected = item_activate_selected();
680 switch (res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200682 if (selected) {
683 child = item_data();
Peter Korsgaardaf6c1592009-02-15 22:15:16 +0100684 if (!child->sym)
685 break;
686
Sam Ravnborg2982de62006-07-27 22:10:27 +0200687 sym_set_tristate_value(child->sym, yes);
688 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 return;
690 case 1:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200691 if (selected) {
692 child = item_data();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 show_help(child);
694 active = child->sym;
695 } else
696 show_help(menu);
697 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200698 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699 return;
Sam Ravnborgc8dc68a2006-07-29 22:48:57 +0200700 case -ERRDISPLAYTOOSMALL:
701 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 }
703 }
704}
705
706static void conf_string(struct menu *menu)
707{
708 const char *prompt = menu_get_prompt(menu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709
710 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200711 int res;
Sam Ravnborgc4143a82008-05-04 21:03:20 +0200712 const char *heading;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200713
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 switch (sym_get_type(menu->sym)) {
715 case S_INT:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200716 heading = _(inputbox_instructions_int);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 break;
718 case S_HEX:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200719 heading = _(inputbox_instructions_hex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 break;
721 case S_STRING:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200722 heading = _(inputbox_instructions_string);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 break;
724 default:
EGRY Gabor413f0062008-01-11 23:50:37 +0100725 heading = _("Internal mconf error!");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726 }
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200727 dialog_clear();
EGRY Gabor413f0062008-01-11 23:50:37 +0100728 res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
Sam Ravnborg2982de62006-07-27 22:10:27 +0200729 heading, 10, 75,
730 sym_get_string_value(menu->sym));
731 switch (res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200733 if (sym_set_string_value(menu->sym, dialog_input_result))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 return;
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700735 show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 break;
737 case 1:
738 show_help(menu);
739 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200740 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 return;
742 }
743 }
744}
745
746static void conf_load(void)
747{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700748
749 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200750 int res;
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200751 dialog_clear();
Sam Ravnborg2982de62006-07-27 22:10:27 +0200752 res = dialog_inputbox(NULL, load_config_text,
753 11, 55, filename);
754 switch(res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200756 if (!dialog_input_result[0])
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100758 if (!conf_read(dialog_input_result)) {
759 set_config_filename(dialog_input_result);
Sam Ravnborg36ef8052008-02-02 20:44:09 +0100760 sym_set_change_count(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700761 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100762 }
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700763 show_textbox(NULL, _("File does not exist!"), 5, 38);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764 break;
765 case 1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700766 show_helptext(_("Load Alternate Configuration"), load_config_help);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200768 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769 return;
770 }
771 }
772}
773
774static void conf_save(void)
775{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 while (1) {
Sam Ravnborg2982de62006-07-27 22:10:27 +0200777 int res;
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200778 dialog_clear();
Sam Ravnborg2982de62006-07-27 22:10:27 +0200779 res = dialog_inputbox(NULL, save_config_text,
780 11, 55, filename);
781 switch(res) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 case 0:
Sam Ravnborg2982de62006-07-27 22:10:27 +0200783 if (!dialog_input_result[0])
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100785 if (!conf_write(dialog_input_result)) {
786 set_config_filename(dialog_input_result);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787 return;
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100788 }
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700789 show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790 break;
791 case 1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700792 show_helptext(_("Save Alternate Configuration"), save_config_help);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 break;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200794 case KEY_ESC:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 return;
796 }
797 }
798}
799
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800int main(int ac, char **av)
801{
Ladislav Michl09af0912007-12-17 19:07:41 +0100802 int saved_x, saved_y;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 char *mode;
Sam Ravnborg2982de62006-07-27 22:10:27 +0200804 int res;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700806 setlocale(LC_ALL, "");
807 bindtextdomain(PACKAGE, LOCALEDIR);
808 textdomain(PACKAGE);
809
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 conf_parse(av[1]);
811 conf_read(NULL);
812
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 mode = getenv("MENUCONFIG_MODE");
814 if (mode) {
815 if (!strcasecmp(mode, "single_menu"))
816 single_menu_mode = 1;
817 }
818
Arnaud Lacombed0e1e092009-07-06 00:07:28 -0400819 initscr();
820
Ladislav Michl09af0912007-12-17 19:07:41 +0100821 getyx(stdscr, saved_y, saved_x);
822 if (init_dialog(NULL)) {
823 fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
824 fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
825 return 1;
826 }
827
Sam Ravnborgd802b502007-04-01 22:29:38 +0200828 set_config_filename(conf_get_configname());
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200829 do {
830 conf(&rootmenu);
Sam Ravnborge94c5bd2006-09-25 17:35:43 +0200831 dialog_clear();
Karsten Wieseb3214292006-12-13 00:34:06 -0800832 if (conf_get_changed())
833 res = dialog_yesno(NULL,
834 _("Do you wish to save your "
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400835 "new configuration?\n"
Karsten Wieseb3214292006-12-13 00:34:06 -0800836 "<ESC><ESC> to continue."),
837 6, 60);
838 else
839 res = -1;
Sam Ravnborgf3cbcdc2006-07-28 23:57:48 +0200840 } while (res == KEY_ESC);
Ladislav Michl09af0912007-12-17 19:07:41 +0100841 end_dialog(saved_x, saved_y);
Karsten Wieseb3214292006-12-13 00:34:06 -0800842
843 switch (res) {
844 case 0:
Sam Ravnborg95e30f92007-03-18 10:48:46 +0100845 if (conf_write(filename)) {
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700846 fprintf(stderr, _("\n\n"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400847 "Error while writing of the configuration.\n"
848 "Your configuration changes were NOT saved."
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700849 "\n\n"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 return 1;
851 }
Karsten Wieseb3214292006-12-13 00:34:06 -0800852 case -1:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700853 printf(_("\n\n"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400854 "*** End of the configuration.\n"
855 "*** Execute 'make' to start the build or try 'make help'."
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700856 "\n\n"));
Karsten Wieseb3214292006-12-13 00:34:06 -0800857 break;
858 default:
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700859 fprintf(stderr, _("\n\n"
Arnaud Lacombe652cf982010-08-14 23:51:40 -0400860 "Your configuration changes were NOT saved."
Arnaldo Carvalho de Melo3b9fa092005-05-05 15:09:46 -0700861 "\n\n"));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 }
863
864 return 0;
865}
Sam Ravnborgc4143a82008-05-04 21:03:20 +0200866