summaryrefslogtreecommitdiff
path: root/pkgtools/libnbcompat/files/vis.c
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/libnbcompat/files/vis.c')
-rw-r--r--pkgtools/libnbcompat/files/vis.c195
1 files changed, 99 insertions, 96 deletions
diff --git a/pkgtools/libnbcompat/files/vis.c b/pkgtools/libnbcompat/files/vis.c
index 91cbc065ff7..dd9cc1da1c1 100644
--- a/pkgtools/libnbcompat/files/vis.c
+++ b/pkgtools/libnbcompat/files/vis.c
@@ -1,7 +1,6 @@
-/* $NetBSD: vis.c,v 1.6 2004/08/16 17:24:57 jlam Exp $ */
+/* $NetBSD: vis.c,v 1.7 2004/08/23 03:32:13 jlam Exp $ */
/*-
- * Copyright (c) 1999 The NetBSD Foundation, Inc.
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
@@ -34,36 +33,54 @@
* SUCH DAMAGE.
*/
-#include "nbcompat/nbconfig.h"
-#include "nbcompat/nbtypes.h"
-
-#if HAVE_SYS_CDEFS_H
-#include <sys/cdefs.h>
-#endif
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include <nbcompat.h>
+#include <nbcompat/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: vis.c,v 1.6 2004/08/16 17:24:57 jlam Exp $");
+__RCSID("$NetBSD: vis.c,v 1.7 2004/08/23 03:32:13 jlam Exp $");
#endif /* LIBC_SCCS and not lint */
-/* #include "namespace.h" */
-#include <sys/types.h>
-
-#if HAVE_ASSERT_H
-#include <assert.h>
+#if 0
+#include "namespace.h"
#endif
+#include <nbcompat/types.h>
-#include "nbcompat/vis.h"
-#include <stdlib.h>
+#include <nbcompat/assert.h>
+#include <nbcompat/vis.h>
+#include <nbcompat/stdlib.h>
#if 0
-#ifndef __ELF__
-#define _strsvis strsvis
-#define _strsvisx strsvisx
-#define _strvis strvis
-#define _strvisx strvisx
-#define _svis svis
-#define _vis vis
-#else
#ifdef __weak_alias
__weak_alias(strsvis,_strsvis)
__weak_alias(strsvisx,_strsvisx)
@@ -73,44 +90,37 @@ __weak_alias(svis,_svis)
__weak_alias(vis,_vis)
#endif
#endif
-#endif
-#include <ctype.h>
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
+#include <nbcompat/ctype.h>
+#include <nbcompat/limits.h>
+#include <nbcompat/stdio.h>
+#include <nbcompat/string.h>
#undef BELL
-#if defined(__STDC__)
#define BELL '\a'
-#else
-#define BELL '\007'
-#endif
-
-static const char empty[] = "";
#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
#define iswhite(c) (c == ' ' || c == '\t' || c == '\n')
#define issafe(c) (c == '\b' || c == BELL || c == '\r')
#define xtoa(c) "0123456789abcdef"[c]
-#define MAXEXTRAS 5
+#define MAXEXTRAS 5
#define MAKEEXTRALIST(flag, extra, orig) \
do { \
const char *o = orig; \
- char *e; \
+ char *e; \
while (*o++) \
continue; \
- extra = malloc((size_t)((o - orig) + MAXEXTRAS)); \
+ extra = alloca((size_t)((o - orig) + MAXEXTRAS)); \
for (o = orig, e = extra; (*e++ = *o++) != '\0';) \
continue; \
e--; \
- if (flag & VIS_SP) *e++ = ' '; \
+ if (flag & VIS_SP) *e++ = ' '; \
if (flag & VIS_TAB) *e++ = '\t'; \
- if (flag & VIS_NL) *e++ = '\n'; \
- if ((flag & VIS_NOSLASH) == 0) *e++ = '\\'; \
+ if (flag & VIS_NL) *e++ = '\n'; \
+ if ((flag & VIS_NOSLASH) == 0) *e++ = '\\'; \
*e = '\0'; \
} while (/*CONSTCOND*/0)
@@ -119,7 +129,7 @@ do { \
* This is HVIS, the macro of vis used to HTTP style (RFC 1808)
*/
#define HVIS(dst, c, flag, nextc, extra) \
-do \
+do \
if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) { \
*dst++ = '%'; \
*dst++ = xtoa(((unsigned int)c >> 4) & 0xf); \
@@ -128,7 +138,7 @@ do \
SVIS(dst, c, flag, nextc, extra); \
} \
while (/*CONSTCOND*/0)
-
+
/*
* This is SVIS, the central macro of vis.
* dst: Pointer to the destination buffer
@@ -140,49 +150,53 @@ while (/*CONSTCOND*/0)
*/
#define SVIS(dst, c, flag, nextc, extra) \
do { \
- int isextra, isc; \
+ int isextra; \
isextra = strchr(extra, c) != NULL; \
if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) || \
((flag & VIS_SAFE) && issafe(c)))) { \
*dst++ = c; \
break; \
} \
- isc = 0; \
if (flag & VIS_CSTYLE) { \
switch (c) { \
case '\n': \
- isc = 1; *dst++ = '\\'; *dst++ = 'n'; \
- break; \
+ *dst++ = '\\'; *dst++ = 'n'; \
+ continue; \
case '\r': \
- isc = 1; *dst++ = '\\'; *dst++ = 'r'; \
- break; \
+ *dst++ = '\\'; *dst++ = 'r'; \
+ continue; \
case '\b': \
- isc = 1; *dst++ = '\\'; *dst++ = 'b'; \
- break; \
+ *dst++ = '\\'; *dst++ = 'b'; \
+ continue; \
case BELL: \
- isc = 1; *dst++ = '\\'; *dst++ = 'a'; \
- break; \
+ *dst++ = '\\'; *dst++ = 'a'; \
+ continue; \
case '\v': \
- isc = 1; *dst++ = '\\'; *dst++ = 'v'; \
- break; \
+ *dst++ = '\\'; *dst++ = 'v'; \
+ continue; \
case '\t': \
- isc = 1; *dst++ = '\\'; *dst++ = 't'; \
- break; \
+ *dst++ = '\\'; *dst++ = 't'; \
+ continue; \
case '\f': \
- isc = 1; *dst++ = '\\'; *dst++ = 'f'; \
- break; \
+ *dst++ = '\\'; *dst++ = 'f'; \
+ continue; \
case ' ': \
- isc = 1; *dst++ = '\\'; *dst++ = 's'; \
- break; \
+ *dst++ = '\\'; *dst++ = 's'; \
+ continue; \
case '\0': \
- isc = 1; *dst++ = '\\'; *dst++ = '0'; \
+ *dst++ = '\\'; *dst++ = '0'; \
if (isoctal(nextc)) { \
*dst++ = '0'; \
*dst++ = '0'; \
} \
+ continue; \
+ default: \
+ if (isgraph(c)) { \
+ *dst++ = '\\'; *dst++ = c; \
+ continue; \
+ } \
} \
} \
- if (isc) break; \
if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) { \
*dst++ = '\\'; \
*dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + '0'; \
@@ -225,11 +239,10 @@ svis(dst, c, flag, nextc, extra)
else
SVIS(dst, c, flag, nextc, nextra);
*dst = '\0';
- free(nextra);
return(dst);
}
-#ifndef HAVE_STRSVIS
+
/*
* strsvis, strsvisx - visually encode characters from src into dst
*
@@ -237,24 +250,25 @@ svis(dst, c, flag, nextc, extra)
* be encoded, too. These functions are useful e. g. to
* encode strings in such a way so that they are not interpreted
* by a shell.
- *
+ *
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
- * is returned.
+ * is returned.
*
* Strsvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
*/
int
-strsvis(dst, src, flag, extra)
+strsvis(dst, csrc, flag, extra)
char *dst;
- const char *src;
+ const char *csrc;
int flag;
const char *extra;
{
- char c;
+ int c;
char *start;
char *nextra;
+ const unsigned char *src = (const unsigned char *)csrc;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL);
@@ -268,22 +282,22 @@ strsvis(dst, src, flag, extra)
SVIS(dst, c, flag, *src, nextra);
}
*dst = '\0';
- free(nextra);
return (dst - start);
}
int
-strsvisx(dst, src, len, flag, extra)
+strsvisx(dst, csrc, len, flag, extra)
char *dst;
- const char *src;
+ const char *csrc;
size_t len;
int flag;
const char *extra;
{
- char c;
+ int c;
char *start;
char *nextra;
+ const unsigned char *src = (const unsigned char *)csrc;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL);
@@ -302,11 +316,8 @@ strsvisx(dst, src, len, flag, extra)
}
}
*dst = '\0';
- free(nextra);
return (dst - start);
}
-#endif
-
/*
* vis - visually encode characters
@@ -315,29 +326,28 @@ char *
vis(dst, c, flag, nextc)
char *dst;
int c, flag, nextc;
-
+
{
char *extra;
_DIAGASSERT(dst != NULL);
- MAKEEXTRALIST(flag, extra, empty);
+ MAKEEXTRALIST(flag, extra, "");
if (flag & VIS_HTTPSTYLE)
- HVIS(dst, c, flag, nextc, extra);
+ HVIS(dst, c, flag, nextc, extra);
else
- SVIS(dst, c, flag, nextc, extra);
+ SVIS(dst, c, flag, nextc, extra);
*dst = '\0';
- free(extra);
return (dst);
}
-#if HAVE_STRVIS
+
/*
* strvis, strvisx - visually encode characters from src into dst
- *
+ *
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
- * is returned.
+ * is returned.
*
* Strvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
@@ -349,12 +359,9 @@ strvis(dst, src, flag)
int flag;
{
char *extra;
- int ret;
- MAKEEXTRALIST(flag, extra, empty);
- ret = strsvis(dst, src, flag, extra);
- free(extra);
- return(ret);
+ MAKEEXTRALIST(flag, extra, "");
+ return (strsvis(dst, src, flag, extra));
}
@@ -366,11 +373,7 @@ strvisx(dst, src, len, flag)
int flag;
{
char *extra;
- int ret;
- MAKEEXTRALIST(flag, extra, empty);
- ret = strsvisx(dst, src, len, flag, extra);
- free(extra);
- return(ret);
+ MAKEEXTRALIST(flag, extra, "");
+ return (strsvisx(dst, src, len, flag, extra));
}
-#endif