Module Name: src
Committed By: roy
Date: Thu Mar 10 10:17:19 UTC 2011
Modified Files:
src/lib/libterminfo: termcap.c terminfo.5.in
Log Message:
Add support for translating the following termcap commands into terminfo:
%B %D %r %2 %3 %d %+ %> %.
Fixes PR bin/44692.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/lib/libterminfo/termcap.c
cvs rdiff -u -r1.14 -r1.15 src/lib/libterminfo/terminfo.5.in
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.11 src/lib/libterminfo/termcap.c:1.12
--- src/lib/libterminfo/termcap.c:1.11 Mon Mar 7 00:27:51 2011
+++ src/lib/libterminfo/termcap.c Thu Mar 10 10:17:19 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: termcap.c,v 1.11 2011/03/07 00:27:51 christos Exp $ */
+/* $NetBSD: termcap.c,v 1.12 2011/03/10 10:17:19 roy Exp $ */
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: termcap.c,v 1.11 2011/03/07 00:27:51 christos Exp $");
+__RCSID("$NetBSD: termcap.c,v 1.12 2011/03/10 10:17:19 roy Exp $");
#include <assert.h>
#include <ctype.h>
@@ -226,14 +226,61 @@
return key;
}
-/* We don't currently map %> %B %D
- * That means no conversion for regent100, hz1500, act4, act5, mime terms. */
+/* Convert a termcap character into terminfo equivalents */
+static int
+printchar(char **dst, const char **src)
+{
+ unsigned char v;
+ int l;
+
+ l = 4;
+ v = (unsigned char) *++(*src);
+ if (v == '\\') {
+ v = (unsigned char) *++(*src);
+ switch (v) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ v = 0;
+ while (isdigit((unsigned char) **src))
+ v = 8 * v + ((unsigned char) *(*src)++ - '0');
+ (*src)--;
+ break;
+ case '\0':
+ v = '\\';
+ break;
+ }
+ } else if (v == '^')
+ v = (unsigned char) (*++(*src) & 0x1f);
+ *(*dst)++ = '%';
+ if (isgraph(v) && v != ',' && v != '\'' && v != '\\' && v != ':') {
+ *(*dst)++ = '\'';
+ *(*dst)++ = v;
+ *(*dst)++ = '\'';
+ } else {
+ *(*dst)++ = '{';
+ if (v > 99) {
+ *(*dst)++ = '0'+ v / 100;
+ l++;
+ }
+ if (v > 9) {
+ *(*dst)++ = '0' + ((int) (v / 10)) % 10;
+ l++;
+ }
+ *(*dst)++ = '0' + v % 10;
+ *(*dst)++ = '}';
+ }
+ return l;
+}
+
+/* Convert termcap commands into terminfo commands */
static char *
strval(const char *val)
{
char *info, *ip, c;
const char *ps, *pe;
- int p;
+ int p, nop;
size_t len, l;
len = 1024; /* no single string should be bigger */
@@ -257,7 +304,7 @@
} else
ps = pe = NULL;
- l = 0;
+ l = nop = 0;
p = 1;
for (; *val != '\0'; val++) {
if (l + 2 > len)
@@ -273,27 +320,124 @@
l++;
continue;
}
- switch (c = *(++val)) {
- case 'd':
- if (l + 6 > len)
+ switch (c = *++(val)) {
+ case 'B':
+ if (l + 30 > 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;
+ nop = 1;
+ continue;
+ case 'D':
+ if (l + 15 > len)
+ goto elen;
*ip++ = '%';
- *ip++ = 'd';
- l += 5;
- /* FALLTHROUGH */
+ *ip++ = 'p';
+ *ip++ = '0' + p;
+ *ip++ = '%';
+ *ip++ = 'p';
+ *ip++ = '0' + p;
+ strcpy(ip, "%{2}%*%-");
+ ip += 8;
+ l += 14;
+ nop = 1;
+ continue;
case 'r':
- p = 3 - p;
+ /* non op as switched below */
+ break;
+ case '2': /* FALLTHROUGH */
+ case '3': /* FALLTHROUGH */
+ case 'd':
+ if (l + 7 > len)
+ goto elen;
+ if (nop == 0) {
+ *ip++ = '%';
+ *ip++ = 'p';
+ *ip++ = '0' + p;
+ l += 3;
+ } else
+ nop = 0;
+ *ip++ = '%';
+ if (c != 'd') {
+ *ip++ = c;
+ l++;
+ }
+ *ip++ = 'd';
+ l += 2;
+ break;
+ case '+':
+ if (l + 13 > len)
+ goto elen;
+ if (nop == 0) {
+ *ip++ = '%';
+ *ip++ = 'p';
+ *ip++ = '0' + p;
+ l += 3;
+ } else
+ nop = 0;
+ l += printchar(&ip, &val);
+ *ip++ = '%';
+ *ip++ = c;
+ *ip++ = '%';
+ *ip++ = 'c';
+ l += 7;
+ break;
+ case '>':
+ if (l + 29 > len)
+ goto elen;
+ *ip++ = '%';
+ *ip++ = 'p';
+ *ip++ = '0' + p;
+ *ip++ = '%';
+ *ip++ = 'p';
+ *ip++ = '0' + p;
+ *ip++ = '%';
+ *ip++ = '?';
+ l += printchar(&ip, &val);
+ *ip++ = '%';
+ *ip++ = '>';
+ *ip++ = '%';
+ *ip++ = 't';
+ l += printchar(&ip, &val);
+ *ip++ = '%';
+ *ip++ = '+';
+ *ip++ = '%';
+ *ip++ = ';';
+ 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;
+ *ip++ = '%';
+ *ip++ = 'c';
+ l += 2;
break;
default:
/* Hope it matches a terminfo command. */
*ip++ = '%';
*ip++ = c;
l += 2;
+ if (c == 'i')
+ continue;
break;
}
+ /* Swap p1 and p2 */
+ p = 3 - p;
}
/* \E\ is valid termcap.
Index: src/lib/libterminfo/terminfo.5.in
diff -u src/lib/libterminfo/terminfo.5.in:1.14 src/lib/libterminfo/terminfo.5.in:1.15
--- src/lib/libterminfo/terminfo.5.in:1.14 Fri Feb 26 07:03:49 2010
+++ src/lib/libterminfo/terminfo.5.in Thu Mar 10 10:17:19 2011
@@ -1,6 +1,6 @@
-.\" $NetBSD: terminfo.5.in,v 1.14 2010/02/26 07:03:49 wiz Exp $
+.\" $NetBSD: terminfo.5.in,v 1.15 2011/03/10 10:17:19 roy Exp $
.\"
-.\" Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
+.\" Copyright (c) 2009, 2010, 2011 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to The NetBSD Foundation
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd February 26, 2010
+.Dd March 10, 2011
.Dt TERMINFO 5
.Os
.Sh NAME
@@ -261,7 +261,3 @@
.Xr tic 1 .
.Sh AUTHORS
.An Roy Marples Aq [email protected]
-.Sh BUGS
-The
-.Ev TERMCAP
-capabilities %\*[Gt], %B and %D are not converted into terminfo capabilities.