xref: /freebsd/contrib/bsddialog/utility/util_builders.c (revision 079f60541fdb363215beb98583e76f8c0729449d)
161ba55bcSBaptiste Daroussin /*-
261ba55bcSBaptiste Daroussin  * SPDX-License-Identifier: BSD-2-Clause
361ba55bcSBaptiste Daroussin  *
4a6d8be45SAlfonso S. Siciliano  * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
561ba55bcSBaptiste Daroussin  *
661ba55bcSBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
761ba55bcSBaptiste Daroussin  * modification, are permitted provided that the following conditions
861ba55bcSBaptiste Daroussin  * are met:
961ba55bcSBaptiste Daroussin  * 1. Redistributions of source code must retain the above copyright
1061ba55bcSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer.
1161ba55bcSBaptiste Daroussin  * 2. Redistributions in binary form must reproduce the above copyright
1261ba55bcSBaptiste Daroussin  *    notice, this list of conditions and the following disclaimer in the
1361ba55bcSBaptiste Daroussin  *    documentation and/or other materials provided with the distribution.
1461ba55bcSBaptiste Daroussin  *
1561ba55bcSBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1661ba55bcSBaptiste Daroussin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1761ba55bcSBaptiste Daroussin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1861ba55bcSBaptiste Daroussin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1961ba55bcSBaptiste Daroussin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2061ba55bcSBaptiste Daroussin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2161ba55bcSBaptiste Daroussin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2261ba55bcSBaptiste Daroussin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2361ba55bcSBaptiste Daroussin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2461ba55bcSBaptiste Daroussin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2561ba55bcSBaptiste Daroussin  * SUCH DAMAGE.
2661ba55bcSBaptiste Daroussin  */
2761ba55bcSBaptiste Daroussin 
2861ba55bcSBaptiste Daroussin #include <stdio.h>
2961ba55bcSBaptiste Daroussin #include <stdlib.h>
3061ba55bcSBaptiste Daroussin #include <string.h>
3161ba55bcSBaptiste Daroussin #include <time.h>
3261ba55bcSBaptiste Daroussin #include <unistd.h>
33a6d8be45SAlfonso S. Siciliano #include <wchar.h>
3461ba55bcSBaptiste Daroussin 
3561ba55bcSBaptiste Daroussin #include <bsddialog.h>
3661ba55bcSBaptiste Daroussin #include <bsddialog_theme.h>
3761ba55bcSBaptiste Daroussin 
3861ba55bcSBaptiste Daroussin #include "util.h"
3961ba55bcSBaptiste Daroussin 
4061ba55bcSBaptiste Daroussin #define NO_PRINT_VALUES(rv)                                                    \
4161ba55bcSBaptiste Daroussin (rv == BSDDIALOG_ERROR || rv == BSDDIALOG_CANCEL || rv == BSDDIALOG_ESC)
4261ba55bcSBaptiste Daroussin 
4361ba55bcSBaptiste Daroussin /* message */
4461ba55bcSBaptiste Daroussin int infobox_builder(BUILDER_ARGS)
4561ba55bcSBaptiste Daroussin {
4661ba55bcSBaptiste Daroussin 	if (argc > 0)
4761ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
4861ba55bcSBaptiste Daroussin 
4961ba55bcSBaptiste Daroussin 	return (bsddialog_infobox(conf, text, rows, cols));
5061ba55bcSBaptiste Daroussin }
5161ba55bcSBaptiste Daroussin 
5261ba55bcSBaptiste Daroussin int msgbox_builder(BUILDER_ARGS)
5361ba55bcSBaptiste Daroussin {
5461ba55bcSBaptiste Daroussin 	if (argc > 0)
5561ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
5661ba55bcSBaptiste Daroussin 
5761ba55bcSBaptiste Daroussin 	return (bsddialog_msgbox(conf, text, rows, cols));
5861ba55bcSBaptiste Daroussin }
5961ba55bcSBaptiste Daroussin 
6061ba55bcSBaptiste Daroussin int yesno_builder(BUILDER_ARGS)
6161ba55bcSBaptiste Daroussin {
6261ba55bcSBaptiste Daroussin 	if (argc > 0)
6361ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
6461ba55bcSBaptiste Daroussin 
6561ba55bcSBaptiste Daroussin 	return (bsddialog_yesno(conf, text, rows, cols));
6661ba55bcSBaptiste Daroussin }
6761ba55bcSBaptiste Daroussin 
6861ba55bcSBaptiste Daroussin /* textbox */
6961ba55bcSBaptiste Daroussin int textbox_builder(BUILDER_ARGS)
7061ba55bcSBaptiste Daroussin {
7161ba55bcSBaptiste Daroussin 	if (argc > 0)
7261ba55bcSBaptiste Daroussin 		error_args(opt->name, argc, argv);
7361ba55bcSBaptiste Daroussin 
7461ba55bcSBaptiste Daroussin 	return (bsddialog_textbox(conf, text, rows, cols));
7561ba55bcSBaptiste Daroussin }
7661ba55bcSBaptiste Daroussin 
7761ba55bcSBaptiste Daroussin /* bar */
7861ba55bcSBaptiste Daroussin int gauge_builder(BUILDER_ARGS)
7961ba55bcSBaptiste Daroussin {
8061ba55bcSBaptiste Daroussin 	int output;
8161ba55bcSBaptiste Daroussin 	unsigned int perc;
8261ba55bcSBaptiste Daroussin 
8361ba55bcSBaptiste Daroussin 	perc = 0;
8461ba55bcSBaptiste Daroussin 	if (argc == 1) {
8561ba55bcSBaptiste Daroussin 		perc = (u_int)strtoul(argv[0], NULL, 10);
8661ba55bcSBaptiste Daroussin 		perc = perc > 100 ? 100 : perc;
8761ba55bcSBaptiste Daroussin 	} else if (argc > 1) {
8861ba55bcSBaptiste Daroussin 		error_args(opt->name, argc - 1, argv + 1);
8961ba55bcSBaptiste Daroussin 	}
9061ba55bcSBaptiste Daroussin 
9161ba55bcSBaptiste Daroussin 	output = bsddialog_gauge(conf, text, rows, cols, perc, STDIN_FILENO,
9261ba55bcSBaptiste Daroussin 	    "XXX", "EOF");
9361ba55bcSBaptiste Daroussin 
9461ba55bcSBaptiste Daroussin 	return (output);
9561ba55bcSBaptiste Daroussin }
9661ba55bcSBaptiste Daroussin 
9761ba55bcSBaptiste Daroussin int mixedgauge_builder(BUILDER_ARGS)
9861ba55bcSBaptiste Daroussin {
9961ba55bcSBaptiste Daroussin 	int output, *minipercs;
10061ba55bcSBaptiste Daroussin 	unsigned int i, mainperc, nminibars;
10161ba55bcSBaptiste Daroussin 	const char **minilabels;
10261ba55bcSBaptiste Daroussin 
10361ba55bcSBaptiste Daroussin 	if (argc < 1)
10461ba55bcSBaptiste Daroussin 		exit_error(true, "%s missing <mainperc>", opt->name);
10561ba55bcSBaptiste Daroussin 	if (((argc-1) % 2) != 0)
10661ba55bcSBaptiste Daroussin 		exit_error(true,
10761ba55bcSBaptiste Daroussin 		    "bad %s pair number [<minilabel> <miniperc>]", opt->name);
10861ba55bcSBaptiste Daroussin 
10961ba55bcSBaptiste Daroussin 	mainperc = (u_int)strtoul(argv[0], NULL, 10);
11061ba55bcSBaptiste Daroussin 	mainperc = mainperc > 100 ? 100 : mainperc;
11161ba55bcSBaptiste Daroussin 	argc--;
11261ba55bcSBaptiste Daroussin 	argv++;
11361ba55bcSBaptiste Daroussin 
11461ba55bcSBaptiste Daroussin 	nminibars  = argc / 2;
11561ba55bcSBaptiste Daroussin 	if ((minilabels = calloc(nminibars, sizeof(char*))) == NULL)
11661ba55bcSBaptiste Daroussin 		exit_error(false, "Cannot allocate memory for minilabels");
11761ba55bcSBaptiste Daroussin 	if ((minipercs = calloc(nminibars, sizeof(int))) == NULL)
11861ba55bcSBaptiste Daroussin 		exit_error(false, "Cannot allocate memory for minipercs");
11961ba55bcSBaptiste Daroussin 
12061ba55bcSBaptiste Daroussin 	for (i = 0; i < nminibars; i++) {
12161ba55bcSBaptiste Daroussin 		minilabels[i] = argv[i * 2];
12261ba55bcSBaptiste Daroussin 		minipercs[i] = (int)strtol(argv[i * 2 + 1], NULL, 10);
12361ba55bcSBaptiste Daroussin 	}
12461ba55bcSBaptiste Daroussin 
12561ba55bcSBaptiste Daroussin 	output = bsddialog_mixedgauge(conf, text, rows, cols, mainperc,
12661ba55bcSBaptiste Daroussin 	    nminibars, minilabels, minipercs);
12761ba55bcSBaptiste Daroussin 
12861ba55bcSBaptiste Daroussin 	return (output);
12961ba55bcSBaptiste Daroussin }
13061ba55bcSBaptiste Daroussin 
13161ba55bcSBaptiste Daroussin int pause_builder(BUILDER_ARGS)
13261ba55bcSBaptiste Daroussin {
13361ba55bcSBaptiste Daroussin 	int output;
13461ba55bcSBaptiste Daroussin 	unsigned int secs;
13561ba55bcSBaptiste Daroussin 
13661ba55bcSBaptiste Daroussin 	if (argc == 0)
13761ba55bcSBaptiste Daroussin 		exit_error(true, "--pause missing <seconds>");
13861ba55bcSBaptiste Daroussin 	if (argc > 1)
13961ba55bcSBaptiste Daroussin 		error_args(opt->name, argc - 1, argv + 1);
14061ba55bcSBaptiste Daroussin 
14161ba55bcSBaptiste Daroussin 	secs = (u_int)strtoul(argv[0], NULL, 10);
14261ba55bcSBaptiste Daroussin 	output = bsddialog_pause(conf, text, rows, cols, &secs);
14361ba55bcSBaptiste Daroussin 
14461ba55bcSBaptiste Daroussin 	return (output);
14561ba55bcSBaptiste Daroussin }
14661ba55bcSBaptiste Daroussin 
14761ba55bcSBaptiste Daroussin int rangebox_builder(BUILDER_ARGS)
14861ba55bcSBaptiste Daroussin {
14961ba55bcSBaptiste Daroussin 	int output, min, max, value;
15061ba55bcSBaptiste Daroussin 
15161ba55bcSBaptiste Daroussin 	if (argc < 2)
15261ba55bcSBaptiste Daroussin 		exit_error(true, "--rangebox missing <min> <max> [<init>]");
15361ba55bcSBaptiste Daroussin 	if (argc > 3)
15461ba55bcSBaptiste Daroussin 		error_args("--rangebox", argc - 3, argv + 3);
15561ba55bcSBaptiste Daroussin 
15661ba55bcSBaptiste Daroussin 	min = (int)strtol(argv[0], NULL, 10);
15761ba55bcSBaptiste Daroussin 	max = (int)strtol(argv[1], NULL, 10);
15861ba55bcSBaptiste Daroussin 
15961ba55bcSBaptiste Daroussin 	if (argc == 3) {
16061ba55bcSBaptiste Daroussin 		value = (int)strtol(argv[2], NULL, 10);
16161ba55bcSBaptiste Daroussin 		value = value < min ? min : value;
16261ba55bcSBaptiste Daroussin 		value = value > max ? max : value;
16361ba55bcSBaptiste Daroussin 	} else
16461ba55bcSBaptiste Daroussin 		value = min;
16561ba55bcSBaptiste Daroussin 
16661ba55bcSBaptiste Daroussin 	output = bsddialog_rangebox(conf, text, rows, cols, min, max, &value);
16761ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output) == false)
16861ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%d", value);
16961ba55bcSBaptiste Daroussin 
17061ba55bcSBaptiste Daroussin 	return (output);
17161ba55bcSBaptiste Daroussin }
17261ba55bcSBaptiste Daroussin 
17361ba55bcSBaptiste Daroussin /* date and time */
17461ba55bcSBaptiste Daroussin static int date(BUILDER_ARGS)
17561ba55bcSBaptiste Daroussin {
17661ba55bcSBaptiste Daroussin 	int rv;
17761ba55bcSBaptiste Daroussin 	unsigned int yy, mm, dd;
17861ba55bcSBaptiste Daroussin 	time_t cal;
17961ba55bcSBaptiste Daroussin 	struct tm *localtm;
18061ba55bcSBaptiste Daroussin 	char stringdate[1024];
18161ba55bcSBaptiste Daroussin 
18261ba55bcSBaptiste Daroussin 	time(&cal);
18361ba55bcSBaptiste Daroussin 	localtm = localtime(&cal);
18461ba55bcSBaptiste Daroussin 	yy = localtm->tm_year + 1900;
18561ba55bcSBaptiste Daroussin 	mm = localtm->tm_mon + 1;
18661ba55bcSBaptiste Daroussin 	dd = localtm->tm_mday;
18761ba55bcSBaptiste Daroussin 
18861ba55bcSBaptiste Daroussin 	if (argc > 3) {
18961ba55bcSBaptiste Daroussin 		error_args(opt->name, argc - 3, argv + 3);
19061ba55bcSBaptiste Daroussin 	} else if (argc == 3) {
19161ba55bcSBaptiste Daroussin 		/* lib checks/sets max and min */
19261ba55bcSBaptiste Daroussin 		dd = (u_int)strtoul(argv[0], NULL, 10);
19361ba55bcSBaptiste Daroussin 		mm = (u_int)strtoul(argv[1], NULL, 10);
19461ba55bcSBaptiste Daroussin 		yy = (u_int)strtoul(argv[2], NULL, 10);
19561ba55bcSBaptiste Daroussin 	}
19661ba55bcSBaptiste Daroussin 
19761ba55bcSBaptiste Daroussin 	if (strcmp(opt->name, "--datebox") == 0)
19861ba55bcSBaptiste Daroussin 		rv = bsddialog_datebox(conf, text, rows, cols, &yy, &mm, &dd);
19961ba55bcSBaptiste Daroussin 	else
20061ba55bcSBaptiste Daroussin 		rv = bsddialog_calendar(conf, text, rows, cols, &yy, &mm, &dd);
20161ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(rv))
20261ba55bcSBaptiste Daroussin 		return (rv);
20361ba55bcSBaptiste Daroussin 
20461ba55bcSBaptiste Daroussin 	if (opt->date_fmt != NULL) {
20561ba55bcSBaptiste Daroussin 		time(&cal);
20661ba55bcSBaptiste Daroussin 		localtm = localtime(&cal);
20761ba55bcSBaptiste Daroussin 		localtm->tm_year = yy - 1900;
20861ba55bcSBaptiste Daroussin 		localtm->tm_mon = mm - 1;
20961ba55bcSBaptiste Daroussin 		localtm->tm_mday = dd;
21061ba55bcSBaptiste Daroussin 		strftime(stringdate, 1024, opt->date_fmt, localtm);
21161ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%s", stringdate);
21261ba55bcSBaptiste Daroussin 	} else if (opt->bikeshed && ~dd & 1) {
21361ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%u/%u/%u", dd, mm, yy);
21461ba55bcSBaptiste Daroussin 	} else {
21561ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%02u/%02u/%u", dd, mm, yy);
21661ba55bcSBaptiste Daroussin 	}
21761ba55bcSBaptiste Daroussin 
21861ba55bcSBaptiste Daroussin 	return (rv);
21961ba55bcSBaptiste Daroussin }
22061ba55bcSBaptiste Daroussin 
22161ba55bcSBaptiste Daroussin int calendar_builder(BUILDER_ARGS)
22261ba55bcSBaptiste Daroussin {
22361ba55bcSBaptiste Daroussin 	/* Use height autosizing with rows = 2. Documented in bsddialog(1).
22461ba55bcSBaptiste Daroussin 	 *
22561ba55bcSBaptiste Daroussin 	 * f_dialog_calendar_size() in bsdconfig/share/dialog.subr:1352
22661ba55bcSBaptiste Daroussin 	 * computes height 2 for `dialog --calendar', called by:
22761ba55bcSBaptiste Daroussin 	 * 1) f_dialog_input_expire_password() in
22861ba55bcSBaptiste Daroussin 	 * bsdconfig/usermgmt/share/user_input.subr:517 and
22961ba55bcSBaptiste Daroussin 	 * 2) f_dialog_input_expire_account() in
23061ba55bcSBaptiste Daroussin 	 * bsdconfig/usermgmt/share/user_input.subr:660.
23161ba55bcSBaptiste Daroussin 	 *
23261ba55bcSBaptiste Daroussin 	 * Then use height autosizing with 2 that is min height like dialog.
23361ba55bcSBaptiste Daroussin 	 */
23461ba55bcSBaptiste Daroussin 	if (rows == 2)
23561ba55bcSBaptiste Daroussin 		rows = 0;
23661ba55bcSBaptiste Daroussin 
23761ba55bcSBaptiste Daroussin 	return (date(conf, text, rows, cols, argc, argv, opt));
23861ba55bcSBaptiste Daroussin }
23961ba55bcSBaptiste Daroussin 
24061ba55bcSBaptiste Daroussin int datebox_builder(BUILDER_ARGS)
24161ba55bcSBaptiste Daroussin {
24261ba55bcSBaptiste Daroussin 	return (date(conf, text, rows, cols, argc, argv, opt));
24361ba55bcSBaptiste Daroussin }
24461ba55bcSBaptiste Daroussin 
24561ba55bcSBaptiste Daroussin int timebox_builder(BUILDER_ARGS)
24661ba55bcSBaptiste Daroussin {
24761ba55bcSBaptiste Daroussin 	int output;
24861ba55bcSBaptiste Daroussin 	unsigned int hh, mm, ss;
24961ba55bcSBaptiste Daroussin 	time_t clock;
25061ba55bcSBaptiste Daroussin 	struct tm *localtm;
25161ba55bcSBaptiste Daroussin 	char stringtime[1024];
25261ba55bcSBaptiste Daroussin 
25361ba55bcSBaptiste Daroussin 	time(&clock);
25461ba55bcSBaptiste Daroussin 	localtm = localtime(&clock);
25561ba55bcSBaptiste Daroussin 	hh = localtm->tm_hour;
25661ba55bcSBaptiste Daroussin 	mm = localtm->tm_min;
25761ba55bcSBaptiste Daroussin 	ss = localtm->tm_sec;
25861ba55bcSBaptiste Daroussin 
25961ba55bcSBaptiste Daroussin 	if (argc > 3) {
26061ba55bcSBaptiste Daroussin 		error_args("--timebox", argc - 3, argv + 3);
26161ba55bcSBaptiste Daroussin 	} else if (argc == 3) {
26261ba55bcSBaptiste Daroussin 		hh = (u_int)strtoul(argv[0], NULL, 10);
26361ba55bcSBaptiste Daroussin 		mm = (u_int)strtoul(argv[1], NULL, 10);
26461ba55bcSBaptiste Daroussin 		ss = (u_int)strtoul(argv[2], NULL, 10);
26561ba55bcSBaptiste Daroussin 	}
26661ba55bcSBaptiste Daroussin 
26761ba55bcSBaptiste Daroussin 	output = bsddialog_timebox(conf, text, rows, cols, &hh, &mm, &ss);
26861ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output))
26961ba55bcSBaptiste Daroussin 		return (output);
27061ba55bcSBaptiste Daroussin 
27161ba55bcSBaptiste Daroussin 	if (opt->time_fmt != NULL) {
27261ba55bcSBaptiste Daroussin 		time(&clock);
27361ba55bcSBaptiste Daroussin 		localtm = localtime(&clock);
27461ba55bcSBaptiste Daroussin 		localtm->tm_hour = hh;
27561ba55bcSBaptiste Daroussin 		localtm->tm_min = mm;
27661ba55bcSBaptiste Daroussin 		localtm->tm_sec = ss;
27761ba55bcSBaptiste Daroussin 		strftime(stringtime, 1024, opt->time_fmt, localtm);
27861ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%s", stringtime);
27961ba55bcSBaptiste Daroussin 	} else if (opt->bikeshed && ~ss & 1) {
28061ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%u:%u:%u", hh, mm, ss);
28161ba55bcSBaptiste Daroussin 	} else {
28261ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "%02u:%02u:%02u", hh, mm, ss);
28361ba55bcSBaptiste Daroussin 	}
28461ba55bcSBaptiste Daroussin 
28561ba55bcSBaptiste Daroussin 	return (output);
28661ba55bcSBaptiste Daroussin }
28761ba55bcSBaptiste Daroussin 
28861ba55bcSBaptiste Daroussin /* menu */
28961ba55bcSBaptiste Daroussin static void
29061ba55bcSBaptiste Daroussin get_menu_items(int argc, char **argv, bool setprefix, bool setdepth,
29161ba55bcSBaptiste Daroussin     bool setname, bool setdesc, bool setstatus, bool sethelp,
29261ba55bcSBaptiste Daroussin     unsigned int *nitems, struct bsddialog_menuitem **items, int *focusitem,
29361ba55bcSBaptiste Daroussin     struct options *opt)
29461ba55bcSBaptiste Daroussin {
29561ba55bcSBaptiste Daroussin 	unsigned int i, j, sizeitem;
29661ba55bcSBaptiste Daroussin 
29761ba55bcSBaptiste Daroussin 	*focusitem = -1;
29861ba55bcSBaptiste Daroussin 
29961ba55bcSBaptiste Daroussin 	sizeitem = 0;
30061ba55bcSBaptiste Daroussin 	sizeitem += setprefix ? 1 : 0;
30161ba55bcSBaptiste Daroussin 	sizeitem += setdepth  ? 1 : 0;
30261ba55bcSBaptiste Daroussin 	sizeitem += setname   ? 1 : 0;
30361ba55bcSBaptiste Daroussin 	sizeitem += setdesc   ? 1 : 0;
30461ba55bcSBaptiste Daroussin 	sizeitem += setstatus ? 1 : 0;
30561ba55bcSBaptiste Daroussin 	sizeitem += sethelp   ? 1 : 0;
30661ba55bcSBaptiste Daroussin 	if ((argc % sizeitem) != 0)
30761ba55bcSBaptiste Daroussin 		exit_error(true, "%s bad arguments items number", opt->name);
30861ba55bcSBaptiste Daroussin 
30961ba55bcSBaptiste Daroussin 	*nitems = argc / sizeitem;
31061ba55bcSBaptiste Daroussin 	*items = calloc(*nitems, sizeof(struct bsddialog_menuitem));
31161ba55bcSBaptiste Daroussin 	if (items == NULL)
31261ba55bcSBaptiste Daroussin 		exit_error(false, "%s cannot allocate items", opt->name);
31361ba55bcSBaptiste Daroussin 
31461ba55bcSBaptiste Daroussin 	j = 0;
31561ba55bcSBaptiste Daroussin 	for (i = 0; i < *nitems; i++) {
31661ba55bcSBaptiste Daroussin 		(*items)[i].prefix = setprefix ? argv[j++] : "";
31761ba55bcSBaptiste Daroussin 		(*items)[i].depth = setdepth ?
31861ba55bcSBaptiste Daroussin 		    (u_int)strtoul(argv[j++], NULL, 0) : 0;
31961ba55bcSBaptiste Daroussin 		(*items)[i].name = setname ? argv[j++] : "";
32061ba55bcSBaptiste Daroussin 		(*items)[i].desc = setdesc ? argv[j++] : "";
32161ba55bcSBaptiste Daroussin 		if (setstatus) {
32261ba55bcSBaptiste Daroussin 			if (strcasecmp(argv[j], "on") == 0)
32361ba55bcSBaptiste Daroussin 				(*items)[i].on = true;
32461ba55bcSBaptiste Daroussin 			else if (strcasecmp(argv[j], "off") == 0)
32561ba55bcSBaptiste Daroussin 				(*items)[i].on = false;
32661ba55bcSBaptiste Daroussin 			else
32761ba55bcSBaptiste Daroussin 				exit_error(true,
32861ba55bcSBaptiste Daroussin 				    "\"%s\" (item %i) invalid status \"%s\"",
32961ba55bcSBaptiste Daroussin 				    (*items)[i].name, i+1, argv[j]);
33061ba55bcSBaptiste Daroussin 			j++;
33161ba55bcSBaptiste Daroussin 		} else
33261ba55bcSBaptiste Daroussin 			(*items)[i].on = false;
33361ba55bcSBaptiste Daroussin 		(*items)[i].bottomdesc = sethelp ? argv[j++] : "";
33461ba55bcSBaptiste Daroussin 
33561ba55bcSBaptiste Daroussin 		if (opt->item_default != NULL && *focusitem == -1)
33661ba55bcSBaptiste Daroussin 			if (strcmp((*items)[i].name, opt->item_default) == 0)
33761ba55bcSBaptiste Daroussin 				*focusitem = i;
33861ba55bcSBaptiste Daroussin 	}
33961ba55bcSBaptiste Daroussin }
34061ba55bcSBaptiste Daroussin 
34161ba55bcSBaptiste Daroussin static void
34261ba55bcSBaptiste Daroussin print_menu_items(int output, int nitems, struct bsddialog_menuitem *items,
34361ba55bcSBaptiste Daroussin     int focusitem, struct options *opt)
34461ba55bcSBaptiste Daroussin {
34561ba55bcSBaptiste Daroussin 	bool sep, sepbefore, sepafter, sepsecond, toquote, ismenu, ischecklist;
34661ba55bcSBaptiste Daroussin 	int i;
34761ba55bcSBaptiste Daroussin 	char quotech;
34861ba55bcSBaptiste Daroussin 	const char *focusname, *sepstr;
34961ba55bcSBaptiste Daroussin 
35061ba55bcSBaptiste Daroussin 	ismenu = (strcmp(opt->name, "--menu") == 0) ? true : false;
35161ba55bcSBaptiste Daroussin 	ischecklist = (strcmp(opt->name, "--checklist") == 0) ? true : false;
35261ba55bcSBaptiste Daroussin 	sep = false;
35361ba55bcSBaptiste Daroussin 	quotech = opt->item_singlequote ? '\'' : '"';
35461ba55bcSBaptiste Daroussin 
35561ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output))
35661ba55bcSBaptiste Daroussin 		return;
35761ba55bcSBaptiste Daroussin 
35861ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP) {
35961ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "HELP ");
36061ba55bcSBaptiste Daroussin 
36161ba55bcSBaptiste Daroussin 		if (focusitem >= 0) {
36261ba55bcSBaptiste Daroussin 			focusname = items[focusitem].name;
36361ba55bcSBaptiste Daroussin 			if (opt->item_bottomdesc &&
36461ba55bcSBaptiste Daroussin 			    opt->help_print_item_name == false)
36561ba55bcSBaptiste Daroussin 				focusname = items[focusitem].bottomdesc;
36661ba55bcSBaptiste Daroussin 
36761ba55bcSBaptiste Daroussin 			toquote = false;
36861ba55bcSBaptiste Daroussin 			if (strchr(focusname, ' ') != NULL) {
36961ba55bcSBaptiste Daroussin 				toquote = opt->item_always_quote;
37061ba55bcSBaptiste Daroussin 				if (ismenu == false &&
37161ba55bcSBaptiste Daroussin 				    opt->item_output_sepnl == false)
37261ba55bcSBaptiste Daroussin 					toquote = true;
37361ba55bcSBaptiste Daroussin 			}
37461ba55bcSBaptiste Daroussin 			if (toquote) {
37561ba55bcSBaptiste Daroussin 				dprintf(opt->output_fd, "%c%s%c",
37661ba55bcSBaptiste Daroussin 				    quotech, focusname, quotech);
37761ba55bcSBaptiste Daroussin 			} else
37861ba55bcSBaptiste Daroussin 				dprintf(opt->output_fd, "%s", focusname);
37961ba55bcSBaptiste Daroussin 		}
38061ba55bcSBaptiste Daroussin 
38161ba55bcSBaptiste Daroussin 		if (ismenu || opt->help_print_items == false)
38261ba55bcSBaptiste Daroussin 			return;
38361ba55bcSBaptiste Daroussin 		sep = true;
38461ba55bcSBaptiste Daroussin 	}
38561ba55bcSBaptiste Daroussin 
38661ba55bcSBaptiste Daroussin 	sepbefore = false;
38761ba55bcSBaptiste Daroussin 	sepsecond = false;
38861ba55bcSBaptiste Daroussin 	if ((sepstr = opt->item_output_sep) == NULL) {
38961ba55bcSBaptiste Daroussin 		if (opt->item_output_sepnl)
39061ba55bcSBaptiste Daroussin 			sepstr = "\n";
39161ba55bcSBaptiste Daroussin 		else {
39261ba55bcSBaptiste Daroussin 			sepstr = " ";
39361ba55bcSBaptiste Daroussin 			sepsecond = true;
39461ba55bcSBaptiste Daroussin 		}
39561ba55bcSBaptiste Daroussin 	} else
39661ba55bcSBaptiste Daroussin 		sepbefore = true;
39761ba55bcSBaptiste Daroussin 
39861ba55bcSBaptiste Daroussin 	sepafter = false;
39961ba55bcSBaptiste Daroussin 	if (opt->item_output_sepnl) {
40061ba55bcSBaptiste Daroussin 		sepbefore = false;
40161ba55bcSBaptiste Daroussin 		sepafter = true;
40261ba55bcSBaptiste Daroussin 	}
40361ba55bcSBaptiste Daroussin 
40461ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
40561ba55bcSBaptiste Daroussin 		if (items[i].on == false)
40661ba55bcSBaptiste Daroussin 			continue;
40761ba55bcSBaptiste Daroussin 
40861ba55bcSBaptiste Daroussin 		if (sep || sepbefore)
40961ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%s", sepstr);
41061ba55bcSBaptiste Daroussin 		sep = false;
41161ba55bcSBaptiste Daroussin 		if (sepsecond)
41261ba55bcSBaptiste Daroussin 			sep = true;
41361ba55bcSBaptiste Daroussin 
41461ba55bcSBaptiste Daroussin 		toquote = false;
41561ba55bcSBaptiste Daroussin 		if (strchr(items[i].name, ' ') != NULL) {
41661ba55bcSBaptiste Daroussin 			toquote = opt->item_always_quote;
41761ba55bcSBaptiste Daroussin 			if (ischecklist && opt->item_output_sepnl == false)
41861ba55bcSBaptiste Daroussin 				toquote = true;
41961ba55bcSBaptiste Daroussin 		}
42061ba55bcSBaptiste Daroussin 		if (toquote)
42161ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%c%s%c",
42261ba55bcSBaptiste Daroussin 			    quotech, items[i].name, quotech);
42361ba55bcSBaptiste Daroussin 		else
42461ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%s", items[i].name);
42561ba55bcSBaptiste Daroussin 
42661ba55bcSBaptiste Daroussin 		if (sepafter)
42761ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%s", sepstr);
42861ba55bcSBaptiste Daroussin 	}
42961ba55bcSBaptiste Daroussin }
43061ba55bcSBaptiste Daroussin 
43161ba55bcSBaptiste Daroussin int checklist_builder(BUILDER_ARGS)
43261ba55bcSBaptiste Daroussin {
43361ba55bcSBaptiste Daroussin 	int output, focusitem;
43461ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
43561ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
43661ba55bcSBaptiste Daroussin 
43761ba55bcSBaptiste Daroussin 	if (argc < 1)
43861ba55bcSBaptiste Daroussin 		exit_error(true, "--checklist missing <menurows>");
43961ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
44061ba55bcSBaptiste Daroussin 
44161ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true,
44261ba55bcSBaptiste Daroussin 	    true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt);
44361ba55bcSBaptiste Daroussin 
44461ba55bcSBaptiste Daroussin 	output = bsddialog_checklist(conf, text, rows, cols, menurows, nitems,
44561ba55bcSBaptiste Daroussin 	    items, &focusitem);
44661ba55bcSBaptiste Daroussin 
44761ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
44861ba55bcSBaptiste Daroussin 	free(items);
44961ba55bcSBaptiste Daroussin 
45061ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
45161ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
45261ba55bcSBaptiste Daroussin 
45361ba55bcSBaptiste Daroussin 	return (output);
45461ba55bcSBaptiste Daroussin }
45561ba55bcSBaptiste Daroussin 
45661ba55bcSBaptiste Daroussin int menu_builder(BUILDER_ARGS)
45761ba55bcSBaptiste Daroussin {
45861ba55bcSBaptiste Daroussin 	int output, focusitem;
45961ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
46061ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
46161ba55bcSBaptiste Daroussin 
46261ba55bcSBaptiste Daroussin 	if (argc < 1)
46361ba55bcSBaptiste Daroussin 		exit_error(true, "--menu missing <menurows>");
46461ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
46561ba55bcSBaptiste Daroussin 
46661ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true,
46761ba55bcSBaptiste Daroussin 	    true, false, opt->item_bottomdesc, &nitems, &items, &focusitem,
46861ba55bcSBaptiste Daroussin 	    opt);
46961ba55bcSBaptiste Daroussin 
47061ba55bcSBaptiste Daroussin 	output = bsddialog_menu(conf, text, rows, cols, menurows, nitems,
47161ba55bcSBaptiste Daroussin 	    items, &focusitem);
47261ba55bcSBaptiste Daroussin 
47361ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
47461ba55bcSBaptiste Daroussin 	free(items);
47561ba55bcSBaptiste Daroussin 
47661ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
47761ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
47861ba55bcSBaptiste Daroussin 
47961ba55bcSBaptiste Daroussin 	return (output);
48061ba55bcSBaptiste Daroussin }
48161ba55bcSBaptiste Daroussin 
48261ba55bcSBaptiste Daroussin int radiolist_builder(BUILDER_ARGS)
48361ba55bcSBaptiste Daroussin {
48461ba55bcSBaptiste Daroussin 	int output, focusitem;
48561ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
48661ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
48761ba55bcSBaptiste Daroussin 
48861ba55bcSBaptiste Daroussin 	if (argc < 1)
48961ba55bcSBaptiste Daroussin 		exit_error(true, "--radiolist missing <menurows>");
49061ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
49161ba55bcSBaptiste Daroussin 
49261ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, opt->item_depth, true,
49361ba55bcSBaptiste Daroussin 	    true, true, opt->item_bottomdesc, &nitems, &items, &focusitem, opt);
49461ba55bcSBaptiste Daroussin 
49561ba55bcSBaptiste Daroussin 	output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems,
49661ba55bcSBaptiste Daroussin 	    items, &focusitem);
49761ba55bcSBaptiste Daroussin 
49861ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
49961ba55bcSBaptiste Daroussin 	free(items);
50061ba55bcSBaptiste Daroussin 
50161ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
50261ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
50361ba55bcSBaptiste Daroussin 
50461ba55bcSBaptiste Daroussin 	return (output);
50561ba55bcSBaptiste Daroussin }
50661ba55bcSBaptiste Daroussin 
50761ba55bcSBaptiste Daroussin int treeview_builder(BUILDER_ARGS)
50861ba55bcSBaptiste Daroussin {
50961ba55bcSBaptiste Daroussin 	int output, focusitem;
51061ba55bcSBaptiste Daroussin 	unsigned int menurows, nitems;
51161ba55bcSBaptiste Daroussin 	struct bsddialog_menuitem *items;
51261ba55bcSBaptiste Daroussin 
51361ba55bcSBaptiste Daroussin 	if (argc < 1)
51461ba55bcSBaptiste Daroussin 		exit_error(true, "--treeview missing <menurows>");
51561ba55bcSBaptiste Daroussin 	menurows = (u_int)strtoul(argv[0], NULL, 10);
51661ba55bcSBaptiste Daroussin 
51761ba55bcSBaptiste Daroussin 	get_menu_items(argc-1, argv+1, opt->item_prefix, true, true, true, true,
51861ba55bcSBaptiste Daroussin 	    opt->item_bottomdesc, &nitems, &items, &focusitem, opt);
51961ba55bcSBaptiste Daroussin 
52061ba55bcSBaptiste Daroussin 	conf->menu.no_name = true;
52161ba55bcSBaptiste Daroussin 	conf->menu.align_left = true;
52261ba55bcSBaptiste Daroussin 
52361ba55bcSBaptiste Daroussin 	output = bsddialog_radiolist(conf, text, rows, cols, menurows, nitems,
52461ba55bcSBaptiste Daroussin 	    items, &focusitem);
52561ba55bcSBaptiste Daroussin 
52661ba55bcSBaptiste Daroussin 	print_menu_items(output, nitems, items, focusitem, opt);
52761ba55bcSBaptiste Daroussin 	free(items);
52861ba55bcSBaptiste Daroussin 
52961ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
53061ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
53161ba55bcSBaptiste Daroussin 
53261ba55bcSBaptiste Daroussin 	return (output);
53361ba55bcSBaptiste Daroussin }
53461ba55bcSBaptiste Daroussin 
53561ba55bcSBaptiste Daroussin /* form */
536a6d8be45SAlfonso S. Siciliano static unsigned int strcols(const char *string)
537a6d8be45SAlfonso S. Siciliano {
538a6d8be45SAlfonso S. Siciliano 	int w;
539a6d8be45SAlfonso S. Siciliano 	unsigned int ncol;
540a6d8be45SAlfonso S. Siciliano 	size_t charlen, mb_cur_max;
541a6d8be45SAlfonso S. Siciliano 	wchar_t wch;
542a6d8be45SAlfonso S. Siciliano 	mbstate_t mbs;
543a6d8be45SAlfonso S. Siciliano 
544a6d8be45SAlfonso S. Siciliano 	mb_cur_max = MB_CUR_MAX;
545a6d8be45SAlfonso S. Siciliano 	ncol = 0;
546a6d8be45SAlfonso S. Siciliano 	memset(&mbs, 0, sizeof(mbs));
547a6d8be45SAlfonso S. Siciliano 	while ((charlen = mbrlen(string, mb_cur_max, &mbs)) != 0 &&
548a6d8be45SAlfonso S. Siciliano 	    charlen != (size_t)-1 && charlen != (size_t)-2) {
549a6d8be45SAlfonso S. Siciliano 		if (mbtowc(&wch, string, mb_cur_max) < 0)
550a6d8be45SAlfonso S. Siciliano 			return (0);
551a6d8be45SAlfonso S. Siciliano 		if ((w = wcwidth(wch)) > 0)
552a6d8be45SAlfonso S. Siciliano 			ncol += w;
553a6d8be45SAlfonso S. Siciliano 		string += charlen;
554a6d8be45SAlfonso S. Siciliano 	}
555a6d8be45SAlfonso S. Siciliano 
556a6d8be45SAlfonso S. Siciliano 	return (ncol);
557a6d8be45SAlfonso S. Siciliano }
558a6d8be45SAlfonso S. Siciliano 
55961ba55bcSBaptiste Daroussin static void
56061ba55bcSBaptiste Daroussin print_form_items(int output, int nitems, struct bsddialog_formitem *items,
56161ba55bcSBaptiste Daroussin     int focusitem, struct options *opt)
56261ba55bcSBaptiste Daroussin {
56361ba55bcSBaptiste Daroussin 	int i;
56461ba55bcSBaptiste Daroussin 	const char *helpname;
56561ba55bcSBaptiste Daroussin 
56661ba55bcSBaptiste Daroussin 	if (NO_PRINT_VALUES(output))
56761ba55bcSBaptiste Daroussin 		return;
56861ba55bcSBaptiste Daroussin 
56961ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP) {
57061ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "HELP");
57161ba55bcSBaptiste Daroussin 		if (focusitem >= 0) {
57261ba55bcSBaptiste Daroussin 			helpname = items[focusitem].label;
57361ba55bcSBaptiste Daroussin 			if (opt->item_bottomdesc &&
57461ba55bcSBaptiste Daroussin 			    opt->help_print_item_name == false)
57561ba55bcSBaptiste Daroussin 				helpname = items[focusitem].bottomdesc;
57661ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, " %s", helpname);
57761ba55bcSBaptiste Daroussin 		}
57861ba55bcSBaptiste Daroussin 		if (opt->help_print_items == false)
57961ba55bcSBaptiste Daroussin 			return;
58061ba55bcSBaptiste Daroussin 		dprintf(opt->output_fd, "\n");
58161ba55bcSBaptiste Daroussin 	}
58261ba55bcSBaptiste Daroussin 
58361ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
584*079f6054SAlfonso S. Siciliano 		if (!(items[i].flags & BSDDIALOG_FIELDREADONLY))
58561ba55bcSBaptiste Daroussin 			dprintf(opt->output_fd, "%s\n", items[i].value);
58661ba55bcSBaptiste Daroussin 		free(items[i].value);
58761ba55bcSBaptiste Daroussin 	}
58861ba55bcSBaptiste Daroussin }
58961ba55bcSBaptiste Daroussin 
59061ba55bcSBaptiste Daroussin int form_builder(BUILDER_ARGS)
59161ba55bcSBaptiste Daroussin {
592a6d8be45SAlfonso S. Siciliano 	int output, fieldlen, focusitem;
59361ba55bcSBaptiste Daroussin 	unsigned int i, j, flags, formheight, nitems, sizeitem;
59461ba55bcSBaptiste Daroussin 	struct bsddialog_formitem *items;
59561ba55bcSBaptiste Daroussin 
59661ba55bcSBaptiste Daroussin 	if (argc < 1)
59761ba55bcSBaptiste Daroussin 		exit_error(true, "--form missing <formheight>");
59861ba55bcSBaptiste Daroussin 	formheight = (u_int)strtoul(argv[0], NULL, 10);
59961ba55bcSBaptiste Daroussin 
60061ba55bcSBaptiste Daroussin 	argc--;
60161ba55bcSBaptiste Daroussin 	argv++;
60261ba55bcSBaptiste Daroussin 	sizeitem = opt->item_bottomdesc ? 9 : 8;
60361ba55bcSBaptiste Daroussin 	if (argc % sizeitem != 0)
60461ba55bcSBaptiste Daroussin 		exit_error(true, "--form bad number of arguments items");
60561ba55bcSBaptiste Daroussin 
60661ba55bcSBaptiste Daroussin 	nitems = argc / sizeitem;
60761ba55bcSBaptiste Daroussin 	if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL)
60861ba55bcSBaptiste Daroussin 		exit_error(false, "cannot allocate memory for form items");
60961ba55bcSBaptiste Daroussin 	j = 0;
61061ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
61161ba55bcSBaptiste Daroussin 		items[i].label	= argv[j++];
61261ba55bcSBaptiste Daroussin 		items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10);
61361ba55bcSBaptiste Daroussin 		items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10);
61461ba55bcSBaptiste Daroussin 		items[i].init	= argv[j++];
61561ba55bcSBaptiste Daroussin 		items[i].yfield	= (u_int)strtoul(argv[j++], NULL, 10);
61661ba55bcSBaptiste Daroussin 		items[i].xfield	= (u_int)strtoul(argv[j++], NULL, 10);
61761ba55bcSBaptiste Daroussin 
61861ba55bcSBaptiste Daroussin 		fieldlen = (int)strtol(argv[j++], NULL, 10);
619a6d8be45SAlfonso S. Siciliano 		if (fieldlen == 0)
620a6d8be45SAlfonso S. Siciliano 			items[i].fieldlen = strcols(items[i].init);
621a6d8be45SAlfonso S. Siciliano 		else
62261ba55bcSBaptiste Daroussin 			items[i].fieldlen = abs(fieldlen);
62361ba55bcSBaptiste Daroussin 
624a6d8be45SAlfonso S. Siciliano 		items[i].maxvaluelen = (u_int)strtoul(argv[j++], NULL, 10);
625a6d8be45SAlfonso S. Siciliano 		if (items[i].maxvaluelen == 0)
626a6d8be45SAlfonso S. Siciliano 			items[i].maxvaluelen = items[i].fieldlen;
62761ba55bcSBaptiste Daroussin 
628a6d8be45SAlfonso S. Siciliano 		flags = (fieldlen <= 0) ? BSDDIALOG_FIELDREADONLY : 0;
62961ba55bcSBaptiste Daroussin 		items[i].flags = flags;
63061ba55bcSBaptiste Daroussin 
63161ba55bcSBaptiste Daroussin 		items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : "";
63261ba55bcSBaptiste Daroussin 	}
63361ba55bcSBaptiste Daroussin 
63461ba55bcSBaptiste Daroussin 	focusitem = -1;
63561ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, formheight, nitems,
63661ba55bcSBaptiste Daroussin 	    items, &focusitem);
63761ba55bcSBaptiste Daroussin 	print_form_items(output, nitems, items, focusitem, opt);
63861ba55bcSBaptiste Daroussin 	free(items);
63961ba55bcSBaptiste Daroussin 
64061ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
64161ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
64261ba55bcSBaptiste Daroussin 
64361ba55bcSBaptiste Daroussin 	return (output);
64461ba55bcSBaptiste Daroussin }
64561ba55bcSBaptiste Daroussin 
64661ba55bcSBaptiste Daroussin int inputbox_builder(BUILDER_ARGS)
64761ba55bcSBaptiste Daroussin {
64861ba55bcSBaptiste Daroussin 	int output;
64961ba55bcSBaptiste Daroussin 	struct bsddialog_formitem item;
65061ba55bcSBaptiste Daroussin 
65161ba55bcSBaptiste Daroussin 	if (argc > 1)
65261ba55bcSBaptiste Daroussin 		error_args("--inputbox", argc - 1, argv + 1);
65361ba55bcSBaptiste Daroussin 
65461ba55bcSBaptiste Daroussin 	item.label	 = "";
65561ba55bcSBaptiste Daroussin 	item.ylabel	 = 0;
65661ba55bcSBaptiste Daroussin 	item.xlabel	 = 0;
65761ba55bcSBaptiste Daroussin 	item.init	 = argc > 0 ? argv[0] : "";
65861ba55bcSBaptiste Daroussin 	item.yfield	 = 0;
65961ba55bcSBaptiste Daroussin 	item.xfield	 = 0;
66061ba55bcSBaptiste Daroussin 	item.fieldlen    = 1;
66161ba55bcSBaptiste Daroussin 	item.maxvaluelen = opt->max_input_form;
66261ba55bcSBaptiste Daroussin 	item.flags	 = BSDDIALOG_FIELDNOCOLOR;
66361ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDCURSOREND;
66461ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDEXTEND;
66561ba55bcSBaptiste Daroussin 	item.bottomdesc  = "";
66661ba55bcSBaptiste Daroussin 
66761ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL);
66861ba55bcSBaptiste Daroussin 	print_form_items(output, 1, &item, -1, opt);
66961ba55bcSBaptiste Daroussin 
67061ba55bcSBaptiste Daroussin 	return (output);
67161ba55bcSBaptiste Daroussin }
67261ba55bcSBaptiste Daroussin 
67361ba55bcSBaptiste Daroussin int mixedform_builder(BUILDER_ARGS)
67461ba55bcSBaptiste Daroussin {
675a6d8be45SAlfonso S. Siciliano 	int output, fieldlen, focusitem;
67661ba55bcSBaptiste Daroussin 	unsigned int i, j, formheight, nitems, sizeitem;
67761ba55bcSBaptiste Daroussin 	struct bsddialog_formitem *items;
67861ba55bcSBaptiste Daroussin 
67961ba55bcSBaptiste Daroussin 	if (argc < 1)
68061ba55bcSBaptiste Daroussin 		exit_error(true, "--mixedform missing <formheight>");
68161ba55bcSBaptiste Daroussin 	formheight = (u_int)strtoul(argv[0], NULL, 10);
68261ba55bcSBaptiste Daroussin 
68361ba55bcSBaptiste Daroussin 	argc--;
68461ba55bcSBaptiste Daroussin 	argv++;
68561ba55bcSBaptiste Daroussin 	sizeitem = opt->item_bottomdesc ? 10 : 9;
68661ba55bcSBaptiste Daroussin 	if (argc % sizeitem != 0)
68761ba55bcSBaptiste Daroussin 		exit_error(true, "--mixedform bad number of arguments items");
68861ba55bcSBaptiste Daroussin 
68961ba55bcSBaptiste Daroussin 	nitems = argc / sizeitem;
69061ba55bcSBaptiste Daroussin 	if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL)
69161ba55bcSBaptiste Daroussin 		exit_error(false, "cannot allocate memory for form items");
69261ba55bcSBaptiste Daroussin 	j = 0;
69361ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
69461ba55bcSBaptiste Daroussin 		items[i].label	= argv[j++];
69561ba55bcSBaptiste Daroussin 		items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10);
69661ba55bcSBaptiste Daroussin 		items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10);
69761ba55bcSBaptiste Daroussin 		items[i].init	= argv[j++];
69861ba55bcSBaptiste Daroussin 		items[i].yfield	= (u_int)strtoul(argv[j++], NULL, 10);
69961ba55bcSBaptiste Daroussin 		items[i].xfield	= (u_int)strtoul(argv[j++], NULL, 10);
700a6d8be45SAlfonso S. Siciliano 		fieldlen        = (int)strtol(argv[j++], NULL, 10);
701a6d8be45SAlfonso S. Siciliano 		if (fieldlen == 0)
702a6d8be45SAlfonso S. Siciliano 			items[i].fieldlen = strcols(items[i].init);
703a6d8be45SAlfonso S. Siciliano 		else
704a6d8be45SAlfonso S. Siciliano 			items[i].fieldlen = abs(fieldlen);
70561ba55bcSBaptiste Daroussin 		items[i].maxvaluelen = (u_int)strtoul(argv[j++], NULL, 10);
706a6d8be45SAlfonso S. Siciliano 		if (items[i].maxvaluelen == 0)
707a6d8be45SAlfonso S. Siciliano 			items[i].maxvaluelen = items[i].fieldlen;
708a6d8be45SAlfonso S. Siciliano 
70961ba55bcSBaptiste Daroussin 		items[i].flags = (u_int)strtoul(argv[j++], NULL, 10);
710a6d8be45SAlfonso S. Siciliano 		if (fieldlen <= 0)
711a6d8be45SAlfonso S. Siciliano 			items[i].flags |= BSDDIALOG_FIELDREADONLY;
712a6d8be45SAlfonso S. Siciliano 
71361ba55bcSBaptiste Daroussin 		items[i].bottomdesc = opt->item_bottomdesc ? argv[j++] : "";
71461ba55bcSBaptiste Daroussin 	}
71561ba55bcSBaptiste Daroussin 
71661ba55bcSBaptiste Daroussin 	focusitem = -1;
71761ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, formheight, nitems,
71861ba55bcSBaptiste Daroussin 	    items, &focusitem);
719*079f6054SAlfonso S. Siciliano 	for (i = 0; i < nitems; i++) {
720*079f6054SAlfonso S. Siciliano 		if ((int)strtol(argv[i * sizeitem + 6], NULL, 10) > 0)
721*079f6054SAlfonso S. Siciliano 			items[i].flags &= ~ BSDDIALOG_FIELDREADONLY;
722*079f6054SAlfonso S. Siciliano 	}
72361ba55bcSBaptiste Daroussin 	print_form_items(output, nitems, items, focusitem, opt);
72461ba55bcSBaptiste Daroussin 	free(items);
72561ba55bcSBaptiste Daroussin 
72661ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
72761ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
72861ba55bcSBaptiste Daroussin 
72961ba55bcSBaptiste Daroussin 	return (output);
73061ba55bcSBaptiste Daroussin }
73161ba55bcSBaptiste Daroussin 
73261ba55bcSBaptiste Daroussin int passwordbox_builder(BUILDER_ARGS)
73361ba55bcSBaptiste Daroussin {
73461ba55bcSBaptiste Daroussin 	int output;
73561ba55bcSBaptiste Daroussin 	struct bsddialog_formitem item;
73661ba55bcSBaptiste Daroussin 
73761ba55bcSBaptiste Daroussin 	if (argc > 1)
73861ba55bcSBaptiste Daroussin 		error_args("--passwordbox", argc - 1, argv + 1);
73961ba55bcSBaptiste Daroussin 
74061ba55bcSBaptiste Daroussin 	item.label	 = "";
74161ba55bcSBaptiste Daroussin 	item.ylabel	 = 0;
74261ba55bcSBaptiste Daroussin 	item.xlabel	 = 0;
74361ba55bcSBaptiste Daroussin 	item.init	 = argc > 0 ? argv[0] : "";
74461ba55bcSBaptiste Daroussin 	item.yfield	 = 0;
74561ba55bcSBaptiste Daroussin 	item.xfield	 = 0;
74661ba55bcSBaptiste Daroussin 	item.fieldlen	 = 1;
74761ba55bcSBaptiste Daroussin 	item.maxvaluelen = opt->max_input_form;
74861ba55bcSBaptiste Daroussin 	item.flags       = BSDDIALOG_FIELDHIDDEN;
74961ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDNOCOLOR;
75061ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDCURSOREND;
75161ba55bcSBaptiste Daroussin 	item.flags      |= BSDDIALOG_FIELDEXTEND;
75261ba55bcSBaptiste Daroussin 	item.bottomdesc  = "";
75361ba55bcSBaptiste Daroussin 
75461ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, 1, 1, &item, NULL);
75561ba55bcSBaptiste Daroussin 	print_form_items(output, 1, &item, -1, opt);
75661ba55bcSBaptiste Daroussin 
75761ba55bcSBaptiste Daroussin 	return (output);
75861ba55bcSBaptiste Daroussin }
75961ba55bcSBaptiste Daroussin 
76061ba55bcSBaptiste Daroussin int passwordform_builder(BUILDER_ARGS)
76161ba55bcSBaptiste Daroussin {
76261ba55bcSBaptiste Daroussin 	int output, fieldlen, valuelen, focusitem;
76361ba55bcSBaptiste Daroussin 	unsigned int i, j, flags, formheight, nitems, sizeitem;
76461ba55bcSBaptiste Daroussin 	struct bsddialog_formitem *items;
76561ba55bcSBaptiste Daroussin 
76661ba55bcSBaptiste Daroussin 	if (argc < 1)
76761ba55bcSBaptiste Daroussin 		exit_error(true, "--passwordform missing <formheight>");
76861ba55bcSBaptiste Daroussin 	formheight = (u_int)strtoul(argv[0], NULL, 10);
76961ba55bcSBaptiste Daroussin 
77061ba55bcSBaptiste Daroussin 	argc--;
77161ba55bcSBaptiste Daroussin 	argv++;
77261ba55bcSBaptiste Daroussin 	sizeitem = opt->item_bottomdesc ? 9 : 8;
77361ba55bcSBaptiste Daroussin 	if (argc % sizeitem != 0)
77461ba55bcSBaptiste Daroussin 		exit_error(true, "--passwordform bad arguments items number");
77561ba55bcSBaptiste Daroussin 
77661ba55bcSBaptiste Daroussin 	flags = BSDDIALOG_FIELDHIDDEN;
77761ba55bcSBaptiste Daroussin 	nitems = argc / sizeitem;
77861ba55bcSBaptiste Daroussin 	if ((items = calloc(nitems, sizeof(struct bsddialog_formitem))) == NULL)
77961ba55bcSBaptiste Daroussin 		exit_error(false, "cannot allocate memory for form items");
78061ba55bcSBaptiste Daroussin 	j = 0;
78161ba55bcSBaptiste Daroussin 	for (i = 0; i < nitems; i++) {
78261ba55bcSBaptiste Daroussin 		items[i].label	= argv[j++];
78361ba55bcSBaptiste Daroussin 		items[i].ylabel = (u_int)strtoul(argv[j++], NULL, 10);
78461ba55bcSBaptiste Daroussin 		items[i].xlabel = (u_int)strtoul(argv[j++], NULL, 10);
78561ba55bcSBaptiste Daroussin 		items[i].init	= argv[j++];
78661ba55bcSBaptiste Daroussin 		items[i].yfield	= (u_int)strtoul(argv[j++], NULL, 10);
78761ba55bcSBaptiste Daroussin 		items[i].xfield	= (u_int)strtoul(argv[j++], NULL, 10);
78861ba55bcSBaptiste Daroussin 
78961ba55bcSBaptiste Daroussin 		fieldlen = (int)strtol(argv[j++], NULL, 10);
79061ba55bcSBaptiste Daroussin 		items[i].fieldlen = abs(fieldlen);
79161ba55bcSBaptiste Daroussin 
79261ba55bcSBaptiste Daroussin 		valuelen = (int)strtol(argv[j++], NULL, 10);
79361ba55bcSBaptiste Daroussin 		items[i].maxvaluelen = valuelen == 0 ? abs(fieldlen) : valuelen;
79461ba55bcSBaptiste Daroussin 
79561ba55bcSBaptiste Daroussin 		flags |= (fieldlen < 0 ? BSDDIALOG_FIELDREADONLY : 0);
79661ba55bcSBaptiste Daroussin 		items[i].flags = flags;
79761ba55bcSBaptiste Daroussin 
79861ba55bcSBaptiste Daroussin 		items[i].bottomdesc  = opt->item_bottomdesc ? argv[j++] : "";
79961ba55bcSBaptiste Daroussin 	}
80061ba55bcSBaptiste Daroussin 
80161ba55bcSBaptiste Daroussin 	focusitem = -1;
80261ba55bcSBaptiste Daroussin 	output = bsddialog_form(conf, text, rows, cols, formheight, nitems,
80361ba55bcSBaptiste Daroussin 	    items, &focusitem);
80461ba55bcSBaptiste Daroussin 	print_form_items(output, nitems, items, focusitem, opt);
80561ba55bcSBaptiste Daroussin 	free(items);
80661ba55bcSBaptiste Daroussin 
80761ba55bcSBaptiste Daroussin 	if (output == BSDDIALOG_HELP && opt->item_bottomdesc)
80861ba55bcSBaptiste Daroussin 		output = BSDDIALOG_ITEM_HELP;
80961ba55bcSBaptiste Daroussin 
81061ba55bcSBaptiste Daroussin 	return (output);
81161ba55bcSBaptiste Daroussin }
812