Module Name: src Committed By: roy Date: Tue Mar 2 14:11:11 UTC 2010
Modified Files: src/lib/libterminfo: compile.c term_private.h termcap.c Log Message: Use _ti_get_token instead of strsep when parsing termcap entries. This allows us to handle \E\ as a valid sequence. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/lib/libterminfo/compile.c cvs rdiff -u -r1.6 -r1.7 src/lib/libterminfo/term_private.h cvs rdiff -u -r1.4 -r1.5 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/compile.c diff -u src/lib/libterminfo/compile.c:1.3 src/lib/libterminfo/compile.c:1.4 --- src/lib/libterminfo/compile.c:1.3 Mon Mar 1 01:59:48 2010 +++ src/lib/libterminfo/compile.c Tue Mar 2 14:11:11 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: compile.c,v 1.3 2010/03/01 01:59:48 dholland Exp $ */ +/* $NetBSD: compile.c,v 1.4 2010/03/02 14:11:11 roy Exp $ */ /* * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #endif #include <sys/cdefs.h> -__RCSID("$NetBSD: compile.c,v 1.3 2010/03/01 01:59:48 dholland Exp $"); +__RCSID("$NetBSD: compile.c,v 1.4 2010/03/02 14:11:11 roy Exp $"); #if !HAVE_NBTOOL_CONFIG_H || HAVE_SYS_ENDIAN_H #include <sys/endian.h> @@ -413,11 +413,10 @@ return 0; } -static char * -get_token(char **cap) +char * +_ti_get_token(char **cap, char sep) { - char *token; - int esc; + char esc, *token; while (isspace((unsigned char)**cap)) (*cap)++; @@ -425,16 +424,21 @@ return NULL; /* We can't use stresep(3) as ^ we need two escape chars */ - esc = 0; + esc = '\0'; for (token = *cap; - **cap != '\0' && (esc == 1 || **cap != ','); + **cap != '\0' && (esc != '\0' || **cap != sep); (*cap)++) { - if (esc == 0) { + if (esc == '\0') { if (**cap == '\\' || **cap == '^') - esc = 1; - } else - esc = 0; + esc = **cap; + } else { + /* termcap /E/ is valid */ + if (sep == ':' && esc == '\\' && **cap == 'E') + esc = 'x'; + else + esc = '\0'; + } } if (**cap != '\0') @@ -456,7 +460,7 @@ _DIAGASSERT(cap != NULL); - name = get_token(&cap); + name = _ti_get_token(&cap, ','); if (name == NULL) { dowarn(flags, "no seperator found: %s", cap); return NULL; @@ -489,9 +493,9 @@ goto error; } - for (token = get_token(&cap); + for (token = _ti_get_token(&cap, ','); token != NULL && *token != '\0'; - token = get_token(&cap)) + token = _ti_get_token(&cap, ',')) { /* Skip commented caps */ if (!(flags & TIC_COMMENT) && token[0] == '.') Index: src/lib/libterminfo/term_private.h diff -u src/lib/libterminfo/term_private.h:1.6 src/lib/libterminfo/term_private.h:1.7 --- src/lib/libterminfo/term_private.h:1.6 Mon Feb 22 23:05:39 2010 +++ src/lib/libterminfo/term_private.h Tue Mar 2 14:11:11 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: term_private.h,v 1.6 2010/02/22 23:05:39 roy Exp $ */ +/* $NetBSD: term_private.h,v 1.7 2010/03/02 14:11:11 roy Exp $ */ /* * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc. @@ -143,6 +143,7 @@ } TIC; char *_ti_grow_tbuf(TBUF *, size_t); +char *_ti_get_token(char **, char); char *_ti_find_cap(TBUF *, char, short); char *_ti_find_extra(TBUF *, const char *); size_t _ti_store_extra(TIC *, int, char *, char, char, short, Index: src/lib/libterminfo/termcap.c diff -u src/lib/libterminfo/termcap.c:1.4 src/lib/libterminfo/termcap.c:1.5 --- src/lib/libterminfo/termcap.c:1.4 Mon Mar 1 11:02:31 2010 +++ src/lib/libterminfo/termcap.c Tue Mar 2 14:11:11 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: termcap.c,v 1.4 2010/03/01 11:02:31 roy Exp $ */ +/* $NetBSD: termcap.c,v 1.5 2010/03/02 14:11:11 roy Exp $ */ /* * Copyright (c) 2009 The NetBSD Foundation, Inc. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: termcap.c,v 1.4 2010/03/01 11:02:31 roy Exp $"); +__RCSID("$NetBSD: termcap.c,v 1.5 2010/03/02 14:11:11 roy Exp $"); #include <assert.h> #include <ctype.h> @@ -277,6 +277,16 @@ } } + /* \E\ is valid termcap. + * We need to escape the final \ for terminfo. */ + if (l > 2 && info[l - 1] == '\\' && + (info[l - 2] != '\\' && info[l - 2] != '^')) + { + if (l + 1 > len) + goto elen; + *ip++ = '\\'; + } + *ip = '\0'; return info; @@ -302,10 +312,10 @@ lp = 0; tok[2] = '\0'; - while ((token = strsep(&cap, ":")) != NULL) { - /* Trim whitespace */ - while (isspace((unsigned char)*token)) - token++; + for (token = _ti_get_token(&cap, ':'); + token != NULL; + token = _ti_get_token(&cap, ':')) + { if (token[0] == '\0') continue; name = token;