summaryrefslogtreecommitdiff
path: root/openbsd-compat/vis.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2003-05-18 22:24:09 +1000
committerDamien Miller <djm@mindrot.org>2003-05-18 22:24:09 +1000
commite323df6c4851b04386e747a009474f469fe97137 (patch)
tree2c4209855f9ed24545b1add919db8319b34ec992 /openbsd-compat/vis.c
parent0b8e9006d87075968dc402afa0f6ca359184b83b (diff)
- (djm) Sync openbsd-compat/ with OpenBSD CVS head
Diffstat (limited to 'openbsd-compat/vis.c')
-rw-r--r--openbsd-compat/vis.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/openbsd-compat/vis.c b/openbsd-compat/vis.c
index fc5741390..0d15886f0 100644
--- a/openbsd-compat/vis.c
+++ b/openbsd-compat/vis.c
@@ -34,7 +34,7 @@
34#if !defined(HAVE_STRNVIS) 34#if !defined(HAVE_STRNVIS)
35 35
36#if defined(LIBC_SCCS) && !defined(lint) 36#if defined(LIBC_SCCS) && !defined(lint)
37static char rcsid[] = "$OpenBSD: vis.c,v 1.8 2002/02/19 19:39:36 millert Exp $"; 37static char rcsid[] = "$OpenBSD: vis.c,v 1.11 2003/05/14 05:16:43 pjanzen Exp $";
38#endif /* LIBC_SCCS and not lint */ 38#endif /* LIBC_SCCS and not lint */
39 39
40#include <ctype.h> 40#include <ctype.h>
@@ -47,8 +47,9 @@ static char rcsid[] = "$OpenBSD: vis.c,v 1.8 2002/02/19 19:39:36 millert Exp $";
47 ((flag & VIS_SP) == 0 && (c) == ' ') || \ 47 ((flag & VIS_SP) == 0 && (c) == ' ') || \
48 ((flag & VIS_TAB) == 0 && (c) == '\t') || \ 48 ((flag & VIS_TAB) == 0 && (c) == '\t') || \
49 ((flag & VIS_NL) == 0 && (c) == '\n') || \ 49 ((flag & VIS_NL) == 0 && (c) == '\n') || \
50 ((flag & VIS_SAFE) && \ 50 ((flag & VIS_SAFE) && ((c) == '\b' || \
51 ((c) == '\b' || (c) == '\007' || (c) == '\r'))) 51 (c) == '\007' || (c) == '\r' || \
52 isgraph((u_char)(c)))))
52 53
53/* 54/*
54 * vis - visually encode characters 55 * vis - visually encode characters
@@ -169,16 +170,20 @@ strvis(dst, src, flag)
169 170
170int 171int
171strnvis(dst, src, siz, flag) 172strnvis(dst, src, siz, flag)
172 register char *dst; 173 char *dst;
173 register const char *src; 174 const char *src;
174 size_t siz; 175 size_t siz;
175 int flag; 176 int flag;
176{ 177{
177 register char c; 178 char c;
178 char *start, *end; 179 char *start, *end;
180 char tbuf[5];
181 int i;
179 182
183 i = 0;
180 for (start = dst, end = start + siz - 1; (c = *src) && dst < end; ) { 184 for (start = dst, end = start + siz - 1; (c = *src) && dst < end; ) {
181 if (isvisible(c)) { 185 if (isvisible(c)) {
186 i = 1;
182 *dst++ = c; 187 *dst++ = c;
183 if (c == '\\' && (flag & VIS_NOSLASH) == 0) { 188 if (c == '\\' && (flag & VIS_NOSLASH) == 0) {
184 /* need space for the extra '\\' */ 189 /* need space for the extra '\\' */
@@ -186,22 +191,25 @@ strnvis(dst, src, siz, flag)
186 *dst++ = '\\'; 191 *dst++ = '\\';
187 else { 192 else {
188 dst--; 193 dst--;
194 i = 2;
189 break; 195 break;
190 } 196 }
191 } 197 }
192 src++; 198 src++;
193 } else { 199 } else {
194 /* vis(3) requires up to 4 chars */ 200 i = vis(tbuf, c, flag, *++src) - tbuf;
195 if (dst + 3 < end) 201 if (dst + i <= end) {
196 dst = vis(dst, c, flag, *++src); 202 memcpy(dst, tbuf, i);
197 else 203 dst += i;
204 } else {
205 src--;
198 break; 206 break;
207 }
199 } 208 }
200 } 209 }
201 *dst = '\0'; 210 if (siz > 0)
202 if (dst >= end) { 211 *dst = '\0';
203 char tbuf[5]; 212 if (dst + i > end) {
204
205 /* adjust return value for truncation */ 213 /* adjust return value for truncation */
206 while ((c = *src)) 214 while ((c = *src))
207 dst += vis(tbuf, c, flag, *++src) - tbuf; 215 dst += vis(tbuf, c, flag, *++src) - tbuf;