Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libterminfo Add support for translating the following te...



details:   https://anonhg.NetBSD.org/src/rev/3d6390afd9d0
branches:  trunk
changeset: 763103:3d6390afd9d0
user:      roy <roy%NetBSD.org@localhost>
date:      Thu Mar 10 10:17:19 2011 +0000

description:
Add support for translating the following termcap commands into terminfo:
  %B %D %r %2 %3 %d %+ %> %.
Fixes PR bin/44692.

diffstat:

 lib/libterminfo/termcap.c     |  170 ++++++++++++++++++++++++++++++++++++++---
 lib/libterminfo/terminfo.5.in |   10 +-
 2 files changed, 160 insertions(+), 20 deletions(-)

diffs (253 lines):

diff -r 27f07763d770 -r 3d6390afd9d0 lib/libterminfo/termcap.c
--- a/lib/libterminfo/termcap.c Thu Mar 10 10:11:25 2011 +0000
+++ b/lib/libterminfo/termcap.c Thu Mar 10 10:17:19 2011 +0000
@@ -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++ = 'p';
                        *ip++ = '0' + p;
                        *ip++ = '%';
+                       *ip++ = 'p';
+                       *ip++ = '0' + p;
+                       strcpy(ip, "%{2}%*%-");
+                       ip += 8;
+                       l += 14;
+                       nop = 1;
+                       continue;
+               case 'r':
+                       /* 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 += 5;
-                       /* FALLTHROUGH */
-               case 'r':
-                       p = 3 - p;
+                       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.
diff -r 27f07763d770 -r 3d6390afd9d0 lib/libterminfo/terminfo.5.in
--- a/lib/libterminfo/terminfo.5.in     Thu Mar 10 10:11:25 2011 +0000
+++ b/lib/libterminfo/terminfo.5.in     Thu Mar 10 10:17:19 2011 +0000
@@ -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 roy%NetBSD.org@localhost
-.Sh BUGS
-The
-.Ev TERMCAP
-capabilities %\*[Gt], %B and %D are not converted into terminfo capabilities.



Home | Main Index | Thread Index | Old Index