Module Name: src
Committed By: roy
Date: Fri Mar 18 10:42:55 UTC 2011
Modified Files:
src/lib/libterminfo: termcap.c
Log Message:
Simplify some conversion by usig pre formatted strings and a function
to print a parameter.
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/lib/libterminfo/termcap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libterminfo/termcap.c
diff -u src/lib/libterminfo/termcap.c:1.13 src/lib/libterminfo/termcap.c:1.14
--- src/lib/libterminfo/termcap.c:1.13 Fri Mar 11 13:28:52 2011
+++ src/lib/libterminfo/termcap.c Fri Mar 18 10:42:54 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: termcap.c,v 1.13 2011/03/11 13:28:52 christos Exp $ */
+/* $NetBSD: termcap.c,v 1.14 2011/03/18 10:42:54 roy Exp $ */
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: termcap.c,v 1.13 2011/03/11 13:28:52 christos Exp $");
+__RCSID("$NetBSD: termcap.c,v 1.14 2011/03/18 10:42:54 roy Exp $");
#include <assert.h>
#include <ctype.h>
@@ -222,6 +222,21 @@
return key;
}
+/* Print a parameter if needed */
+static int
+printparam(char **dst, char p, int *nop)
+{
+ if (*nop != 0) {
+ *nop = 0;
+ return 0;
+ }
+
+ *(*dst)++ = '%';
+ *(*dst)++ = 'p';
+ *(*dst)++ = '0' + p;
+ return 3;
+}
+
/* Convert a termcap character into terminfo equivalents */
static int
printchar(char **dst, const char **src)
@@ -271,6 +286,12 @@
}
/* Convert termcap commands into terminfo commands */
+static const char fmtB[] = "%p0%{10}%/%{16}%*%p0%{10}%m%+";
+static const char fmtD[] = "%p0%p0%{2}%*%-";
+static const char fmtIf[] = "%p0%p0%?";
+static const char fmtThen[] = "%>%t";
+static const char fmtElse[] = "%+%;";
+
static char *
strval(const char *val)
{
@@ -318,31 +339,25 @@
}
switch (c = *++(val)) {
case 'B':
- if (l + 30 > len)
+ if (l + sizeof(fmtB) > len)
goto elen;
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- strcpy(ip, "%{10}%/%{16}%*%p");
- ip += 16;
- *ip++ = '0' + p;
- strcpy(ip, "%{10}%m%+");
- ip += 9;
- l += 29;
+ memcpy(ip, fmtB, sizeof(fmtB) - 1);
+ /* Replace the embedded parameters with real ones */
+ ip[2] += p;
+ ip[19] += p;
+ ip += sizeof(fmtB) - 1;
+ l += sizeof(fmtB) - 1;
nop = 1;
continue;
case 'D':
- if (l + 15 > len)
+ if (l + sizeof(fmtD) > len)
goto elen;
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- strcpy(ip, "%{2}%*%-");
- ip += 8;
- l += 14;
+ memcpy(ip, fmtD, sizeof(fmtD) - 1);
+ /* Replace the embedded parameters with real ones */
+ ip[2] += p;
+ ip[5] += p;
+ ip += sizeof(fmtD) - 1;
+ l += sizeof(fmtD) - 1;
nop = 1;
continue;
case 'r':
@@ -353,13 +368,7 @@
case 'd':
if (l + 7 > len)
goto elen;
- if (nop == 0) {
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- l += 3;
- } else
- nop = 0;
+ l += printparam(&ip, p, &nop);
*ip++ = '%';
if (c != 'd') {
*ip++ = c;
@@ -371,13 +380,7 @@
case '+':
if (l + 13 > len)
goto elen;
- if (nop == 0) {
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- l += 3;
- } else
- nop = 0;
+ l += printparam(&ip, p, &nop);
l += printchar(&ip, &val);
*ip++ = '%';
*ip++ = c;
@@ -386,39 +389,31 @@
l += 7;
break;
case '>':
- if (l + 29 > len)
+ if (l + sizeof(fmtIf) + sizeof(fmtThen) +
+ sizeof(fmtElse) + (6 * 2) > len)
goto elen;
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- *ip++ = '%';
- *ip++ = '?';
+
+ memcpy(ip, fmtIf, sizeof(fmtIf) - 1);
+ /* Replace the embedded parameters with real ones */
+ ip[2] += p;
+ ip[5] += p;
+ ip += sizeof(fmtIf) - 1;
+ l += sizeof(fmtIf) - 1;
l += printchar(&ip, &val);
- *ip++ = '%';
- *ip++ = '>';
- *ip++ = '%';
- *ip++ = 't';
+ memcpy(ip, fmtThen, sizeof(fmtThen) - 1);
+ ip += sizeof(fmtThen) - 1;
+ l += sizeof(fmtThen) - 1;
l += printchar(&ip, &val);
- *ip++ = '%';
- *ip++ = '+';
- *ip++ = '%';
- *ip++ = ';';
+ memcpy(ip, fmtElse, sizeof(fmtElse) - 1);
+ ip += sizeof(fmtElse) - 1;
+ l += sizeof(fmtElse) - 1;
l += 16;
nop = 1;
continue;
case '.':
if (l + 6 > len)
goto elen;
- if (nop == 0) {
- *ip++ = '%';
- *ip++ = 'p';
- *ip++ = '0' + p;
- l += 3;
- } else
- nop = 0;
+ l += printparam(&ip, p, &nop);
*ip++ = '%';
*ip++ = 'c';
l += 2;