diff options
Diffstat (limited to 'openbsd-compat/vis.c')
-rw-r--r-- | openbsd-compat/vis.c | 36 |
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) |
37 | static char rcsid[] = "$OpenBSD: vis.c,v 1.8 2002/02/19 19:39:36 millert Exp $"; | 37 | static 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 | ||
170 | int | 171 | int |
171 | strnvis(dst, src, siz, flag) | 172 | strnvis(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; |