00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "dialog.h"
00023
00024 static void Usage (const char *name);
00025
00026 typedef int (jumperFn) (const char *title, int argc, const char * const * argv);
00027
00028 struct Mode {
00029 char *name;
00030 int argmin, argmax, argmod;
00031 jumperFn *jumper;
00032 };
00033
00034 jumperFn j_menu, j_checklist, j_radiolist, j_yesno, j_textbox, j_inputbox;
00035 jumperFn j_msgbox, j_infobox;
00036
00037 static struct Mode modes[] =
00038 {
00039 {"--menu", 9, 0, 3, j_menu},
00040 {"--checklist", 9, 0, 3, j_checklist},
00041 {"--radiolist", 9, 0, 3, j_radiolist},
00042 {"--yesno", 5,5,1, j_yesno},
00043 {"--textbox", 5,5,1, j_textbox},
00044 {"--inputbox", 5, 6, 1, j_inputbox},
00045 {"--msgbox", 5, 5, 1, j_msgbox},
00046 {"--infobox", 5, 5, 1, j_infobox},
00047 {NULL, 0, 0, 0, NULL}
00048 };
00049
00050 static struct Mode *modePtr;
00051
00052 #ifdef LOCALE
00053 #include <locale.h>
00054 #endif
00055
00056 int
00057 main (int argc, const char * const * argv)
00058 {
00059 int offset = 0, clear_screen = 0, end_common_opts = 0, retval;
00060 const char *title = NULL;
00061
00062 #ifdef LOCALE
00063 (void) setlocale (LC_ALL, "");
00064 #endif
00065
00066 #ifdef TRACE
00067 trace(TRACE_CALLS|TRACE_UPDATE);
00068 #endif
00069 if (argc < 2) {
00070 Usage (argv[0]);
00071 exit (-1);
00072 }
00073
00074 while (offset < argc - 1 && !end_common_opts) {
00075 if (!strcmp (argv[offset + 1], "--title")) {
00076 if (argc - offset < 3 || title != NULL) {
00077 Usage (argv[0]);
00078 exit (-1);
00079 } else {
00080 title = argv[offset + 2];
00081 offset += 2;
00082 }
00083 } else if (!strcmp (argv[offset + 1], "--backtitle")) {
00084 if (backtitle != NULL) {
00085 Usage (argv[0]);
00086 exit (-1);
00087 } else {
00088 backtitle = argv[offset + 2];
00089 offset += 2;
00090 }
00091 } else if (!strcmp (argv[offset + 1], "--clear")) {
00092 if (clear_screen) {
00093 Usage (argv[0]);
00094 exit (-1);
00095 } else if (argc == 2) {
00096 init_dialog ();
00097 refresh ();
00098 end_dialog ();
00099 return 0;
00100 } else {
00101 clear_screen = 1;
00102 offset++;
00103 }
00104 } else
00105 end_common_opts = 1;
00106 }
00107
00108 if (argc - 1 == offset) {
00109 Usage (argv[0]);
00110 exit (-1);
00111 }
00112
00113
00114 for (modePtr = modes; modePtr->name; modePtr++)
00115 if (!strcmp (argv[offset + 1], modePtr->name))
00116 break;
00117
00118 if (!modePtr->name)
00119 Usage (argv[0]);
00120 if (argc - offset < modePtr->argmin)
00121 Usage (argv[0]);
00122 if (modePtr->argmax && argc - offset > modePtr->argmax)
00123 Usage (argv[0]);
00124
00125
00126
00127 init_dialog ();
00128 retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);
00129
00130 if (clear_screen) {
00131 attr_clear (stdscr, LINES, COLS, screen_attr);
00132 refresh ();
00133 }
00134 end_dialog();
00135
00136 exit (retval);
00137 }
00138
00139
00140
00141
00142 static void
00143 Usage (const char *name)
00144 {
00145 fprintf (stderr, "\
00146 \ndialog, by Savio Lam (lam836@cs.cuhk.hk).\
00147 \n patched by Stuart Herbert (S.Herbert@shef.ac.uk)\
00148 \n modified/gutted for use as a Linux kernel config tool by \
00149 \n William Roadcap (roadcapw@cfw.com)\
00150 \n\
00151 \n* Display dialog boxes from shell scripts *\
00152 \n\
00153 \nUsage: %s --clear\
00154 \n %s [--title <title>] [--backtitle <backtitle>] --clear <Box options>\
00155 \n\
00156 \nBox options:\
00157 \n\
00158 \n --menu <text> <height> <width> <menu height> <tag1> <item1>...\
00159 \n --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
00160 \n --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\
00161 \n --textbox <file> <height> <width>\
00162 \n --inputbox <text> <height> <width> [<init>]\
00163 \n --yesno <text> <height> <width>\
00164 \n", name, name);
00165 exit (-1);
00166 }
00167
00168
00169
00170
00171
00172 int
00173 j_menu (const char *t, int ac, const char * const * av)
00174 {
00175 return dialog_menu (t, av[2], atoi (av[3]), atoi (av[4]),
00176 atoi (av[5]), av[6], (ac - 6) / 2, av + 7);
00177 }
00178
00179 int
00180 j_checklist (const char *t, int ac, const char * const * av)
00181 {
00182 return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),
00183 atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_CHECK);
00184 }
00185
00186 int
00187 j_radiolist (const char *t, int ac, const char * const * av)
00188 {
00189 return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),
00190 atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_RADIO);
00191 }
00192
00193 int
00194 j_textbox (const char *t, int ac, const char * const * av)
00195 {
00196 return dialog_textbox (t, av[2], atoi (av[3]), atoi (av[4]));
00197 }
00198
00199 int
00200 j_yesno (const char *t, int ac, const char * const * av)
00201 {
00202 return dialog_yesno (t, av[2], atoi (av[3]), atoi (av[4]));
00203 }
00204
00205 int
00206 j_inputbox (const char *t, int ac, const char * const * av)
00207 {
00208 int ret = dialog_inputbox (t, av[2], atoi (av[3]), atoi (av[4]),
00209 ac == 6 ? av[5] : (char *) NULL);
00210 if (ret == 0)
00211 fprintf(stderr, dialog_input_result);
00212 return ret;
00213 }
00214
00215 int
00216 j_msgbox (const char *t, int ac, const char * const * av)
00217 {
00218 return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 1);
00219 }
00220
00221 int
00222 j_infobox (const char *t, int ac, const char * const * av)
00223 {
00224 return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 0);
00225 }
00226