From f42fd8d0f118e0959a5c2d1cdf05d110574ad60f Mon Sep 17 00:00:00 2001 From: roy Date: Fri, 18 Mar 2011 10:42:54 +0000 Subject: [PATCH] Simplify some conversion by usig pre formatted strings and a function to print a parameter. --- lib/libterminfo/termcap.c | 115 ++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 60 deletions(-) diff --git a/lib/libterminfo/termcap.c b/lib/libterminfo/termcap.c index 090a071fb4e0..4dd2745a92f3 100644 --- a/lib/libterminfo/termcap.c +++ b/lib/libterminfo/termcap.c @@ -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 -__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 #include @@ -222,6 +222,21 @@ strname(const char *key) 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 @@ printchar(char **dst, const char **src) } /* 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 @@ strval(const char *val) } 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 @@ strval(const char *val) 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 @@ strval(const char *val) 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 @@ strval(const char *val) 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;