dialog.c revision 251843
1217309Snwhitehorn/*
2251843Sbapt * $Id: dialog.c,v 1.230 2013/03/15 09:07:30 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
74217309Snwhitehorn    ,o_icon
75217309Snwhitehorn    ,o_ignore
76217309Snwhitehorn    ,o_infobox
77217309Snwhitehorn    ,o_input_fd
78217309Snwhitehorn    ,o_inputbox
79217309Snwhitehorn    ,o_inputmenu
80217309Snwhitehorn    ,o_insecure
81217309Snwhitehorn    ,o_item_help
82217309Snwhitehorn    ,o_keep_colors
83217309Snwhitehorn    ,o_keep_tite
84217309Snwhitehorn    ,o_keep_window
85251843Sbapt    ,o_last_key
86217309Snwhitehorn    ,o_max_input
87217309Snwhitehorn    ,o_menu
88217309Snwhitehorn    ,o_mixedform
89217309Snwhitehorn    ,o_mixedgauge
90217309Snwhitehorn    ,o_msgbox
91217309Snwhitehorn    ,o_no_close
92217309Snwhitehorn    ,o_no_collapse
93217309Snwhitehorn    ,o_no_cr_wrap
94217309Snwhitehorn    ,o_no_kill
95217309Snwhitehorn    ,o_no_label
96217309Snwhitehorn    ,o_no_lines
97220749Snwhitehorn    ,o_no_mouse
98224014Snwhitehorn    ,o_no_nl_expand
99217309Snwhitehorn    ,o_no_shadow
100217309Snwhitehorn    ,o_nocancel
101217309Snwhitehorn    ,o_nook
102217309Snwhitehorn    ,o_ok_label
103217309Snwhitehorn    ,o_output_fd
104217309Snwhitehorn    ,o_output_separator
105217309Snwhitehorn    ,o_passwordbox
106217309Snwhitehorn    ,o_passwordform
107217309Snwhitehorn    ,o_pause
108220749Snwhitehorn    ,o_prgbox
109217309Snwhitehorn    ,o_print_maxsize
110217309Snwhitehorn    ,o_print_size
111217309Snwhitehorn    ,o_print_version
112220749Snwhitehorn    ,o_programbox
113217309Snwhitehorn    ,o_progressbox
114217309Snwhitehorn    ,o_quoted
115217309Snwhitehorn    ,o_radiolist
116217309Snwhitehorn    ,o_screen_center
117217309Snwhitehorn    ,o_scrollbar
118217309Snwhitehorn    ,o_separate_output
119217309Snwhitehorn    ,o_separate_widget
120217309Snwhitehorn    ,o_separator
121217309Snwhitehorn    ,o_shadow
122217309Snwhitehorn    ,o_single_quoted
123217309Snwhitehorn    ,o_size_err
124217309Snwhitehorn    ,o_sleep
125217309Snwhitehorn    ,o_smooth
126217309Snwhitehorn    ,o_stderr
127217309Snwhitehorn    ,o_stdout
128217309Snwhitehorn    ,o_tab_correct
129217309Snwhitehorn    ,o_tab_len
130217309Snwhitehorn    ,o_tailbox
131217309Snwhitehorn    ,o_tailboxbg
132217309Snwhitehorn    ,o_textbox
133217309Snwhitehorn    ,o_time_format
134217309Snwhitehorn    ,o_timeout
135217309Snwhitehorn    ,o_title
136217309Snwhitehorn    ,o_trim
137217309Snwhitehorn    ,o_under_mouse
138224014Snwhitehorn    ,o_version
139217309Snwhitehorn    ,o_visit_items
140217309Snwhitehorn    ,o_wmclass
141217309Snwhitehorn    ,o_yes_label
142217309Snwhitehorn    ,o_yesno
143251843Sbapt#ifdef HAVE_WHIPTAIL
144251843Sbapt    ,o_fullbutton
145251843Sbapt    ,o_topleft
146251843Sbapt#endif
147251843Sbapt#ifdef HAVE_XDIALOG
148251843Sbapt    ,o_calendar
149251843Sbapt    ,o_dselect
150251843Sbapt    ,o_editbox
151251843Sbapt    ,o_fselect
152251843Sbapt    ,o_timebox
153251843Sbapt#endif
154251843Sbapt#ifdef HAVE_XDIALOG2
155251843Sbapt    ,o_buildlist
156251843Sbapt    ,o_rangebox
157251843Sbapt    ,o_treeview
158251843Sbapt#endif
159251843Sbapt#if defined(HAVE_XDIALOG2) || defined(HAVE_WHIPTAIL)
160251843Sbapt    ,o_no_items
161251843Sbapt    ,o_no_tags
162251843Sbapt#endif
163217309Snwhitehorn#ifdef HAVE_DLG_TRACE
164217309Snwhitehorn    ,o_trace
165217309Snwhitehorn#endif
166217309Snwhitehorn} eOptions;
167217309Snwhitehorn
168217309Snwhitehorn/*
169217309Snwhitehorn * The bits in 'pass' are used to decide which options are applicable at
170217309Snwhitehorn * different stages in the program:
171217309Snwhitehorn *	1 flags before widgets
172217309Snwhitehorn *	2 widgets
173217309Snwhitehorn *	4 non-widget options
174217309Snwhitehorn */
175217309Snwhitehorntypedef struct {
176217309Snwhitehorn    const char *name;
177217309Snwhitehorn    eOptions code;
178217309Snwhitehorn    int pass;			/* 1,2,4 or combination */
179217309Snwhitehorn    const char *help;		/* NULL to suppress, non-empty to display params */
180217309Snwhitehorn} Options;
181217309Snwhitehorn
182217309Snwhitehorntypedef struct {
183217309Snwhitehorn    eOptions code;
184217309Snwhitehorn    int argmin, argmax;
185217309Snwhitehorn    callerFn *jumper;
186217309Snwhitehorn} Mode;
187217309Snwhitehorn
188217309Snwhitehornstatic bool *dialog_opts;
189217309Snwhitehornstatic char **dialog_argv;
190217309Snwhitehorn
191217309Snwhitehornstatic bool ignore_unknown = FALSE;
192217309Snwhitehorn
193217309Snwhitehornstatic const char *program = "dialog";
194217309Snwhitehorn
195217309Snwhitehorn/*
196217309Snwhitehorn * The options[] table is organized this way to make it simple to maintain
197217309Snwhitehorn * a sorted list of options for the help-message.
198217309Snwhitehorn */
199217309Snwhitehorn/* *INDENT-OFF* */
200217309Snwhitehornstatic const Options options[] = {
201217309Snwhitehorn    { "allow-close",	o_allow_close,		1, NULL },
202217309Snwhitehorn    { "and-widget",	o_and_widget,		4, NULL },
203217309Snwhitehorn    { "ascii-lines",	o_ascii_lines, 		1, "" },
204217309Snwhitehorn    { "aspect",		o_aspect,		1, "<ratio>" },
205217309Snwhitehorn    { "auto-placement", o_auto_placement,	1, NULL },
206217309Snwhitehorn    { "backtitle",	o_backtitle,		1, "<backtitle>" },
207251843Sbapt    { "beep",		o_beep,			1, "" },
208251843Sbapt    { "beep-after",	o_beep_after,		1, "" },
209217309Snwhitehorn    { "begin",		o_begin,		1, "<y> <x>" },
210217309Snwhitehorn    { "cancel-label",	o_cancel_label,		1, "<str>" },
211217309Snwhitehorn    { "checklist",	o_checklist,		2, "<text> <height> <width> <list height> <tag1> <item1> <status1>..." },
212217309Snwhitehorn    { "clear",		o_clear,		1, "" },
213217309Snwhitehorn    { "colors",		o_colors,		1, "" },
214217309Snwhitehorn    { "column-separator",o_column_separator,	1, "<str>" },
215217309Snwhitehorn    { "cr-wrap",	o_cr_wrap,		1, "" },
216217309Snwhitehorn    { "create-rc",	o_create_rc,		1, NULL },
217217309Snwhitehorn    { "date-format",	o_date_format,		1, "<str>" },
218251843Sbapt    { "default-button",	o_default_button,	1, "<str>" },
219217309Snwhitehorn    { "default-item",	o_default_item,		1, "<str>" },
220217309Snwhitehorn    { "defaultno",	o_defaultno,		1, "" },
221217309Snwhitehorn    { "exit-label",	o_exit_label,		1, "<str>" },
222217309Snwhitehorn    { "extra-button",	o_extra_button,		1, "" },
223217309Snwhitehorn    { "extra-label",	o_extra_label,		1, "<str>" },
224217309Snwhitehorn    { "fixed-font",	o_fixed_font,		1, NULL },
225217309Snwhitehorn    { "form",		o_form,			2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>..." },
226217309Snwhitehorn    { "gauge",		o_gauge,		2, "<text> <height> <width> [<percent>]" },
227217309Snwhitehorn    { "guage",		o_gauge,		2, NULL },
228217309Snwhitehorn    { "help",		o_help,			4, "" },
229217309Snwhitehorn    { "help-button",	o_help_button,		1, "" },
230217309Snwhitehorn    { "help-label",	o_help_label,		1, "<str>" },
231217309Snwhitehorn    { "help-status",	o_help_status,		1, "" },
232224014Snwhitehorn    { "hfile",		o_help_file,		1, "<str>" },
233224014Snwhitehorn    { "hline",		o_help_line,		1, "<str>" },
234217309Snwhitehorn    { "icon",		o_icon,			1, NULL },
235217309Snwhitehorn    { "ignore",		o_ignore,		1, "" },
236217309Snwhitehorn    { "infobox",	o_infobox,		2, "<text> <height> <width>" },
237217309Snwhitehorn    { "input-fd",	o_input_fd,		1, "<fd>" },
238217309Snwhitehorn    { "inputbox",	o_inputbox,		2, "<text> <height> <width> [<init>]" },
239217309Snwhitehorn    { "inputmenu",	o_inputmenu,		2, "<text> <height> <width> <menu height> <tag1> <item1>..." },
240217309Snwhitehorn    { "insecure",	o_insecure,		1, "" },
241217309Snwhitehorn    { "item-help",	o_item_help,		1, "" },
242217309Snwhitehorn    { "keep-colors",	o_keep_colors,		1, NULL },
243217309Snwhitehorn    { "keep-tite",	o_keep_tite,		1, "" },
244217309Snwhitehorn    { "keep-window",	o_keep_window,		1, "" },
245251843Sbapt    { "last-key",	o_last_key,		1, "" },
246217309Snwhitehorn    { "max-input",	o_max_input,		1, "<n>" },
247217309Snwhitehorn    { "menu",		o_menu,			2, "<text> <height> <width> <menu height> <tag1> <item1>..." },
248217309Snwhitehorn    { "mixedform",	o_mixedform,		2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>..." },
249217309Snwhitehorn    { "mixedgauge",	o_mixedgauge,		2, "<text> <height> <width> <percent> <tag1> <item1>..." },
250217309Snwhitehorn    { "msgbox",		o_msgbox,		2, "<text> <height> <width>" },
251217309Snwhitehorn    { "no-cancel",	o_nocancel,		1, "" },
252217309Snwhitehorn    { "no-close",	o_no_close,		1, NULL },
253217309Snwhitehorn    { "no-collapse",	o_no_collapse,		1, "" },
254251843Sbapt    { "no-cr-wrap",	o_no_cr_wrap,		1, "" },
255217309Snwhitehorn    { "no-kill",	o_no_kill,		1, "" },
256217309Snwhitehorn    { "no-label",	o_no_label,		1, "<str>" },
257217309Snwhitehorn    { "no-lines",	o_no_lines, 		1, "" },
258220749Snwhitehorn    { "no-mouse",	o_no_mouse,		1, "" },
259224014Snwhitehorn    { "no-nl-expand",	o_no_nl_expand,		1, "" },
260217309Snwhitehorn    { "no-ok",		o_nook,			1, "" },
261217309Snwhitehorn    { "no-shadow",	o_no_shadow,		1, "" },
262217309Snwhitehorn    { "nocancel",	o_nocancel,		1, NULL }, /* see --no-cancel */
263217309Snwhitehorn    { "nook",		o_nook,			1, "" }, /* See no-ok */
264217309Snwhitehorn    { "ok-label",	o_ok_label,		1, "<str>" },
265217309Snwhitehorn    { "output-fd",	o_output_fd,		1, "<fd>" },
266217309Snwhitehorn    { "output-separator",o_output_separator,	1, "<str>" },
267217309Snwhitehorn    { "passwordbox",	o_passwordbox,		2, "<text> <height> <width> [<init>]" },
268217309Snwhitehorn    { "passwordform",	o_passwordform,		2, "<text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>..." },
269217309Snwhitehorn    { "pause",		o_pause,		2, "<text> <height> <width> <seconds>" },
270220749Snwhitehorn    { "prgbox",		o_prgbox,		2, "<text> <command> <height> <width>" },
271217309Snwhitehorn    { "print-maxsize",	o_print_maxsize,	1, "" },
272217309Snwhitehorn    { "print-size",	o_print_size,		1, "" },
273217309Snwhitehorn    { "print-version",	o_print_version,	5, "" },
274220749Snwhitehorn    { "programbox",	o_programbox,		2, "<text> <height> <width>" },
275220749Snwhitehorn    { "progressbox",	o_progressbox,		2, "<text> <height> <width>" },
276217309Snwhitehorn    { "quoted",		o_quoted,		1, "" },
277217309Snwhitehorn    { "radiolist",	o_radiolist,		2, "<text> <height> <width> <list height> <tag1> <item1> <status1>..." },
278217309Snwhitehorn    { "screen-center",	o_screen_center,	1, NULL },
279217309Snwhitehorn    { "scrollbar",	o_scrollbar,		1, "" },
280217309Snwhitehorn    { "separate-output",o_separate_output,	1, "" },
281217309Snwhitehorn    { "separate-widget",o_separate_widget,	1, "<str>" },
282217309Snwhitehorn    { "separator",	o_separator,		1, NULL },
283217309Snwhitehorn    { "shadow",		o_shadow,		1, "" },
284217309Snwhitehorn    { "single-quoted",	o_single_quoted,	1, "" },
285217309Snwhitehorn    { "size-err",	o_size_err,		1, "" },
286217309Snwhitehorn    { "sleep",		o_sleep,		1, "<secs>" },
287217309Snwhitehorn    { "smooth",		o_smooth,		1, NULL },
288217309Snwhitehorn    { "stderr",		o_stderr,		1, "" },
289217309Snwhitehorn    { "stdout",		o_stdout,		1, "" },
290217309Snwhitehorn    { "tab-correct",	o_tab_correct,		1, "" },
291217309Snwhitehorn    { "tab-len",	o_tab_len,		1, "<n>" },
292217309Snwhitehorn    { "tailbox",	o_tailbox,		2, "<file> <height> <width>" },
293217309Snwhitehorn    { "tailboxbg",	o_tailboxbg,		2, "<file> <height> <width>" },
294217309Snwhitehorn    { "textbox",	o_textbox,		2, "<file> <height> <width>" },
295217309Snwhitehorn    { "time-format",	o_time_format,		1, "<str>" },
296217309Snwhitehorn    { "timeout",	o_timeout,		1, "<secs>" },
297217309Snwhitehorn    { "title",		o_title,		1, "<title>" },
298217309Snwhitehorn    { "trim",		o_trim,			1, "" },
299217309Snwhitehorn    { "under-mouse", 	o_under_mouse,		1, NULL },
300224014Snwhitehorn    { "version",	o_version,		5, "" },
301217309Snwhitehorn    { "visit-items", 	o_visit_items,		1, "" },
302217309Snwhitehorn    { "wmclass",	o_wmclass,		1, NULL },
303217309Snwhitehorn    { "yes-label",	o_yes_label,		1, "<str>" },
304217309Snwhitehorn    { "yesno",		o_yesno,		2, "<text> <height> <width>" },
305251843Sbapt#ifdef HAVE_WHIPTAIL
306251843Sbapt    { "cancel-button",	o_cancel_label,		1, NULL },
307251843Sbapt    { "fb",		o_fullbutton,		1, NULL },
308251843Sbapt    { "fullbutton",	o_fullbutton,		1, NULL },
309251843Sbapt    { "no-button",	o_no_label,		1, NULL },
310251843Sbapt    { "ok-button",	o_ok_label,		1, NULL },
311251843Sbapt    { "scrolltext",	o_scrollbar,		1, NULL },
312251843Sbapt    { "topleft",	o_topleft,		1, NULL },
313251843Sbapt    { "yes-button",	o_yes_label,		1, NULL },
314251843Sbapt#endif
315251843Sbapt#ifdef HAVE_XDIALOG
316251843Sbapt    { "calendar",	o_calendar,		2, "<text> <height> <width> <day> <month> <year>" },
317251843Sbapt    { "dselect",	o_dselect,		2, "<directory> <height> <width>" },
318251843Sbapt    { "editbox",	o_editbox,		2, "<file> <height> <width>" },
319251843Sbapt    { "fselect",	o_fselect,		2, "<filepath> <height> <width>" },
320251843Sbapt    { "timebox",	o_timebox,		2, "<text> <height> <width> <hour> <minute> <second>" },
321251843Sbapt#endif
322251843Sbapt#ifdef HAVE_XDIALOG2
323251843Sbapt    { "buildlist",	o_buildlist,		2, "<text> <height> <width> <tag1> <item1> <status1>..." },
324251843Sbapt    { "no-items", 	o_no_items,		1, "" },
325251843Sbapt    { "no-tags", 	o_no_tags,		1, "" },
326251843Sbapt    { "rangebox",	o_rangebox,		2, "<text> <height> <width> <min-value> <max-value> <default-value>" },
327251843Sbapt    { "treeview",	o_treeview,		2, "<text> <height> <width> <list-height> <tag1> <item1> <status1> <depth1>..." },
328251843Sbapt#endif
329251843Sbapt#if defined(HAVE_XDIALOG2) || defined(HAVE_WHIPTAIL)
330251843Sbapt    { "noitem", 	o_no_items,		1, NULL },
331251843Sbapt    { "notags", 	o_no_tags,		1, NULL },
332251843Sbapt#endif
333217309Snwhitehorn#ifdef HAVE_DLG_TRACE
334217309Snwhitehorn    { "trace",		o_trace,		1, "<file>" },
335217309Snwhitehorn#endif
336217309Snwhitehorn};
337217309Snwhitehorn/* *INDENT-ON* */
338217309Snwhitehorn
339217309Snwhitehorn/*
340217309Snwhitehorn * Make an array showing which argv[] entries are options.  Use "--" as a
341217309Snwhitehorn * special token to escape the next argument, allowing it to begin with "--".
342217309Snwhitehorn * When we find a "--" argument, also remove it from argv[] and adjust argc.
343217309Snwhitehorn * That appears to be an undocumented feature of the popt library.
344217309Snwhitehorn *
345217309Snwhitehorn * Also, if we see a "--file", expand it into the parameter list by reading the
346217309Snwhitehorn * text from the given file and stripping quotes, treating whitespace outside
347217309Snwhitehorn * quotes as a parameter delimiter.
348217309Snwhitehorn *
349217309Snwhitehorn * Finally, if we see a "--args", dump the current list of arguments to the
350217309Snwhitehorn * standard error.  This is used for debugging complex --file combinations.
351217309Snwhitehorn */
352217309Snwhitehornstatic void
353217309Snwhitehornunescape_argv(int *argcp, char ***argvp)
354217309Snwhitehorn{
355217309Snwhitehorn    int j, k;
356217309Snwhitehorn    int limit_includes = 20 + *argcp;
357217309Snwhitehorn    int count_includes = 0;
358217309Snwhitehorn    bool changed = FALSE;
359217309Snwhitehorn    bool doalloc = FALSE;
360217309Snwhitehorn    char *filename;
361217309Snwhitehorn
362217309Snwhitehorn    dialog_opts = dlg_calloc(bool, (size_t) *argcp + 1);
363217309Snwhitehorn    assert_ptr(dialog_opts, "unescape_argv");
364217309Snwhitehorn
365217309Snwhitehorn    for (j = 1; j < *argcp; j++) {
366217309Snwhitehorn	bool escaped = FALSE;
367217309Snwhitehorn	if (!strcmp((*argvp)[j], "--")) {
368217309Snwhitehorn	    escaped = TRUE;
369220749Snwhitehorn	    changed = dlg_eat_argv(argcp, argvp, j, 1);
370217309Snwhitehorn	} else if (!strcmp((*argvp)[j], "--args")) {
371217309Snwhitehorn	    fprintf(stderr, "Showing arguments at arg%d\n", j);
372217309Snwhitehorn	    for (k = 0; k < *argcp; ++k) {
373217309Snwhitehorn		fprintf(stderr, " arg%d:%s\n", k, (*argvp)[k]);
374217309Snwhitehorn	    }
375220749Snwhitehorn	    changed = dlg_eat_argv(argcp, argvp, j, 1);
376217309Snwhitehorn	} else if (!strcmp((*argvp)[j], "--file")) {
377217309Snwhitehorn	    if (++count_includes > limit_includes)
378217309Snwhitehorn		dlg_exiterr("Too many --file options");
379217309Snwhitehorn
380217309Snwhitehorn	    if ((filename = (*argvp)[j + 1]) != 0) {
381217309Snwhitehorn		FILE *fp;
382217309Snwhitehorn		char **list;
383217309Snwhitehorn		char *blob;
384217309Snwhitehorn		int added;
385217309Snwhitehorn		size_t bytes_read;
386217309Snwhitehorn		size_t length;
387217309Snwhitehorn		int n;
388217309Snwhitehorn
389217309Snwhitehorn		if (*filename == '&') {
390217309Snwhitehorn		    fp = fdopen(atoi(filename + sizeof(char)), "r");
391217309Snwhitehorn		} else {
392217309Snwhitehorn		    fp = fopen(filename, "r");
393217309Snwhitehorn		}
394217309Snwhitehorn
395217309Snwhitehorn		if (fp) {
396217309Snwhitehorn		    blob = NULL;
397217309Snwhitehorn		    length = 0;
398217309Snwhitehorn		    do {
399217309Snwhitehorn			blob = dlg_realloc(char, length + BUFSIZ + 1, blob);
400217309Snwhitehorn			assert_ptr(blob, "unescape_argv");
401217309Snwhitehorn			bytes_read = fread(blob + length,
402217309Snwhitehorn					   sizeof(char),
403220749Snwhitehorn					     (size_t) BUFSIZ,
404217309Snwhitehorn					   fp);
405217309Snwhitehorn			length += bytes_read;
406217309Snwhitehorn			if (ferror(fp))
407217309Snwhitehorn			    dlg_exiterr("error on filehandle in unescape_argv");
408217309Snwhitehorn		    } while (bytes_read == BUFSIZ);
409217309Snwhitehorn		    fclose(fp);
410217309Snwhitehorn
411217309Snwhitehorn		    blob[length] = '\0';
412217309Snwhitehorn
413220749Snwhitehorn		    list = dlg_string_to_argv(blob);
414220749Snwhitehorn		    if ((added = dlg_count_argv(list)) != 0) {
415217309Snwhitehorn			if (added > 2) {
416217309Snwhitehorn			    size_t need = (size_t) (*argcp + added + 1);
417217309Snwhitehorn			    if (doalloc) {
418217309Snwhitehorn				*argvp = dlg_realloc(char *, need, *argvp);
419217309Snwhitehorn				assert_ptr(*argvp, "unescape_argv");
420217309Snwhitehorn			    } else {
421217309Snwhitehorn				char **newp = dlg_malloc(char *, need);
422217309Snwhitehorn				assert_ptr(newp, "unescape_argv");
423217309Snwhitehorn				for (n = 0; n < *argcp; ++n) {
424217309Snwhitehorn				    newp[n] = (*argvp)[n];
425217309Snwhitehorn				}
426217309Snwhitehorn				*argvp = newp;
427217309Snwhitehorn				doalloc = TRUE;
428217309Snwhitehorn			    }
429217309Snwhitehorn			    dialog_opts = dlg_realloc(bool, need, dialog_opts);
430217309Snwhitehorn			    assert_ptr(dialog_opts, "unescape_argv");
431217309Snwhitehorn			}
432217309Snwhitehorn			for (n = *argcp; n >= j + 2; --n) {
433217309Snwhitehorn			    (*argvp)[n + added - 2] = (*argvp)[n];
434217309Snwhitehorn			    dialog_opts[n + added - 2] = dialog_opts[n];
435217309Snwhitehorn			}
436217309Snwhitehorn			for (n = 0; n < added; ++n) {
437217309Snwhitehorn			    (*argvp)[n + j] = list[n];
438217309Snwhitehorn			    dialog_opts[n + j] = FALSE;
439217309Snwhitehorn			}
440217309Snwhitehorn			*argcp += added - 2;
441217309Snwhitehorn			free(list);
442217309Snwhitehorn		    }
443217309Snwhitehorn		} else {
444217309Snwhitehorn		    dlg_exiterr("Cannot open --file %s", filename);
445217309Snwhitehorn		}
446217309Snwhitehorn		(*argvp)[*argcp] = 0;
447217309Snwhitehorn		++j;
448217309Snwhitehorn		continue;
449217309Snwhitehorn	    } else {
450217309Snwhitehorn		dlg_exiterr("No value given for --file");
451217309Snwhitehorn	    }
452217309Snwhitehorn	}
453217309Snwhitehorn	if (!escaped
454217309Snwhitehorn	    && (*argvp)[j] != 0
455220749Snwhitehorn	    && !strncmp((*argvp)[j], "--", (size_t) 2)
456217309Snwhitehorn	    && isalpha(UCH((*argvp)[j][2]))) {
457217309Snwhitehorn	    dialog_opts[j] = TRUE;
458217309Snwhitehorn	}
459217309Snwhitehorn    }
460217309Snwhitehorn
461217309Snwhitehorn    /* if we didn't find any "--" tokens, there's no reason to do the table
462217309Snwhitehorn     * lookup in isOption()
463217309Snwhitehorn     */
464217309Snwhitehorn    if (!changed) {
465217309Snwhitehorn	free(dialog_opts);
466217309Snwhitehorn	dialog_opts = 0;
467217309Snwhitehorn    }
468217309Snwhitehorn    dialog_argv = (*argvp);
469217309Snwhitehorn}
470217309Snwhitehorn
471251843Sbapt#define OptionChars "\
472251843Sbapt0123456789\
473251843Sbapt-\
474251843Sbaptabcdefghijklmnopqrstuvwxyz\
475251843Sbapt"
476251843Sbapt
477217309Snwhitehorn/*
478217309Snwhitehorn * Check if the given string from main's argv is an option.
479217309Snwhitehorn */
480217309Snwhitehornstatic bool
481217309SnwhitehornisOption(const char *arg)
482217309Snwhitehorn{
483217309Snwhitehorn    bool result = FALSE;
484217309Snwhitehorn
485217309Snwhitehorn    if (arg != 0) {
486217309Snwhitehorn	if (dialog_opts != 0) {
487217309Snwhitehorn	    int n;
488217309Snwhitehorn	    for (n = 1; dialog_argv[n] != 0; ++n) {
489217309Snwhitehorn		if (dialog_argv[n] == arg) {
490217309Snwhitehorn		    result = dialog_opts[n];
491217309Snwhitehorn		    break;
492217309Snwhitehorn		}
493217309Snwhitehorn	    }
494220749Snwhitehorn	} else if (!strncmp(arg, "--", (size_t) 2) && isalpha(UCH(arg[2]))) {
495251843Sbapt	    if (strlen(arg) == strspn(arg, OptionChars)) {
496251843Sbapt		result = TRUE;
497251843Sbapt	    } else {
498251843Sbapt		dlg_exiterr("Invalid option \"%s\"", arg);
499251843Sbapt	    }
500217309Snwhitehorn	}
501217309Snwhitehorn    }
502217309Snwhitehorn    return result;
503217309Snwhitehorn}
504217309Snwhitehorn
505217309Snwhitehornstatic eOptions
506217309SnwhitehornlookupOption(const char *name, int pass)
507217309Snwhitehorn{
508217309Snwhitehorn    unsigned n;
509251843Sbapt    eOptions result = o_unknown;
510217309Snwhitehorn
511217309Snwhitehorn    if (isOption(name)) {
512217309Snwhitehorn	name += 2;
513217309Snwhitehorn	for (n = 0; n < sizeof(options) / sizeof(options[0]); n++) {
514217309Snwhitehorn	    if ((pass & options[n].pass) != 0
515217309Snwhitehorn		&& !strcmp(name, options[n].name)) {
516251843Sbapt		result = options[n].code;
517251843Sbapt		break;
518217309Snwhitehorn	    }
519217309Snwhitehorn	}
520217309Snwhitehorn    }
521251843Sbapt    return result;
522217309Snwhitehorn}
523217309Snwhitehorn
524217309Snwhitehornstatic void
525217309SnwhitehornUsage(const char *msg)
526217309Snwhitehorn{
527217309Snwhitehorn    dlg_exiterr("Error: %s.\nUse --help to list options.\n\n", msg);
528217309Snwhitehorn}
529217309Snwhitehorn
530217309Snwhitehorn/*
531217309Snwhitehorn * Count arguments, stopping at the end of the argument list, or on any of our
532217309Snwhitehorn * "--" tokens.
533217309Snwhitehorn */
534217309Snwhitehornstatic int
535217309Snwhitehornarg_rest(char *argv[])
536217309Snwhitehorn{
537217309Snwhitehorn    int i = 1;			/* argv[0] points to a "--" token */
538217309Snwhitehorn
539217309Snwhitehorn    while (argv[i] != 0
540217309Snwhitehorn	   && (!isOption(argv[i]) || lookupOption(argv[i], 7) == o_unknown))
541217309Snwhitehorn	i++;
542217309Snwhitehorn    return i;
543217309Snwhitehorn}
544217309Snwhitehorn
545217309Snwhitehorn/*
546217309Snwhitehorn * In MultiWidget this function is needed to count how many tags
547217309Snwhitehorn * a widget (menu, checklist, radiolist) has
548217309Snwhitehorn */
549217309Snwhitehornstatic int
550217309Snwhitehornhowmany_tags(char *argv[], int group)
551217309Snwhitehorn{
552217309Snwhitehorn    int result = 0;
553217309Snwhitehorn    int have;
554217309Snwhitehorn    const char *format = "Expected %d arguments, found only %d";
555217309Snwhitehorn    char temp[80];
556217309Snwhitehorn
557217309Snwhitehorn    while (argv[0] != 0) {
558217309Snwhitehorn	if (isOption(argv[0]))
559217309Snwhitehorn	    break;
560217309Snwhitehorn	if ((have = arg_rest(argv)) < group) {
561217309Snwhitehorn	    sprintf(temp, format, group, have);
562217309Snwhitehorn	    Usage(temp);
563217309Snwhitehorn	}
564217309Snwhitehorn
565217309Snwhitehorn	argv += group;
566217309Snwhitehorn	result++;
567217309Snwhitehorn    }
568217309Snwhitehorn
569217309Snwhitehorn    return result;
570217309Snwhitehorn}
571217309Snwhitehorn
572217309Snwhitehornstatic int
573217309Snwhitehornnumeric_arg(char **av, int n)
574217309Snwhitehorn{
575251843Sbapt    int result = 0;
576217309Snwhitehorn
577251843Sbapt    if (n < dlg_count_argv(av)) {
578251843Sbapt	char msg[80];
579251843Sbapt	char *last = 0;
580251843Sbapt	result = (int) strtol(av[n], &last, 10);
581251843Sbapt
582251843Sbapt	if (last == 0 || *last != 0) {
583251843Sbapt	    sprintf(msg, "Expected a number for token %d of %.20s", n, av[0]);
584251843Sbapt	    Usage(msg);
585251843Sbapt	}
586217309Snwhitehorn    }
587217309Snwhitehorn    return result;
588217309Snwhitehorn}
589217309Snwhitehorn
590217309Snwhitehornstatic char *
591217309Snwhitehornoptional_str(char **av, int n, char *dft)
592217309Snwhitehorn{
593217309Snwhitehorn    char *ret = dft;
594217309Snwhitehorn    if (arg_rest(av) > n)
595217309Snwhitehorn	ret = av[n];
596217309Snwhitehorn    return ret;
597217309Snwhitehorn}
598217309Snwhitehorn
599217309Snwhitehorn#if defined(HAVE_DLG_GAUGE) || defined(HAVE_XDIALOG)
600217309Snwhitehornstatic int
601217309Snwhitehornoptional_num(char **av, int n, int dft)
602217309Snwhitehorn{
603217309Snwhitehorn    int ret = dft;
604217309Snwhitehorn    if (arg_rest(av) > n)
605217309Snwhitehorn	ret = numeric_arg(av, n);
606217309Snwhitehorn    return ret;
607217309Snwhitehorn}
608217309Snwhitehorn#endif
609217309Snwhitehorn
610217309Snwhitehorn/*
611217309Snwhitehorn * On AIX 4.x, we have to flush the output right away since there is a bug in
612217309Snwhitehorn * the curses package which discards stdout even when we've used newterm to
613217309Snwhitehorn * redirect output to /dev/tty.
614217309Snwhitehorn */
615217309Snwhitehornstatic int
616217309Snwhitehornshow_result(int ret)
617217309Snwhitehorn{
618217309Snwhitehorn    bool either = FALSE;
619217309Snwhitehorn
620217309Snwhitehorn    switch (ret) {
621217309Snwhitehorn    case DLG_EXIT_OK:
622217309Snwhitehorn    case DLG_EXIT_EXTRA:
623217309Snwhitehorn    case DLG_EXIT_HELP:
624217309Snwhitehorn    case DLG_EXIT_ITEM_HELP:
625217309Snwhitehorn	if ((dialog_state.output_count > 1) && !dialog_vars.separate_output) {
626217309Snwhitehorn	    fputs((dialog_state.separate_str
627217309Snwhitehorn		   ? dialog_state.separate_str
628217309Snwhitehorn		   : DEFAULT_SEPARATE_STR),
629217309Snwhitehorn		  dialog_state.output);
630217309Snwhitehorn	    either = TRUE;
631217309Snwhitehorn	}
632220749Snwhitehorn	if (dialog_vars.input_result != 0
633220749Snwhitehorn	    && dialog_vars.input_result[0] != '\0') {
634217309Snwhitehorn	    fputs(dialog_vars.input_result, dialog_state.output);
635217309Snwhitehorn	    either = TRUE;
636217309Snwhitehorn	}
637217309Snwhitehorn	if (either) {
638217309Snwhitehorn	    fflush(dialog_state.output);
639217309Snwhitehorn	}
640217309Snwhitehorn	break;
641217309Snwhitehorn    }
642217309Snwhitehorn    return ret;
643217309Snwhitehorn}
644217309Snwhitehorn
645217309Snwhitehorn/*
646217309Snwhitehorn * These are the widget callers.
647217309Snwhitehorn */
648217309Snwhitehorn
649217309Snwhitehornstatic int
650217309Snwhitehorncall_yesno(CALLARGS)
651217309Snwhitehorn{
652217309Snwhitehorn    *offset_add = 4;
653217309Snwhitehorn    return dialog_yesno(t,
654217309Snwhitehorn			av[1],
655217309Snwhitehorn			numeric_arg(av, 2),
656217309Snwhitehorn			numeric_arg(av, 3));
657217309Snwhitehorn}
658217309Snwhitehorn
659217309Snwhitehornstatic int
660217309Snwhitehorncall_msgbox(CALLARGS)
661217309Snwhitehorn{
662217309Snwhitehorn    *offset_add = 4;
663217309Snwhitehorn    return dialog_msgbox(t,
664217309Snwhitehorn			 av[1],
665217309Snwhitehorn			 numeric_arg(av, 2),
666217309Snwhitehorn			 numeric_arg(av, 3), 1);
667217309Snwhitehorn}
668217309Snwhitehorn
669217309Snwhitehornstatic int
670217309Snwhitehorncall_infobox(CALLARGS)
671217309Snwhitehorn{
672217309Snwhitehorn    *offset_add = 4;
673217309Snwhitehorn    return dialog_msgbox(t,
674217309Snwhitehorn			 av[1],
675217309Snwhitehorn			 numeric_arg(av, 2),
676217309Snwhitehorn			 numeric_arg(av, 3), 0);
677217309Snwhitehorn}
678217309Snwhitehorn
679217309Snwhitehornstatic int
680217309Snwhitehorncall_textbox(CALLARGS)
681217309Snwhitehorn{
682217309Snwhitehorn    *offset_add = 4;
683217309Snwhitehorn    return dialog_textbox(t,
684217309Snwhitehorn			  av[1],
685217309Snwhitehorn			  numeric_arg(av, 2),
686217309Snwhitehorn			  numeric_arg(av, 3));
687217309Snwhitehorn}
688217309Snwhitehorn
689217309Snwhitehornstatic int
690217309Snwhitehorncall_menu(CALLARGS)
691217309Snwhitehorn{
692217309Snwhitehorn    int tags = howmany_tags(av + 5, MENUBOX_TAGS);
693217309Snwhitehorn    *offset_add = 5 + tags * MENUBOX_TAGS;
694217309Snwhitehorn
695217309Snwhitehorn    return dialog_menu(t,
696217309Snwhitehorn		       av[1],
697217309Snwhitehorn		       numeric_arg(av, 2),
698217309Snwhitehorn		       numeric_arg(av, 3),
699217309Snwhitehorn		       numeric_arg(av, 4),
700217309Snwhitehorn		       tags, av + 5);
701217309Snwhitehorn}
702217309Snwhitehorn
703217309Snwhitehornstatic int
704217309Snwhitehorncall_inputmenu(CALLARGS)
705217309Snwhitehorn{
706217309Snwhitehorn    int tags = howmany_tags(av + 5, MENUBOX_TAGS);
707220749Snwhitehorn    bool free_extra_label = FALSE;
708220749Snwhitehorn    int result;
709217309Snwhitehorn
710217309Snwhitehorn    dialog_vars.input_menu = TRUE;
711217309Snwhitehorn
712217309Snwhitehorn    if (dialog_vars.max_input == 0)
713217309Snwhitehorn	dialog_vars.max_input = MAX_LEN / 2;
714217309Snwhitehorn
715220749Snwhitehorn    if (dialog_vars.extra_label == 0) {
716220749Snwhitehorn	free_extra_label = TRUE;
717220749Snwhitehorn	dialog_vars.extra_label = dlg_strclone(_("Rename"));
718220749Snwhitehorn    }
719217309Snwhitehorn
720217309Snwhitehorn    dialog_vars.extra_button = TRUE;
721217309Snwhitehorn
722217309Snwhitehorn    *offset_add = 5 + tags * MENUBOX_TAGS;
723220749Snwhitehorn    result = dialog_menu(t,
724220749Snwhitehorn			 av[1],
725220749Snwhitehorn			 numeric_arg(av, 2),
726220749Snwhitehorn			 numeric_arg(av, 3),
727220749Snwhitehorn			 numeric_arg(av, 4),
728220749Snwhitehorn			 tags, av + 5);
729220749Snwhitehorn    if (free_extra_label) {
730220749Snwhitehorn	free(dialog_vars.extra_label);
731220749Snwhitehorn	dialog_vars.extra_label = 0;
732220749Snwhitehorn    }
733220749Snwhitehorn    return result;
734217309Snwhitehorn}
735217309Snwhitehorn
736217309Snwhitehornstatic int
737217309Snwhitehorncall_checklist(CALLARGS)
738217309Snwhitehorn{
739217309Snwhitehorn    int tags = howmany_tags(av + 5, CHECKBOX_TAGS);
740217309Snwhitehorn    int code;
741217309Snwhitehorn
742217309Snwhitehorn    *offset_add = 5 + tags * CHECKBOX_TAGS;
743217309Snwhitehorn    code = dialog_checklist(t,
744217309Snwhitehorn			    av[1],
745217309Snwhitehorn			    numeric_arg(av, 2),
746217309Snwhitehorn			    numeric_arg(av, 3),
747217309Snwhitehorn			    numeric_arg(av, 4),
748217309Snwhitehorn			    tags, av + 5, FLAG_CHECK);
749217309Snwhitehorn    return code;
750217309Snwhitehorn}
751217309Snwhitehorn
752217309Snwhitehornstatic int
753217309Snwhitehorncall_radiolist(CALLARGS)
754217309Snwhitehorn{
755217309Snwhitehorn    int tags = howmany_tags(av + 5, CHECKBOX_TAGS);
756217309Snwhitehorn    *offset_add = 5 + tags * CHECKBOX_TAGS;
757217309Snwhitehorn    return dialog_checklist(t,
758217309Snwhitehorn			    av[1],
759217309Snwhitehorn			    numeric_arg(av, 2),
760217309Snwhitehorn			    numeric_arg(av, 3),
761217309Snwhitehorn			    numeric_arg(av, 4),
762217309Snwhitehorn			    tags, av + 5, FLAG_RADIO);
763217309Snwhitehorn}
764217309Snwhitehorn
765217309Snwhitehornstatic int
766217309Snwhitehorncall_inputbox(CALLARGS)
767217309Snwhitehorn{
768217309Snwhitehorn    *offset_add = arg_rest(av);
769217309Snwhitehorn    return dialog_inputbox(t,
770217309Snwhitehorn			   av[1],
771217309Snwhitehorn			   numeric_arg(av, 2),
772217309Snwhitehorn			   numeric_arg(av, 3),
773217309Snwhitehorn			   optional_str(av, 4, 0), 0);
774217309Snwhitehorn}
775217309Snwhitehorn
776217309Snwhitehornstatic int
777217309Snwhitehorncall_passwordbox(CALLARGS)
778217309Snwhitehorn{
779217309Snwhitehorn    *offset_add = arg_rest(av);
780217309Snwhitehorn    return dialog_inputbox(t,
781217309Snwhitehorn			   av[1],
782217309Snwhitehorn			   numeric_arg(av, 2),
783217309Snwhitehorn			   numeric_arg(av, 3),
784217309Snwhitehorn			   optional_str(av, 4, 0), 1);
785217309Snwhitehorn}
786217309Snwhitehorn
787217309Snwhitehorn#ifdef HAVE_XDIALOG
788217309Snwhitehornstatic int
789217309Snwhitehorncall_calendar(CALLARGS)
790217309Snwhitehorn{
791217309Snwhitehorn    *offset_add = arg_rest(av);
792217309Snwhitehorn    return dialog_calendar(t,
793217309Snwhitehorn			   av[1],
794217309Snwhitehorn			   numeric_arg(av, 2),
795217309Snwhitehorn			   numeric_arg(av, 3),
796217309Snwhitehorn			   optional_num(av, 4, -1),
797217309Snwhitehorn			   optional_num(av, 5, -1),
798217309Snwhitehorn			   optional_num(av, 6, -1));
799217309Snwhitehorn}
800217309Snwhitehorn
801217309Snwhitehornstatic int
802217309Snwhitehorncall_dselect(CALLARGS)
803217309Snwhitehorn{
804217309Snwhitehorn    *offset_add = arg_rest(av);
805217309Snwhitehorn    return dialog_dselect(t,
806217309Snwhitehorn			  av[1],
807217309Snwhitehorn			  numeric_arg(av, 2),
808217309Snwhitehorn			  numeric_arg(av, 3));
809217309Snwhitehorn}
810217309Snwhitehorn
811217309Snwhitehornstatic int
812217309Snwhitehorncall_editbox(CALLARGS)
813217309Snwhitehorn{
814217309Snwhitehorn    *offset_add = 4;
815217309Snwhitehorn    return dialog_editbox(t,
816217309Snwhitehorn			  av[1],
817217309Snwhitehorn			  numeric_arg(av, 2),
818217309Snwhitehorn			  numeric_arg(av, 3));
819217309Snwhitehorn}
820217309Snwhitehorn
821217309Snwhitehornstatic int
822217309Snwhitehorncall_fselect(CALLARGS)
823217309Snwhitehorn{
824217309Snwhitehorn    *offset_add = arg_rest(av);
825217309Snwhitehorn    return dialog_fselect(t,
826217309Snwhitehorn			  av[1],
827217309Snwhitehorn			  numeric_arg(av, 2),
828217309Snwhitehorn			  numeric_arg(av, 3));
829217309Snwhitehorn}
830217309Snwhitehorn
831217309Snwhitehornstatic int
832217309Snwhitehorncall_timebox(CALLARGS)
833217309Snwhitehorn{
834217309Snwhitehorn    *offset_add = arg_rest(av);
835217309Snwhitehorn    return dialog_timebox(t,
836217309Snwhitehorn			  av[1],
837217309Snwhitehorn			  numeric_arg(av, 2),
838217309Snwhitehorn			  numeric_arg(av, 3),
839217309Snwhitehorn			  optional_num(av, 4, -1),
840217309Snwhitehorn			  optional_num(av, 5, -1),
841217309Snwhitehorn			  optional_num(av, 6, -1));
842217309Snwhitehorn}
843217309Snwhitehorn#endif /* HAVE_XDIALOG */
844217309Snwhitehorn
845251843Sbapt/* dialog 1.2 widgets */
846251843Sbapt#ifdef HAVE_XDIALOG2
847251843Sbapt
848251843Sbapt#define DisableNoTags() \
849251843Sbapt	bool save_no_tags = dialog_vars.no_tags; \
850251843Sbapt	bool save_no_items = dialog_vars.no_items; \
851251843Sbapt	dialog_vars.no_tags = TRUE; \
852251843Sbapt	dialog_vars.no_items = FALSE
853251843Sbapt
854251843Sbapt#define RestoreNoTags() \
855251843Sbapt	dialog_vars.no_tags = save_no_tags; \
856251843Sbapt	dialog_vars.no_items = save_no_items
857251843Sbapt
858251843Sbaptstatic int
859251843Sbaptcall_buildlist(CALLARGS)
860251843Sbapt{
861251843Sbapt    int tags = howmany_tags(av + 5, CHECKBOX_TAGS);
862251843Sbapt    int result;
863251843Sbapt
864251843Sbapt    DisableNoTags();
865251843Sbapt
866251843Sbapt    *offset_add = 5 + tags * CHECKBOX_TAGS;
867251843Sbapt    result = dialog_buildlist(t,
868251843Sbapt			      av[1],
869251843Sbapt			      numeric_arg(av, 2),
870251843Sbapt			      numeric_arg(av, 3),
871251843Sbapt			      numeric_arg(av, 4),
872251843Sbapt			      tags, av + 5,
873251843Sbapt			      TRUE);
874251843Sbapt    RestoreNoTags();
875251843Sbapt    return result;
876251843Sbapt}
877251843Sbapt
878251843Sbaptstatic int
879251843Sbaptcall_rangebox(CALLARGS)
880251843Sbapt{
881251843Sbapt    int min_value;
882251843Sbapt
883251843Sbapt    *offset_add = arg_rest(av);
884251843Sbapt    min_value = numeric_arg(av, 4);
885251843Sbapt    return dialog_rangebox(t,
886251843Sbapt			   av[1],
887251843Sbapt			   numeric_arg(av, 2),
888251843Sbapt			   numeric_arg(av, 3),
889251843Sbapt			   min_value,
890251843Sbapt			   numeric_arg(av, 5),
891251843Sbapt			   (*offset_add > 6) ? numeric_arg(av, 6) : min_value);
892251843Sbapt}
893251843Sbapt
894251843Sbaptstatic int
895251843Sbaptcall_treeview(CALLARGS)
896251843Sbapt{
897251843Sbapt    int tags = howmany_tags(av + 5, TREEVIEW_TAGS);
898251843Sbapt    int result;
899251843Sbapt
900251843Sbapt    DisableNoTags();
901251843Sbapt
902251843Sbapt    *offset_add = arg_rest(av);
903251843Sbapt    result = dialog_treeview(t,
904251843Sbapt			     av[1],
905251843Sbapt			     numeric_arg(av, 2),
906251843Sbapt			     numeric_arg(av, 3),
907251843Sbapt			     numeric_arg(av, 4),
908251843Sbapt			     tags, av + 5, FLAG_RADIO);
909251843Sbapt    RestoreNoTags();
910251843Sbapt    return result;
911251843Sbapt}
912251843Sbapt#endif /* HAVE_XDIALOG */
913251843Sbapt
914217309Snwhitehorn#ifdef HAVE_DLG_FORMBOX
915217309Snwhitehornstatic int
916217309Snwhitehorncall_form(CALLARGS)
917217309Snwhitehorn{
918217309Snwhitehorn    int group = FORMBOX_TAGS;
919217309Snwhitehorn    int tags = howmany_tags(av + 5, group);
920217309Snwhitehorn    *offset_add = 5 + tags * group;
921217309Snwhitehorn
922217309Snwhitehorn    return dialog_form(t,
923217309Snwhitehorn		       av[1],
924217309Snwhitehorn		       numeric_arg(av, 2),
925217309Snwhitehorn		       numeric_arg(av, 3),
926217309Snwhitehorn		       numeric_arg(av, 4),
927217309Snwhitehorn		       tags, av + 5);
928217309Snwhitehorn}
929217309Snwhitehorn
930217309Snwhitehornstatic int
931217309Snwhitehorncall_password_form(CALLARGS)
932217309Snwhitehorn{
933217309Snwhitehorn    unsigned save = dialog_vars.formitem_type;
934217309Snwhitehorn    int result;
935217309Snwhitehorn
936217309Snwhitehorn    dialog_vars.formitem_type = 1;
937217309Snwhitehorn    result = call_form(PASSARGS);
938217309Snwhitehorn    dialog_vars.formitem_type = save;
939217309Snwhitehorn
940217309Snwhitehorn    return result;
941217309Snwhitehorn}
942217309Snwhitehorn#endif /* HAVE_DLG_FORMBOX */
943217309Snwhitehorn
944217309Snwhitehorn#ifdef HAVE_DLG_MIXEDFORM
945217309Snwhitehornstatic int
946217309Snwhitehorncall_mixed_form(CALLARGS)
947217309Snwhitehorn{
948217309Snwhitehorn    int group = MIXEDFORM_TAGS;
949217309Snwhitehorn    int tags = howmany_tags(av + 5, group);
950217309Snwhitehorn    *offset_add = 5 + tags * group;
951217309Snwhitehorn
952217309Snwhitehorn    return dialog_mixedform(t,
953217309Snwhitehorn			    av[1],
954217309Snwhitehorn			    numeric_arg(av, 2),
955217309Snwhitehorn			    numeric_arg(av, 3),
956217309Snwhitehorn			    numeric_arg(av, 4),
957217309Snwhitehorn			    tags, av + 5);
958217309Snwhitehorn}
959217309Snwhitehorn#endif /* HAVE_DLG_MIXEDFORM */
960217309Snwhitehorn
961217309Snwhitehorn#ifdef HAVE_DLG_GAUGE
962217309Snwhitehornstatic int
963217309Snwhitehorncall_gauge(CALLARGS)
964217309Snwhitehorn{
965217309Snwhitehorn    *offset_add = arg_rest(av);
966217309Snwhitehorn    return dialog_gauge(t,
967217309Snwhitehorn			av[1],
968217309Snwhitehorn			numeric_arg(av, 2),
969217309Snwhitehorn			numeric_arg(av, 3),
970217309Snwhitehorn			optional_num(av, 4, 0));
971217309Snwhitehorn}
972217309Snwhitehorn
973217309Snwhitehornstatic int
974217309Snwhitehorncall_pause(CALLARGS)
975217309Snwhitehorn{
976217309Snwhitehorn    *offset_add = arg_rest(av);
977217309Snwhitehorn    return dialog_pause(t,
978217309Snwhitehorn			av[1],
979217309Snwhitehorn			numeric_arg(av, 2),
980217309Snwhitehorn			numeric_arg(av, 3),
981217309Snwhitehorn			numeric_arg(av, 4));
982217309Snwhitehorn}
983217309Snwhitehorn#endif
984217309Snwhitehorn
985217309Snwhitehorn#ifdef HAVE_MIXEDGAUGE
986217309Snwhitehornstatic int
987217309Snwhitehorncall_mixed_gauge(CALLARGS)
988217309Snwhitehorn{
989217309Snwhitehorn#define MIXEDGAUGE_BASE 5
990217309Snwhitehorn    int tags = howmany_tags(av + MIXEDGAUGE_BASE, MIXEDGAUGE_TAGS);
991217309Snwhitehorn    *offset_add = MIXEDGAUGE_BASE + tags * MIXEDGAUGE_TAGS;
992217309Snwhitehorn    return dialog_mixedgauge(t,
993217309Snwhitehorn			     av[1],
994217309Snwhitehorn			     numeric_arg(av, 2),
995217309Snwhitehorn			     numeric_arg(av, 3),
996217309Snwhitehorn			     numeric_arg(av, 4),
997217309Snwhitehorn			     tags, av + MIXEDGAUGE_BASE);
998217309Snwhitehorn}
999217309Snwhitehorn#endif
1000217309Snwhitehorn
1001224014Snwhitehorn#ifdef HAVE_DLG_GAUGE
1002220749Snwhitehornstatic int
1003220749Snwhitehorncall_prgbox(CALLARGS)
1004220749Snwhitehorn{
1005220749Snwhitehorn    *offset_add = arg_rest(av);
1006220749Snwhitehorn    /* the original version does not accept a prompt string, but for
1007220749Snwhitehorn     * consistency we allow it.
1008220749Snwhitehorn     */
1009220749Snwhitehorn    return ((*offset_add == 5)
1010220749Snwhitehorn	    ? dialog_prgbox(t,
1011220749Snwhitehorn			    av[1],
1012220749Snwhitehorn			    av[2],
1013220749Snwhitehorn			    numeric_arg(av, 3),
1014220749Snwhitehorn			    numeric_arg(av, 4), TRUE)
1015220749Snwhitehorn	    : dialog_prgbox(t,
1016220749Snwhitehorn			    "",
1017220749Snwhitehorn			    av[1],
1018220749Snwhitehorn			    numeric_arg(av, 2),
1019220749Snwhitehorn			    numeric_arg(av, 3), TRUE));
1020220749Snwhitehorn}
1021224014Snwhitehorn#endif
1022220749Snwhitehorn
1023217309Snwhitehorn#ifdef HAVE_DLG_GAUGE
1024217309Snwhitehornstatic int
1025220749Snwhitehorncall_programbox(CALLARGS)
1026220749Snwhitehorn{
1027220749Snwhitehorn    int result;
1028220749Snwhitehorn
1029220749Snwhitehorn    *offset_add = arg_rest(av);
1030220749Snwhitehorn    /* this function is a compromise between --prgbox and --progressbox.
1031220749Snwhitehorn     */
1032220749Snwhitehorn    result = ((*offset_add == 4)
1033220749Snwhitehorn	      ? dlg_progressbox(t,
1034220749Snwhitehorn				av[1],
1035220749Snwhitehorn				numeric_arg(av, 2),
1036220749Snwhitehorn				numeric_arg(av, 3),
1037220749Snwhitehorn				TRUE,
1038220749Snwhitehorn				dialog_state.pipe_input)
1039220749Snwhitehorn	      : dlg_progressbox(t,
1040220749Snwhitehorn				"",
1041220749Snwhitehorn				numeric_arg(av, 1),
1042220749Snwhitehorn				numeric_arg(av, 2),
1043220749Snwhitehorn				TRUE,
1044220749Snwhitehorn				dialog_state.pipe_input));
1045220749Snwhitehorn    dialog_state.pipe_input = 0;
1046220749Snwhitehorn    return result;
1047220749Snwhitehorn}
1048220749Snwhitehorn#endif
1049220749Snwhitehorn
1050220749Snwhitehorn#ifdef HAVE_DLG_GAUGE
1051220749Snwhitehornstatic int
1052217309Snwhitehorncall_progressbox(CALLARGS)
1053217309Snwhitehorn{
1054217309Snwhitehorn    *offset_add = arg_rest(av);
1055217309Snwhitehorn    /* the original version does not accept a prompt string, but for
1056217309Snwhitehorn     * consistency we allow it.
1057217309Snwhitehorn     */
1058217309Snwhitehorn    return ((*offset_add == 4)
1059217309Snwhitehorn	    ? dialog_progressbox(t,
1060217309Snwhitehorn				 av[1],
1061217309Snwhitehorn				 numeric_arg(av, 2),
1062217309Snwhitehorn				 numeric_arg(av, 3))
1063217309Snwhitehorn	    : dialog_progressbox(t,
1064217309Snwhitehorn				 "",
1065217309Snwhitehorn				 numeric_arg(av, 1),
1066217309Snwhitehorn				 numeric_arg(av, 2)));
1067217309Snwhitehorn}
1068217309Snwhitehorn#endif
1069217309Snwhitehorn
1070217309Snwhitehorn#ifdef HAVE_DLG_TAILBOX
1071217309Snwhitehornstatic int
1072217309Snwhitehorncall_tailbox(CALLARGS)
1073217309Snwhitehorn{
1074217309Snwhitehorn    *offset_add = 4;
1075217309Snwhitehorn    return dialog_tailbox(t,
1076217309Snwhitehorn			  av[1],
1077217309Snwhitehorn			  numeric_arg(av, 2),
1078217309Snwhitehorn			  numeric_arg(av, 3),
1079217309Snwhitehorn			  FALSE);
1080217309Snwhitehorn}
1081217309Snwhitehorn
1082217309Snwhitehornstatic int
1083217309Snwhitehorncall_tailboxbg(CALLARGS)
1084217309Snwhitehorn{
1085217309Snwhitehorn    *offset_add = 4;
1086217309Snwhitehorn    return dialog_tailbox(t,
1087217309Snwhitehorn			  av[1],
1088217309Snwhitehorn			  numeric_arg(av, 2),
1089217309Snwhitehorn			  numeric_arg(av, 3),
1090217309Snwhitehorn			  TRUE);
1091217309Snwhitehorn}
1092217309Snwhitehorn#endif
1093217309Snwhitehorn/* *INDENT-OFF* */
1094217309Snwhitehornstatic const Mode modes[] =
1095217309Snwhitehorn{
1096217309Snwhitehorn    {o_yesno,           4, 4, call_yesno},
1097217309Snwhitehorn    {o_msgbox,          4, 4, call_msgbox},
1098217309Snwhitehorn    {o_infobox,         4, 4, call_infobox},
1099217309Snwhitehorn    {o_textbox,         4, 4, call_textbox},
1100217309Snwhitehorn    {o_menu,            7, 0, call_menu},
1101217309Snwhitehorn    {o_inputmenu,       7, 0, call_inputmenu},
1102217309Snwhitehorn    {o_checklist,       8, 0, call_checklist},
1103217309Snwhitehorn    {o_radiolist,       8, 0, call_radiolist},
1104217309Snwhitehorn    {o_inputbox,        4, 5, call_inputbox},
1105217309Snwhitehorn    {o_passwordbox,     4, 5, call_passwordbox},
1106217309Snwhitehorn#ifdef HAVE_DLG_GAUGE
1107217309Snwhitehorn    {o_gauge,           4, 5, call_gauge},
1108217309Snwhitehorn    {o_pause,           5, 5, call_pause},
1109220749Snwhitehorn    {o_prgbox,          4, 5, call_prgbox},
1110220749Snwhitehorn    {o_programbox,      3, 4, call_programbox},
1111217309Snwhitehorn    {o_progressbox,     3, 4, call_progressbox},
1112217309Snwhitehorn#endif
1113217309Snwhitehorn#ifdef HAVE_DLG_FORMBOX
1114217309Snwhitehorn    {o_passwordform,   13, 0, call_password_form},
1115217309Snwhitehorn    {o_form,           13, 0, call_form},
1116217309Snwhitehorn#endif
1117217309Snwhitehorn#ifdef HAVE_MIXEDGAUGE
1118217309Snwhitehorn    {o_mixedgauge,      MIXEDGAUGE_BASE, 0, call_mixed_gauge},
1119217309Snwhitehorn#endif
1120217309Snwhitehorn#ifdef HAVE_DLG_MIXEDFORM
1121217309Snwhitehorn    {o_mixedform,      13, 0, call_mixed_form},
1122217309Snwhitehorn#endif
1123217309Snwhitehorn#ifdef HAVE_DLG_TAILBOX
1124217309Snwhitehorn    {o_tailbox,         4, 4, call_tailbox},
1125217309Snwhitehorn    {o_tailboxbg,       4, 4, call_tailboxbg},
1126217309Snwhitehorn#endif
1127217309Snwhitehorn#ifdef HAVE_XDIALOG
1128251843Sbapt    {o_buildlist,       4, 0, call_buildlist},
1129217309Snwhitehorn    {o_calendar,        4, 7, call_calendar},
1130217309Snwhitehorn    {o_dselect,         4, 5, call_dselect},
1131217309Snwhitehorn    {o_editbox,         4, 4, call_editbox},
1132217309Snwhitehorn    {o_fselect,         4, 5, call_fselect},
1133251843Sbapt    {o_rangebox,        5, 7, call_rangebox},
1134217309Snwhitehorn    {o_timebox,         4, 7, call_timebox},
1135251843Sbapt    {o_treeview,        4, 0, call_treeview},
1136217309Snwhitehorn#endif
1137217309Snwhitehorn};
1138217309Snwhitehorn/* *INDENT-ON* */
1139217309Snwhitehorn
1140217309Snwhitehornstatic char *
1141217309SnwhitehornoptionString(char **argv, int *num)
1142217309Snwhitehorn{
1143217309Snwhitehorn    int next = *num + 1;
1144217309Snwhitehorn    char *result = argv[next];
1145217309Snwhitehorn    if (result == 0) {
1146217309Snwhitehorn	char temp[80];
1147217309Snwhitehorn	sprintf(temp, "Expected a string-parameter for %.20s", argv[*num]);
1148217309Snwhitehorn	Usage(temp);
1149217309Snwhitehorn    }
1150217309Snwhitehorn    *num = next;
1151217309Snwhitehorn    return result;
1152217309Snwhitehorn}
1153217309Snwhitehorn
1154217309Snwhitehornstatic int
1155217309SnwhitehornoptionValue(char **argv, int *num)
1156217309Snwhitehorn{
1157217309Snwhitehorn    int next = *num + 1;
1158217309Snwhitehorn    char *src = argv[next];
1159217309Snwhitehorn    char *tmp = 0;
1160217309Snwhitehorn    int result = 0;
1161217309Snwhitehorn
1162217309Snwhitehorn    if (src != 0) {
1163220749Snwhitehorn	result = (int) strtol(src, &tmp, 0);
1164217309Snwhitehorn	if (tmp == 0 || *tmp != 0)
1165217309Snwhitehorn	    src = 0;
1166217309Snwhitehorn    }
1167217309Snwhitehorn
1168217309Snwhitehorn    if (src == 0) {
1169217309Snwhitehorn	char temp[80];
1170217309Snwhitehorn	sprintf(temp, "Expected a numeric-parameter for %.20s", argv[*num]);
1171217309Snwhitehorn	Usage(temp);
1172217309Snwhitehorn    }
1173217309Snwhitehorn    *num = next;
1174217309Snwhitehorn    return result;
1175217309Snwhitehorn}
1176217309Snwhitehorn
1177251843Sbapt/* Return exit-code for a named button */
1178251843Sbaptstatic int
1179251843Sbaptbutton_code(const char *name)
1180251843Sbapt{
1181251843Sbapt    /* *INDENT-OFF* */
1182251843Sbapt    static struct {
1183251843Sbapt	const char *name;
1184251843Sbapt	int code;
1185251843Sbapt    } table[] = {
1186251843Sbapt	{ "ok",	    DLG_EXIT_OK },
1187251843Sbapt	{ "yes",    DLG_EXIT_OK },
1188251843Sbapt	{ "cancel", DLG_EXIT_CANCEL },
1189251843Sbapt	{ "no",	    DLG_EXIT_CANCEL },
1190251843Sbapt	{ "help",   DLG_EXIT_HELP },
1191251843Sbapt	{ "extra",  DLG_EXIT_EXTRA },
1192251843Sbapt    };
1193251843Sbapt    /* *INDENT-ON* */
1194251843Sbapt
1195251843Sbapt    int code = DLG_EXIT_ERROR;
1196251843Sbapt    size_t i;
1197251843Sbapt
1198251843Sbapt    for (i = 0; i < (sizeof(table) / sizeof(table[0])); i++) {
1199251843Sbapt	if (!dlg_strcmp(name, table[i].name)) {
1200251843Sbapt	    code = table[i].code;
1201251843Sbapt	    break;
1202251843Sbapt	}
1203251843Sbapt    }
1204251843Sbapt
1205251843Sbapt    if (code == DLG_EXIT_ERROR) {
1206251843Sbapt	char temp[80];
1207251843Sbapt	sprintf(temp, "Button name \"%.20s\" unknown", name);
1208251843Sbapt	Usage(temp);
1209251843Sbapt    }
1210251843Sbapt
1211251843Sbapt    return code;
1212251843Sbapt}
1213251843Sbapt
1214217309Snwhitehorn/*
1215217309Snwhitehorn * Print parts of a message
1216217309Snwhitehorn */
1217217309Snwhitehornstatic void
1218217309SnwhitehornPrintList(const char *const *list)
1219217309Snwhitehorn{
1220217309Snwhitehorn    const char *leaf = strrchr(program, '/');
1221217309Snwhitehorn    unsigned n = 0;
1222217309Snwhitehorn
1223217309Snwhitehorn    if (leaf != 0)
1224217309Snwhitehorn	leaf++;
1225217309Snwhitehorn    else
1226217309Snwhitehorn	leaf = program;
1227217309Snwhitehorn
1228217309Snwhitehorn    while (*list != 0) {
1229217309Snwhitehorn	fprintf(dialog_state.output, *list, n ? leaf : dialog_version());
1230217309Snwhitehorn	(void) fputc('\n', dialog_state.output);
1231217309Snwhitehorn	n = 1;
1232217309Snwhitehorn	list++;
1233217309Snwhitehorn    }
1234217309Snwhitehorn}
1235217309Snwhitehorn
1236217309Snwhitehornstatic const Mode *
1237217309SnwhitehornlookupMode(eOptions code)
1238217309Snwhitehorn{
1239217309Snwhitehorn    const Mode *modePtr = 0;
1240217309Snwhitehorn    unsigned n;
1241217309Snwhitehorn
1242217309Snwhitehorn    for (n = 0; n < sizeof(modes) / sizeof(modes[0]); n++) {
1243217309Snwhitehorn	if (modes[n].code == code) {
1244217309Snwhitehorn	    modePtr = &modes[n];
1245217309Snwhitehorn	    break;
1246217309Snwhitehorn	}
1247217309Snwhitehorn    }
1248217309Snwhitehorn    return modePtr;
1249217309Snwhitehorn}
1250217309Snwhitehorn
1251217309Snwhitehornstatic int
1252217309Snwhitehorncompare_opts(const void *a, const void *b)
1253217309Snwhitehorn{
1254217309Snwhitehorn    Options *const *p = (Options * const *) a;
1255217309Snwhitehorn    Options *const *q = (Options * const *) b;
1256217309Snwhitehorn    return strcmp((*p)->name, (*q)->name);
1257217309Snwhitehorn}
1258217309Snwhitehorn
1259217309Snwhitehorn/*
1260224014Snwhitehorn * Print program's version.
1261224014Snwhitehorn */
1262224014Snwhitehornstatic void
1263224014SnwhitehornPrintVersion(FILE *fp)
1264224014Snwhitehorn{
1265224014Snwhitehorn    fprintf(fp, "Version: %s\n", dialog_version());
1266224014Snwhitehorn}
1267224014Snwhitehorn
1268224014Snwhitehorn/*
1269217309Snwhitehorn * Print program help-message
1270217309Snwhitehorn */
1271217309Snwhitehornstatic void
1272217309SnwhitehornHelp(void)
1273217309Snwhitehorn{
1274217309Snwhitehorn    static const char *const tbl_1[] =
1275217309Snwhitehorn    {
1276217309Snwhitehorn	"cdialog (ComeOn Dialog!) version %s",
1277251843Sbapt	"Copyright 2000-2012,2013 Thomas E. Dickey",
1278217309Snwhitehorn	"This is free software; see the source for copying conditions.  There is NO",
1279217309Snwhitehorn	"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.",
1280217309Snwhitehorn	"",
1281217309Snwhitehorn	"* Display dialog boxes from shell scripts *",
1282217309Snwhitehorn	"",
1283217309Snwhitehorn	"Usage: %s <options> { --and-widget <options> }",
1284217309Snwhitehorn	"where options are \"common\" options, followed by \"box\" options",
1285217309Snwhitehorn	"",
1286217309Snwhitehorn#ifdef HAVE_RC_FILE
1287217309Snwhitehorn	"Special options:",
1288217309Snwhitehorn	"  [--create-rc \"file\"]",
1289217309Snwhitehorn#endif
1290217309Snwhitehorn	0
1291217309Snwhitehorn    }, *const tbl_3[] =
1292217309Snwhitehorn    {
1293217309Snwhitehorn	"",
1294217309Snwhitehorn	"Auto-size with height and width = 0. Maximize with height and width = -1.",
1295217309Snwhitehorn	"Global-auto-size if also menu_height/list_height = 0.",
1296217309Snwhitehorn	0
1297217309Snwhitehorn    };
1298220749Snwhitehorn    size_t limit = sizeof(options) / sizeof(options[0]);
1299220749Snwhitehorn    size_t j, k;
1300217309Snwhitehorn    const Options **opts;
1301217309Snwhitehorn
1302224014Snwhitehorn    end_dialog();
1303224014Snwhitehorn    dialog_state.output = stdout;
1304224014Snwhitehorn
1305217309Snwhitehorn    opts = dlg_calloc(const Options *, limit);
1306217309Snwhitehorn    assert_ptr(opts, "Help");
1307217309Snwhitehorn    for (j = 0; j < limit; ++j) {
1308217309Snwhitehorn	opts[j] = &(options[j]);
1309217309Snwhitehorn    }
1310217309Snwhitehorn    qsort(opts, limit, sizeof(Options *), compare_opts);
1311217309Snwhitehorn
1312217309Snwhitehorn    PrintList(tbl_1);
1313217309Snwhitehorn    fprintf(dialog_state.output, "Common options:\n ");
1314217309Snwhitehorn    for (j = k = 0; j < limit; j++) {
1315217309Snwhitehorn	if ((opts[j]->pass & 1)
1316217309Snwhitehorn	    && opts[j]->help != 0) {
1317220749Snwhitehorn	    size_t len = 6 + strlen(opts[j]->name) + strlen(opts[j]->help);
1318217309Snwhitehorn	    k += len;
1319217309Snwhitehorn	    if (k > 75) {
1320217309Snwhitehorn		fprintf(dialog_state.output, "\n ");
1321217309Snwhitehorn		k = len;
1322217309Snwhitehorn	    }
1323217309Snwhitehorn	    fprintf(dialog_state.output, " [--%s%s%s]", opts[j]->name,
1324217309Snwhitehorn		    *(opts[j]->help) ? " " : "", opts[j]->help);
1325217309Snwhitehorn	}
1326217309Snwhitehorn    }
1327217309Snwhitehorn    fprintf(dialog_state.output, "\nBox options:\n");
1328217309Snwhitehorn    for (j = 0; j < limit; j++) {
1329217309Snwhitehorn	if ((opts[j]->pass & 2) != 0
1330217309Snwhitehorn	    && opts[j]->help != 0
1331217309Snwhitehorn	    && lookupMode(opts[j]->code))
1332217309Snwhitehorn	    fprintf(dialog_state.output, "  --%-12s %s\n", opts[j]->name,
1333217309Snwhitehorn		    opts[j]->help);
1334217309Snwhitehorn    }
1335217309Snwhitehorn    PrintList(tbl_3);
1336217309Snwhitehorn
1337217309Snwhitehorn    free(opts);
1338217309Snwhitehorn    dlg_exit(DLG_EXIT_OK);
1339217309Snwhitehorn}
1340217309Snwhitehorn
1341251843Sbapt#ifdef HAVE_DLG_TRACE
1342217309Snwhitehorn/*
1343251843Sbapt * Only the first call to dlg_trace will open a trace file.  But each time
1344251843Sbapt * --trace is parsed, we show the whole parameter list as it is at that moment,
1345251843Sbapt * counting discarded parameters.  The only way to capture the whole parameter
1346251843Sbapt * list is if --trace is the first option.
1347251843Sbapt */
1348251843Sbaptstatic void
1349251843Sbaptprocess_trace_option(char **argv, int *offset)
1350251843Sbapt{
1351251843Sbapt    int j;
1352251843Sbapt
1353251843Sbapt    if (dialog_state.trace_output == 0) {
1354251843Sbapt	dlg_trace(optionString(argv, offset));
1355251843Sbapt    } else {
1356251843Sbapt	dlg_trace_msg("# ignore extra --trace option\n");
1357251843Sbapt	*offset += 1;
1358251843Sbapt    }
1359251843Sbapt
1360251843Sbapt    dlg_trace_msg("# Parameters:\n");
1361251843Sbapt    for (j = 0; argv[j] != 0; ++j) {
1362251843Sbapt	dlg_trace_msg("# argv[%d] = %s\n", j, argv[j]);
1363251843Sbapt    }
1364251843Sbapt}
1365251843Sbapt#endif
1366251843Sbapt
1367251843Sbapt/*
1368217309Snwhitehorn * "Common" options apply to all widgets more/less.  Most of the common options
1369217309Snwhitehorn * set values in dialog_vars, a few set dialog_state and a couple write to the
1370217309Snwhitehorn * output stream.
1371217309Snwhitehorn */
1372217309Snwhitehornstatic int
1373217309Snwhitehornprocess_common_options(int argc, char **argv, int offset, bool output)
1374217309Snwhitehorn{
1375217309Snwhitehorn    bool done = FALSE;
1376217309Snwhitehorn
1377251843Sbapt    dlg_trace_msg("# process_common_options, offset %d\n", offset);
1378251843Sbapt
1379217309Snwhitehorn    while (offset < argc && !done) {	/* Common options */
1380251843Sbapt	dlg_trace_msg("#\targv[%d] = %s\n", offset, argv[offset]);
1381217309Snwhitehorn	switch (lookupOption(argv[offset], 1)) {
1382217309Snwhitehorn	case o_title:
1383217309Snwhitehorn	    dialog_vars.title = optionString(argv, &offset);
1384217309Snwhitehorn	    break;
1385217309Snwhitehorn	case o_backtitle:
1386217309Snwhitehorn	    dialog_vars.backtitle = optionString(argv, &offset);
1387217309Snwhitehorn	    break;
1388217309Snwhitehorn	case o_separate_widget:
1389217309Snwhitehorn	    dialog_state.separate_str = optionString(argv, &offset);
1390217309Snwhitehorn	    break;
1391217309Snwhitehorn	case o_separate_output:
1392217309Snwhitehorn	    dialog_vars.separate_output = TRUE;
1393217309Snwhitehorn	    break;
1394217309Snwhitehorn	case o_colors:
1395217309Snwhitehorn	    dialog_vars.colors = TRUE;
1396217309Snwhitehorn	    break;
1397217309Snwhitehorn	case o_cr_wrap:
1398217309Snwhitehorn	    dialog_vars.cr_wrap = TRUE;
1399217309Snwhitehorn	    break;
1400224014Snwhitehorn	case o_no_nl_expand:
1401224014Snwhitehorn	    dialog_vars.no_nl_expand = TRUE;
1402224014Snwhitehorn	    break;
1403217309Snwhitehorn	case o_no_collapse:
1404217309Snwhitehorn	    dialog_vars.nocollapse = TRUE;
1405217309Snwhitehorn	    break;
1406217309Snwhitehorn	case o_no_kill:
1407217309Snwhitehorn	    dialog_vars.cant_kill = TRUE;
1408217309Snwhitehorn	    break;
1409217309Snwhitehorn	case o_nocancel:
1410217309Snwhitehorn	    dialog_vars.nocancel = TRUE;
1411217309Snwhitehorn	    break;
1412217309Snwhitehorn	case o_nook:
1413217309Snwhitehorn	    dialog_vars.nook = TRUE;
1414217309Snwhitehorn	    break;
1415217309Snwhitehorn	case o_quoted:
1416217309Snwhitehorn	    dialog_vars.quoted = TRUE;
1417217309Snwhitehorn	    break;
1418217309Snwhitehorn	case o_single_quoted:
1419217309Snwhitehorn	    dialog_vars.single_quoted = TRUE;
1420217309Snwhitehorn	    break;
1421217309Snwhitehorn	case o_size_err:
1422217309Snwhitehorn	    dialog_vars.size_err = TRUE;
1423217309Snwhitehorn	    break;
1424217309Snwhitehorn	case o_beep:
1425217309Snwhitehorn	    dialog_vars.beep_signal = TRUE;
1426217309Snwhitehorn	    break;
1427217309Snwhitehorn	case o_beep_after:
1428217309Snwhitehorn	    dialog_vars.beep_after_signal = TRUE;
1429217309Snwhitehorn	    break;
1430217309Snwhitehorn	case o_scrollbar:
1431217309Snwhitehorn	    dialog_state.use_scrollbar = TRUE;
1432217309Snwhitehorn	    break;
1433217309Snwhitehorn	case o_shadow:
1434217309Snwhitehorn	    dialog_state.use_shadow = TRUE;
1435217309Snwhitehorn	    break;
1436217309Snwhitehorn	case o_defaultno:
1437217309Snwhitehorn	    dialog_vars.defaultno = TRUE;
1438251843Sbapt	    dialog_vars.default_button = DLG_EXIT_CANCEL;
1439217309Snwhitehorn	    break;
1440251843Sbapt	case o_default_button:
1441251843Sbapt	    dialog_vars.default_button = button_code(optionString(argv, &offset));
1442251843Sbapt	    dialog_vars.defaultno = dialog_vars.default_button == DLG_EXIT_CANCEL;
1443251843Sbapt	    break;
1444217309Snwhitehorn	case o_default_item:
1445217309Snwhitehorn	    dialog_vars.default_item = optionString(argv, &offset);
1446217309Snwhitehorn	    break;
1447217309Snwhitehorn	case o_insecure:
1448217309Snwhitehorn	    dialog_vars.insecure = TRUE;
1449217309Snwhitehorn	    break;
1450217309Snwhitehorn	case o_item_help:
1451217309Snwhitehorn	    dialog_vars.item_help = TRUE;
1452217309Snwhitehorn	    break;
1453224014Snwhitehorn	case o_help_line:
1454224014Snwhitehorn	    dialog_vars.help_line = optionString(argv, &offset);
1455224014Snwhitehorn	    break;
1456224014Snwhitehorn	case o_help_file:
1457224014Snwhitehorn	    dialog_vars.help_file = optionString(argv, &offset);
1458224014Snwhitehorn	    break;
1459217309Snwhitehorn	case o_help_button:
1460217309Snwhitehorn	    dialog_vars.help_button = TRUE;
1461217309Snwhitehorn	    break;
1462217309Snwhitehorn	case o_help_status:
1463217309Snwhitehorn	    dialog_vars.help_status = TRUE;
1464217309Snwhitehorn	    break;
1465217309Snwhitehorn	case o_extra_button:
1466217309Snwhitehorn	    dialog_vars.extra_button = TRUE;
1467217309Snwhitehorn	    break;
1468217309Snwhitehorn	case o_ignore:
1469217309Snwhitehorn	    ignore_unknown = TRUE;
1470217309Snwhitehorn	    break;
1471217309Snwhitehorn	case o_keep_window:
1472217309Snwhitehorn	    dialog_vars.keep_window = TRUE;
1473217309Snwhitehorn	    break;
1474251843Sbapt	case o_last_key:
1475251843Sbapt	    dialog_vars.last_key = TRUE;
1476251843Sbapt	    break;
1477217309Snwhitehorn	case o_no_shadow:
1478217309Snwhitehorn	    dialog_state.use_shadow = FALSE;
1479217309Snwhitehorn	    break;
1480217309Snwhitehorn	case o_print_size:
1481217309Snwhitehorn	    dialog_vars.print_siz = TRUE;
1482217309Snwhitehorn	    break;
1483217309Snwhitehorn	case o_print_maxsize:
1484217309Snwhitehorn	    if (output) {
1485217309Snwhitehorn		/*
1486217309Snwhitehorn		 * If this is the last option, we do not want any error
1487217309Snwhitehorn		 * messages - just our output.  Calling end_dialog() cancels
1488217309Snwhitehorn		 * the refresh() at the end of the program as well.
1489217309Snwhitehorn		 */
1490217309Snwhitehorn		if (argv[offset + 1] == 0) {
1491217309Snwhitehorn		    ignore_unknown = TRUE;
1492217309Snwhitehorn		    end_dialog();
1493217309Snwhitehorn		}
1494217309Snwhitehorn		fflush(dialog_state.output);
1495217309Snwhitehorn		fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);
1496217309Snwhitehorn	    }
1497217309Snwhitehorn	    break;
1498217309Snwhitehorn	case o_print_version:
1499217309Snwhitehorn	    if (output) {
1500224014Snwhitehorn		PrintVersion(dialog_state.output);
1501217309Snwhitehorn	    }
1502217309Snwhitehorn	    break;
1503217309Snwhitehorn	case o_separator:
1504217309Snwhitehorn	case o_output_separator:
1505217309Snwhitehorn	    dialog_vars.output_separator = optionString(argv, &offset);
1506217309Snwhitehorn	    break;
1507217309Snwhitehorn	case o_column_separator:
1508217309Snwhitehorn	    dialog_vars.column_separator = optionString(argv, &offset);
1509217309Snwhitehorn	    break;
1510217309Snwhitehorn	case o_tab_correct:
1511217309Snwhitehorn	    dialog_vars.tab_correct = TRUE;
1512217309Snwhitehorn	    break;
1513217309Snwhitehorn	case o_sleep:
1514217309Snwhitehorn	    dialog_vars.sleep_secs = optionValue(argv, &offset);
1515217309Snwhitehorn	    break;
1516217309Snwhitehorn	case o_timeout:
1517217309Snwhitehorn	    dialog_vars.timeout_secs = optionValue(argv, &offset);
1518217309Snwhitehorn	    break;
1519217309Snwhitehorn	case o_max_input:
1520217309Snwhitehorn	    dialog_vars.max_input = optionValue(argv, &offset);
1521217309Snwhitehorn	    break;
1522217309Snwhitehorn	case o_tab_len:
1523217309Snwhitehorn	    dialog_state.tab_len = optionValue(argv, &offset);
1524217309Snwhitehorn	    break;
1525217309Snwhitehorn	case o_trim:
1526217309Snwhitehorn	    dialog_vars.trim_whitespace = TRUE;
1527217309Snwhitehorn	    break;
1528217309Snwhitehorn	case o_visit_items:
1529217309Snwhitehorn	    dialog_state.visit_items = TRUE;
1530251843Sbapt	    dialog_state.visit_cols = 1;
1531217309Snwhitehorn	    break;
1532217309Snwhitehorn	case o_aspect:
1533217309Snwhitehorn	    dialog_state.aspect_ratio = optionValue(argv, &offset);
1534217309Snwhitehorn	    break;
1535217309Snwhitehorn	case o_begin:
1536217309Snwhitehorn	    dialog_vars.begin_set = TRUE;
1537217309Snwhitehorn	    dialog_vars.begin_y = optionValue(argv, &offset);
1538217309Snwhitehorn	    dialog_vars.begin_x = optionValue(argv, &offset);
1539217309Snwhitehorn	    break;
1540217309Snwhitehorn	case o_clear:
1541217309Snwhitehorn	    dialog_vars.dlg_clear_screen = TRUE;
1542217309Snwhitehorn	    break;
1543217309Snwhitehorn	case o_yes_label:
1544217309Snwhitehorn	    dialog_vars.yes_label = optionString(argv, &offset);
1545217309Snwhitehorn	    break;
1546217309Snwhitehorn	case o_no_label:
1547217309Snwhitehorn	    dialog_vars.no_label = optionString(argv, &offset);
1548217309Snwhitehorn	    break;
1549217309Snwhitehorn	case o_ok_label:
1550217309Snwhitehorn	    dialog_vars.ok_label = optionString(argv, &offset);
1551217309Snwhitehorn	    break;
1552217309Snwhitehorn	case o_cancel_label:
1553217309Snwhitehorn	    dialog_vars.cancel_label = optionString(argv, &offset);
1554217309Snwhitehorn	    break;
1555217309Snwhitehorn	case o_extra_label:
1556217309Snwhitehorn	    dialog_vars.extra_label = optionString(argv, &offset);
1557217309Snwhitehorn	    break;
1558217309Snwhitehorn	case o_exit_label:
1559217309Snwhitehorn	    dialog_vars.exit_label = optionString(argv, &offset);
1560217309Snwhitehorn	    break;
1561217309Snwhitehorn	case o_help_label:
1562217309Snwhitehorn	    dialog_vars.help_label = optionString(argv, &offset);
1563217309Snwhitehorn	    break;
1564217309Snwhitehorn	case o_date_format:
1565217309Snwhitehorn	    dialog_vars.date_format = optionString(argv, &offset);
1566217309Snwhitehorn	    break;
1567217309Snwhitehorn	case o_time_format:
1568217309Snwhitehorn	    dialog_vars.time_format = optionString(argv, &offset);
1569217309Snwhitehorn	    break;
1570217309Snwhitehorn	case o_keep_tite:
1571217309Snwhitehorn	    dialog_vars.keep_tite = TRUE;
1572217309Snwhitehorn	    break;
1573217309Snwhitehorn	case o_ascii_lines:
1574217309Snwhitehorn	    dialog_vars.ascii_lines = TRUE;
1575217309Snwhitehorn	    dialog_vars.no_lines = FALSE;
1576217309Snwhitehorn	    break;
1577217309Snwhitehorn	case o_no_lines:
1578217309Snwhitehorn	    dialog_vars.no_lines = TRUE;
1579217309Snwhitehorn	    dialog_vars.ascii_lines = FALSE;
1580217309Snwhitehorn	    break;
1581220749Snwhitehorn	case o_no_mouse:
1582220749Snwhitehorn	    dialog_state.no_mouse = TRUE;
1583224014Snwhitehorn	    mouse_close();
1584220749Snwhitehorn	    break;
1585251843Sbapt#ifdef HAVE_WHIPTAIL
1586251843Sbapt	case o_topleft:
1587251843Sbapt	    dialog_vars.begin_set = TRUE;
1588251843Sbapt	    dialog_vars.begin_y = 0;
1589251843Sbapt	    dialog_vars.begin_x = 0;
1590251843Sbapt	    break;
1591217309Snwhitehorn	case o_fullbutton:
1592217309Snwhitehorn	    /* ignore */
1593217309Snwhitehorn	    break;
1594251843Sbapt#endif
1595217309Snwhitehorn	    /* options of Xdialog which we ignore */
1596217309Snwhitehorn	case o_icon:
1597217309Snwhitehorn	case o_wmclass:
1598217309Snwhitehorn	    (void) optionString(argv, &offset);
1599217309Snwhitehorn	    /* FALLTHRU */
1600217309Snwhitehorn	case o_allow_close:
1601217309Snwhitehorn	case o_auto_placement:
1602217309Snwhitehorn	case o_fixed_font:
1603217309Snwhitehorn	case o_keep_colors:
1604217309Snwhitehorn	case o_no_close:
1605217309Snwhitehorn	case o_no_cr_wrap:
1606217309Snwhitehorn	case o_screen_center:
1607217309Snwhitehorn	case o_smooth:
1608217309Snwhitehorn	case o_under_mouse:
1609217309Snwhitehorn	    break;
1610217309Snwhitehorn	case o_unknown:
1611217309Snwhitehorn	    if (ignore_unknown)
1612217309Snwhitehorn		break;
1613217309Snwhitehorn	    /* FALLTHRU */
1614217309Snwhitehorn	default:		/* no more common options */
1615217309Snwhitehorn	    done = TRUE;
1616217309Snwhitehorn	    break;
1617217309Snwhitehorn#ifdef HAVE_DLG_TRACE
1618217309Snwhitehorn	case o_trace:
1619251843Sbapt	    process_trace_option(argv, &offset);
1620217309Snwhitehorn	    break;
1621217309Snwhitehorn#endif
1622251843Sbapt#if defined(HAVE_XDIALOG2) || defined(HAVE_WHIPTAIL)
1623251843Sbapt	case o_no_items:
1624251843Sbapt	    dialog_vars.no_items = TRUE;
1625251843Sbapt	    break;
1626251843Sbapt	case o_no_tags:
1627251843Sbapt	    dialog_vars.no_tags = TRUE;
1628251843Sbapt	    break;
1629251843Sbapt#endif
1630217309Snwhitehorn	}
1631217309Snwhitehorn	if (!done)
1632217309Snwhitehorn	    offset++;
1633217309Snwhitehorn    }
1634217309Snwhitehorn    return offset;
1635217309Snwhitehorn}
1636217309Snwhitehorn
1637217309Snwhitehorn/*
1638217309Snwhitehorn * Initialize options at the start of a series of common options culminating
1639217309Snwhitehorn * in a widget.
1640217309Snwhitehorn */
1641217309Snwhitehornstatic void
1642217309Snwhitehorninit_result(char *buffer)
1643217309Snwhitehorn{
1644217309Snwhitehorn    static bool first = TRUE;
1645217309Snwhitehorn    static char **special_argv = 0;
1646217309Snwhitehorn    static int special_argc = 0;
1647217309Snwhitehorn
1648251843Sbapt    dlg_trace_msg("# init_result\n");
1649251843Sbapt
1650217309Snwhitehorn    /* clear everything we do not save for the next widget */
1651217309Snwhitehorn    memset(&dialog_vars, 0, sizeof(dialog_vars));
1652217309Snwhitehorn
1653217309Snwhitehorn    dialog_vars.input_result = buffer;
1654217309Snwhitehorn    dialog_vars.input_result[0] = '\0';
1655217309Snwhitehorn
1656251843Sbapt    dialog_vars.default_button = -1;
1657251843Sbapt
1658217309Snwhitehorn    /*
1659217309Snwhitehorn     * The first time this is called, check for common options given by an
1660217309Snwhitehorn     * environment variable.
1661217309Snwhitehorn     */
1662217309Snwhitehorn    if (first) {
1663217309Snwhitehorn	char *env = getenv("DIALOGOPTS");
1664217309Snwhitehorn	if (env != 0)
1665217309Snwhitehorn	    env = dlg_strclone(env);
1666217309Snwhitehorn	if (env != 0) {
1667220749Snwhitehorn	    special_argv = dlg_string_to_argv(env);
1668220749Snwhitehorn	    special_argc = dlg_count_argv(special_argv);
1669217309Snwhitehorn	}
1670251843Sbapt	first = FALSE;
1671217309Snwhitehorn    }
1672251843Sbapt
1673251843Sbapt    /*
1674251843Sbapt     * If we are not checking memory leaks, just do the parse of the
1675251843Sbapt     * environment once.
1676251843Sbapt     */
1677217309Snwhitehorn    if (special_argv != 0) {
1678217309Snwhitehorn	process_common_options(special_argc, special_argv, 0, FALSE);
1679217309Snwhitehorn#ifdef NO_LEAKS
1680217309Snwhitehorn	free(special_argv[0]);
1681217309Snwhitehorn	free(special_argv);
1682251843Sbapt	special_argv = 0;
1683251843Sbapt	special_argc = 0;
1684217309Snwhitehorn	first = TRUE;
1685217309Snwhitehorn#endif
1686217309Snwhitehorn    }
1687217309Snwhitehorn}
1688217309Snwhitehorn
1689217309Snwhitehornint
1690217309Snwhitehornmain(int argc, char *argv[])
1691217309Snwhitehorn{
1692217309Snwhitehorn    char temp[256];
1693217309Snwhitehorn    bool esc_pressed = FALSE;
1694217309Snwhitehorn    bool keep_tite = FALSE;
1695217309Snwhitehorn    int offset = 1;
1696217309Snwhitehorn    int offset_add;
1697217309Snwhitehorn    int retval = DLG_EXIT_OK;
1698217309Snwhitehorn    int j, have;
1699217309Snwhitehorn    eOptions code;
1700217309Snwhitehorn    const Mode *modePtr;
1701217309Snwhitehorn    char my_buffer[MAX_LEN + 1];
1702217309Snwhitehorn
1703217309Snwhitehorn    memset(&dialog_state, 0, sizeof(dialog_state));
1704217309Snwhitehorn    memset(&dialog_vars, 0, sizeof(dialog_vars));
1705217309Snwhitehorn
1706217309Snwhitehorn#if defined(ENABLE_NLS)
1707217309Snwhitehorn    /* initialize locale support */
1708217309Snwhitehorn    setlocale(LC_ALL, "");
1709220749Snwhitehorn    bindtextdomain(NLS_TEXTDOMAIN, LOCALEDIR);
1710220749Snwhitehorn    textdomain(NLS_TEXTDOMAIN);
1711217309Snwhitehorn#elif defined(HAVE_SETLOCALE)
1712217309Snwhitehorn    (void) setlocale(LC_ALL, "");
1713217309Snwhitehorn#endif
1714217309Snwhitehorn
1715217309Snwhitehorn    unescape_argv(&argc, &argv);
1716217309Snwhitehorn    program = argv[0];
1717217309Snwhitehorn    dialog_state.output = stderr;
1718217309Snwhitehorn    dialog_state.input = stdin;
1719217309Snwhitehorn
1720217309Snwhitehorn    /*
1721217309Snwhitehorn     * Look for the last --stdout, --stderr or --output-fd option, and use
1722217309Snwhitehorn     * that.  We can only write to one of them.  If --stdout is used, that
1723217309Snwhitehorn     * can interfere with initializing the curses library, so we want to
1724217309Snwhitehorn     * know explicitly if it is used.
1725224014Snwhitehorn     *
1726224014Snwhitehorn     * Also, look for any --version or --help message, processing those
1727224014Snwhitehorn     * immediately.
1728217309Snwhitehorn     */
1729217309Snwhitehorn    while (offset < argc) {
1730217309Snwhitehorn	int base = offset;
1731217309Snwhitehorn	switch (lookupOption(argv[offset], 7)) {
1732217309Snwhitehorn	case o_stdout:
1733217309Snwhitehorn	    dialog_state.output = stdout;
1734217309Snwhitehorn	    break;
1735217309Snwhitehorn	case o_stderr:
1736217309Snwhitehorn	    dialog_state.output = stderr;
1737217309Snwhitehorn	    break;
1738217309Snwhitehorn	case o_input_fd:
1739217309Snwhitehorn	    if ((j = optionValue(argv, &offset)) < 0
1740217309Snwhitehorn		|| (dialog_state.input = fdopen(j, "r")) == 0)
1741217309Snwhitehorn		dlg_exiterr("Cannot open input-fd\n");
1742217309Snwhitehorn	    break;
1743217309Snwhitehorn	case o_output_fd:
1744217309Snwhitehorn	    if ((j = optionValue(argv, &offset)) < 0
1745217309Snwhitehorn		|| (dialog_state.output = fdopen(j, "w")) == 0)
1746217309Snwhitehorn		dlg_exiterr("Cannot open output-fd\n");
1747217309Snwhitehorn	    break;
1748217309Snwhitehorn	case o_keep_tite:
1749217309Snwhitehorn	    keep_tite = TRUE;
1750217309Snwhitehorn	    break;
1751224014Snwhitehorn	case o_version:
1752224014Snwhitehorn	    dialog_state.output = stdout;
1753224014Snwhitehorn	    PrintVersion(dialog_state.output);
1754224014Snwhitehorn	    exit(DLG_EXIT_OK);
1755224014Snwhitehorn	    break;
1756224014Snwhitehorn	case o_help:
1757224014Snwhitehorn	    Help();
1758224014Snwhitehorn	    break;
1759251843Sbapt#ifdef HAVE_DLG_TRACE
1760251843Sbapt	case o_trace:
1761251843Sbapt	    /*
1762251843Sbapt	     * Process/remove the --trace option if it is the first option.
1763251843Sbapt	     * Otherwise, process it in more/less expected order as a
1764251843Sbapt	     * "common" option.
1765251843Sbapt	     */
1766251843Sbapt	    if (base == 1) {
1767251843Sbapt		process_trace_option(argv, &offset);
1768251843Sbapt		break;
1769251843Sbapt	    } else {
1770251843Sbapt		++offset;
1771251843Sbapt		continue;
1772251843Sbapt	    }
1773251843Sbapt#endif
1774217309Snwhitehorn	default:
1775217309Snwhitehorn	    ++offset;
1776217309Snwhitehorn	    continue;
1777217309Snwhitehorn	}
1778251843Sbapt	dlg_trace_msg("# discarding %d parameters starting with argv[%d] (%s)\n",
1779251843Sbapt		      1 + offset - base, base,
1780251843Sbapt		      argv[base]);
1781217309Snwhitehorn	for (j = base; j < argc; ++j) {
1782217309Snwhitehorn	    dialog_argv[j] = dialog_argv[j + 1 + (offset - base)];
1783217309Snwhitehorn	    if (dialog_opts != 0)
1784217309Snwhitehorn		dialog_opts[j] = dialog_opts[j + 1 + (offset - base)];
1785217309Snwhitehorn	}
1786217309Snwhitehorn	argc -= (1 + offset - base);
1787217309Snwhitehorn	offset = base;
1788217309Snwhitehorn    }
1789217309Snwhitehorn    offset = 1;
1790217309Snwhitehorn    init_result(my_buffer);
1791217309Snwhitehorn
1792224014Snwhitehorn    /*
1793224014Snwhitehorn     * Dialog's output may be redirected (see above).  Handle the special
1794224014Snwhitehorn     * case of options that only report information without interaction.
1795224014Snwhitehorn     */
1796224014Snwhitehorn    if (argc == 2) {
1797217309Snwhitehorn	switch (lookupOption(argv[1], 7)) {
1798217309Snwhitehorn	case o_print_maxsize:
1799217309Snwhitehorn	    (void) initscr();
1800217309Snwhitehorn	    endwin();
1801217309Snwhitehorn	    fflush(dialog_state.output);
1802217309Snwhitehorn	    fprintf(dialog_state.output, "MaxSize: %d, %d\n", SLINES, SCOLS);
1803217309Snwhitehorn	    break;
1804217309Snwhitehorn	case o_print_version:
1805224014Snwhitehorn	    PrintVersion(dialog_state.output);
1806217309Snwhitehorn	    break;
1807217309Snwhitehorn	case o_clear:
1808217309Snwhitehorn	    initscr();
1809217309Snwhitehorn	    refresh();
1810217309Snwhitehorn	    endwin();
1811217309Snwhitehorn	    break;
1812217309Snwhitehorn	case o_ignore:
1813217309Snwhitehorn	    break;
1814217309Snwhitehorn	default:
1815217309Snwhitehorn	    Help();
1816217309Snwhitehorn	    break;
1817217309Snwhitehorn	}
1818217309Snwhitehorn	return DLG_EXIT_OK;
1819217309Snwhitehorn    }
1820217309Snwhitehorn
1821217309Snwhitehorn    if (argc < 2) {
1822217309Snwhitehorn	Help();
1823217309Snwhitehorn    }
1824217309Snwhitehorn#ifdef HAVE_RC_FILE
1825217309Snwhitehorn    if (lookupOption(argv[1], 7) == o_create_rc) {
1826217309Snwhitehorn	if (argc != 3) {
1827217309Snwhitehorn	    sprintf(temp, "Expected a filename for %.50s", argv[1]);
1828217309Snwhitehorn	    Usage(temp);
1829217309Snwhitehorn	}
1830217309Snwhitehorn	if (dlg_parse_rc() == -1)	/* Read the configuration file */
1831217309Snwhitehorn	    dlg_exiterr("dialog: dlg_parse_rc");
1832217309Snwhitehorn	dlg_create_rc(argv[2]);
1833217309Snwhitehorn	return DLG_EXIT_OK;
1834217309Snwhitehorn    }
1835217309Snwhitehorn#endif
1836217309Snwhitehorn
1837217309Snwhitehorn    dialog_vars.keep_tite = keep_tite;	/* init_result() cleared global */
1838217309Snwhitehorn
1839217309Snwhitehorn    init_dialog(dialog_state.input, dialog_state.output);
1840217309Snwhitehorn
1841217309Snwhitehorn    while (offset < argc && !esc_pressed) {
1842217309Snwhitehorn	init_result(my_buffer);
1843217309Snwhitehorn
1844217309Snwhitehorn	offset = process_common_options(argc, argv, offset, TRUE);
1845217309Snwhitehorn
1846217309Snwhitehorn	if (argv[offset] == NULL) {
1847217309Snwhitehorn	    if (ignore_unknown)
1848217309Snwhitehorn		break;
1849217309Snwhitehorn	    Usage("Expected a box option");
1850217309Snwhitehorn	}
1851217309Snwhitehorn
1852217309Snwhitehorn	if (lookupOption(argv[offset], 2) != o_checklist
1853217309Snwhitehorn	    && dialog_vars.separate_output) {
1854217309Snwhitehorn	    sprintf(temp, "Expected --checklist, not %.20s", argv[offset]);
1855217309Snwhitehorn	    Usage(temp);
1856217309Snwhitehorn	}
1857217309Snwhitehorn
1858217309Snwhitehorn	if (dialog_state.aspect_ratio == 0)
1859217309Snwhitehorn	    dialog_state.aspect_ratio = DEFAULT_ASPECT_RATIO;
1860217309Snwhitehorn
1861217309Snwhitehorn	dlg_put_backtitle();
1862217309Snwhitehorn
1863217309Snwhitehorn	/* use a table to look for the requested mode, to avoid code duplication */
1864217309Snwhitehorn
1865217309Snwhitehorn	modePtr = 0;
1866217309Snwhitehorn	if ((code = lookupOption(argv[offset], 2)) != o_unknown)
1867217309Snwhitehorn	    modePtr = lookupMode(code);
1868217309Snwhitehorn	if (modePtr == 0) {
1869217309Snwhitehorn	    sprintf(temp, "%s option %.20s",
1870217309Snwhitehorn		    lookupOption(argv[offset], 7) != o_unknown
1871217309Snwhitehorn		    ? "Unexpected"
1872217309Snwhitehorn		    : "Unknown",
1873217309Snwhitehorn		    argv[offset]);
1874217309Snwhitehorn	    Usage(temp);
1875217309Snwhitehorn	}
1876217309Snwhitehorn
1877217309Snwhitehorn	have = arg_rest(&argv[offset]);
1878217309Snwhitehorn	if (have < modePtr->argmin) {
1879217309Snwhitehorn	    sprintf(temp, "Expected at least %d tokens for %.20s, have %d",
1880217309Snwhitehorn		    modePtr->argmin - 1, argv[offset],
1881217309Snwhitehorn		    have - 1);
1882217309Snwhitehorn	    Usage(temp);
1883217309Snwhitehorn	}
1884217309Snwhitehorn	if (modePtr->argmax && have > modePtr->argmax) {
1885217309Snwhitehorn	    sprintf(temp,
1886217309Snwhitehorn		    "Expected no more than %d tokens for %.20s, have %d",
1887217309Snwhitehorn		    modePtr->argmax - 1, argv[offset],
1888217309Snwhitehorn		    have - 1);
1889217309Snwhitehorn	    Usage(temp);
1890217309Snwhitehorn	}
1891217309Snwhitehorn
1892217309Snwhitehorn	/*
1893217309Snwhitehorn	 * Trim whitespace from non-title option values, e.g., the ones that
1894217309Snwhitehorn	 * will be used as captions or prompts.   Do that only for the widget
1895217309Snwhitehorn	 * we are about to process, since the "--trim" option is reset before
1896217309Snwhitehorn	 * accumulating options for each widget.
1897217309Snwhitehorn	 */
1898217309Snwhitehorn	for (j = offset + 1; j <= offset + have; j++) {
1899217309Snwhitehorn	    switch (lookupOption(argv[j - 1], 7)) {
1900217309Snwhitehorn	    case o_unknown:
1901217309Snwhitehorn	    case o_title:
1902217309Snwhitehorn	    case o_backtitle:
1903224014Snwhitehorn	    case o_help_line:
1904224014Snwhitehorn	    case o_help_file:
1905217309Snwhitehorn		break;
1906217309Snwhitehorn	    default:
1907217309Snwhitehorn		if (argv[j] != 0) {
1908251843Sbapt		    char *argv_j = strdup(argv[j]);
1909251843Sbapt		    if (argv_j != 0) {
1910251843Sbapt			dlg_trim_string(argv_j);
1911251843Sbapt			argv[j] = argv_j;
1912251843Sbapt		    } else {
1913251843Sbapt			argv[j] = strdup("?");
1914251843Sbapt		    }
1915217309Snwhitehorn		}
1916217309Snwhitehorn		break;
1917217309Snwhitehorn	    }
1918217309Snwhitehorn	}
1919217309Snwhitehorn
1920217309Snwhitehorn	retval = show_result((*(modePtr->jumper)) (dialog_vars.title,
1921217309Snwhitehorn						   argv + offset,
1922217309Snwhitehorn						   &offset_add));
1923251843Sbapt	dlg_trace_msg("# widget returns %d\n", retval);
1924217309Snwhitehorn	offset += offset_add;
1925217309Snwhitehorn
1926220749Snwhitehorn	if (dialog_vars.input_result != my_buffer) {
1927217309Snwhitehorn	    free(dialog_vars.input_result);
1928220749Snwhitehorn	    dialog_vars.input_result = 0;
1929220749Snwhitehorn	}
1930217309Snwhitehorn
1931217309Snwhitehorn	if (retval == DLG_EXIT_ESC) {
1932217309Snwhitehorn	    esc_pressed = TRUE;
1933217309Snwhitehorn	} else {
1934217309Snwhitehorn
1935217309Snwhitehorn	    if (dialog_vars.beep_after_signal)
1936217309Snwhitehorn		(void) beep();
1937217309Snwhitehorn
1938217309Snwhitehorn	    if (dialog_vars.sleep_secs)
1939217309Snwhitehorn		(void) napms(dialog_vars.sleep_secs * 1000);
1940217309Snwhitehorn
1941217309Snwhitehorn	    if (offset < argc) {
1942217309Snwhitehorn		switch (lookupOption(argv[offset], 7)) {
1943217309Snwhitehorn		case o_and_widget:
1944217309Snwhitehorn		    offset++;
1945217309Snwhitehorn		    break;
1946217309Snwhitehorn		case o_unknown:
1947217309Snwhitehorn		    sprintf(temp, "Expected --and-widget, not %.20s",
1948217309Snwhitehorn			    argv[offset]);
1949217309Snwhitehorn		    Usage(temp);
1950217309Snwhitehorn		    break;
1951217309Snwhitehorn		default:
1952217309Snwhitehorn		    /* if we got a cancel, etc., stop chaining */
1953217309Snwhitehorn		    if (retval != DLG_EXIT_OK)
1954217309Snwhitehorn			esc_pressed = TRUE;
1955217309Snwhitehorn		    else
1956217309Snwhitehorn			dialog_vars.dlg_clear_screen = TRUE;
1957217309Snwhitehorn		    break;
1958217309Snwhitehorn		}
1959217309Snwhitehorn	    }
1960217309Snwhitehorn	    if (dialog_vars.dlg_clear_screen)
1961217309Snwhitehorn		dlg_clear();
1962217309Snwhitehorn	}
1963217309Snwhitehorn    }
1964217309Snwhitehorn
1965217309Snwhitehorn    dlg_killall_bg(&retval);
1966217309Snwhitehorn    if (dialog_state.screen_initialized) {
1967217309Snwhitehorn	(void) refresh();
1968217309Snwhitehorn	end_dialog();
1969217309Snwhitehorn    }
1970217309Snwhitehorn    dlg_exit(retval);
1971217309Snwhitehorn}
1972