Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libc/gen Prepare for strnvis functionality by providing ...
details: https://anonhg.NetBSD.org/src/rev/127f32cd9131
branches: trunk
changeset: 763166:127f32cd9131
user: christos <christos%NetBSD.org@localhost>
date: Sat Mar 12 03:24:08 2011 +0000
description:
Prepare for strnvis functionality by providing a length to the encoding
functions.
diffstat:
lib/libc/gen/vis.c | 64 ++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 50 insertions(+), 14 deletions(-)
diffs (200 lines):
diff -r d764fb665529 -r 127f32cd9131 lib/libc/gen/vis.c
--- a/lib/libc/gen/vis.c Sat Mar 12 03:02:58 2011 +0000
+++ b/lib/libc/gen/vis.c Sat Mar 12 03:24:08 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vis.c,v 1.41 2009/11/23 10:08:47 plunky Exp $ */
+/* $NetBSD: vis.c,v 1.42 2011/03/12 03:24:08 christos Exp $ */
/*-
* Copyright (c) 1989, 1993
@@ -57,7 +57,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: vis.c,v 1.41 2009/11/23 10:08:47 plunky Exp $");
+__RCSID("$NetBSD: vis.c,v 1.42 2011/03/12 03:24:08 christos Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
@@ -82,7 +82,7 @@
#include <stdio.h>
#include <string.h>
-static char *do_svis(char *, int, int, int, const char *);
+static char *do_svis(char *, size_t *, int, int, int, const char *);
#undef BELL
#define BELL '\a'
@@ -118,7 +118,7 @@
* This is do_hvis, for HTTP style (RFC 1808)
*/
static char *
-do_hvis(char *dst, int c, int flag, int nextc, const char *extra)
+do_hvis(char *dst, size_t *len, int c, int flag, int nextc, const char *extra)
{
if ((isascii(c) && isalnum(c))
@@ -127,8 +127,13 @@
/* extra */
|| c == '!' || c == '*' || c == '\'' || c == '(' || c == ')'
|| c == ',') {
- dst = do_svis(dst, c, flag, nextc, extra);
+ dst = do_svis(dst, len, c, flag, nextc, extra);
} else {
+ if (len) {
+ if (*len < 3)
+ return NULL;
+ *len -= 3;
+ }
*dst++ = '%';
*dst++ = xtoa(((unsigned int)c >> 4) & 0xf);
*dst++ = xtoa((unsigned int)c & 0xf);
@@ -142,7 +147,7 @@
* NB: No handling of long lines or CRLF.
*/
static char *
-do_mvis(char *dst, int c, int flag, int nextc, const char *extra)
+do_mvis(char *dst, size_t *len, int c, int flag, int nextc, const char *extra)
{
if ((c != '\n') &&
/* Space at the end of the line */
@@ -151,11 +156,16 @@
(!isspace(c) && (c < 33 || (c > 60 && c < 62) || c > 126)) ||
/* Specific char to be escaped */
strchr("#$@[\\]^`{|}~", c) != NULL)) {
+ if (len) {
+ if (*len < 3)
+ return NULL;
+ *len -= 3;
+ }
*dst++ = '=';
*dst++ = XTOA(((unsigned int)c >> 4) & 0xf);
*dst++ = XTOA((unsigned int)c & 0xf);
} else {
- dst = do_svis(dst, c, flag, nextc, extra);
+ dst = do_svis(dst, len, c, flag, nextc, extra);
}
return dst;
}
@@ -170,16 +180,27 @@
* backslash-protected.
*/
static char *
-do_svis(char *dst, int c, int flag, int nextc, const char *extra)
+do_svis(char *dst, size_t *len, int c, int flag, int nextc, const char *extra)
{
int isextra;
isextra = strchr(extra, c) != NULL;
+ size_t olen = len ? *len : 0;
+#define HAVE(x) \
+ do { \
+ if (len) { \
+ if (*len < (x)) \
+ goto out; \
+ *len -= (x); \
+ } \
+ } while (/*CONSTCOND*/0)
if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) ||
((flag & VIS_SAFE) && issafe(c)))) {
+ HAVE(1);
*dst++ = c;
return dst;
}
if (flag & VIS_CSTYLE) {
+ HAVE(2);
switch (c) {
case '\n':
*dst++ = '\\'; *dst++ = 'n';
@@ -208,6 +229,7 @@
case '\0':
*dst++ = '\\'; *dst++ = '0';
if (isoctal(nextc)) {
+ HAVE(2);
*dst++ = '0';
*dst++ = '0';
}
@@ -217,32 +239,46 @@
*dst++ = '\\'; *dst++ = c;
return dst;
}
+ if (len)
+ *len = olen;
}
}
if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) {
+ HAVE(4);
*dst++ = '\\';
*dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + '0';
*dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + '0';
*dst++ = (c & 07) + '0';
} else {
- if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\';
+ if ((flag & VIS_NOSLASH) == 0) {
+ HAVE(1);
+ *dst++ = '\\';
+ }
+
if (c & 0200) {
+ HAVE(1);
c &= 0177; *dst++ = 'M';
}
+
if (iscntrl(c)) {
+ HAVE(2);
*dst++ = '^';
if (c == 0177)
*dst++ = '?';
else
*dst++ = c + '@';
} else {
+ HAVE(2);
*dst++ = '-'; *dst++ = c;
}
}
return dst;
+out:
+ *len = olen;
+ return NULL;
}
-typedef char *(*visfun_t)(char *, int, int, int, const char *);
+typedef char *(*visfun_t)(char *, size_t *, int, int, int, const char *);
/*
* Return the appropriate encoding function depending on the flags given.
@@ -275,7 +311,7 @@
return dst;
}
f = getvisfun(flag);
- dst = (*f)(dst, c, flag, nextc, nextra);
+ dst = (*f)(dst, NULL, c, flag, nextc, nextra);
free(nextra);
*dst = '\0';
return dst;
@@ -316,7 +352,7 @@
}
f = getvisfun(flag);
for (start = dst; (c = *src++) != '\0'; /* empty */)
- dst = (*f)(dst, c, flag, *src, nextra);
+ dst = (*f)(dst, NULL, c, flag, *src, nextra);
free(nextra);
*dst = '\0';
return (int)(dst - start);
@@ -344,7 +380,7 @@
f = getvisfun(flag);
for (start = dst; len > 0; len--) {
c = *src++;
- dst = (*f)(dst, c, flag, len > 1 ? *src : '\0', nextra);
+ dst = (*f)(dst, NULL, c, flag, len > 1 ? *src : '\0', nextra);
}
free(nextra);
*dst = '\0';
@@ -371,7 +407,7 @@
return dst;
}
f = getvisfun(flag);
- dst = (*f)(dst, uc, flag, nextc, extra);
+ dst = (*f)(dst, NULL, uc, flag, nextc, extra);
free(extra);
*dst = '\0';
return dst;
Home |
Main Index |
Thread Index |
Old Index