xref: /openbmc/u-boot/scripts/kconfig/mconf.c (revision 3eceff64)
10a9064fbSMasahiro Yamada /*
20a9064fbSMasahiro Yamada  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
30a9064fbSMasahiro Yamada  * Released under the terms of the GNU GPL v2.0.
40a9064fbSMasahiro Yamada  *
50a9064fbSMasahiro Yamada  * Introduced single menu mode (show all sub-menus in one large tree).
60a9064fbSMasahiro Yamada  * 2002-11-06 Petr Baudis <pasky@ucw.cz>
70a9064fbSMasahiro Yamada  *
80a9064fbSMasahiro Yamada  * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br>
90a9064fbSMasahiro Yamada  */
100a9064fbSMasahiro Yamada 
110a9064fbSMasahiro Yamada #include <ctype.h>
120a9064fbSMasahiro Yamada #include <errno.h>
130a9064fbSMasahiro Yamada #include <fcntl.h>
140a9064fbSMasahiro Yamada #include <limits.h>
150a9064fbSMasahiro Yamada #include <stdarg.h>
160a9064fbSMasahiro Yamada #include <stdlib.h>
170a9064fbSMasahiro Yamada #include <string.h>
180a9064fbSMasahiro Yamada #include <signal.h>
190a9064fbSMasahiro Yamada #include <unistd.h>
200a9064fbSMasahiro Yamada #include <locale.h>
210a9064fbSMasahiro Yamada 
220a9064fbSMasahiro Yamada #include "lkc.h"
230a9064fbSMasahiro Yamada #include "lxdialog/dialog.h"
240a9064fbSMasahiro Yamada 
250a9064fbSMasahiro Yamada static const char mconf_readme[] = N_(
260a9064fbSMasahiro Yamada "Overview\n"
270a9064fbSMasahiro Yamada "--------\n"
280a9064fbSMasahiro Yamada "This interface lets you select features and parameters for the build.\n"
290a9064fbSMasahiro Yamada "Features can either be built-in, modularized, or ignored. Parameters\n"
300a9064fbSMasahiro Yamada "must be entered in as decimal or hexadecimal numbers or text.\n"
310a9064fbSMasahiro Yamada "\n"
320a9064fbSMasahiro Yamada "Menu items beginning with following braces represent features that\n"
330a9064fbSMasahiro Yamada "  [ ] can be built in or removed\n"
340a9064fbSMasahiro Yamada "  < > can be built in, modularized or removed\n"
350a9064fbSMasahiro Yamada "  { } can be built in or modularized (selected by other feature)\n"
360a9064fbSMasahiro Yamada "  - - are selected by other feature,\n"
370a9064fbSMasahiro Yamada "while *, M or whitespace inside braces means to build in, build as\n"
380a9064fbSMasahiro Yamada "a module or to exclude the feature respectively.\n"
390a9064fbSMasahiro Yamada "\n"
400a9064fbSMasahiro Yamada "To change any of these features, highlight it with the cursor\n"
410a9064fbSMasahiro Yamada "keys and press <Y> to build it in, <M> to make it a module or\n"
420a9064fbSMasahiro Yamada "<N> to remove it.  You may also press the <Space Bar> to cycle\n"
430a9064fbSMasahiro Yamada "through the available options (i.e. Y->N->M->Y).\n"
440a9064fbSMasahiro Yamada "\n"
450a9064fbSMasahiro Yamada "Some additional keyboard hints:\n"
460a9064fbSMasahiro Yamada "\n"
470a9064fbSMasahiro Yamada "Menus\n"
480a9064fbSMasahiro Yamada "----------\n"
490a9064fbSMasahiro Yamada "o  Use the Up/Down arrow keys (cursor keys) to highlight the item you\n"
500a9064fbSMasahiro Yamada "   wish to change or the submenu you wish to select and press <Enter>.\n"
510a9064fbSMasahiro Yamada "   Submenus are designated by \"--->\", empty ones by \"----\".\n"
520a9064fbSMasahiro Yamada "\n"
530a9064fbSMasahiro Yamada "   Shortcut: Press the option's highlighted letter (hotkey).\n"
540a9064fbSMasahiro Yamada "             Pressing a hotkey more than once will sequence\n"
550a9064fbSMasahiro Yamada "             through all visible items which use that hotkey.\n"
560a9064fbSMasahiro Yamada "\n"
570a9064fbSMasahiro Yamada "   You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
580a9064fbSMasahiro Yamada "   unseen options into view.\n"
590a9064fbSMasahiro Yamada "\n"
600a9064fbSMasahiro Yamada "o  To exit a menu use the cursor keys to highlight the <Exit> button\n"
610a9064fbSMasahiro Yamada "   and press <ENTER>.\n"
620a9064fbSMasahiro Yamada "\n"
630a9064fbSMasahiro Yamada "   Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
640a9064fbSMasahiro Yamada "             using those letters.  You may press a single <ESC>, but\n"
650a9064fbSMasahiro Yamada "             there is a delayed response which you may find annoying.\n"
660a9064fbSMasahiro Yamada "\n"
670a9064fbSMasahiro Yamada "   Also, the <TAB> and cursor keys will cycle between <Select>,\n"
680a9064fbSMasahiro Yamada "   <Exit>, <Help>, <Save>, and <Load>.\n"
690a9064fbSMasahiro Yamada "\n"
700a9064fbSMasahiro Yamada "o  To get help with an item, use the cursor keys to highlight <Help>\n"
710a9064fbSMasahiro Yamada "   and press <ENTER>.\n"
720a9064fbSMasahiro Yamada "\n"
730a9064fbSMasahiro Yamada "   Shortcut: Press <H> or <?>.\n"
740a9064fbSMasahiro Yamada "\n"
750a9064fbSMasahiro Yamada "o  To toggle the display of hidden options, press <Z>.\n"
760a9064fbSMasahiro Yamada "\n"
770a9064fbSMasahiro Yamada "\n"
780a9064fbSMasahiro Yamada "Radiolists  (Choice lists)\n"
790a9064fbSMasahiro Yamada "-----------\n"
800a9064fbSMasahiro Yamada "o  Use the cursor keys to select the option you wish to set and press\n"
810a9064fbSMasahiro Yamada "   <S> or the <SPACE BAR>.\n"
820a9064fbSMasahiro Yamada "\n"
830a9064fbSMasahiro Yamada "   Shortcut: Press the first letter of the option you wish to set then\n"
840a9064fbSMasahiro Yamada "             press <S> or <SPACE BAR>.\n"
850a9064fbSMasahiro Yamada "\n"
860a9064fbSMasahiro Yamada "o  To see available help for the item, use the cursor keys to highlight\n"
870a9064fbSMasahiro Yamada "   <Help> and Press <ENTER>.\n"
880a9064fbSMasahiro Yamada "\n"
890a9064fbSMasahiro Yamada "   Shortcut: Press <H> or <?>.\n"
900a9064fbSMasahiro Yamada "\n"
910a9064fbSMasahiro Yamada "   Also, the <TAB> and cursor keys will cycle between <Select> and\n"
920a9064fbSMasahiro Yamada "   <Help>\n"
930a9064fbSMasahiro Yamada "\n"
940a9064fbSMasahiro Yamada "\n"
950a9064fbSMasahiro Yamada "Data Entry\n"
960a9064fbSMasahiro Yamada "-----------\n"
970a9064fbSMasahiro Yamada "o  Enter the requested information and press <ENTER>\n"
980a9064fbSMasahiro Yamada "   If you are entering hexadecimal values, it is not necessary to\n"
990a9064fbSMasahiro Yamada "   add the '0x' prefix to the entry.\n"
1000a9064fbSMasahiro Yamada "\n"
1010a9064fbSMasahiro Yamada "o  For help, use the <TAB> or cursor keys to highlight the help option\n"
1020a9064fbSMasahiro Yamada "   and press <ENTER>.  You can try <TAB><H> as well.\n"
1030a9064fbSMasahiro Yamada "\n"
1040a9064fbSMasahiro Yamada "\n"
1050a9064fbSMasahiro Yamada "Text Box    (Help Window)\n"
1060a9064fbSMasahiro Yamada "--------\n"
1070a9064fbSMasahiro Yamada "o  Use the cursor keys to scroll up/down/left/right.  The VI editor\n"
1080a9064fbSMasahiro Yamada "   keys h,j,k,l function here as do <u>, <d>, <SPACE BAR> and <B> for\n"
1090a9064fbSMasahiro Yamada "   those who are familiar with less and lynx.\n"
1100a9064fbSMasahiro Yamada "\n"
1110a9064fbSMasahiro Yamada "o  Press <E>, <X>, <q>, <Enter> or <Esc><Esc> to exit.\n"
1120a9064fbSMasahiro Yamada "\n"
1130a9064fbSMasahiro Yamada "\n"
1140a9064fbSMasahiro Yamada "Alternate Configuration Files\n"
1150a9064fbSMasahiro Yamada "-----------------------------\n"
1160a9064fbSMasahiro Yamada "Menuconfig supports the use of alternate configuration files for\n"
1170a9064fbSMasahiro Yamada "those who, for various reasons, find it necessary to switch\n"
1180a9064fbSMasahiro Yamada "between different configurations.\n"
1190a9064fbSMasahiro Yamada "\n"
1200a9064fbSMasahiro Yamada "The <Save> button will let you save the current configuration to\n"
1210a9064fbSMasahiro Yamada "a file of your choosing.  Use the <Load> button to load a previously\n"
1220a9064fbSMasahiro Yamada "saved alternate configuration.\n"
1230a9064fbSMasahiro Yamada "\n"
1240a9064fbSMasahiro Yamada "Even if you don't use alternate configuration files, but you find\n"
1250a9064fbSMasahiro Yamada "during a Menuconfig session that you have completely messed up your\n"
1260a9064fbSMasahiro Yamada "settings, you may use the <Load> button to restore your previously\n"
1270a9064fbSMasahiro Yamada "saved settings from \".config\" without restarting Menuconfig.\n"
1280a9064fbSMasahiro Yamada "\n"
1290a9064fbSMasahiro Yamada "Other information\n"
1300a9064fbSMasahiro Yamada "-----------------\n"
1310a9064fbSMasahiro Yamada "If you use Menuconfig in an XTERM window, make sure you have your\n"
1320a9064fbSMasahiro Yamada "$TERM variable set to point to an xterm definition which supports\n"
1330a9064fbSMasahiro Yamada "color.  Otherwise, Menuconfig will look rather bad.  Menuconfig will\n"
1340a9064fbSMasahiro Yamada "not display correctly in an RXVT window because rxvt displays only one\n"
1350a9064fbSMasahiro Yamada "intensity of color, bright.\n"
1360a9064fbSMasahiro Yamada "\n"
1370a9064fbSMasahiro Yamada "Menuconfig will display larger menus on screens or xterms which are\n"
1380a9064fbSMasahiro Yamada "set to display more than the standard 25 row by 80 column geometry.\n"
1390a9064fbSMasahiro Yamada "In order for this to work, the \"stty size\" command must be able to\n"
1400a9064fbSMasahiro Yamada "display the screen's current row and column geometry.  I STRONGLY\n"
1410a9064fbSMasahiro Yamada "RECOMMEND that you make sure you do NOT have the shell variables\n"
1420a9064fbSMasahiro Yamada "LINES and COLUMNS exported into your environment.  Some distributions\n"
1430a9064fbSMasahiro Yamada "export those variables via /etc/profile.  Some ncurses programs can\n"
1440a9064fbSMasahiro Yamada "become confused when those variables (LINES & COLUMNS) don't reflect\n"
1450a9064fbSMasahiro Yamada "the true screen size.\n"
1460a9064fbSMasahiro Yamada "\n"
1470a9064fbSMasahiro Yamada "Optional personality available\n"
1480a9064fbSMasahiro Yamada "------------------------------\n"
1490a9064fbSMasahiro Yamada "If you prefer to have all of the options listed in a single menu,\n"
1500a9064fbSMasahiro Yamada "rather than the default multimenu hierarchy, run the menuconfig with\n"
1510a9064fbSMasahiro Yamada "MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
1520a9064fbSMasahiro Yamada "\n"
1530a9064fbSMasahiro Yamada "make MENUCONFIG_MODE=single_menu menuconfig\n"
1540a9064fbSMasahiro Yamada "\n"
1550a9064fbSMasahiro Yamada "<Enter> will then unroll the appropriate category, or enfold it if it\n"
1560a9064fbSMasahiro Yamada "is already unrolled.\n"
1570a9064fbSMasahiro Yamada "\n"
1580a9064fbSMasahiro Yamada "Note that this mode can eventually be a little more CPU expensive\n"
1590a9064fbSMasahiro Yamada "(especially with a larger number of unrolled categories) than the\n"
1600a9064fbSMasahiro Yamada "default mode.\n"
1610a9064fbSMasahiro Yamada "\n"
1620a9064fbSMasahiro Yamada "Different color themes available\n"
1630a9064fbSMasahiro Yamada "--------------------------------\n"
1640a9064fbSMasahiro Yamada "It is possible to select different color themes using the variable\n"
1650a9064fbSMasahiro Yamada "MENUCONFIG_COLOR. To select a theme use:\n"
1660a9064fbSMasahiro Yamada "\n"
1670a9064fbSMasahiro Yamada "make MENUCONFIG_COLOR=<theme> menuconfig\n"
1680a9064fbSMasahiro Yamada "\n"
1690a9064fbSMasahiro Yamada "Available themes are\n"
1700a9064fbSMasahiro Yamada " mono       => selects colors suitable for monochrome displays\n"
1710a9064fbSMasahiro Yamada " blackbg    => selects a color scheme with black background\n"
1720a9064fbSMasahiro Yamada " classic    => theme with blue background. The classic look\n"
1730a9064fbSMasahiro Yamada " bluetitle  => an LCD friendly version of classic. (default)\n"
1740a9064fbSMasahiro Yamada "\n"),
1750a9064fbSMasahiro Yamada menu_instructions[] = N_(
1760a9064fbSMasahiro Yamada 	"Arrow keys navigate the menu.  "
1770a9064fbSMasahiro Yamada 	"<Enter> selects submenus ---> (or empty submenus ----).  "
1780a9064fbSMasahiro Yamada 	"Highlighted letters are hotkeys.  "
1790a9064fbSMasahiro Yamada 	"Pressing <Y> includes, <N> excludes, <M> modularizes features.  "
1800a9064fbSMasahiro Yamada 	"Press <Esc><Esc> to exit, <?> for Help, </> for Search.  "
1810a9064fbSMasahiro Yamada 	"Legend: [*] built-in  [ ] excluded  <M> module  < > module capable"),
1820a9064fbSMasahiro Yamada radiolist_instructions[] = N_(
1830a9064fbSMasahiro Yamada 	"Use the arrow keys to navigate this window or "
1840a9064fbSMasahiro Yamada 	"press the hotkey of the item you wish to select "
1850a9064fbSMasahiro Yamada 	"followed by the <SPACE BAR>. "
1860a9064fbSMasahiro Yamada 	"Press <?> for additional information about this option."),
1870a9064fbSMasahiro Yamada inputbox_instructions_int[] = N_(
1880a9064fbSMasahiro Yamada 	"Please enter a decimal value. "
1890a9064fbSMasahiro Yamada 	"Fractions will not be accepted.  "
1900a9064fbSMasahiro Yamada 	"Use the <TAB> key to move from the input field to the buttons below it."),
1910a9064fbSMasahiro Yamada inputbox_instructions_hex[] = N_(
1920a9064fbSMasahiro Yamada 	"Please enter a hexadecimal value. "
1930a9064fbSMasahiro Yamada 	"Use the <TAB> key to move from the input field to the buttons below it."),
1940a9064fbSMasahiro Yamada inputbox_instructions_string[] = N_(
1950a9064fbSMasahiro Yamada 	"Please enter a string value. "
1960a9064fbSMasahiro Yamada 	"Use the <TAB> key to move from the input field to the buttons below it."),
1970a9064fbSMasahiro Yamada setmod_text[] = N_(
1980a9064fbSMasahiro Yamada 	"This feature depends on another which has been configured as a module.\n"
1990a9064fbSMasahiro Yamada 	"As a result, this feature will be built as a module."),
2000a9064fbSMasahiro Yamada load_config_text[] = N_(
2010a9064fbSMasahiro Yamada 	"Enter the name of the configuration file you wish to load.  "
2020a9064fbSMasahiro Yamada 	"Accept the name shown to restore the configuration you "
2030a9064fbSMasahiro Yamada 	"last retrieved.  Leave blank to abort."),
2040a9064fbSMasahiro Yamada load_config_help[] = N_(
2050a9064fbSMasahiro Yamada 	"\n"
2060a9064fbSMasahiro Yamada 	"For various reasons, one may wish to keep several different\n"
2070a9064fbSMasahiro Yamada 	"configurations available on a single machine.\n"
2080a9064fbSMasahiro Yamada 	"\n"
2090a9064fbSMasahiro Yamada 	"If you have saved a previous configuration in a file other than the\n"
2100a9064fbSMasahiro Yamada 	"default one, entering its name here will allow you to modify that\n"
2110a9064fbSMasahiro Yamada 	"configuration.\n"
2120a9064fbSMasahiro Yamada 	"\n"
2130a9064fbSMasahiro Yamada 	"If you are uncertain, then you have probably never used alternate\n"
2140a9064fbSMasahiro Yamada 	"configuration files. You should therefore leave this blank to abort.\n"),
2150a9064fbSMasahiro Yamada save_config_text[] = N_(
2160a9064fbSMasahiro Yamada 	"Enter a filename to which this configuration should be saved "
2170a9064fbSMasahiro Yamada 	"as an alternate.  Leave blank to abort."),
2180a9064fbSMasahiro Yamada save_config_help[] = N_(
2190a9064fbSMasahiro Yamada 	"\n"
2200a9064fbSMasahiro Yamada 	"For various reasons, one may wish to keep different configurations\n"
2210a9064fbSMasahiro Yamada 	"available on a single machine.\n"
2220a9064fbSMasahiro Yamada 	"\n"
2230a9064fbSMasahiro Yamada 	"Entering a file name here will allow you to later retrieve, modify\n"
2240a9064fbSMasahiro Yamada 	"and use the current configuration as an alternate to whatever\n"
2250a9064fbSMasahiro Yamada 	"configuration options you have selected at that time.\n"
2260a9064fbSMasahiro Yamada 	"\n"
2270a9064fbSMasahiro Yamada 	"If you are uncertain what all this means then you should probably\n"
2280a9064fbSMasahiro Yamada 	"leave this blank.\n"),
2290a9064fbSMasahiro Yamada search_help[] = N_(
2300a9064fbSMasahiro Yamada 	"\n"
2310a9064fbSMasahiro Yamada 	"Search for symbols and display their relations.\n"
2320a9064fbSMasahiro Yamada 	"Regular expressions are allowed.\n"
2330a9064fbSMasahiro Yamada 	"Example: search for \"^FOO\"\n"
2340a9064fbSMasahiro Yamada 	"Result:\n"
2350a9064fbSMasahiro Yamada 	"-----------------------------------------------------------------\n"
2360a9064fbSMasahiro Yamada 	"Symbol: FOO [=m]\n"
2370a9064fbSMasahiro Yamada 	"Type  : tristate\n"
2380a9064fbSMasahiro Yamada 	"Prompt: Foo bus is used to drive the bar HW\n"
2390a9064fbSMasahiro Yamada 	"  Location:\n"
2400a9064fbSMasahiro Yamada 	"    -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
2410a9064fbSMasahiro Yamada 	"      -> PCI support (PCI [=y])\n"
2420a9064fbSMasahiro Yamada 	"(1)     -> PCI access mode (<choice> [=y])\n"
2430a9064fbSMasahiro Yamada 	"  Defined at drivers/pci/Kconfig:47\n"
2440a9064fbSMasahiro Yamada 	"  Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
2450a9064fbSMasahiro Yamada 	"  Selects: LIBCRC32\n"
2460a9064fbSMasahiro Yamada 	"  Selected by: BAR [=n]\n"
2470a9064fbSMasahiro Yamada 	"-----------------------------------------------------------------\n"
2480a9064fbSMasahiro Yamada 	"o The line 'Type:' shows the type of the configuration option for\n"
249*e91610daSEugeniu Rosca 	"  this symbol (bool, tristate, string, ...)\n"
2500a9064fbSMasahiro Yamada 	"o The line 'Prompt:' shows the text used in the menu structure for\n"
2510a9064fbSMasahiro Yamada 	"  this symbol\n"
2520a9064fbSMasahiro Yamada 	"o The 'Defined at' line tells at what file / line number the symbol\n"
2530a9064fbSMasahiro Yamada 	"  is defined\n"
2540a9064fbSMasahiro Yamada 	"o The 'Depends on:' line tells what symbols need to be defined for\n"
2550a9064fbSMasahiro Yamada 	"  this symbol to be visible in the menu (selectable)\n"
2560a9064fbSMasahiro Yamada 	"o The 'Location:' lines tells where in the menu structure this symbol\n"
2570a9064fbSMasahiro Yamada 	"  is located\n"
2580a9064fbSMasahiro Yamada 	"    A location followed by a [=y] indicates that this is a\n"
2590a9064fbSMasahiro Yamada 	"    selectable menu item - and the current value is displayed inside\n"
2600a9064fbSMasahiro Yamada 	"    brackets.\n"
2610a9064fbSMasahiro Yamada 	"    Press the key in the (#) prefix to jump directly to that\n"
2620a9064fbSMasahiro Yamada 	"    location. You will be returned to the current search results\n"
2630a9064fbSMasahiro Yamada 	"    after exiting this new menu.\n"
2640a9064fbSMasahiro Yamada 	"o The 'Selects:' line tells what symbols will be automatically\n"
2650a9064fbSMasahiro Yamada 	"  selected if this symbol is selected (y or m)\n"
2660a9064fbSMasahiro Yamada 	"o The 'Selected by' line tells what symbol has selected this symbol\n"
2670a9064fbSMasahiro Yamada 	"\n"
2680a9064fbSMasahiro Yamada 	"Only relevant lines are shown.\n"
2690a9064fbSMasahiro Yamada 	"\n\n"
2700a9064fbSMasahiro Yamada 	"Search examples:\n"
2710a9064fbSMasahiro Yamada 	"Examples: USB	=> find all symbols containing USB\n"
2720a9064fbSMasahiro Yamada 	"          ^USB => find all symbols starting with USB\n"
2730a9064fbSMasahiro Yamada 	"          USB$ => find all symbols ending with USB\n"
2740a9064fbSMasahiro Yamada 	"\n");
2750a9064fbSMasahiro Yamada 
2760a9064fbSMasahiro Yamada static int indent;
2770a9064fbSMasahiro Yamada static struct menu *current_menu;
2780a9064fbSMasahiro Yamada static int child_count;
2790a9064fbSMasahiro Yamada static int single_menu_mode;
2800a9064fbSMasahiro Yamada static int show_all_options;
2810a9064fbSMasahiro Yamada static int save_and_exit;
2829b5f0b1dSMasahiro Yamada static int silent;
2830a9064fbSMasahiro Yamada 
2840a9064fbSMasahiro Yamada static void conf(struct menu *menu, struct menu *active_menu);
2850a9064fbSMasahiro Yamada static void conf_choice(struct menu *menu);
2860a9064fbSMasahiro Yamada static void conf_string(struct menu *menu);
2870a9064fbSMasahiro Yamada static void conf_load(void);
2880a9064fbSMasahiro Yamada static void conf_save(void);
2890a9064fbSMasahiro Yamada static int show_textbox_ext(const char *title, char *text, int r, int c,
2900a9064fbSMasahiro Yamada 			    int *keys, int *vscroll, int *hscroll,
2910a9064fbSMasahiro Yamada 			    update_text_fn update_text, void *data);
2920a9064fbSMasahiro Yamada static void show_textbox(const char *title, const char *text, int r, int c);
2930a9064fbSMasahiro Yamada static void show_helptext(const char *title, const char *text);
2940a9064fbSMasahiro Yamada static void show_help(struct menu *menu);
2950a9064fbSMasahiro Yamada 
2960a9064fbSMasahiro Yamada static char filename[PATH_MAX+1];
set_config_filename(const char * config_filename)2970a9064fbSMasahiro Yamada static void set_config_filename(const char *config_filename)
2980a9064fbSMasahiro Yamada {
2990a9064fbSMasahiro Yamada 	static char menu_backtitle[PATH_MAX+128];
3000a9064fbSMasahiro Yamada 	int size;
3010a9064fbSMasahiro Yamada 
3020a9064fbSMasahiro Yamada 	size = snprintf(menu_backtitle, sizeof(menu_backtitle),
3030a9064fbSMasahiro Yamada 			"%s - %s", config_filename, rootmenu.prompt->text);
3040a9064fbSMasahiro Yamada 	if (size >= sizeof(menu_backtitle))
3050a9064fbSMasahiro Yamada 		menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
3060a9064fbSMasahiro Yamada 	set_dialog_backtitle(menu_backtitle);
3070a9064fbSMasahiro Yamada 
3080a9064fbSMasahiro Yamada 	size = snprintf(filename, sizeof(filename), "%s", config_filename);
3090a9064fbSMasahiro Yamada 	if (size >= sizeof(filename))
3100a9064fbSMasahiro Yamada 		filename[sizeof(filename)-1] = '\0';
3110a9064fbSMasahiro Yamada }
3120a9064fbSMasahiro Yamada 
3130a9064fbSMasahiro Yamada struct subtitle_part {
3140a9064fbSMasahiro Yamada 	struct list_head entries;
3150a9064fbSMasahiro Yamada 	const char *text;
3160a9064fbSMasahiro Yamada };
3170a9064fbSMasahiro Yamada static LIST_HEAD(trail);
3180a9064fbSMasahiro Yamada 
3190a9064fbSMasahiro Yamada static struct subtitle_list *subtitles;
set_subtitle(void)3200a9064fbSMasahiro Yamada static void set_subtitle(void)
3210a9064fbSMasahiro Yamada {
3220a9064fbSMasahiro Yamada 	struct subtitle_part *sp;
3230a9064fbSMasahiro Yamada 	struct subtitle_list *pos, *tmp;
3240a9064fbSMasahiro Yamada 
3250a9064fbSMasahiro Yamada 	for (pos = subtitles; pos != NULL; pos = tmp) {
3260a9064fbSMasahiro Yamada 		tmp = pos->next;
3270a9064fbSMasahiro Yamada 		free(pos);
3280a9064fbSMasahiro Yamada 	}
3290a9064fbSMasahiro Yamada 
3300a9064fbSMasahiro Yamada 	subtitles = NULL;
3310a9064fbSMasahiro Yamada 	list_for_each_entry(sp, &trail, entries) {
3320a9064fbSMasahiro Yamada 		if (sp->text) {
3330a9064fbSMasahiro Yamada 			if (pos) {
3349b5f0b1dSMasahiro Yamada 				pos->next = xcalloc(1, sizeof(*pos));
3350a9064fbSMasahiro Yamada 				pos = pos->next;
3360a9064fbSMasahiro Yamada 			} else {
3379b5f0b1dSMasahiro Yamada 				subtitles = pos = xcalloc(1, sizeof(*pos));
3380a9064fbSMasahiro Yamada 			}
3390a9064fbSMasahiro Yamada 			pos->text = sp->text;
3400a9064fbSMasahiro Yamada 		}
3410a9064fbSMasahiro Yamada 	}
3420a9064fbSMasahiro Yamada 
3430a9064fbSMasahiro Yamada 	set_dialog_subtitles(subtitles);
3440a9064fbSMasahiro Yamada }
3450a9064fbSMasahiro Yamada 
reset_subtitle(void)3460a9064fbSMasahiro Yamada static void reset_subtitle(void)
3470a9064fbSMasahiro Yamada {
3480a9064fbSMasahiro Yamada 	struct subtitle_list *pos, *tmp;
3490a9064fbSMasahiro Yamada 
3500a9064fbSMasahiro Yamada 	for (pos = subtitles; pos != NULL; pos = tmp) {
3510a9064fbSMasahiro Yamada 		tmp = pos->next;
3520a9064fbSMasahiro Yamada 		free(pos);
3530a9064fbSMasahiro Yamada 	}
3540a9064fbSMasahiro Yamada 	subtitles = NULL;
3550a9064fbSMasahiro Yamada 	set_dialog_subtitles(subtitles);
3560a9064fbSMasahiro Yamada }
3570a9064fbSMasahiro Yamada 
3580a9064fbSMasahiro Yamada struct search_data {
3590a9064fbSMasahiro Yamada 	struct list_head *head;
3600a9064fbSMasahiro Yamada 	struct menu **targets;
3610a9064fbSMasahiro Yamada 	int *keys;
3620a9064fbSMasahiro Yamada };
3630a9064fbSMasahiro Yamada 
update_text(char * buf,size_t start,size_t end,void * _data)3640a9064fbSMasahiro Yamada static void update_text(char *buf, size_t start, size_t end, void *_data)
3650a9064fbSMasahiro Yamada {
3660a9064fbSMasahiro Yamada 	struct search_data *data = _data;
3670a9064fbSMasahiro Yamada 	struct jump_key *pos;
3680a9064fbSMasahiro Yamada 	int k = 0;
3690a9064fbSMasahiro Yamada 
3700a9064fbSMasahiro Yamada 	list_for_each_entry(pos, data->head, entries) {
3710a9064fbSMasahiro Yamada 		if (pos->offset >= start && pos->offset < end) {
3720a9064fbSMasahiro Yamada 			char header[4];
3730a9064fbSMasahiro Yamada 
3740a9064fbSMasahiro Yamada 			if (k < JUMP_NB) {
3750a9064fbSMasahiro Yamada 				int key = '0' + (pos->index % JUMP_NB) + 1;
3760a9064fbSMasahiro Yamada 
3770a9064fbSMasahiro Yamada 				sprintf(header, "(%c)", key);
3780a9064fbSMasahiro Yamada 				data->keys[k] = key;
3790a9064fbSMasahiro Yamada 				data->targets[k] = pos->target;
3800a9064fbSMasahiro Yamada 				k++;
3810a9064fbSMasahiro Yamada 			} else {
3821414e09bSMasahiro Yamada 				sprintf(header, "   ");
3830a9064fbSMasahiro Yamada 			}
3840a9064fbSMasahiro Yamada 
3850a9064fbSMasahiro Yamada 			memcpy(buf + pos->offset, header, sizeof(header) - 1);
3860a9064fbSMasahiro Yamada 		}
3870a9064fbSMasahiro Yamada 	}
3880a9064fbSMasahiro Yamada 	data->keys[k] = 0;
3890a9064fbSMasahiro Yamada }
3900a9064fbSMasahiro Yamada 
search_conf(void)3910a9064fbSMasahiro Yamada static void search_conf(void)
3920a9064fbSMasahiro Yamada {
3930a9064fbSMasahiro Yamada 	struct symbol **sym_arr;
3940a9064fbSMasahiro Yamada 	struct gstr res;
3950a9064fbSMasahiro Yamada 	struct gstr title;
3960a9064fbSMasahiro Yamada 	char *dialog_input;
3970a9064fbSMasahiro Yamada 	int dres, vscroll = 0, hscroll = 0;
3980a9064fbSMasahiro Yamada 	bool again;
3990a9064fbSMasahiro Yamada 	struct gstr sttext;
4000a9064fbSMasahiro Yamada 	struct subtitle_part stpart;
4010a9064fbSMasahiro Yamada 
4020a9064fbSMasahiro Yamada 	title = str_new();
4030a9064fbSMasahiro Yamada 	str_printf( &title, _("Enter (sub)string or regexp to search for "
4040a9064fbSMasahiro Yamada 			      "(with or without \"%s\")"), CONFIG_);
4050a9064fbSMasahiro Yamada 
4060a9064fbSMasahiro Yamada again:
4070a9064fbSMasahiro Yamada 	dialog_clear();
4080a9064fbSMasahiro Yamada 	dres = dialog_inputbox(_("Search Configuration Parameter"),
4090a9064fbSMasahiro Yamada 			      str_get(&title),
4100a9064fbSMasahiro Yamada 			      10, 75, "");
4110a9064fbSMasahiro Yamada 	switch (dres) {
4120a9064fbSMasahiro Yamada 	case 0:
4130a9064fbSMasahiro Yamada 		break;
4140a9064fbSMasahiro Yamada 	case 1:
4150a9064fbSMasahiro Yamada 		show_helptext(_("Search Configuration"), search_help);
4160a9064fbSMasahiro Yamada 		goto again;
4170a9064fbSMasahiro Yamada 	default:
4180a9064fbSMasahiro Yamada 		str_free(&title);
4190a9064fbSMasahiro Yamada 		return;
4200a9064fbSMasahiro Yamada 	}
4210a9064fbSMasahiro Yamada 
4220a9064fbSMasahiro Yamada 	/* strip the prefix if necessary */
4230a9064fbSMasahiro Yamada 	dialog_input = dialog_input_result;
4240a9064fbSMasahiro Yamada 	if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
4250a9064fbSMasahiro Yamada 		dialog_input += strlen(CONFIG_);
4260a9064fbSMasahiro Yamada 
4270a9064fbSMasahiro Yamada 	sttext = str_new();
4280a9064fbSMasahiro Yamada 	str_printf(&sttext, "Search (%s)", dialog_input_result);
4290a9064fbSMasahiro Yamada 	stpart.text = str_get(&sttext);
4300a9064fbSMasahiro Yamada 	list_add_tail(&stpart.entries, &trail);
4310a9064fbSMasahiro Yamada 
4320a9064fbSMasahiro Yamada 	sym_arr = sym_re_search(dialog_input);
4330a9064fbSMasahiro Yamada 	do {
4340a9064fbSMasahiro Yamada 		LIST_HEAD(head);
4350a9064fbSMasahiro Yamada 		struct menu *targets[JUMP_NB];
4360a9064fbSMasahiro Yamada 		int keys[JUMP_NB + 1], i;
4370a9064fbSMasahiro Yamada 		struct search_data data = {
4380a9064fbSMasahiro Yamada 			.head = &head,
4390a9064fbSMasahiro Yamada 			.targets = targets,
4400a9064fbSMasahiro Yamada 			.keys = keys,
4410a9064fbSMasahiro Yamada 		};
4420a9064fbSMasahiro Yamada 		struct jump_key *pos, *tmp;
4430a9064fbSMasahiro Yamada 
4440a9064fbSMasahiro Yamada 		res = get_relations_str(sym_arr, &head);
4450a9064fbSMasahiro Yamada 		set_subtitle();
4460a9064fbSMasahiro Yamada 		dres = show_textbox_ext(_("Search Results"), (char *)
4470a9064fbSMasahiro Yamada 					str_get(&res), 0, 0, keys, &vscroll,
4480a9064fbSMasahiro Yamada 					&hscroll, &update_text, (void *)
4490a9064fbSMasahiro Yamada 					&data);
4500a9064fbSMasahiro Yamada 		again = false;
4510a9064fbSMasahiro Yamada 		for (i = 0; i < JUMP_NB && keys[i]; i++)
4520a9064fbSMasahiro Yamada 			if (dres == keys[i]) {
4530a9064fbSMasahiro Yamada 				conf(targets[i]->parent, targets[i]);
4540a9064fbSMasahiro Yamada 				again = true;
4550a9064fbSMasahiro Yamada 			}
4560a9064fbSMasahiro Yamada 		str_free(&res);
4570a9064fbSMasahiro Yamada 		list_for_each_entry_safe(pos, tmp, &head, entries)
4580a9064fbSMasahiro Yamada 			free(pos);
4590a9064fbSMasahiro Yamada 	} while (again);
4600a9064fbSMasahiro Yamada 	free(sym_arr);
4610a9064fbSMasahiro Yamada 	str_free(&title);
4620a9064fbSMasahiro Yamada 	list_del(trail.prev);
4630a9064fbSMasahiro Yamada 	str_free(&sttext);
4640a9064fbSMasahiro Yamada }
4650a9064fbSMasahiro Yamada 
build_conf(struct menu * menu)4660a9064fbSMasahiro Yamada static void build_conf(struct menu *menu)
4670a9064fbSMasahiro Yamada {
4680a9064fbSMasahiro Yamada 	struct symbol *sym;
4690a9064fbSMasahiro Yamada 	struct property *prop;
4700a9064fbSMasahiro Yamada 	struct menu *child;
4710a9064fbSMasahiro Yamada 	int type, tmp, doint = 2;
4720a9064fbSMasahiro Yamada 	tristate val;
4730a9064fbSMasahiro Yamada 	char ch;
4740a9064fbSMasahiro Yamada 	bool visible;
4750a9064fbSMasahiro Yamada 
4760a9064fbSMasahiro Yamada 	/*
4770a9064fbSMasahiro Yamada 	 * note: menu_is_visible() has side effect that it will
4780a9064fbSMasahiro Yamada 	 * recalc the value of the symbol.
4790a9064fbSMasahiro Yamada 	 */
4800a9064fbSMasahiro Yamada 	visible = menu_is_visible(menu);
4810a9064fbSMasahiro Yamada 	if (show_all_options && !menu_has_prompt(menu))
4820a9064fbSMasahiro Yamada 		return;
4830a9064fbSMasahiro Yamada 	else if (!show_all_options && !visible)
4840a9064fbSMasahiro Yamada 		return;
4850a9064fbSMasahiro Yamada 
4860a9064fbSMasahiro Yamada 	sym = menu->sym;
4870a9064fbSMasahiro Yamada 	prop = menu->prompt;
4880a9064fbSMasahiro Yamada 	if (!sym) {
4890a9064fbSMasahiro Yamada 		if (prop && menu != current_menu) {
4900a9064fbSMasahiro Yamada 			const char *prompt = menu_get_prompt(menu);
4910a9064fbSMasahiro Yamada 			switch (prop->type) {
4920a9064fbSMasahiro Yamada 			case P_MENU:
4930a9064fbSMasahiro Yamada 				child_count++;
4940a9064fbSMasahiro Yamada 				prompt = _(prompt);
4950a9064fbSMasahiro Yamada 				if (single_menu_mode) {
4960a9064fbSMasahiro Yamada 					item_make("%s%*c%s",
4970a9064fbSMasahiro Yamada 						  menu->data ? "-->" : "++>",
4980a9064fbSMasahiro Yamada 						  indent + 1, ' ', prompt);
4990a9064fbSMasahiro Yamada 				} else
5000a9064fbSMasahiro Yamada 					item_make("   %*c%s  %s",
5010a9064fbSMasahiro Yamada 						  indent + 1, ' ', prompt,
5020a9064fbSMasahiro Yamada 						  menu_is_empty(menu) ? "----" : "--->");
5030a9064fbSMasahiro Yamada 				item_set_tag('m');
5040a9064fbSMasahiro Yamada 				item_set_data(menu);
5050a9064fbSMasahiro Yamada 				if (single_menu_mode && menu->data)
5060a9064fbSMasahiro Yamada 					goto conf_childs;
5070a9064fbSMasahiro Yamada 				return;
5080a9064fbSMasahiro Yamada 			case P_COMMENT:
5090a9064fbSMasahiro Yamada 				if (prompt) {
5100a9064fbSMasahiro Yamada 					child_count++;
5110a9064fbSMasahiro Yamada 					item_make("   %*c*** %s ***", indent + 1, ' ', _(prompt));
5120a9064fbSMasahiro Yamada 					item_set_tag(':');
5130a9064fbSMasahiro Yamada 					item_set_data(menu);
5140a9064fbSMasahiro Yamada 				}
5150a9064fbSMasahiro Yamada 				break;
5160a9064fbSMasahiro Yamada 			default:
5170a9064fbSMasahiro Yamada 				if (prompt) {
5180a9064fbSMasahiro Yamada 					child_count++;
5190a9064fbSMasahiro Yamada 					item_make("---%*c%s", indent + 1, ' ', _(prompt));
5200a9064fbSMasahiro Yamada 					item_set_tag(':');
5210a9064fbSMasahiro Yamada 					item_set_data(menu);
5220a9064fbSMasahiro Yamada 				}
5230a9064fbSMasahiro Yamada 			}
5240a9064fbSMasahiro Yamada 		} else
5250a9064fbSMasahiro Yamada 			doint = 0;
5260a9064fbSMasahiro Yamada 		goto conf_childs;
5270a9064fbSMasahiro Yamada 	}
5280a9064fbSMasahiro Yamada 
5290a9064fbSMasahiro Yamada 	type = sym_get_type(sym);
5300a9064fbSMasahiro Yamada 	if (sym_is_choice(sym)) {
5310a9064fbSMasahiro Yamada 		struct symbol *def_sym = sym_get_choice_value(sym);
5320a9064fbSMasahiro Yamada 		struct menu *def_menu = NULL;
5330a9064fbSMasahiro Yamada 
5340a9064fbSMasahiro Yamada 		child_count++;
5350a9064fbSMasahiro Yamada 		for (child = menu->list; child; child = child->next) {
5360a9064fbSMasahiro Yamada 			if (menu_is_visible(child) && child->sym == def_sym)
5370a9064fbSMasahiro Yamada 				def_menu = child;
5380a9064fbSMasahiro Yamada 		}
5390a9064fbSMasahiro Yamada 
5400a9064fbSMasahiro Yamada 		val = sym_get_tristate_value(sym);
5410a9064fbSMasahiro Yamada 		if (sym_is_changable(sym)) {
5420a9064fbSMasahiro Yamada 			switch (type) {
5430a9064fbSMasahiro Yamada 			case S_BOOLEAN:
5440a9064fbSMasahiro Yamada 				item_make("[%c]", val == no ? ' ' : '*');
5450a9064fbSMasahiro Yamada 				break;
5460a9064fbSMasahiro Yamada 			case S_TRISTATE:
5470a9064fbSMasahiro Yamada 				switch (val) {
5480a9064fbSMasahiro Yamada 				case yes: ch = '*'; break;
5490a9064fbSMasahiro Yamada 				case mod: ch = 'M'; break;
5500a9064fbSMasahiro Yamada 				default:  ch = ' '; break;
5510a9064fbSMasahiro Yamada 				}
5520a9064fbSMasahiro Yamada 				item_make("<%c>", ch);
5530a9064fbSMasahiro Yamada 				break;
5540a9064fbSMasahiro Yamada 			}
5550a9064fbSMasahiro Yamada 			item_set_tag('t');
5560a9064fbSMasahiro Yamada 			item_set_data(menu);
5570a9064fbSMasahiro Yamada 		} else {
5580a9064fbSMasahiro Yamada 			item_make("   ");
5590a9064fbSMasahiro Yamada 			item_set_tag(def_menu ? 't' : ':');
5600a9064fbSMasahiro Yamada 			item_set_data(menu);
5610a9064fbSMasahiro Yamada 		}
5620a9064fbSMasahiro Yamada 
5630a9064fbSMasahiro Yamada 		item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
5640a9064fbSMasahiro Yamada 		if (val == yes) {
5650a9064fbSMasahiro Yamada 			if (def_menu) {
5660a9064fbSMasahiro Yamada 				item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
5670a9064fbSMasahiro Yamada 				item_add_str("  --->");
5680a9064fbSMasahiro Yamada 				if (def_menu->list) {
5690a9064fbSMasahiro Yamada 					indent += 2;
5700a9064fbSMasahiro Yamada 					build_conf(def_menu);
5710a9064fbSMasahiro Yamada 					indent -= 2;
5720a9064fbSMasahiro Yamada 				}
5730a9064fbSMasahiro Yamada 			}
5740a9064fbSMasahiro Yamada 			return;
5750a9064fbSMasahiro Yamada 		}
5760a9064fbSMasahiro Yamada 	} else {
5770a9064fbSMasahiro Yamada 		if (menu == current_menu) {
5780a9064fbSMasahiro Yamada 			item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
5790a9064fbSMasahiro Yamada 			item_set_tag(':');
5800a9064fbSMasahiro Yamada 			item_set_data(menu);
5810a9064fbSMasahiro Yamada 			goto conf_childs;
5820a9064fbSMasahiro Yamada 		}
5830a9064fbSMasahiro Yamada 		child_count++;
5840a9064fbSMasahiro Yamada 		val = sym_get_tristate_value(sym);
5850a9064fbSMasahiro Yamada 		if (sym_is_choice_value(sym) && val == yes) {
5860a9064fbSMasahiro Yamada 			item_make("   ");
5870a9064fbSMasahiro Yamada 			item_set_tag(':');
5880a9064fbSMasahiro Yamada 			item_set_data(menu);
5890a9064fbSMasahiro Yamada 		} else {
5900a9064fbSMasahiro Yamada 			switch (type) {
5910a9064fbSMasahiro Yamada 			case S_BOOLEAN:
5920a9064fbSMasahiro Yamada 				if (sym_is_changable(sym))
5930a9064fbSMasahiro Yamada 					item_make("[%c]", val == no ? ' ' : '*');
5940a9064fbSMasahiro Yamada 				else
5950a9064fbSMasahiro Yamada 					item_make("-%c-", val == no ? ' ' : '*');
5960a9064fbSMasahiro Yamada 				item_set_tag('t');
5970a9064fbSMasahiro Yamada 				item_set_data(menu);
5980a9064fbSMasahiro Yamada 				break;
5990a9064fbSMasahiro Yamada 			case S_TRISTATE:
6000a9064fbSMasahiro Yamada 				switch (val) {
6010a9064fbSMasahiro Yamada 				case yes: ch = '*'; break;
6020a9064fbSMasahiro Yamada 				case mod: ch = 'M'; break;
6030a9064fbSMasahiro Yamada 				default:  ch = ' '; break;
6040a9064fbSMasahiro Yamada 				}
6050a9064fbSMasahiro Yamada 				if (sym_is_changable(sym)) {
6060a9064fbSMasahiro Yamada 					if (sym->rev_dep.tri == mod)
6070a9064fbSMasahiro Yamada 						item_make("{%c}", ch);
6080a9064fbSMasahiro Yamada 					else
6090a9064fbSMasahiro Yamada 						item_make("<%c>", ch);
6100a9064fbSMasahiro Yamada 				} else
6110a9064fbSMasahiro Yamada 					item_make("-%c-", ch);
6120a9064fbSMasahiro Yamada 				item_set_tag('t');
6130a9064fbSMasahiro Yamada 				item_set_data(menu);
6140a9064fbSMasahiro Yamada 				break;
6150a9064fbSMasahiro Yamada 			default:
6160a9064fbSMasahiro Yamada 				tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */
6170a9064fbSMasahiro Yamada 				item_make("(%s)", sym_get_string_value(sym));
6180a9064fbSMasahiro Yamada 				tmp = indent - tmp + 4;
6190a9064fbSMasahiro Yamada 				if (tmp < 0)
6200a9064fbSMasahiro Yamada 					tmp = 0;
6210a9064fbSMasahiro Yamada 				item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
6220a9064fbSMasahiro Yamada 					     (sym_has_value(sym) || !sym_is_changable(sym)) ?
6230a9064fbSMasahiro Yamada 					     "" : _(" (NEW)"));
6240a9064fbSMasahiro Yamada 				item_set_tag('s');
6250a9064fbSMasahiro Yamada 				item_set_data(menu);
6260a9064fbSMasahiro Yamada 				goto conf_childs;
6270a9064fbSMasahiro Yamada 			}
6280a9064fbSMasahiro Yamada 		}
6290a9064fbSMasahiro Yamada 		item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
6300a9064fbSMasahiro Yamada 			  (sym_has_value(sym) || !sym_is_changable(sym)) ?
6310a9064fbSMasahiro Yamada 			  "" : _(" (NEW)"));
6320a9064fbSMasahiro Yamada 		if (menu->prompt->type == P_MENU) {
6330a9064fbSMasahiro Yamada 			item_add_str("  %s", menu_is_empty(menu) ? "----" : "--->");
6340a9064fbSMasahiro Yamada 			return;
6350a9064fbSMasahiro Yamada 		}
6360a9064fbSMasahiro Yamada 	}
6370a9064fbSMasahiro Yamada 
6380a9064fbSMasahiro Yamada conf_childs:
6390a9064fbSMasahiro Yamada 	indent += doint;
6400a9064fbSMasahiro Yamada 	for (child = menu->list; child; child = child->next)
6410a9064fbSMasahiro Yamada 		build_conf(child);
6420a9064fbSMasahiro Yamada 	indent -= doint;
6430a9064fbSMasahiro Yamada }
6440a9064fbSMasahiro Yamada 
conf(struct menu * menu,struct menu * active_menu)6450a9064fbSMasahiro Yamada static void conf(struct menu *menu, struct menu *active_menu)
6460a9064fbSMasahiro Yamada {
6470a9064fbSMasahiro Yamada 	struct menu *submenu;
6480a9064fbSMasahiro Yamada 	const char *prompt = menu_get_prompt(menu);
6490a9064fbSMasahiro Yamada 	struct subtitle_part stpart;
6500a9064fbSMasahiro Yamada 	struct symbol *sym;
6510a9064fbSMasahiro Yamada 	int res;
6520a9064fbSMasahiro Yamada 	int s_scroll = 0;
6530a9064fbSMasahiro Yamada 
6540a9064fbSMasahiro Yamada 	if (menu != &rootmenu)
6550a9064fbSMasahiro Yamada 		stpart.text = menu_get_prompt(menu);
6560a9064fbSMasahiro Yamada 	else
6570a9064fbSMasahiro Yamada 		stpart.text = NULL;
6580a9064fbSMasahiro Yamada 	list_add_tail(&stpart.entries, &trail);
6590a9064fbSMasahiro Yamada 
6600a9064fbSMasahiro Yamada 	while (1) {
6610a9064fbSMasahiro Yamada 		item_reset();
6620a9064fbSMasahiro Yamada 		current_menu = menu;
6630a9064fbSMasahiro Yamada 		build_conf(menu);
6640a9064fbSMasahiro Yamada 		if (!child_count)
6650a9064fbSMasahiro Yamada 			break;
6660a9064fbSMasahiro Yamada 		set_subtitle();
6670a9064fbSMasahiro Yamada 		dialog_clear();
6680a9064fbSMasahiro Yamada 		res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
6690a9064fbSMasahiro Yamada 				  _(menu_instructions),
6700a9064fbSMasahiro Yamada 				  active_menu, &s_scroll);
6710a9064fbSMasahiro Yamada 		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
6720a9064fbSMasahiro Yamada 			break;
6730a9064fbSMasahiro Yamada 		if (item_count() != 0) {
6740a9064fbSMasahiro Yamada 			if (!item_activate_selected())
6750a9064fbSMasahiro Yamada 				continue;
6760a9064fbSMasahiro Yamada 			if (!item_tag())
6770a9064fbSMasahiro Yamada 				continue;
6780a9064fbSMasahiro Yamada 		}
6790a9064fbSMasahiro Yamada 		submenu = item_data();
6800a9064fbSMasahiro Yamada 		active_menu = item_data();
6810a9064fbSMasahiro Yamada 		if (submenu)
6820a9064fbSMasahiro Yamada 			sym = submenu->sym;
6830a9064fbSMasahiro Yamada 		else
6840a9064fbSMasahiro Yamada 			sym = NULL;
6850a9064fbSMasahiro Yamada 
6860a9064fbSMasahiro Yamada 		switch (res) {
6870a9064fbSMasahiro Yamada 		case 0:
6880a9064fbSMasahiro Yamada 			switch (item_tag()) {
6890a9064fbSMasahiro Yamada 			case 'm':
6900a9064fbSMasahiro Yamada 				if (single_menu_mode)
6910a9064fbSMasahiro Yamada 					submenu->data = (void *) (long) !submenu->data;
6920a9064fbSMasahiro Yamada 				else
6930a9064fbSMasahiro Yamada 					conf(submenu, NULL);
6940a9064fbSMasahiro Yamada 				break;
6950a9064fbSMasahiro Yamada 			case 't':
6960a9064fbSMasahiro Yamada 				if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
6970a9064fbSMasahiro Yamada 					conf_choice(submenu);
6980a9064fbSMasahiro Yamada 				else if (submenu->prompt->type == P_MENU)
6990a9064fbSMasahiro Yamada 					conf(submenu, NULL);
7000a9064fbSMasahiro Yamada 				break;
7010a9064fbSMasahiro Yamada 			case 's':
7020a9064fbSMasahiro Yamada 				conf_string(submenu);
7030a9064fbSMasahiro Yamada 				break;
7040a9064fbSMasahiro Yamada 			}
7050a9064fbSMasahiro Yamada 			break;
7060a9064fbSMasahiro Yamada 		case 2:
7070a9064fbSMasahiro Yamada 			if (sym)
7080a9064fbSMasahiro Yamada 				show_help(submenu);
7090a9064fbSMasahiro Yamada 			else {
7100a9064fbSMasahiro Yamada 				reset_subtitle();
7110a9064fbSMasahiro Yamada 				show_helptext(_("README"), _(mconf_readme));
7120a9064fbSMasahiro Yamada 			}
7130a9064fbSMasahiro Yamada 			break;
7140a9064fbSMasahiro Yamada 		case 3:
7150a9064fbSMasahiro Yamada 			reset_subtitle();
7160a9064fbSMasahiro Yamada 			conf_save();
7170a9064fbSMasahiro Yamada 			break;
7180a9064fbSMasahiro Yamada 		case 4:
7190a9064fbSMasahiro Yamada 			reset_subtitle();
7200a9064fbSMasahiro Yamada 			conf_load();
7210a9064fbSMasahiro Yamada 			break;
7220a9064fbSMasahiro Yamada 		case 5:
7230a9064fbSMasahiro Yamada 			if (item_is_tag('t')) {
7240a9064fbSMasahiro Yamada 				if (sym_set_tristate_value(sym, yes))
7250a9064fbSMasahiro Yamada 					break;
7260a9064fbSMasahiro Yamada 				if (sym_set_tristate_value(sym, mod))
7270a9064fbSMasahiro Yamada 					show_textbox(NULL, setmod_text, 6, 74);
7280a9064fbSMasahiro Yamada 			}
7290a9064fbSMasahiro Yamada 			break;
7300a9064fbSMasahiro Yamada 		case 6:
7310a9064fbSMasahiro Yamada 			if (item_is_tag('t'))
7320a9064fbSMasahiro Yamada 				sym_set_tristate_value(sym, no);
7330a9064fbSMasahiro Yamada 			break;
7340a9064fbSMasahiro Yamada 		case 7:
7350a9064fbSMasahiro Yamada 			if (item_is_tag('t'))
7360a9064fbSMasahiro Yamada 				sym_set_tristate_value(sym, mod);
7370a9064fbSMasahiro Yamada 			break;
7380a9064fbSMasahiro Yamada 		case 8:
7390a9064fbSMasahiro Yamada 			if (item_is_tag('t'))
7400a9064fbSMasahiro Yamada 				sym_toggle_tristate_value(sym);
7410a9064fbSMasahiro Yamada 			else if (item_is_tag('m'))
7420a9064fbSMasahiro Yamada 				conf(submenu, NULL);
7430a9064fbSMasahiro Yamada 			break;
7440a9064fbSMasahiro Yamada 		case 9:
7450a9064fbSMasahiro Yamada 			search_conf();
7460a9064fbSMasahiro Yamada 			break;
7470a9064fbSMasahiro Yamada 		case 10:
7480a9064fbSMasahiro Yamada 			show_all_options = !show_all_options;
7490a9064fbSMasahiro Yamada 			break;
7500a9064fbSMasahiro Yamada 		}
7510a9064fbSMasahiro Yamada 	}
7520a9064fbSMasahiro Yamada 
7530a9064fbSMasahiro Yamada 	list_del(trail.prev);
7540a9064fbSMasahiro Yamada }
7550a9064fbSMasahiro Yamada 
show_textbox_ext(const char * title,char * text,int r,int c,int * keys,int * vscroll,int * hscroll,update_text_fn update_text,void * data)7560a9064fbSMasahiro Yamada static int show_textbox_ext(const char *title, char *text, int r, int c, int
7570a9064fbSMasahiro Yamada 			    *keys, int *vscroll, int *hscroll, update_text_fn
7580a9064fbSMasahiro Yamada 			    update_text, void *data)
7590a9064fbSMasahiro Yamada {
7600a9064fbSMasahiro Yamada 	dialog_clear();
7610a9064fbSMasahiro Yamada 	return dialog_textbox(title, text, r, c, keys, vscroll, hscroll,
7620a9064fbSMasahiro Yamada 			      update_text, data);
7630a9064fbSMasahiro Yamada }
7640a9064fbSMasahiro Yamada 
show_textbox(const char * title,const char * text,int r,int c)7650a9064fbSMasahiro Yamada static void show_textbox(const char *title, const char *text, int r, int c)
7660a9064fbSMasahiro Yamada {
7670a9064fbSMasahiro Yamada 	show_textbox_ext(title, (char *) text, r, c, (int []) {0}, NULL, NULL,
7680a9064fbSMasahiro Yamada 			 NULL, NULL);
7690a9064fbSMasahiro Yamada }
7700a9064fbSMasahiro Yamada 
show_helptext(const char * title,const char * text)7710a9064fbSMasahiro Yamada static void show_helptext(const char *title, const char *text)
7720a9064fbSMasahiro Yamada {
7730a9064fbSMasahiro Yamada 	show_textbox(title, text, 0, 0);
7740a9064fbSMasahiro Yamada }
7750a9064fbSMasahiro Yamada 
conf_message_callback(const char * fmt,va_list ap)7760a9064fbSMasahiro Yamada static void conf_message_callback(const char *fmt, va_list ap)
7770a9064fbSMasahiro Yamada {
7780a9064fbSMasahiro Yamada 	char buf[PATH_MAX+1];
7790a9064fbSMasahiro Yamada 
7800a9064fbSMasahiro Yamada 	vsnprintf(buf, sizeof(buf), fmt, ap);
7819b5f0b1dSMasahiro Yamada 	if (save_and_exit) {
7829b5f0b1dSMasahiro Yamada 		if (!silent)
7830a9064fbSMasahiro Yamada 			printf("%s", buf);
7849b5f0b1dSMasahiro Yamada 	} else {
7850a9064fbSMasahiro Yamada 		show_textbox(NULL, buf, 6, 60);
7860a9064fbSMasahiro Yamada 	}
7879b5f0b1dSMasahiro Yamada }
7880a9064fbSMasahiro Yamada 
show_help(struct menu * menu)7890a9064fbSMasahiro Yamada static void show_help(struct menu *menu)
7900a9064fbSMasahiro Yamada {
7910a9064fbSMasahiro Yamada 	struct gstr help = str_new();
7920a9064fbSMasahiro Yamada 
7930a9064fbSMasahiro Yamada 	help.max_width = getmaxx(stdscr) - 10;
7940a9064fbSMasahiro Yamada 	menu_get_ext_help(menu, &help);
7950a9064fbSMasahiro Yamada 
7960a9064fbSMasahiro Yamada 	show_helptext(_(menu_get_prompt(menu)), str_get(&help));
7970a9064fbSMasahiro Yamada 	str_free(&help);
7980a9064fbSMasahiro Yamada }
7990a9064fbSMasahiro Yamada 
conf_choice(struct menu * menu)8000a9064fbSMasahiro Yamada static void conf_choice(struct menu *menu)
8010a9064fbSMasahiro Yamada {
8020a9064fbSMasahiro Yamada 	const char *prompt = _(menu_get_prompt(menu));
8030a9064fbSMasahiro Yamada 	struct menu *child;
8040a9064fbSMasahiro Yamada 	struct symbol *active;
8050a9064fbSMasahiro Yamada 
8060a9064fbSMasahiro Yamada 	active = sym_get_choice_value(menu->sym);
8070a9064fbSMasahiro Yamada 	while (1) {
8080a9064fbSMasahiro Yamada 		int res;
8090a9064fbSMasahiro Yamada 		int selected;
8100a9064fbSMasahiro Yamada 		item_reset();
8110a9064fbSMasahiro Yamada 
8120a9064fbSMasahiro Yamada 		current_menu = menu;
8130a9064fbSMasahiro Yamada 		for (child = menu->list; child; child = child->next) {
8140a9064fbSMasahiro Yamada 			if (!menu_is_visible(child))
8150a9064fbSMasahiro Yamada 				continue;
8160a9064fbSMasahiro Yamada 			if (child->sym)
8170a9064fbSMasahiro Yamada 				item_make("%s", _(menu_get_prompt(child)));
8180a9064fbSMasahiro Yamada 			else {
8190a9064fbSMasahiro Yamada 				item_make("*** %s ***", _(menu_get_prompt(child)));
8200a9064fbSMasahiro Yamada 				item_set_tag(':');
8210a9064fbSMasahiro Yamada 			}
8220a9064fbSMasahiro Yamada 			item_set_data(child);
8230a9064fbSMasahiro Yamada 			if (child->sym == active)
8240a9064fbSMasahiro Yamada 				item_set_selected(1);
8250a9064fbSMasahiro Yamada 			if (child->sym == sym_get_choice_value(menu->sym))
8260a9064fbSMasahiro Yamada 				item_set_tag('X');
8270a9064fbSMasahiro Yamada 		}
8280a9064fbSMasahiro Yamada 		dialog_clear();
8290a9064fbSMasahiro Yamada 		res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
8300a9064fbSMasahiro Yamada 					_(radiolist_instructions),
8310a9064fbSMasahiro Yamada 					MENUBOX_HEIGTH_MIN,
8320a9064fbSMasahiro Yamada 					MENUBOX_WIDTH_MIN,
8330a9064fbSMasahiro Yamada 					CHECKLIST_HEIGTH_MIN);
8340a9064fbSMasahiro Yamada 		selected = item_activate_selected();
8350a9064fbSMasahiro Yamada 		switch (res) {
8360a9064fbSMasahiro Yamada 		case 0:
8370a9064fbSMasahiro Yamada 			if (selected) {
8380a9064fbSMasahiro Yamada 				child = item_data();
8390a9064fbSMasahiro Yamada 				if (!child->sym)
8400a9064fbSMasahiro Yamada 					break;
8410a9064fbSMasahiro Yamada 
8420a9064fbSMasahiro Yamada 				sym_set_tristate_value(child->sym, yes);
8430a9064fbSMasahiro Yamada 			}
8440a9064fbSMasahiro Yamada 			return;
8450a9064fbSMasahiro Yamada 		case 1:
8460a9064fbSMasahiro Yamada 			if (selected) {
8470a9064fbSMasahiro Yamada 				child = item_data();
8480a9064fbSMasahiro Yamada 				show_help(child);
8490a9064fbSMasahiro Yamada 				active = child->sym;
8500a9064fbSMasahiro Yamada 			} else
8510a9064fbSMasahiro Yamada 				show_help(menu);
8520a9064fbSMasahiro Yamada 			break;
8530a9064fbSMasahiro Yamada 		case KEY_ESC:
8540a9064fbSMasahiro Yamada 			return;
8550a9064fbSMasahiro Yamada 		case -ERRDISPLAYTOOSMALL:
8560a9064fbSMasahiro Yamada 			return;
8570a9064fbSMasahiro Yamada 		}
8580a9064fbSMasahiro Yamada 	}
8590a9064fbSMasahiro Yamada }
8600a9064fbSMasahiro Yamada 
conf_string(struct menu * menu)8610a9064fbSMasahiro Yamada static void conf_string(struct menu *menu)
8620a9064fbSMasahiro Yamada {
8630a9064fbSMasahiro Yamada 	const char *prompt = menu_get_prompt(menu);
8640a9064fbSMasahiro Yamada 
8650a9064fbSMasahiro Yamada 	while (1) {
8660a9064fbSMasahiro Yamada 		int res;
8670a9064fbSMasahiro Yamada 		const char *heading;
8680a9064fbSMasahiro Yamada 
8690a9064fbSMasahiro Yamada 		switch (sym_get_type(menu->sym)) {
8700a9064fbSMasahiro Yamada 		case S_INT:
8710a9064fbSMasahiro Yamada 			heading = _(inputbox_instructions_int);
8720a9064fbSMasahiro Yamada 			break;
8730a9064fbSMasahiro Yamada 		case S_HEX:
8740a9064fbSMasahiro Yamada 			heading = _(inputbox_instructions_hex);
8750a9064fbSMasahiro Yamada 			break;
8760a9064fbSMasahiro Yamada 		case S_STRING:
8770a9064fbSMasahiro Yamada 			heading = _(inputbox_instructions_string);
8780a9064fbSMasahiro Yamada 			break;
8790a9064fbSMasahiro Yamada 		default:
8800a9064fbSMasahiro Yamada 			heading = _("Internal mconf error!");
8810a9064fbSMasahiro Yamada 		}
8820a9064fbSMasahiro Yamada 		dialog_clear();
8830a9064fbSMasahiro Yamada 		res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
8840a9064fbSMasahiro Yamada 				      heading, 10, 75,
8850a9064fbSMasahiro Yamada 				      sym_get_string_value(menu->sym));
8860a9064fbSMasahiro Yamada 		switch (res) {
8870a9064fbSMasahiro Yamada 		case 0:
8880a9064fbSMasahiro Yamada 			if (sym_set_string_value(menu->sym, dialog_input_result))
8890a9064fbSMasahiro Yamada 				return;
8900a9064fbSMasahiro Yamada 			show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
8910a9064fbSMasahiro Yamada 			break;
8920a9064fbSMasahiro Yamada 		case 1:
8930a9064fbSMasahiro Yamada 			show_help(menu);
8940a9064fbSMasahiro Yamada 			break;
8950a9064fbSMasahiro Yamada 		case KEY_ESC:
8960a9064fbSMasahiro Yamada 			return;
8970a9064fbSMasahiro Yamada 		}
8980a9064fbSMasahiro Yamada 	}
8990a9064fbSMasahiro Yamada }
9000a9064fbSMasahiro Yamada 
conf_load(void)9010a9064fbSMasahiro Yamada static void conf_load(void)
9020a9064fbSMasahiro Yamada {
9030a9064fbSMasahiro Yamada 
9040a9064fbSMasahiro Yamada 	while (1) {
9050a9064fbSMasahiro Yamada 		int res;
9060a9064fbSMasahiro Yamada 		dialog_clear();
9070a9064fbSMasahiro Yamada 		res = dialog_inputbox(NULL, load_config_text,
9080a9064fbSMasahiro Yamada 				      11, 55, filename);
9090a9064fbSMasahiro Yamada 		switch(res) {
9100a9064fbSMasahiro Yamada 		case 0:
9110a9064fbSMasahiro Yamada 			if (!dialog_input_result[0])
9120a9064fbSMasahiro Yamada 				return;
9130a9064fbSMasahiro Yamada 			if (!conf_read(dialog_input_result)) {
9140a9064fbSMasahiro Yamada 				set_config_filename(dialog_input_result);
9150a9064fbSMasahiro Yamada 				sym_set_change_count(1);
9160a9064fbSMasahiro Yamada 				return;
9170a9064fbSMasahiro Yamada 			}
9180a9064fbSMasahiro Yamada 			show_textbox(NULL, _("File does not exist!"), 5, 38);
9190a9064fbSMasahiro Yamada 			break;
9200a9064fbSMasahiro Yamada 		case 1:
9210a9064fbSMasahiro Yamada 			show_helptext(_("Load Alternate Configuration"), load_config_help);
9220a9064fbSMasahiro Yamada 			break;
9230a9064fbSMasahiro Yamada 		case KEY_ESC:
9240a9064fbSMasahiro Yamada 			return;
9250a9064fbSMasahiro Yamada 		}
9260a9064fbSMasahiro Yamada 	}
9270a9064fbSMasahiro Yamada }
9280a9064fbSMasahiro Yamada 
conf_save(void)9290a9064fbSMasahiro Yamada static void conf_save(void)
9300a9064fbSMasahiro Yamada {
9310a9064fbSMasahiro Yamada 	while (1) {
9320a9064fbSMasahiro Yamada 		int res;
9330a9064fbSMasahiro Yamada 		dialog_clear();
9340a9064fbSMasahiro Yamada 		res = dialog_inputbox(NULL, save_config_text,
9350a9064fbSMasahiro Yamada 				      11, 55, filename);
9360a9064fbSMasahiro Yamada 		switch(res) {
9370a9064fbSMasahiro Yamada 		case 0:
9380a9064fbSMasahiro Yamada 			if (!dialog_input_result[0])
9390a9064fbSMasahiro Yamada 				return;
9400a9064fbSMasahiro Yamada 			if (!conf_write(dialog_input_result)) {
9410a9064fbSMasahiro Yamada 				set_config_filename(dialog_input_result);
9420a9064fbSMasahiro Yamada 				return;
9430a9064fbSMasahiro Yamada 			}
9440a9064fbSMasahiro Yamada 			show_textbox(NULL, _("Can't create file!  Probably a nonexistent directory."), 5, 60);
9450a9064fbSMasahiro Yamada 			break;
9460a9064fbSMasahiro Yamada 		case 1:
9470a9064fbSMasahiro Yamada 			show_helptext(_("Save Alternate Configuration"), save_config_help);
9480a9064fbSMasahiro Yamada 			break;
9490a9064fbSMasahiro Yamada 		case KEY_ESC:
9500a9064fbSMasahiro Yamada 			return;
9510a9064fbSMasahiro Yamada 		}
9520a9064fbSMasahiro Yamada 	}
9530a9064fbSMasahiro Yamada }
9540a9064fbSMasahiro Yamada 
handle_exit(void)9550a9064fbSMasahiro Yamada static int handle_exit(void)
9560a9064fbSMasahiro Yamada {
9570a9064fbSMasahiro Yamada 	int res;
9580a9064fbSMasahiro Yamada 
9590a9064fbSMasahiro Yamada 	save_and_exit = 1;
9600a9064fbSMasahiro Yamada 	reset_subtitle();
9610a9064fbSMasahiro Yamada 	dialog_clear();
9620a9064fbSMasahiro Yamada 	if (conf_get_changed())
9630a9064fbSMasahiro Yamada 		res = dialog_yesno(NULL,
9640a9064fbSMasahiro Yamada 				   _("Do you wish to save your new configuration?\n"
9650a9064fbSMasahiro Yamada 				     "(Press <ESC><ESC> to continue kernel configuration.)"),
9660a9064fbSMasahiro Yamada 				   6, 60);
9670a9064fbSMasahiro Yamada 	else
9680a9064fbSMasahiro Yamada 		res = -1;
9690a9064fbSMasahiro Yamada 
9700a9064fbSMasahiro Yamada 	end_dialog(saved_x, saved_y);
9710a9064fbSMasahiro Yamada 
9720a9064fbSMasahiro Yamada 	switch (res) {
9730a9064fbSMasahiro Yamada 	case 0:
9740a9064fbSMasahiro Yamada 		if (conf_write(filename)) {
9750a9064fbSMasahiro Yamada 			fprintf(stderr, _("\n\n"
9760a9064fbSMasahiro Yamada 					  "Error while writing of the configuration.\n"
9770a9064fbSMasahiro Yamada 					  "Your configuration changes were NOT saved."
9780a9064fbSMasahiro Yamada 					  "\n\n"));
9790a9064fbSMasahiro Yamada 			return 1;
9800a9064fbSMasahiro Yamada 		}
9810a9064fbSMasahiro Yamada 		/* fall through */
9820a9064fbSMasahiro Yamada 	case -1:
9839b5f0b1dSMasahiro Yamada 		if (!silent)
9840a9064fbSMasahiro Yamada 			printf(_("\n\n"
9850a9064fbSMasahiro Yamada 				 "*** End of the configuration.\n"
9860a9064fbSMasahiro Yamada 				 "*** Execute 'make' to start the build or try 'make help'."
9870a9064fbSMasahiro Yamada 				 "\n\n"));
9880a9064fbSMasahiro Yamada 		res = 0;
9890a9064fbSMasahiro Yamada 		break;
9900a9064fbSMasahiro Yamada 	default:
9919b5f0b1dSMasahiro Yamada 		if (!silent)
9920a9064fbSMasahiro Yamada 			fprintf(stderr, _("\n\n"
9930a9064fbSMasahiro Yamada 					  "Your configuration changes were NOT saved."
9940a9064fbSMasahiro Yamada 					  "\n\n"));
9950a9064fbSMasahiro Yamada 		if (res != KEY_ESC)
9960a9064fbSMasahiro Yamada 			res = 0;
9970a9064fbSMasahiro Yamada 	}
9980a9064fbSMasahiro Yamada 
9990a9064fbSMasahiro Yamada 	return res;
10000a9064fbSMasahiro Yamada }
10010a9064fbSMasahiro Yamada 
sig_handler(int signo)10020a9064fbSMasahiro Yamada static void sig_handler(int signo)
10030a9064fbSMasahiro Yamada {
10040a9064fbSMasahiro Yamada 	exit(handle_exit());
10050a9064fbSMasahiro Yamada }
10060a9064fbSMasahiro Yamada 
main(int ac,char ** av)10070a9064fbSMasahiro Yamada int main(int ac, char **av)
10080a9064fbSMasahiro Yamada {
10090a9064fbSMasahiro Yamada 	char *mode;
10100a9064fbSMasahiro Yamada 	int res;
10110a9064fbSMasahiro Yamada 
10120a9064fbSMasahiro Yamada 	setlocale(LC_ALL, "");
10130a9064fbSMasahiro Yamada 	bindtextdomain(PACKAGE, LOCALEDIR);
10140a9064fbSMasahiro Yamada 	textdomain(PACKAGE);
10150a9064fbSMasahiro Yamada 
10160a9064fbSMasahiro Yamada 	signal(SIGINT, sig_handler);
10170a9064fbSMasahiro Yamada 
10189b5f0b1dSMasahiro Yamada 	if (ac > 1 && strcmp(av[1], "-s") == 0) {
10199b5f0b1dSMasahiro Yamada 		silent = 1;
10209b5f0b1dSMasahiro Yamada 		/* Silence conf_read() until the real callback is set up */
10219b5f0b1dSMasahiro Yamada 		conf_set_message_callback(NULL);
10229b5f0b1dSMasahiro Yamada 		av++;
10239b5f0b1dSMasahiro Yamada 	}
10240a9064fbSMasahiro Yamada 	conf_parse(av[1]);
10250a9064fbSMasahiro Yamada 	conf_read(NULL);
10260a9064fbSMasahiro Yamada 
10270a9064fbSMasahiro Yamada 	mode = getenv("MENUCONFIG_MODE");
10280a9064fbSMasahiro Yamada 	if (mode) {
10290a9064fbSMasahiro Yamada 		if (!strcasecmp(mode, "single_menu"))
10300a9064fbSMasahiro Yamada 			single_menu_mode = 1;
10310a9064fbSMasahiro Yamada 	}
10320a9064fbSMasahiro Yamada 
10330a9064fbSMasahiro Yamada 	if (init_dialog(NULL)) {
10340a9064fbSMasahiro Yamada 		fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
10350a9064fbSMasahiro Yamada 		fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
10360a9064fbSMasahiro Yamada 		return 1;
10370a9064fbSMasahiro Yamada 	}
10380a9064fbSMasahiro Yamada 
10390a9064fbSMasahiro Yamada 	set_config_filename(conf_get_configname());
10400a9064fbSMasahiro Yamada 	conf_set_message_callback(conf_message_callback);
10410a9064fbSMasahiro Yamada 	do {
10420a9064fbSMasahiro Yamada 		conf(&rootmenu, NULL);
10430a9064fbSMasahiro Yamada 		res = handle_exit();
10440a9064fbSMasahiro Yamada 	} while (res == KEY_ESC);
10450a9064fbSMasahiro Yamada 
10460a9064fbSMasahiro Yamada 	return res;
10470a9064fbSMasahiro Yamada }
1048