1217309Snwhitehorn/*
2255852Sdteske * $Id: dialog.c,v 1.231 2013/09/02 17:20:09 tom Exp $
3217309Snwhitehorn *
4217309Snwhitehorn *  cdialog - Display simple dialog boxes from shell scripts
5217309Snwhitehorn *
6251843Sbapt *  Copyright 2000-2012,2013	Thomas E. Dickey
7217309Snwhitehorn *
8217309Snwhitehorn *  This program is free software; you can redistribute it and/or modify
9217309Snwhitehorn *  it under the terms of the GNU Lesser General Public License, version 2.1
10217309Snwhitehorn *  as published by the Free Software Foundation.
11217309Snwhitehorn *
12217309Snwhitehorn *  This program is distributed in the hope that it will be useful, but
13217309Snwhitehorn *  WITHOUT ANY WARRANTY; without even the implied warranty of
14217309Snwhitehorn *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15217309Snwhitehorn *  Lesser General Public License for more details.
16217309Snwhitehorn *
17217309Snwhitehorn *  You should have received a copy of the GNU Lesser General Public
18217309Snwhitehorn *  License along with this program; if not, write to
19217309Snwhitehorn *	Free Software Foundation, Inc.
20217309Snwhitehorn *	51 Franklin St., Fifth Floor
21217309Snwhitehorn *	Boston, MA 02110, USA.
22217309Snwhitehorn *
23217309Snwhitehorn *  An earlier version of this program lists as authors
24217309Snwhitehorn *	Savio Lam (lam836@cs.cuhk.hk)
25217309Snwhitehorn */
26217309Snwhitehorn
27217309Snwhitehorn#include <dialog.h>
28217309Snwhitehorn#include <string.h>
29217309Snwhitehorn#include <sys/types.h>
30217309Snwhitehorn#include <sys/stat.h>
31217309Snwhitehorn
32217309Snwhitehorn#ifdef HAVE_SETLOCALE
33217309Snwhitehorn#include <locale.h>
34217309Snwhitehorn#endif
35217309Snwhitehorn
36217309Snwhitehorn#define PASSARGS             t,       av,        offset_add
37217309Snwhitehorn#define CALLARGS const char *t, char *av[], int *offset_add
38217309Snwhitehorntypedef int (callerFn) (CALLARGS);
39217309Snwhitehorn
40217309Snwhitehorntypedef enum {
41217309Snwhitehorn    o_unknown = 0
42217309Snwhitehorn    ,o_allow_close
43217309Snwhitehorn    ,o_and_widget
44217309Snwhitehorn    ,o_ascii_lines
45217309Snwhitehorn    ,o_aspect
46217309Snwhitehorn    ,o_auto_placement
47217309Snwhitehorn    ,o_backtitle
48217309Snwhitehorn    ,o_beep
49217309Snwhitehorn    ,o_beep_after
50217309Snwhitehorn    ,o_begin
51217309Snwhitehorn    ,o_cancel_label
52217309Snwhitehorn    ,o_checklist
53217309Snwhitehorn    ,o_clear
54217309Snwhitehorn    ,o_colors
55217309Snwhitehorn    ,o_column_separator
56217309Snwhitehorn    ,o_cr_wrap
57217309Snwhitehorn    ,o_create_rc
58217309Snwhitehorn    ,o_date_format
59251843Sbapt    ,o_default_button
60217309Snwhitehorn    ,o_default_item
61217309Snwhitehorn    ,o_defaultno
62217309Snwhitehorn    ,o_exit_label
63217309Snwhitehorn    ,o_extra_button
64217309Snwhitehorn    ,o_extra_label
65217309Snwhitehorn    ,o_fixed_font
66217309Snwhitehorn    ,o_form
67217309Snwhitehorn    ,o_gauge
68217309Snwhitehorn    ,o_help
69217309Snwhitehorn    ,o_help_button
70224014Snwhitehorn    ,o_help_file
71217309Snwhitehorn    ,o_help_label
72224014Snwhitehorn    ,o_help_line
73217309Snwhitehorn    ,o_help_status
74255852Sdteske    ,o_help_tags
75217309Snwhitehorn    ,o_icon
76217309Snwhitehorn    ,o_ignore
77217309Snwhitehorn    ,o_infobox
78217309Snwhitehorn    ,o_input_fd
79217309Snwhitehorn    ,o_inputbox
80217309Snwhitehorn    ,o_inputmenu
81217309Snwhitehorn    ,o_insecure
82217309Snwhitehorn    ,o_item_help
83217309Snwhitehorn    ,o_keep_colors
84217309Snwhitehorn    ,o_keep_tite
85217309Snwhitehorn    ,o_keep_window
86251843Sbapt    ,o_last_key
87217309Snwhitehorn    ,o_max_input
88217309Snwhitehorn    ,o_menu
89217309Snwhitehorn    ,o_mixedform
90217309Snwhitehorn    ,o_mixedgauge
91217309Snwhitehorn    ,o_msgbox
92217309Snwhitehorn    ,o_no_close
93217309Snwhitehorn    ,o_no_collapse
94217309Snwhitehorn    ,o_no_cr_wrap
95217309Snwhitehorn    ,o_no_kill
96217309Snwhitehorn    ,o_no_label
97217309Snwhitehorn    ,o_no_lines
98220749Snwhitehorn    ,o_no_mouse
99224014Snwhitehorn    ,o_no_nl_expand
100217309Snwhitehorn    ,o_no_shadow
101217309Snwhitehorn    ,o_nocancel
102217309Snwhitehorn    ,o_nook
103217309Snwhitehorn    ,o_ok_label
104217309Snwhitehorn    ,o_output_fd
105217309Snwhitehorn    ,o_output_separator
106217309Snwhitehorn    ,o_passwordbox
107217309Snwhitehorn    ,o_passwordform
108217309Snwhitehorn    ,o_pause
109220749Snwhitehorn    ,o_prgbox
110217309Snwhitehorn    ,o_print_maxsize
111217309Snwhitehorn    ,o_print_size
112217309Snwhitehorn    ,o_print_version
113220749Snwhitehorn    ,o_programbox
114217309Snwhitehorn    ,o_progressbox
115217309Snwhitehorn    ,o_quoted
116217309Snwhitehorn    ,o_radiolist
117217309Snwhitehorn    ,o_screen_center
118217309Snwhitehorn    ,o_scrollbar
119217309Snwhitehorn    ,o_separate_output
120217309Snwhitehorn    ,o_separate_widget
121217309Snwhitehorn    ,o_separator
122217309Snwhitehorn    ,o_shadow
123217309Snwhitehorn    ,o_single_quoted
124217309Snwhitehorn    ,o_size_err
125217309Snwhitehorn    ,o_sleep
126217309Snwhitehorn    ,o_smooth
127217309Snwhitehorn    ,o_stderr
128217309Snwhitehorn    ,o_stdout
129217309Snwhitehorn    ,o_tab_correct
130217309Snwhitehorn    ,o_tab_len
131217309Snwhitehorn    ,o_tailbox
132217309Snwhitehorn    ,o_tailboxbg
133217309Snwhitehorn    ,o_textbox
134217309Snwhitehorn    ,o_time_format
135217309Snwhitehorn    ,o_timeout
136217309Snwhitehorn    ,o_title
137217309Snwhitehorn    ,o_trim
138217309Snwhitehorn    ,o_under_mouse
139224014Snwhitehorn    ,o_version
140217309Snwhitehorn    ,o_visit_items
141217309Snwhitehorn    ,o_wmclass
142217309Snwhitehorn    ,o_yes_label
143217309Snwhitehorn    ,o_yesno
144251843Sbapt#ifdef HAVE_WHIPTAIL
145251843Sbapt    ,o_fullbutton
146251843Sbapt    ,o_topleft
147251843Sbapt#endif
148251843Sbapt#ifdef HAVE_XDIALOG
149251843Sbapt    ,o_calendar
150251843Sbapt    ,o_dselect
151251843Sbapt    ,o_editbox
152251843Sbapt    ,o_fselect
153251843Sbapt    ,o_timebox
154251843Sbapt#endif
155251843Sbapt#ifdef HAVE_XDIALOG2
156251843Sbapt    ,o_buildlist
157251843Sbapt    ,o_rangebox
158251843Sbapt    ,o_treeview
159251843Sbapt#endif
160251843Sbapt#if defined(HAVE_XDIALOG2) || defined(HAVE_WHIPTAIL)
161251843Sbapt    ,o_no_items
162251843Sbapt    ,o_no_tags
163251843Sbapt#endif
164217309Snwhitehorn#ifdef HAVE_DLG_TRACE
165217309Snwhitehorn    ,o_trace
166217309Snwhitehorn#endif
167217309Snwhitehorn} eOptions;
168217309Snwhitehorn
169217309Snwhitehorn/*
170217309Snwhitehorn * The bits in 'pass' are used to decide which options are applicable at
171217309Snwhitehorn * different stages in the program:
172217309Snwhitehorn *	1 flags before widgets
173217309Snwhitehorn *	2 widgets
174217309Snwhitehorn *	4 non-widget options
175217309Snwhitehorn */
176217309Snwhitehorntypedef struct {
177217309Snwhitehorn    const char *name;
178217309Snwhitehorn    eOptions code;
179217309Snwhitehorn    int pass;			/* 1,2,4 or combination */
180217309Snwhitehorn    const char *help;		/* NULL to suppress, non-empty to display params */
181217309Snwhitehorn} Options;
182217309Snwhitehorn
183217309Snwhitehorntypedef struct {
184217309Snwhitehorn    eOptions code;
185217309Snwhitehorn    int argmin, argmax;
186217309Snwhitehorn    callerFn *jumper;
187217309Snwhitehorn} Mode;
188217309Snwhitehorn
189217309Snwhitehornstatic bool *dialog_opts;
190217309Snwhitehornstatic char **dialog_argv;
191217309Snwhitehorn
192217309Snwhitehornstatic bool ignore_unknown = FALSE;
193217309Snwhitehorn
194217309Snwhitehornstatic const char *program = "dialog";
195217309Snwhitehorn
196217309Snwhitehorn/*
197217309Snwhitehorn * The options[] table is organized this way to make it simple to maintain
198217309Snwhitehorn * a sorted list of options for the help-message.
199217309Snwhitehorn */
200217309Snwhitehorn/* *INDENT-OFF* */
201217309Snwhitehornstatic const Options options[] = {
202217309Snwhitehorn    { "allow-close",	o_allow_close,		1, NULL },
203217309Snwhitehorn    { "and-widget",	o_and_widget,		4, NULL },
204217309Snwhitehorn    { "ascii-lines",	o_ascii_lines, 		1, "" },
205217309Snwhitehorn    { "aspect",		o_aspect,		1, "<ratio>" },
206217309Snwhitehorn    { "auto-placement", o_auto_placement,	1, NULL },
207217309Snwhitehorn    { "backtitle",	o_backtitle,		1, "<backtitle>" },
208251843Sbapt    { "beep",		o_beep,			1, "" },
209251843Sbapt    { "beep-after",	o_beep_after,		1, "" },
210217309Snwhitehorn    { "begin",		o_begin,		1, "<y> <x>" },
211217309Snwhitehorn    { "cancel-label",	o_cancel_label,		1, "<str>" },
212217309Snwhitehorn    { "checklist",	o_checklist,		2, "<text> <height> <width> <list height> <tag1> <item1> <status1>..." },
213217309Snwhitehorn    { "clear",		o_clear,		1, "" },
214217309Snwhitehorn    { "colors",		o_colors,		1, "" },
215217309Snwhitehorn    { "column-separator",o_column_separator,	1, "<str>" },
216217309Snwhitehorn    { "cr-wrap",	o_cr_wrap,		1, "" },
217217309Snwhitehorn    { "create-rc",	o_create_rc,		1, NULL },
218217309Snwhitehorn    { "date-format",	o_date_format,		1, "<str>" },
219251843Sbapt    { "default-button",	o_default_button,	1, "<str>" },
220217309Snwhitehorn    { "default-item",	o_default_item,		1, "<str>" },
221217309Snwhitehorn    { "defaultno",	o_defaultno,		1, "" },
222217309Snwhitehorn    { "exit-label",	o_exit_label,		1, "<str>" },
223217309Snwhitehorn    { "extra-button",	o_extra_button,		1, "" },
224217309Snwhitehorn    { "extra-label",	o_extra_label,		1, "<str>" },
225217309Snwhitehorn    { "fixed-font",	o_fixed_font,		1, NULL },
226217309Snwhitehorn    { "form",		o_form,			2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>..." },
227217309Snwhitehorn    { "gauge",		o_gauge,		2, "<text> <height> <width> [<percent>]" },
228217309Snwhitehorn    { "guage",		o_gauge,		2, NULL },
229217309Snwhitehorn    { "help",		o_help,			4, "" },
230217309Snwhitehorn    { "help-button",	o_help_button,		1, "" },
231217309Snwhitehorn    { "help-label",	o_help_label,		1, "<str>" },
232217309Snwhitehorn    { "help-status",	o_help_status,		1, "" },
233255852Sdteske    { "help-tags",	o_help_tags,		1, "" },
234224014Snwhitehorn    { "hfile",		o_help_file,		1, "<str>" },
235224014Snwhitehorn    { "hline",		o_help_line,		1, "<str>" },
236217309Snwhitehorn    { "icon",		o_icon,			1, NULL },
237217309Snwhitehorn    { "ignore",		o_ignore,		1, "" },
238217309Snwhitehorn    { "infobox",	o_infobox,		2, "<text> <height> <width>" },
239217309Snwhitehorn    { "input-fd",	o_input_fd,		1, "<fd>" },
240217309Snwhitehorn    { "inputbox",	o_inputbox,		2, "<text> <height> <width> [<init>]" },
241217309Snwhitehorn    { "inputmenu",	o_inputmenu,		2, "<text> <height> <width> <menu height> <tag1> <item1>..." },
242217309Snwhitehorn    { "insecure",	o_insecure,		1, "" },
243217309Snwhitehorn    { "item-help",	o_item_help,		1, "" },
244217309Snwhitehorn    { "keep-colors",	o_keep_colors,		1, NULL },
245217309Snwhitehorn    { "keep-tite",	o_keep_tite,		1, "" },
246217309Snwhitehorn    { "keep-window",	o_keep_window,		1, "" },
247251843Sbapt    { "last-key",	o_last_key,		1, "" },
248217309Snwhitehorn    { "max-input",	o_max_input,		1, "<n>" },
249217309Snwhitehorn    { "menu",		o_menu,			2, "<text> <height> <width> <menu height> <tag1> <item1>..." },
250217309Snwhitehorn    { "mixedform",	o_mixedform,		2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>..." },
251217309Snwhitehorn    { "mixedgauge",	o_mixedgauge,		2, "<text> <height> <width> <percent> <tag1> <item1>..." },
252217309Snwhitehorn    { "msgbox",		o_msgbox,		2, "<text> <height> <width>" },
253217309Snwhitehorn    { "no-cancel",	o_nocancel,		1, "" },
254217309Snwhitehorn    { "no-close",	o_no_close,		1, NULL },
255217309Snwhitehorn    { "no-collapse",	o_no_collapse,		1, "" },
256251843Sbapt    { "no-cr-wrap",	o_no_cr_wrap,		1, "" },
257217309Snwhitehorn    { "no-kill",	o_no_kill,		1, "" },
258217309Snwhitehorn    { "no-label",	o_no_label,		1, "<str>" },
259217309Snwhitehorn    { "no-lines",	o_no_lines, 		1, "" },
260220749Snwhitehorn    { "no-mouse",	o_no_mouse,		1, "" },
261224014Snwhitehorn    { "no-nl-expand",	o_no_nl_expand,		1, "" },
262217309Snwhitehorn    { "no-ok",		o_nook,			1, "" },
263217309Snwhitehorn    { "no-shadow",	o_no_shadow,		1, "" },
264217309Snwhitehorn    { "nocancel",	o_nocancel,		1, NULL }, /* see --no-cancel */
265217309Snwhitehorn    { "nook",		o_nook,			1, "" }, /* See no-ok */
266217309Snwhitehorn    { "ok-label",	o_ok_label,		1, "<str>" },
267217309Snwhitehorn    { "output-fd",	o_output_fd,		1, "<fd>" },
268217309Snwhitehorn    { "output-separator",o_output_separator,	1, "<str>" },
269217309Snwhitehorn    { "passwordbox",	o_passwordbox,		2, "<text> <height> <width> [<init>]" },
270217309Snwhitehorn    { "passwordform",	o_passwordform,		2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>..." },
271217309Snwhitehorn    { "pause",		o_pause,		2, "<text> <height> <width> <seconds>" },
272220749Snwhitehorn    { "prgbox",		o_prgbox,		2, "<text> <command> <height> <width>" },
273217309Snwhitehorn    { "print-maxsize",	o_print_maxsize,	1, "" },
274217309Snwhitehorn    { "print-size",	o_print_size,		1, "" },
275217309Snwhitehorn    { "print-version",	o_print_version,	5, "" },
276220749Snwhitehorn    { "programbox",	o_programbox,		2, "<text> <height> <width>" },
277220749Snwhitehorn    { "progressbox",	o_progressbox,		2, "<text> <height> <width>" },
278217309Snwhitehorn    { "quoted",		o_quoted,		1, "" },
279217309Snwhitehorn    { "radiolist",	o_radiolist,		2, "<text> <height> <width> <list height> <tag1> <item1> <status1>..." },
280217309Snwhitehorn    { "screen-center",	o_screen_center,	1, NULL },
281217309Snwhitehorn    { "scrollbar",	o_scrollbar,		1, "" },
282217309Snwhitehorn    { "separate-output",o_separate_output,	1, "" },
283217309Snwhitehorn    { "separate-widget",o_separate_widget,	1, "<str>" },
284217309Snwhitehorn    { "separator",	o_separator,		1, NULL },
285217309Snwhitehorn    { "shadow",		o_shadow,		1, "" },
286217309Snwhitehorn    { "single-quoted",	o_single_quoted,	1, "" },
287217309Snwhitehorn    { "size-err",	o_size_err,		1, "" },
288217309Snwhitehorn    { "sleep",		o_sleep,		1, "<secs>" },
289217309Snwhitehorn    { "smooth",		o_smooth,		1, NULL },
290217309Snwhitehorn    { "stderr",		o_stderr,		1, "" },
291217309Snwhitehorn    { "stdout",		o_stdout,		1, "" },
292217309Snwhitehorn    { "tab-correct",	o_tab_correct,		1, "" },
293217309Snwhitehorn    { "tab-len",	o_tab_len,		1, "<n>" },
294217309Snwhitehorn    { "tailbox",	o_tailbox,		2, "<file> <height> <width>" },
295217309Snwhitehorn    { "tailboxbg",	o_tailboxbg,		2, "<file> <height> <width>" },
296217309Snwhitehorn    { "textbox",	o_textbox,		2, "<file> <height> <width>" },
297217309Snwhitehorn    { "time-format",	o_time_format,		1, "<str>" },
298217309Snwhitehorn    { "timeout",	o_timeout,		1, "<secs>" },
299217309Snwhitehorn    { "title",		o_title,		1, "<title>" },
300217309Snwhitehorn    { "trim",		o_trim,			1, "" },
301217309Snwhitehorn    { "under-mouse", 	o_under_mouse,		1, NULL },
302224014Snwhitehorn    { "version",	o_version,		5, "" },
303217309Snwhitehorn    { "visit-items", 	o_visit_items,		1, "" },
304217309Snwhitehorn    { "wmclass",	o_wmclass,		1, NULL },
305217309Snwhitehorn    { "yes-label",	o_yes_label,		1, "<str>" },
306217309Snwhitehorn    { "yesno",		o_yesno,		2, "<text> <height> <width>" },
307251843Sbapt#ifdef HAVE_WHIPTAIL
308251843Sbapt    { "cancel-button",	o_cancel_label,		1, NULL },
309251843Sbapt    { "fb",		o_fullbutton,		1, NULL },
310251843Sbapt    { "fullbutton",	o_fullbutton,		1, NULL },
311251843Sbapt    { "no-button",	o_no_label,		1, NULL },
312251843Sbapt    { "ok-button",	o_ok_label,		1, NULL },
313251843Sbapt    { "scrolltext",	o_scrollbar,		1, NULL },
314251843Sbapt    { "topleft",	o_topleft,		1, NULL },
315251843Sbapt    { "yes-button",	o_yes_label,		1, NULL },
316251843Sbapt#endif
317251843Sbapt#ifdef HAVE_XDIALOG
318251843Sbapt    { "calendar",	o_calendar,		2, "<text> <height> <width> <day> <month> <year>" },
319251843Sbapt    { "dselect",	o_dselect,		2, "<directory> <height> <width>" },
320251843Sbapt    { "editbox",	o_editbox,		2, "<file> <height> <width>" },
321251843Sbapt    { "fselect",	o_fselect,		2, "<filepath> <height> <width>" },
322251843Sbapt    { "timebox",	o_timebox,		2, "<text> <height> <width> <hour> <minute> <second>" },
323251843Sbapt#endif
324251843Sbapt#ifdef HAVE_XDIALOG2
325251843Sbapt    { "buildlist",	o_buildlist,		2, "<text> <height> <width> <tag1> <item1> <status1>..." },
326251843Sbapt    { "no-items", 	o_no_items,		1, "" },
327251843Sbapt    { "no-tags", 	o_no_tags,		1, "" },
328251843Sbapt    { "rangebox",	o_rangebox,		2, "<text> <height> <width> <min-value> <max-value> <default-value>" },
329251843Sbapt    { "treeview",	o_treeview,		2, "<text> <height> <width> <list-height> <tag1> <item1> <status1> <depth1>..." },
330251843Sbapt#endif
331251843Sbapt#if defined(HAVE_XDIALOG2) || defined(HAVE_WHIPTAIL)
332251843Sbapt    { "noitem", 	o_no_items,		1, NULL },
333251843Sbapt    { "notags", 	o_no_tags,		1, NULL },
334251843Sbapt#endif
335217309Snwhitehorn#ifdef HAVE_DLG_TRACE
336217309Snwhitehorn    { "trace",		o_trace,		1, "<file>" },
337217309Snwhitehorn#endif
338217309Snwhitehorn};
339217309Snwhitehorn/* *INDENT-ON* */
340217309Snwhitehorn
341217309Snwhitehorn/*
342217309Snwhitehorn * Make an array showing which argv[] entries are options.  Use "--" as a
343217309Snwhitehorn * special token to escape the next argument, allowing it to begin with "--".
344217309Snwhitehorn * When we find a "--" argument, also remove it from argv[] and adjust argc.
345217309Snwhitehorn * That appears to be an undocumented feature of the popt library.
346217309Snwhitehorn *
347217309Snwhitehorn * Also, if we see a "--file", expand it into the parameter list by reading the
348217309Snwhitehorn * text from the given file and stripping quotes, treating whitespace outside
349217309Snwhitehorn * quotes as a parameter delimiter.
350217309Snwhitehorn *
351217309Snwhitehorn * Finally, if we see a "--args", dump the current list of arguments to the
352217309Snwhitehorn * standard error.  This is used for debugging complex --file combinations.
353217309Snwhitehorn */
354217309Snwhitehornstatic void
355217309Snwhitehornunescape_argv(int *argcp, char ***argvp)
356217309Snwhitehorn{
357217309Snwhitehorn    int j, k;
358217309Snwhitehorn    int limit_includes = 20 + *argcp;
359217309Snwhitehorn    int count_includes = 0;
360217309Snwhitehorn    bool changed = FALSE;
361217309Snwhitehorn    bool doalloc = FALSE;
362217309Snwhitehorn    char *filename;
363217309Snwhitehorn
364217309Snwhitehorn    dialog_opts = dlg_calloc(bool, (size_t) *argcp + 1);
365217309Snwhitehorn    assert_ptr(dialog_opts, "unescape_argv");
366217309Snwhitehorn
367217309Snwhitehorn    for (j = 1; j < *argcp; j++) {
368217309Snwhitehorn	bool escaped = FALSE;
369217309Snwhitehorn	if (!strcmp((*argvp)[j], "--")) {
370217309Snwhitehorn	    escaped = TRUE;
371220749Snwhitehorn	    changed = dlg_eat_argv(argcp, argvp, j, 1);
372217309Snwhitehorn	} else if (!strcmp((*argvp)[j], "--args")) {
373217309Snwhitehorn	    fprintf(stderr, "Showing arguments at arg%d\n", j);
374217309Snwhitehorn	    for (k = 0; k < *argcp; ++k) {
375217309Snwhitehorn		fprintf(stderr, " arg%d:%s\n", k, (*argvp)[k]);
376217309Snwhitehorn	    }
377220749Snwhitehorn	    changed = dlg_eat_argv(argcp, argvp, j, 1);
378217309Snwhitehorn	} else if (!strcmp((*argvp)[j], "--file")) {
379217309Snwhitehorn	    if (++count_includes > limit_includes)
380217309Snwhitehorn		dlg_exiterr("Too many --file options");
381217309Snwhitehorn
382217309Snwhitehorn	    if ((filename = (*argvp)[j + 1]) != 0) {
383217309Snwhitehorn		FILE *fp;
384217309Snwhitehorn		char **list;
385217309Snwhitehorn		char *blob;
386217309Snwhitehorn		int added;
387217309Snwhitehorn		size_t bytes_read;
388217309Snwhitehorn		size_t length;
389217309Snwhitehorn		int n;
390217309Snwhitehorn
391217309Snwhitehorn		if (*filename == '&') {
392217309Snwhitehorn		    fp = fdopen(atoi(filename + sizeof(char)), "r");
393217309Snwhitehorn		} else {
394217309Snwhitehorn		    fp = fopen(filename, "r");
395217309Snwhitehorn		}
396217309Snwhitehorn
397217309Snwhitehorn		if (fp) {
398217309Snwhitehorn		    blob = NULL;
399217309Snwhitehorn		    length = 0;
400217309Snwhitehorn		    do {
401217309Snwhitehorn			blob = dlg_realloc(char, length + BUFSIZ + 1, blob);
402217309Snwhitehorn			assert_ptr(blob, "unescape_argv");
403217309Snwhitehorn			bytes_read = fread(blob + length,
404217309Snwhitehorn					   sizeof(char),
405220749Snwhitehorn					     (size_t) BUFSIZ,
406217309Snwhitehorn					   fp);
407217309Snwhitehorn			length += bytes_read;
408217309Snwhitehorn			if (ferror(fp))
409217309Snwhitehorn			    dlg_exiterr("error on filehandle in unescape_argv");
410217309Snwhitehorn		    } while (bytes_read == BUFSIZ);
411217309Snwhitehorn		    fclose(fp);
412217309Snwhitehorn
413217309Snwhitehorn		    blob[length] = '\0';
414217309Snwhitehorn
415220749Snwhitehorn		    list = dlg_string_to_argv(blob);
416220749Snwhitehorn		    if ((added = dlg_count_argv(list)) != 0) {
417217309Snwhitehorn			if (added > 2) {
418217309Snwhitehorn			    size_t need = (size_t) (*argcp + added + 1);
419217309Snwhitehorn			    if (doalloc) {
420217309Snwhitehorn				*argvp = dlg_realloc(char *, need, *argvp);
421217309Snwhitehorn				assert_ptr(*argvp, "unescape_argv");
422217309Snwhitehorn			    } else {
423217309Snwhitehorn				char **newp = dlg_malloc(char *, need);
424217309Snwhitehorn				assert_ptr(newp, "unescape_argv");
425217309Snwhitehorn				for (n = 0; n < *argcp; ++n) {
426217309Snwhitehorn				    newp[n] = (*argvp)[n];
427217309Snwhitehorn				}
428217309Snwhitehorn				*argvp = newp;
429217309Snwhitehorn				doalloc = TRUE;
430217309Snwhitehorn			    }
431217309Snwhitehorn			    dialog_opts = dlg_realloc(bool, need, dialog_opts);
432217309Snwhitehorn			    assert_ptr(dialog_opts, "unescape_argv");
433217309Snwhitehorn			}
434217309Snwhitehorn			for (n = *argcp; n >= j + 2; --n) {
435217309Snwhitehorn			    (*argvp)[n + added - 2] = (*argvp)[n];
436217309Snwhitehorn			    dialog_opts[n + added - 2] = dialog_opts[n];
437217309Snwhitehorn			}
438217309Snwhitehorn			for (n = 0; n < added; ++n) {
439217309Snwhitehorn			    (*argvp)[n + j] = list[n];
440217309Snwhitehorn			    dialog_opts[n + j] = FALSE;
441217309Snwhitehorn			}
442217309Snwhitehorn			*argcp += added - 2;
443217309Snwhitehorn			free(list);
444217309Snwhitehorn		    }
445217309Snwhitehorn		} else {
446217309Snwhitehorn		    dlg_exiterr("Cannot open --file %s", filename);
447217309Snwhitehorn		}
448217309Snwhitehorn		(*argvp)[*argcp] = 0;
449217309Snwhitehorn		++j;
450217309Snwhitehorn		continue;
451217309Snwhitehorn	    } else {
452217309Snwhitehorn		dlg_exiterr("No value given for --file");
453217309Snwhitehorn	    }
454217309Snwhitehorn	}
455217309Snwhitehorn	if (!escaped
456217309Snwhitehorn	    && (*argvp)[j] != 0
457220749Snwhitehorn	    && !strncmp((*argvp)[j], "--", (size_t) 2)
458217309Snwhitehorn	    && isalpha(UCH((*argvp)[j][2]))) {
459217309Snwhitehorn	    dialog_opts[j] = TRUE;
460217309Snwhitehorn	}
461217309Snwhitehorn    }
462217309Snwhitehorn
463217309Snwhitehorn    /* if we didn't find any "--" tokens, there's no reason to do the table
464217309Snwhitehorn     * lookup in isOption()
465217309Snwhitehorn     */
466217309Snwhitehorn    if (!changed) {
467217309Snwhitehorn	free(dialog_opts);
468217309Snwhitehorn	dialog_opts = 0;
469217309Snwhitehorn    }
470217309Snwhitehorn    dialog_argv = (*argvp);
471217309Snwhitehorn}
472217309Snwhitehorn
473251843Sbapt#define OptionChars "\
474251843Sbapt0123456789\
475251843Sbapt-\
476251843Sbaptabcdefghijklmnopqrstuvwxyz\
477251843Sbapt"
478251843Sbapt
479217309Snwhitehorn/*
480217309Snwhitehorn * Check if the given string from main's argv is an option.
481217309Snwhitehorn */
482217309Snwhitehornstatic bool
483217309SnwhitehornisOption(const char *arg)
484217309Snwhitehorn{
485217309Snwhitehorn    bool result = FALSE;
486217309Snwhitehorn
487217309Snwhitehorn    if (arg != 0) {
488217309Snwhitehorn	if (dialog_opts != 0) {
489217309Snwhitehorn	    int n;
490217309Snwhitehorn	    for (n = 1; dialog_argv[n] != 0; ++n) {
491217309Snwhitehorn		if (dialog_argv[n] == arg) {
492217309Snwhitehorn		    result = dialog_opts[n];
493217309Snwhitehorn		    break;
494217309Snwhitehorn		}
495217309Snwhitehorn	    }
496220749Snwhitehorn	} else if (!strncmp(arg, "--", (size_t) 2) && isalpha(UCH(arg[2]))) {
497251843Sbapt	    if (strlen(arg) == strspn(arg, OptionChars)) {
498251843Sbapt		result = TRUE;
499251843Sbapt	    } else {
500251843Sbapt		dlg_exiterr("Invalid option \"%s\"", arg);
501251843Sbapt	    }
502217309Snwhitehorn	}
503217309Snwhitehorn    }
504217309Snwhitehorn    return result;
505217309Snwhitehorn}
506217309Snwhitehorn
507217309Snwhitehornstatic eOptions
508217309SnwhitehornlookupOption(const char *name, int pass)
509217309Snwhitehorn{
510217309Snwhitehorn    unsigned n;
511251843Sbapt    eOptions result = o_unknown;
512217309Snwhitehorn
513217309Snwhitehorn    if (isOption(name)) {
514217309Snwhitehorn	name += 2;
515217309Snwhitehorn	for (n = 0; n < sizeof(options) / sizeof(options[0]); n++) {
516217309Snwhitehorn	    if ((pass & options[n].pass) != 0
517217309Snwhitehorn		&& !strcmp(name, options[n].name)) {
518251843Sbapt		result = options[n].code;
519251843Sbapt		break;
520217309Snwhitehorn	    }
521217309Snwhitehorn	}
522217309Snwhitehorn    }
523251843Sbapt    return result;
524217309Snwhitehorn}
525217309Snwhitehorn
526217309Snwhitehornstatic void
527217309SnwhitehornUsage(const char *msg)
528217309Snwhitehorn{
529217309Snwhitehorn    dlg_exiterr("Error: %s.\nUse --help to list options.\n\n", msg);
530217309Snwhitehorn}
531217309Snwhitehorn
532217309Snwhitehorn/*
533217309Snwhitehorn * Count arguments, stopping at the end of the argument list, or on any of our
534217309Snwhitehorn * "--" tokens.
535217309Snwhitehorn */
536217309Snwhitehornstatic int
537217309Snwhitehornarg_rest(char *argv[])
538217309Snwhitehorn{
539217309Snwhitehorn    int i = 1;			/* argv[0] points to a "--" token */
540217309Snwhitehorn
541217309Snwhitehorn    while (argv[i] != 0
542217309Snwhitehorn	   && (!isOption(argv[i]) || lookupOption(argv[i], 7) == o_unknown))
543217309Snwhitehorn	i++;
544217309Snwhitehorn    return i;
545217309Snwhitehorn}
546217309Snwhitehorn
547217309Snwhitehorn/*
548217309Snwhitehorn * In MultiWidget this function is needed to count how many tags
549217309Snwhitehorn * a widget (menu, checklist, radiolist) has
550217309Snwhitehorn */
551217309Snwhitehornstatic int
552217309Snwhitehornhowmany_tags(char *argv[], int group)
553217309Snwhitehorn{
554217309Snwhitehorn    int result = 0;
555217309Snwhitehorn    int have;
556217309Snwhitehorn    const char *format = "Expected %d arguments, found only %d";
557217309Snwhitehorn    char temp[80];
558217309Snwhitehorn
559217309Snwhitehorn    while (argv[0] != 0) {
560217309Snwhitehorn	if (isOption(argv[0]))
561217309Snwhitehorn	    break;
562217309Snwhitehorn	if ((have = arg_rest(argv)) < group) {
563217309Snwhitehorn	    sprintf(temp, format, group, have);
564217309Snwhitehorn	    Usage(temp);
565217309Snwhitehorn	}
566217309Snwhitehorn
567217309Snwhitehorn	argv += group;
568217309Snwhitehorn	result++;
569217309Snwhitehorn    }
570217309Snwhitehorn
571217309Snwhitehorn    return result;
572217309Snwhitehorn}
573217309Snwhitehorn
574217309Snwhitehornstatic int
575217309Snwhitehornnumeric_arg(char **av, int n)
576217309Snwhitehorn{
577251843Sbapt    int result = 0;
578217309Snwhitehorn
579251843Sbapt    if (n < dlg_count_argv(av)) {
580251843Sbapt	char msg[80];
581251843Sbapt	char *last = 0;
582251843Sbapt	result = (int) strtol(av[n], &last, 10);
583251843Sbapt
584251843Sbapt	if (last == 0 || *last != 0) {
585251843Sbapt	    sprintf(msg, "Expected a number for token %d of %.20s", n, av[0]);
586251843Sbapt	    Usage(msg);
587251843Sbapt	}
588217309Snwhitehorn    }
589217309Snwhitehorn    return result;
590217309Snwhitehorn}
591217309Snwhitehorn
592217309Snwhitehornstatic char *
593217309Snwhitehornoptional_str(char **av, int n, char *dft)
594217309Snwhitehorn{
595217309Snwhitehorn    char *ret = dft;
596217309Snwhitehorn    if (arg_rest(av) > n)
597217309Snwhitehorn	ret = av[n];
598217309Snwhitehorn    return ret;
599217309Snwhitehorn}
600217309Snwhitehorn
601217309Snwhitehorn#if defined(HAVE_DLG_GAUGE) || defined(HAVE_XDIALOG)
602217309Snwhitehornstatic int
603217309Snwhitehornoptional_num(char **av, int n, int dft)
604217309Snwhitehorn{
605217309Snwhitehorn    int ret = dft;
606217309Snwhitehorn    if (arg_rest(av) > n)
607217309Snwhitehorn	ret = numeric_arg(av, n);
608217309Snwhitehorn    return ret;
609217309Snwhitehorn}
610217309Snwhitehorn#endif
611217309Snwhitehorn
612217309Snwhitehorn/*
613217309Snwhitehorn * On AIX 4.x, we have to flush the output right away since there is a bug in
614217309Snwhitehorn * the curses package which discards stdout even when we've used newterm to
615217309Snwhitehorn * redirect output to /dev/tty.
616217309Snwhitehorn */
617217309Snwhitehornstatic int
618217309Snwhitehornshow_result(int ret)
619217309Snwhitehorn{
620217309Snwhitehorn    bool either = FALSE;
621217309Snwhitehorn
622217309Snwhitehorn    switch (ret) {
623217309Snwhitehorn    case DLG_EXIT_OK:
624217309Snwhitehorn    case DLG_EXIT_EXTRA:
625217309Snwhitehorn    case DLG_EXIT_HELP:
626217309Snwhitehorn    case DLG_EXIT_ITEM_HELP:
627217309Snwhitehorn	if ((dialog_state.output_count > 1) && !dialog_vars.separate_output) {
628217309Snwhitehorn	    fputs((dialog_state.separate_str
629217309Snwhitehorn		   ? dialog_state.separate_str
630217309Snwhitehorn		   : DEFAULT_SEPARATE_STR),
631217309Snwhitehorn		  dialog_state.output);
632217309Snwhitehorn	    either = TRUE;
633217309Snwhitehorn	}
634220749Snwhitehorn	if (dialog_vars.input_result != 0
635220749Snwhitehorn	    && dialog_vars.input_result[0] != '\0') {
636217309Snwhitehorn	    fputs(dialog_vars.input_result, dialog_state.output);
637217309Snwhitehorn	    either = TRUE;
638217309Snwhitehorn	}
639217309Snwhitehorn	if (either) {
640217309Snwhitehorn	    fflush(dialog_state.output);
641217309Snwhitehorn	}
642217309Snwhitehorn	break;
643217309Snwhitehorn    }
644217309Snwhitehorn    return ret;
645217309Snwhitehorn}
646217309Snwhitehorn
647217309Snwhitehorn/*
648217309Snwhitehorn * These are the widget callers.
649217309Snwhitehorn */
650217309Snwhitehorn
651217309Snwhitehornstatic int
652217309Snwhitehorncall_yesno(CALLARGS)
653217309Snwhitehorn{
654217309Snwhitehorn    *offset_add = 4;
655217309Snwhitehorn    return dialog_yesno(t,
656217309Snwhitehorn			av[1],
657217309Snwhitehorn			numeric_arg(av, 2),
658217309Snwhitehorn			numeric_arg(av, 3));
659217309Snwhitehorn}
660217309Snwhitehorn
661217309Snwhitehornstatic int
662217309Snwhitehorncall_msgbox(CALLARGS)
663217309Snwhitehorn{
664217309Snwhitehorn    *offset_add = 4;
665217309Snwhitehorn    return dialog_msgbox(t,
666217309Snwhitehorn			 av[1],
667217309Snwhitehorn			 numeric_arg(av, 2),
668217309Snwhitehorn			 numeric_arg(av, 3), 1);
669217309Snwhitehorn}
670217309Snwhitehorn
671217309Snwhitehornstatic int
672217309Snwhitehorncall_infobox(CALLARGS)
673217309Snwhitehorn{
674217309Snwhitehorn    *offset_add = 4;
675217309Snwhitehorn    return dialog_msgbox(t,
676217309Snwhitehorn			 av[1],
677217309Snwhitehorn			 numeric_arg(av, 2),
678217309Snwhitehorn			 numeric_arg(av, 3), 0);
679217309Snwhitehorn}
680217309Snwhitehorn
681217309Snwhitehornstatic int
682217309Snwhitehorncall_textbox(CALLARGS)
683217309Snwhitehorn{
684217309Snwhitehorn    *offset_add = 4;
685217309Snwhitehorn    return dialog_textbox(t,
686217309Snwhitehorn			  av[1],
687217309Snwhitehorn			  numeric_arg(av, 2),
688217309Snwhitehorn			  numeric_arg(av, 3));
689217309Snwhitehorn}
690217309Snwhitehorn
691217309Snwhitehornstatic int
692217309Snwhitehorncall_menu(CALLARGS)
693217309Snwhitehorn{
694217309Snwhitehorn    int tags = howmany_tags(av + 5, MENUBOX_TAGS);
695217309Snwhitehorn    *offset_add = 5 + tags * MENUBOX_TAGS;
696217309Snwhitehorn
697217309Snwhitehorn    return dialog_menu(t,
698217309Snwhitehorn		       av[1],
699217309Snwhitehorn		       numeric_arg(av, 2),
700217309Snwhitehorn		       numeric_arg(av, 3),
701217309Snwhitehorn		       numeric_arg(av, 4),
702217309Snwhitehorn		       tags, av + 5);
703217309Snwhitehorn}
704217309Snwhitehorn
705217309Snwhitehornstatic int
706217309Snwhitehorncall_inputmenu(CALLARGS)
707217309Snwhitehorn{
708217309Snwhitehorn    int tags = howmany_tags(av + 5, MENUBOX_TAGS);
709220749Snwhitehorn    bool free_extra_label = FALSE;
710220749Snwhitehorn    int result;
711217309Snwhitehorn
712217309Snwhitehorn    dialog_vars.input_menu = TRUE;
713217309Snwhitehorn
714217309Snwhitehorn    if (dialog_vars.max_input == 0)
715217309Snwhitehorn	dialog_vars.max_input = MAX_LEN / 2;
716217309Snwhitehorn
717220749Snwhitehorn    if (dialog_vars.extra_label == 0) {
718220749Snwhitehorn	free_extra_label = TRUE;
719220749Snwhitehorn	dialog_vars.extra_label = dlg_strclone(_("Rename"));
720220749Snwhitehorn    }
721217309Snwhitehorn
722217309Snwhitehorn    dialog_vars.extra_button = TRUE;
723217309Snwhitehorn
724217309Snwhitehorn    *offset_add = 5 + tags * MENUBOX_TAGS;
725220749Snwhitehorn    result = dialog_menu(t,
726220749Snwhitehorn			 av[1],
727220749Snwhitehorn			 numeric_arg(av, 2),
728220749Snwhitehorn			 numeric_arg(av, 3),
729220749Snwhitehorn			 numeric_arg(av, 4),
730220749Snwhitehorn			 tags, av + 5);
731220749Snwhitehorn    if (free_extra_label) {
732220749Snwhitehorn	free(dialog_vars.extra_label);
733220749Snwhitehorn	dialog_vars.extra_label = 0;
734220749Snwhitehorn    }
735220749Snwhitehorn    return result;
736217309Snwhitehorn}
737217309Snwhitehorn
738217309Snwhitehornstatic int
739217309Snwhitehorncall_checklist(CALLARGS)
740217309Snwhitehorn{
741217309Snwhitehorn    int tags = howmany_tags(av + 5, CHECKBOX_TAGS);
742217309Snwhitehorn    int code;
743217309Snwhitehorn
744217309Snwhitehorn    *offset_add = 5 + tags * CHECKBOX_TAGS;
745217309Snwhitehorn    code = dialog_checklist(t,
746217309Snwhitehorn			    av[1],
747217309Snwhitehorn			    numeric_arg(av, 2),
748217309Snwhitehorn			    numeric_arg(av, 3),
749217309Snwhitehorn			    numeric_arg(av, 4),
750217309Snwhitehorn			    tags, av + 5, FLAG_CHECK);
751217309Snwhitehorn    return code;
752217309Snwhitehorn}
753217309Snwhitehorn
754217309Snwhitehornstatic int
755217309Snwhitehorncall_radiolist(CALLARGS)
756217309Snwhitehorn{
757217309Snwhitehorn    int tags = howmany_tags(av + 5, CHECKBOX_TAGS);
758217309Snwhitehorn    *offset_add = 5 + tags * CHECKBOX_TAGS;
759217309Snwhitehorn    return dialog_checklist(t,
760217309Snwhitehorn			    av[1],
761217309Snwhitehorn			    numeric_arg(av, 2),
762217309Snwhitehorn			    numeric_arg(av, 3),
763217309Snwhitehorn			    numeric_arg(av, 4),
764217309Snwhitehorn			    tags, av + 5, FLAG_RADIO);
765217309Snwhitehorn}
766217309Snwhitehorn
767217309Snwhitehornstatic int
768217309Snwhitehorncall_inputbox(CALLARGS)
769217309Snwhitehorn{
770217309Snwhitehorn    *offset_add = arg_rest(av);
771217309Snwhitehorn    return dialog_inputbox(t,
772217309Snwhitehorn			   av[1],
773217309Snwhitehorn			   numeric_arg(av, 2),
774217309Snwhitehorn			   numeric_arg(av, 3),
775217309Snwhitehorn			   optional_str(av, 4, 0), 0);
776217309Snwhitehorn}
777217309Snwhitehorn
778217309Snwhitehornstatic int
779217309Snwhitehorncall_passwordbox(CALLARGS)
780217309Snwhitehorn{
781217309Snwhitehorn    *offset_add = arg_rest(av);
782217309Snwhitehorn    return dialog_inputbox(t,
783217309Snwhitehorn			   av[1],
784217309Snwhitehorn			   numeric_arg(av, 2),
785217309Snwhitehorn			   numeric_arg(av, 3),
786217309Snwhitehorn			   optional_str(av, 4, 0), 1);
787217309Snwhitehorn}
788217309Snwhitehorn
789217309Snwhitehorn#ifdef HAVE_XDIALOG
790217309Snwhitehornstatic int
791217309Snwhitehorncall_calendar(CALLARGS)
792217309Snwhitehorn{
793217309Snwhitehorn    *offset_add = arg_rest(av);
794217309Snwhitehorn    return dialog_calendar(t,
795217309Snwhitehorn			   av[1],
796217309Snwhitehorn			   numeric_arg(av, 2),
797217309Snwhitehorn			   numeric_arg(av, 3),
798217309Snwhitehorn			   optional_num(av, 4, -1),
799217309Snwhitehorn			   optional_num(av, 5, -1),
800217309Snwhitehorn			   optional_num(av, 6, -1));
801217309Snwhitehorn}
802217309Snwhitehorn
803217309Snwhitehornstatic int
804217309Snwhitehorncall_dselect(CALLARGS)
805217309Snwhitehorn{
806217309Snwhitehorn    *offset_add = arg_rest(av);
807217309Snwhitehorn    return dialog_dselect(t,
808217309Snwhitehorn			  av[1],
809217309Snwhitehorn			  numeric_arg(av, 2),
810217309Snwhitehorn			  numeric_arg(av, 3));
811217309Snwhitehorn}
812217309Snwhitehorn
813217309Snwhitehornstatic int
814217309Snwhitehorncall_editbox(CALLARGS)
815217309Snwhitehorn{
816217309Snwhitehorn    *offset_add = 4;
817217309Snwhitehorn    return dialog_editbox(t,
818217309Snwhitehorn			  av[1],
819217309Snwhitehorn			  numeric_arg(av, 2),
820217309Snwhitehorn			  numeric_arg(av, 3));
821217309Snwhitehorn}
822217309Snwhitehorn
823217309Snwhitehornstatic int
824217309Snwhitehorncall_fselect(CALLARGS)
825217309Snwhitehorn{
826217309Snwhitehorn    *offset_add = arg_rest(av);
827217309Snwhitehorn    return dialog_fselect(t,
828217309Snwhitehorn			  av[1],
829217309Snwhitehorn			  numeric_arg(av, 2),
830217309Snwhitehorn			  numeric_arg(av, 3));
831217309Snwhitehorn}
832217309Snwhitehorn
833217309Snwhitehornstatic int
834217309Snwhitehorncall_timebox(CALLARGS)
835217309Snwhitehorn{
836217309Snwhitehorn    *offset_add = arg_rest(av);
837217309Snwhitehorn    return dialog_timebox(t,
838217309Snwhitehorn			  av[1],
839217309Snwhitehorn			  numeric_arg(av, 2),
840217309Snwhitehorn			  numeric_arg(av, 3),
841217309Snwhitehorn			  optional_num(av, 4, -1),
842217309Snwhitehorn			  optional_num(av, 5, -1),
843217309Snwhitehorn			  optional_num(av, 6, -1));
844217309Snwhitehorn}
845217309Snwhitehorn#endif /* HAVE_XDIALOG */
846217309Snwhitehorn
847251843Sbapt/* dialog 1.2 widgets */
848251843Sbapt#ifdef HAVE_XDIALOG2
849251843Sbapt
850251843Sbapt#define DisableNoTags() \
851251843Sbapt	bool save_no_tags = dialog_vars.no_tags; \
852251843Sbapt	bool save_no_items = dialog_vars.no_items; \
853251843Sbapt	dialog_vars.no_tags = TRUE; \
854251843Sbapt	dialog_vars.no_items = FALSE
855251843Sbapt
856251843Sbapt#define RestoreNoTags() \
857251843Sbapt	dialog_vars.no_tags = save_no_tags; \
858251843Sbapt	dialog_vars.no_items = save_no_items
859251843Sbapt
860251843Sbaptstatic int
861251843Sbaptcall_buildlist(CALLARGS)
862251843Sbapt{
863251843Sbapt    int tags = howmany_tags(av + 5, CHECKBOX_TAGS);
864251843Sbapt    int result;
865251843Sbapt
866251843Sbapt    DisableNoTags();
867251843Sbapt
868251843Sbapt    *offset_add = 5 + tags * CHECKBOX_TAGS;
869251843Sbapt    result = dialog_buildlist(t,
870251843Sbapt			      av[1],
871251843Sbapt			      numeric_arg(av, 2),
872251843Sbapt			      numeric_arg(av, 3),
873251843Sbapt			      numeric_arg(av, 4),
874251843Sbapt			      tags, av + 5,
875251843Sbapt			      TRUE);
876251843Sbapt    RestoreNoTags();
877251843Sbapt    return result;
878251843Sbapt}
879251843Sbapt
880251843Sbaptstatic int
881251843Sbaptcall_rangebox(CALLARGS)
882251843Sbapt{
883251843Sbapt    int min_value;
884251843Sbapt
885251843Sbapt    *offset_add = arg_rest(av);
886251843Sbapt    min_value = numeric_arg(av, 4);
887251843Sbapt    return dialog_rangebox(t,
888251843Sbapt			   av[1],
889251843Sbapt			   numeric_arg(av, 2),
890251843Sbapt			   numeric_arg(av, 3),
891251843Sbapt			   min_value,
892251843Sbapt			   numeric_arg(av, 5),
893251843Sbapt			   (*offset_add > 6) ? numeric_arg(av, 6) : min_value);
894251843Sbapt}
895251843Sbapt
896251843Sbaptstatic int
897251843Sbaptcall_treeview(CALLARGS)
898251843Sbapt{
899251843Sbapt    int tags = howmany_tags(av + 5, TREEVIEW_TAGS);
900251843Sbapt    int result;
901251843Sbapt
902251843Sbapt    DisableNoTags();
903251843Sbapt
904251843Sbapt    *offset_add = arg_rest(av);
905251843Sbapt    result = dialog_treeview(t,
906251843Sbapt			     av[1],
907251843Sbapt			     numeric_arg(av, 2),
908251843Sbapt			     numeric_arg(av, 3),
909251843Sbapt			     numeric_arg(av, 4),
910251843Sbapt			     tags, av + 5, FLAG_RADIO);
911251843Sbapt    RestoreNoTags();
912251843Sbapt    return result;
913251843Sbapt}
914251843Sbapt#endif /* HAVE_XDIALOG */
915251843Sbapt
916217309Snwhitehorn#ifdef HAVE_DLG_FORMBOX
917217309Snwhitehornstatic int
918217309Snwhitehorncall_form(CALLARGS)
919217309Snwhitehorn{
920217309Snwhitehorn    int group = FORMBOX_TAGS;
921217309Snwhitehorn    int tags = howmany_tags(av + 5, group);
922217309Snwhitehorn    *offset_add = 5 + tags * group;
923217309Snwhitehorn
924217309Snwhitehorn    return dialog_form(t,
925217309Snwhitehorn		       av[1],
926217309Snwhitehorn		       numeric_arg(av, 2),
927217309Snwhitehorn		       numeric_arg(av, 3),
928217309Snwhitehorn		       numeric_arg(av, 4),
929217309Snwhitehorn		       tags, av + 5);
930217309Snwhitehorn}
931217309Snwhitehorn
932217309Snwhitehornstatic int
933217309Snwhitehorncall_password_form(CALLARGS)
934217309Snwhitehorn{
935217309Snwhitehorn    unsigned save = dialog_vars.formitem_type;
936217309Snwhitehorn    int result;
937217309Snwhitehorn
938217309Snwhitehorn    dialog_vars.formitem_type = 1;
939217309Snwhitehorn    result = call_form(PASSARGS);
940217309Snwhitehorn    dialog_vars.formitem_type = save;
941217309Snwhitehorn
942217309Snwhitehorn    return result;
943217309Snwhitehorn}
944217309Snwhitehorn#endif /* HAVE_DLG_FORMBOX */
945217309Snwhitehorn
946217309Snwhitehorn#ifdef HAVE_DLG_MIXEDFORM
947217309Snwhitehornstatic int
948217309Snwhitehorncall_mixed_form(CALLARGS)
949217309Snwhitehorn{
950217309Snwhitehorn    int group = MIXEDFORM_TAGS;
951217309Snwhitehorn    int tags = howmany_tags(av + 5, group);
952217309Snwhitehorn    *offset_add = 5 + tags * group;
953217309Snwhitehorn
954217309Snwhitehorn    return dialog_mixedform(t,
955217309Snwhitehorn			    av[1],
956217309Snwhitehorn			    numeric_arg(av, 2),
957217309Snwhitehorn			    numeric_arg(av, 3),
958217309Snwhitehorn			    numeric_arg(av, 4),
959217309Snwhitehorn			    tags, av + 5);
960217309Snwhitehorn}
961217309Snwhitehorn#endif /* HAVE_DLG_MIXEDFORM */
962217309Snwhitehorn
963217309Snwhitehorn#ifdef HAVE_DLG_GAUGE
964217309Snwhitehornstatic int
965217309Snwhitehorncall_gauge(CALLARGS)
966217309Snwhitehorn{
967217309Snwhitehorn    *offset_add = arg_rest(av);
968217309Snwhitehorn    return dialog_gauge(t,
969217309Snwhitehorn			av[1],
970217309Snwhitehorn			numeric_arg(av, 2),
971217309Snwhitehorn			numeric_arg(av, 3),
972217309Snwhitehorn			optional_num(av, 4, 0));
973217309Snwhitehorn}
974217309Snwhitehorn
975217309Snwhitehornstatic int
976217309Snwhitehorncall_pause(CALLARGS)
977217309Snwhitehorn{
978217309Snwhitehorn    *offset_add = arg_rest(av);
979217309Snwhitehorn    return dialog_pause(t,
980217309Snwhitehorn			av[1],
981217309Snwhitehorn			numeric_arg(av, 2),
982217309Snwhitehorn			numeric_arg(av, 3),
983217309Snwhitehorn			numeric_arg(av, 4));
984217309Snwhitehorn}
985217309Snwhitehorn#endif
986217309Snwhitehorn
987217309Snwhitehorn#ifdef HAVE_MIXEDGAUGE
988217309Snwhitehornstatic int
989217309Snwhitehorncall_mixed_gauge(CALLARGS)
990217309Snwhitehorn{
991217309Snwhitehorn#define MIXEDGAUGE_BASE 5
992217309Snwhitehorn    int tags = howmany_tags(av + MIXEDGAUGE_BASE, MIXEDGAUGE_TAGS);
993217309Snwhitehorn    *offset_add = MIXEDGAUGE_BASE + tags * MIXEDGAUGE_TAGS;
994217309Snwhitehorn    return dialog_mixedgauge(t,
995217309Snwhitehorn			     av[1],
996217309Snwhitehorn			     numeric_arg(av, 2),
997217309Snwhitehorn			     numeric_arg(av, 3),
998217309Snwhitehorn			     numeric_arg(av, 4),
999217309Snwhitehorn			     tags, av + MIXEDGAUGE_BASE);
1000217309Snwhitehorn}
1001217309Snwhitehorn#endif
1002217309Snwhitehorn
1003224014Snwhitehorn#ifdef HAVE_DLG_GAUGE
1004220749Snwhitehornstatic int
1005220749Snwhitehorncall_prgbox(CALLARGS)
1006220749Snwhitehorn{
1007220749Snwhitehorn    *offset_add = arg_rest(av);
1008220749Snwhitehorn    /* the original version does not accept a prompt string, but for
1009220749Snwhitehorn     * consistency we allow it.
1010220749Snwhitehorn     */
1011220749Snwhitehorn    return ((*offset_add == 5)
1012220749Snwhitehorn	    ? dialog_prgbox(t,
1013220749Snwhitehorn			    av[1],
1014220749Snwhitehorn			    av[2],
1015220749Snwhitehorn			    numeric_arg(av, 3),
1016220749Snwhitehorn			    numeric_arg(av, 4), TRUE)
1017220749Snwhitehorn	    : dialog_prgbox(t,
1018220749Snwhitehorn			    "",
1019220749Snwhitehorn			    av[1],
1020220749Snwhitehorn			    numeric_arg(av, 2),
1021220749Snwhitehorn			    numeric_arg(av, 3), TRUE));
1022220749Snwhitehorn}
1023224014Snwhitehorn#endif
1024220749Snwhitehorn
1025217309Snwhitehorn#ifdef HAVE_DLG_GAUGE
1026217309Snwhitehornstatic int
1027220749Snwhitehorncall_programbox(CALLARGS)
1028220749Snwhitehorn{
1029220749Snwhitehorn    int result;
1030220749Snwhitehorn
1031220749Snwhitehorn    *offset_add = arg_rest(av);
1032220749Snwhitehorn    /* this function is a compromise between --prgbox and --progressbox.
1033220749Snwhitehorn     */
1034220749Snwhitehorn    result = ((*offset_add == 4)
1035220749Snwhitehorn	      ? dlg_progressbox(t,
1036220749Snwhitehorn				av[1],
1037220749Snwhitehorn				numeric_arg(av, 2),
1038220749Snwhitehorn				numeric_arg(av, 3),
1039220749Snwhitehorn				TRUE,
1040220749Snwhitehorn				dialog_state.pipe_input)
1041220749Snwhitehorn	      : dlg_progressbox(t,
1042220749Snwhitehorn				"",
1043220749Snwhitehorn				numeric_arg(av, 1),
1044220749Snwhitehorn				numeric_arg(av, 2),
1045220749Snwhitehorn				TRUE,
1046220749Snwhitehorn				dialog_state.pipe_input));
1047220749Snwhitehorn    dialog_state.pipe_input = 0;
1048220749Snwhitehorn    return result;
1049220749Snwhitehorn}
1050220749Snwhitehorn#endif
1051220749Snwhitehorn
1052220749Snwhitehorn#ifdef HAVE_DLG_GAUGE
1053220749Snwhitehornstatic int
1054217309Snwhitehorncall_progressbox(CALLARGS)
1055217309Snwhitehorn{
1056217309Snwhitehorn    *offset_add = arg_rest(av);
1057217309Snwhitehorn    /* the original version does not accept a prompt string, but for
1058217309Snwhitehorn     * consistency we allow it.
1059217309Snwhitehorn     */
1060217309Snwhitehorn    return ((*offset_add == 4)
1061217309Snwhitehorn	    ? dialog_progressbox(t,
1062217309Snwhitehorn				 av[1],
1063217309Snwhitehorn				 numeric_arg(av, 2),
1064217309Snwhitehorn				 numeric_arg(av, 3))
1065217309Snwhitehorn	    : dialog_progressbox(t,
1066217309Snwhitehorn				 "",
1067217309Snwhitehorn				 numeric_arg(av, 1),
1068217309Snwhitehorn				 numeric_arg(av, 2)));
1069217309Snwhitehorn}
1070217309Snwhitehorn#endif
1071217309Snwhitehorn
1072217309Snwhitehorn#ifdef HAVE_DLG_TAILBOX
1073217309Snwhitehornstatic int
1074217309Snwhitehorncall_tailbox(CALLARGS)
1075217309Snwhitehorn{
1076217309Snwhitehorn    *offset_add = 4;
1077217309Snwhitehorn    return dialog_tailbox(t,
1078217309Snwhitehorn			  av[1],
1079217309Snwhitehorn			  numeric_arg(av, 2),
1080217309Snwhitehorn			  numeric_arg(av, 3),
1081217309Snwhitehorn			  FALSE);
1082217309Snwhitehorn}
1083217309Snwhitehorn
1084217309Snwhitehornstatic int
1085217309Snwhitehorncall_tailboxbg(CALLARGS)
1086217309Snwhitehorn{
1087217309Snwhitehorn    *offset_add = 4;
1088217309Snwhitehorn    return dialog_tailbox(t,
1089217309Snwhitehorn			  av[1],
1090217309Snwhitehorn			  numeric_arg(av, 2),
1091217309Snwhitehorn			  numeric_arg(av, 3),
1092217309Snwhitehorn			  TRUE);
1093217309Snwhitehorn}
1094217309Snwhitehorn#endif
1095217309Snwhitehorn/* *INDENT-OFF* */
1096217309Snwhitehornstatic const Mode modes[] =
1097217309Snwhitehorn{
1098217309Snwhitehorn    {o_yesno,           4, 4, call_yesno},
1099217309Snwhitehorn    {o_msgbox,          4, 4, call_msgbox},
1100217309Snwhitehorn    {o_infobox,         4, 4, call_infobox},
1101217309Snwhitehorn    {o_textbox,         4, 4, call_textbox},
1102217309Snwhitehorn    {o_menu,            7, 0, call_menu},
1103217309Snwhitehorn    {o_inputmenu,       7, 0, call_inputmenu},
1104217309Snwhitehorn    {o_checklist,       8, 0, call_checklist},
1105217309Snwhitehorn    {o_radiolist,       8, 0, call_radiolist},
1106217309Snwhitehorn    {o_inputbox,        4, 5, call_inputbox},
1107217309Snwhitehorn    {o_passwordbox,     4, 5, call_passwordbox},
1108217309Snwhitehorn#ifdef HAVE_DLG_GAUGE
1109217309Snwhitehorn    {o_gauge,           4, 5, call_gauge},
1110217309Snwhitehorn    {o_pause,           5, 5, call_pause},
1111220749Snwhitehorn    {o_prgbox,          4, 5, call_prgbox},
1112220749Snwhitehorn    {o_programbox,      3, 4, call_programbox},
1113217309Snwhitehorn    {o_progressbox,     3, 4, call_progressbox},
1114217309Snwhitehorn#endif
1115217309Snwhitehorn#ifdef HAVE_DLG_FORMBOX
1116217309Snwhitehorn    {o_passwordform,   13, 0, call_password_form},
1117217309Snwhitehorn    {o_form,           13, 0, call_form},
1118217309Snwhitehorn#endif
1119217309Snwhitehorn#ifdef HAVE_MIXEDGAUGE
1120217309Snwhitehorn    {o_mixedgauge,      MIXEDGAUGE_BASE, 0, call_mixed_gauge},
1121217309Snwhitehorn#endif
1122217309Snwhitehorn#ifdef HAVE_DLG_MIXEDFORM
1123217309Snwhitehorn    {o_mixedform,      13, 0, call_mixed_form},
1124217309Snwhitehorn#endif
1125217309Snwhitehorn#ifdef HAVE_DLG_TAILBOX
1126217309Snwhitehorn    {o_tailbox,         4, 4, call_tailbox},
1127217309Snwhitehorn    {o_tailboxbg,       4, 4, call_tailboxbg},
1128217309Snwhitehorn#endif
1129217309Snwhitehorn#ifdef HAVE_XDIALOG
1130251843Sbapt    {o_buildlist,       4, 0, call_buildlist},
1131217309Snwhitehorn    {o_calendar,        4, 7, call_calendar},
1132217309Snwhitehorn    {o_dselect,         4, 5, call_dselect},
1133217309Snwhitehorn    {o_editbox,         4, 4, call_editbox},
1134217309Snwhitehorn    {o_fselect,         4, 5, call_fselect},
1135251843Sbapt    {o_rangebox,        5, 7, call_rangebox},
1136217309Snwhitehorn    {o_timebox,         4, 7, call_timebox},
1137251843Sbapt    {o_treeview,        4, 0, call_treeview},
1138217309Snwhitehorn#endif
1139217309Snwhitehorn};
1140217309Snwhitehorn/* *INDENT-ON* */
1141217309Snwhitehorn
1142217309Snwhitehornstatic char *
1143217309SnwhitehornoptionString(char **argv, int *num)
1144217309Snwhitehorn{
1145217309Snwhitehorn    int next = *num + 1;
1146217309Snwhitehorn    char *result = argv[next];
1147217309Snwhitehorn    if (result == 0) {
1148217309Snwhitehorn	char temp[80];
1149217309Snwhitehorn	sprintf(temp, "Expected a string-parameter for %.20s", argv[*num]);
1150217309Snwhitehorn	Usage(temp);
1151217309Snwhitehorn    }
1152217309Snwhitehorn    *num = next;
1153217309Snwhitehorn    return result;
1154217309Snwhitehorn}
1155217309Snwhitehorn
1156217309Snwhitehornstatic int
1157217309SnwhitehornoptionValue(char **argv, int *num)
1158217309Snwhitehorn{
1159217309Snwhitehorn    int next = *num + 1;
1160217309Snwhitehorn    char *src = argv[next];
1161217309Snwhitehorn    char *tmp = 0;
1162217309Snwhitehorn    int result = 0;
1163217309Snwhitehorn
1164217309Snwhitehorn    if (src != 0) {
1165220749Snwhitehorn	result = (int) strtol(src, &tmp, 0);
1166217309Snwhitehorn	if (tmp == 0 || *tmp != 0)
1167217309Snwhitehorn	    src = 0;
1168217309Snwhitehorn    }
1169217309Snwhitehorn
1170217309Snwhitehorn    if (src == 0) {
1171217309Snwhitehorn	char temp[80];
1172217309Snwhitehorn	sprintf(temp, "Expected a numeric-parameter for %.20s", argv[*num]);
1173217309Snwhitehorn	Usage(temp);
1174217309Snwhitehorn    }
1175217309Snwhitehorn    *num = next;
1176217309Snwhitehorn    return result;
1177217309Snwhitehorn}
1178217309Snwhitehorn
1179251843Sbapt/* Return exit-code for a named button */
1180251843Sbaptstatic int
1181251843Sbaptbutton_code(const char *name)
1182251843Sbapt{
1183251843Sbapt    /* *INDENT-OFF* */
1184251843Sbapt    static struct {
1185251843Sbapt	const char *name;
1186251843Sbapt	int code;
1187251843Sbapt    } table[] = {
1188251843Sbapt	{ "ok",	    DLG_EXIT_OK },
1189251843Sbapt	{ "yes",    DLG_EXIT_OK },
1190251843Sbapt	{ "cancel", DLG_EXIT_CANCEL },
1191251843Sbapt	{ "no",	    DLG_EXIT_CANCEL },
1192251843Sbapt	{ "help",   DLG_EXIT_HELP },
1193251843Sbapt	{ "extra",  DLG_EXIT_EXTRA },
1194251843Sbapt    };
1195251843Sbapt    /* *INDENT-ON* */
1196251843Sbapt
1197251843Sbapt    int code = DLG_EXIT_ERROR;
1198251843Sbapt    size_t i;
1199251843Sbapt
1200251843Sbapt    for (i = 0; i < (sizeof(table) / sizeof(table[0])); i++) {
1201251843Sbapt	if (!dlg_strcmp(name, table[i].name)) {
1202251843Sbapt	    code = table[i].code;
1203251843Sbapt	    break;
1204251843Sbapt	}
1205251843Sbapt    }
1206251843Sbapt
1207251843Sbapt    if (code == DLG_EXIT_ERROR) {
1208251843Sbapt	char temp[80];
1209251843Sbapt	sprintf(temp, "Button name \"%.20s\" unknown", name);
1210251843Sbapt	Usage(temp);
1211251843Sbapt    }
1212251843Sbapt
1213251843Sbapt    return code;
1214251843Sbapt}
1215251843Sbapt
1216217309Snwhitehorn/*
1217217309Snwhitehorn * Print parts of a message
1218217309Snwhitehorn */
1219217309Snwhitehornstatic void
1220217309SnwhitehornPrintList(const char *const *list)
1221217309Snwhitehorn{
1222217309Snwhitehorn    const char *leaf = strrchr(program, '/');
1223217309Snwhitehorn    unsigned n = 0;
1224217309Snwhitehorn
1225217309Snwhitehorn    if (leaf != 0)
1226217309Snwhitehorn	leaf++;
1227217309Snwhitehorn    else
1228217309Snwhitehorn	leaf = program;
1229217309Snwhitehorn
1230217309Snwhitehorn    while (*list != 0) {
1231217309Snwhitehorn	fprintf(dialog_state.output, *list, n ? leaf : dialog_version());
1232217309Snwhitehorn	(void) fputc('\n', dialog_state.output);
1233217309Snwhitehorn	n = 1;
1234217309Snwhitehorn	list++;
1235217309Snwhitehorn    }
1236217309Snwhitehorn}
1237217309Snwhitehorn
1238217309Snwhitehornstatic const Mode *
1239217309SnwhitehornlookupMode(eOptions code)
1240217309Snwhitehorn{
1241217309Snwhitehorn    const Mode *modePtr = 0;
1242217309Snwhitehorn    unsigned n;
1243217309Snwhitehorn
1244217309Snwhitehorn    for (n = 0; n < sizeof(modes) / sizeof(modes[0]); n++) {
1245217309Snwhitehorn	if (modes[n].code == code) {
1246217309Snwhitehorn	    modePtr = &modes[n];
1247217309Snwhitehorn	    break;
1248217309Snwhitehorn	}
1249217309Snwhitehorn    }
1250217309Snwhitehorn    return modePtr;
1251217309Snwhitehorn}
1252217309Snwhitehorn
1253217309Snwhitehornstatic int
1254217309Snwhitehorncompare_opts(const void *a, const void *b)
1255217309Snwhitehorn{
1256217309Snwhitehorn    Options *const *p = (Options * const *) a;
1257217309Snwhitehorn    Options *const *q = (Options * const *) b;
1258217309Snwhitehorn    return strcmp((*p)->name, (*q)->name);
1259217309Snwhitehorn}
1260217309Snwhitehorn
1261217309Snwhitehorn/*
1262224014Snwhitehorn * Print program's version.
1263224014Snwhitehorn */
1264224014Snwhitehornstatic void
1265224014SnwhitehornPrintVersion(FILE *fp)
1266224014Snwhitehorn{
1267224014Snwhitehorn    fprintf(fp, "Version: %s\n", dialog_version());
1268224014Snwhitehorn}
1269224014Snwhitehorn
1270224014Snwhitehorn/*
1271217309Snwhitehorn * Print program help-message
1272217309Snwhitehorn */
1273217309Snwhitehornstatic void
1274217309SnwhitehornHelp(void)
1275217309Snwhitehorn{
1276217309Snwhitehorn    static const char *const tbl_1[] =
1277217309Snwhitehorn    {
1278217309Snwhitehorn	"cdialog (ComeOn Dialog!) version %s",
1279251843Sbapt	"Copyright 2000-2012,2013 Thomas E. Dickey",
1280217309Snwhitehorn	"This is free software; see the source for copying conditions.  There is NO",
1281217309Snwhitehorn	"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.",
1282217309Snwhitehorn	"",
1283217309Snwhitehorn	"* Display dialog boxes from shell scripts *",
1284217309Snwhitehorn	"",
1285217309Snwhitehorn	"Usage: %s <options> { --and-widget <options> }",
1286217309Snwhitehorn	"where options are \"common\" options, followed by \"box\" options",
1287217309Snwhitehorn	"",
1288217309Snwhitehorn#ifdef HAVE_RC_FILE
1289217309Snwhitehorn	"Special options:",
1290217309Snwhitehorn	"  [--create-rc \"file\"]",
1291217309Snwhitehorn#endif
1292217309Snwhitehorn	0
1293217309Snwhitehorn    }, *const tbl_3[] =
1294217309Snwhitehorn    {
1295217309Snwhitehorn	"",
1296217309Snwhitehorn	"Auto-size with height and width = 0. Maximize with height and width = -1.",
1297217309Snwhitehorn	"Global-auto-size if also menu_height/list_height = 0.",
1298217309Snwhitehorn	0
1299217309Snwhitehorn    };
1300220749Snwhitehorn    size_t limit = sizeof(options) / sizeof(options[0]);
1301220749Snwhitehorn    size_t j, k;
1302217309Snwhitehorn    const Options **opts;
1303217309Snwhitehorn
1304224014Snwhitehorn    end_dialog();
1305224014Snwhitehorn    dialog_state.output = stdout;
1306224014Snwhitehorn
1307217309Snwhitehorn    opts = dlg_calloc(const Options *, limit);
1308217309Snwhitehorn    assert_ptr(opts, "Help");
1309217309Snwhitehorn    for (j = 0; j < limit; ++j) {
1310217309Snwhitehorn	opts[j] = &(options[j]);
1311217309Snwhitehorn    }
1312217309Snwhitehorn    qsort(opts, limit, sizeof(Options *), compare_opts);
1313217309Snwhitehorn
1314217309Snwhitehorn    PrintList(tbl_1);
1315217309Snwhitehorn    fprintf(dialog_state.output, "Common options:\n ");
1316217309Snwhitehorn    for (j = k = 0; j < limit; j++) {
1317217309Snwhitehorn	if ((opts[j]->pass & 1)
1318217309Snwhitehorn	    && opts[j]->help != 0) {
1319220749Snwhitehorn	    size_t len = 6 + strlen(opts[j]->name) + strlen(opts[j]->help);
1320217309Snwhitehorn	    k += len;
1321217309Snwhitehorn	    if (k > 75) {
1322217309Snwhitehorn		fprintf(dialog_state.output, "\n ");
1323217309Snwhitehorn		k = len;
1324217309Snwhitehorn	    }
1325217309Snwhitehorn	    fprintf(dialog_state.output, " [--%s%s%s]", opts[j]->name,
1326217309Snwhitehorn		    *(opts[j]->help) ? " " : "", opts[j]->help);
1327217309Snwhitehorn	}
1328217309Snwhitehorn    }
1329217309Snwhitehorn    fprintf(dialog_state.output, "\nBox options:\n");
1330217309Snwhitehorn    for (j = 0; j < limit; j++) {
1331217309Snwhitehorn	if ((opts[j]->pass & 2) != 0
1332217309Snwhitehorn	    && opts[j]->help != 0
1333217309Snwhitehorn	    && lookupMode(opts[j]->code))
1334217309Snwhitehorn	    fprintf(dialog_state.output, "  --%-12s %s\n", opts[j]->name,
1335217309Snwhitehorn		    opts[j]->help);
1336217309Snwhitehorn    }
1337217309Snwhitehorn    PrintList(tbl_3);
1338217309Snwhitehorn
1339217309Snwhitehorn    free(opts);
1340217309Snwhitehorn    dlg_exit(DLG_EXIT_OK);
1341217309Snwhitehorn}
1342217309Snwhitehorn
1343251843Sbapt#ifdef HAVE_DLG_TRACE
1344217309Snwhitehorn/*
1345251843Sbapt * Only the first call to dlg_trace will open a trace file.  But each time
1346251843Sbapt * --trace is parsed, we show the whole parameter list as it is at that moment,
1347251843Sbapt * counting discarded parameters.  The only way to capture the whole parameter
1348251843Sbapt * list is if --trace is the first option.
1349251843Sbapt */
1350251843Sbaptstatic void
1351251843Sbaptprocess_trace_option(char **argv, int *offset)
1352251843Sbapt{
1353251843Sbapt    int j;
1354251843Sbapt
1355251843Sbapt    if (dialog_state.trace_output == 0) {
1356251843Sbapt	dlg_trace(optionString(argv, offset));
1357251843Sbapt    } else {
1358251843Sbapt	dlg_trace_msg("# ignore extra --trace option\n");
1359251843Sbapt	*offset += 1;
1360251843Sbapt    }
1361251843Sbapt
1362251843Sbapt    dlg_trace_msg("# Parameters:\n");
1363251843Sbapt    for (j = 0; argv[j] != 0; ++j) {
1364251843Sbapt	dlg_trace_msg("# argv[%d] = %s\n", j, argv[j]);
1365251843Sbapt    }
1366251843Sbapt}
1367251843Sbapt#endif
1368251843Sbapt
1369251843Sbapt/*
1370217309Snwhitehorn * "Common" options apply to all widgets more/less.  Most of the common options
1371217309Snwhitehorn * set values in dialog_vars, a few set dialog_state and a couple write to the
1372217309Snwhitehorn * output stream.
1373217309Snwhitehorn */
1374217309Snwhitehornstatic int
1375217309Snwhitehornprocess_common_options(int argc, char **argv, int offset, bool output)
1376217309Snwhitehorn{
1377217309Snwhitehorn    bool done = FALSE;
1378217309Snwhitehorn
1379251843Sbapt    dlg_trace_msg("# process_common_options, offset %d\n", offset);
1380251843Sbapt
1381217309Snwhitehorn    while (offset < argc && !done) {	/* Common options */
1382251843Sbapt	dlg_trace_msg("#\targv[%d] = %s\n", offset, argv[offset]);
1383217309Snwhitehorn	switch (lookupOption(argv[offset], 1)) {
1384217309Snwhitehorn	case o_title:
1385217309Snwhitehorn	    dialog_vars.title = optionString(argv, &offset);
1386217309Snwhitehorn	    break;
1387217309Snwhitehorn	case o_backtitle:
1388217309Snwhitehorn	    dialog_vars.backtitle = optionString(argv, &offset);
1389217309Snwhitehorn	    break;
1390217309Snwhitehorn	case o_separate_widget:
1391217309Snwhitehorn	    dialog_state.separate_str = optionString(argv, &offset);
1392217309Snwhitehorn	    break;
1393217309Snwhitehorn	case o_separate_output:
1394217309Snwhitehorn	    dialog_vars.separate_output = TRUE;
1395217309Snwhitehorn	    break;
1396217309Snwhitehorn	case o_colors:
1397217309Snwhitehorn	    dialog_vars.colors = TRUE;
1398217309Snwhitehorn	    break;
1399217309Snwhitehorn	case o_cr_wrap:
1400217309Snwhitehorn	    dialog_vars.cr_wrap = TRUE;
1401217309Snwhitehorn	    break;
1402224014Snwhitehorn	case o_no_nl_expand:
1403224014Snwhitehorn	    dialog_vars.no_nl_expand = TRUE;
1404224014Snwhitehorn	    break;
1405217309Snwhitehorn	case o_no_collapse:
1406217309Snwhitehorn	    dialog_vars.nocollapse = TRUE;
1407217309Snwhitehorn	    break;
1408217309Snwhitehorn	case o_no_kill:
1409217309Snwhitehorn	    dialog_vars.cant_kill = TRUE;
1410217309Snwhitehorn	    break;
1411217309Snwhitehorn	case o_nocancel:
1412217309Snwhitehorn	    dialog_vars.nocancel = TRUE;
1413217309Snwhitehorn	    break;
1414217309Snwhitehorn	case o_nook:
1415217309Snwhitehorn	    dialog_vars.nook = TRUE;
1416217309Snwhitehorn	    break;
1417217309Snwhitehorn	case o_quoted:
1418217309Snwhitehorn	    dialog_vars.quoted = TRUE;
1419217309Snwhitehorn	    break;
1420217309Snwhitehorn	case o_single_quoted:
1421217309Snwhitehorn	    dialog_vars.single_quoted = TRUE;
1422217309Snwhitehorn	    break;
1423217309Snwhitehorn	case o_size_err:
1424217309Snwhitehorn	    dialog_vars.size_err = TRUE;
1425217309Snwhitehorn	    break;
1426217309Snwhitehorn	case o_beep:
1427217309Snwhitehorn	    dialog_vars.beep_signal = TRUE;
1428217309Snwhitehorn	    break;
1429217309Snwhitehorn	case o_beep_after:
1430217309Snwhitehorn	    dialog_vars.beep_after_signal = TRUE;
1431217309Snwhitehorn	    break;
1432217309Snwhitehorn	case o_scrollbar:
1433217309Snwhitehorn	    dialog_state.use_scrollbar = TRUE;
1434217309Snwhitehorn	    break;
1435217309Snwhitehorn	case o_shadow:
1436217309Snwhitehorn	    dialog_state.use_shadow = TRUE;
1437217309Snwhitehorn	    break;
1438217309Snwhitehorn	case o_defaultno:
1439217309Snwhitehorn	    dialog_vars.defaultno = TRUE;
1440251843Sbapt	    dialog_vars.default_button = DLG_EXIT_CANCEL;
1441217309Snwhitehorn	    break;
1442251843Sbapt	case o_default_button:
1443251843Sbapt	    dialog_vars.default_button = button_code(optionString(argv, &offset));
1444251843Sbapt	    dialog_vars.defaultno = dialog_vars.default_button == DLG_EXIT_CANCEL;
1445251843Sbapt	    break;
1446217309Snwhitehorn	case o_default_item:
1447217309Snwhitehorn	    dialog_vars.default_item = optionString(argv, &offset);
1448217309Snwhitehorn	    break;
1449217309Snwhitehorn	case o_insecure:
1450217309Snwhitehorn	    dialog_vars.insecure = TRUE;
1451217309Snwhitehorn	    break;
1452217309Snwhitehorn	case o_item_help:
1453217309Snwhitehorn	    dialog_vars.item_help = TRUE;
1454217309Snwhitehorn	    break;
1455224014Snwhitehorn	case o_help_line:
1456224014Snwhitehorn	    dialog_vars.help_line = optionString(argv, &offset);
1457224014Snwhitehorn	    break;
1458224014Snwhitehorn	case o_help_file:
1459224014Snwhitehorn	    dialog_vars.help_file = optionString(argv, &offset);
1460224014Snwhitehorn	    break;
1461217309Snwhitehorn	case o_help_button:
1462217309Snwhitehorn	    dialog_vars.help_button = TRUE;
1463217309Snwhitehorn	    break;
1464217309Snwhitehorn	case o_help_status:
1465217309Snwhitehorn	    dialog_vars.help_status = TRUE;
1466217309Snwhitehorn	    break;
1467255852Sdteske	case o_help_tags:
1468255852Sdteske	    dialog_vars.help_tags = TRUE;
1469255852Sdteske	    break;
1470217309Snwhitehorn	case o_extra_button:
1471217309Snwhitehorn	    dialog_vars.extra_button = TRUE;
1472217309Snwhitehorn	    break;
1473217309Snwhitehorn	case o_ignore:
1474217309Snwhitehorn	    ignore_unknown = TRUE;
1475217309Snwhitehorn	    break;
1476217309Snwhitehorn	case o_keep_window:
1477217309Snwhitehorn	    dialog_vars.keep_window = TRUE;
1478217309Snwhitehorn	    break;
1479251843Sbapt	case o_last_key:
1480251843Sbapt	    dialog_vars.last_key = TRUE;
1481251843Sbapt	    break;
1482217309Snwhitehorn	case o_no_shadow:
1483217309Snwhitehorn	    dialog_state.use_shadow = FALSE;
1484217309Snwhitehorn	    break;
1485217309Snwhitehorn	case o_print_size:
1486217309Snwhitehorn	    dialog_vars.print_siz = TRUE;
1487217309Snwhitehorn	    break;
1488217309Snwhitehorn	case o_print_maxsize:
1489217309Snwhitehorn	    if (output) {
1490217309Snwhitehorn		/*
1491217309Snwhitehorn		 * If this is the last option, we do not want any error
1492217309Snwhitehorn		 * messages - just our output.  Calling end_dialog() cancels
1493217309Snwhitehorn		 * the refresh() at the end of the program as well.
1494217309Snwhitehorn		 */
1495217309Snwhitehorn		if (argv[offset + 1] == 0) {
1496217309Snwhitehorn		    ignore_unknown = TRUE;
1497217309Snwhitehorn		    end_dialog();
1498217309Snwhitehorn		}
1499217309Snwhitehorn		fflush(dialog_state.output);
1500217309Snwhitehorn		fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);
1501217309Snwhitehorn	    }
1502217309Snwhitehorn	    break;
1503217309Snwhitehorn	case o_print_version:
1504217309Snwhitehorn	    if (output) {
1505224014Snwhitehorn		PrintVersion(dialog_state.output);
1506217309Snwhitehorn	    }
1507217309Snwhitehorn	    break;
1508217309Snwhitehorn	case o_separator:
1509217309Snwhitehorn	case o_output_separator:
1510217309Snwhitehorn	    dialog_vars.output_separator = optionString(argv, &offset);
1511217309Snwhitehorn	    break;
1512217309Snwhitehorn	case o_column_separator:
1513217309Snwhitehorn	    dialog_vars.column_separator = optionString(argv, &offset);
1514217309Snwhitehorn	    break;
1515217309Snwhitehorn	case o_tab_correct:
1516217309Snwhitehorn	    dialog_vars.tab_correct = TRUE;
1517217309Snwhitehorn	    break;
1518217309Snwhitehorn	case o_sleep:
1519217309Snwhitehorn	    dialog_vars.sleep_secs = optionValue(argv, &offset);
1520217309Snwhitehorn	    break;
1521217309Snwhitehorn	case o_timeout:
1522217309Snwhitehorn	    dialog_vars.timeout_secs = optionValue(argv, &offset);
1523217309Snwhitehorn	    break;
1524217309Snwhitehorn	case o_max_input:
1525217309Snwhitehorn	    dialog_vars.max_input = optionValue(argv, &offset);
1526217309Snwhitehorn	    break;
1527217309Snwhitehorn	case o_tab_len:
1528217309Snwhitehorn	    dialog_state.tab_len = optionValue(argv, &offset);
1529217309Snwhitehorn	    break;
1530217309Snwhitehorn	case o_trim:
1531217309Snwhitehorn	    dialog_vars.trim_whitespace = TRUE;
1532217309Snwhitehorn	    break;
1533217309Snwhitehorn	case o_visit_items:
1534217309Snwhitehorn	    dialog_state.visit_items = TRUE;
1535251843Sbapt	    dialog_state.visit_cols = 1;
1536217309Snwhitehorn	    break;
1537217309Snwhitehorn	case o_aspect:
1538217309Snwhitehorn	    dialog_state.aspect_ratio = optionValue(argv, &offset);
1539217309Snwhitehorn	    break;
1540217309Snwhitehorn	case o_begin:
1541217309Snwhitehorn	    dialog_vars.begin_set = TRUE;
1542217309Snwhitehorn	    dialog_vars.begin_y = optionValue(argv, &offset);
1543217309Snwhitehorn	    dialog_vars.begin_x = optionValue(argv, &offset);
1544217309Snwhitehorn	    break;
1545217309Snwhitehorn	case o_clear:
1546217309Snwhitehorn	    dialog_vars.dlg_clear_screen = TRUE;
1547217309Snwhitehorn	    break;
1548217309Snwhitehorn	case o_yes_label:
1549217309Snwhitehorn	    dialog_vars.yes_label = optionString(argv, &offset);
1550217309Snwhitehorn	    break;
1551217309Snwhitehorn	case o_no_label:
1552217309Snwhitehorn	    dialog_vars.no_label = optionString(argv, &offset);
1553217309Snwhitehorn	    break;
1554217309Snwhitehorn	case o_ok_label:
1555217309Snwhitehorn	    dialog_vars.ok_label = optionString(argv, &offset);
1556217309Snwhitehorn	    break;
1557217309Snwhitehorn	case o_cancel_label:
1558217309Snwhitehorn	    dialog_vars.cancel_label = optionString(argv, &offset);
1559217309Snwhitehorn	    break;
1560217309Snwhitehorn	case o_extra_label:
1561217309Snwhitehorn	    dialog_vars.extra_label = optionString(argv, &offset);
1562217309Snwhitehorn	    break;
1563217309Snwhitehorn	case o_exit_label:
1564217309Snwhitehorn	    dialog_vars.exit_label = optionString(argv, &offset);
1565217309Snwhitehorn	    break;
1566217309Snwhitehorn	case o_help_label:
1567217309Snwhitehorn	    dialog_vars.help_label = optionString(argv, &offset);
1568217309Snwhitehorn	    break;
1569217309Snwhitehorn	case o_date_format:
1570217309Snwhitehorn	    dialog_vars.date_format = optionString(argv, &offset);
1571217309Snwhitehorn	    break;
1572217309Snwhitehorn	case o_time_format:
1573217309Snwhitehorn	    dialog_vars.time_format = optionString(argv, &offset);
1574217309Snwhitehorn	    break;
1575217309Snwhitehorn	case o_keep_tite:
1576217309Snwhitehorn	    dialog_vars.keep_tite = TRUE;
1577217309Snwhitehorn	    break;
1578217309Snwhitehorn	case o_ascii_lines:
1579217309Snwhitehorn	    dialog_vars.ascii_lines = TRUE;
1580217309Snwhitehorn	    dialog_vars.no_lines = FALSE;
1581217309Snwhitehorn	    break;
1582217309Snwhitehorn	case o_no_lines:
1583217309Snwhitehorn	    dialog_vars.no_lines = TRUE;
1584217309Snwhitehorn	    dialog_vars.ascii_lines = FALSE;
1585217309Snwhitehorn	    break;
1586220749Snwhitehorn	case o_no_mouse:
1587220749Snwhitehorn	    dialog_state.no_mouse = TRUE;
1588224014Snwhitehorn	    mouse_close();
1589220749Snwhitehorn	    break;
1590251843Sbapt#ifdef HAVE_WHIPTAIL
1591251843Sbapt	case o_topleft:
1592251843Sbapt	    dialog_vars.begin_set = TRUE;
1593251843Sbapt	    dialog_vars.begin_y = 0;
1594251843Sbapt	    dialog_vars.begin_x = 0;
1595251843Sbapt	    break;
1596217309Snwhitehorn	case o_fullbutton:
1597217309Snwhitehorn	    /* ignore */
1598217309Snwhitehorn	    break;
1599251843Sbapt#endif
1600217309Snwhitehorn	    /* options of Xdialog which we ignore */
1601217309Snwhitehorn	case o_icon:
1602217309Snwhitehorn	case o_wmclass:
1603217309Snwhitehorn	    (void) optionString(argv, &offset);
1604217309Snwhitehorn	    /* FALLTHRU */
1605217309Snwhitehorn	case o_allow_close:
1606217309Snwhitehorn	case o_auto_placement:
1607217309Snwhitehorn	case o_fixed_font:
1608217309Snwhitehorn	case o_keep_colors:
1609217309Snwhitehorn	case o_no_close:
1610217309Snwhitehorn	case o_no_cr_wrap:
1611217309Snwhitehorn	case o_screen_center:
1612217309Snwhitehorn	case o_smooth:
1613217309Snwhitehorn	case o_under_mouse:
1614217309Snwhitehorn	    break;
1615217309Snwhitehorn	case o_unknown:
1616217309Snwhitehorn	    if (ignore_unknown)
1617217309Snwhitehorn		break;
1618217309Snwhitehorn	    /* FALLTHRU */
1619217309Snwhitehorn	default:		/* no more common options */
1620217309Snwhitehorn	    done = TRUE;
1621217309Snwhitehorn	    break;
1622217309Snwhitehorn#ifdef HAVE_DLG_TRACE
1623217309Snwhitehorn	case o_trace:
1624251843Sbapt	    process_trace_option(argv, &offset);
1625217309Snwhitehorn	    break;
1626217309Snwhitehorn#endif
1627251843Sbapt#if defined(HAVE_XDIALOG2) || defined(HAVE_WHIPTAIL)
1628251843Sbapt	case o_no_items:
1629251843Sbapt	    dialog_vars.no_items = TRUE;
1630251843Sbapt	    break;
1631251843Sbapt	case o_no_tags:
1632251843Sbapt	    dialog_vars.no_tags = TRUE;
1633251843Sbapt	    break;
1634251843Sbapt#endif
1635217309Snwhitehorn	}
1636217309Snwhitehorn	if (!done)
1637217309Snwhitehorn	    offset++;
1638217309Snwhitehorn    }
1639217309Snwhitehorn    return offset;
1640217309Snwhitehorn}
1641217309Snwhitehorn
1642217309Snwhitehorn/*
1643217309Snwhitehorn * Initialize options at the start of a series of common options culminating
1644217309Snwhitehorn * in a widget.
1645217309Snwhitehorn */
1646217309Snwhitehornstatic void
1647217309Snwhitehorninit_result(char *buffer)
1648217309Snwhitehorn{
1649217309Snwhitehorn    static bool first = TRUE;
1650217309Snwhitehorn    static char **special_argv = 0;
1651217309Snwhitehorn    static int special_argc = 0;
1652217309Snwhitehorn
1653251843Sbapt    dlg_trace_msg("# init_result\n");
1654251843Sbapt
1655217309Snwhitehorn    /* clear everything we do not save for the next widget */
1656217309Snwhitehorn    memset(&dialog_vars, 0, sizeof(dialog_vars));
1657217309Snwhitehorn
1658217309Snwhitehorn    dialog_vars.input_result = buffer;
1659217309Snwhitehorn    dialog_vars.input_result[0] = '\0';
1660217309Snwhitehorn
1661251843Sbapt    dialog_vars.default_button = -1;
1662251843Sbapt
1663217309Snwhitehorn    /*
1664217309Snwhitehorn     * The first time this is called, check for common options given by an
1665217309Snwhitehorn     * environment variable.
1666217309Snwhitehorn     */
1667217309Snwhitehorn    if (first) {
1668217309Snwhitehorn	char *env = getenv("DIALOGOPTS");
1669217309Snwhitehorn	if (env != 0)
1670217309Snwhitehorn	    env = dlg_strclone(env);
1671217309Snwhitehorn	if (env != 0) {
1672220749Snwhitehorn	    special_argv = dlg_string_to_argv(env);
1673220749Snwhitehorn	    special_argc = dlg_count_argv(special_argv);
1674217309Snwhitehorn	}
1675251843Sbapt	first = FALSE;
1676217309Snwhitehorn    }
1677251843Sbapt
1678251843Sbapt    /*
1679251843Sbapt     * If we are not checking memory leaks, just do the parse of the
1680251843Sbapt     * environment once.
1681251843Sbapt     */
1682217309Snwhitehorn    if (special_argv != 0) {
1683217309Snwhitehorn	process_common_options(special_argc, special_argv, 0, FALSE);
1684217309Snwhitehorn#ifdef NO_LEAKS
1685217309Snwhitehorn	free(special_argv[0]);
1686217309Snwhitehorn	free(special_argv);
1687251843Sbapt	special_argv = 0;
1688251843Sbapt	special_argc = 0;
1689217309Snwhitehorn	first = TRUE;
1690217309Snwhitehorn#endif
1691217309Snwhitehorn    }
1692217309Snwhitehorn}
1693217309Snwhitehorn
1694217309Snwhitehornint
1695217309Snwhitehornmain(int argc, char *argv[])
1696217309Snwhitehorn{
1697217309Snwhitehorn    char temp[256];
1698217309Snwhitehorn    bool esc_pressed = FALSE;
1699217309Snwhitehorn    bool keep_tite = FALSE;
1700217309Snwhitehorn    int offset = 1;
1701217309Snwhitehorn    int offset_add;
1702217309Snwhitehorn    int retval = DLG_EXIT_OK;
1703217309Snwhitehorn    int j, have;
1704217309Snwhitehorn    eOptions code;
1705217309Snwhitehorn    const Mode *modePtr;
1706217309Snwhitehorn    char my_buffer[MAX_LEN + 1];
1707217309Snwhitehorn
1708217309Snwhitehorn    memset(&dialog_state, 0, sizeof(dialog_state));
1709217309Snwhitehorn    memset(&dialog_vars, 0, sizeof(dialog_vars));
1710217309Snwhitehorn
1711217309Snwhitehorn#if defined(ENABLE_NLS)
1712217309Snwhitehorn    /* initialize locale support */
1713217309Snwhitehorn    setlocale(LC_ALL, "");
1714220749Snwhitehorn    bindtextdomain(NLS_TEXTDOMAIN, LOCALEDIR);
1715220749Snwhitehorn    textdomain(NLS_TEXTDOMAIN);
1716217309Snwhitehorn#elif defined(HAVE_SETLOCALE)
1717217309Snwhitehorn    (void) setlocale(LC_ALL, "");
1718217309Snwhitehorn#endif
1719217309Snwhitehorn
1720217309Snwhitehorn    unescape_argv(&argc, &argv);
1721217309Snwhitehorn    program = argv[0];
1722217309Snwhitehorn    dialog_state.output = stderr;
1723217309Snwhitehorn    dialog_state.input = stdin;
1724217309Snwhitehorn
1725217309Snwhitehorn    /*
1726217309Snwhitehorn     * Look for the last --stdout, --stderr or --output-fd option, and use
1727217309Snwhitehorn     * that.  We can only write to one of them.  If --stdout is used, that
1728217309Snwhitehorn     * can interfere with initializing the curses library, so we want to
1729217309Snwhitehorn     * know explicitly if it is used.
1730224014Snwhitehorn     *
1731224014Snwhitehorn     * Also, look for any --version or --help message, processing those
1732224014Snwhitehorn     * immediately.
1733217309Snwhitehorn     */
1734217309Snwhitehorn    while (offset < argc) {
1735217309Snwhitehorn	int base = offset;
1736217309Snwhitehorn	switch (lookupOption(argv[offset], 7)) {
1737217309Snwhitehorn	case o_stdout:
1738217309Snwhitehorn	    dialog_state.output = stdout;
1739217309Snwhitehorn	    break;
1740217309Snwhitehorn	case o_stderr:
1741217309Snwhitehorn	    dialog_state.output = stderr;
1742217309Snwhitehorn	    break;
1743217309Snwhitehorn	case o_input_fd:
1744217309Snwhitehorn	    if ((j = optionValue(argv, &offset)) < 0
1745217309Snwhitehorn		|| (dialog_state.input = fdopen(j, "r")) == 0)
1746217309Snwhitehorn		dlg_exiterr("Cannot open input-fd\n");
1747217309Snwhitehorn	    break;
1748217309Snwhitehorn	case o_output_fd:
1749217309Snwhitehorn	    if ((j = optionValue(argv, &offset)) < 0
1750217309Snwhitehorn		|| (dialog_state.output = fdopen(j, "w")) == 0)
1751217309Snwhitehorn		dlg_exiterr("Cannot open output-fd\n");
1752217309Snwhitehorn	    break;
1753217309Snwhitehorn	case o_keep_tite:
1754217309Snwhitehorn	    keep_tite = TRUE;
1755217309Snwhitehorn	    break;
1756224014Snwhitehorn	case o_version:
1757224014Snwhitehorn	    dialog_state.output = stdout;
1758224014Snwhitehorn	    PrintVersion(dialog_state.output);
1759224014Snwhitehorn	    exit(DLG_EXIT_OK);
1760224014Snwhitehorn	    break;
1761224014Snwhitehorn	case o_help:
1762224014Snwhitehorn	    Help();
1763224014Snwhitehorn	    break;
1764251843Sbapt#ifdef HAVE_DLG_TRACE
1765251843Sbapt	case o_trace:
1766251843Sbapt	    /*
1767251843Sbapt	     * Process/remove the --trace option if it is the first option.
1768251843Sbapt	     * Otherwise, process it in more/less expected order as a
1769251843Sbapt	     * "common" option.
1770251843Sbapt	     */
1771251843Sbapt	    if (base == 1) {
1772251843Sbapt		process_trace_option(argv, &offset);
1773251843Sbapt		break;
1774251843Sbapt	    } else {
1775251843Sbapt		++offset;
1776251843Sbapt		continue;
1777251843Sbapt	    }
1778251843Sbapt#endif
1779217309Snwhitehorn	default:
1780217309Snwhitehorn	    ++offset;
1781217309Snwhitehorn	    continue;
1782217309Snwhitehorn	}
1783251843Sbapt	dlg_trace_msg("# discarding %d parameters starting with argv[%d] (%s)\n",
1784251843Sbapt		      1 + offset - base, base,
1785251843Sbapt		      argv[base]);
1786217309Snwhitehorn	for (j = base; j < argc; ++j) {
1787217309Snwhitehorn	    dialog_argv[j] = dialog_argv[j + 1 + (offset - base)];
1788217309Snwhitehorn	    if (dialog_opts != 0)
1789217309Snwhitehorn		dialog_opts[j] = dialog_opts[j + 1 + (offset - base)];
1790217309Snwhitehorn	}
1791217309Snwhitehorn	argc -= (1 + offset - base);
1792217309Snwhitehorn	offset = base;
1793217309Snwhitehorn    }
1794217309Snwhitehorn    offset = 1;
1795217309Snwhitehorn    init_result(my_buffer);
1796217309Snwhitehorn
1797224014Snwhitehorn    /*
1798224014Snwhitehorn     * Dialog's output may be redirected (see above).  Handle the special
1799224014Snwhitehorn     * case of options that only report information without interaction.
1800224014Snwhitehorn     */
1801224014Snwhitehorn    if (argc == 2) {
1802217309Snwhitehorn	switch (lookupOption(argv[1], 7)) {
1803217309Snwhitehorn	case o_print_maxsize:
1804217309Snwhitehorn	    (void) initscr();
1805217309Snwhitehorn	    endwin();
1806217309Snwhitehorn	    fflush(dialog_state.output);
1807217309Snwhitehorn	    fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);
1808217309Snwhitehorn	    break;
1809217309Snwhitehorn	case o_print_version:
1810224014Snwhitehorn	    PrintVersion(dialog_state.output);
1811217309Snwhitehorn	    break;
1812217309Snwhitehorn	case o_clear:
1813217309Snwhitehorn	    initscr();
1814217309Snwhitehorn	    refresh();
1815217309Snwhitehorn	    endwin();
1816217309Snwhitehorn	    break;
1817217309Snwhitehorn	case o_ignore:
1818217309Snwhitehorn	    break;
1819217309Snwhitehorn	default:
1820217309Snwhitehorn	    Help();
1821217309Snwhitehorn	    break;
1822217309Snwhitehorn	}
1823217309Snwhitehorn	return DLG_EXIT_OK;
1824217309Snwhitehorn    }
1825217309Snwhitehorn
1826217309Snwhitehorn    if (argc < 2) {
1827217309Snwhitehorn	Help();
1828217309Snwhitehorn    }
1829217309Snwhitehorn#ifdef HAVE_RC_FILE
1830217309Snwhitehorn    if (lookupOption(argv[1], 7) == o_create_rc) {
1831217309Snwhitehorn	if (argc != 3) {
1832217309Snwhitehorn	    sprintf(temp, "Expected a filename for %.50s", argv[1]);
1833217309Snwhitehorn	    Usage(temp);
1834217309Snwhitehorn	}
1835217309Snwhitehorn	if (dlg_parse_rc() == -1)	/* Read the configuration file */
1836217309Snwhitehorn	    dlg_exiterr("dialog: dlg_parse_rc");
1837217309Snwhitehorn	dlg_create_rc(argv[2]);
1838217309Snwhitehorn	return DLG_EXIT_OK;
1839217309Snwhitehorn    }
1840217309Snwhitehorn#endif
1841217309Snwhitehorn
1842217309Snwhitehorn    dialog_vars.keep_tite = keep_tite;	/* init_result() cleared global */
1843217309Snwhitehorn
1844217309Snwhitehorn    init_dialog(dialog_state.input, dialog_state.output);
1845217309Snwhitehorn
1846217309Snwhitehorn    while (offset < argc && !esc_pressed) {
1847217309Snwhitehorn	init_result(my_buffer);
1848217309Snwhitehorn
1849217309Snwhitehorn	offset = process_common_options(argc, argv, offset, TRUE);
1850217309Snwhitehorn
1851217309Snwhitehorn	if (argv[offset] == NULL) {
1852217309Snwhitehorn	    if (ignore_unknown)
1853217309Snwhitehorn		break;
1854217309Snwhitehorn	    Usage("Expected a box option");
1855217309Snwhitehorn	}
1856217309Snwhitehorn
1857217309Snwhitehorn	if (lookupOption(argv[offset], 2) != o_checklist
1858217309Snwhitehorn	    && dialog_vars.separate_output) {
1859217309Snwhitehorn	    sprintf(temp, "Expected --checklist, not %.20s", argv[offset]);
1860217309Snwhitehorn	    Usage(temp);
1861217309Snwhitehorn	}
1862217309Snwhitehorn
1863217309Snwhitehorn	if (dialog_state.aspect_ratio == 0)
1864217309Snwhitehorn	    dialog_state.aspect_ratio = DEFAULT_ASPECT_RATIO;
1865217309Snwhitehorn
1866217309Snwhitehorn	dlg_put_backtitle();
1867217309Snwhitehorn
1868217309Snwhitehorn	/* use a table to look for the requested mode, to avoid code duplication */
1869217309Snwhitehorn
1870217309Snwhitehorn	modePtr = 0;
1871217309Snwhitehorn	if ((code = lookupOption(argv[offset], 2)) != o_unknown)
1872217309Snwhitehorn	    modePtr = lookupMode(code);
1873217309Snwhitehorn	if (modePtr == 0) {
1874217309Snwhitehorn	    sprintf(temp, "%s option %.20s",
1875217309Snwhitehorn		    lookupOption(argv[offset], 7) != o_unknown
1876217309Snwhitehorn		    ? "Unexpected"
1877217309Snwhitehorn		    : "Unknown",
1878217309Snwhitehorn		    argv[offset]);
1879217309Snwhitehorn	    Usage(temp);
1880217309Snwhitehorn	}
1881217309Snwhitehorn
1882217309Snwhitehorn	have = arg_rest(&argv[offset]);
1883217309Snwhitehorn	if (have < modePtr->argmin) {
1884217309Snwhitehorn	    sprintf(temp, "Expected at least %d tokens for %.20s, have %d",
1885217309Snwhitehorn		    modePtr->argmin - 1, argv[offset],
1886217309Snwhitehorn		    have - 1);
1887217309Snwhitehorn	    Usage(temp);
1888217309Snwhitehorn	}
1889217309Snwhitehorn	if (modePtr->argmax && have > modePtr->argmax) {
1890217309Snwhitehorn	    sprintf(temp,
1891217309Snwhitehorn		    "Expected no more than %d tokens for %.20s, have %d",
1892217309Snwhitehorn		    modePtr->argmax - 1, argv[offset],
1893217309Snwhitehorn		    have - 1);
1894217309Snwhitehorn	    Usage(temp);
1895217309Snwhitehorn	}
1896217309Snwhitehorn
1897217309Snwhitehorn	/*
1898217309Snwhitehorn	 * Trim whitespace from non-title option values, e.g., the ones that
1899217309Snwhitehorn	 * will be used as captions or prompts.   Do that only for the widget
1900217309Snwhitehorn	 * we are about to process, since the "--trim" option is reset before
1901217309Snwhitehorn	 * accumulating options for each widget.
1902217309Snwhitehorn	 */
1903217309Snwhitehorn	for (j = offset + 1; j <= offset + have; j++) {
1904217309Snwhitehorn	    switch (lookupOption(argv[j - 1], 7)) {
1905217309Snwhitehorn	    case o_unknown:
1906217309Snwhitehorn	    case o_title:
1907217309Snwhitehorn	    case o_backtitle:
1908224014Snwhitehorn	    case o_help_line:
1909224014Snwhitehorn	    case o_help_file:
1910217309Snwhitehorn		break;
1911217309Snwhitehorn	    default:
1912217309Snwhitehorn		if (argv[j] != 0) {
1913251843Sbapt		    char *argv_j = strdup(argv[j]);
1914251843Sbapt		    if (argv_j != 0) {
1915251843Sbapt			dlg_trim_string(argv_j);
1916251843Sbapt			argv[j] = argv_j;
1917251843Sbapt		    } else {
1918251843Sbapt			argv[j] = strdup("?");
1919251843Sbapt		    }
1920217309Snwhitehorn		}
1921217309Snwhitehorn		break;
1922217309Snwhitehorn	    }
1923217309Snwhitehorn	}
1924217309Snwhitehorn
1925217309Snwhitehorn	retval = show_result((*(modePtr->jumper)) (dialog_vars.title,
1926217309Snwhitehorn						   argv + offset,
1927217309Snwhitehorn						   &offset_add));
1928251843Sbapt	dlg_trace_msg("# widget returns %d\n", retval);
1929217309Snwhitehorn	offset += offset_add;
1930217309Snwhitehorn
1931220749Snwhitehorn	if (dialog_vars.input_result != my_buffer) {
1932217309Snwhitehorn	    free(dialog_vars.input_result);
1933220749Snwhitehorn	    dialog_vars.input_result = 0;
1934220749Snwhitehorn	}
1935217309Snwhitehorn
1936217309Snwhitehorn	if (retval == DLG_EXIT_ESC) {
1937217309Snwhitehorn	    esc_pressed = TRUE;
1938217309Snwhitehorn	} else {
1939217309Snwhitehorn
1940217309Snwhitehorn	    if (dialog_vars.beep_after_signal)
1941217309Snwhitehorn		(void) beep();
1942217309Snwhitehorn
1943217309Snwhitehorn	    if (dialog_vars.sleep_secs)
1944217309Snwhitehorn		(void) napms(dialog_vars.sleep_secs * 1000);
1945217309Snwhitehorn
1946217309Snwhitehorn	    if (offset < argc) {
1947217309Snwhitehorn		switch (lookupOption(argv[offset], 7)) {
1948217309Snwhitehorn		case o_and_widget:
1949217309Snwhitehorn		    offset++;
1950217309Snwhitehorn		    break;
1951217309Snwhitehorn		case o_unknown:
1952217309Snwhitehorn		    sprintf(temp, "Expected --and-widget, not %.20s",
1953217309Snwhitehorn			    argv[offset]);
1954217309Snwhitehorn		    Usage(temp);
1955217309Snwhitehorn		    break;
1956217309Snwhitehorn		default:
1957217309Snwhitehorn		    /* if we got a cancel, etc., stop chaining */
1958217309Snwhitehorn		    if (retval != DLG_EXIT_OK)
1959217309Snwhitehorn			esc_pressed = TRUE;
1960217309Snwhitehorn		    else
1961217309Snwhitehorn			dialog_vars.dlg_clear_screen = TRUE;
1962217309Snwhitehorn		    break;
1963217309Snwhitehorn		}
1964217309Snwhitehorn	    }
1965217309Snwhitehorn	    if (dialog_vars.dlg_clear_screen)
1966217309Snwhitehorn		dlg_clear();
1967217309Snwhitehorn	}
1968217309Snwhitehorn    }
1969217309Snwhitehorn
1970217309Snwhitehorn    dlg_killall_bg(&retval);
1971217309Snwhitehorn    if (dialog_state.screen_initialized) {
1972217309Snwhitehorn	(void) refresh();
1973217309Snwhitehorn	end_dialog();
1974217309Snwhitehorn    }
1975217309Snwhitehorn    dlg_exit(retval);
1976217309Snwhitehorn}
1977