diff options
Diffstat (limited to 'bsddialog.c')
-rw-r--r-- | bsddialog.c | 1687 |
1 files changed, 0 insertions, 1687 deletions
diff --git a/bsddialog.c b/bsddialog.c deleted file mode 100644 index b9b2810dc62f..000000000000 --- a/bsddialog.c +++ /dev/null @@ -1,1687 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2021-2022 Alfonso Sabato Siciliano - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/ioctl.h> - -#include <getopt.h> -#include <locale.h> -#include <signal.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <term.h> -#include <time.h> -#include <unistd.h> - -#include <bsddialog.h> -#include <bsddialog_theme.h> - -#include "util_theme.h" - -enum OPTS { - /* Options */ - ALTERNATE_SCREEN = '?' + 1, - AND_DIALOG, - ASCII_LINES, - BACKTITLE, - BEGIN_X, - BEGIN_Y, - BIKESHED, - CANCEL_LABEL, - CLEAR_DIALOG, - CLEAR_SCREEN, - COLORS, - COLUMNS_PER_ROW, - CR_WRAP, - DATE_FORMAT, - DEFAULT_BUTTON, - DEFAULT_ITEM, - DEFAULT_NO, - DISABLE_ESC, - ESC_RETURNCANCEL, - EXIT_LABEL, - EXTRA_BUTTON, - EXTRA_LABEL, - GENERIC_BUTTON1, - GENERIC_BUTTON2, - HELP_BUTTON, - HELP_LABEL, - HELP_PRINT_NAME, - HELP_STATUS, - HFILE, - HLINE, - HMSG, - IGNORE, - INSECURE, - ITEM_BOTTOM_DESC, - ITEM_DEPTH, - ITEM_PREFIX, - LOAD_THEME, - MAX_INPUT, - NO_CANCEL, - NO_DESCRIPTIONS, - NO_LINES, - NO_NAMES, - NO_OK, - NO_SHADOW, - NORMAL_SCREEN, - OK_LABEL, - OUTPUT_FD, - OUTPUT_SEPARATOR, - PRINT_MAXSIZE, - PRINT_SIZE, - PRINT_VERSION, - QUOTED, - SAVE_THEME, - SEPARATE_OUTPUT, - SHADOW, - SINGLE_QUOTED, - SLEEP, - STDERR, - STDOUT, - SWITCH_BUTTONS, - TAB_ESCAPE, - TAB_LEN, - TEXT_UNCHANGED, - THEME, - TIME_FORMAT, - TITLE, - /* Dialogs */ - CALENDAR, - CHECKLIST, - DATEBOX, - FORM, - GAUGE, - INFOBOX, - INPUTBOX, - MENU, - MIXEDFORM, - MIXEDGAUGE, - MSGBOX, - PASSWORDBOX, - PASSWORDFORM, - PAUSE, - RADIOLIST, - RANGEBOX, - TEXTBOX, - TIMEBOX, - TREEVIEW, - YESNO -}; - -/* options descriptor */ -static struct option longopts[] = { - /* Options */ - {"alternate-screen", no_argument, NULL, ALTERNATE_SCREEN}, - {"and-dialog", no_argument, NULL, AND_DIALOG}, - {"and-widget", no_argument, NULL, AND_DIALOG}, - {"ascii-lines", no_argument, NULL, ASCII_LINES}, - {"backtitle", required_argument, NULL, BACKTITLE}, - {"begin-x", required_argument, NULL, BEGIN_X}, - {"begin-y", required_argument, NULL, BEGIN_Y}, - {"bikeshed", no_argument, NULL, BIKESHED}, - {"cancel-label", required_argument, NULL, CANCEL_LABEL}, - {"clear", no_argument, NULL, CLEAR_SCREEN}, - {"clear-dialog", no_argument, NULL, CLEAR_DIALOG}, - {"clear-screen", no_argument, NULL, CLEAR_SCREEN}, - {"colors", no_argument, NULL, COLORS}, - {"columns-per-row", required_argument, NULL, COLUMNS_PER_ROW}, - {"cr-wrap", no_argument, NULL, CR_WRAP}, - {"date-format", required_argument, NULL, DATE_FORMAT}, - {"defaultno", no_argument, NULL, DEFAULT_NO}, - {"default-button", required_argument, NULL, DEFAULT_BUTTON}, - {"default-item", required_argument, NULL, DEFAULT_ITEM}, - {"default-no", no_argument, NULL, DEFAULT_NO}, - {"disable-esc", no_argument, NULL, DISABLE_ESC}, - {"esc-return-cancel", no_argument, NULL, ESC_RETURNCANCEL}, - {"exit-label", required_argument, NULL, EXIT_LABEL}, - {"extra-button", no_argument, NULL, EXTRA_BUTTON}, - {"extra-label", required_argument, NULL, EXTRA_LABEL}, - {"generic-button1", required_argument, NULL, GENERIC_BUTTON1}, - {"generic-button2", required_argument, NULL, GENERIC_BUTTON2}, - {"help-button", no_argument, NULL, HELP_BUTTON}, - {"help-label", required_argument, NULL, HELP_LABEL}, - {"help-print-name", no_argument, NULL, HELP_PRINT_NAME}, - {"help-status", no_argument, NULL, HELP_STATUS}, - {"help-tags", no_argument, NULL, HELP_PRINT_NAME}, - {"hfile", required_argument, NULL, HFILE}, - {"hline", required_argument, NULL, HLINE}, - {"hmsg", required_argument, NULL, HMSG}, - {"ignore", no_argument, NULL, IGNORE}, - {"insecure", no_argument, NULL, INSECURE}, - {"item-bottom-desc", no_argument, NULL, ITEM_BOTTOM_DESC}, - {"item-depth", no_argument, NULL, ITEM_DEPTH}, - {"item-help", no_argument, NULL, ITEM_BOTTOM_DESC}, - {"item-prefix", no_argument, NULL, ITEM_PREFIX}, - {"keep-tite", no_argument, NULL, ALTERNATE_SCREEN}, - {"load-theme", required_argument, NULL, LOAD_THEME}, - {"max-input", required_argument, NULL, MAX_INPUT}, - {"no-cancel", no_argument, NULL, NO_CANCEL}, - {"nocancel", no_argument, NULL, NO_CANCEL}, - {"no-descriptions", no_argument, NULL, NO_DESCRIPTIONS}, - {"no-items", no_argument, NULL, NO_DESCRIPTIONS}, - {"no-label", required_argument, NULL, CANCEL_LABEL}, - {"no-lines", no_argument, NULL, NO_LINES}, - {"no-names", no_argument, NULL, NO_NAMES}, - {"no-ok", no_argument, NULL, NO_OK}, - {"nook ", no_argument, NULL, NO_OK}, - {"no-shadow", no_argument, NULL, NO_SHADOW}, - {"no-tags", no_argument, NULL, NO_NAMES}, - {"normal-screen", no_argument, NULL, NORMAL_SCREEN}, - {"ok-label", required_argument, NULL, OK_LABEL}, - {"output-fd", required_argument, NULL, OUTPUT_FD}, - {"output-separator", required_argument, NULL, OUTPUT_SEPARATOR}, - {"print-maxsize", no_argument, NULL, PRINT_MAXSIZE}, - {"print-size", no_argument, NULL, PRINT_SIZE}, - {"print-version", no_argument, NULL, PRINT_VERSION}, - {"quoted", no_argument, NULL, QUOTED}, - {"save-theme", required_argument, NULL, SAVE_THEME}, - {"separate-output", no_argument, NULL, SEPARATE_OUTPUT}, - {"separator", required_argument, NULL, OUTPUT_SEPARATOR}, - {"shadow", no_argument, NULL, SHADOW}, - {"single-quoted", no_argument, NULL, SINGLE_QUOTED}, - {"sleep", required_argument, NULL, SLEEP}, - {"stderr", no_argument, NULL, STDERR}, - {"stdout", no_argument, NULL, STDOUT}, - {"switch-buttons", no_argument, NULL, SWITCH_BUTTONS}, - {"tab-escape", no_argument, NULL, TAB_ESCAPE}, - {"tab-len", required_argument, NULL, TAB_LEN}, - {"text-unchanged", no_argument, NULL, TEXT_UNCHANGED}, - {"theme", required_argument, NULL, THEME}, - {"time-format", required_argument, NULL, TIME_FORMAT}, - {"title", required_argument, NULL, TITLE}, - {"yes-label", required_argument, NULL, OK_LABEL}, - /* Dialogs */ - {"calendar", no_argument, NULL, CALENDAR}, - {"checklist", no_argument, NULL, CHECKLIST}, - {"datebox", no_argument, NULL, DATEBOX}, - {"form", no_argument, NULL, FORM}, - {"gauge", no_argument, NULL, GAUGE}, - {"infobox", no_argument, NULL, INFOBOX}, - {"inputbox", no_argument, NULL, INPUTBOX}, - {"menu", no_argument, NULL, MENU}, - {"mixedform", no_argument, NULL, MIXEDFORM}, - {"mixedgauge", no_argument, NULL, MIXEDGAUGE}, - {"msgbox", no_argument, NULL, MSGBOX}, - {"passwordbox", no_argument, NULL, PASSWORDBOX}, - {"passwordform", no_argument, NULL, PASSWORDFORM}, - {"pause", no_argument, NULL, PAUSE}, - {"radiolist", no_argument, NULL, RADIOLIST}, - {"rangebox", no_argument, NULL, RANGEBOX}, - {"textbox", no_argument, NULL, TEXTBOX}, - {"timebox", no_argument, NULL, TIMEBOX}, - {"treeview", no_argument, NULL, TREEVIEW}, - {"yesno", no_argument, NULL, YESNO}, - /* END */ - { NULL, 0, NULL, 0} -}; - -/* Menus options */ -static bool item_prefix_opt; -static bool item_bottomdesc_opt; -static bool item_output_sepnl_opt; -static bool item_singlequote_opt; -static bool list_items_on_opt; -static bool item_help_print_name_opt; -static bool item_always_quote_opt; -static bool item_depth_opt; -static char *item_output_sep_opt; -static char *item_default_opt; -/* Date and Time options */ -static char *date_fmt_opt; -static char *time_fmt_opt; -/* Forms options */ -static int unsigned max_input_form_opt; -/* General options */ -static bool esc_return_cancel_opt; -static bool ignore_opt; -static int output_fd_opt; -static int getH_opt; -static int getW_opt; -/* Text option */ -static bool cr_wrap_opt; -static bool tab_escape_opt; -static bool text_unchanged_opt; -/* Theme and Screen options*/ -static bool bikeshed_opt; -static enum bsddialog_default_theme theme_opt; -static char *backtitle_opt; -static bool clear_screen_opt; -static char *loadthemefile; -static char *savethemefile; -static const char *screen_mode_opt; - -/* Functions */ -#define UNUSED_PAR(x) UNUSED_ ## x __attribute__((__unused__)) -static void custom_text(char *text, char *buf); -static void usage(void); -/* Dialogs */ -#define BUILDER_ARGS struct bsddialog_conf *conf, char* text, int rows, \ - int cols, int argc, char **argv -static int calendar_builder(BUILDER_ARGS); -static int checklist_builder(BUILDER_ARGS); -static int datebox_builder(BUILDER_ARGS); -static int form_builder(BUILDER_ARGS); -static int gauge_builder(BUILDER_ARGS); -static int infobox_builder(BUILDER_ARGS); -static int inputbox_builder(BUILDER_ARGS); -static int menu_builder(BUILDER_ARGS); -static int mixedform_builder(BUILDER_ARGS); -static int mixedgauge_builder(BUILDER_ARGS); -static int msgbox_builder(BUILDER_ARGS); -static int passwordbox_builder(BUILDER_ARGS); -static int passwordform_builder(BUILDER_ARGS); -static int pause_builder(BUILDER_ARGS); -static int radiolist_builder(BUILDER_ARGS); -static int rangebox_builder(BUILDER_ARGS); -static int textbox_builder(BUILDER_ARGS); -static int timebox_builder(BUILDER_ARGS); -static int treeview_builder(BUILDER_ARGS); -static int yesno_builder(BUILDER_ARGS); - -/* init, exit and internals */ -static bool in_bsddialog_mode; -static bool mandatory_dialog; -static int (*dialogbuilder)(BUILDER_ARGS); - -static void exit_error(const char *errstr, bool with_usage) -{ - if (in_bsddialog_mode) - bsddialog_end(); - - printf("Error: %s.\n\n", errstr); - if (with_usage) { - printf("See \'bsddialog --help\' or \'man 1 bsddialog\' "); - printf("for more information.\n"); - } - - exit (255); -} - -static void sigint_handler(int UNUSED_PAR(sig)) -{ - bsddialog_end(); - - exit(255); -} - -static void start_bsddialog_mode(void) -{ - if (in_bsddialog_mode) - return; - - if (bsddialog_init() != BSDDIALOG_OK) - exit_error(bsddialog_geterror(), false); - - in_bsddialog_mode = true; - signal(SIGINT, sigint_handler); -} - -static void error_args(const char *dialog, int argc, char **argv) -{ - int i; - - if (in_bsddialog_mode) - bsddialog_end(); - - printf("Error: %s unexpected argument%s:", dialog, - argc > 1 ? "s" : ""); - for (i = 0; i < argc; i++) - printf(" \"%s\"", argv[i]); - printf(".\n\n"); - printf("See \'bsddialog --help\' or \'man 1 bsddialog\' "); - printf("for more information.\n"); - - exit (255); -} - -static void usage(void) -{ - printf("usage: bsddialog --help\n"); - printf(" bsddialog --version\n"); - printf(" bsddialog [--<opt>] --<dialog> <text> <rows> <cols> " - "[<arg>]\n"); - printf(" bsddialog --<dialog1> ... [--and-dialog --<dialog2> " - "...] ...\n"); - printf("\n"); - - printf("Options:\n"); - printf(" --alternate-screen, --ascii-lines, --backtitle <backtitle>," - " --begin-x <x>,\n --begin-y <y>, --bikeshed, --calendar," - " --cancel-label <label>, --clear-dialog,\n --clear-screen," - " --colors, --columns-per-row <columns>, --cr-wrap,\n" - " --date-format <format>, --default-button <label>," - " --default-item <name>,\n --default-no, --disable-esc," - " --esc-return-cancel, --exit-label <label>,\n --extra-button," - " --extra-label <label>, --generic-button1 <label>,\n" - " --generic-button2 <label>, --help-button, --help-label <label>,\n" - " --help-print-name, --help-status, --hfile <file>," - " --hline <string>,\n --hmsg <string>, --ignore, --insecure," - " --item-bottom-desc, --item-depth,\n --item-prefix," - " --load-theme <file>, --max-input <size>, --no-cancel,\n" - " --no-descriptions, --no-label <label>, --no-lines, --no-names," - " --no-ok,\n --no-shadow, --normal-screen, --ok-label <label>," - " --output-fd <fd>,\n --output-separator <sep>, --print-maxsize," - " --print-size, --print-version,\n --quoted, --save-theme <file>," - " --separate-output, --separator <sep>, --shadow,\n" - " --single-quoted, --sleep <secs>, --stderr, --stdout," - " --tab-escape,\n --tab-len <spaces>, --text-unchanged," - " --switch-buttons,\n --theme <blackwhite|bsddialog|flat|dialog>," - " --time-format <format>,\n --title <title>," - " --yes-label <label>.\n"); - printf("\n"); - - printf("Dialogs:\n"); - printf(" --calendar <text> <rows> <cols> [<dd> <mm> <yy>]\n"); - printf(" --checklist <text> <rows> <cols> <menurows> [<name> <desc> " - "<on|off>] ...\n"); - printf(" --datebox <text> <rows> <cols> [<dd> <mm> <yy>]\n"); - printf(" --form <text> <rows> <cols> <formrows> [<label> <ylabel> " - "<xlabel> <init> <yfield> <xfield> <fieldlen> <maxletters>] " - "...\n"); - printf(" --gauge <text> <rows> <cols> [<perc>]\n"); - printf(" --infobox <text> <rows> <cols>\n"); - printf(" --inputbox <text> <rows> <cols> [init]\n"); - printf(" --menu <text> <rows> <cols> <menurows> [<name> <desc>] ...\n"); - printf(" --mixedform <text> <rows> <cols> <formrows> [<label> <ylabel> " - "<xlabel> <init> <yfield> <xfield> <fieldlen> <maxletters> " - "<0|1|2>] ...\n"); - printf(" --mixedgauge <text> <rows> <cols> <mainperc> [<minilabel> " - "<miniperc>] ...\n"); - printf(" --msgbox <text> <rows> <cols>\n"); - printf(" --passwordbox <text> <rows> <cols> [init]\n"); - printf(" --passwordform <text> <rows> <cols> <formrows> [<label> " - "<ylabel> <xlabel> <init> <yfield> <xfield> <fieldlen> " - "<maxletters>] ...\n"); - printf(" --pause <text> <rows> <cols> <secs>\n"); - printf(" --radiolist <text> <rows> <cols> <menurows> [<name> <desc> " - "<on|off>] ...\n"); - printf(" --rangebox <text> <rows> <cols> <min> <max> [<init>]\n"); - printf(" --textbox <file> <rows> <cols>\n"); - printf(" --timebox <text> <rows> <cols> [<hh> <mm> <ss>]\n"); - printf(" --treeview <text> <rows> <cols> <menurows> [<depth> <name> " - "<desc> <on|off>] ...\n"); - printf(" --yesno <text> <rows> <cols>\n"); - printf("\n"); - - printf("See 'man 1 bsddialog' for more information.\n"); -} - -static int parseargs(int argc, char **argv, struct bsddialog_conf *conf) -{ - int arg, parsed, i; - struct winsize ws; - - bsddialog_initconf(conf); - conf->key.enable_esc = true; - conf->menu.on_without_ok = true; - conf->form.value_without_ok = true; - conf->button.always_active = true; - - dialogbuilder = NULL; - - backtitle_opt = NULL; - theme_opt = -1; - output_fd_opt = STDERR_FILENO; - ignore_opt = false; - cr_wrap_opt = false; - tab_escape_opt = false; - text_unchanged_opt = false; - esc_return_cancel_opt = false; - bikeshed_opt = false; - savethemefile = NULL; - loadthemefile = NULL; - clear_screen_opt = false; - screen_mode_opt = NULL; - - item_output_sepnl_opt = false; - item_singlequote_opt = false; - item_prefix_opt = false; - item_bottomdesc_opt = false; - item_depth_opt = false; - list_items_on_opt = false; - item_help_print_name_opt = false; - item_always_quote_opt = false; - item_output_sep_opt = NULL; - item_default_opt = NULL; - - date_fmt_opt = NULL; - time_fmt_opt = NULL; - - max_input_form_opt = 2048; - - for (i = 0; i < argc; i++) { - if (strcmp(argv[i], "--and-dialog") == 0 || - strcmp(argv[i], "--and-widget") == 0) { - argc = i + 1; - break; - } - } - parsed = argc; - while ((arg = getopt_long(argc, argv, "", longopts, NULL)) != -1) { - switch (arg) { - /* Options */ - case ALTERNATE_SCREEN: - screen_mode_opt = "smcup"; - break; - case AND_DIALOG: - if (dialogbuilder == NULL) - exit_error("--and-dialog without previous " - "--<dialog>", true); - break; - case ASCII_LINES: - conf->ascii_lines = true; - break; - case BACKTITLE: - backtitle_opt = optarg; - if (conf->y == BSDDIALOG_CENTER) - conf->auto_topmargin = 2; - break; - case BEGIN_X: - conf->x = (int)strtol(optarg, NULL, 10); - if (conf->x < BSDDIALOG_CENTER) - exit_error("--begin-x < -1", false); - break; - case BEGIN_Y: - conf->y = (int)strtol(optarg, NULL, 10); - if (conf->y < BSDDIALOG_CENTER) - exit_error("--begin-y < -1", false); - conf->auto_topmargin = 0; - break; - case BIKESHED: - bikeshed_opt = true; - break; - case CANCEL_LABEL: - conf->button.cancel_label = optarg; - break; - case CLEAR_DIALOG: - conf->clear = true; - break; - case CLEAR_SCREEN: - mandatory_dialog = false; - clear_screen_opt = true; - break; - case COLORS: - conf->text.highlight = true; - break; - case COLUMNS_PER_ROW: - conf->text.cols_per_row = - (u_int)strtoul(optarg, NULL, 10); - break; - case CR_WRAP: - cr_wrap_opt = true; - break; - case DATE_FORMAT: - date_fmt_opt = optarg; - break; - case DEFAULT_BUTTON: - conf->button.default_label = optarg; - break; - case DEFAULT_ITEM: - item_default_opt = optarg; - break; - case DEFAULT_NO: - conf->button.default_cancel = true; - break; - case DISABLE_ESC: - conf->key.enable_esc = false; - break; - case ESC_RETURNCANCEL: - esc_return_cancel_opt = true; - break; - case EXIT_LABEL: - conf->button.ok_label = optarg; - break; - case EXTRA_BUTTON: - conf->button.with_extra = true; - break; - case EXTRA_LABEL: - conf->button.extra_label = optarg; - break; - case GENERIC_BUTTON1: - conf->button.generic1_label = optarg; - break; - case GENERIC_BUTTON2: - conf->button.generic2_label = optarg; - break; - case HELP_BUTTON: - conf->button.with_help = true; - break; - case HELP_LABEL: - conf->button.help_label = optarg; - break; - case HELP_PRINT_NAME: - item_help_print_name_opt = true; - break; - case HELP_STATUS: - list_items_on_opt = true; - break; - case HFILE: - conf->key.f1_file = optarg; - break; - case HLINE: - if (optarg[0] != '\0') - conf->bottomtitle = optarg; - break; - case HMSG: - conf->key.f1_message = optarg; - break; - case IGNORE: - ignore_opt = true; - break; - case INSECURE: - conf->form.securech = '*'; - break; - case ITEM_BOTTOM_DESC: - item_bottomdesc_opt = true; - break; - case ITEM_DEPTH: - item_depth_opt = true; - break; - case ITEM_PREFIX: - item_prefix_opt = true; - break; - case LOAD_THEME: - loadthemefile = optarg; - break; - case MAX_INPUT: - max_input_form_opt = (u_int)strtoul(optarg, NULL, 10); - break; - case NO_CANCEL: - conf->button.without_cancel = true; - break; - case NO_DESCRIPTIONS: - conf->menu.no_desc = true; - break; - case NO_LINES: - conf->no_lines = true; - break; - case NO_NAMES: - conf->menu.no_name = true; - break; - case NO_OK: - conf->button.without_ok = true; - break; - case NO_SHADOW: - conf->shadow = false; - break; - case NORMAL_SCREEN: - screen_mode_opt = "rmcup"; - break; - case OK_LABEL: - conf->button.ok_label = optarg; - break; - case OUTPUT_FD: - output_fd_opt = (int)strtol(optarg, NULL, 10); - break; - case OUTPUT_SEPARATOR: - item_output_sep_opt = optarg; - break; - case QUOTED: - item_always_quote_opt = true; - break; - case PRINT_MAXSIZE: - mandatory_dialog = false; - ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); - dprintf(output_fd_opt, "MaxSize: %d, %d\n", - ws.ws_row, ws.ws_col); - break; - case PRINT_SIZE: - conf->get_height = &getH_opt; - conf->get_width = &getW_opt; - break; - case PRINT_VERSION: - mandatory_dialog = false; - dprintf(output_fd_opt, "Version: %s\n", - LIBBSDDIALOG_VERSION); - break; - case SAVE_THEME: - mandatory_dialog = false; - savethemefile = optarg; - break; - case SEPARATE_OUTPUT: - item_output_sepnl_opt = true; - break; - case SHADOW: - conf->shadow = true; - break; - case SINGLE_QUOTED: - item_singlequote_opt = true; - break; - case SLEEP: - conf->sleep = (u_int)strtoul(optarg, NULL, 10); - break; - case STDERR: - output_fd_opt = STDERR_FILENO; - break; - case STDOUT: - output_fd_opt = STDOUT_FILENO; - break; - case SWITCH_BUTTONS: - conf->button.always_active = false; - break; - case TAB_ESCAPE: - tab_escape_opt = true; - break; - case TAB_LEN: - conf->text.tablen = (u_int)strtoul(optarg, NULL, 10); - break; - case TEXT_UNCHANGED: - text_unchanged_opt = true; - break; - case THEME: - if (strcasecmp(optarg, "bsddialog") == 0) - theme_opt = BSDDIALOG_THEME_BSDDIALOG; - else if (strcasecmp(optarg, "blackwhite") == 0) - theme_opt = BSDDIALOG_THEME_BLACKWHITE; - else if (strcasecmp(optarg, "flat") == 0) - theme_opt = BSDDIALOG_THEME_FLAT; - else if (strcasecmp(optarg, "dialog") == 0) - theme_opt = BSDDIALOG_THEME_DIALOG; - else - exit_error("--theme: <unknown> theme", false); - break; - case TIME_FORMAT: - time_fmt_opt = optarg; - break; - case TITLE: - conf->title = optarg; - break; - /* Dialogs */ - case CALENDAR: - if (dialogbuilder != NULL) - exit_error("unexpected --calendar", true); - dialogbuilder = calendar_builder; - break; - case CHECKLIST: - if (dialogbuilder != NULL) - exit_error("unexpected --checklist", true); - dialogbuilder = checklist_builder; - conf->auto_downmargin = 1; - break; - case DATEBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --datebox", true); - dialogbuilder = datebox_builder; - break; - case FORM: - if (dialogbuilder != NULL) - exit_error("unexpected --form", true); - dialogbuilder = form_builder; - conf->auto_downmargin = 1; - break; - case GAUGE: - if (dialogbuilder != NULL) - exit_error("unexpected --gauge", true); - dialogbuilder = gauge_builder; - break; - case INFOBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --infobox", true); - dialogbuilder = infobox_builder; - break; - case INPUTBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --inputbox", true); - dialogbuilder = inputbox_builder; - conf->auto_downmargin = 1; - break; - case MENU: - if (dialogbuilder != NULL) - exit_error("unexpected --menu", true); - dialogbuilder = menu_builder; - conf->auto_downmargin = 1; - break; - case MIXEDFORM: - if (dialogbuilder != NULL) - exit_error("unexpected --mixedform", true); - dialogbuilder = mixedform_builder; - conf->auto_downmargin = 1; - break; - case MIXEDGAUGE: - if (dialogbuilder != NULL) - exit_error("unexpected --mixedgauge", true); - dialogbuilder = mixedgauge_builder; - break; - case MSGBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --msgbox", true); - dialogbuilder = msgbox_builder; - break; - case PAUSE: - if (dialogbuilder != NULL) - exit_error("unexpected --pause", true); - dialogbuilder = pause_builder; - break; - case PASSWORDBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --passwordbox", true); - dialogbuilder = passwordbox_builder; - conf->auto_downmargin = 1; - break; - case PASSWORDFORM: - if (dialogbuilder != NULL) - exit_error("unexpected --passwordform", true); - dialogbuilder = passwordform_builder; - conf->auto_downmargin = 1; - break; - case RADIOLIST: - if (dialogbuilder != NULL) - exit_error("unexpected --radiolist", true); - dialogbuilder = radiolist_builder; - conf->auto_downmargin = 1; - break; - case RANGEBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --rangebox", true); - dialogbuilder = rangebox_builder; - break; - case TEXTBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --textbox", true); - dialogbuilder = textbox_builder; - break; - case TIMEBOX: - if (dialogbuilder != NULL) - exit_error("unexpected --timebox", true); - dialogbuilder = timebox_builder; - break; - case TREEVIEW: - if (dialogbuilder != NULL) - exit_error("unexpected --treeview", true); - dialogbuilder = treeview_builder; - conf->auto_downmargin = 1; - break; - case YESNO: - if (dialogbuilder != NULL) - exit_error("unexpected --yesno", true); - dialogbuilder = yesno_builder; - break; - default: /* Error */ - if (ignore_opt == true) - break; - exit_error("--ignore to continue", true); - } - } - - return (parsed); -} - -int main(int argc, char *argv[argc]) -{ - int i, rows, cols, retval, parsed, nargc, firstoptind; - char *text, **nargv, *pn; - struct bsddialog_conf conf; - - setlocale(LC_ALL, ""); - - in_bsddialog_mode = false; - mandatory_dialog = true; - firstoptind = optind; - pn = argv[0]; - retval = BSDDIALOG_OK; - - for (i = 0; i < argc; i++) { - if (strcmp(argv[i], "--version") == 0) { - printf("Version: %s\n", LIBBSDDIALOG_VERSION); - return (BSDDIALOG_OK); - } - if (strcmp(argv[i], "--help") == 0) { - usage(); - return (BSDDIALOG_OK); - } - } - - while (true) { - parsed = parseargs(argc, argv, &conf); - nargc = argc - parsed; - nargv = argv + parsed; - argc = parsed - optind; - argv += optind; - - if (mandatory_dialog && dialogbuilder == NULL) - exit_error("expected a --<dialog>", true); - - if (dialogbuilder == NULL && argc > 0) - error_args("(no --<dialog>)", argc, argv); - - /* --print-maxsize or --print-version */ - if (mandatory_dialog == false && savethemefile == NULL && - clear_screen_opt == false) - return (BSDDIALOG_OK); - - /* --<dialog>, --save-theme or clear-screen */ - if (dialogbuilder != NULL) { - if (argc < 3) - exit_error("expected <text> <rows> <cols>", - true); - if ((text = strdup(argv[0])) == NULL) - exit_error("cannot allocate text", false); - if (dialogbuilder != textbox_builder) - custom_text(argv[0], text); - rows = (int)strtol(argv[1], NULL, 10); - cols = (int)strtol(argv[2], NULL, 10); - argc -= 3; - argv += 3; - } - - /* bsddialog terminal mode (first iteration) */ - start_bsddialog_mode(); - - if (screen_mode_opt != NULL) { - screen_mode_opt = tigetstr(screen_mode_opt); - if (screen_mode_opt != NULL && - screen_mode_opt != (char*)-1) { - tputs(screen_mode_opt, 1, putchar); - fflush(stdout); - /* only to refresh, useless in the library */ - bsddialog_clearterminal(); - } - } - - /* theme */ - if (theme_opt >= 0) - bsddialog_set_default_theme(theme_opt); - if (loadthemefile != NULL) - loadtheme(loadthemefile); - if (bikeshed_opt) - bikeshed(&conf); - if (savethemefile != NULL) - savetheme(savethemefile, LIBBSDDIALOG_VERSION); - - /* backtitle and dialog */ - if (dialogbuilder == NULL) - break; - if (backtitle_opt != NULL) - if(bsddialog_backtitle(&conf, backtitle_opt)) - exit_error(bsddialog_geterror(), false); - retval = dialogbuilder(&conf, text, rows, cols, argc, argv); - free(text); - if (retval == BSDDIALOG_ERROR) - exit_error(bsddialog_geterror(), false); - if (retval == BSDDIALOG_ESC && esc_return_cancel_opt) - retval = BSDDIALOG_CANCEL; - if (conf.get_height != NULL && conf.get_width != NULL) - dprintf(output_fd_opt, "DialogSize: %d, %d\n", - *conf.get_height, *conf.get_width); - if (clear_screen_opt) - bsddialog_clearterminal(); - clear_screen_opt = false; - /* --and-dialog ends loop with Cancel or ESC */ - if (retval == BSDDIALOG_CANCEL || retval == BSDDIALOG_ESC) - break; - argc = nargc; - argv = nargv; - if (argc <= 0) - break; - /* prepare next parseargs() call */ - argc++; - argv--; - argv[0] = pn; - optind = firstoptind; - } - - if (in_bsddialog_mode) { - /* --clear-screen can be a single option */ - if (clear_screen_opt) - bsddialog_clearterminal(); - bsddialog_end(); - } - /* end bsddialog terminal mode */ - - return (retval); -} - -void custom_text(char *text, char *buf) -{ - bool trim, crwrap; - int i, j; - - if (strstr(text, "\\n") == NULL) { - /* "hasnl" mode */ - trim = true; - crwrap = true; - } else { - trim = false; - crwrap = cr_wrap_opt; - } - if (text_unchanged_opt) { - trim = false; - crwrap = true; - } - - i = j = 0; - while (text[i] != '\0') { - switch (text[i]) { - case '\\': - buf[j] = '\\'; - switch (text[i+1]) { - case 'n': /* implicitly in "hasnl" mode */ - buf[j] = '\n'; - i++; - if (text[i+1] == '\n') - i++; - break; - case 't': - if (tab_escape_opt) { - buf[j] = '\t'; - } else { - j++; - buf[j] = 't'; - } - i++; - break; - } - break; - case '\n': - buf[j] = crwrap ? '\n' : ' '; - break; - case '\t': - buf[j] = text_unchanged_opt ? '\t' : ' '; - break; - default: - buf[j] = text[i]; - } - i++; - if (!trim || buf[j] != ' ' || j == 0 || buf[j-1] != ' ') - j++; - } - buf[j] = '\0'; -} - -/* Dialogs */ -int gauge_builder(BUILDER_ARGS) -{ - int output; - unsigned int perc; - - perc = 0; - if (argc == 1) { - perc = (u_int)strtoul(argv[0], NULL, 10); - perc = perc > 100 ? 100 : perc; - } else if (argc > 1) { - error_args("--gauge", argc - 1, argv + 1); - } - - output = bsddialog_gauge(conf, text, rows, cols, perc, STDIN_FILENO, - "XXX"); - - return (output); -} - -int infobox_builder(BUILDER_ARGS) -{ - if (argc > 0) - error_args("--infobox", argc, argv); - - return (bsddialog_infobox(conf, text, rows, cols)); -} - -int mixedgauge_builder(BUILDER_ARGS) -{ - int output, *minipercs; - unsigned int i, mainperc, nminibars; - const char **minilabels; - - if (argc < 1 || (((argc-1) % 2) != 0) ) - exit_error("bad --mixedgauge arguments", true); - - mainperc = (u_int)strtoul(argv[0], NULL, 10); - mainperc = mainperc > 100 ? 100 : mainperc; - argc--; - argv++; - - nminibars = argc / 2; - if ((minilabels = calloc(nminibars, sizeof(char*))) == NULL) - exit_error("Cannot allocate memory for minilabels", false); - if ((minipercs = calloc(nminibars, sizeof(int))) == NULL) - exit_error("Cannot allocate memory for minipercs", false); - - for (i = 0; i < nminibars; i++) { - minilabels[i] = argv[i * 2]; - minipercs[i] = (int)strtol(argv[i * 2 + 1], NULL, 10); - } - - output = bsddialog_mixedgauge(conf, text, rows, cols, mainperc, - nminibars, minilabels, minipercs); - - return (output); -} - -int msgbox_builder(BUILDER_ARGS) -{ - if (argc > 0) - error_args("--msgbox", argc, argv); - - return (bsddialog_msgbox(conf, text, rows, cols)); -} - -int pause_builder(BUILDER_ARGS) -{ - int output; - unsigned int secs; - - if (argc == 0) - exit_error("--pause missing <seconds>", true); - if (argc > 1) - error_args("--pause", argc - 1, argv + 1); - - secs = (u_int)strtoul(argv[0], NULL, 10); - output = bsddialog_pause(conf, text, rows, cols, secs); - - return (output); -} - -int rangebox_builder(BUILDER_ARGS) -{ - int output, min, max, value; - - if (argc < 2) - exit_error("--rangebox missing <min> <max> [<init>]", true); - if (argc > 3) - error_args("--rangebox", argc - 3, argv + 3); - - min = (int)strtol(argv[0], NULL, 10); - max = (int)strtol(argv[1], NULL, 10); - - if (argc == 3) { - value = (int)strtol(argv[2], NULL, 10); - value = value < min ? min : value; - value = value > max ? max : value; - } else - value = min; - - output = bsddialog_rangebox(conf, text, rows, cols, min, max, &value); - dprintf(output_fd_opt, "%d", value); - - return (output); -} - -int textbox_builder(BUILDER_ARGS) -{ - if (argc > 0) - error_args("--textbox", argc, argv); - - return (bsddialog_textbox(conf, text, rows, cols)); -} - -int yesno_builder(BUILDER_ARGS) -{ - if (argc > 0) - error_args("--yesno", argc, argv); - - return (bsddialog_yesno(conf, text, rows, cols)); -} - -/* CALENDAR, DATE and TIME */ -static int date(BUILDER_ARGS, bool is_datebox) -{ - int ret; - unsigned int yy, mm, dd; - time_t cal; - struct tm *localtm; - char stringdate[1024]; - const char *name; - - name = is_datebox ? "--datebox" : "--calendar"; - time(&cal); - localtm = localtime(&cal); - yy = localtm->tm_year + 1900; - mm = localtm->tm_mon + 1; - dd = localtm->tm_mday; - - if (argc > 3) { - error_args(name, argc - 3, argv + 3); - } else if (argc == 3) { - dd = (u_int)strtoul(argv[0], NULL, 10); - mm = (u_int)strtoul(argv[1], NULL, 10); - yy = (u_int)strtoul(argv[2], NULL, 10); - if (yy < 1900) - yy = 1900; - /* max yy check is in lib */ - } - - if (is_datebox) - ret = bsddialog_datebox(conf, text, rows, cols, &yy, &mm, &dd); - else - ret = bsddialog_calendar(conf, text, rows, cols, &yy, &mm, &dd); - if (ret != BSDDIALOG_OK) - return (ret); - - if (date_fmt_opt != NULL) { - time(&cal); - localtm = localtime(&cal); - localtm->tm_year = yy - 1900; - localtm->tm_mon = mm - 1; - localtm->tm_mday = dd; - strftime(stringdate, 1024, date_fmt_opt, localtm); - dprintf(output_fd_opt, "%s", stringdate); - } else if (bikeshed_opt && (dd % 2 == 0)) { - dprintf(output_fd_opt, "%u/%u/%u", dd, mm, yy); - } else { - dprintf(output_fd_opt, "%02u/%02u/%u", dd, mm, yy); - } - - return (ret); -} - -int calendar_builder(BUILDER_ARGS) -{ - if (rows == 2) { - /* - * (bsdconfig/share/dialog.subr:1352) f_dialog_calendar_size() - * computes height 2 for `dialog --calendar' in - * (bsdconfig/usermgmt/share/user_input.subr:517) - * f_dialog_input_expire_password() and - * (bsdconfig/usermgmt/share/user_input.subr:660) - * f_dialog_input_expire_account(). - * Use height auto-sizing that is min height like dialog, - * documented in bsddialog(1). - */ - rows = 0; - } - - return (date(conf, text, rows, cols, argc, argv, false)); -} - -int datebox_builder(BUILDER_ARGS) -{ - return (date(conf, text, rows, cols, argc, argv, true)); -} - -int timebox_builder(BUILDER_ARGS) -{ - int output; - unsigned int hh, mm, ss; - time_t clock; - struct tm *localtm; - char stringtime[1024]; - - time(&clock); - localtm = localtime(&clock); - hh = localtm->tm_hour; - mm = localtm->tm_min; - ss = localtm->tm_sec; - - if (argc > 3) { - error_args("--timebox", argc - 3, argv + 3); - } else if (argc == 3) { - hh = (u_int)strtoul(argv[0], NULL, 10); - mm = (u_int)strtoul(argv[1], NULL, 10); - ss = (u_int)strtoul(argv[2], NULL, 10); - } - - output = bsddialog_timebox(conf, text, rows, cols, &hh, &mm, &ss); - if (output != BSDDIALOG_OK) - return (output); - - if (time_fmt_opt != NULL) { - time(&clock); - localtm = localtime(&clock); - localtm->tm_hour = hh; - localtm->tm_min = mm; - localtm->tm_sec = ss; - strftime(stringtime, 1024, time_fmt_opt, localtm); - dprintf(output_fd_opt, "%s", stringtime); - } else if (bikeshed_opt && (ss % 2 == 0)) { - dprintf(output_fd_opt, "%u:%u:%u", hh, mm, ss); - } else { - dprintf(output_fd_opt, "%02u:%02u:%02u", hh, mm, ss); - } - - return (output); -} - -/* MENU */ -static void -get_menu_items(int argc, char **argv, bool setprefix, bool setdepth, - bool setname, bool setdesc, bool setstatus, bool sethelp, - unsigned int *nitems, struct bsddialog_menuitem **items, int *focusitem) -{ - unsigned int i, j, sizeitem; - - *focusitem = -1; - - sizeitem = 0; - sizeitem += setprefix ? 1 : 0; - sizeitem += setdepth ? 1 : 0; - sizeitem += setname ? 1 : 0; - sizeitem += setdesc ? 1 : 0; - sizeitem += setstatus ? 1 : 0; - sizeitem += sethelp ? 1 : 0; - if ((argc % sizeitem) != 0) - exit_error("\"menu\" bad arguments items number", true); - - *nitems = argc / sizeitem; - - *items = calloc(*nitems, sizeof(struct bsddialog_menuitem)); - if (items == NULL) - exit_error("cannot allocate memory \"menu\" items", false); - - j = 0; - for (i = 0; i < *nitems; i++) { - (*items)[i].prefix = setprefix ? argv[j++] : ""; - (*items)[i].depth = setdepth ? - (u_int)strtoul(argv[j++], NULL, 0) : 0; - (*items)[i].name = setname ? argv[j++] : ""; - (*items)[i].desc = setdesc ? argv[j++] : ""; - if (setstatus) - (*items)[i].on = strcmp(argv[j++], "on") == 0 ? - true : false; - else - (*items)[i].on = false; - (*items)[i].bottomdesc = sethelp ? argv[j++] : ""; - - if (item_default_opt != NULL && *focusitem == -1) - if (strcmp((*items)[i].name, item_default_opt) == 0) - *focusitem = i; - } -} - -static void -print_menu_items(int output, int nitems, struct bsddialog_menuitem *items, - int focusitem, bool ismenu) -{ - bool sep, sepfirst, seplast, toquote; - int i; - char quotech; - const char *focusname, *sepstr; - - sep = false; - quotech = item_singlequote_opt ? '\'' : '"'; - - if (output == BSDDIALOG_ERROR || output == BSDDIALOG_CANCEL || - output == BSDDIALOG_ESC) - return; - - if (output == BSDDIALOG_HELP) { - dprintf(output_fd_opt, "HELP "); - - if (focusitem >= 0) { - focusname = items[focusitem].name; - if (item_bottomdesc_opt && - item_help_print_name_opt == false) - focusname = items[focusitem].bottomdesc; - - toquote = false; - if (strchr(focusname, ' ') != NULL) { - toquote = item_always_quote_opt; - if (ismenu == false && - item_output_sepnl_opt == false) - toquote = true; - } - if (toquote) { - dprintf(output_fd_opt, "%c%s%c", - quotech, focusname, quotech); - } else - dprintf(output_fd_opt, "%s", focusname); - } - - if (ismenu || list_items_on_opt == false) - return; - sep = true; - } - - sepfirst = false; - if ((sepstr = item_output_sep_opt) == NULL) - sepstr = item_output_sepnl_opt ? "\n" : " "; - else - sepfirst = true; - - seplast = false; - if (item_output_sepnl_opt) { - sepfirst = false; - seplast = true; - } - - for (i = 0; i < nitems; i++) { - if (items[i].on == false) - continue; - - if (sep || sepfirst) - dprintf(output_fd_opt, "%s", sepstr); - sep = false; - - toquote = false; - if (strchr(items[i].name, ' ') != NULL) { - toquote = item_always_quote_opt; - if (ismenu == false && item_output_sepnl_opt == false) - toquote = true; - } - if (toquote) - dprintf(output_fd_opt, "%c%s%c", - quotech, items[i].name, quotech); - else - dprintf(output_fd_opt, "%s", items[i].name); - - if (seplast) - dprintf(output_fd_opt, "%s", sepstr); - } -} - -int checklist_builder(BUILDER_ARGS) -{ - int output, focusitem; - unsigned int menurows, nitems; - struct bsddialog_menuitem *items; - - if (argc < 1) - exit_error("--checklist missing <menurows>", true); - menurows = (u_int)strtoul(argv[0], NULL, 10); - - get_menu_items(argc-1, argv+1, item_prefix_opt, item_depth_opt, true, - true, true, item_bottomdesc_opt, &nitems, &items, &focusitem); - - output = bsddialog_checklist(conf, text, rows, cols, menurows, nitems, - items, &focusitem); - - print_menu_items(output, nitems, items, focusitem, false); - - free(items); - - return (output); -} - -int menu_builder(BUILDER_ARGS) -{ - int output, focusitem; - unsigned int menurows, nitems; - struct bsddialog_menuitem *items; - - if (argc < 1) - exit_error("--menu missing <menurows>", true); - menurows = (u_int)strtoul(argv[0], NULL, 10); - - get_menu_items(argc-1, argv+1, item_prefix_opt, item_depth_opt, true, - true, false, item_bottomdesc_opt, &nitems, &items, &focusitem); - - output = bsddialog_menu(conf, text, rows, cols, menurows, nitems, - items, &focusitem); - - print_menu_items(output, nitems, items, focusitem, true); - - free(items); - - return (output); -} - -int radiolist_builder(BUILDER_ARGS) -{ - int output, focusitem; - unsigned int menurows, nitems; - struct bsddialog_menuitem *items; - - if (argc < 1) - exit_error("--radiolist missing <menurows>", true); - menurows = (u_int)strtoul(argv[0], NULL, 10); - - get_menu_items(argc-1, argv+1, item_prefix_opt, item_depth_opt, true, - true, true, item_bottomdesc_opt, &nitems, &items, &focusitem); - - output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems, - items, &focusitem); - - print_menu_items(output, nitems, items, focusitem, false); - - free(items); - - return (output); -} - -int treeview_builder(BUILDER_ARGS) -{ - int output, focusitem; - unsigned int menurows, nitems; - struct bsddialog_menuitem *items; - - if (argc < 1) - exit_error("--treeview missing <menurows>", true); - menurows = (u_int)strtoul(argv[0], NULL, 10); - - get_menu_items(argc-1, argv+1, item_prefix_opt, true, true, true, true, - item_bottomdesc_opt, &nitems, &items, &focusitem); - - conf->menu.no_name = true; - conf->menu.align_left = true; - - output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems, - items, &focusitem); - - print_menu_items(output, nitems, items, focusitem, false); - - free(items); - - return (output); -} - -/* FORM */ -static void -print_form_items(int output, int nitems, struct bsddialog_formitem *items) -{ - int i; - - if (output == BSDDIALOG_ERROR) - return; - - for (i = 0; i < nitems; i++) { - dprintf(output_fd_opt, "%s\n", items[i].value); - free(items[i].value); - } -} - -int form_builder(BUILDER_ARGS) -{ - int output, fieldlen, valuelen; - unsigned int i, j, flags, formheight, nitems, sizeitem; - struct bsddialog_formitem *items; - - if (argc < 1) - exit_error("--form missing <formheight>", true); - formheight = (u_int)strtoul(argv[0], NULL, 10); - - argc--; - argv++; - sizeitem = item_bottomdesc_opt ? 9 : 8; - if (argc % sizeitem != 0) - exit_error("--form bad number of arguments items", true); - - nitems = argc / sizeitem; - if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) - exit_error("cannot allocate memory for form items", false); - j = 0; - for (i = 0; i < nitems; i++) { - items[i].label = argv[j++]; - items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); - items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); - items[i].init = argv[j++]; - items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); - items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); - - fieldlen = (int)strtol(argv[j++], NULL, 10); - items[i].fieldlen = abs(fieldlen); - - valuelen = (int)strtol(argv[j++], NULL, 10); - items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen; - - flags = (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0); - items[i].flags = flags; - - items[i].bottomdesc = item_bottomdesc_opt ? argv[j++] : ""; - } - - output = bsddialog_form(conf, text, rows, cols, formheight, nitems, - items); - print_form_items(output, nitems, items); - free(items); - - return (output); -} - -int inputbox_builder(BUILDER_ARGS) -{ - int output; - struct bsddialog_formitem item; - - if (argc > 1) - error_args("--inputbox", argc - 1, argv + 1); - - item.label = ""; - item.ylabel = 0; - item.xlabel = 0; - item.init = argc > 0 ? argv[0] : ""; - item.yfield = 0; - item.xfield = 0; - item.fieldlen = 1; - item.maxvaluelen = max_input_form_opt; - item.flags = BSDDIALOG_FIELDNOCOLOR; - item.flags |= BSDDIALOG_FIELDCURSOREND; - item.flags |= BSDDIALOG_FIELDEXTEND; - item.bottomdesc = ""; - - output = bsddialog_form(conf, text, rows, cols, 1, 1, &item); - print_form_items(output, 1, &item); - - return (output); -} - -int mixedform_builder(BUILDER_ARGS) -{ - int output; - unsigned int i, j, formheight, nitems, sizeitem; - struct bsddialog_formitem *items; - - if (argc < 1) - exit_error("--mixedform missing <formheight>", true); - formheight = (u_int)strtoul(argv[0], NULL, 10); - - argc--; - argv++; - sizeitem = item_bottomdesc_opt ? 10 : 9; - if (argc % sizeitem != 0) - exit_error("--mixedform bad number of arguments items", true); - - nitems = argc / sizeitem; - if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) - exit_error("cannot allocate memory for form items", false); - j = 0; - for (i = 0; i < nitems; i++) { - items[i].label = argv[j++]; - items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); - items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); - items[i].init = argv[j++]; - items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); - items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); - items[i].fieldlen = (u_int)strtoul(argv[j++], NULL, 10); - items[i].maxvaluelen = (u_int)strtoul(argv[j++], NULL, 10); - items[i].flags = (u_int)strtoul(argv[j++], NULL, 10); - items[i].bottomdesc = item_bottomdesc_opt ? argv[j++] : ""; - } - - output = bsddialog_form(conf, text, rows, cols, formheight, nitems, - items); - print_form_items(output, nitems, items); - free(items); - - return (output); -} - -int passwordbox_builder(BUILDER_ARGS) -{ - int output; - struct bsddialog_formitem item; - - if (argc > 1) - error_args("--passwordbox", argc - 1, argv + 1); - - item.label = ""; - item.ylabel = 0; - item.xlabel = 0; - item.init = argc > 0 ? argv[0] : ""; - item.yfield = 0; - item.xfield = 0; - item.fieldlen = 1; - item.maxvaluelen = max_input_form_opt; - item.flags = BSDDIALOG_FIELDHIDDEN; - item.flags |= BSDDIALOG_FIELDNOCOLOR; - item.flags |= BSDDIALOG_FIELDCURSOREND; - item.flags |= BSDDIALOG_FIELDEXTEND; - item.bottomdesc = ""; - - output = bsddialog_form(conf, text, rows, cols, 1, 1, &item); - print_form_items(output, 1, &item); - - return (output); -} - -int passwordform_builder(BUILDER_ARGS) -{ - int output, fieldlen, valuelen; - unsigned int i, j, flags, formheight, nitems, sizeitem; - struct bsddialog_formitem *items; - - if (argc < 1) - exit_error("--passwordform missing <formheight>", true); - formheight = (u_int)strtoul(argv[0], NULL, 10); - - argc--; - argv++; - sizeitem = item_bottomdesc_opt ? 9 : 8; - if (argc % sizeitem != 0) - exit_error("--passwordform bad arguments items number", true); - - flags = BSDDIALOG_FIELDHIDDEN; - nitems = argc / sizeitem; - if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL) - exit_error("cannot allocate memory for form items", false); - j = 0; - for (i = 0; i < nitems; i++) { - items[i].label = argv[j++]; - items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10); - items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10); - items[i].init = argv[j++]; - items[i].yfield = (u_int)strtoul(argv[j++], NULL, 10); - items[i].xfield = (u_int)strtoul(argv[j++], NULL, 10); - - fieldlen = (int)strtol(argv[j++], NULL, 10); - items[i].fieldlen = abs(fieldlen); - - valuelen = (int)strtol(argv[j++], NULL, 10); - items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen; - - flags |= (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0); - items[i].flags = flags; - - items[i].bottomdesc = item_bottomdesc_opt ? argv[j++] : ""; - } - - output = bsddialog_form(conf, text, rows, cols, formheight, nitems, - items); - print_form_items(output, nitems, items); - free(items); - - return (output); -} |