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