X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fquotearg.c;h=2a7ba4c445ba42b8aaf913e810c41ce8e5be8c18;hb=c57b0256714cb35dcef48b8bc41814ce326d8127;hp=9ed8a5fb12f517bbbe2b1827754fc8c051e68915;hpb=8ed25ee69927e755445a4d9b8dcc5d03044c709a;p=gnulib.git diff --git a/lib/quotearg.c b/lib/quotearg.c index 9ed8a5fb1..2a7ba4c44 100644 --- a/lib/quotearg.c +++ b/lib/quotearg.c @@ -1,5 +1,5 @@ /* quotearg.c - quote arguments for output - Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +21,9 @@ # include #endif +#if HAVE_STDDEF_H +# include /* For the definition of size_t on windows w/MSVC. */ +#endif #include #include #include @@ -63,13 +66,7 @@ # include #endif -#if HAVE_MBRTOWC -size_t mbrtowc (); -# ifdef mbstate_t -# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) -# define mbsinit(ps) 1 -# endif -#else +#if !HAVE_MBRTOWC /* Disable multibyte processing entirely. Since MB_CUR_MAX is 1, the other macros are defined only for documentation and to satisfy C syntax. */ @@ -92,15 +89,14 @@ size_t mbrtowc (); #define INT_BITS (sizeof (int) * CHAR_BIT) #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII)) -/* Undefine to protect against the definition in wctype.h of solaris2.6. */ -# undef ISASCII -# define ISASCII(c) 1 +# define IN_CTYPE_DOMAIN(c) 1 #else -# define ISASCII(c) isascii (c) +# define IN_CTYPE_DOMAIN(c) isascii(c) #endif + /* Undefine to protect against the definition in wctype.h of solaris2.6. */ #undef ISPRINT -#define ISPRINT(c) (ISASCII (c) && isprint (c)) +#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) struct quoting_options { @@ -530,12 +526,17 @@ static char * quotearg_n_options (int n, char const *arg, struct quoting_options const *options) { - static unsigned int nslots; - static struct slotvec + /* Preallocate a slot 0 buffer, so that the caller can always quote + one small component of a "memory exhausted" message in slot 0. */ + static char slot0[256]; + static unsigned int nslots = 1; + struct slotvec { size_t size; char *val; - } *slotvec; + }; + static struct slotvec slotvec0 = {sizeof slot0, slot0}; + static struct slotvec *slotvec = &slotvec0; if (nslots <= n) { @@ -543,6 +544,11 @@ quotearg_n_options (int n, char const *arg, size_t s = n1 * sizeof (struct slotvec); if (! (0 < n1 && n1 == s / sizeof (struct slotvec))) abort (); + if (slotvec == &slotvec0) + { + slotvec = (struct slotvec *) xmalloc (sizeof (struct slotvec)); + *slotvec = slotvec0; + } slotvec = (struct slotvec *) xrealloc (slotvec, s); memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec)); nslots = n; @@ -556,7 +562,7 @@ quotearg_n_options (int n, char const *arg, if (size <= qsize) { slotvec[n].size = size = qsize + 1; - slotvec[n].val = val = xrealloc (val, size); + slotvec[n].val = val = xrealloc (val == slot0 ? 0 : val, size); quotearg_buffer (val, size, arg, (size_t) -1, options); }