⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dialog.c

📁 This version of dialog, formerly known as cdialog is based on the Debian package for dialog 0.9a (se
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif#ifdef HAVE_GAUGEstatic intj_gauge(JUMPARGS){    *offset_add = arg_rest(av);    return dialog_gauge(t,			av[1],			numeric_arg(av, 2),			numeric_arg(av, 3),			optional_num(av, 4, 0));}#endif#ifdef HAVE_TAILBOXstatic intj_tailbox(JUMPARGS){    *offset_add = 4;    return dialog_tailbox(t,			  av[1],			  numeric_arg(av, 2),			  numeric_arg(av, 3),			  FALSE);}static intj_tailboxbg(JUMPARGS){    *offset_add = 4;    return dialog_tailbox(t,			  av[1],			  numeric_arg(av, 2),			  numeric_arg(av, 3),			  TRUE);}#endif/* *INDENT-OFF* */static const Mode modes[] ={    {o_yesno,       4, 4, j_yesno},    {o_msgbox,      4, 4, j_msgbox},    {o_infobox,     4, 4, j_infobox},    {o_textbox,     4, 4, j_textbox},    {o_menu,        7, 0, j_menu},    {o_inputmenu,   7, 0, j_inputmenu},    {o_checklist,   8, 0, j_checklist},    {o_radiolist,   8, 0, j_radiolist},    {o_inputbox,    4, 5, j_inputbox},    {o_passwordbox, 4, 5, j_passwordbox},#ifdef HAVE_XDIALOG    {o_calendar,    4, 7, j_calendar},    {o_fselect,     4, 5, j_fselect},    {o_timebox,     4, 7, j_timebox},#endif#ifdef HAVE_FORMBOX    {o_form,       13, 0, j_form},#endif#ifdef HAVE_GAUGE    {o_gauge,       4, 5, j_gauge},#endif#ifdef HAVE_TAILBOX    {o_tailbox,     4, 4, j_tailbox},    {o_tailboxbg,   4, 4, j_tailboxbg},#endif};/* *INDENT-ON* */static char *optionString(char **argv, int *num){    int next = *num + 1;    char *result = argv[next];    if (result == 0) {	char temp[80];	sprintf(temp, "Expected a string-parameter for %.20s", argv[*num]);	Usage(temp);    }    *num = next;    return result;}static intoptionValue(char **argv, int *num){    int next = *num + 1;    char *src = argv[next];    char *tmp = 0;    int result = 0;    if (src != 0) {	result = strtol(src, &tmp, 0);	if (tmp == 0 || *tmp != 0)	    src = 0;    }    if (src == 0) {	char temp[80];	sprintf(temp, "Expected a numeric-parameter for %.20s", argv[*num]);	Usage(temp);    }    *num = next;    return result;}/* * Print parts of a message */static voidPrintList(const char *const *list){    const char *leaf = strrchr(program, '/');    unsigned n = 0;    if (leaf != 0)	leaf++;    else	leaf = program;    while (*list != 0) {	fprintf(dialog_state.output, *list, n ? leaf : dialog_version());	(void) fputc('\n', dialog_state.output);	n = 1;	list++;    }}static const Mode *lookupMode(eOptions code){    const Mode *modePtr = 0;    unsigned n;    for (n = 0; n < sizeof(modes) / sizeof(modes[0]); n++) {	if (modes[n].code == code) {	    modePtr = &modes[n];	    break;	}    }    return modePtr;}/* * Print program help-message */static voidHelp(void){    static const char *const tbl_1[] =    {	"cdialog (ComeOn Dialog!) version %s",	"",	"* Display dialog boxes from shell scripts *",	"",	"Usage: %s <options> { --and-widget <options> }",	"where options are \"common\" options, followed by \"box\" options",	"",#ifdef HAVE_RC_FILE	"Special options:",	"  [--create-rc \"Ifile\"]",#endif	0    }, *const tbl_3[] =    {	"",	"Auto-size with height and width = 0. Maximize with height and width = -1.",	"Global-auto-size if also menu_height/list_height = 0.",	0    };    unsigned j, k;    PrintList(tbl_1);    fprintf(dialog_state.output, "Common options:\n ");    for (j = k = 0; j < sizeof(options) / sizeof(options[0]); j++) {	if ((options[j].pass & 1)	    && options[j].help != 0) {	    unsigned len = 6 + strlen(options[j].name) + strlen(options[j].help);	    k += len;	    if (k > 75) {		fprintf(dialog_state.output, "\n ");		k = len;	    }	    fprintf(dialog_state.output, " [--%s%s%s]", options[j].name,		    *(options[j].help) ? " " : "", options[j].help);	}    }    fprintf(dialog_state.output, "\nBox options:\n");    for (j = 0; j < sizeof(options) / sizeof(options[0]); j++) {	if ((options[j].pass & 2) != 0	    && options[j].help != 0	    && lookupMode(options[j].code))	    fprintf(dialog_state.output, "  --%-12s %s\n", options[j].name,		    options[j].help);    }    PrintList(tbl_3);    dlg_exit(DLG_EXIT_OK);}static voidinit_result(char *buffer){    /* clear everything we do not save for the next widget */    memset(&dialog_vars, 0, sizeof(dialog_vars));    dialog_vars.input_result = buffer;    dialog_vars.input_result[0] = '\0';}intmain(int argc, char *argv[]){    FILE *input = stdin;    char temp[256];    bool esc_pressed = FALSE;    bool ignore_unknown = FALSE;    int offset = 1;    int offset_add;    int retval = DLG_EXIT_OK;    int done;    int j;    eOptions code;    const Mode *modePtr;    char my_buffer[MAX_LEN + 1];    memset(&dialog_state, 0, sizeof(dialog_state));    memset(&dialog_vars, 0, sizeof(dialog_vars));#if defined(ENABLE_NLS)    /* initialize locale support */    setlocale(LC_ALL, "");    bindtextdomain(PACKAGE, LOCALEDIR);    textdomain(PACKAGE);#elif defined(HAVE_SETLOCALE)    (void) setlocale(LC_ALL, "");#endif    unescape_argv(&argc, argv);    program = argv[0];    dialog_state.output = stderr;    /*     * Look for the last --stdout, --stderr or --output-fd option, and use     * that.  We can only write to one of them.  If --stdout is used, that     * can interfere with initializing the curses library, so we want to     * know explicitly if it is used.     */    while (offset < argc) {	int base = offset;	switch (lookupOption(argv[offset], 7)) {	case o_stdout:	    dialog_state.output = stdout;	    break;	case o_stderr:	    dialog_state.output = stderr;	    break;	case o_input_fd:	    if ((j = optionValue(argv, &offset)) < 0		|| (input = fdopen(j, "r")) == 0)		dlg_exiterr("Cannot open input-fd\n");	    break;	case o_output_fd:	    if ((j = optionValue(argv, &offset)) < 0		|| (dialog_state.output = fdopen(j, "w")) == 0)		dlg_exiterr("Cannot open output-fd\n");	    break;	default:	    ++offset;	    continue;	}	for (j = base; j < argc; ++j) {	    dialog_argv[j] = dialog_argv[j + 1 + (offset - base)];	    if (dialog_opts != 0)		dialog_opts[j] = dialog_opts[j + 1 + (offset - base)];	}	argc -= (1 + offset - base);	offset = base;    }    offset = 1;    init_result(my_buffer);    if (argc == 2) {		/* if we don't want clear screen */	switch (lookupOption(argv[1], 7)) {	case o_print_maxsize:	    (void) initscr();	    endwin();	    fflush(dialog_state.output);	    fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);	    break;	case o_print_version:	    fprintf(dialog_state.output, "Version: %s\n", dialog_version());	    break;	case o_clear:	    initscr();	    refresh();	    endwin();	    break;	case o_ignore:	    break;	default:	case o_help:	    Help();	    break;	}	return DLG_EXIT_OK;    }    if (argc < 2) {	Help();    }#ifdef HAVE_RC_FILE    if (lookupOption(argv[1], 7) == o_create_rc) {	if (argc != 3) {	    sprintf(temp, "Expected a filename for %.50s", argv[1]);	    Usage(temp);	}	if (dlg_parse_rc() == -1)	/* Read the configuration file */	    dlg_exiterr("dialog: dlg_parse_rc");	dlg_create_rc(argv[2]);	return DLG_EXIT_OK;    }#endif    init_dialog(input, dialog_state.output);    while (offset < argc && !esc_pressed) {	init_result(my_buffer);	done = FALSE;	while (offset < argc && !done) {	/* Common options */	    switch (lookupOption(argv[offset], 1)) {	    case o_title:		dialog_vars.title = optionString(argv, &offset);		break;	    case o_backtitle:		dialog_vars.backtitle = optionString(argv, &offset);		break;	    case o_separator:	    case o_separate_widget:		dialog_state.separate_str = optionString(argv, &offset);		break;	    case o_separate_output:		dialog_vars.separate_output = TRUE;		break;	    case o_colors:		dialog_vars.colors = TRUE;		break;	    case o_cr_wrap:		dialog_vars.cr_wrap = TRUE;		break;	    case o_no_collapse:		dialog_vars.nocollapse = TRUE;		break;	    case o_no_kill:		dialog_vars.cant_kill = TRUE;		break;	    case o_nocancel:		dialog_vars.nocancel = TRUE;		break;	    case o_size_err:		dialog_vars.size_err = TRUE;		break;	    case o_beep:		dialog_vars.beep_signal = TRUE;		break;	    case o_beep_after:		dialog_vars.beep_after_signal = TRUE;		break;	    case o_shadow:		dialog_state.use_shadow = TRUE;		break;	    case o_defaultno:		dialog_vars.defaultno = TRUE;		break;	    case o_default_item:		dialog_vars.default_item = optionString(argv, &offset);		break;	    case o_insecure:		dialog_vars.insecure = TRUE;		break;	    case o_item_help:		dialog_vars.item_help = TRUE;		break;	    case o_help_button:		dialog_vars.help_button = TRUE;		break;	    case o_help_status:		dialog_vars.help_status = TRUE;		break;	    case o_extra_button:		dialog_vars.extra_button = TRUE;		break;	    case o_ignore:		ignore_unknown = TRUE;		break;	    case o_keep_window:		dialog_vars.keep_window = TRUE;		break;	    case o_no_shadow:		dialog_state.use_shadow = FALSE;		break;	    case o_print_size:		dialog_vars.print_siz = TRUE;		break;	    case o_print_maxsize:		/*		 * If this is the last option, we do not want any error		 * messages - just our output.  Calling end_dialog() cancels		 * the refresh() at the end of the program as well.		 */		if (argv[offset + 1] == 0) {		    ignore_unknown = TRUE;		    end_dialog();		}		fflush(dialog_state.output);		fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);		break;	    case o_print_version:		fprintf(dialog_state.output, "Version: %s\n", dialog_version());		break;	    case o_tab_correct:		dialog_vars.tab_correct = TRUE;		break;	    case o_sleep:		dialog_vars.sleep_secs = optionValue(argv, &offset);		break;	    case o_timeout:		dialog_vars.timeout_secs = optionValue(argv, &offset);		break;	    case o_max_input:		dialog_vars.max_input = optionValue(argv, &offset);		break;	    case o_tab_len:		dialog_state.tab_len = optionValue(argv, &offset);		break;	    case o_trim:		dialog_vars.trim_whitespace = TRUE;		break;	    case o_aspect:		dialog_state.aspect_ratio = optionValue(argv, &offset);		break;	    case o_begin:		dialog_vars.begin_set = TRUE;		dialog_vars.begin_y = optionValue(argv, &offset);		dialog_vars.begin_x = optionValue(argv, &offset);		break;	    case o_clear:		dialog_vars.dlg_clear_screen = TRUE;		break;	    case o_yes_label:		dialog_vars.yes_label = optionString(argv, &offset);		break;	    case o_no_label:		dialog_vars.no_label = optionString(argv, &offset);		break;	    case o_ok_label:		dialog_vars.ok_label = optionString(argv, &offset);		break;	    case o_cancel_label:		dialog_vars.cancel_label = optionString(argv, &offset);		break;	    case o_extra_label:		dialog_vars.extra_label = optionString(argv, &offset);		break;	    case o_exit_label:		dialog_vars.exit_label = optionString(argv, &offset);		break;	    case o_help_label:		dialog_vars.help_label = optionString(argv, &offset);		break;	    case o_noitem:	    case o_fullbutton:		/* ignore */		break;		/* options of Xdialog which we ignore */	    case o_icon:	    case o_wmclass:		(void) optionString(argv, &offset);		/* FALLTHRU */	    case o_allow_close:	    case o_auto_placement:	    case o_fixed_font:	    case o_keep_colors:	    case o_no_close:	    case o_no_cr_wrap:	    case o_screen_center:	    case o_smooth:	    case o_under_mouse:		break;	    case o_unknown:		if (ignore_unknown)		    break;		/* FALLTHRU */	    default:		/* no more common options */		done = TRUE;		break;	    }	    if (!done)		offset++;	}	if (argv[offset] == NULL) {	    if (ignore_unknown)		break;	    Usage("Expected a box option");	}	for (j = offset; j < argc; j++) {	    if (offset > 0) {		switch (lookupOption(argv[j - 1], 7)) {		case o_unknown:		case o_title:		case o_backtitle:		    break;		default:		    dlg_trim_string(argv[j]);		    break;		}	    }	}	if (lookupOption(argv[offset], 2) != o_checklist	    && dialog_vars.separate_output) {	    sprintf(temp, "Expected --checklist, not %.20s", argv[offset]);	    Usage(temp);	}	if (dialog_state.aspect_ratio == 0)	    dialog_state.aspect_ratio = DEFAULT_ASPECT_RATIO;	dlg_put_backtitle();	/* use a table to look for the requested mode, to avoid code duplication */	modePtr = 0;	if ((code = lookupOption(argv[offset], 2)) != o_unknown)	    modePtr = lookupMode(code);	if (modePtr == 0) {	    sprintf(temp, "%s option %.20s",		    lookupOption(argv[offset], 7) != o_unknown		    ? "Unexpected"		    : "Unknown",		    argv[offset]);	    Usage(temp);	}	if (arg_rest(&argv[offset]) < modePtr->argmin) {	    sprintf(temp, "Expected at least %d tokens for %.20s, have %d",		    modePtr->argmin - 1, argv[offset],		    arg_rest(&argv[offset]) - 1);	    Usage(temp);	}	if (modePtr->argmax && arg_rest(&argv[offset]) > modePtr->argmax) {	    sprintf(temp,		    "Expected no more than %d tokens for %.20s, have %d",		    modePtr->argmax - 1, argv[offset],		    arg_rest(&argv[offset]) - 1);	    Usage(temp);	}	retval = show_result((*(modePtr->jumper)) (dialog_vars.title,						   argv + offset,						   &offset_add));	offset += offset_add;	if (dialog_vars.input_result != my_buffer)	    free(dialog_vars.input_result);	if (retval == DLG_EXIT_ESC) {	    esc_pressed = TRUE;	} else {	    if (dialog_vars.beep_after_signal)		(void) beep();	    if (dialog_vars.sleep_secs)		(void) napms(dialog_vars.sleep_secs * 1000);	    if (offset < argc) {		switch (lookupOption(argv[offset], 7)) {		case o_and_widget:		    offset++;		    break;		case o_unknown:		    sprintf(temp, "Expected --and-widget, not %.20s",			    argv[offset]);		    Usage(temp);		    break;		default:		    /* if we got a cancel, etc., stop chaining */		    if (retval != DLG_EXIT_OK)			esc_pressed = TRUE;		    else			dialog_vars.dlg_clear_screen = TRUE;		    break;		}	    }	    if (dialog_vars.dlg_clear_screen)		dlg_clear();	}    }    dlg_killall_bg(&retval);    if (dialog_state.screen_initialized) {	(void) refresh();	end_dialog();    }    dlg_exit(retval);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -