1 /*
2  *  dialog - Display simple dialog boxes from shell scripts
3  *
4  *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5  *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6  *
7  *  This program is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU General Public License
9  *  as published by the Free Software Foundation; either version 2
10  *  of the License, or (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21 
22 #include "dialog.h"
23 
24 static void Usage(const char *name);
25 
26 typedef int (jumperFn) (const char *title, int argc, const char *const *argv);
27 
28 struct Mode {
29 	char *name;
30 	int argmin, argmax, argmod;
31 	jumperFn *jumper;
32 };
33 
34 jumperFn j_menu, j_radiolist, j_yesno, j_textbox, j_inputbox;
35 jumperFn j_msgbox, j_infobox;
36 
37 static struct Mode modes[] = {
38 	{"--menu", 9, 0, 3, j_menu},
39 	{"--radiolist", 9, 0, 3, j_radiolist},
40 	{"--yesno", 5, 5, 1, j_yesno},
41 	{"--textbox", 5, 5, 1, j_textbox},
42 	{"--inputbox", 5, 6, 1, j_inputbox},
43 	{"--msgbox", 5, 5, 1, j_msgbox},
44 	{"--infobox", 5, 5, 1, j_infobox},
45 	{NULL, 0, 0, 0, NULL}
46 };
47 
48 static struct Mode *modePtr;
49 
50 #ifdef LOCALE
51 #include <locale.h>
52 #endif
53 
main(int argc,const char * const * argv)54 int main(int argc, const char *const *argv)
55 {
56 	int offset = 0, opt_clear = 0, end_common_opts = 0, retval;
57 	const char *title = NULL;
58 
59 #ifdef LOCALE
60 	(void)setlocale(LC_ALL, "");
61 #endif
62 
63 #ifdef TRACE
64 	trace(TRACE_CALLS | TRACE_UPDATE);
65 #endif
66 	if (argc < 2) {
67 		Usage(argv[0]);
68 		exit(-1);
69 	}
70 
71 	while (offset < argc - 1 && !end_common_opts) {	/* Common options */
72 		if (!strcmp(argv[offset + 1], "--title")) {
73 			if (argc - offset < 3 || title != NULL) {
74 				Usage(argv[0]);
75 				exit(-1);
76 			} else {
77 				title = argv[offset + 2];
78 				offset += 2;
79 			}
80 		} else if (!strcmp(argv[offset + 1], "--backtitle")) {
81 			if (backtitle != NULL) {
82 				Usage(argv[0]);
83 				exit(-1);
84 			} else {
85 				backtitle = argv[offset + 2];
86 				offset += 2;
87 			}
88 		} else if (!strcmp(argv[offset + 1], "--clear")) {
89 			if (opt_clear) {	/* Hey, "--clear" can't appear twice! */
90 				Usage(argv[0]);
91 				exit(-1);
92 			} else if (argc == 2) {	/* we only want to clear the screen */
93 				init_dialog();
94 				refresh();	/* init_dialog() will clear the screen for us */
95 				end_dialog();
96 				return 0;
97 			} else {
98 				opt_clear = 1;
99 				offset++;
100 			}
101 		} else		/* no more common options */
102 			end_common_opts = 1;
103 	}
104 
105 	if (argc - 1 == offset) {	/* no more options */
106 		Usage(argv[0]);
107 		exit(-1);
108 	}
109 	/* use a table to look for the requested mode, to avoid code duplication */
110 
111 	for (modePtr = modes; modePtr->name; modePtr++)	/* look for the mode */
112 		if (!strcmp(argv[offset + 1], modePtr->name))
113 			break;
114 
115 	if (!modePtr->name)
116 		Usage(argv[0]);
117 	if (argc - offset < modePtr->argmin)
118 		Usage(argv[0]);
119 	if (modePtr->argmax && argc - offset > modePtr->argmax)
120 		Usage(argv[0]);
121 
122 	init_dialog();
123 	retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
124 
125 	if (opt_clear) {	/* clear screen before exit */
126 		attr_clear(stdscr, LINES, COLS, screen_attr);
127 		refresh();
128 	}
129 	end_dialog();
130 
131 	exit(retval);
132 }
133 
134 /*
135  * Print program usage
136  */
Usage(const char * name)137 static void Usage(const char *name)
138 {
139 	fprintf(stderr, "\
140 \ndialog, by Savio Lam (lam836@cs.cuhk.hk).\
141 \n  patched by Stuart Herbert (S.Herbert@shef.ac.uk)\
142 \n  modified/gutted for use as a Linux kernel config tool by \
143 \n  William Roadcap (roadcapw@cfw.com)\
144 \n\
145 \n* Display dialog boxes from shell scripts *\
146 \n\
147 \nUsage: %s --clear\
148 \n       %s [--title <title>] [--backtitle <backtitle>] --clear <Box options>\
149 \n\
150 \nBox options:\
151 \n\
152 \n  --menu      <text> <height> <width> <menu height> <tag1> <item1>...\
153 \n  --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
154 \n  --textbox   <file> <height> <width>\
155 \n  --inputbox  <text> <height> <width> [<init>]\
156 \n  --yesno     <text> <height> <width>\
157 \n", name, name);
158 	exit(-1);
159 }
160 
161 /*
162  * These are the program jumpers
163  */
164 
j_menu(const char * t,int ac,const char * const * av)165 int j_menu(const char *t, int ac, const char *const *av)
166 {
167 	return dialog_menu(t, av[2], atoi(av[3]), atoi(av[4]),
168 			   atoi(av[5]), av[6], (ac - 6) / 2, av + 7);
169 }
170 
j_radiolist(const char * t,int ac,const char * const * av)171 int j_radiolist(const char *t, int ac, const char *const *av)
172 {
173 	return dialog_checklist(t, av[2], atoi(av[3]), atoi(av[4]),
174 				atoi(av[5]), (ac - 6) / 3, av + 6);
175 }
176 
j_textbox(const char * t,int ac,const char * const * av)177 int j_textbox(const char *t, int ac, const char *const *av)
178 {
179 	return dialog_textbox(t, av[2], atoi(av[3]), atoi(av[4]));
180 }
181 
j_yesno(const char * t,int ac,const char * const * av)182 int j_yesno(const char *t, int ac, const char *const *av)
183 {
184 	return dialog_yesno(t, av[2], atoi(av[3]), atoi(av[4]));
185 }
186 
j_inputbox(const char * t,int ac,const char * const * av)187 int j_inputbox(const char *t, int ac, const char *const *av)
188 {
189 	int ret = dialog_inputbox(t, av[2], atoi(av[3]), atoi(av[4]),
190 				  ac == 6 ? av[5] : (char *)NULL);
191 	if (ret == 0)
192 		fprintf(stderr, "%s", dialog_input_result);
193 	return ret;
194 }
195 
j_msgbox(const char * t,int ac,const char * const * av)196 int j_msgbox(const char *t, int ac, const char *const *av)
197 {
198 	return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 1);
199 }
200 
j_infobox(const char * t,int ac,const char * const * av)201 int j_infobox(const char *t, int ac, const char *const *av)
202 {
203 	return dialog_msgbox(t, av[2], atoi(av[3]), atoi(av[4]), 0);
204 }
205