X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/b0ce6046682724c333e1444c86dfcfe3d51d8264..fe22d5d20ff5a88a3a0dba28a11623b235a422ab:/lib/quotearg.c diff --git a/lib/quotearg.c b/lib/quotearg.c index 2a7ba4c4..750426c2 100644 --- a/lib/quotearg.c +++ b/lib/quotearg.c @@ -1,5 +1,5 @@ /* quotearg.c - quote arguments for output - Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2002 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 @@ -25,8 +25,8 @@ # include /* For the definition of size_t on windows w/MSVC. */ #endif #include -#include -#include +#include "quotearg.h" +#include "xalloc.h" #include @@ -44,9 +44,15 @@ #ifndef CHAR_BIT # define CHAR_BIT 8 #endif +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif #ifndef UCHAR_MAX # define UCHAR_MAX ((unsigned char) -1) #endif +#ifndef UINT_MAX +# define UINT_MAX ((unsigned int) -1) +#endif #if HAVE_C_BACKSLASH_A # define ALERT_CHAR '\a' @@ -63,6 +69,11 @@ #endif #if HAVE_WCHAR_H + +/* BSD/OS 4.1 wchar.h requires FILE and struct tm to be declared. */ +# include +# include + # include #endif @@ -73,8 +84,12 @@ # undef MB_CUR_MAX # define MB_CUR_MAX 1 # define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0) -# define mbsinit(ps) 1 # define iswprint(wc) ISPRINT ((unsigned char) (wc)) +# undef HAVE_MBSINIT +#endif + +#if !defined mbsinit && !HAVE_MBSINIT +# define mbsinit(ps) 1 #endif #ifndef iswprint @@ -290,6 +305,16 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize, c = arg[i]; switch (c) { + case '\0': + if (backslash_escapes) + { + STORE ('\\'); + STORE ('0'); + STORE ('0'); + c = '0'; + } + break; + case '?': switch (quoting_style) { @@ -305,8 +330,8 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize, case '<': case '=': case '>': /* Escape the second '?' in what would otherwise be a trigraph. */ - i += 2; c = arg[i + 2]; + i += 2; STORE ('?'); STORE ('\\'); STORE ('?'); @@ -516,20 +541,22 @@ quotearg_buffer (char *buffer, size_t buffersize, p->style, p); } -/* Use storage slot N to return a quoted version of the string ARG. +/* Use storage slot N to return a quoted version of argument ARG. + ARG is of size ARGSIZE, but if that is -1, ARG is a null-terminated string. OPTIONS specifies the quoting options. The returned value points to static storage that can be reused by the next call to this function with the same value of N. N must be nonnegative. N is deliberately declared with type "int" to allow for future extensions (using negative values). */ static char * -quotearg_n_options (int n, char const *arg, +quotearg_n_options (int n, char const *arg, size_t argsize, struct quoting_options const *options) { /* 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; + unsigned int n0 = n; struct slotvec { size_t size; @@ -538,32 +565,38 @@ quotearg_n_options (int n, char const *arg, static struct slotvec slotvec0 = {sizeof slot0, slot0}; static struct slotvec *slotvec = &slotvec0; - if (nslots <= n) + if (n < 0) + abort (); + + if (nslots <= n0) { - int n1 = n + 1; - size_t s = n1 * sizeof (struct slotvec); - if (! (0 < n1 && n1 == s / sizeof (struct slotvec))) - abort (); + unsigned int n1 = n0 + 1; + size_t s = n1 * sizeof *slotvec; + + if (SIZE_MAX / UINT_MAX <= sizeof *slotvec + && n1 != s / sizeof *slotvec) + xalloc_die (); + if (slotvec == &slotvec0) { - slotvec = (struct slotvec *) xmalloc (sizeof (struct slotvec)); + slotvec = (struct slotvec *) xmalloc (sizeof *slotvec); *slotvec = slotvec0; } slotvec = (struct slotvec *) xrealloc (slotvec, s); - memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec)); - nslots = n; + memset (slotvec + nslots, 0, (n1 - nslots) * sizeof *slotvec); + nslots = n1; } { size_t size = slotvec[n].size; char *val = slotvec[n].val; - size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options); + size_t qsize = quotearg_buffer (val, size, arg, argsize, options); if (size <= qsize) { slotvec[n].size = size = qsize + 1; slotvec[n].val = val = xrealloc (val == slot0 ? 0 : val, size); - quotearg_buffer (val, size, arg, (size_t) -1, options); + quotearg_buffer (val, size, arg, argsize, options); } return val; @@ -571,9 +604,9 @@ quotearg_n_options (int n, char const *arg, } char * -quotearg_n (unsigned int n, char const *arg) +quotearg_n (int n, char const *arg) { - return quotearg_n_options (n, arg, &default_quoting_options); + return quotearg_n_options (n, arg, (size_t) -1, &default_quoting_options); } char * @@ -582,13 +615,29 @@ quotearg (char const *arg) return quotearg_n (0, arg); } -char * -quotearg_n_style (unsigned int n, enum quoting_style s, char const *arg) +/* Return quoting options for STYLE, with no extra quoting. */ +static struct quoting_options +quoting_options_from_style (enum quoting_style style) { struct quoting_options o; - o.style = s; + o.style = style; memset (o.quote_these_too, 0, sizeof o.quote_these_too); - return quotearg_n_options (n, arg, &o); + return o; +} + +char * +quotearg_n_style (int n, enum quoting_style s, char const *arg) +{ + struct quoting_options const o = quoting_options_from_style (s); + return quotearg_n_options (n, arg, (size_t) -1, &o); +} + +char * +quotearg_n_style_mem (int n, enum quoting_style s, + char const *arg, size_t argsize) +{ + struct quoting_options const o = quoting_options_from_style (s); + return quotearg_n_options (n, arg, argsize, &o); } char * @@ -603,7 +652,7 @@ quotearg_char (char const *arg, char ch) struct quoting_options options; options = default_quoting_options; set_char_quoting (&options, ch, 1); - return quotearg_n_options (0, arg, &options); + return quotearg_n_options (0, arg, (size_t) -1, &options); } char *