diff options
Diffstat (limited to 'pkgtools/libnbcompat/files/vis.c')
-rw-r--r-- | pkgtools/libnbcompat/files/vis.c | 195 |
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 |