xref: /freebsd/contrib/bsddialog/utility/util_builders.c (revision 61ba55bcf70f2340f9c943c9571113b3fd8eda69)
1*61ba55bcSBaptiste Daroussin /*-
2*61ba55bcSBaptiste Daroussin  * SPDX-License-Identifier: BSD-2-Clause
3*61ba55bcSBaptiste Daroussin  *
4*61ba55bcSBaptiste Daroussin  * Copyright (c) 2021-2023 Alfonso Sabato Siciliano
5*61ba55bcSBaptiste Daroussin  *
6*61ba55bcSBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
7*61ba55bcSBaptiste Daroussin  * modification, are permitted provided that the following conditions
8*61ba55bcSBaptiste Daroussin  * are met:
9*61ba55bcSBaptiste Daroussin  * 1. Redistributions of source code must retain the above copyright
10*61ba55bcSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer.
11*61ba55bcSBaptiste Daroussin  * 2. Redistributions in binary form must reproduce the above copyright
12*61ba55bcSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer in the
13*61ba55bcSBaptiste Daroussin  *    documentation and/or other materials provided with the distribution.
14*61ba55bcSBaptiste Daroussin  *
15*61ba55bcSBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*61ba55bcSBaptiste Daroussin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*61ba55bcSBaptiste Daroussin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*61ba55bcSBaptiste Daroussin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*61ba55bcSBaptiste Daroussin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*61ba55bcSBaptiste Daroussin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*61ba55bcSBaptiste Daroussin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*61ba55bcSBaptiste Daroussin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*61ba55bcSBaptiste Daroussin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*61ba55bcSBaptiste Daroussin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*61ba55bcSBaptiste Daroussin  * SUCH DAMAGE.
26*61ba55bcSBaptiste Daroussin  */
27*61ba55bcSBaptiste Daroussin 
28*61ba55bcSBaptiste Daroussin #include <stdio.h>
29*61ba55bcSBaptiste Daroussin #include <stdlib.h>
30*61ba55bcSBaptiste Daroussin #include <string.h>
31*61ba55bcSBaptiste Daroussin #include <time.h>
32*61ba55bcSBaptiste Daroussin #include <unistd.h>
33*61ba55bcSBaptiste Daroussin 
34*61ba55bcSBaptiste Daroussin #include <bsddialog.h>
35*61ba55bcSBaptiste Daroussin #include <bsddialog_theme.h>
36*61ba55bcSBaptiste Daroussin 
37*61ba55bcSBaptiste Daroussin #include "util.h"
38*61ba55bcSBaptiste Daroussin 
39*61ba55bcSBaptiste Daroussin #define NO_PRINT_VALUES(rv)                                                    \
40*61ba55bcSBaptiste Daroussin (rv == BSDDIALOG_ERROR || rv == BSDDIALOG_CANCEL || rv == BSDDIALOG_ESC)
41*61ba55bcSBaptiste Daroussin 
42*61ba55bcSBaptiste Daroussin /* message */
43*61ba55bcSBaptiste Daroussin int infobox_builder(BUILDER_ARGS)
44*61ba55bcSBaptiste Daroussin {
45*61ba55bcSBaptiste Daroussin 	if (argc > 0)
46*61ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
47*61ba55bcSBaptiste Daroussin 
48*61ba55bcSBaptiste Daroussin 	return (bsddialog_infobox(conf, text, rows, cols));
49*61ba55bcSBaptiste Daroussin }
50*61ba55bcSBaptiste Daroussin 
51*61ba55bcSBaptiste Daroussin int msgbox_builder(BUILDER_ARGS)
52*61ba55bcSBaptiste Daroussin {
53*61ba55bcSBaptiste Daroussin 	if (argc > 0)
54*61ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
55*61ba55bcSBaptiste Daroussin 
56*61ba55bcSBaptiste Daroussin 	return (bsddialog_msgbox(conf, text, rows, cols));
57*61ba55bcSBaptiste Daroussin }
58*61ba55bcSBaptiste Daroussin 
59*61ba55bcSBaptiste Daroussin int yesno_builder(BUILDER_ARGS)
60*61ba55bcSBaptiste Daroussin {
61*61ba55bcSBaptiste Daroussin 	if (argc > 0)
62*61ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
63*61ba55bcSBaptiste Daroussin 
64*61ba55bcSBaptiste Daroussin 	return (bsddialog_yesno(conf, text, rows, cols));
65*61ba55bcSBaptiste Daroussin }
66*61ba55bcSBaptiste Daroussin 
67*61ba55bcSBaptiste Daroussin /* textbox */
68*61ba55bcSBaptiste Daroussin int textbox_builder(BUILDER_ARGS)
69*61ba55bcSBaptiste Daroussin {
70*61ba55bcSBaptiste Daroussin 	if (argc > 0)
71*61ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
72*61ba55bcSBaptiste Daroussin 
73*61ba55bcSBaptiste Daroussin 	return (bsddialog_textbox(conf, text, rows, cols));
74*61ba55bcSBaptiste Daroussin }
75*61ba55bcSBaptiste Daroussin 
76*61ba55bcSBaptiste Daroussin /* bar */
77*61ba55bcSBaptiste Daroussin int gauge_builder(BUILDER_ARGS)
78*61ba55bcSBaptiste Daroussin {
79*61ba55bcSBaptiste Daroussin 	int output;
80*61ba55bcSBaptiste Daroussin 	unsigned int perc;
81*61ba55bcSBaptiste Daroussin 
82*61ba55bcSBaptiste Daroussin 	perc = 0;
83*61ba55bcSBaptiste Daroussin 	if (argc == 1) {
84*61ba55bcSBaptiste Daroussin 		perc = (u_int)strtoul(argv[0], NULL, 10);
85*61ba55bcSBaptiste Daroussin 		perc = perc > 100 ? 100 : perc;
86*61ba55bcSBaptiste Daroussin 	} else if (argc > 1) {
87*61ba55bcSBaptiste Daroussin 		error_args(opt->name, argc - 1, argv + 1);
88*61ba55bcSBaptiste Daroussin 	}
89*61ba55bcSBaptiste Daroussin 
90*61ba55bcSBaptiste Daroussin 	output = bsddialog_gauge(conf, text, rows, cols, perc, STDIN_FILENO,
91*61ba55bcSBaptiste Daroussin 	    "XXX", "EOF");
92*61ba55bcSBaptiste Daroussin 
93*61ba55bcSBaptiste Daroussin 	return (output);
94*61ba55bcSBaptiste Daroussin }
95*61ba55bcSBaptiste Daroussin 
96*61ba55bcSBaptiste Daroussin int mixedgauge_builder(BUILDER_ARGS)
97*61ba55bcSBaptiste Daroussin {
98*61ba55bcSBaptiste Daroussin 	int output, *minipercs;
99*61ba55bcSBaptiste Daroussin 	unsigned int i, mainperc, nminibars;
100*61ba55bcSBaptiste Daroussin 	const char **minilabels;
101*61ba55bcSBaptiste Daroussin 
102*61ba55bcSBaptiste Daroussin 	if (argc < 1)
103*61ba55bcSBaptiste Daroussin 		exit_error(true, "%s missing <mainperc>", opt->name);
104*61ba55bcSBaptiste Daroussin 	if (((argc-1) % 2) != 0)
105*61ba55bcSBaptiste Daroussin 		exit_error(true,
106*61ba55bcSBaptiste Daroussin 		    "bad %s pair number [<minilabel> <miniperc>]", opt->name);
107*61ba55bcSBaptiste Daroussin 
108*61ba55bcSBaptiste Daroussin 	mainperc = (u_int)strtoul(argv[0], NULL, 10);
109*61ba55bcSBaptiste Daroussin 	mainperc = mainperc > 100 ? 100 : mainperc;
110*61ba55bcSBaptiste Daroussin 	argc--;
111*61ba55bcSBaptiste Daroussin 	argv++;
112*61ba55bcSBaptiste Daroussin 
113*61ba55bcSBaptiste Daroussin 	nminibars  = argc / 2;
114*61ba55bcSBaptiste Daroussin 	if ((minilabels = calloc(nminibars, sizeof(char*))) == NULL)
115*61ba55bcSBaptiste Daroussin 		exit_error(false, "Cannot allocate memory for minilabels");
116*61ba55bcSBaptiste Daroussin 	if ((minipercs = calloc(nminibars, sizeof(int))) == NULL)
117*61ba55bcSBaptiste Daroussin 		exit_error(false, "Cannot allocate memory for minipercs");
118*61ba55bcSBaptiste Daroussin 
119*61ba55bcSBaptiste Daroussin 	for (i = 0; i < nminibars; i++) {
120*61ba55bcSBaptiste Daroussin 		minilabels[i] = argv[i * 2];
121*61ba55bcSBaptiste Daroussin 		minipercs[i] = (int)strtol(argv[i * 2 + 1], NULL, 10);
122*61ba55bcSBaptiste Daroussin 	}
123*61ba55bcSBaptiste Daroussin 
124*61ba55bcSBaptiste Daroussin 	output = bsddialog_mixedgauge(conf, text, rows, cols, mainperc,
125*61ba55bcSBaptiste Daroussin 	    nminibars, minilabels, minipercs);
126*61ba55bcSBaptiste Daroussin 
127*61ba55bcSBaptiste Daroussin 	return (output);
128*61ba55bcSBaptiste Daroussin }
129*61ba55bcSBaptiste Daroussin 
130*61ba55bcSBaptiste Daroussin int pause_builder(BUILDER_ARGS)
131*61ba55bcSBaptiste Daroussin {
132*61ba55bcSBaptiste Daroussin 	int output;
133*61ba55bcSBaptiste Daroussin 	unsigned int secs;
134*61ba55bcSBaptiste Daroussin 
135*61ba55bcSBaptiste Daroussin 	if (argc == 0)
136*61ba55bcSBaptiste Daroussin 		exit_error(true, "--pause missing <seconds>");
137*61ba55bcSBaptiste Daroussin 	if (argc > 1)
138*61ba55bcSBaptiste Daroussin 		error_args(opt->name, argc - 1, argv + 1);
139*61ba55bcSBaptiste Daroussin 
140*61ba55bcSBaptiste Daroussin 	secs = (u_int)strtoul(argv[0], NULL, 10);
141*61ba55bcSBaptiste Daroussin 	output = bsddialog_pause(conf, text, rows, cols, &secs);
142*61ba55bcSBaptiste Daroussin 
143*61ba55bcSBaptiste Daroussin 	return (output);
144*61ba55bcSBaptiste Daroussin }
145*61ba55bcSBaptiste Daroussin 
146*61ba55bcSBaptiste Daroussin int rangebox_builder(BUILDER_ARGS)
147*61ba55bcSBaptiste Daroussin {
148*61ba55bcSBaptiste Daroussin 	int output, min, max, value;
149*61ba55bcSBaptiste Daroussin 
150*61ba55bcSBaptiste Daroussin 	if (argc < 2)
151*61ba55bcSBaptiste Daroussin 		exit_error(true, "--rangebox missing <min> <max> [<init>]");
152*61ba55bcSBaptiste Daroussin 	if (argc > 3)
153*61ba55bcSBaptiste Daroussin 		error_args("--rangebox", argc - 3, argv + 3);
154*61ba55bcSBaptiste Daroussin 
155*61ba55bcSBaptiste Daroussin 	min = (int)strtol(argv[0], NULL, 10);
156*61ba55bcSBaptiste Daroussin 	max = (int)strtol(argv[1], NULL, 10);
157*61ba55bcSBaptiste Daroussin 
158*61ba55bcSBaptiste Daroussin 	if (argc == 3) {
159*61ba55bcSBaptiste Daroussin 		value = (int)strtol(argv[2], NULL, 10);
160*61ba55bcSBaptiste Daroussin 		value = value < min ? min : value;
161*61ba55bcSBaptiste Daroussin 		value = value > max ? max : value;
162*61ba55bcSBaptiste Daroussin 	} else
163*61ba55bcSBaptiste Daroussin 		value = min;
164*61ba55bcSBaptiste Daroussin 
165*61ba55bcSBaptiste Daroussin 	output = bsddialog_rangebox(conf, text, rows, cols, min, max, &value);
166*61ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output) == false)
167*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%d", value);
168*61ba55bcSBaptiste Daroussin 
169*61ba55bcSBaptiste Daroussin 	return (output);
170*61ba55bcSBaptiste Daroussin }
171*61ba55bcSBaptiste Daroussin 
172*61ba55bcSBaptiste Daroussin /* date and time */
173*61ba55bcSBaptiste Daroussin static int date(BUILDER_ARGS)
174*61ba55bcSBaptiste Daroussin {
175*61ba55bcSBaptiste Daroussin 	int rv;
176*61ba55bcSBaptiste Daroussin 	unsigned int yy, mm, dd;
177*61ba55bcSBaptiste Daroussin 	time_t cal;
178*61ba55bcSBaptiste Daroussin 	struct tm *localtm;
179*61ba55bcSBaptiste Daroussin 	char stringdate[1024];
180*61ba55bcSBaptiste Daroussin 
181*61ba55bcSBaptiste Daroussin 	time(&cal);
182*61ba55bcSBaptiste Daroussin 	localtm = localtime(&cal);
183*61ba55bcSBaptiste Daroussin 	yy = localtm->tm_year + 1900;
184*61ba55bcSBaptiste Daroussin 	mm = localtm->tm_mon + 1;
185*61ba55bcSBaptiste Daroussin 	dd = localtm->tm_mday;
186*61ba55bcSBaptiste Daroussin 
187*61ba55bcSBaptiste Daroussin 	if (argc > 3) {
188*61ba55bcSBaptiste Daroussin 		error_args(opt->name, argc - 3, argv + 3);
189*61ba55bcSBaptiste Daroussin 	} else if (argc == 3) {
190*61ba55bcSBaptiste Daroussin 		/* lib checks/sets max and min */
191*61ba55bcSBaptiste Daroussin 		dd = (u_int)strtoul(argv[0], NULL, 10);
192*61ba55bcSBaptiste Daroussin 		mm = (u_int)strtoul(argv[1], NULL, 10);
193*61ba55bcSBaptiste Daroussin 		yy = (u_int)strtoul(argv[2], NULL, 10);
194*61ba55bcSBaptiste Daroussin 	}
195*61ba55bcSBaptiste Daroussin 
196*61ba55bcSBaptiste Daroussin 	if (strcmp(opt->name, "--datebox") == 0)
197*61ba55bcSBaptiste Daroussin 		rv = bsddialog_datebox(conf, text, rows, cols, &yy, &mm, &dd);
198*61ba55bcSBaptiste Daroussin 	else
199*61ba55bcSBaptiste Daroussin 		rv = bsddialog_calendar(conf, text, rows, cols, &yy, &mm, &dd);
200*61ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(rv))
201*61ba55bcSBaptiste Daroussin 		return (rv);
202*61ba55bcSBaptiste Daroussin 
203*61ba55bcSBaptiste Daroussin 	if (opt->date_fmt != NULL) {
204*61ba55bcSBaptiste Daroussin 		time(&cal);
205*61ba55bcSBaptiste Daroussin 		localtm = localtime(&cal);
206*61ba55bcSBaptiste Daroussin 		localtm->tm_year = yy - 1900;
207*61ba55bcSBaptiste Daroussin 		localtm->tm_mon = mm - 1;
208*61ba55bcSBaptiste Daroussin 		localtm->tm_mday = dd;
209*61ba55bcSBaptiste Daroussin 		strftime(stringdate, 1024, opt->date_fmt, localtm);
210*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%s", stringdate);
211*61ba55bcSBaptiste Daroussin 	} else if (opt->bikeshed && ~dd & 1) {
212*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%u/%u/%u", dd, mm, yy);
213*61ba55bcSBaptiste Daroussin 	} else {
214*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%02u/%02u/%u", dd, mm, yy);
215*61ba55bcSBaptiste Daroussin 	}
216*61ba55bcSBaptiste Daroussin 
217*61ba55bcSBaptiste Daroussin 	return (rv);
218*61ba55bcSBaptiste Daroussin }
219*61ba55bcSBaptiste Daroussin 
220*61ba55bcSBaptiste Daroussin int calendar_builder(BUILDER_ARGS)
221*61ba55bcSBaptiste Daroussin {
222*61ba55bcSBaptiste Daroussin 	/* Use height autosizing with rows = 2. Documented in bsddialog(1).
223*61ba55bcSBaptiste Daroussin 	 *
224*61ba55bcSBaptiste Daroussin 	 * f_dialog_calendar_size() in bsdconfig/share/dialog.subr:1352
225*61ba55bcSBaptiste Daroussin 	 * computes height 2 for `dialog --calendar', called by:
226*61ba55bcSBaptiste Daroussin 	 * 1) f_dialog_input_expire_password() in
227*61ba55bcSBaptiste Daroussin 	 * bsdconfig/usermgmt/share/user_input.subr:517 and
228*61ba55bcSBaptiste Daroussin 	 * 2) f_dialog_input_expire_account() in
229*61ba55bcSBaptiste Daroussin 	 * bsdconfig/usermgmt/share/user_input.subr:660.
230*61ba55bcSBaptiste Daroussin 	 *
231*61ba55bcSBaptiste Daroussin 	 * Then use height autosizing with 2 that is min height like dialog.
232*61ba55bcSBaptiste Daroussin 	 */
233*61ba55bcSBaptiste Daroussin 	if (rows == 2)
234*61ba55bcSBaptiste Daroussin 		rows = 0;
235*61ba55bcSBaptiste Daroussin 
236*61ba55bcSBaptiste Daroussin 	return (date(conf, text, rows, cols, argc, argv, opt));
237*61ba55bcSBaptiste Daroussin }
238*61ba55bcSBaptiste Daroussin 
239*61ba55bcSBaptiste Daroussin int datebox_builder(BUILDER_ARGS)
240*61ba55bcSBaptiste Daroussin {
241*61ba55bcSBaptiste Daroussin 	return (date(conf, text, rows, cols, argc, argv, opt));
242*61ba55bcSBaptiste Daroussin }
243*61ba55bcSBaptiste Daroussin 
244*61ba55bcSBaptiste Daroussin int timebox_builder(BUILDER_ARGS)
245*61ba55bcSBaptiste Daroussin {
246*61ba55bcSBaptiste Daroussin 	int output;
247*61ba55bcSBaptiste Daroussin 	unsigned int hh, mm, ss;
248*61ba55bcSBaptiste Daroussin 	time_t clock;
249*61ba55bcSBaptiste Daroussin 	struct tm *localtm;
250*61ba55bcSBaptiste Daroussin 	char stringtime[1024];
251*61ba55bcSBaptiste Daroussin 
252*61ba55bcSBaptiste Daroussin 	time(&clock);
253*61ba55bcSBaptiste Daroussin 	localtm = localtime(&clock);
254*61ba55bcSBaptiste Daroussin 	hh = localtm->tm_hour;
255*61ba55bcSBaptiste Daroussin 	mm = localtm->tm_min;
256*61ba55bcSBaptiste Daroussin 	ss = localtm->tm_sec;
257*61ba55bcSBaptiste Daroussin 
258*61ba55bcSBaptiste Daroussin 	if (argc > 3) {
259*61ba55bcSBaptiste Daroussin 		error_args("--timebox", argc - 3, argv + 3);
260*61ba55bcSBaptiste Daroussin 	} else if (argc == 3) {
261*61ba55bcSBaptiste Daroussin 		hh = (u_int)strtoul(argv[0], NULL, 10);
262*61ba55bcSBaptiste Daroussin 		mm = (u_int)strtoul(argv[1], NULL, 10);
263*61ba55bcSBaptiste Daroussin 		ss = (u_int)strtoul(argv[2], NULL, 10);
264*61ba55bcSBaptiste Daroussin 	}
265*61ba55bcSBaptiste Daroussin 
266*61ba55bcSBaptiste Daroussin 	output = bsddialog_timebox(conf, text, rows, cols, &hh, &mm, &ss);
267*61ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output))
268*61ba55bcSBaptiste Daroussin 		return (output);
269*61ba55bcSBaptiste Daroussin 
270*61ba55bcSBaptiste Daroussin 	if (opt->time_fmt != NULL) {
271*61ba55bcSBaptiste Daroussin 		time(&clock);
272*61ba55bcSBaptiste Daroussin 		localtm = localtime(&clock);
273*61ba55bcSBaptiste Daroussin 		localtm->tm_hour = hh;
274*61ba55bcSBaptiste Daroussin 		localtm->tm_min = mm;
275*61ba55bcSBaptiste Daroussin 		localtm->tm_sec = ss;
276*61ba55bcSBaptiste Daroussin 		strftime(stringtime, 1024, opt->time_fmt, localtm);
277*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%s", stringtime);
278*61ba55bcSBaptiste Daroussin 	} else if (opt->bikeshed && ~ss & 1) {
279*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%u:%u:%u", hh, mm, ss);
280*61ba55bcSBaptiste Daroussin 	} else {
281*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%02u:%02u:%02u", hh, mm, ss);
282*61ba55bcSBaptiste Daroussin 	}
283*61ba55bcSBaptiste Daroussin 
284*61ba55bcSBaptiste Daroussin 	return (output);
285*61ba55bcSBaptiste Daroussin }
286*61ba55bcSBaptiste Daroussin 
287*61ba55bcSBaptiste Daroussin /* menu */
288*61ba55bcSBaptiste Daroussin static void
289*61ba55bcSBaptiste Daroussin get_menu_items(int argc, char **argv, bool setprefix, bool setdepth,
290*61ba55bcSBaptiste Daroussin     bool setname, bool setdesc, bool setstatus, bool sethelp,
291*61ba55bcSBaptiste Daroussin     unsigned int *nitems, struct bsddialog_menuitem **items, int *focusitem,
292*61ba55bcSBaptiste Daroussin     struct options *opt)
293*61ba55bcSBaptiste Daroussin {
294*61ba55bcSBaptiste Daroussin 	unsigned int i, j, sizeitem;
295*61ba55bcSBaptiste Daroussin 
296*61ba55bcSBaptiste Daroussin 	*focusitem = -1;
297*61ba55bcSBaptiste Daroussin 
298*61ba55bcSBaptiste Daroussin 	sizeitem = 0;
299*61ba55bcSBaptiste Daroussin 	sizeitem += setprefix ? 1 : 0;
300*61ba55bcSBaptiste Daroussin 	sizeitem += setdepth  ? 1 : 0;
301*61ba55bcSBaptiste Daroussin 	sizeitem += setname   ? 1 : 0;
302*61ba55bcSBaptiste Daroussin 	sizeitem += setdesc   ? 1 : 0;
303*61ba55bcSBaptiste Daroussin 	sizeitem += setstatus ? 1 : 0;
304*61ba55bcSBaptiste Daroussin 	sizeitem += sethelp   ? 1 : 0;
305*61ba55bcSBaptiste Daroussin 	if ((argc % sizeitem) != 0)
306*61ba55bcSBaptiste Daroussin 		exit_error(true, "%s bad arguments items number", opt->name);
307*61ba55bcSBaptiste Daroussin 
308*61ba55bcSBaptiste Daroussin 	*nitems = argc / sizeitem;
309*61ba55bcSBaptiste Daroussin 	*items = calloc(*nitems, sizeof(struct bsddialog_menuitem));
310*61ba55bcSBaptiste Daroussin 	if (items == NULL)
311*61ba55bcSBaptiste Daroussin 		exit_error(false, "%s cannot allocate items", opt->name);
312*61ba55bcSBaptiste Daroussin 
313*61ba55bcSBaptiste Daroussin 	j = 0;
314*61ba55bcSBaptiste Daroussin 	for (i = 0; i < *nitems; i++) {
315*61ba55bcSBaptiste Daroussin 		(*items)[i].prefix = setprefix ? argv[j++] : "";
316*61ba55bcSBaptiste Daroussin 		(*items)[i].depth = setdepth ?
317*61ba55bcSBaptiste Daroussin 		    (u_int)strtoul(argv[j++], NULL, 0) : 0;
318*61ba55bcSBaptiste Daroussin 		(*items)[i].name = setname ? argv[j++] : "";
319*61ba55bcSBaptiste Daroussin 		(*items)[i].desc = setdesc ? argv[j++] : "";
320*61ba55bcSBaptiste Daroussin 		if (setstatus) {
321*61ba55bcSBaptiste Daroussin 			if (strcasecmp(argv[j], "on") == 0)
322*61ba55bcSBaptiste Daroussin 				(*items)[i].on = true;
323*61ba55bcSBaptiste Daroussin 			else if (strcasecmp(argv[j], "off") == 0)
324*61ba55bcSBaptiste Daroussin 				(*items)[i].on = false;
325*61ba55bcSBaptiste Daroussin 			else
326*61ba55bcSBaptiste Daroussin 				exit_error(true,
327*61ba55bcSBaptiste Daroussin 				    "\"%s\" (item %i) invalid status \"%s\"",
328*61ba55bcSBaptiste Daroussin 				    (*items)[i].name, i+1, argv[j]);
329*61ba55bcSBaptiste Daroussin 			j++;
330*61ba55bcSBaptiste Daroussin 		} else
331*61ba55bcSBaptiste Daroussin 			(*items)[i].on = false;
332*61ba55bcSBaptiste Daroussin 		(*items)[i].bottomdesc = sethelp ? argv[j++] : "";
333*61ba55bcSBaptiste Daroussin 
334*61ba55bcSBaptiste Daroussin 		if (opt->item_default != NULL && *focusitem == -1)
335*61ba55bcSBaptiste Daroussin 			if (strcmp((*items)[i].name, opt->item_default) == 0)
336*61ba55bcSBaptiste Daroussin 				*focusitem = i;
337*61ba55bcSBaptiste Daroussin 	}
338*61ba55bcSBaptiste Daroussin }
339*61ba55bcSBaptiste Daroussin 
340*61ba55bcSBaptiste Daroussin static void
341*61ba55bcSBaptiste Daroussin print_menu_items(int output, int nitems, struct bsddialog_menuitem *items,
342*61ba55bcSBaptiste Daroussin     int focusitem, struct options *opt)
343*61ba55bcSBaptiste Daroussin {
344*61ba55bcSBaptiste Daroussin 	bool sep, sepbefore, sepafter, sepsecond, toquote, ismenu, ischecklist;
345*61ba55bcSBaptiste Daroussin 	int i;
346*61ba55bcSBaptiste Daroussin 	char quotech;
347*61ba55bcSBaptiste Daroussin 	const char *focusname, *sepstr;
348*61ba55bcSBaptiste Daroussin 
349*61ba55bcSBaptiste Daroussin 	ismenu = (strcmp(opt->name, "--menu") == 0) ? true : false;
350*61ba55bcSBaptiste Daroussin 	ischecklist = (strcmp(opt->name, "--checklist") == 0) ? true : false;
351*61ba55bcSBaptiste Daroussin 	sep = false;
352*61ba55bcSBaptiste Daroussin 	quotech = opt->item_singlequote ? '\'' : '"';
353*61ba55bcSBaptiste Daroussin 
354*61ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output))
355*61ba55bcSBaptiste Daroussin 		return;
356*61ba55bcSBaptiste Daroussin 
357*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP) {
358*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "HELP ");
359*61ba55bcSBaptiste Daroussin 
360*61ba55bcSBaptiste Daroussin 		if (focusitem >= 0) {
361*61ba55bcSBaptiste Daroussin 			focusname = items[focusitem].name;
362*61ba55bcSBaptiste Daroussin 			if (opt->item_bottomdesc &&
363*61ba55bcSBaptiste Daroussin 			    opt->help_print_item_name == false)
364*61ba55bcSBaptiste Daroussin 				focusname = items[focusitem].bottomdesc;
365*61ba55bcSBaptiste Daroussin 
366*61ba55bcSBaptiste Daroussin 			toquote = false;
367*61ba55bcSBaptiste Daroussin 			if (strchr(focusname, ' ') != NULL) {
368*61ba55bcSBaptiste Daroussin 				toquote = opt->item_always_quote;
369*61ba55bcSBaptiste Daroussin 				if (ismenu == false &&
370*61ba55bcSBaptiste Daroussin 				    opt->item_output_sepnl == false)
371*61ba55bcSBaptiste Daroussin 					toquote = true;
372*61ba55bcSBaptiste Daroussin 			}
373*61ba55bcSBaptiste Daroussin 			if (toquote) {
374*61ba55bcSBaptiste Daroussin 				dprintf(opt->output_fd, "%c%s%c",
375*61ba55bcSBaptiste Daroussin 				    quotech, focusname, quotech);
376*61ba55bcSBaptiste Daroussin 			} else
377*61ba55bcSBaptiste Daroussin 				dprintf(opt->output_fd, "%s", focusname);
378*61ba55bcSBaptiste Daroussin 		}
379*61ba55bcSBaptiste Daroussin 
380*61ba55bcSBaptiste Daroussin 		if (ismenu || opt->help_print_items == false)
381*61ba55bcSBaptiste Daroussin 			return;
382*61ba55bcSBaptiste Daroussin 		sep = true;
383*61ba55bcSBaptiste Daroussin 	}
384*61ba55bcSBaptiste Daroussin 
385*61ba55bcSBaptiste Daroussin 	sepbefore = false;
386*61ba55bcSBaptiste Daroussin 	sepsecond = false;
387*61ba55bcSBaptiste Daroussin 	if ((sepstr = opt->item_output_sep) == NULL) {
388*61ba55bcSBaptiste Daroussin 		if (opt->item_output_sepnl)
389*61ba55bcSBaptiste Daroussin 			sepstr = "\n";
390*61ba55bcSBaptiste Daroussin 		else {
391*61ba55bcSBaptiste Daroussin 			sepstr = " ";
392*61ba55bcSBaptiste Daroussin 			sepsecond = true;
393*61ba55bcSBaptiste Daroussin 		}
394*61ba55bcSBaptiste Daroussin 	} else
395*61ba55bcSBaptiste Daroussin 		sepbefore = true;
396*61ba55bcSBaptiste Daroussin 
397*61ba55bcSBaptiste Daroussin 	sepafter = false;
398*61ba55bcSBaptiste Daroussin 	if (opt->item_output_sepnl) {
399*61ba55bcSBaptiste Daroussin 		sepbefore = false;
400*61ba55bcSBaptiste Daroussin 		sepafter = true;
401*61ba55bcSBaptiste Daroussin 	}
402*61ba55bcSBaptiste Daroussin 
403*61ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
404*61ba55bcSBaptiste Daroussin 		if (items[i].on == false)
405*61ba55bcSBaptiste Daroussin 			continue;
406*61ba55bcSBaptiste Daroussin 
407*61ba55bcSBaptiste Daroussin 		if (sep || sepbefore)
408*61ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%s", sepstr);
409*61ba55bcSBaptiste Daroussin 		sep = false;
410*61ba55bcSBaptiste Daroussin 		if (sepsecond)
411*61ba55bcSBaptiste Daroussin 			sep = true;
412*61ba55bcSBaptiste Daroussin 
413*61ba55bcSBaptiste Daroussin 		toquote = false;
414*61ba55bcSBaptiste Daroussin 		if (strchr(items[i].name, ' ') != NULL) {
415*61ba55bcSBaptiste Daroussin 			toquote = opt->item_always_quote;
416*61ba55bcSBaptiste Daroussin 			if (ischecklist && opt->item_output_sepnl == false)
417*61ba55bcSBaptiste Daroussin 				toquote = true;
418*61ba55bcSBaptiste Daroussin 		}
419*61ba55bcSBaptiste Daroussin 		if (toquote)
420*61ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%c%s%c",
421*61ba55bcSBaptiste Daroussin 			    quotech, items[i].name, quotech);
422*61ba55bcSBaptiste Daroussin 		else
423*61ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%s", items[i].name);
424*61ba55bcSBaptiste Daroussin 
425*61ba55bcSBaptiste Daroussin 		if (sepafter)
426*61ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%s", sepstr);
427*61ba55bcSBaptiste Daroussin 	}
428*61ba55bcSBaptiste Daroussin }
429*61ba55bcSBaptiste Daroussin 
430*61ba55bcSBaptiste Daroussin int checklist_builder(BUILDER_ARGS)
431*61ba55bcSBaptiste Daroussin {
432*61ba55bcSBaptiste Daroussin 	int output, focusitem;
433*61ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
434*61ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
435*61ba55bcSBaptiste Daroussin 
436*61ba55bcSBaptiste Daroussin 	if (argc < 1)
437*61ba55bcSBaptiste Daroussin 		exit_error(true, "--checklist missing <menurows>");
438*61ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
439*61ba55bcSBaptiste Daroussin 
440*61ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true,
441*61ba55bcSBaptiste Daroussin 	    true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt);
442*61ba55bcSBaptiste Daroussin 
443*61ba55bcSBaptiste Daroussin 	output = bsddialog_checklist(conf, text, rows, cols, menurows, nitems,
444*61ba55bcSBaptiste Daroussin 	    items, &focusitem);
445*61ba55bcSBaptiste Daroussin 
446*61ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
447*61ba55bcSBaptiste Daroussin 	free(items);
448*61ba55bcSBaptiste Daroussin 
449*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
450*61ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
451*61ba55bcSBaptiste Daroussin 
452*61ba55bcSBaptiste Daroussin 	return (output);
453*61ba55bcSBaptiste Daroussin }
454*61ba55bcSBaptiste Daroussin 
455*61ba55bcSBaptiste Daroussin int menu_builder(BUILDER_ARGS)
456*61ba55bcSBaptiste Daroussin {
457*61ba55bcSBaptiste Daroussin 	int output, focusitem;
458*61ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
459*61ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
460*61ba55bcSBaptiste Daroussin 
461*61ba55bcSBaptiste Daroussin 	if (argc < 1)
462*61ba55bcSBaptiste Daroussin 		exit_error(true, "--menu missing <menurows>");
463*61ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
464*61ba55bcSBaptiste Daroussin 
465*61ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true,
466*61ba55bcSBaptiste Daroussin 	    true, false, opt->item_bottomdesc, &nitems, &items, &focusitem,
467*61ba55bcSBaptiste Daroussin 	    opt);
468*61ba55bcSBaptiste Daroussin 
469*61ba55bcSBaptiste Daroussin 	output = bsddialog_menu(conf, text, rows, cols, menurows, nitems,
470*61ba55bcSBaptiste Daroussin 	    items, &focusitem);
471*61ba55bcSBaptiste Daroussin 
472*61ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
473*61ba55bcSBaptiste Daroussin 	free(items);
474*61ba55bcSBaptiste Daroussin 
475*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
476*61ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
477*61ba55bcSBaptiste Daroussin 
478*61ba55bcSBaptiste Daroussin 	return (output);
479*61ba55bcSBaptiste Daroussin }
480*61ba55bcSBaptiste Daroussin 
481*61ba55bcSBaptiste Daroussin int radiolist_builder(BUILDER_ARGS)
482*61ba55bcSBaptiste Daroussin {
483*61ba55bcSBaptiste Daroussin 	int output, focusitem;
484*61ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
485*61ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
486*61ba55bcSBaptiste Daroussin 
487*61ba55bcSBaptiste Daroussin 	if (argc < 1)
488*61ba55bcSBaptiste Daroussin 		exit_error(true, "--radiolist missing <menurows>");
489*61ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
490*61ba55bcSBaptiste Daroussin 
491*61ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true,
492*61ba55bcSBaptiste Daroussin 	    true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt);
493*61ba55bcSBaptiste Daroussin 
494*61ba55bcSBaptiste Daroussin 	output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems,
495*61ba55bcSBaptiste Daroussin 	    items, &focusitem);
496*61ba55bcSBaptiste Daroussin 
497*61ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
498*61ba55bcSBaptiste Daroussin 	free(items);
499*61ba55bcSBaptiste Daroussin 
500*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
501*61ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
502*61ba55bcSBaptiste Daroussin 
503*61ba55bcSBaptiste Daroussin 	return (output);
504*61ba55bcSBaptiste Daroussin }
505*61ba55bcSBaptiste Daroussin 
506*61ba55bcSBaptiste Daroussin int treeview_builder(BUILDER_ARGS)
507*61ba55bcSBaptiste Daroussin {
508*61ba55bcSBaptiste Daroussin 	int output, focusitem;
509*61ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
510*61ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
511*61ba55bcSBaptiste Daroussin 
512*61ba55bcSBaptiste Daroussin 	if (argc < 1)
513*61ba55bcSBaptiste Daroussin 		exit_error(true, "--treeview missing <menurows>");
514*61ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
515*61ba55bcSBaptiste Daroussin 
516*61ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, true, true, true, true,
517*61ba55bcSBaptiste Daroussin 	    opt->item_bottomdesc, &nitems, &items, &focusitem, opt);
518*61ba55bcSBaptiste Daroussin 
519*61ba55bcSBaptiste Daroussin 	conf->menu.no_name = true;
520*61ba55bcSBaptiste Daroussin 	conf->menu.align_left = true;
521*61ba55bcSBaptiste Daroussin 
522*61ba55bcSBaptiste Daroussin 	output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems,
523*61ba55bcSBaptiste Daroussin 	    items, &focusitem);
524*61ba55bcSBaptiste Daroussin 
525*61ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
526*61ba55bcSBaptiste Daroussin 	free(items);
527*61ba55bcSBaptiste Daroussin 
528*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
529*61ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
530*61ba55bcSBaptiste Daroussin 
531*61ba55bcSBaptiste Daroussin 	return (output);
532*61ba55bcSBaptiste Daroussin }
533*61ba55bcSBaptiste Daroussin 
534*61ba55bcSBaptiste Daroussin /* form */
535*61ba55bcSBaptiste Daroussin static void
536*61ba55bcSBaptiste Daroussin print_form_items(int output, int nitems, struct bsddialog_formitem *items,
537*61ba55bcSBaptiste Daroussin     int focusitem, struct options *opt)
538*61ba55bcSBaptiste Daroussin {
539*61ba55bcSBaptiste Daroussin 	int i;
540*61ba55bcSBaptiste Daroussin 	const char *helpname;
541*61ba55bcSBaptiste Daroussin 
542*61ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output))
543*61ba55bcSBaptiste Daroussin 		return;
544*61ba55bcSBaptiste Daroussin 
545*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP) {
546*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "HELP");
547*61ba55bcSBaptiste Daroussin 		if (focusitem >= 0) {
548*61ba55bcSBaptiste Daroussin 			helpname = items[focusitem].label;
549*61ba55bcSBaptiste Daroussin 			if (opt->item_bottomdesc &&
550*61ba55bcSBaptiste Daroussin 			    opt->help_print_item_name == false)
551*61ba55bcSBaptiste Daroussin 				helpname = items[focusitem].bottomdesc;
552*61ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, " %s", helpname);
553*61ba55bcSBaptiste Daroussin 		}
554*61ba55bcSBaptiste Daroussin 		if(opt->help_print_items == false)
555*61ba55bcSBaptiste Daroussin 			return;
556*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "\n");
557*61ba55bcSBaptiste Daroussin 	}
558*61ba55bcSBaptiste Daroussin 
559*61ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
560*61ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%s\n", items[i].value);
561*61ba55bcSBaptiste Daroussin 		free(items[i].value);
562*61ba55bcSBaptiste Daroussin 	}
563*61ba55bcSBaptiste Daroussin }
564*61ba55bcSBaptiste Daroussin 
565*61ba55bcSBaptiste Daroussin int form_builder(BUILDER_ARGS)
566*61ba55bcSBaptiste Daroussin {
567*61ba55bcSBaptiste Daroussin 	int output, fieldlen, valuelen, focusitem;
568*61ba55bcSBaptiste Daroussin 	unsigned int i, j, flags, formheight, nitems, sizeitem;
569*61ba55bcSBaptiste Daroussin 	struct bsddialog_formitem *items;
570*61ba55bcSBaptiste Daroussin 
571*61ba55bcSBaptiste Daroussin 	if (argc < 1)
572*61ba55bcSBaptiste Daroussin 		exit_error(true, "--form missing <formheight>");
573*61ba55bcSBaptiste Daroussin 	formheight = (u_int)strtoul(argv[0], NULL, 10);
574*61ba55bcSBaptiste Daroussin 
575*61ba55bcSBaptiste Daroussin 	argc--;
576*61ba55bcSBaptiste Daroussin 	argv++;
577*61ba55bcSBaptiste Daroussin 	sizeitem = opt->item_bottomdesc ? 9 : 8;
578*61ba55bcSBaptiste Daroussin 	if (argc % sizeitem != 0)
579*61ba55bcSBaptiste Daroussin 		exit_error(true, "--form bad number of arguments items");
580*61ba55bcSBaptiste Daroussin 
581*61ba55bcSBaptiste Daroussin 	nitems = argc / sizeitem;
582*61ba55bcSBaptiste Daroussin 	if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL)
583*61ba55bcSBaptiste Daroussin 		exit_error(false, "cannot allocate memory for form items");
584*61ba55bcSBaptiste Daroussin 	j = 0;
585*61ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
586*61ba55bcSBaptiste Daroussin 		items[i].label	= argv[j++];
587*61ba55bcSBaptiste Daroussin 		items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10);
588*61ba55bcSBaptiste Daroussin 		items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10);
589*61ba55bcSBaptiste Daroussin 		items[i].init	= argv[j++];
590*61ba55bcSBaptiste Daroussin 		items[i].yfield	= (u_int)strtoul(argv[j++], NULL, 10);
591*61ba55bcSBaptiste Daroussin 		items[i].xfield	= (u_int)strtoul(argv[j++], NULL, 10);
592*61ba55bcSBaptiste Daroussin 
593*61ba55bcSBaptiste Daroussin 		fieldlen = (int)strtol(argv[j++], NULL, 10);
594*61ba55bcSBaptiste Daroussin 		items[i].fieldlen = abs(fieldlen);
595*61ba55bcSBaptiste Daroussin 
596*61ba55bcSBaptiste Daroussin 		valuelen = (int)strtol(argv[j++], NULL, 10);
597*61ba55bcSBaptiste Daroussin 		items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen;
598*61ba55bcSBaptiste Daroussin 
599*61ba55bcSBaptiste Daroussin 		flags = (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0);
600*61ba55bcSBaptiste Daroussin 		items[i].flags = flags;
601*61ba55bcSBaptiste Daroussin 
602*61ba55bcSBaptiste Daroussin 		items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : "";
603*61ba55bcSBaptiste Daroussin 	}
604*61ba55bcSBaptiste Daroussin 
605*61ba55bcSBaptiste Daroussin 	focusitem = -1;
606*61ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, formheight, nitems,
607*61ba55bcSBaptiste Daroussin 	    items, &focusitem);
608*61ba55bcSBaptiste Daroussin 	print_form_items(output, nitems, items, focusitem, opt);
609*61ba55bcSBaptiste Daroussin 	free(items);
610*61ba55bcSBaptiste Daroussin 
611*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
612*61ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
613*61ba55bcSBaptiste Daroussin 
614*61ba55bcSBaptiste Daroussin 	return (output);
615*61ba55bcSBaptiste Daroussin }
616*61ba55bcSBaptiste Daroussin 
617*61ba55bcSBaptiste Daroussin int inputbox_builder(BUILDER_ARGS)
618*61ba55bcSBaptiste Daroussin {
619*61ba55bcSBaptiste Daroussin 	int output;
620*61ba55bcSBaptiste Daroussin 	struct bsddialog_formitem item;
621*61ba55bcSBaptiste Daroussin 
622*61ba55bcSBaptiste Daroussin 	if (argc > 1)
623*61ba55bcSBaptiste Daroussin 		error_args("--inputbox", argc - 1, argv + 1);
624*61ba55bcSBaptiste Daroussin 
625*61ba55bcSBaptiste Daroussin 	item.label	 = "";
626*61ba55bcSBaptiste Daroussin 	item.ylabel	 = 0;
627*61ba55bcSBaptiste Daroussin 	item.xlabel	 = 0;
628*61ba55bcSBaptiste Daroussin 	item.init	 = argc > 0 ? argv[0] : "";
629*61ba55bcSBaptiste Daroussin 	item.yfield	 = 0;
630*61ba55bcSBaptiste Daroussin 	item.xfield	 = 0;
631*61ba55bcSBaptiste Daroussin 	item.fieldlen    = 1;
632*61ba55bcSBaptiste Daroussin 	item.maxvaluelen = opt->max_input_form;
633*61ba55bcSBaptiste Daroussin 	item.flags	 = BSDDIALOG_FIELDNOCOLOR;
634*61ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDCURSOREND;
635*61ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDEXTEND;
636*61ba55bcSBaptiste Daroussin 	item.bottomdesc  = "";
637*61ba55bcSBaptiste Daroussin 
638*61ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL);
639*61ba55bcSBaptiste Daroussin 	print_form_items(output, 1, &item, -1, opt);
640*61ba55bcSBaptiste Daroussin 
641*61ba55bcSBaptiste Daroussin 	return (output);
642*61ba55bcSBaptiste Daroussin }
643*61ba55bcSBaptiste Daroussin 
644*61ba55bcSBaptiste Daroussin int mixedform_builder(BUILDER_ARGS)
645*61ba55bcSBaptiste Daroussin {
646*61ba55bcSBaptiste Daroussin 	int output, focusitem;
647*61ba55bcSBaptiste Daroussin 	unsigned int i, j, formheight, nitems, sizeitem;
648*61ba55bcSBaptiste Daroussin 	struct bsddialog_formitem *items;
649*61ba55bcSBaptiste Daroussin 
650*61ba55bcSBaptiste Daroussin 	if (argc < 1)
651*61ba55bcSBaptiste Daroussin 		exit_error(true, "--mixedform missing <formheight>");
652*61ba55bcSBaptiste Daroussin 	formheight = (u_int)strtoul(argv[0], NULL, 10);
653*61ba55bcSBaptiste Daroussin 
654*61ba55bcSBaptiste Daroussin 	argc--;
655*61ba55bcSBaptiste Daroussin 	argv++;
656*61ba55bcSBaptiste Daroussin 	sizeitem = opt->item_bottomdesc ? 10 : 9;
657*61ba55bcSBaptiste Daroussin 	if (argc % sizeitem != 0)
658*61ba55bcSBaptiste Daroussin 		exit_error(true, "--mixedform bad number of arguments items");
659*61ba55bcSBaptiste Daroussin 
660*61ba55bcSBaptiste Daroussin 	nitems = argc / sizeitem;
661*61ba55bcSBaptiste Daroussin 	if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL)
662*61ba55bcSBaptiste Daroussin 		exit_error(false, "cannot allocate memory for form items");
663*61ba55bcSBaptiste Daroussin 	j = 0;
664*61ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
665*61ba55bcSBaptiste Daroussin 		items[i].label	     = argv[j++];
666*61ba55bcSBaptiste Daroussin 		items[i].ylabel      = (u_int)strtoul(argv[j++], NULL, 10);
667*61ba55bcSBaptiste Daroussin 		items[i].xlabel      = (u_int)strtoul(argv[j++], NULL, 10);
668*61ba55bcSBaptiste Daroussin 		items[i].init	     = argv[j++];
669*61ba55bcSBaptiste Daroussin 		items[i].yfield	     = (u_int)strtoul(argv[j++], NULL, 10);
670*61ba55bcSBaptiste Daroussin 		items[i].xfield	     = (u_int)strtoul(argv[j++], NULL, 10);
671*61ba55bcSBaptiste Daroussin 		items[i].fieldlen    = (u_int)strtoul(argv[j++], NULL, 10);
672*61ba55bcSBaptiste Daroussin 		items[i].maxvaluelen = (u_int)strtoul(argv[j++], NULL, 10);
673*61ba55bcSBaptiste Daroussin 		items[i].flags       = (u_int)strtoul(argv[j++], NULL, 10);
674*61ba55bcSBaptiste Daroussin 		items[i].bottomdesc  = opt->item_bottomdesc ? argv[j++] : "";
675*61ba55bcSBaptiste Daroussin 	}
676*61ba55bcSBaptiste Daroussin 
677*61ba55bcSBaptiste Daroussin 	focusitem = -1;
678*61ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, formheight, nitems,
679*61ba55bcSBaptiste Daroussin 	    items, &focusitem);
680*61ba55bcSBaptiste Daroussin 	print_form_items(output, nitems, items, focusitem, opt);
681*61ba55bcSBaptiste Daroussin 	free(items);
682*61ba55bcSBaptiste Daroussin 
683*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
684*61ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
685*61ba55bcSBaptiste Daroussin 
686*61ba55bcSBaptiste Daroussin 	return (output);
687*61ba55bcSBaptiste Daroussin }
688*61ba55bcSBaptiste Daroussin 
689*61ba55bcSBaptiste Daroussin int passwordbox_builder(BUILDER_ARGS)
690*61ba55bcSBaptiste Daroussin {
691*61ba55bcSBaptiste Daroussin 	int output;
692*61ba55bcSBaptiste Daroussin 	struct bsddialog_formitem item;
693*61ba55bcSBaptiste Daroussin 
694*61ba55bcSBaptiste Daroussin 	if (argc > 1)
695*61ba55bcSBaptiste Daroussin 		error_args("--passwordbox", argc - 1, argv + 1);
696*61ba55bcSBaptiste Daroussin 
697*61ba55bcSBaptiste Daroussin 	item.label	 = "";
698*61ba55bcSBaptiste Daroussin 	item.ylabel	 = 0;
699*61ba55bcSBaptiste Daroussin 	item.xlabel	 = 0;
700*61ba55bcSBaptiste Daroussin 	item.init	 = argc > 0 ? argv[0] : "";
701*61ba55bcSBaptiste Daroussin 	item.yfield	 = 0;
702*61ba55bcSBaptiste Daroussin 	item.xfield	 = 0;
703*61ba55bcSBaptiste Daroussin 	item.fieldlen	 = 1;
704*61ba55bcSBaptiste Daroussin 	item.maxvaluelen = opt->max_input_form;
705*61ba55bcSBaptiste Daroussin 	item.flags       = BSDDIALOG_FIELDHIDDEN;
706*61ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDNOCOLOR;
707*61ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDCURSOREND;
708*61ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDEXTEND;
709*61ba55bcSBaptiste Daroussin 	item.bottomdesc  = "";
710*61ba55bcSBaptiste Daroussin 
711*61ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL);
712*61ba55bcSBaptiste Daroussin 	print_form_items(output, 1, &item, -1, opt);
713*61ba55bcSBaptiste Daroussin 
714*61ba55bcSBaptiste Daroussin 	return (output);
715*61ba55bcSBaptiste Daroussin }
716*61ba55bcSBaptiste Daroussin 
717*61ba55bcSBaptiste Daroussin int passwordform_builder(BUILDER_ARGS)
718*61ba55bcSBaptiste Daroussin {
719*61ba55bcSBaptiste Daroussin 	int output, fieldlen, valuelen, focusitem;
720*61ba55bcSBaptiste Daroussin 	unsigned int i, j, flags, formheight, nitems, sizeitem;
721*61ba55bcSBaptiste Daroussin 	struct bsddialog_formitem *items;
722*61ba55bcSBaptiste Daroussin 
723*61ba55bcSBaptiste Daroussin 	if (argc < 1)
724*61ba55bcSBaptiste Daroussin 		exit_error(true, "--passwordform missing <formheight>");
725*61ba55bcSBaptiste Daroussin 	formheight = (u_int)strtoul(argv[0], NULL, 10);
726*61ba55bcSBaptiste Daroussin 
727*61ba55bcSBaptiste Daroussin 	argc--;
728*61ba55bcSBaptiste Daroussin 	argv++;
729*61ba55bcSBaptiste Daroussin 	sizeitem = opt->item_bottomdesc ? 9 : 8;
730*61ba55bcSBaptiste Daroussin 	if (argc % sizeitem != 0)
731*61ba55bcSBaptiste Daroussin 		exit_error(true, "--passwordform bad arguments items number");
732*61ba55bcSBaptiste Daroussin 
733*61ba55bcSBaptiste Daroussin 	flags = BSDDIALOG_FIELDHIDDEN;
734*61ba55bcSBaptiste Daroussin 	nitems = argc / sizeitem;
735*61ba55bcSBaptiste Daroussin 	if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL)
736*61ba55bcSBaptiste Daroussin 		exit_error(false, "cannot allocate memory for form items");
737*61ba55bcSBaptiste Daroussin 	j = 0;
738*61ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
739*61ba55bcSBaptiste Daroussin 		items[i].label	= argv[j++];
740*61ba55bcSBaptiste Daroussin 		items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10);
741*61ba55bcSBaptiste Daroussin 		items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10);
742*61ba55bcSBaptiste Daroussin 		items[i].init	= argv[j++];
743*61ba55bcSBaptiste Daroussin 		items[i].yfield	= (u_int)strtoul(argv[j++], NULL, 10);
744*61ba55bcSBaptiste Daroussin 		items[i].xfield	= (u_int)strtoul(argv[j++], NULL, 10);
745*61ba55bcSBaptiste Daroussin 
746*61ba55bcSBaptiste Daroussin 		fieldlen = (int)strtol(argv[j++], NULL, 10);
747*61ba55bcSBaptiste Daroussin 		items[i].fieldlen = abs(fieldlen);
748*61ba55bcSBaptiste Daroussin 
749*61ba55bcSBaptiste Daroussin 		valuelen = (int)strtol(argv[j++], NULL, 10);
750*61ba55bcSBaptiste Daroussin 		items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen;
751*61ba55bcSBaptiste Daroussin 
752*61ba55bcSBaptiste Daroussin 		flags |= (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0);
753*61ba55bcSBaptiste Daroussin 		items[i].flags = flags;
754*61ba55bcSBaptiste Daroussin 
755*61ba55bcSBaptiste Daroussin 		items[i].bottomdesc  = opt->item_bottomdesc ? argv[j++] : "";
756*61ba55bcSBaptiste Daroussin 	}
757*61ba55bcSBaptiste Daroussin 
758*61ba55bcSBaptiste Daroussin 	focusitem = -1;
759*61ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, formheight, nitems,
760*61ba55bcSBaptiste Daroussin 	    items, &focusitem);
761*61ba55bcSBaptiste Daroussin 	print_form_items(output, nitems, items, focusitem, opt);
762*61ba55bcSBaptiste Daroussin 	free(items);
763*61ba55bcSBaptiste Daroussin 
764*61ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
765*61ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
766*61ba55bcSBaptiste Daroussin 
767*61ba55bcSBaptiste Daroussin 	return (output);
768*61ba55bcSBaptiste Daroussin }
769