Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libterminfo As tparm accepts longs we should treat them ...
details: https://anonhg.NetBSD.org/src/rev/328766dc6727
branches: trunk
changeset: 784297:328766dc6727
user: roy <roy%NetBSD.org@localhost>
date: Thu Jan 24 10:28:28 2013 +0000
description:
As tparm accepts longs we should treat them as long during expansion.
Also, fix the ~ and ! logic.
diffstat:
lib/libterminfo/tparm.c | 98 +++++++++++++++++++++++++++++++------------------
1 files changed, 62 insertions(+), 36 deletions(-)
diffs (260 lines):
diff -r 673ccb267546 -r 328766dc6727 lib/libterminfo/tparm.c
--- a/lib/libterminfo/tparm.c Thu Jan 24 10:18:41 2013 +0000
+++ b/lib/libterminfo/tparm.c Thu Jan 24 10:28:28 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tparm.c,v 1.10 2013/01/23 13:06:18 roy Exp $ */
+/* $NetBSD: tparm.c,v 1.11 2013/01/24 10:28:28 roy Exp $ */
/*
* Copyright (c) 2009, 2011 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: tparm.c,v 1.10 2013/01/23 13:06:18 roy Exp $");
+__RCSID("$NetBSD: tparm.c,v 1.11 2013/01/24 10:28:28 roy Exp $");
#include <sys/param.h>
#include <assert.h>
@@ -41,21 +41,24 @@
#include <term_private.h>
#include <term.h>
+#define LONG_STR_MAX ((CHAR_BIT * sizeof(long)) / 3)
+#define BUFINC 128 /* Size to increament the terminal buffer by */
+
static TERMINAL *dumbterm; /* For non thread safe functions */
typedef struct {
- int nums[20];
+ long nums[20];
char *strings[20];
size_t offset;
} TPSTACK;
typedef struct {
- int num;
+ long num;
char *string;
} TPVAR;
static int
-push(int num, char *string, TPSTACK *stack)
+push(long num, char *string, TPSTACK *stack)
{
if (stack->offset >= sizeof(stack->nums)) {
errno = E2BIG;
@@ -68,7 +71,7 @@
}
static int
-pop(int *num, char **string, TPSTACK *stack)
+pop(long *num, char **string, TPSTACK *stack)
{
if (stack->offset == 0) {
if (num)
@@ -92,7 +95,7 @@
char *buf;
if (term->_bufpos + len >= term->_buflen) {
- len = term->_buflen + MAX(len, BUFSIZ);
+ len = term->_buflen + MAX(len, BUFINC);
buf = realloc(term->_buf, len);
if (buf == NULL)
return NULL;
@@ -115,14 +118,13 @@
}
static size_t
-onum(TERMINAL *term, const char *fmt, int num, int len)
+onum(TERMINAL *term, const char *fmt, int num, unsigned int len)
{
size_t l;
- /* Assume we never have natural number longer than 64 chars */
- if (len < 64)
- len = 64;
- if (checkbuf(term, (size_t)len + 1) == NULL)
+ if (len < LONG_STR_MAX)
+ len = LONG_STR_MAX;
+ if (checkbuf(term, len + 2) == NULL)
return 0;
l = sprintf(term->_buf + term->_bufpos, fmt, num);
term->_bufpos += l;
@@ -130,16 +132,16 @@
}
static char *
-_ti_tiparm(TERMINAL *term, const char *str, va_list parms)
+_ti_tiparm(TERMINAL *term, const char *str, int va_long, va_list parms)
{
const char *sp;
char c, fmt[64], *fp, *ostr;
- int val, val2;
- int dnums[26]; /* dynamic variables a-z, not preserved */
+ long val, val2;
+ long dnums[26]; /* dynamic variables a-z, not preserved */
size_t l, max;
TPSTACK stack;
TPVAR params[9];
- int done, dot, minus, width, precision, olen;
+ unsigned int done, dot, minus, width, precision, olen;
int piss[9]; /* Parameter IS String - piss ;) */
if (str == NULL)
@@ -151,7 +153,6 @@
still work with non thread safe functions (which sadly are still the
norm and standard).
*/
-
if (term == NULL) {
if (dumbterm == NULL) {
dumbterm = malloc(sizeof(*dumbterm));
@@ -165,10 +166,10 @@
term->_bufpos = 0;
/* Ensure we have an initial buffer */
if (term->_buflen == 0) {
- term->_buf = malloc(BUFSIZ);
+ term->_buf = malloc(BUFINC);
if (term->_buf == NULL)
return NULL;
- term->_buflen = BUFSIZ;
+ term->_buflen = BUFINC;
}
/*
@@ -209,13 +210,14 @@
/* Put our parameters into variables */
memset(¶ms, 0, sizeof(params));
for (l = 0; l < max; l++) {
- if (piss[l] == 0)
- params[l].num = va_arg(parms, int);
+ if (piss[l])
+ params[l].string = va_arg(parms, char *);
+ else if (va_long)
+ params[l].num = va_arg(parms, long);
else
- params[l].string = va_arg(parms, char *);
+ params[l].num = (long)va_arg(parms, int);
}
- term->_bufpos = 0;
memset(&stack, 0, sizeof(stack));
while ((c = *str++) != '\0') {
if (c != '%' || (c = *str++) == '%') {
@@ -234,11 +236,15 @@
while (done == 0 && (size_t)(fp - fmt) < sizeof(fmt)) {
switch (c) {
case 'c': /* FALLTHROUGH */
+ case 's':
+ *fp++ = c;
+ done = 1;
+ break;
case 'd': /* FALLTHROUGH */
case 'o': /* FALLTHROUGH */
case 'x': /* FALLTHROUGH */
case 'X': /* FALLTHROUGH */
- case 's':
+ *fp++ = 'l';
*fp++ = c;
done = 1;
break;
@@ -287,7 +293,7 @@
width = val;
else
precision = val;
- olen = (width > precision) ? width : precision;
+ olen = MAX(width, precision);
}
*fp++ = '\0';
@@ -317,15 +323,19 @@
l = 0;
else
l = strlen(ostr);
- if (onum(term, "%d", (int)l, 0) == 0)
+#ifdef NCURSES_COMPAT_57
+ if (onum(term, "%ld", (long)l, 0) == 0)
return NULL;
+#else
+ push((long)l, NULL, &stack);
+#endif
break;
case 'd': /* FALLTHROUGH */
case 'o': /* FALLTHROUGH */
case 'x': /* FALLTHROUGH */
case 'X':
pop(&val, NULL, &stack);
- if (onum(term, fmt, val, olen) == 0)
+ if (onum(term, fmt, (int)val, olen) == 0)
return NULL;
break;
case 'p':
@@ -359,7 +369,7 @@
params[1].num++;
break;
case '\'':
- if (push((int)(unsigned char)*str++, NULL, &stack))
+ if (push((long)(unsigned char)*str++, NULL, &stack))
return NULL;
while (*str != '\0' && *str != '\'')
str++;
@@ -439,7 +449,7 @@
case '!':
case '~':
pop(&val, NULL, &stack);
- switch (*str) {
+ switch (c) {
case '!':
val = !val;
break;
@@ -512,7 +522,7 @@
_DIAGASSERT(str != NULL);
va_start(va, str);
- ret = _ti_tiparm(term, str, va);
+ ret = _ti_tiparm(term, str, 0, va);
va_end(va);
return ret;
}
@@ -526,18 +536,34 @@
_DIAGASSERT(str != NULL);
va_start(va, str);
- ret = _ti_tiparm(NULL, str, va);
+ ret = _ti_tiparm(NULL, str, 0, va);
+ va_end(va);
+ return ret;
+}
+
+/* Same as tiparm, but accepts long instead of int for the numeric params.
+ * Currently there is no need for this to be a public interface and is only
+ * consumed by tparm. If we need this to be public, and I really cannot
+ * imagine why, then we would need ti_tlparm() as well. */
+static char *
+tlparm(const char *str, ...)
+{
+ va_list va;
+ char *ret;
+
+ _DIAGASSERT(str != NULL);
+
+ va_start(va, str);
+ ret = _ti_tiparm(NULL, str, 1, va);
va_end(va);
return ret;
}
char *
tparm(const char *str,
- long lp1, long lp2, long lp3, long lp4, long lp5,
- long lp6, long lp7, long lp8, long lp9)
+ long p1, long p2, long p3, long p4, long p5,
+ long p6, long p7, long p8, long p9)
{
- int p1 = lp1, p2 = lp2, p3 = lp3, p4 = lp4, p5 = lp5;
- int p6 = lp6, p7 = lp7, p8 = lp8, p9 = lp9;
- return tiparm(str, p1, p2, p3, p4, p5, p6, p7, p8, p9);
+ return tlparm(str, p1, p2, p3, p4, p5, p6, p7, p8, p9);
}
Home |
Main Index |
Thread Index |
Old Index