Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Ported palacios to Kbuild
[palacios.git] / scripts / kconfig / lxdialog / lxdialog.c
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
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  */
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
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
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
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
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
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, dialog_input_result);
193         return ret;
194 }
195
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
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 }