14c8945a0SNathan Whitehorn /* 2682c9e0fSNathan Whitehorn * $Id: dialog.c,v 1.193 2011/06/29 09:10:56 tom Exp $ 34c8945a0SNathan Whitehorn * 44c8945a0SNathan Whitehorn * cdialog - Display simple dialog boxes from shell scripts 54c8945a0SNathan Whitehorn * 67a1c0d96SNathan Whitehorn * Copyright 2000-2010,2011 Thomas E. Dickey 74c8945a0SNathan Whitehorn * 84c8945a0SNathan Whitehorn * This program is free software; you can redistribute it and/or modify 94c8945a0SNathan Whitehorn * it under the terms of the GNU Lesser General Public License, version 2.1 104c8945a0SNathan Whitehorn * as published by the Free Software Foundation. 114c8945a0SNathan Whitehorn * 124c8945a0SNathan Whitehorn * This program is distributed in the hope that it will be useful, but 134c8945a0SNathan Whitehorn * WITHOUT ANY WARRANTY; without even the implied warranty of 144c8945a0SNathan Whitehorn * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 154c8945a0SNathan Whitehorn * Lesser General Public License for more details. 164c8945a0SNathan Whitehorn * 174c8945a0SNathan Whitehorn * You should have received a copy of the GNU Lesser General Public 184c8945a0SNathan Whitehorn * License along with this program; if not, write to 194c8945a0SNathan Whitehorn * Free Software Foundation, Inc. 204c8945a0SNathan Whitehorn * 51 Franklin St., Fifth Floor 214c8945a0SNathan Whitehorn * Boston, MA 02110, USA. 224c8945a0SNathan Whitehorn * 234c8945a0SNathan Whitehorn * An earlier version of this program lists as authors 244c8945a0SNathan Whitehorn * Savio Lam (lam836@cs.cuhk.hk) 254c8945a0SNathan Whitehorn */ 264c8945a0SNathan Whitehorn 274c8945a0SNathan Whitehorn #include <dialog.h> 284c8945a0SNathan Whitehorn #include <string.h> 294c8945a0SNathan Whitehorn #include <sys/types.h> 304c8945a0SNathan Whitehorn #include <sys/stat.h> 314c8945a0SNathan Whitehorn 324c8945a0SNathan Whitehorn #ifdef HAVE_SETLOCALE 334c8945a0SNathan Whitehorn #include <locale.h> 344c8945a0SNathan Whitehorn #endif 354c8945a0SNathan Whitehorn 364c8945a0SNathan Whitehorn #define PASSARGS t, av, offset_add 374c8945a0SNathan Whitehorn #define CALLARGS const char *t, char *av[], int *offset_add 384c8945a0SNathan Whitehorn typedef int (callerFn) (CALLARGS); 394c8945a0SNathan Whitehorn 404c8945a0SNathan Whitehorn typedef enum { 414c8945a0SNathan Whitehorn o_unknown = 0 424c8945a0SNathan Whitehorn ,o_allow_close 434c8945a0SNathan Whitehorn ,o_and_widget 444c8945a0SNathan Whitehorn ,o_ascii_lines 454c8945a0SNathan Whitehorn ,o_aspect 464c8945a0SNathan Whitehorn ,o_auto_placement 474c8945a0SNathan Whitehorn ,o_backtitle 484c8945a0SNathan Whitehorn ,o_beep 494c8945a0SNathan Whitehorn ,o_beep_after 504c8945a0SNathan Whitehorn ,o_begin 514c8945a0SNathan Whitehorn ,o_calendar 524c8945a0SNathan Whitehorn ,o_cancel_label 534c8945a0SNathan Whitehorn ,o_checklist 544c8945a0SNathan Whitehorn ,o_clear 554c8945a0SNathan Whitehorn ,o_colors 564c8945a0SNathan Whitehorn ,o_column_separator 574c8945a0SNathan Whitehorn ,o_cr_wrap 584c8945a0SNathan Whitehorn ,o_create_rc 594c8945a0SNathan Whitehorn ,o_date_format 604c8945a0SNathan Whitehorn ,o_default_item 614c8945a0SNathan Whitehorn ,o_defaultno 624c8945a0SNathan Whitehorn ,o_dselect 634c8945a0SNathan Whitehorn ,o_editbox 644c8945a0SNathan Whitehorn ,o_exit_label 654c8945a0SNathan Whitehorn ,o_extra_button 664c8945a0SNathan Whitehorn ,o_extra_label 674c8945a0SNathan Whitehorn ,o_fixed_font 684c8945a0SNathan Whitehorn ,o_form 694c8945a0SNathan Whitehorn ,o_fselect 704c8945a0SNathan Whitehorn ,o_fullbutton 714c8945a0SNathan Whitehorn ,o_gauge 724c8945a0SNathan Whitehorn ,o_help 734c8945a0SNathan Whitehorn ,o_help_button 74682c9e0fSNathan Whitehorn ,o_help_file 754c8945a0SNathan Whitehorn ,o_help_label 76682c9e0fSNathan Whitehorn ,o_help_line 774c8945a0SNathan Whitehorn ,o_help_status 784c8945a0SNathan Whitehorn ,o_icon 794c8945a0SNathan Whitehorn ,o_ignore 804c8945a0SNathan Whitehorn ,o_infobox 814c8945a0SNathan Whitehorn ,o_input_fd 824c8945a0SNathan Whitehorn ,o_inputbox 834c8945a0SNathan Whitehorn ,o_inputmenu 844c8945a0SNathan Whitehorn ,o_insecure 854c8945a0SNathan Whitehorn ,o_item_help 864c8945a0SNathan Whitehorn ,o_keep_colors 874c8945a0SNathan Whitehorn ,o_keep_tite 884c8945a0SNathan Whitehorn ,o_keep_window 894c8945a0SNathan Whitehorn ,o_max_input 904c8945a0SNathan Whitehorn ,o_menu 914c8945a0SNathan Whitehorn ,o_mixedform 924c8945a0SNathan Whitehorn ,o_mixedgauge 934c8945a0SNathan Whitehorn ,o_msgbox 944c8945a0SNathan Whitehorn ,o_no_close 954c8945a0SNathan Whitehorn ,o_no_collapse 964c8945a0SNathan Whitehorn ,o_no_cr_wrap 974c8945a0SNathan Whitehorn ,o_no_kill 984c8945a0SNathan Whitehorn ,o_no_label 994c8945a0SNathan Whitehorn ,o_no_lines 1007a1c0d96SNathan Whitehorn ,o_no_mouse 101682c9e0fSNathan Whitehorn ,o_no_nl_expand 1024c8945a0SNathan Whitehorn ,o_no_shadow 1034c8945a0SNathan Whitehorn ,o_nocancel 1044c8945a0SNathan Whitehorn ,o_noitem 1054c8945a0SNathan Whitehorn ,o_nook 1064c8945a0SNathan Whitehorn ,o_ok_label 1074c8945a0SNathan Whitehorn ,o_output_fd 1084c8945a0SNathan Whitehorn ,o_output_separator 1094c8945a0SNathan Whitehorn ,o_passwordbox 1104c8945a0SNathan Whitehorn ,o_passwordform 1114c8945a0SNathan Whitehorn ,o_pause 1127a1c0d96SNathan Whitehorn ,o_prgbox 1134c8945a0SNathan Whitehorn ,o_print_maxsize 1144c8945a0SNathan Whitehorn ,o_print_size 1154c8945a0SNathan Whitehorn ,o_print_version 1167a1c0d96SNathan Whitehorn ,o_programbox 1174c8945a0SNathan Whitehorn ,o_progressbox 1184c8945a0SNathan Whitehorn ,o_quoted 1194c8945a0SNathan Whitehorn ,o_radiolist 1204c8945a0SNathan Whitehorn ,o_screen_center 1214c8945a0SNathan Whitehorn ,o_scrollbar 1224c8945a0SNathan Whitehorn ,o_separate_output 1234c8945a0SNathan Whitehorn ,o_separate_widget 1244c8945a0SNathan Whitehorn ,o_separator 1254c8945a0SNathan Whitehorn ,o_shadow 1264c8945a0SNathan Whitehorn ,o_single_quoted 1274c8945a0SNathan Whitehorn ,o_size_err 1284c8945a0SNathan Whitehorn ,o_sleep 1294c8945a0SNathan Whitehorn ,o_smooth 1304c8945a0SNathan Whitehorn ,o_stderr 1314c8945a0SNathan Whitehorn ,o_stdout 1324c8945a0SNathan Whitehorn ,o_tab_correct 1334c8945a0SNathan Whitehorn ,o_tab_len 1344c8945a0SNathan Whitehorn ,o_tailbox 1354c8945a0SNathan Whitehorn ,o_tailboxbg 1364c8945a0SNathan Whitehorn ,o_textbox 1374c8945a0SNathan Whitehorn ,o_time_format 1384c8945a0SNathan Whitehorn ,o_timebox 1394c8945a0SNathan Whitehorn ,o_timeout 1404c8945a0SNathan Whitehorn ,o_title 1414c8945a0SNathan Whitehorn ,o_trim 1424c8945a0SNathan Whitehorn ,o_under_mouse 143682c9e0fSNathan Whitehorn ,o_version 1444c8945a0SNathan Whitehorn ,o_visit_items 1454c8945a0SNathan Whitehorn ,o_wmclass 1464c8945a0SNathan Whitehorn ,o_yes_label 1474c8945a0SNathan Whitehorn ,o_yesno 1484c8945a0SNathan Whitehorn #ifdef HAVE_DLG_TRACE 1494c8945a0SNathan Whitehorn ,o_trace 1504c8945a0SNathan Whitehorn #endif 1514c8945a0SNathan Whitehorn } eOptions; 1524c8945a0SNathan Whitehorn 1534c8945a0SNathan Whitehorn /* 1544c8945a0SNathan Whitehorn * The bits in 'pass' are used to decide which options are applicable at 1554c8945a0SNathan Whitehorn * different stages in the program: 1564c8945a0SNathan Whitehorn * 1 flags before widgets 1574c8945a0SNathan Whitehorn * 2 widgets 1584c8945a0SNathan Whitehorn * 4 non-widget options 1594c8945a0SNathan Whitehorn */ 1604c8945a0SNathan Whitehorn typedef struct { 1614c8945a0SNathan Whitehorn const char *name; 1624c8945a0SNathan Whitehorn eOptions code; 1634c8945a0SNathan Whitehorn int pass; /* 1,2,4 or combination */ 1644c8945a0SNathan Whitehorn const char *help; /* NULL to suppress, non-empty to display params */ 1654c8945a0SNathan Whitehorn } Options; 1664c8945a0SNathan Whitehorn 1674c8945a0SNathan Whitehorn typedef struct { 1684c8945a0SNathan Whitehorn eOptions code; 1694c8945a0SNathan Whitehorn int argmin, argmax; 1704c8945a0SNathan Whitehorn callerFn *jumper; 1714c8945a0SNathan Whitehorn } Mode; 1724c8945a0SNathan Whitehorn 1734c8945a0SNathan Whitehorn static bool *dialog_opts; 1744c8945a0SNathan Whitehorn static char **dialog_argv; 1754c8945a0SNathan Whitehorn 1764c8945a0SNathan Whitehorn static bool ignore_unknown = FALSE; 1774c8945a0SNathan Whitehorn 1784c8945a0SNathan Whitehorn static const char *program = "dialog"; 1794c8945a0SNathan Whitehorn 1804c8945a0SNathan Whitehorn /* 1814c8945a0SNathan Whitehorn * The options[] table is organized this way to make it simple to maintain 1824c8945a0SNathan Whitehorn * a sorted list of options for the help-message. 1834c8945a0SNathan Whitehorn */ 1844c8945a0SNathan Whitehorn /* *INDENT-OFF* */ 1854c8945a0SNathan Whitehorn static const Options options[] = { 1864c8945a0SNathan Whitehorn { "allow-close", o_allow_close, 1, NULL }, 1874c8945a0SNathan Whitehorn { "and-widget", o_and_widget, 4, NULL }, 1884c8945a0SNathan Whitehorn { "ascii-lines", o_ascii_lines, 1, "" }, 1894c8945a0SNathan Whitehorn { "aspect", o_aspect, 1, "<ratio>" }, 1904c8945a0SNathan Whitehorn { "auto-placement", o_auto_placement, 1, NULL }, 1914c8945a0SNathan Whitehorn { "backtitle", o_backtitle, 1, "<backtitle>" }, 1924c8945a0SNathan Whitehorn { "beep", o_beep, 1, NULL }, 1934c8945a0SNathan Whitehorn { "beep-after", o_beep_after, 1, NULL }, 1944c8945a0SNathan Whitehorn { "begin", o_begin, 1, "<y> <x>" }, 1954c8945a0SNathan Whitehorn { "calendar", o_calendar, 2, "<text> <height> <width> <day> <month> <year>" }, 1964c8945a0SNathan Whitehorn { "cancel-label", o_cancel_label, 1, "<str>" }, 1974c8945a0SNathan Whitehorn { "checklist", o_checklist, 2, "<text> <height> <width> <list height> <tag1> <item1> <status1>..." }, 1984c8945a0SNathan Whitehorn { "clear", o_clear, 1, "" }, 1994c8945a0SNathan Whitehorn { "colors", o_colors, 1, "" }, 2004c8945a0SNathan Whitehorn { "column-separator",o_column_separator, 1, "<str>" }, 2014c8945a0SNathan Whitehorn { "cr-wrap", o_cr_wrap, 1, "" }, 2024c8945a0SNathan Whitehorn { "create-rc", o_create_rc, 1, NULL }, 2034c8945a0SNathan Whitehorn { "date-format", o_date_format, 1, "<str>" }, 2044c8945a0SNathan Whitehorn { "default-item", o_default_item, 1, "<str>" }, 2054c8945a0SNathan Whitehorn { "defaultno", o_defaultno, 1, "" }, 2064c8945a0SNathan Whitehorn { "dselect", o_dselect, 2, "<directory> <height> <width>" }, 2074c8945a0SNathan Whitehorn { "editbox", o_editbox, 2, "<file> <height> <width>" }, 2084c8945a0SNathan Whitehorn { "exit-label", o_exit_label, 1, "<str>" }, 2094c8945a0SNathan Whitehorn { "extra-button", o_extra_button, 1, "" }, 2104c8945a0SNathan Whitehorn { "extra-label", o_extra_label, 1, "<str>" }, 2114c8945a0SNathan Whitehorn { "fb", o_fullbutton, 1, NULL }, 2124c8945a0SNathan Whitehorn { "fixed-font", o_fixed_font, 1, NULL }, 2134c8945a0SNathan Whitehorn { "form", o_form, 2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>..." }, 2144c8945a0SNathan Whitehorn { "fselect", o_fselect, 2, "<filepath> <height> <width>" }, 2154c8945a0SNathan Whitehorn { "fullbutton", o_fullbutton, 1, NULL }, 2164c8945a0SNathan Whitehorn { "gauge", o_gauge, 2, "<text> <height> <width> [<percent>]" }, 2174c8945a0SNathan Whitehorn { "guage", o_gauge, 2, NULL }, 2184c8945a0SNathan Whitehorn { "help", o_help, 4, "" }, 2194c8945a0SNathan Whitehorn { "help-button", o_help_button, 1, "" }, 2204c8945a0SNathan Whitehorn { "help-label", o_help_label, 1, "<str>" }, 2214c8945a0SNathan Whitehorn { "help-status", o_help_status, 1, "" }, 222682c9e0fSNathan Whitehorn { "hfile", o_help_file, 1, "<str>" }, 223682c9e0fSNathan Whitehorn { "hline", o_help_line, 1, "<str>" }, 2244c8945a0SNathan Whitehorn { "icon", o_icon, 1, NULL }, 2254c8945a0SNathan Whitehorn { "ignore", o_ignore, 1, "" }, 2264c8945a0SNathan Whitehorn { "infobox", o_infobox, 2, "<text> <height> <width>" }, 2274c8945a0SNathan Whitehorn { "input-fd", o_input_fd, 1, "<fd>" }, 2284c8945a0SNathan Whitehorn { "inputbox", o_inputbox, 2, "<text> <height> <width> [<init>]" }, 2294c8945a0SNathan Whitehorn { "inputmenu", o_inputmenu, 2, "<text> <height> <width> <menu height> <tag1> <item1>..." }, 2304c8945a0SNathan Whitehorn { "insecure", o_insecure, 1, "" }, 2314c8945a0SNathan Whitehorn { "item-help", o_item_help, 1, "" }, 2324c8945a0SNathan Whitehorn { "keep-colors", o_keep_colors, 1, NULL }, 2334c8945a0SNathan Whitehorn { "keep-tite", o_keep_tite, 1, "" }, 2344c8945a0SNathan Whitehorn { "keep-window", o_keep_window, 1, "" }, 2354c8945a0SNathan Whitehorn { "max-input", o_max_input, 1, "<n>" }, 2364c8945a0SNathan Whitehorn { "menu", o_menu, 2, "<text> <height> <width> <menu height> <tag1> <item1>..." }, 2374c8945a0SNathan Whitehorn { "mixedform", o_mixedform, 2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>..." }, 2384c8945a0SNathan Whitehorn { "mixedgauge", o_mixedgauge, 2, "<text> <height> <width> <percent> <tag1> <item1>..." }, 2394c8945a0SNathan Whitehorn { "msgbox", o_msgbox, 2, "<text> <height> <width>" }, 2404c8945a0SNathan Whitehorn { "no-cancel", o_nocancel, 1, "" }, 2414c8945a0SNathan Whitehorn { "no-close", o_no_close, 1, NULL }, 2424c8945a0SNathan Whitehorn { "no-collapse", o_no_collapse, 1, "" }, 2434c8945a0SNathan Whitehorn { "no-cr-wrap", o_no_cr_wrap, 1, NULL }, 2444c8945a0SNathan Whitehorn { "no-kill", o_no_kill, 1, "" }, 2454c8945a0SNathan Whitehorn { "no-label", o_no_label, 1, "<str>" }, 2464c8945a0SNathan Whitehorn { "no-lines", o_no_lines, 1, "" }, 2477a1c0d96SNathan Whitehorn { "no-mouse", o_no_mouse, 1, "" }, 248682c9e0fSNathan Whitehorn { "no-nl-expand", o_no_nl_expand, 1, "" }, 2494c8945a0SNathan Whitehorn { "no-ok", o_nook, 1, "" }, 2504c8945a0SNathan Whitehorn { "no-shadow", o_no_shadow, 1, "" }, 2514c8945a0SNathan Whitehorn { "nocancel", o_nocancel, 1, NULL }, /* see --no-cancel */ 2524c8945a0SNathan Whitehorn { "noitem", o_noitem, 1, NULL }, 2534c8945a0SNathan Whitehorn { "nook", o_nook, 1, "" }, /* See no-ok */ 2544c8945a0SNathan Whitehorn { "ok-label", o_ok_label, 1, "<str>" }, 2554c8945a0SNathan Whitehorn { "output-fd", o_output_fd, 1, "<fd>" }, 2564c8945a0SNathan Whitehorn { "output-separator",o_output_separator, 1, "<str>" }, 2574c8945a0SNathan Whitehorn { "passwordbox", o_passwordbox, 2, "<text> <height> <width> [<init>]" }, 2584c8945a0SNathan Whitehorn { "passwordform", o_passwordform, 2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>..." }, 2594c8945a0SNathan Whitehorn { "pause", o_pause, 2, "<text> <height> <width> <seconds>" }, 2607a1c0d96SNathan Whitehorn { "prgbox", o_prgbox, 2, "<text> <command> <height> <width>" }, 2614c8945a0SNathan Whitehorn { "print-maxsize", o_print_maxsize, 1, "" }, 2624c8945a0SNathan Whitehorn { "print-size", o_print_size, 1, "" }, 2634c8945a0SNathan Whitehorn { "print-version", o_print_version, 5, "" }, 2647a1c0d96SNathan Whitehorn { "programbox", o_programbox, 2, "<text> <height> <width>" }, 2657a1c0d96SNathan Whitehorn { "progressbox", o_progressbox, 2, "<text> <height> <width>" }, 2664c8945a0SNathan Whitehorn { "quoted", o_quoted, 1, "" }, 2674c8945a0SNathan Whitehorn { "radiolist", o_radiolist, 2, "<text> <height> <width> <list height> <tag1> <item1> <status1>..." }, 2684c8945a0SNathan Whitehorn { "screen-center", o_screen_center, 1, NULL }, 2694c8945a0SNathan Whitehorn { "scrollbar", o_scrollbar, 1, "" }, 2704c8945a0SNathan Whitehorn { "separate-output",o_separate_output, 1, "" }, 2714c8945a0SNathan Whitehorn { "separate-widget",o_separate_widget, 1, "<str>" }, 2724c8945a0SNathan Whitehorn { "separator", o_separator, 1, NULL }, 2734c8945a0SNathan Whitehorn { "shadow", o_shadow, 1, "" }, 2744c8945a0SNathan Whitehorn { "single-quoted", o_single_quoted, 1, "" }, 2754c8945a0SNathan Whitehorn { "size-err", o_size_err, 1, "" }, 2764c8945a0SNathan Whitehorn { "sleep", o_sleep, 1, "<secs>" }, 2774c8945a0SNathan Whitehorn { "smooth", o_smooth, 1, NULL }, 2784c8945a0SNathan Whitehorn { "stderr", o_stderr, 1, "" }, 2794c8945a0SNathan Whitehorn { "stdout", o_stdout, 1, "" }, 2804c8945a0SNathan Whitehorn { "tab-correct", o_tab_correct, 1, "" }, 2814c8945a0SNathan Whitehorn { "tab-len", o_tab_len, 1, "<n>" }, 2824c8945a0SNathan Whitehorn { "tailbox", o_tailbox, 2, "<file> <height> <width>" }, 2834c8945a0SNathan Whitehorn { "tailboxbg", o_tailboxbg, 2, "<file> <height> <width>" }, 2844c8945a0SNathan Whitehorn { "textbox", o_textbox, 2, "<file> <height> <width>" }, 2854c8945a0SNathan Whitehorn { "time-format", o_time_format, 1, "<str>" }, 2864c8945a0SNathan Whitehorn { "timebox", o_timebox, 2, "<text> <height> <width> <hour> <minute> <second>" }, 2874c8945a0SNathan Whitehorn { "timeout", o_timeout, 1, "<secs>" }, 2884c8945a0SNathan Whitehorn { "title", o_title, 1, "<title>" }, 2894c8945a0SNathan Whitehorn { "trim", o_trim, 1, "" }, 2904c8945a0SNathan Whitehorn { "under-mouse", o_under_mouse, 1, NULL }, 291682c9e0fSNathan Whitehorn { "version", o_version, 5, "" }, 2924c8945a0SNathan Whitehorn { "visit-items", o_visit_items, 1, "" }, 2934c8945a0SNathan Whitehorn { "wmclass", o_wmclass, 1, NULL }, 2944c8945a0SNathan Whitehorn { "yes-label", o_yes_label, 1, "<str>" }, 2954c8945a0SNathan Whitehorn { "yesno", o_yesno, 2, "<text> <height> <width>" }, 2964c8945a0SNathan Whitehorn #ifdef HAVE_DLG_TRACE 2974c8945a0SNathan Whitehorn { "trace", o_trace, 1, "<file>" }, 2984c8945a0SNathan Whitehorn #endif 2994c8945a0SNathan Whitehorn }; 3004c8945a0SNathan Whitehorn /* *INDENT-ON* */ 3014c8945a0SNathan Whitehorn 3024c8945a0SNathan Whitehorn /* 3034c8945a0SNathan Whitehorn * Make an array showing which argv[] entries are options. Use "--" as a 3044c8945a0SNathan Whitehorn * special token to escape the next argument, allowing it to begin with "--". 3054c8945a0SNathan Whitehorn * When we find a "--" argument, also remove it from argv[] and adjust argc. 3064c8945a0SNathan Whitehorn * That appears to be an undocumented feature of the popt library. 3074c8945a0SNathan Whitehorn * 3084c8945a0SNathan Whitehorn * Also, if we see a "--file", expand it into the parameter list by reading the 3094c8945a0SNathan Whitehorn * text from the given file and stripping quotes, treating whitespace outside 3104c8945a0SNathan Whitehorn * quotes as a parameter delimiter. 3114c8945a0SNathan Whitehorn * 3124c8945a0SNathan Whitehorn * Finally, if we see a "--args", dump the current list of arguments to the 3134c8945a0SNathan Whitehorn * standard error. This is used for debugging complex --file combinations. 3144c8945a0SNathan Whitehorn */ 3154c8945a0SNathan Whitehorn static void 3164c8945a0SNathan Whitehorn unescape_argv(int *argcp, char ***argvp) 3174c8945a0SNathan Whitehorn { 3184c8945a0SNathan Whitehorn int j, k; 3194c8945a0SNathan Whitehorn int limit_includes = 20 + *argcp; 3204c8945a0SNathan Whitehorn int count_includes = 0; 3214c8945a0SNathan Whitehorn bool changed = FALSE; 3224c8945a0SNathan Whitehorn bool doalloc = FALSE; 3234c8945a0SNathan Whitehorn char *filename; 3244c8945a0SNathan Whitehorn 3254c8945a0SNathan Whitehorn dialog_opts = dlg_calloc(bool, (size_t) *argcp + 1); 3264c8945a0SNathan Whitehorn assert_ptr(dialog_opts, "unescape_argv"); 3274c8945a0SNathan Whitehorn 3284c8945a0SNathan Whitehorn for (j = 1; j < *argcp; j++) { 3294c8945a0SNathan Whitehorn bool escaped = FALSE; 3304c8945a0SNathan Whitehorn if (!strcmp((*argvp)[j], "--")) { 3314c8945a0SNathan Whitehorn escaped = TRUE; 3327a1c0d96SNathan Whitehorn changed = dlg_eat_argv(argcp, argvp, j, 1); 3334c8945a0SNathan Whitehorn } else if (!strcmp((*argvp)[j], "--args")) { 3344c8945a0SNathan Whitehorn fprintf(stderr, "Showing arguments at arg%d\n", j); 3354c8945a0SNathan Whitehorn for (k = 0; k < *argcp; ++k) { 3364c8945a0SNathan Whitehorn fprintf(stderr, " arg%d:%s\n", k, (*argvp)[k]); 3374c8945a0SNathan Whitehorn } 3387a1c0d96SNathan Whitehorn changed = dlg_eat_argv(argcp, argvp, j, 1); 3394c8945a0SNathan Whitehorn } else if (!strcmp((*argvp)[j], "--file")) { 3404c8945a0SNathan Whitehorn if (++count_includes > limit_includes) 3414c8945a0SNathan Whitehorn dlg_exiterr("Too many --file options"); 3424c8945a0SNathan Whitehorn 3434c8945a0SNathan Whitehorn if ((filename = (*argvp)[j + 1]) != 0) { 3444c8945a0SNathan Whitehorn FILE *fp; 3454c8945a0SNathan Whitehorn char **list; 3464c8945a0SNathan Whitehorn char *blob; 3474c8945a0SNathan Whitehorn int added; 3484c8945a0SNathan Whitehorn size_t bytes_read; 3494c8945a0SNathan Whitehorn size_t length; 3504c8945a0SNathan Whitehorn int n; 3514c8945a0SNathan Whitehorn 3524c8945a0SNathan Whitehorn if (*filename == '&') { 3534c8945a0SNathan Whitehorn fp = fdopen(atoi(filename + sizeof(char)), "r"); 3544c8945a0SNathan Whitehorn } else { 3554c8945a0SNathan Whitehorn fp = fopen(filename, "r"); 3564c8945a0SNathan Whitehorn } 3574c8945a0SNathan Whitehorn 3584c8945a0SNathan Whitehorn if (fp) { 3594c8945a0SNathan Whitehorn blob = NULL; 3604c8945a0SNathan Whitehorn length = 0; 3614c8945a0SNathan Whitehorn do { 3624c8945a0SNathan Whitehorn blob = dlg_realloc(char, length + BUFSIZ + 1, blob); 3634c8945a0SNathan Whitehorn assert_ptr(blob, "unescape_argv"); 3644c8945a0SNathan Whitehorn bytes_read = fread(blob + length, 3654c8945a0SNathan Whitehorn sizeof(char), 3667a1c0d96SNathan Whitehorn (size_t) BUFSIZ, 3674c8945a0SNathan Whitehorn fp); 3684c8945a0SNathan Whitehorn length += bytes_read; 3694c8945a0SNathan Whitehorn if (ferror(fp)) 3704c8945a0SNathan Whitehorn dlg_exiterr("error on filehandle in unescape_argv"); 3714c8945a0SNathan Whitehorn } while (bytes_read == BUFSIZ); 3724c8945a0SNathan Whitehorn fclose(fp); 3734c8945a0SNathan Whitehorn 3744c8945a0SNathan Whitehorn blob[length] = '\0'; 3754c8945a0SNathan Whitehorn 3767a1c0d96SNathan Whitehorn list = dlg_string_to_argv(blob); 3777a1c0d96SNathan Whitehorn if ((added = dlg_count_argv(list)) != 0) { 3784c8945a0SNathan Whitehorn if (added > 2) { 3794c8945a0SNathan Whitehorn size_t need = (size_t) (*argcp + added + 1); 3804c8945a0SNathan Whitehorn if (doalloc) { 3814c8945a0SNathan Whitehorn *argvp = dlg_realloc(char *, need, *argvp); 3824c8945a0SNathan Whitehorn assert_ptr(*argvp, "unescape_argv"); 3834c8945a0SNathan Whitehorn } else { 3844c8945a0SNathan Whitehorn char **newp = dlg_malloc(char *, need); 3854c8945a0SNathan Whitehorn assert_ptr(newp, "unescape_argv"); 3864c8945a0SNathan Whitehorn for (n = 0; n < *argcp; ++n) { 3874c8945a0SNathan Whitehorn newp[n] = (*argvp)[n]; 3884c8945a0SNathan Whitehorn } 3894c8945a0SNathan Whitehorn *argvp = newp; 3904c8945a0SNathan Whitehorn doalloc = TRUE; 3914c8945a0SNathan Whitehorn } 3924c8945a0SNathan Whitehorn dialog_opts = dlg_realloc(bool, need, dialog_opts); 3934c8945a0SNathan Whitehorn assert_ptr(dialog_opts, "unescape_argv"); 3944c8945a0SNathan Whitehorn } 3954c8945a0SNathan Whitehorn for (n = *argcp; n >= j + 2; --n) { 3964c8945a0SNathan Whitehorn (*argvp)[n + added - 2] = (*argvp)[n]; 3974c8945a0SNathan Whitehorn dialog_opts[n + added - 2] = dialog_opts[n]; 3984c8945a0SNathan Whitehorn } 3994c8945a0SNathan Whitehorn for (n = 0; n < added; ++n) { 4004c8945a0SNathan Whitehorn (*argvp)[n + j] = list[n]; 4014c8945a0SNathan Whitehorn dialog_opts[n + j] = FALSE; 4024c8945a0SNathan Whitehorn } 4034c8945a0SNathan Whitehorn *argcp += added - 2; 4044c8945a0SNathan Whitehorn free(list); 4054c8945a0SNathan Whitehorn } 4064c8945a0SNathan Whitehorn } else { 4074c8945a0SNathan Whitehorn dlg_exiterr("Cannot open --file %s", filename); 4084c8945a0SNathan Whitehorn } 4094c8945a0SNathan Whitehorn (*argvp)[*argcp] = 0; 4104c8945a0SNathan Whitehorn ++j; 4114c8945a0SNathan Whitehorn continue; 4124c8945a0SNathan Whitehorn } else { 4134c8945a0SNathan Whitehorn dlg_exiterr("No value given for --file"); 4144c8945a0SNathan Whitehorn } 4154c8945a0SNathan Whitehorn } 4164c8945a0SNathan Whitehorn if (!escaped 4174c8945a0SNathan Whitehorn && (*argvp)[j] != 0 4187a1c0d96SNathan Whitehorn && !strncmp((*argvp)[j], "--", (size_t) 2) 4194c8945a0SNathan Whitehorn && isalpha(UCH((*argvp)[j][2]))) { 4204c8945a0SNathan Whitehorn dialog_opts[j] = TRUE; 4214c8945a0SNathan Whitehorn } 4224c8945a0SNathan Whitehorn } 4234c8945a0SNathan Whitehorn 4244c8945a0SNathan Whitehorn /* if we didn't find any "--" tokens, there's no reason to do the table 4254c8945a0SNathan Whitehorn * lookup in isOption() 4264c8945a0SNathan Whitehorn */ 4274c8945a0SNathan Whitehorn if (!changed) { 4284c8945a0SNathan Whitehorn free(dialog_opts); 4294c8945a0SNathan Whitehorn dialog_opts = 0; 4304c8945a0SNathan Whitehorn } 4314c8945a0SNathan Whitehorn dialog_argv = (*argvp); 4324c8945a0SNathan Whitehorn } 4334c8945a0SNathan Whitehorn 4344c8945a0SNathan Whitehorn /* 4354c8945a0SNathan Whitehorn * Check if the given string from main's argv is an option. 4364c8945a0SNathan Whitehorn */ 4374c8945a0SNathan Whitehorn static bool 4384c8945a0SNathan Whitehorn isOption(const char *arg) 4394c8945a0SNathan Whitehorn { 4404c8945a0SNathan Whitehorn bool result = FALSE; 4414c8945a0SNathan Whitehorn 4424c8945a0SNathan Whitehorn if (arg != 0) { 4434c8945a0SNathan Whitehorn if (dialog_opts != 0) { 4444c8945a0SNathan Whitehorn int n; 4454c8945a0SNathan Whitehorn for (n = 1; dialog_argv[n] != 0; ++n) { 4464c8945a0SNathan Whitehorn if (dialog_argv[n] == arg) { 4474c8945a0SNathan Whitehorn result = dialog_opts[n]; 4484c8945a0SNathan Whitehorn break; 4494c8945a0SNathan Whitehorn } 4504c8945a0SNathan Whitehorn } 4517a1c0d96SNathan Whitehorn } else if (!strncmp(arg, "--", (size_t) 2) && isalpha(UCH(arg[2]))) { 4524c8945a0SNathan Whitehorn result = TRUE; 4534c8945a0SNathan Whitehorn } 4544c8945a0SNathan Whitehorn } 4554c8945a0SNathan Whitehorn return result; 4564c8945a0SNathan Whitehorn } 4574c8945a0SNathan Whitehorn 4584c8945a0SNathan Whitehorn static eOptions 4594c8945a0SNathan Whitehorn lookupOption(const char *name, int pass) 4604c8945a0SNathan Whitehorn { 4614c8945a0SNathan Whitehorn unsigned n; 4624c8945a0SNathan Whitehorn 4634c8945a0SNathan Whitehorn if (isOption(name)) { 4644c8945a0SNathan Whitehorn name += 2; 4654c8945a0SNathan Whitehorn for (n = 0; n < sizeof(options) / sizeof(options[0]); n++) { 4664c8945a0SNathan Whitehorn if ((pass & options[n].pass) != 0 4674c8945a0SNathan Whitehorn && !strcmp(name, options[n].name)) { 4684c8945a0SNathan Whitehorn return options[n].code; 4694c8945a0SNathan Whitehorn } 4704c8945a0SNathan Whitehorn } 4714c8945a0SNathan Whitehorn } 4724c8945a0SNathan Whitehorn return o_unknown; 4734c8945a0SNathan Whitehorn } 4744c8945a0SNathan Whitehorn 4754c8945a0SNathan Whitehorn static void 4764c8945a0SNathan Whitehorn Usage(const char *msg) 4774c8945a0SNathan Whitehorn { 4784c8945a0SNathan Whitehorn dlg_exiterr("Error: %s.\nUse --help to list options.\n\n", msg); 4794c8945a0SNathan Whitehorn } 4804c8945a0SNathan Whitehorn 4814c8945a0SNathan Whitehorn /* 4824c8945a0SNathan Whitehorn * Count arguments, stopping at the end of the argument list, or on any of our 4834c8945a0SNathan Whitehorn * "--" tokens. 4844c8945a0SNathan Whitehorn */ 4854c8945a0SNathan Whitehorn static int 4864c8945a0SNathan Whitehorn arg_rest(char *argv[]) 4874c8945a0SNathan Whitehorn { 4884c8945a0SNathan Whitehorn int i = 1; /* argv[0] points to a "--" token */ 4894c8945a0SNathan Whitehorn 4904c8945a0SNathan Whitehorn while (argv[i] != 0 4914c8945a0SNathan Whitehorn && (!isOption(argv[i]) || lookupOption(argv[i], 7) == o_unknown)) 4924c8945a0SNathan Whitehorn i++; 4934c8945a0SNathan Whitehorn return i; 4944c8945a0SNathan Whitehorn } 4954c8945a0SNathan Whitehorn 4964c8945a0SNathan Whitehorn /* 4974c8945a0SNathan Whitehorn * In MultiWidget this function is needed to count how many tags 4984c8945a0SNathan Whitehorn * a widget (menu, checklist, radiolist) has 4994c8945a0SNathan Whitehorn */ 5004c8945a0SNathan Whitehorn static int 5014c8945a0SNathan Whitehorn howmany_tags(char *argv[], int group) 5024c8945a0SNathan Whitehorn { 5034c8945a0SNathan Whitehorn int result = 0; 5044c8945a0SNathan Whitehorn int have; 5054c8945a0SNathan Whitehorn const char *format = "Expected %d arguments, found only %d"; 5064c8945a0SNathan Whitehorn char temp[80]; 5074c8945a0SNathan Whitehorn 5084c8945a0SNathan Whitehorn while (argv[0] != 0) { 5094c8945a0SNathan Whitehorn if (isOption(argv[0])) 5104c8945a0SNathan Whitehorn break; 5114c8945a0SNathan Whitehorn if ((have = arg_rest(argv)) < group) { 5124c8945a0SNathan Whitehorn sprintf(temp, format, group, have); 5134c8945a0SNathan Whitehorn Usage(temp); 5144c8945a0SNathan Whitehorn } 5154c8945a0SNathan Whitehorn 5164c8945a0SNathan Whitehorn argv += group; 5174c8945a0SNathan Whitehorn result++; 5184c8945a0SNathan Whitehorn } 5194c8945a0SNathan Whitehorn 5204c8945a0SNathan Whitehorn return result; 5214c8945a0SNathan Whitehorn } 5224c8945a0SNathan Whitehorn 5234c8945a0SNathan Whitehorn static int 5244c8945a0SNathan Whitehorn numeric_arg(char **av, int n) 5254c8945a0SNathan Whitehorn { 5264c8945a0SNathan Whitehorn char *last = 0; 5277a1c0d96SNathan Whitehorn int result = (int) strtol(av[n], &last, 10); 5284c8945a0SNathan Whitehorn char msg[80]; 5294c8945a0SNathan Whitehorn 5304c8945a0SNathan Whitehorn if (last == 0 || *last != 0) { 5314c8945a0SNathan Whitehorn sprintf(msg, "Expected a number for token %d of %.20s", n, av[0]); 5324c8945a0SNathan Whitehorn Usage(msg); 5334c8945a0SNathan Whitehorn } 5344c8945a0SNathan Whitehorn return result; 5354c8945a0SNathan Whitehorn } 5364c8945a0SNathan Whitehorn 5374c8945a0SNathan Whitehorn static char * 5384c8945a0SNathan Whitehorn optional_str(char **av, int n, char *dft) 5394c8945a0SNathan Whitehorn { 5404c8945a0SNathan Whitehorn char *ret = dft; 5414c8945a0SNathan Whitehorn if (arg_rest(av) > n) 5424c8945a0SNathan Whitehorn ret = av[n]; 5434c8945a0SNathan Whitehorn return ret; 5444c8945a0SNathan Whitehorn } 5454c8945a0SNathan Whitehorn 5464c8945a0SNathan Whitehorn #if defined(HAVE_DLG_GAUGE) || defined(HAVE_XDIALOG) 5474c8945a0SNathan Whitehorn static int 5484c8945a0SNathan Whitehorn optional_num(char **av, int n, int dft) 5494c8945a0SNathan Whitehorn { 5504c8945a0SNathan Whitehorn int ret = dft; 5514c8945a0SNathan Whitehorn if (arg_rest(av) > n) 5524c8945a0SNathan Whitehorn ret = numeric_arg(av, n); 5534c8945a0SNathan Whitehorn return ret; 5544c8945a0SNathan Whitehorn } 5554c8945a0SNathan Whitehorn #endif 5564c8945a0SNathan Whitehorn 5574c8945a0SNathan Whitehorn /* 5584c8945a0SNathan Whitehorn * On AIX 4.x, we have to flush the output right away since there is a bug in 5594c8945a0SNathan Whitehorn * the curses package which discards stdout even when we've used newterm to 5604c8945a0SNathan Whitehorn * redirect output to /dev/tty. 5614c8945a0SNathan Whitehorn */ 5624c8945a0SNathan Whitehorn static int 5634c8945a0SNathan Whitehorn show_result(int ret) 5644c8945a0SNathan Whitehorn { 5654c8945a0SNathan Whitehorn bool either = FALSE; 5664c8945a0SNathan Whitehorn 5674c8945a0SNathan Whitehorn switch (ret) { 5684c8945a0SNathan Whitehorn case DLG_EXIT_OK: 5694c8945a0SNathan Whitehorn case DLG_EXIT_EXTRA: 5704c8945a0SNathan Whitehorn case DLG_EXIT_HELP: 5714c8945a0SNathan Whitehorn case DLG_EXIT_ITEM_HELP: 5724c8945a0SNathan Whitehorn if ((dialog_state.output_count > 1) && !dialog_vars.separate_output) { 5734c8945a0SNathan Whitehorn fputs((dialog_state.separate_str 5744c8945a0SNathan Whitehorn ? dialog_state.separate_str 5754c8945a0SNathan Whitehorn : DEFAULT_SEPARATE_STR), 5764c8945a0SNathan Whitehorn dialog_state.output); 5774c8945a0SNathan Whitehorn either = TRUE; 5784c8945a0SNathan Whitehorn } 5797a1c0d96SNathan Whitehorn if (dialog_vars.input_result != 0 5807a1c0d96SNathan Whitehorn && dialog_vars.input_result[0] != '\0') { 5814c8945a0SNathan Whitehorn fputs(dialog_vars.input_result, dialog_state.output); 5824c8945a0SNathan Whitehorn either = TRUE; 5834c8945a0SNathan Whitehorn } 5844c8945a0SNathan Whitehorn if (either) { 5854c8945a0SNathan Whitehorn fflush(dialog_state.output); 5864c8945a0SNathan Whitehorn } 5874c8945a0SNathan Whitehorn break; 5884c8945a0SNathan Whitehorn } 5894c8945a0SNathan Whitehorn return ret; 5904c8945a0SNathan Whitehorn } 5914c8945a0SNathan Whitehorn 5924c8945a0SNathan Whitehorn /* 5934c8945a0SNathan Whitehorn * These are the widget callers. 5944c8945a0SNathan Whitehorn */ 5954c8945a0SNathan Whitehorn 5964c8945a0SNathan Whitehorn static int 5974c8945a0SNathan Whitehorn call_yesno(CALLARGS) 5984c8945a0SNathan Whitehorn { 5994c8945a0SNathan Whitehorn *offset_add = 4; 6004c8945a0SNathan Whitehorn return dialog_yesno(t, 6014c8945a0SNathan Whitehorn av[1], 6024c8945a0SNathan Whitehorn numeric_arg(av, 2), 6034c8945a0SNathan Whitehorn numeric_arg(av, 3)); 6044c8945a0SNathan Whitehorn } 6054c8945a0SNathan Whitehorn 6064c8945a0SNathan Whitehorn static int 6074c8945a0SNathan Whitehorn call_msgbox(CALLARGS) 6084c8945a0SNathan Whitehorn { 6094c8945a0SNathan Whitehorn *offset_add = 4; 6104c8945a0SNathan Whitehorn return dialog_msgbox(t, 6114c8945a0SNathan Whitehorn av[1], 6124c8945a0SNathan Whitehorn numeric_arg(av, 2), 6134c8945a0SNathan Whitehorn numeric_arg(av, 3), 1); 6144c8945a0SNathan Whitehorn } 6154c8945a0SNathan Whitehorn 6164c8945a0SNathan Whitehorn static int 6174c8945a0SNathan Whitehorn call_infobox(CALLARGS) 6184c8945a0SNathan Whitehorn { 6194c8945a0SNathan Whitehorn *offset_add = 4; 6204c8945a0SNathan Whitehorn return dialog_msgbox(t, 6214c8945a0SNathan Whitehorn av[1], 6224c8945a0SNathan Whitehorn numeric_arg(av, 2), 6234c8945a0SNathan Whitehorn numeric_arg(av, 3), 0); 6244c8945a0SNathan Whitehorn } 6254c8945a0SNathan Whitehorn 6264c8945a0SNathan Whitehorn static int 6274c8945a0SNathan Whitehorn call_textbox(CALLARGS) 6284c8945a0SNathan Whitehorn { 6294c8945a0SNathan Whitehorn *offset_add = 4; 6304c8945a0SNathan Whitehorn return dialog_textbox(t, 6314c8945a0SNathan Whitehorn av[1], 6324c8945a0SNathan Whitehorn numeric_arg(av, 2), 6334c8945a0SNathan Whitehorn numeric_arg(av, 3)); 6344c8945a0SNathan Whitehorn } 6354c8945a0SNathan Whitehorn 6364c8945a0SNathan Whitehorn static int 6374c8945a0SNathan Whitehorn call_menu(CALLARGS) 6384c8945a0SNathan Whitehorn { 6394c8945a0SNathan Whitehorn int tags = howmany_tags(av + 5, MENUBOX_TAGS); 6404c8945a0SNathan Whitehorn *offset_add = 5 + tags * MENUBOX_TAGS; 6414c8945a0SNathan Whitehorn 6424c8945a0SNathan Whitehorn return dialog_menu(t, 6434c8945a0SNathan Whitehorn av[1], 6444c8945a0SNathan Whitehorn numeric_arg(av, 2), 6454c8945a0SNathan Whitehorn numeric_arg(av, 3), 6464c8945a0SNathan Whitehorn numeric_arg(av, 4), 6474c8945a0SNathan Whitehorn tags, av + 5); 6484c8945a0SNathan Whitehorn } 6494c8945a0SNathan Whitehorn 6504c8945a0SNathan Whitehorn static int 6514c8945a0SNathan Whitehorn call_inputmenu(CALLARGS) 6524c8945a0SNathan Whitehorn { 6534c8945a0SNathan Whitehorn int tags = howmany_tags(av + 5, MENUBOX_TAGS); 6547a1c0d96SNathan Whitehorn bool free_extra_label = FALSE; 6557a1c0d96SNathan Whitehorn int result; 6564c8945a0SNathan Whitehorn 6574c8945a0SNathan Whitehorn dialog_vars.input_menu = TRUE; 6584c8945a0SNathan Whitehorn 6594c8945a0SNathan Whitehorn if (dialog_vars.max_input == 0) 6604c8945a0SNathan Whitehorn dialog_vars.max_input = MAX_LEN / 2; 6614c8945a0SNathan Whitehorn 6627a1c0d96SNathan Whitehorn if (dialog_vars.extra_label == 0) { 6637a1c0d96SNathan Whitehorn free_extra_label = TRUE; 6647a1c0d96SNathan Whitehorn dialog_vars.extra_label = dlg_strclone(_("Rename")); 6657a1c0d96SNathan Whitehorn } 6664c8945a0SNathan Whitehorn 6674c8945a0SNathan Whitehorn dialog_vars.extra_button = TRUE; 6684c8945a0SNathan Whitehorn 6694c8945a0SNathan Whitehorn *offset_add = 5 + tags * MENUBOX_TAGS; 6707a1c0d96SNathan Whitehorn result = dialog_menu(t, 6714c8945a0SNathan Whitehorn av[1], 6724c8945a0SNathan Whitehorn numeric_arg(av, 2), 6734c8945a0SNathan Whitehorn numeric_arg(av, 3), 6744c8945a0SNathan Whitehorn numeric_arg(av, 4), 6754c8945a0SNathan Whitehorn tags, av + 5); 6767a1c0d96SNathan Whitehorn if (free_extra_label) { 6777a1c0d96SNathan Whitehorn free(dialog_vars.extra_label); 6787a1c0d96SNathan Whitehorn dialog_vars.extra_label = 0; 6797a1c0d96SNathan Whitehorn } 6807a1c0d96SNathan Whitehorn return result; 6814c8945a0SNathan Whitehorn } 6824c8945a0SNathan Whitehorn 6834c8945a0SNathan Whitehorn static int 6844c8945a0SNathan Whitehorn call_checklist(CALLARGS) 6854c8945a0SNathan Whitehorn { 6864c8945a0SNathan Whitehorn int tags = howmany_tags(av + 5, CHECKBOX_TAGS); 6874c8945a0SNathan Whitehorn int code; 6884c8945a0SNathan Whitehorn bool save_quoted = dialog_vars.quoted; 6894c8945a0SNathan Whitehorn 6904c8945a0SNathan Whitehorn dialog_vars.quoted = !dialog_vars.separate_output; 6914c8945a0SNathan Whitehorn *offset_add = 5 + tags * CHECKBOX_TAGS; 6924c8945a0SNathan Whitehorn code = dialog_checklist(t, 6934c8945a0SNathan Whitehorn av[1], 6944c8945a0SNathan Whitehorn numeric_arg(av, 2), 6954c8945a0SNathan Whitehorn numeric_arg(av, 3), 6964c8945a0SNathan Whitehorn numeric_arg(av, 4), 6974c8945a0SNathan Whitehorn tags, av + 5, FLAG_CHECK); 6984c8945a0SNathan Whitehorn dialog_vars.quoted = save_quoted; 6994c8945a0SNathan Whitehorn return code; 7004c8945a0SNathan Whitehorn } 7014c8945a0SNathan Whitehorn 7024c8945a0SNathan Whitehorn static int 7034c8945a0SNathan Whitehorn call_radiolist(CALLARGS) 7044c8945a0SNathan Whitehorn { 7054c8945a0SNathan Whitehorn int tags = howmany_tags(av + 5, CHECKBOX_TAGS); 7064c8945a0SNathan Whitehorn *offset_add = 5 + tags * CHECKBOX_TAGS; 7074c8945a0SNathan Whitehorn return dialog_checklist(t, 7084c8945a0SNathan Whitehorn av[1], 7094c8945a0SNathan Whitehorn numeric_arg(av, 2), 7104c8945a0SNathan Whitehorn numeric_arg(av, 3), 7114c8945a0SNathan Whitehorn numeric_arg(av, 4), 7124c8945a0SNathan Whitehorn tags, av + 5, FLAG_RADIO); 7134c8945a0SNathan Whitehorn } 7144c8945a0SNathan Whitehorn 7154c8945a0SNathan Whitehorn static int 7164c8945a0SNathan Whitehorn call_inputbox(CALLARGS) 7174c8945a0SNathan Whitehorn { 7184c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 7194c8945a0SNathan Whitehorn return dialog_inputbox(t, 7204c8945a0SNathan Whitehorn av[1], 7214c8945a0SNathan Whitehorn numeric_arg(av, 2), 7224c8945a0SNathan Whitehorn numeric_arg(av, 3), 7234c8945a0SNathan Whitehorn optional_str(av, 4, 0), 0); 7244c8945a0SNathan Whitehorn } 7254c8945a0SNathan Whitehorn 7264c8945a0SNathan Whitehorn static int 7274c8945a0SNathan Whitehorn call_passwordbox(CALLARGS) 7284c8945a0SNathan Whitehorn { 7294c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 7304c8945a0SNathan Whitehorn return dialog_inputbox(t, 7314c8945a0SNathan Whitehorn av[1], 7324c8945a0SNathan Whitehorn numeric_arg(av, 2), 7334c8945a0SNathan Whitehorn numeric_arg(av, 3), 7344c8945a0SNathan Whitehorn optional_str(av, 4, 0), 1); 7354c8945a0SNathan Whitehorn } 7364c8945a0SNathan Whitehorn 7374c8945a0SNathan Whitehorn #ifdef HAVE_XDIALOG 7384c8945a0SNathan Whitehorn static int 7394c8945a0SNathan Whitehorn call_calendar(CALLARGS) 7404c8945a0SNathan Whitehorn { 7414c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 7424c8945a0SNathan Whitehorn return dialog_calendar(t, 7434c8945a0SNathan Whitehorn av[1], 7444c8945a0SNathan Whitehorn numeric_arg(av, 2), 7454c8945a0SNathan Whitehorn numeric_arg(av, 3), 7464c8945a0SNathan Whitehorn optional_num(av, 4, -1), 7474c8945a0SNathan Whitehorn optional_num(av, 5, -1), 7484c8945a0SNathan Whitehorn optional_num(av, 6, -1)); 7494c8945a0SNathan Whitehorn } 7504c8945a0SNathan Whitehorn 7514c8945a0SNathan Whitehorn static int 7524c8945a0SNathan Whitehorn call_dselect(CALLARGS) 7534c8945a0SNathan Whitehorn { 7544c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 7554c8945a0SNathan Whitehorn return dialog_dselect(t, 7564c8945a0SNathan Whitehorn av[1], 7574c8945a0SNathan Whitehorn numeric_arg(av, 2), 7584c8945a0SNathan Whitehorn numeric_arg(av, 3)); 7594c8945a0SNathan Whitehorn } 7604c8945a0SNathan Whitehorn 7614c8945a0SNathan Whitehorn static int 7624c8945a0SNathan Whitehorn call_editbox(CALLARGS) 7634c8945a0SNathan Whitehorn { 7644c8945a0SNathan Whitehorn *offset_add = 4; 7654c8945a0SNathan Whitehorn return dialog_editbox(t, 7664c8945a0SNathan Whitehorn av[1], 7674c8945a0SNathan Whitehorn numeric_arg(av, 2), 7684c8945a0SNathan Whitehorn numeric_arg(av, 3)); 7694c8945a0SNathan Whitehorn } 7704c8945a0SNathan Whitehorn 7714c8945a0SNathan Whitehorn static int 7724c8945a0SNathan Whitehorn call_fselect(CALLARGS) 7734c8945a0SNathan Whitehorn { 7744c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 7754c8945a0SNathan Whitehorn return dialog_fselect(t, 7764c8945a0SNathan Whitehorn av[1], 7774c8945a0SNathan Whitehorn numeric_arg(av, 2), 7784c8945a0SNathan Whitehorn numeric_arg(av, 3)); 7794c8945a0SNathan Whitehorn } 7804c8945a0SNathan Whitehorn 7814c8945a0SNathan Whitehorn static int 7824c8945a0SNathan Whitehorn call_timebox(CALLARGS) 7834c8945a0SNathan Whitehorn { 7844c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 7854c8945a0SNathan Whitehorn return dialog_timebox(t, 7864c8945a0SNathan Whitehorn av[1], 7874c8945a0SNathan Whitehorn numeric_arg(av, 2), 7884c8945a0SNathan Whitehorn numeric_arg(av, 3), 7894c8945a0SNathan Whitehorn optional_num(av, 4, -1), 7904c8945a0SNathan Whitehorn optional_num(av, 5, -1), 7914c8945a0SNathan Whitehorn optional_num(av, 6, -1)); 7924c8945a0SNathan Whitehorn } 7934c8945a0SNathan Whitehorn #endif /* HAVE_XDIALOG */ 7944c8945a0SNathan Whitehorn 7954c8945a0SNathan Whitehorn #ifdef HAVE_DLG_FORMBOX 7964c8945a0SNathan Whitehorn static int 7974c8945a0SNathan Whitehorn call_form(CALLARGS) 7984c8945a0SNathan Whitehorn { 7994c8945a0SNathan Whitehorn int group = FORMBOX_TAGS; 8004c8945a0SNathan Whitehorn int tags = howmany_tags(av + 5, group); 8014c8945a0SNathan Whitehorn *offset_add = 5 + tags * group; 8024c8945a0SNathan Whitehorn 8034c8945a0SNathan Whitehorn return dialog_form(t, 8044c8945a0SNathan Whitehorn av[1], 8054c8945a0SNathan Whitehorn numeric_arg(av, 2), 8064c8945a0SNathan Whitehorn numeric_arg(av, 3), 8074c8945a0SNathan Whitehorn numeric_arg(av, 4), 8084c8945a0SNathan Whitehorn tags, av + 5); 8094c8945a0SNathan Whitehorn } 8104c8945a0SNathan Whitehorn 8114c8945a0SNathan Whitehorn static int 8124c8945a0SNathan Whitehorn call_password_form(CALLARGS) 8134c8945a0SNathan Whitehorn { 8144c8945a0SNathan Whitehorn unsigned save = dialog_vars.formitem_type; 8154c8945a0SNathan Whitehorn int result; 8164c8945a0SNathan Whitehorn 8174c8945a0SNathan Whitehorn dialog_vars.formitem_type = 1; 8184c8945a0SNathan Whitehorn result = call_form(PASSARGS); 8194c8945a0SNathan Whitehorn dialog_vars.formitem_type = save; 8204c8945a0SNathan Whitehorn 8214c8945a0SNathan Whitehorn return result; 8224c8945a0SNathan Whitehorn } 8234c8945a0SNathan Whitehorn #endif /* HAVE_DLG_FORMBOX */ 8244c8945a0SNathan Whitehorn 8254c8945a0SNathan Whitehorn #ifdef HAVE_DLG_MIXEDFORM 8264c8945a0SNathan Whitehorn static int 8274c8945a0SNathan Whitehorn call_mixed_form(CALLARGS) 8284c8945a0SNathan Whitehorn { 8294c8945a0SNathan Whitehorn int group = MIXEDFORM_TAGS; 8304c8945a0SNathan Whitehorn int tags = howmany_tags(av + 5, group); 8314c8945a0SNathan Whitehorn *offset_add = 5 + tags * group; 8324c8945a0SNathan Whitehorn 8334c8945a0SNathan Whitehorn return dialog_mixedform(t, 8344c8945a0SNathan Whitehorn av[1], 8354c8945a0SNathan Whitehorn numeric_arg(av, 2), 8364c8945a0SNathan Whitehorn numeric_arg(av, 3), 8374c8945a0SNathan Whitehorn numeric_arg(av, 4), 8384c8945a0SNathan Whitehorn tags, av + 5); 8394c8945a0SNathan Whitehorn } 8404c8945a0SNathan Whitehorn #endif /* HAVE_DLG_MIXEDFORM */ 8414c8945a0SNathan Whitehorn 8424c8945a0SNathan Whitehorn #ifdef HAVE_DLG_GAUGE 8434c8945a0SNathan Whitehorn static int 8444c8945a0SNathan Whitehorn call_gauge(CALLARGS) 8454c8945a0SNathan Whitehorn { 8464c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 8474c8945a0SNathan Whitehorn return dialog_gauge(t, 8484c8945a0SNathan Whitehorn av[1], 8494c8945a0SNathan Whitehorn numeric_arg(av, 2), 8504c8945a0SNathan Whitehorn numeric_arg(av, 3), 8514c8945a0SNathan Whitehorn optional_num(av, 4, 0)); 8524c8945a0SNathan Whitehorn } 8534c8945a0SNathan Whitehorn 8544c8945a0SNathan Whitehorn static int 8554c8945a0SNathan Whitehorn call_pause(CALLARGS) 8564c8945a0SNathan Whitehorn { 8574c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 8584c8945a0SNathan Whitehorn return dialog_pause(t, 8594c8945a0SNathan Whitehorn av[1], 8604c8945a0SNathan Whitehorn numeric_arg(av, 2), 8614c8945a0SNathan Whitehorn numeric_arg(av, 3), 8624c8945a0SNathan Whitehorn numeric_arg(av, 4)); 8634c8945a0SNathan Whitehorn } 8644c8945a0SNathan Whitehorn #endif 8654c8945a0SNathan Whitehorn 8664c8945a0SNathan Whitehorn #ifdef HAVE_MIXEDGAUGE 8674c8945a0SNathan Whitehorn static int 8684c8945a0SNathan Whitehorn call_mixed_gauge(CALLARGS) 8694c8945a0SNathan Whitehorn { 8704c8945a0SNathan Whitehorn #define MIXEDGAUGE_BASE 5 8714c8945a0SNathan Whitehorn int tags = howmany_tags(av + MIXEDGAUGE_BASE, MIXEDGAUGE_TAGS); 8724c8945a0SNathan Whitehorn *offset_add = MIXEDGAUGE_BASE + tags * MIXEDGAUGE_TAGS; 8734c8945a0SNathan Whitehorn return dialog_mixedgauge(t, 8744c8945a0SNathan Whitehorn av[1], 8754c8945a0SNathan Whitehorn numeric_arg(av, 2), 8764c8945a0SNathan Whitehorn numeric_arg(av, 3), 8774c8945a0SNathan Whitehorn numeric_arg(av, 4), 8784c8945a0SNathan Whitehorn tags, av + MIXEDGAUGE_BASE); 8794c8945a0SNathan Whitehorn } 8804c8945a0SNathan Whitehorn #endif 8814c8945a0SNathan Whitehorn 882682c9e0fSNathan Whitehorn #ifdef HAVE_DLG_GAUGE 8837a1c0d96SNathan Whitehorn static int 8847a1c0d96SNathan Whitehorn call_prgbox(CALLARGS) 8857a1c0d96SNathan Whitehorn { 8867a1c0d96SNathan Whitehorn *offset_add = arg_rest(av); 8877a1c0d96SNathan Whitehorn /* the original version does not accept a prompt string, but for 8887a1c0d96SNathan Whitehorn * consistency we allow it. 8897a1c0d96SNathan Whitehorn */ 8907a1c0d96SNathan Whitehorn return ((*offset_add == 5) 8917a1c0d96SNathan Whitehorn ? dialog_prgbox(t, 8927a1c0d96SNathan Whitehorn av[1], 8937a1c0d96SNathan Whitehorn av[2], 8947a1c0d96SNathan Whitehorn numeric_arg(av, 3), 8957a1c0d96SNathan Whitehorn numeric_arg(av, 4), TRUE) 8967a1c0d96SNathan Whitehorn : dialog_prgbox(t, 8977a1c0d96SNathan Whitehorn "", 8987a1c0d96SNathan Whitehorn av[1], 8997a1c0d96SNathan Whitehorn numeric_arg(av, 2), 9007a1c0d96SNathan Whitehorn numeric_arg(av, 3), TRUE)); 9017a1c0d96SNathan Whitehorn } 902682c9e0fSNathan Whitehorn #endif 9037a1c0d96SNathan Whitehorn 9047a1c0d96SNathan Whitehorn #ifdef HAVE_DLG_GAUGE 9057a1c0d96SNathan Whitehorn static int 9067a1c0d96SNathan Whitehorn call_programbox(CALLARGS) 9077a1c0d96SNathan Whitehorn { 9087a1c0d96SNathan Whitehorn int result; 9097a1c0d96SNathan Whitehorn 9107a1c0d96SNathan Whitehorn *offset_add = arg_rest(av); 9117a1c0d96SNathan Whitehorn /* this function is a compromise between --prgbox and --progressbox. 9127a1c0d96SNathan Whitehorn */ 9137a1c0d96SNathan Whitehorn result = ((*offset_add == 4) 9147a1c0d96SNathan Whitehorn ? dlg_progressbox(t, 9157a1c0d96SNathan Whitehorn av[1], 9167a1c0d96SNathan Whitehorn numeric_arg(av, 2), 9177a1c0d96SNathan Whitehorn numeric_arg(av, 3), 9187a1c0d96SNathan Whitehorn TRUE, 9197a1c0d96SNathan Whitehorn dialog_state.pipe_input) 9207a1c0d96SNathan Whitehorn : dlg_progressbox(t, 9217a1c0d96SNathan Whitehorn "", 9227a1c0d96SNathan Whitehorn numeric_arg(av, 1), 9237a1c0d96SNathan Whitehorn numeric_arg(av, 2), 9247a1c0d96SNathan Whitehorn TRUE, 9257a1c0d96SNathan Whitehorn dialog_state.pipe_input)); 9267a1c0d96SNathan Whitehorn dialog_state.pipe_input = 0; 9277a1c0d96SNathan Whitehorn return result; 9287a1c0d96SNathan Whitehorn } 9297a1c0d96SNathan Whitehorn #endif 9307a1c0d96SNathan Whitehorn 9314c8945a0SNathan Whitehorn #ifdef HAVE_DLG_GAUGE 9324c8945a0SNathan Whitehorn static int 9334c8945a0SNathan Whitehorn call_progressbox(CALLARGS) 9344c8945a0SNathan Whitehorn { 9354c8945a0SNathan Whitehorn *offset_add = arg_rest(av); 9364c8945a0SNathan Whitehorn /* the original version does not accept a prompt string, but for 9374c8945a0SNathan Whitehorn * consistency we allow it. 9384c8945a0SNathan Whitehorn */ 9394c8945a0SNathan Whitehorn return ((*offset_add == 4) 9404c8945a0SNathan Whitehorn ? dialog_progressbox(t, 9414c8945a0SNathan Whitehorn av[1], 9424c8945a0SNathan Whitehorn numeric_arg(av, 2), 9434c8945a0SNathan Whitehorn numeric_arg(av, 3)) 9444c8945a0SNathan Whitehorn : dialog_progressbox(t, 9454c8945a0SNathan Whitehorn "", 9464c8945a0SNathan Whitehorn numeric_arg(av, 1), 9474c8945a0SNathan Whitehorn numeric_arg(av, 2))); 9484c8945a0SNathan Whitehorn } 9494c8945a0SNathan Whitehorn #endif 9504c8945a0SNathan Whitehorn 9514c8945a0SNathan Whitehorn #ifdef HAVE_DLG_TAILBOX 9524c8945a0SNathan Whitehorn static int 9534c8945a0SNathan Whitehorn call_tailbox(CALLARGS) 9544c8945a0SNathan Whitehorn { 9554c8945a0SNathan Whitehorn *offset_add = 4; 9564c8945a0SNathan Whitehorn return dialog_tailbox(t, 9574c8945a0SNathan Whitehorn av[1], 9584c8945a0SNathan Whitehorn numeric_arg(av, 2), 9594c8945a0SNathan Whitehorn numeric_arg(av, 3), 9604c8945a0SNathan Whitehorn FALSE); 9614c8945a0SNathan Whitehorn } 9624c8945a0SNathan Whitehorn 9634c8945a0SNathan Whitehorn static int 9644c8945a0SNathan Whitehorn call_tailboxbg(CALLARGS) 9654c8945a0SNathan Whitehorn { 9664c8945a0SNathan Whitehorn *offset_add = 4; 9674c8945a0SNathan Whitehorn return dialog_tailbox(t, 9684c8945a0SNathan Whitehorn av[1], 9694c8945a0SNathan Whitehorn numeric_arg(av, 2), 9704c8945a0SNathan Whitehorn numeric_arg(av, 3), 9714c8945a0SNathan Whitehorn TRUE); 9724c8945a0SNathan Whitehorn } 9734c8945a0SNathan Whitehorn #endif 9744c8945a0SNathan Whitehorn /* *INDENT-OFF* */ 9754c8945a0SNathan Whitehorn static const Mode modes[] = 9764c8945a0SNathan Whitehorn { 9774c8945a0SNathan Whitehorn {o_yesno, 4, 4, call_yesno}, 9784c8945a0SNathan Whitehorn {o_msgbox, 4, 4, call_msgbox}, 9794c8945a0SNathan Whitehorn {o_infobox, 4, 4, call_infobox}, 9804c8945a0SNathan Whitehorn {o_textbox, 4, 4, call_textbox}, 9814c8945a0SNathan Whitehorn {o_menu, 7, 0, call_menu}, 9824c8945a0SNathan Whitehorn {o_inputmenu, 7, 0, call_inputmenu}, 9834c8945a0SNathan Whitehorn {o_checklist, 8, 0, call_checklist}, 9844c8945a0SNathan Whitehorn {o_radiolist, 8, 0, call_radiolist}, 9854c8945a0SNathan Whitehorn {o_inputbox, 4, 5, call_inputbox}, 9864c8945a0SNathan Whitehorn {o_passwordbox, 4, 5, call_passwordbox}, 9874c8945a0SNathan Whitehorn #ifdef HAVE_DLG_GAUGE 9884c8945a0SNathan Whitehorn {o_gauge, 4, 5, call_gauge}, 9894c8945a0SNathan Whitehorn {o_pause, 5, 5, call_pause}, 9907a1c0d96SNathan Whitehorn {o_prgbox, 4, 5, call_prgbox}, 9917a1c0d96SNathan Whitehorn {o_programbox, 3, 4, call_programbox}, 9924c8945a0SNathan Whitehorn {o_progressbox, 3, 4, call_progressbox}, 9934c8945a0SNathan Whitehorn #endif 9944c8945a0SNathan Whitehorn #ifdef HAVE_DLG_FORMBOX 9954c8945a0SNathan Whitehorn {o_passwordform, 13, 0, call_password_form}, 9964c8945a0SNathan Whitehorn {o_form, 13, 0, call_form}, 9974c8945a0SNathan Whitehorn #endif 9984c8945a0SNathan Whitehorn #ifdef HAVE_MIXEDGAUGE 9994c8945a0SNathan Whitehorn {o_mixedgauge, MIXEDGAUGE_BASE, 0, call_mixed_gauge}, 10004c8945a0SNathan Whitehorn #endif 10014c8945a0SNathan Whitehorn #ifdef HAVE_DLG_MIXEDFORM 10024c8945a0SNathan Whitehorn {o_mixedform, 13, 0, call_mixed_form}, 10034c8945a0SNathan Whitehorn #endif 10044c8945a0SNathan Whitehorn #ifdef HAVE_DLG_TAILBOX 10054c8945a0SNathan Whitehorn {o_tailbox, 4, 4, call_tailbox}, 10064c8945a0SNathan Whitehorn {o_tailboxbg, 4, 4, call_tailboxbg}, 10074c8945a0SNathan Whitehorn #endif 10084c8945a0SNathan Whitehorn #ifdef HAVE_XDIALOG 10094c8945a0SNathan Whitehorn {o_calendar, 4, 7, call_calendar}, 10104c8945a0SNathan Whitehorn {o_dselect, 4, 5, call_dselect}, 10114c8945a0SNathan Whitehorn {o_editbox, 4, 4, call_editbox}, 10124c8945a0SNathan Whitehorn {o_fselect, 4, 5, call_fselect}, 10134c8945a0SNathan Whitehorn {o_timebox, 4, 7, call_timebox}, 10144c8945a0SNathan Whitehorn #endif 10154c8945a0SNathan Whitehorn }; 10164c8945a0SNathan Whitehorn /* *INDENT-ON* */ 10174c8945a0SNathan Whitehorn 10184c8945a0SNathan Whitehorn static char * 10194c8945a0SNathan Whitehorn optionString(char **argv, int *num) 10204c8945a0SNathan Whitehorn { 10214c8945a0SNathan Whitehorn int next = *num + 1; 10224c8945a0SNathan Whitehorn char *result = argv[next]; 10234c8945a0SNathan Whitehorn if (result == 0) { 10244c8945a0SNathan Whitehorn char temp[80]; 10254c8945a0SNathan Whitehorn sprintf(temp, "Expected a string-parameter for %.20s", argv[*num]); 10264c8945a0SNathan Whitehorn Usage(temp); 10274c8945a0SNathan Whitehorn } 10284c8945a0SNathan Whitehorn *num = next; 10294c8945a0SNathan Whitehorn return result; 10304c8945a0SNathan Whitehorn } 10314c8945a0SNathan Whitehorn 10324c8945a0SNathan Whitehorn static int 10334c8945a0SNathan Whitehorn optionValue(char **argv, int *num) 10344c8945a0SNathan Whitehorn { 10354c8945a0SNathan Whitehorn int next = *num + 1; 10364c8945a0SNathan Whitehorn char *src = argv[next]; 10374c8945a0SNathan Whitehorn char *tmp = 0; 10384c8945a0SNathan Whitehorn int result = 0; 10394c8945a0SNathan Whitehorn 10404c8945a0SNathan Whitehorn if (src != 0) { 10417a1c0d96SNathan Whitehorn result = (int) strtol(src, &tmp, 0); 10424c8945a0SNathan Whitehorn if (tmp == 0 || *tmp != 0) 10434c8945a0SNathan Whitehorn src = 0; 10444c8945a0SNathan Whitehorn } 10454c8945a0SNathan Whitehorn 10464c8945a0SNathan Whitehorn if (src == 0) { 10474c8945a0SNathan Whitehorn char temp[80]; 10484c8945a0SNathan Whitehorn sprintf(temp, "Expected a numeric-parameter for %.20s", argv[*num]); 10494c8945a0SNathan Whitehorn Usage(temp); 10504c8945a0SNathan Whitehorn } 10514c8945a0SNathan Whitehorn *num = next; 10524c8945a0SNathan Whitehorn return result; 10534c8945a0SNathan Whitehorn } 10544c8945a0SNathan Whitehorn 10554c8945a0SNathan Whitehorn /* 10564c8945a0SNathan Whitehorn * Print parts of a message 10574c8945a0SNathan Whitehorn */ 10584c8945a0SNathan Whitehorn static void 10594c8945a0SNathan Whitehorn PrintList(const char *const *list) 10604c8945a0SNathan Whitehorn { 10614c8945a0SNathan Whitehorn const char *leaf = strrchr(program, '/'); 10624c8945a0SNathan Whitehorn unsigned n = 0; 10634c8945a0SNathan Whitehorn 10644c8945a0SNathan Whitehorn if (leaf != 0) 10654c8945a0SNathan Whitehorn leaf++; 10664c8945a0SNathan Whitehorn else 10674c8945a0SNathan Whitehorn leaf = program; 10684c8945a0SNathan Whitehorn 10694c8945a0SNathan Whitehorn while (*list != 0) { 10704c8945a0SNathan Whitehorn fprintf(dialog_state.output, *list, n ? leaf : dialog_version()); 10714c8945a0SNathan Whitehorn (void) fputc('\n', dialog_state.output); 10724c8945a0SNathan Whitehorn n = 1; 10734c8945a0SNathan Whitehorn list++; 10744c8945a0SNathan Whitehorn } 10754c8945a0SNathan Whitehorn } 10764c8945a0SNathan Whitehorn 10774c8945a0SNathan Whitehorn static const Mode * 10784c8945a0SNathan Whitehorn lookupMode(eOptions code) 10794c8945a0SNathan Whitehorn { 10804c8945a0SNathan Whitehorn const Mode *modePtr = 0; 10814c8945a0SNathan Whitehorn unsigned n; 10824c8945a0SNathan Whitehorn 10834c8945a0SNathan Whitehorn for (n = 0; n < sizeof(modes) / sizeof(modes[0]); n++) { 10844c8945a0SNathan Whitehorn if (modes[n].code == code) { 10854c8945a0SNathan Whitehorn modePtr = &modes[n]; 10864c8945a0SNathan Whitehorn break; 10874c8945a0SNathan Whitehorn } 10884c8945a0SNathan Whitehorn } 10894c8945a0SNathan Whitehorn return modePtr; 10904c8945a0SNathan Whitehorn } 10914c8945a0SNathan Whitehorn 10924c8945a0SNathan Whitehorn static int 10934c8945a0SNathan Whitehorn compare_opts(const void *a, const void *b) 10944c8945a0SNathan Whitehorn { 10954c8945a0SNathan Whitehorn Options *const *p = (Options * const *) a; 10964c8945a0SNathan Whitehorn Options *const *q = (Options * const *) b; 10974c8945a0SNathan Whitehorn return strcmp((*p)->name, (*q)->name); 10984c8945a0SNathan Whitehorn } 10994c8945a0SNathan Whitehorn 11004c8945a0SNathan Whitehorn /* 1101682c9e0fSNathan Whitehorn * Print program's version. 1102682c9e0fSNathan Whitehorn */ 1103682c9e0fSNathan Whitehorn static void 1104682c9e0fSNathan Whitehorn PrintVersion(FILE *fp) 1105682c9e0fSNathan Whitehorn { 1106682c9e0fSNathan Whitehorn fprintf(fp, "Version: %s\n", dialog_version()); 1107682c9e0fSNathan Whitehorn } 1108682c9e0fSNathan Whitehorn 1109682c9e0fSNathan Whitehorn /* 11104c8945a0SNathan Whitehorn * Print program help-message 11114c8945a0SNathan Whitehorn */ 11124c8945a0SNathan Whitehorn static void 11134c8945a0SNathan Whitehorn Help(void) 11144c8945a0SNathan Whitehorn { 11154c8945a0SNathan Whitehorn static const char *const tbl_1[] = 11164c8945a0SNathan Whitehorn { 11174c8945a0SNathan Whitehorn "cdialog (ComeOn Dialog!) version %s", 11187a1c0d96SNathan Whitehorn "Copyright 2000-2008,2011 Thomas E. Dickey", 11194c8945a0SNathan Whitehorn "This is free software; see the source for copying conditions. There is NO", 11204c8945a0SNathan Whitehorn "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.", 11214c8945a0SNathan Whitehorn "", 11224c8945a0SNathan Whitehorn "* Display dialog boxes from shell scripts *", 11234c8945a0SNathan Whitehorn "", 11244c8945a0SNathan Whitehorn "Usage: %s <options> { --and-widget <options> }", 11254c8945a0SNathan Whitehorn "where options are \"common\" options, followed by \"box\" options", 11264c8945a0SNathan Whitehorn "", 11274c8945a0SNathan Whitehorn #ifdef HAVE_RC_FILE 11284c8945a0SNathan Whitehorn "Special options:", 11294c8945a0SNathan Whitehorn " [--create-rc \"file\"]", 11304c8945a0SNathan Whitehorn #endif 11314c8945a0SNathan Whitehorn 0 11324c8945a0SNathan Whitehorn }, *const tbl_3[] = 11334c8945a0SNathan Whitehorn { 11344c8945a0SNathan Whitehorn "", 11354c8945a0SNathan Whitehorn "Auto-size with height and width = 0. Maximize with height and width = -1.", 11364c8945a0SNathan Whitehorn "Global-auto-size if also menu_height/list_height = 0.", 11374c8945a0SNathan Whitehorn 0 11384c8945a0SNathan Whitehorn }; 11397a1c0d96SNathan Whitehorn size_t limit = sizeof(options) / sizeof(options[0]); 11407a1c0d96SNathan Whitehorn size_t j, k; 11414c8945a0SNathan Whitehorn const Options **opts; 11424c8945a0SNathan Whitehorn 1143682c9e0fSNathan Whitehorn end_dialog(); 1144682c9e0fSNathan Whitehorn dialog_state.output = stdout; 1145682c9e0fSNathan Whitehorn 11464c8945a0SNathan Whitehorn opts = dlg_calloc(const Options *, limit); 11474c8945a0SNathan Whitehorn assert_ptr(opts, "Help"); 11484c8945a0SNathan Whitehorn for (j = 0; j < limit; ++j) { 11494c8945a0SNathan Whitehorn opts[j] = &(options[j]); 11504c8945a0SNathan Whitehorn } 11514c8945a0SNathan Whitehorn qsort(opts, limit, sizeof(Options *), compare_opts); 11524c8945a0SNathan Whitehorn 11534c8945a0SNathan Whitehorn PrintList(tbl_1); 11544c8945a0SNathan Whitehorn fprintf(dialog_state.output, "Common options:\n "); 11554c8945a0SNathan Whitehorn for (j = k = 0; j < limit; j++) { 11564c8945a0SNathan Whitehorn if ((opts[j]->pass & 1) 11574c8945a0SNathan Whitehorn && opts[j]->help != 0) { 11587a1c0d96SNathan Whitehorn size_t len = 6 + strlen(opts[j]->name) + strlen(opts[j]->help); 11594c8945a0SNathan Whitehorn k += len; 11604c8945a0SNathan Whitehorn if (k > 75) { 11614c8945a0SNathan Whitehorn fprintf(dialog_state.output, "\n "); 11624c8945a0SNathan Whitehorn k = len; 11634c8945a0SNathan Whitehorn } 11644c8945a0SNathan Whitehorn fprintf(dialog_state.output, " [--%s%s%s]", opts[j]->name, 11654c8945a0SNathan Whitehorn *(opts[j]->help) ? " " : "", opts[j]->help); 11664c8945a0SNathan Whitehorn } 11674c8945a0SNathan Whitehorn } 11684c8945a0SNathan Whitehorn fprintf(dialog_state.output, "\nBox options:\n"); 11694c8945a0SNathan Whitehorn for (j = 0; j < limit; j++) { 11704c8945a0SNathan Whitehorn if ((opts[j]->pass & 2) != 0 11714c8945a0SNathan Whitehorn && opts[j]->help != 0 11724c8945a0SNathan Whitehorn && lookupMode(opts[j]->code)) 11734c8945a0SNathan Whitehorn fprintf(dialog_state.output, " --%-12s %s\n", opts[j]->name, 11744c8945a0SNathan Whitehorn opts[j]->help); 11754c8945a0SNathan Whitehorn } 11764c8945a0SNathan Whitehorn PrintList(tbl_3); 11774c8945a0SNathan Whitehorn 11784c8945a0SNathan Whitehorn free(opts); 11794c8945a0SNathan Whitehorn dlg_exit(DLG_EXIT_OK); 11804c8945a0SNathan Whitehorn } 11814c8945a0SNathan Whitehorn 11824c8945a0SNathan Whitehorn /* 11834c8945a0SNathan Whitehorn * "Common" options apply to all widgets more/less. Most of the common options 11844c8945a0SNathan Whitehorn * set values in dialog_vars, a few set dialog_state and a couple write to the 11854c8945a0SNathan Whitehorn * output stream. 11864c8945a0SNathan Whitehorn */ 11874c8945a0SNathan Whitehorn static int 11884c8945a0SNathan Whitehorn process_common_options(int argc, char **argv, int offset, bool output) 11894c8945a0SNathan Whitehorn { 11907a1c0d96SNathan Whitehorn #ifdef HAVE_DLG_TRACE 11917a1c0d96SNathan Whitehorn int n; 11927a1c0d96SNathan Whitehorn #endif 11934c8945a0SNathan Whitehorn bool done = FALSE; 11944c8945a0SNathan Whitehorn 11954c8945a0SNathan Whitehorn while (offset < argc && !done) { /* Common options */ 11964c8945a0SNathan Whitehorn switch (lookupOption(argv[offset], 1)) { 11974c8945a0SNathan Whitehorn case o_title: 11984c8945a0SNathan Whitehorn dialog_vars.title = optionString(argv, &offset); 11994c8945a0SNathan Whitehorn break; 12004c8945a0SNathan Whitehorn case o_backtitle: 12014c8945a0SNathan Whitehorn dialog_vars.backtitle = optionString(argv, &offset); 12024c8945a0SNathan Whitehorn break; 12034c8945a0SNathan Whitehorn case o_separate_widget: 12044c8945a0SNathan Whitehorn dialog_state.separate_str = optionString(argv, &offset); 12054c8945a0SNathan Whitehorn break; 12064c8945a0SNathan Whitehorn case o_separate_output: 12074c8945a0SNathan Whitehorn dialog_vars.separate_output = TRUE; 12084c8945a0SNathan Whitehorn break; 12094c8945a0SNathan Whitehorn case o_colors: 12104c8945a0SNathan Whitehorn dialog_vars.colors = TRUE; 12114c8945a0SNathan Whitehorn break; 12124c8945a0SNathan Whitehorn case o_cr_wrap: 12134c8945a0SNathan Whitehorn dialog_vars.cr_wrap = TRUE; 12144c8945a0SNathan Whitehorn break; 1215682c9e0fSNathan Whitehorn case o_no_nl_expand: 1216682c9e0fSNathan Whitehorn dialog_vars.no_nl_expand = TRUE; 1217682c9e0fSNathan Whitehorn break; 12184c8945a0SNathan Whitehorn case o_no_collapse: 12194c8945a0SNathan Whitehorn dialog_vars.nocollapse = TRUE; 12204c8945a0SNathan Whitehorn break; 12214c8945a0SNathan Whitehorn case o_no_kill: 12224c8945a0SNathan Whitehorn dialog_vars.cant_kill = TRUE; 12234c8945a0SNathan Whitehorn break; 12244c8945a0SNathan Whitehorn case o_nocancel: 12254c8945a0SNathan Whitehorn dialog_vars.nocancel = TRUE; 12264c8945a0SNathan Whitehorn break; 12274c8945a0SNathan Whitehorn case o_nook: 12284c8945a0SNathan Whitehorn dialog_vars.nook = TRUE; 12294c8945a0SNathan Whitehorn break; 12304c8945a0SNathan Whitehorn case o_quoted: 12314c8945a0SNathan Whitehorn dialog_vars.quoted = TRUE; 12324c8945a0SNathan Whitehorn break; 12334c8945a0SNathan Whitehorn case o_single_quoted: 12344c8945a0SNathan Whitehorn dialog_vars.single_quoted = TRUE; 12354c8945a0SNathan Whitehorn break; 12364c8945a0SNathan Whitehorn case o_size_err: 12374c8945a0SNathan Whitehorn dialog_vars.size_err = TRUE; 12384c8945a0SNathan Whitehorn break; 12394c8945a0SNathan Whitehorn case o_beep: 12404c8945a0SNathan Whitehorn dialog_vars.beep_signal = TRUE; 12414c8945a0SNathan Whitehorn break; 12424c8945a0SNathan Whitehorn case o_beep_after: 12434c8945a0SNathan Whitehorn dialog_vars.beep_after_signal = TRUE; 12444c8945a0SNathan Whitehorn break; 12454c8945a0SNathan Whitehorn case o_scrollbar: 12464c8945a0SNathan Whitehorn dialog_state.use_scrollbar = TRUE; 12474c8945a0SNathan Whitehorn break; 12484c8945a0SNathan Whitehorn case o_shadow: 12494c8945a0SNathan Whitehorn dialog_state.use_shadow = TRUE; 12504c8945a0SNathan Whitehorn break; 12514c8945a0SNathan Whitehorn case o_defaultno: 12524c8945a0SNathan Whitehorn dialog_vars.defaultno = TRUE; 12534c8945a0SNathan Whitehorn break; 12544c8945a0SNathan Whitehorn case o_default_item: 12554c8945a0SNathan Whitehorn dialog_vars.default_item = optionString(argv, &offset); 12564c8945a0SNathan Whitehorn break; 12574c8945a0SNathan Whitehorn case o_insecure: 12584c8945a0SNathan Whitehorn dialog_vars.insecure = TRUE; 12594c8945a0SNathan Whitehorn break; 12604c8945a0SNathan Whitehorn case o_item_help: 12614c8945a0SNathan Whitehorn dialog_vars.item_help = TRUE; 12624c8945a0SNathan Whitehorn break; 1263682c9e0fSNathan Whitehorn case o_help_line: 1264682c9e0fSNathan Whitehorn dialog_vars.help_line = optionString(argv, &offset); 1265682c9e0fSNathan Whitehorn break; 1266682c9e0fSNathan Whitehorn case o_help_file: 1267682c9e0fSNathan Whitehorn dialog_vars.help_file = optionString(argv, &offset); 1268682c9e0fSNathan Whitehorn break; 12694c8945a0SNathan Whitehorn case o_help_button: 12704c8945a0SNathan Whitehorn dialog_vars.help_button = TRUE; 12714c8945a0SNathan Whitehorn break; 12724c8945a0SNathan Whitehorn case o_help_status: 12734c8945a0SNathan Whitehorn dialog_vars.help_status = TRUE; 12744c8945a0SNathan Whitehorn break; 12754c8945a0SNathan Whitehorn case o_extra_button: 12764c8945a0SNathan Whitehorn dialog_vars.extra_button = TRUE; 12774c8945a0SNathan Whitehorn break; 12784c8945a0SNathan Whitehorn case o_ignore: 12794c8945a0SNathan Whitehorn ignore_unknown = TRUE; 12804c8945a0SNathan Whitehorn break; 12814c8945a0SNathan Whitehorn case o_keep_window: 12824c8945a0SNathan Whitehorn dialog_vars.keep_window = TRUE; 12834c8945a0SNathan Whitehorn break; 12844c8945a0SNathan Whitehorn case o_no_shadow: 12854c8945a0SNathan Whitehorn dialog_state.use_shadow = FALSE; 12864c8945a0SNathan Whitehorn break; 12874c8945a0SNathan Whitehorn case o_print_size: 12884c8945a0SNathan Whitehorn dialog_vars.print_siz = TRUE; 12894c8945a0SNathan Whitehorn break; 12904c8945a0SNathan Whitehorn case o_print_maxsize: 12914c8945a0SNathan Whitehorn if (output) { 12924c8945a0SNathan Whitehorn /* 12934c8945a0SNathan Whitehorn * If this is the last option, we do not want any error 12944c8945a0SNathan Whitehorn * messages - just our output. Calling end_dialog() cancels 12954c8945a0SNathan Whitehorn * the refresh() at the end of the program as well. 12964c8945a0SNathan Whitehorn */ 12974c8945a0SNathan Whitehorn if (argv[offset + 1] == 0) { 12984c8945a0SNathan Whitehorn ignore_unknown = TRUE; 12994c8945a0SNathan Whitehorn end_dialog(); 13004c8945a0SNathan Whitehorn } 13014c8945a0SNathan Whitehorn fflush(dialog_state.output); 13024c8945a0SNathan Whitehorn fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS); 13034c8945a0SNathan Whitehorn } 13044c8945a0SNathan Whitehorn break; 13054c8945a0SNathan Whitehorn case o_print_version: 13064c8945a0SNathan Whitehorn if (output) { 1307682c9e0fSNathan Whitehorn PrintVersion(dialog_state.output); 13084c8945a0SNathan Whitehorn } 13094c8945a0SNathan Whitehorn break; 13104c8945a0SNathan Whitehorn case o_separator: 13114c8945a0SNathan Whitehorn case o_output_separator: 13124c8945a0SNathan Whitehorn dialog_vars.output_separator = optionString(argv, &offset); 13134c8945a0SNathan Whitehorn break; 13144c8945a0SNathan Whitehorn case o_column_separator: 13154c8945a0SNathan Whitehorn dialog_vars.column_separator = optionString(argv, &offset); 13164c8945a0SNathan Whitehorn break; 13174c8945a0SNathan Whitehorn case o_tab_correct: 13184c8945a0SNathan Whitehorn dialog_vars.tab_correct = TRUE; 13194c8945a0SNathan Whitehorn break; 13204c8945a0SNathan Whitehorn case o_sleep: 13214c8945a0SNathan Whitehorn dialog_vars.sleep_secs = optionValue(argv, &offset); 13224c8945a0SNathan Whitehorn break; 13234c8945a0SNathan Whitehorn case o_timeout: 13244c8945a0SNathan Whitehorn dialog_vars.timeout_secs = optionValue(argv, &offset); 13254c8945a0SNathan Whitehorn break; 13264c8945a0SNathan Whitehorn case o_max_input: 13274c8945a0SNathan Whitehorn dialog_vars.max_input = optionValue(argv, &offset); 13284c8945a0SNathan Whitehorn break; 13294c8945a0SNathan Whitehorn case o_tab_len: 13304c8945a0SNathan Whitehorn dialog_state.tab_len = optionValue(argv, &offset); 13314c8945a0SNathan Whitehorn break; 13324c8945a0SNathan Whitehorn case o_trim: 13334c8945a0SNathan Whitehorn dialog_vars.trim_whitespace = TRUE; 13344c8945a0SNathan Whitehorn break; 13354c8945a0SNathan Whitehorn case o_visit_items: 13364c8945a0SNathan Whitehorn dialog_state.visit_items = TRUE; 13374c8945a0SNathan Whitehorn break; 13384c8945a0SNathan Whitehorn case o_aspect: 13394c8945a0SNathan Whitehorn dialog_state.aspect_ratio = optionValue(argv, &offset); 13404c8945a0SNathan Whitehorn break; 13414c8945a0SNathan Whitehorn case o_begin: 13424c8945a0SNathan Whitehorn dialog_vars.begin_set = TRUE; 13434c8945a0SNathan Whitehorn dialog_vars.begin_y = optionValue(argv, &offset); 13444c8945a0SNathan Whitehorn dialog_vars.begin_x = optionValue(argv, &offset); 13454c8945a0SNathan Whitehorn break; 13464c8945a0SNathan Whitehorn case o_clear: 13474c8945a0SNathan Whitehorn dialog_vars.dlg_clear_screen = TRUE; 13484c8945a0SNathan Whitehorn break; 13494c8945a0SNathan Whitehorn case o_yes_label: 13504c8945a0SNathan Whitehorn dialog_vars.yes_label = optionString(argv, &offset); 13514c8945a0SNathan Whitehorn break; 13524c8945a0SNathan Whitehorn case o_no_label: 13534c8945a0SNathan Whitehorn dialog_vars.no_label = optionString(argv, &offset); 13544c8945a0SNathan Whitehorn break; 13554c8945a0SNathan Whitehorn case o_ok_label: 13564c8945a0SNathan Whitehorn dialog_vars.ok_label = optionString(argv, &offset); 13574c8945a0SNathan Whitehorn break; 13584c8945a0SNathan Whitehorn case o_cancel_label: 13594c8945a0SNathan Whitehorn dialog_vars.cancel_label = optionString(argv, &offset); 13604c8945a0SNathan Whitehorn break; 13614c8945a0SNathan Whitehorn case o_extra_label: 13624c8945a0SNathan Whitehorn dialog_vars.extra_label = optionString(argv, &offset); 13634c8945a0SNathan Whitehorn break; 13644c8945a0SNathan Whitehorn case o_exit_label: 13654c8945a0SNathan Whitehorn dialog_vars.exit_label = optionString(argv, &offset); 13664c8945a0SNathan Whitehorn break; 13674c8945a0SNathan Whitehorn case o_help_label: 13684c8945a0SNathan Whitehorn dialog_vars.help_label = optionString(argv, &offset); 13694c8945a0SNathan Whitehorn break; 13704c8945a0SNathan Whitehorn case o_date_format: 13714c8945a0SNathan Whitehorn dialog_vars.date_format = optionString(argv, &offset); 13724c8945a0SNathan Whitehorn break; 13734c8945a0SNathan Whitehorn case o_time_format: 13744c8945a0SNathan Whitehorn dialog_vars.time_format = optionString(argv, &offset); 13754c8945a0SNathan Whitehorn break; 13764c8945a0SNathan Whitehorn case o_keep_tite: 13774c8945a0SNathan Whitehorn dialog_vars.keep_tite = TRUE; 13784c8945a0SNathan Whitehorn break; 13794c8945a0SNathan Whitehorn case o_ascii_lines: 13804c8945a0SNathan Whitehorn dialog_vars.ascii_lines = TRUE; 13814c8945a0SNathan Whitehorn dialog_vars.no_lines = FALSE; 13824c8945a0SNathan Whitehorn break; 13834c8945a0SNathan Whitehorn case o_no_lines: 13844c8945a0SNathan Whitehorn dialog_vars.no_lines = TRUE; 13854c8945a0SNathan Whitehorn dialog_vars.ascii_lines = FALSE; 13864c8945a0SNathan Whitehorn break; 13877a1c0d96SNathan Whitehorn case o_no_mouse: 13887a1c0d96SNathan Whitehorn dialog_state.no_mouse = TRUE; 1389682c9e0fSNathan Whitehorn mouse_close(); 13907a1c0d96SNathan Whitehorn break; 13914c8945a0SNathan Whitehorn case o_noitem: 13924c8945a0SNathan Whitehorn case o_fullbutton: 13934c8945a0SNathan Whitehorn /* ignore */ 13944c8945a0SNathan Whitehorn break; 13954c8945a0SNathan Whitehorn /* options of Xdialog which we ignore */ 13964c8945a0SNathan Whitehorn case o_icon: 13974c8945a0SNathan Whitehorn case o_wmclass: 13984c8945a0SNathan Whitehorn (void) optionString(argv, &offset); 13994c8945a0SNathan Whitehorn /* FALLTHRU */ 14004c8945a0SNathan Whitehorn case o_allow_close: 14014c8945a0SNathan Whitehorn case o_auto_placement: 14024c8945a0SNathan Whitehorn case o_fixed_font: 14034c8945a0SNathan Whitehorn case o_keep_colors: 14044c8945a0SNathan Whitehorn case o_no_close: 14054c8945a0SNathan Whitehorn case o_no_cr_wrap: 14064c8945a0SNathan Whitehorn case o_screen_center: 14074c8945a0SNathan Whitehorn case o_smooth: 14084c8945a0SNathan Whitehorn case o_under_mouse: 14094c8945a0SNathan Whitehorn break; 14104c8945a0SNathan Whitehorn case o_unknown: 14114c8945a0SNathan Whitehorn if (ignore_unknown) 14124c8945a0SNathan Whitehorn break; 14134c8945a0SNathan Whitehorn /* FALLTHRU */ 14144c8945a0SNathan Whitehorn default: /* no more common options */ 14154c8945a0SNathan Whitehorn done = TRUE; 14164c8945a0SNathan Whitehorn break; 14174c8945a0SNathan Whitehorn #ifdef HAVE_DLG_TRACE 14184c8945a0SNathan Whitehorn case o_trace: 14194c8945a0SNathan Whitehorn dlg_trace(optionString(argv, &offset)); 14207a1c0d96SNathan Whitehorn for (n = 0; argv[n] != 0; ++n) { 14217a1c0d96SNathan Whitehorn dlg_trace_msg("argv[%d] = %s\n", n, argv[n]); 14227a1c0d96SNathan Whitehorn } 14234c8945a0SNathan Whitehorn break; 14244c8945a0SNathan Whitehorn #endif 14254c8945a0SNathan Whitehorn } 14264c8945a0SNathan Whitehorn if (!done) 14274c8945a0SNathan Whitehorn offset++; 14284c8945a0SNathan Whitehorn } 14294c8945a0SNathan Whitehorn return offset; 14304c8945a0SNathan Whitehorn } 14314c8945a0SNathan Whitehorn 14324c8945a0SNathan Whitehorn /* 14334c8945a0SNathan Whitehorn * Initialize options at the start of a series of common options culminating 14344c8945a0SNathan Whitehorn * in a widget. 14354c8945a0SNathan Whitehorn */ 14364c8945a0SNathan Whitehorn static void 14374c8945a0SNathan Whitehorn init_result(char *buffer) 14384c8945a0SNathan Whitehorn { 14394c8945a0SNathan Whitehorn static bool first = TRUE; 14404c8945a0SNathan Whitehorn static char **special_argv = 0; 14414c8945a0SNathan Whitehorn static int special_argc = 0; 14424c8945a0SNathan Whitehorn 14434c8945a0SNathan Whitehorn /* clear everything we do not save for the next widget */ 14444c8945a0SNathan Whitehorn memset(&dialog_vars, 0, sizeof(dialog_vars)); 14454c8945a0SNathan Whitehorn 14464c8945a0SNathan Whitehorn dialog_vars.input_result = buffer; 14474c8945a0SNathan Whitehorn dialog_vars.input_result[0] = '\0'; 14484c8945a0SNathan Whitehorn 14494c8945a0SNathan Whitehorn /* 14504c8945a0SNathan Whitehorn * The first time this is called, check for common options given by an 14514c8945a0SNathan Whitehorn * environment variable. 14524c8945a0SNathan Whitehorn */ 14534c8945a0SNathan Whitehorn if (first) { 14544c8945a0SNathan Whitehorn char *env = getenv("DIALOGOPTS"); 14554c8945a0SNathan Whitehorn if (env != 0) 14564c8945a0SNathan Whitehorn env = dlg_strclone(env); 14574c8945a0SNathan Whitehorn if (env != 0) { 14587a1c0d96SNathan Whitehorn special_argv = dlg_string_to_argv(env); 14597a1c0d96SNathan Whitehorn special_argc = dlg_count_argv(special_argv); 14604c8945a0SNathan Whitehorn } 14614c8945a0SNathan Whitehorn } 14624c8945a0SNathan Whitehorn if (special_argv != 0) { 14634c8945a0SNathan Whitehorn process_common_options(special_argc, special_argv, 0, FALSE); 14644c8945a0SNathan Whitehorn #ifdef NO_LEAKS 14654c8945a0SNathan Whitehorn free(special_argv[0]); 14664c8945a0SNathan Whitehorn free(special_argv); 14674c8945a0SNathan Whitehorn first = TRUE; 14684c8945a0SNathan Whitehorn #endif 14694c8945a0SNathan Whitehorn } 14704c8945a0SNathan Whitehorn } 14714c8945a0SNathan Whitehorn 14724c8945a0SNathan Whitehorn int 14734c8945a0SNathan Whitehorn main(int argc, char *argv[]) 14744c8945a0SNathan Whitehorn { 14754c8945a0SNathan Whitehorn char temp[256]; 14764c8945a0SNathan Whitehorn bool esc_pressed = FALSE; 14774c8945a0SNathan Whitehorn bool keep_tite = FALSE; 14784c8945a0SNathan Whitehorn int offset = 1; 14794c8945a0SNathan Whitehorn int offset_add; 14804c8945a0SNathan Whitehorn int retval = DLG_EXIT_OK; 14814c8945a0SNathan Whitehorn int j, have; 14824c8945a0SNathan Whitehorn eOptions code; 14834c8945a0SNathan Whitehorn const Mode *modePtr; 14844c8945a0SNathan Whitehorn char my_buffer[MAX_LEN + 1]; 14854c8945a0SNathan Whitehorn 14864c8945a0SNathan Whitehorn memset(&dialog_state, 0, sizeof(dialog_state)); 14874c8945a0SNathan Whitehorn memset(&dialog_vars, 0, sizeof(dialog_vars)); 14884c8945a0SNathan Whitehorn 14894c8945a0SNathan Whitehorn #if defined(ENABLE_NLS) 14904c8945a0SNathan Whitehorn /* initialize locale support */ 14914c8945a0SNathan Whitehorn setlocale(LC_ALL, ""); 14927a1c0d96SNathan Whitehorn bindtextdomain(NLS_TEXTDOMAIN, LOCALEDIR); 14937a1c0d96SNathan Whitehorn textdomain(NLS_TEXTDOMAIN); 14944c8945a0SNathan Whitehorn #elif defined(HAVE_SETLOCALE) 14954c8945a0SNathan Whitehorn (void) setlocale(LC_ALL, ""); 14964c8945a0SNathan Whitehorn #endif 14974c8945a0SNathan Whitehorn 14984c8945a0SNathan Whitehorn unescape_argv(&argc, &argv); 14994c8945a0SNathan Whitehorn program = argv[0]; 15004c8945a0SNathan Whitehorn dialog_state.output = stderr; 15014c8945a0SNathan Whitehorn dialog_state.input = stdin; 15024c8945a0SNathan Whitehorn 15034c8945a0SNathan Whitehorn /* 15044c8945a0SNathan Whitehorn * Look for the last --stdout, --stderr or --output-fd option, and use 15054c8945a0SNathan Whitehorn * that. We can only write to one of them. If --stdout is used, that 15064c8945a0SNathan Whitehorn * can interfere with initializing the curses library, so we want to 15074c8945a0SNathan Whitehorn * know explicitly if it is used. 1508682c9e0fSNathan Whitehorn * 1509682c9e0fSNathan Whitehorn * Also, look for any --version or --help message, processing those 1510682c9e0fSNathan Whitehorn * immediately. 15114c8945a0SNathan Whitehorn */ 15124c8945a0SNathan Whitehorn while (offset < argc) { 15134c8945a0SNathan Whitehorn int base = offset; 15144c8945a0SNathan Whitehorn switch (lookupOption(argv[offset], 7)) { 15154c8945a0SNathan Whitehorn case o_stdout: 15164c8945a0SNathan Whitehorn dialog_state.output = stdout; 15174c8945a0SNathan Whitehorn break; 15184c8945a0SNathan Whitehorn case o_stderr: 15194c8945a0SNathan Whitehorn dialog_state.output = stderr; 15204c8945a0SNathan Whitehorn break; 15214c8945a0SNathan Whitehorn case o_input_fd: 15224c8945a0SNathan Whitehorn if ((j = optionValue(argv, &offset)) < 0 15234c8945a0SNathan Whitehorn || (dialog_state.input = fdopen(j, "r")) == 0) 15244c8945a0SNathan Whitehorn dlg_exiterr("Cannot open input-fd\n"); 15254c8945a0SNathan Whitehorn break; 15264c8945a0SNathan Whitehorn case o_output_fd: 15274c8945a0SNathan Whitehorn if ((j = optionValue(argv, &offset)) < 0 15284c8945a0SNathan Whitehorn || (dialog_state.output = fdopen(j, "w")) == 0) 15294c8945a0SNathan Whitehorn dlg_exiterr("Cannot open output-fd\n"); 15304c8945a0SNathan Whitehorn break; 15314c8945a0SNathan Whitehorn case o_keep_tite: 15324c8945a0SNathan Whitehorn keep_tite = TRUE; 15334c8945a0SNathan Whitehorn break; 1534682c9e0fSNathan Whitehorn case o_version: 1535682c9e0fSNathan Whitehorn dialog_state.output = stdout; 1536682c9e0fSNathan Whitehorn PrintVersion(dialog_state.output); 1537682c9e0fSNathan Whitehorn exit(DLG_EXIT_OK); 1538682c9e0fSNathan Whitehorn break; 1539682c9e0fSNathan Whitehorn case o_help: 1540682c9e0fSNathan Whitehorn Help(); 1541682c9e0fSNathan Whitehorn break; 15424c8945a0SNathan Whitehorn default: 15434c8945a0SNathan Whitehorn ++offset; 15444c8945a0SNathan Whitehorn continue; 15454c8945a0SNathan Whitehorn } 15464c8945a0SNathan Whitehorn for (j = base; j < argc; ++j) { 15474c8945a0SNathan Whitehorn dialog_argv[j] = dialog_argv[j + 1 + (offset - base)]; 15484c8945a0SNathan Whitehorn if (dialog_opts != 0) 15494c8945a0SNathan Whitehorn dialog_opts[j] = dialog_opts[j + 1 + (offset - base)]; 15504c8945a0SNathan Whitehorn } 15514c8945a0SNathan Whitehorn argc -= (1 + offset - base); 15524c8945a0SNathan Whitehorn offset = base; 15534c8945a0SNathan Whitehorn } 15544c8945a0SNathan Whitehorn offset = 1; 15554c8945a0SNathan Whitehorn init_result(my_buffer); 15564c8945a0SNathan Whitehorn 1557682c9e0fSNathan Whitehorn /* 1558682c9e0fSNathan Whitehorn * Dialog's output may be redirected (see above). Handle the special 1559682c9e0fSNathan Whitehorn * case of options that only report information without interaction. 1560682c9e0fSNathan Whitehorn */ 1561682c9e0fSNathan Whitehorn if (argc == 2) { 15624c8945a0SNathan Whitehorn switch (lookupOption(argv[1], 7)) { 15634c8945a0SNathan Whitehorn case o_print_maxsize: 15644c8945a0SNathan Whitehorn (void) initscr(); 15654c8945a0SNathan Whitehorn endwin(); 15664c8945a0SNathan Whitehorn fflush(dialog_state.output); 15674c8945a0SNathan Whitehorn fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS); 15684c8945a0SNathan Whitehorn break; 15694c8945a0SNathan Whitehorn case o_print_version: 1570682c9e0fSNathan Whitehorn PrintVersion(dialog_state.output); 15714c8945a0SNathan Whitehorn break; 15724c8945a0SNathan Whitehorn case o_clear: 15734c8945a0SNathan Whitehorn initscr(); 15744c8945a0SNathan Whitehorn refresh(); 15754c8945a0SNathan Whitehorn endwin(); 15764c8945a0SNathan Whitehorn break; 15774c8945a0SNathan Whitehorn case o_ignore: 15784c8945a0SNathan Whitehorn break; 15794c8945a0SNathan Whitehorn default: 15804c8945a0SNathan Whitehorn Help(); 15814c8945a0SNathan Whitehorn break; 15824c8945a0SNathan Whitehorn } 15834c8945a0SNathan Whitehorn return DLG_EXIT_OK; 15844c8945a0SNathan Whitehorn } 15854c8945a0SNathan Whitehorn 15864c8945a0SNathan Whitehorn if (argc < 2) { 15874c8945a0SNathan Whitehorn Help(); 15884c8945a0SNathan Whitehorn } 15894c8945a0SNathan Whitehorn #ifdef HAVE_RC_FILE 15904c8945a0SNathan Whitehorn if (lookupOption(argv[1], 7) == o_create_rc) { 15914c8945a0SNathan Whitehorn if (argc != 3) { 15924c8945a0SNathan Whitehorn sprintf(temp, "Expected a filename for %.50s", argv[1]); 15934c8945a0SNathan Whitehorn Usage(temp); 15944c8945a0SNathan Whitehorn } 15954c8945a0SNathan Whitehorn if (dlg_parse_rc() == -1) /* Read the configuration file */ 15964c8945a0SNathan Whitehorn dlg_exiterr("dialog: dlg_parse_rc"); 15974c8945a0SNathan Whitehorn dlg_create_rc(argv[2]); 15984c8945a0SNathan Whitehorn return DLG_EXIT_OK; 15994c8945a0SNathan Whitehorn } 16004c8945a0SNathan Whitehorn #endif 16014c8945a0SNathan Whitehorn 16024c8945a0SNathan Whitehorn dialog_vars.keep_tite = keep_tite; /* init_result() cleared global */ 16034c8945a0SNathan Whitehorn 16044c8945a0SNathan Whitehorn init_dialog(dialog_state.input, dialog_state.output); 16054c8945a0SNathan Whitehorn 16064c8945a0SNathan Whitehorn while (offset < argc && !esc_pressed) { 16074c8945a0SNathan Whitehorn init_result(my_buffer); 16084c8945a0SNathan Whitehorn 16094c8945a0SNathan Whitehorn offset = process_common_options(argc, argv, offset, TRUE); 16104c8945a0SNathan Whitehorn 16114c8945a0SNathan Whitehorn if (argv[offset] == NULL) { 16124c8945a0SNathan Whitehorn if (ignore_unknown) 16134c8945a0SNathan Whitehorn break; 16144c8945a0SNathan Whitehorn Usage("Expected a box option"); 16154c8945a0SNathan Whitehorn } 16164c8945a0SNathan Whitehorn 16174c8945a0SNathan Whitehorn if (lookupOption(argv[offset], 2) != o_checklist 16184c8945a0SNathan Whitehorn && dialog_vars.separate_output) { 16194c8945a0SNathan Whitehorn sprintf(temp, "Expected --checklist, not %.20s", argv[offset]); 16204c8945a0SNathan Whitehorn Usage(temp); 16214c8945a0SNathan Whitehorn } 16224c8945a0SNathan Whitehorn 16234c8945a0SNathan Whitehorn if (dialog_state.aspect_ratio == 0) 16244c8945a0SNathan Whitehorn dialog_state.aspect_ratio = DEFAULT_ASPECT_RATIO; 16254c8945a0SNathan Whitehorn 16264c8945a0SNathan Whitehorn dlg_put_backtitle(); 16274c8945a0SNathan Whitehorn 16284c8945a0SNathan Whitehorn /* use a table to look for the requested mode, to avoid code duplication */ 16294c8945a0SNathan Whitehorn 16304c8945a0SNathan Whitehorn modePtr = 0; 16314c8945a0SNathan Whitehorn if ((code = lookupOption(argv[offset], 2)) != o_unknown) 16324c8945a0SNathan Whitehorn modePtr = lookupMode(code); 16334c8945a0SNathan Whitehorn if (modePtr == 0) { 16344c8945a0SNathan Whitehorn sprintf(temp, "%s option %.20s", 16354c8945a0SNathan Whitehorn lookupOption(argv[offset], 7) != o_unknown 16364c8945a0SNathan Whitehorn ? "Unexpected" 16374c8945a0SNathan Whitehorn : "Unknown", 16384c8945a0SNathan Whitehorn argv[offset]); 16394c8945a0SNathan Whitehorn Usage(temp); 16404c8945a0SNathan Whitehorn } 16414c8945a0SNathan Whitehorn 16424c8945a0SNathan Whitehorn have = arg_rest(&argv[offset]); 16434c8945a0SNathan Whitehorn if (have < modePtr->argmin) { 16444c8945a0SNathan Whitehorn sprintf(temp, "Expected at least %d tokens for %.20s, have %d", 16454c8945a0SNathan Whitehorn modePtr->argmin - 1, argv[offset], 16464c8945a0SNathan Whitehorn have - 1); 16474c8945a0SNathan Whitehorn Usage(temp); 16484c8945a0SNathan Whitehorn } 16494c8945a0SNathan Whitehorn if (modePtr->argmax && have > modePtr->argmax) { 16504c8945a0SNathan Whitehorn sprintf(temp, 16514c8945a0SNathan Whitehorn "Expected no more than %d tokens for %.20s, have %d", 16524c8945a0SNathan Whitehorn modePtr->argmax - 1, argv[offset], 16534c8945a0SNathan Whitehorn have - 1); 16544c8945a0SNathan Whitehorn Usage(temp); 16554c8945a0SNathan Whitehorn } 16564c8945a0SNathan Whitehorn 16574c8945a0SNathan Whitehorn /* 16584c8945a0SNathan Whitehorn * Trim whitespace from non-title option values, e.g., the ones that 16594c8945a0SNathan Whitehorn * will be used as captions or prompts. Do that only for the widget 16604c8945a0SNathan Whitehorn * we are about to process, since the "--trim" option is reset before 16614c8945a0SNathan Whitehorn * accumulating options for each widget. 16624c8945a0SNathan Whitehorn */ 16634c8945a0SNathan Whitehorn for (j = offset + 1; j <= offset + have; j++) { 16644c8945a0SNathan Whitehorn switch (lookupOption(argv[j - 1], 7)) { 16654c8945a0SNathan Whitehorn case o_unknown: 16664c8945a0SNathan Whitehorn case o_title: 16674c8945a0SNathan Whitehorn case o_backtitle: 1668682c9e0fSNathan Whitehorn case o_help_line: 1669682c9e0fSNathan Whitehorn case o_help_file: 16704c8945a0SNathan Whitehorn break; 16714c8945a0SNathan Whitehorn default: 16724c8945a0SNathan Whitehorn if (argv[j] != 0) { 16734c8945a0SNathan Whitehorn dlg_trim_string(argv[j]); 16744c8945a0SNathan Whitehorn } 16754c8945a0SNathan Whitehorn break; 16764c8945a0SNathan Whitehorn } 16774c8945a0SNathan Whitehorn } 16784c8945a0SNathan Whitehorn 16794c8945a0SNathan Whitehorn retval = show_result((*(modePtr->jumper)) (dialog_vars.title, 16804c8945a0SNathan Whitehorn argv + offset, 16814c8945a0SNathan Whitehorn &offset_add)); 16824c8945a0SNathan Whitehorn offset += offset_add; 16834c8945a0SNathan Whitehorn 16847a1c0d96SNathan Whitehorn if (dialog_vars.input_result != my_buffer) { 16854c8945a0SNathan Whitehorn free(dialog_vars.input_result); 16867a1c0d96SNathan Whitehorn dialog_vars.input_result = 0; 16877a1c0d96SNathan Whitehorn } 16884c8945a0SNathan Whitehorn 16894c8945a0SNathan Whitehorn if (retval == DLG_EXIT_ESC) { 16904c8945a0SNathan Whitehorn esc_pressed = TRUE; 16914c8945a0SNathan Whitehorn } else { 16924c8945a0SNathan Whitehorn 16934c8945a0SNathan Whitehorn if (dialog_vars.beep_after_signal) 16944c8945a0SNathan Whitehorn (void) beep(); 16954c8945a0SNathan Whitehorn 16964c8945a0SNathan Whitehorn if (dialog_vars.sleep_secs) 16974c8945a0SNathan Whitehorn (void) napms(dialog_vars.sleep_secs * 1000); 16984c8945a0SNathan Whitehorn 16994c8945a0SNathan Whitehorn if (offset < argc) { 17004c8945a0SNathan Whitehorn switch (lookupOption(argv[offset], 7)) { 17014c8945a0SNathan Whitehorn case o_and_widget: 17024c8945a0SNathan Whitehorn offset++; 17034c8945a0SNathan Whitehorn break; 17044c8945a0SNathan Whitehorn case o_unknown: 17054c8945a0SNathan Whitehorn sprintf(temp, "Expected --and-widget, not %.20s", 17064c8945a0SNathan Whitehorn argv[offset]); 17074c8945a0SNathan Whitehorn Usage(temp); 17084c8945a0SNathan Whitehorn break; 17094c8945a0SNathan Whitehorn default: 17104c8945a0SNathan Whitehorn /* if we got a cancel, etc., stop chaining */ 17114c8945a0SNathan Whitehorn if (retval != DLG_EXIT_OK) 17124c8945a0SNathan Whitehorn esc_pressed = TRUE; 17134c8945a0SNathan Whitehorn else 17144c8945a0SNathan Whitehorn dialog_vars.dlg_clear_screen = TRUE; 17154c8945a0SNathan Whitehorn break; 17164c8945a0SNathan Whitehorn } 17174c8945a0SNathan Whitehorn } 17184c8945a0SNathan Whitehorn if (dialog_vars.dlg_clear_screen) 17194c8945a0SNathan Whitehorn dlg_clear(); 17204c8945a0SNathan Whitehorn } 17214c8945a0SNathan Whitehorn } 17224c8945a0SNathan Whitehorn 17234c8945a0SNathan Whitehorn dlg_killall_bg(&retval); 17244c8945a0SNathan Whitehorn if (dialog_state.screen_initialized) { 17254c8945a0SNathan Whitehorn (void) refresh(); 17264c8945a0SNathan Whitehorn end_dialog(); 17274c8945a0SNathan Whitehorn } 17284c8945a0SNathan Whitehorn dlg_exit(retval); 17294c8945a0SNathan Whitehorn } 1730