summaryrefslogtreecommitdiff
path: root/usr.bin/tput
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2023-02-08 15:56:33 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2023-02-08 15:56:33 +0000
commit6b62eba3caf9a813d327567dd2a099b2e615cd0e (patch)
treee94525f20d49dcb4a5b8207911b7269f0cf2e011 /usr.bin/tput
parent73ac5f33636470fc8928433264893eb388720692 (diff)
Use _nc_tparm_analyze() instead of trying to do it ourselves in process().
This fixes tput when used with a capability that uses push/pop. OK gkoehler@
Diffstat (limited to 'usr.bin/tput')
-rw-r--r--usr.bin/tput/tput.c70
1 files changed, 20 insertions, 50 deletions
diff --git a/usr.bin/tput/tput.c b/usr.bin/tput/tput.c
index 4357553afd8..3b4e5dfce28 100644
--- a/usr.bin/tput/tput.c
+++ b/usr.bin/tput/tput.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tput.c,v 1.27 2023/02/03 15:55:59 tb Exp $ */
+/* $OpenBSD: tput.c,v 1.28 2023/02/08 15:56:32 millert Exp $ */
/*
* Copyright (c) 1999 Todd C. Miller <millert@openbsd.org>
@@ -44,13 +44,13 @@
* SUCH DAMAGE.
*/
+#include <sys/wait.h>
#include <ctype.h>
#include <err.h>
#include <curses.h>
#include <term.h>
#include <stdio.h>
#include <stdlib.h>
-#include <termios.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
@@ -58,7 +58,7 @@
#define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b))
-#include <sys/wait.h>
+#define NUM_PARM 9 /* must match tic.h */
static void init(void);
static char **process(char *, char *, char **);
@@ -67,6 +67,7 @@ static void set_margins(void);
static void usage(void);
extern char *__progname;
+extern int _nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount);
int
main(int argc, char *argv[])
@@ -192,66 +193,35 @@ main(int argc, char *argv[])
static char **
process(char *cap, char *str, char **argv)
{
- char *cp, *s, *nargv[9] = {0};
- int arg_need, popcount, i;
+ char *cp, *s, *nargv[NUM_PARM] = {0};
+ char *p_is_s[NUM_PARM];
+ int arg_need, i;
/* Count how many values we need for this capability. */
- for (cp = str, arg_need = popcount = 0; *cp != '\0'; cp++) {
- if (*cp == '%') {
- switch (*++cp) {
- case '%':
- cp++;
- break;
- case 'i':
- if (popcount < 2)
- popcount = 2;
- break;
- case 'p':
- cp++;
- if (isdigit((unsigned char)cp[1]) &&
- popcount < cp[1] - '0')
- popcount = cp[1] - '0';
- break;
- case 'd':
- case 's':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '.':
- case '+':
- arg_need++;
- break;
- default:
- break;
- }
- }
- }
- arg_need = MAXIMUM(arg_need, popcount);
- if (arg_need > 9)
+ i = _nc_tparm_analyze(str, p_is_s, &arg_need);
+ if (arg_need == 0)
+ arg_need = i;
+ if (arg_need > NUM_PARM)
errx(2, "too many arguments (%d) for capability `%s'",
arg_need, cap);
for (i = 0; i < arg_need; i++) {
+ const char *errstr;
long l;
if (argv[i] == NULL)
errx(2, "not enough arguments (%d) for capability `%s'",
arg_need, cap);
- /* convert ascii representation of numbers to longs */
- if (isdigit((unsigned char)argv[i][0])
- && (l = strtol(argv[i], &cp, 10)) >= 0
- && l < LONG_MAX && *cp == '\0')
- nargv[i] = (char *)l;
- else
+ if (p_is_s[i] != 0) {
nargv[i] = argv[i];
+ } else {
+ /* convert ascii representation of numbers to longs */
+ l = strtonum(argv[i], LONG_MIN, LONG_MAX, &errstr);
+ if (errstr != NULL)
+ errx(2, "capability `%s' is %s", cap, errstr);
+ nargv[i] = (char *)l;
+ }
}
s = tparm(str, nargv[0], nargv[1], nargv[2], nargv[3],