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