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;