| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 | /* *  dialog - Display simple dialog boxes from shell scripts * *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) * *  This program is free software; you can redistribute it and/or *  modify it under the terms of the GNU General Public License *  as published by the Free Software Foundation; either version 2 *  of the License, or (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include "dialog.h"static void Usage (const char *name);typedef int (jumperFn) (const char *title, int argc, const char * const * argv);struct Mode {    char *name;    int argmin, argmax, argmod;    jumperFn *jumper;};jumperFn j_menu, j_checklist, j_radiolist, j_yesno, j_textbox, j_inputbox;jumperFn j_msgbox, j_infobox;static struct Mode modes[] ={    {"--menu", 9, 0, 3, j_menu},    {"--checklist", 9, 0, 3, j_checklist},    {"--radiolist", 9, 0, 3, j_radiolist},    {"--yesno",    5,5,1, j_yesno},    {"--textbox",  5,5,1, j_textbox},    {"--inputbox", 5, 6, 1, j_inputbox},    {"--msgbox", 5, 5, 1, j_msgbox},    {"--infobox", 5, 5, 1, j_infobox},    {NULL, 0, 0, 0, NULL}};static struct Mode *modePtr;#ifdef LOCALE#include <locale.h>#endifintmain (int argc, const char * const * argv){    int offset = 0, clear_screen = 0, end_common_opts = 0, retval;    const char *title = NULL;#ifdef LOCALE    (void) setlocale (LC_ALL, "");#endif#ifdef TRACE    trace(TRACE_CALLS|TRACE_UPDATE);#endif    if (argc < 2) {	Usage (argv[0]);	exit (-1);    }    while (offset < argc - 1 && !end_common_opts) {	/* Common options */	if (!strcmp (argv[offset + 1], "--title")) {	    if (argc - offset < 3 || title != NULL) {		Usage (argv[0]);		exit (-1);	    } else {		title = argv[offset + 2];		offset += 2;	    }        } else if (!strcmp (argv[offset + 1], "--backtitle")) {            if (backtitle != NULL) {                Usage (argv[0]);                exit (-1);            } else {                backtitle = argv[offset + 2];                offset += 2;            }	} else if (!strcmp (argv[offset + 1], "--clear")) {	    if (clear_screen) {	/* Hey, "--clear" can't appear twice! */		Usage (argv[0]);		exit (-1);	    } else if (argc == 2) {	/* we only want to clear the screen */		init_dialog ();		refresh ();	/* init_dialog() will clear the screen for us */		end_dialog ();		return 0;	    } else {		clear_screen = 1;		offset++;	    }	} else			/* no more common options */	    end_common_opts = 1;    }    if (argc - 1 == offset) {	/* no more options */	Usage (argv[0]);	exit (-1);    }    /* use a table to look for the requested mode, to avoid code duplication */    for (modePtr = modes; modePtr->name; modePtr++)	/* look for the mode */	if (!strcmp (argv[offset + 1], modePtr->name))	    break;    if (!modePtr->name)	Usage (argv[0]);    if (argc - offset < modePtr->argmin)	Usage (argv[0]);    if (modePtr->argmax && argc - offset > modePtr->argmax)	Usage (argv[0]);    init_dialog ();    retval = (*(modePtr->jumper)) (title, argc - offset, argv + offset);    if (clear_screen) {		/* clear screen before exit */	attr_clear (stdscr, LINES, COLS, screen_attr);	refresh ();    }    end_dialog();    exit (retval);}/* * Print program usage */static voidUsage (const char *name){    fprintf (stderr, "\\ndialog, by Savio Lam (lam836@cs.cuhk.hk).\\n  patched by Stuart Herbert (S.Herbert@shef.ac.uk)\\n  modified/gutted for use as a Linux kernel config tool by \\n  William Roadcap (roadcapw@cfw.com)\\n\\n* Display dialog boxes from shell scripts *\\n\\nUsage: %s --clear\\n       %s [--title <title>] [--backtitle <backtitle>] --clear <Box options>\\n\\nBox options:\\n\\n  --menu      <text> <height> <width> <menu height> <tag1> <item1>...\\n  --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...\\n  --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...\\n  --textbox   <file> <height> <width>\\n  --inputbox  <text> <height> <width> [<init>]\\n  --yesno     <text> <height> <width>\\n", name, name);    exit (-1);}/* * These are the program jumpers */intj_menu (const char *t, int ac, const char * const * av){    return dialog_menu (t, av[2], atoi (av[3]), atoi (av[4]),			atoi (av[5]), av[6], (ac - 6) / 2, av + 7);}intj_checklist (const char *t, int ac, const char * const * av){    return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),	atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_CHECK);}intj_radiolist (const char *t, int ac, const char * const * av){    return dialog_checklist (t, av[2], atoi (av[3]), atoi (av[4]),	atoi (av[5]), (ac - 6) / 3, av + 6, FLAG_RADIO);}intj_textbox (const char *t, int ac, const char * const * av){    return dialog_textbox (t, av[2], atoi (av[3]), atoi (av[4]));}intj_yesno (const char *t, int ac, const char * const * av){    return dialog_yesno (t, av[2], atoi (av[3]), atoi (av[4]));}intj_inputbox (const char *t, int ac, const char * const * av){    int ret = dialog_inputbox (t, av[2], atoi (av[3]), atoi (av[4]),                            ac == 6 ? av[5] : (char *) NULL);    if (ret == 0)        fprintf(stderr, dialog_input_result);    return ret;}intj_msgbox (const char *t, int ac, const char * const * av){    return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 1);}intj_infobox (const char *t, int ac, const char * const * av){    return dialog_msgbox (t, av[2], atoi (av[3]), atoi (av[4]), 0);}
 |