home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / scripts / kconfig / lxdialog / lxdialog.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-21  |  5.3 KB  |  205 lines

  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. }
  205.