Home | History | Annotate | Download | only in lib
      1 /* quotearg.c - quote arguments for output
      2 
      3    Copyright (C) 1998-2002, 2004-2012 Free Software Foundation, Inc.
      4 
      5    This program is free software: you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3 of the License, or
      8    (at your option) any later version.
      9 
     10    This program is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14 
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17 
     18 /* Written by Paul Eggert <eggert (at) twinsun.com> */
     19 
     20 /* Without this pragma, gcc 4.7.0 20111124 mistakenly suggests that
     21    the quoting_options_from_style function might be candidate for
     22    attribute 'pure'  */
     23 #if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
     24 # pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
     25 #endif
     26 
     27 #include <config.h>
     28 
     29 #include "quotearg.h"
     30 #include "quote.h"
     31 
     32 #include "xalloc.h"
     33 #include "c-strcaseeq.h"
     34 #include "localcharset.h"
     35 
     36 #include <ctype.h>
     37 #include <errno.h>
     38 #include <limits.h>
     39 #include <stdbool.h>
     40 #include <stdlib.h>
     41 #include <string.h>
     42 #include <wchar.h>
     43 #include <wctype.h>
     44 
     45 #include "gettext.h"
     46 #define _(msgid) gettext (msgid)
     47 #define N_(msgid) msgid
     48 
     49 #ifndef SIZE_MAX
     50 # define SIZE_MAX ((size_t) -1)
     51 #endif
     52 
     53 #define INT_BITS (sizeof (int) * CHAR_BIT)
     54 
     55 struct quoting_options
     56 {
     57   /* Basic quoting style.  */
     58   enum quoting_style style;
     59 
     60   /* Additional flags.  Bitwise combination of enum quoting_flags.  */
     61   int flags;
     62 
     63   /* Quote the characters indicated by this bit vector even if the
     64      quoting style would not normally require them to be quoted.  */
     65   unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
     66 
     67   /* The left quote for custom_quoting_style.  */
     68   char const *left_quote;
     69 
     70   /* The right quote for custom_quoting_style.  */
     71   char const *right_quote;
     72 };
     73 
     74 /* Names of quoting styles.  */
     75 char const *const quoting_style_args[] =
     76 {
     77   "literal",
     78   "shell",
     79   "shell-always",
     80   "c",
     81   "c-maybe",
     82   "escape",
     83   "locale",
     84   "clocale",
     85   0
     86 };
     87 
     88 /* Correspondences to quoting style names.  */
     89 enum quoting_style const quoting_style_vals[] =
     90 {
     91   literal_quoting_style,
     92   shell_quoting_style,
     93   shell_always_quoting_style,
     94   c_quoting_style,
     95   c_maybe_quoting_style,
     96   escape_quoting_style,
     97   locale_quoting_style,
     98   clocale_quoting_style
     99 };
    100 
    101 /* The default quoting options.  */
    102 static struct quoting_options default_quoting_options;
    103 
    104 /* Allocate a new set of quoting options, with contents initially identical
    105    to O if O is not null, or to the default if O is null.
    106    It is the caller's responsibility to free the result.  */
    107 struct quoting_options *
    108 clone_quoting_options (struct quoting_options *o)
    109 {
    110   int e = errno;
    111   struct quoting_options *p = xmemdup (o ? o : &default_quoting_options,
    112                                        sizeof *o);
    113   errno = e;
    114   return p;
    115 }
    116 
    117 /* Get the value of O's quoting style.  If O is null, use the default.  */
    118 enum quoting_style
    119 get_quoting_style (struct quoting_options *o)
    120 {
    121   return (o ? o : &default_quoting_options)->style;
    122 }
    123 
    124 /* In O (or in the default if O is null),
    125    set the value of the quoting style to S.  */
    126 void
    127 set_quoting_style (struct quoting_options *o, enum quoting_style s)
    128 {
    129   (o ? o : &default_quoting_options)->style = s;
    130 }
    131 
    132 /* In O (or in the default if O is null),
    133    set the value of the quoting options for character C to I.
    134    Return the old value.  Currently, the only values defined for I are
    135    0 (the default) and 1 (which means to quote the character even if
    136    it would not otherwise be quoted).  */
    137 int
    138 set_char_quoting (struct quoting_options *o, char c, int i)
    139 {
    140   unsigned char uc = c;
    141   unsigned int *p =
    142     (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
    143   int shift = uc % INT_BITS;
    144   int r = (*p >> shift) & 1;
    145   *p ^= ((i & 1) ^ r) << shift;
    146   return r;
    147 }
    148 
    149 /* In O (or in the default if O is null),
    150    set the value of the quoting options flag to I, which can be a
    151    bitwise combination of enum quoting_flags, or 0 for default
    152    behavior.  Return the old value.  */
    153 int
    154 set_quoting_flags (struct quoting_options *o, int i)
    155 {
    156   int r;
    157   if (!o)
    158     o = &default_quoting_options;
    159   r = o->flags;
    160   o->flags = i;
    161   return r;
    162 }
    163 
    164 void
    165 set_custom_quoting (struct quoting_options *o,
    166                     char const *left_quote, char const *right_quote)
    167 {
    168   if (!o)
    169     o = &default_quoting_options;
    170   o->style = custom_quoting_style;
    171   if (!left_quote || !right_quote)
    172     abort ();
    173   o->left_quote = left_quote;
    174   o->right_quote = right_quote;
    175 }
    176 
    177 /* Return quoting options for STYLE, with no extra quoting.  */
    178 static struct quoting_options /* NOT PURE!! */
    179 quoting_options_from_style (enum quoting_style style)
    180 {
    181   struct quoting_options o = { 0, 0, { 0 }, NULL, NULL };
    182   if (style == custom_quoting_style)
    183     abort ();
    184   o.style = style;
    185   return o;
    186 }
    187 
    188 /* MSGID approximates a quotation mark.  Return its translation if it
    189    has one; otherwise, return either it or "\"", depending on S.
    190 
    191    S is either clocale_quoting_style or locale_quoting_style.  */
    192 static char const *
    193 gettext_quote (char const *msgid, enum quoting_style s)
    194 {
    195   char const *translation = _(msgid);
    196   char const *locale_code;
    197 
    198   if (translation != msgid)
    199     return translation;
    200 
    201   /* For UTF-8 and GB-18030, use single quotes U+2018 and U+2019.
    202      Here is a list of other locales that include U+2018 and U+2019:
    203 
    204         ISO-8859-7   0xA1                 KOI8-T       0x91
    205         CP869        0x8B                 CP874        0x91
    206         CP932        0x81 0x65            CP936        0xA1 0xAE
    207         CP949        0xA1 0xAE            CP950        0xA1 0xA5
    208         CP1250       0x91                 CP1251       0x91
    209         CP1252       0x91                 CP1253       0x91
    210         CP1254       0x91                 CP1255       0x91
    211         CP1256       0x91                 CP1257       0x91
    212         EUC-JP       0xA1 0xC6            EUC-KR       0xA1 0xAE
    213         EUC-TW       0xA1 0xE4            BIG5         0xA1 0xA5
    214         BIG5-HKSCS   0xA1 0xA5            EUC-CN       0xA1 0xAE
    215         GBK          0xA1 0xAE            Georgian-PS  0x91
    216         PT154        0x91
    217 
    218      None of these is still in wide use; using iconv is overkill.  */
    219   locale_code = locale_charset ();
    220   if (STRCASEEQ (locale_code, "UTF-8", 'U','T','F','-','8',0,0,0,0))
    221     return msgid[0] == '`' ? "\xe2\x80\x98": "\xe2\x80\x99";
    222   if (STRCASEEQ (locale_code, "GB18030", 'G','B','1','8','0','3','0',0,0))
    223     return msgid[0] == '`' ? "\xa1\ae": "\xa1\xaf";
    224 
    225   return (s == clocale_quoting_style ? "\"" : "'");
    226 }
    227 
    228 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
    229    argument ARG (of size ARGSIZE), using QUOTING_STYLE, FLAGS, and
    230    QUOTE_THESE_TOO to control quoting.
    231    Terminate the output with a null character, and return the written
    232    size of the output, not counting the terminating null.
    233    If BUFFERSIZE is too small to store the output string, return the
    234    value that would have been returned had BUFFERSIZE been large enough.
    235    If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
    236 
    237    This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
    238    ARGSIZE, O), except it breaks O into its component pieces and is
    239    not careful about errno.  */
    240 
    241 static size_t
    242 quotearg_buffer_restyled (char *buffer, size_t buffersize,
    243                           char const *arg, size_t argsize,
    244                           enum quoting_style quoting_style, int flags,
    245                           unsigned int const *quote_these_too,
    246                           char const *left_quote,
    247                           char const *right_quote)
    248 {
    249   size_t i;
    250   size_t len = 0;
    251   char const *quote_string = 0;
    252   size_t quote_string_len = 0;
    253   bool backslash_escapes = false;
    254   bool unibyte_locale = MB_CUR_MAX == 1;
    255   bool elide_outer_quotes = (flags & QA_ELIDE_OUTER_QUOTES) != 0;
    256 
    257 #define STORE(c) \
    258     do \
    259       { \
    260         if (len < buffersize) \
    261           buffer[len] = (c); \
    262         len++; \
    263       } \
    264     while (0)
    265 
    266   switch (quoting_style)
    267     {
    268     case c_maybe_quoting_style:
    269       quoting_style = c_quoting_style;
    270       elide_outer_quotes = true;
    271       /* Fall through.  */
    272     case c_quoting_style:
    273       if (!elide_outer_quotes)
    274         STORE ('"');
    275       backslash_escapes = true;
    276       quote_string = "\"";
    277       quote_string_len = 1;
    278       break;
    279 
    280     case escape_quoting_style:
    281       backslash_escapes = true;
    282       elide_outer_quotes = false;
    283       break;
    284 
    285     case locale_quoting_style:
    286     case clocale_quoting_style:
    287     case custom_quoting_style:
    288       {
    289         if (quoting_style != custom_quoting_style)
    290           {
    291             /* TRANSLATORS:
    292                Get translations for open and closing quotation marks.
    293                The message catalog should translate "`" to a left
    294                quotation mark suitable for the locale, and similarly for
    295                "'".  For example, a French Unicode local should translate
    296                these to U+00AB (LEFT-POINTING DOUBLE ANGLE
    297                QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
    298                QUOTATION MARK), respectively.
    299 
    300                If the catalog has no translation, we will try to
    301                use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
    302                Unicode U+2019 (RIGHT SINGLE QUOTATION MARK).  If the
    303                current locale is not Unicode, locale_quoting_style
    304                will quote 'like this', and clocale_quoting_style will
    305                quote "like this".  You should always include translations
    306                for "`" and "'" even if U+2018 and U+2019 are appropriate
    307                for your locale.
    308 
    309                If you don't know what to put here, please see
    310                <http://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
    311                and use glyphs suitable for your language.  */
    312             left_quote = gettext_quote (N_("`"), quoting_style);
    313             right_quote = gettext_quote (N_("'"), quoting_style);
    314           }
    315         if (!elide_outer_quotes)
    316           for (quote_string = left_quote; *quote_string; quote_string++)
    317             STORE (*quote_string);
    318         backslash_escapes = true;
    319         quote_string = right_quote;
    320         quote_string_len = strlen (quote_string);
    321       }
    322       break;
    323 
    324     case shell_quoting_style:
    325       quoting_style = shell_always_quoting_style;
    326       elide_outer_quotes = true;
    327       /* Fall through.  */
    328     case shell_always_quoting_style:
    329       if (!elide_outer_quotes)
    330         STORE ('\'');
    331       quote_string = "'";
    332       quote_string_len = 1;
    333       break;
    334 
    335     case literal_quoting_style:
    336       elide_outer_quotes = false;
    337       break;
    338 
    339     default:
    340       abort ();
    341     }
    342 
    343   for (i = 0;  ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize);  i++)
    344     {
    345       unsigned char c;
    346       unsigned char esc;
    347       bool is_right_quote = false;
    348 
    349       if (backslash_escapes
    350           && quote_string_len
    351           && i + quote_string_len <= argsize
    352           && memcmp (arg + i, quote_string, quote_string_len) == 0)
    353         {
    354           if (elide_outer_quotes)
    355             goto force_outer_quoting_style;
    356           is_right_quote = true;
    357         }
    358 
    359       c = arg[i];
    360       switch (c)
    361         {
    362         case '\0':
    363           if (backslash_escapes)
    364             {
    365               if (elide_outer_quotes)
    366                 goto force_outer_quoting_style;
    367               STORE ('\\');
    368               /* If quote_string were to begin with digits, we'd need to
    369                  test for the end of the arg as well.  However, it's
    370                  hard to imagine any locale that would use digits in
    371                  quotes, and set_custom_quoting is documented not to
    372                  accept them.  */
    373               if (i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9')
    374                 {
    375                   STORE ('0');
    376                   STORE ('0');
    377                 }
    378               c = '0';
    379               /* We don't have to worry that this last '0' will be
    380                  backslash-escaped because, again, quote_string should
    381                  not start with it and because quote_these_too is
    382                  documented as not accepting it.  */
    383             }
    384           else if (flags & QA_ELIDE_NULL_BYTES)
    385             continue;
    386           break;
    387 
    388         case '?':
    389           switch (quoting_style)
    390             {
    391             case shell_always_quoting_style:
    392               if (elide_outer_quotes)
    393                 goto force_outer_quoting_style;
    394               break;
    395 
    396             case c_quoting_style:
    397               if ((flags & QA_SPLIT_TRIGRAPHS)
    398                   && i + 2 < argsize && arg[i + 1] == '?')
    399                 switch (arg[i + 2])
    400                   {
    401                   case '!': case '\'':
    402                   case '(': case ')': case '-': case '/':
    403                   case '<': case '=': case '>':
    404                     /* Escape the second '?' in what would otherwise be
    405                        a trigraph.  */
    406                     if (elide_outer_quotes)
    407                       goto force_outer_quoting_style;
    408                     c = arg[i + 2];
    409                     i += 2;
    410                     STORE ('?');
    411                     STORE ('"');
    412                     STORE ('"');
    413                     STORE ('?');
    414                     break;
    415 
    416                   default:
    417                     break;
    418                   }
    419               break;
    420 
    421             default:
    422               break;
    423             }
    424           break;
    425 
    426         case '\a': esc = 'a'; goto c_escape;
    427         case '\b': esc = 'b'; goto c_escape;
    428         case '\f': esc = 'f'; goto c_escape;
    429         case '\n': esc = 'n'; goto c_and_shell_escape;
    430         case '\r': esc = 'r'; goto c_and_shell_escape;
    431         case '\t': esc = 't'; goto c_and_shell_escape;
    432         case '\v': esc = 'v'; goto c_escape;
    433         case '\\': esc = c;
    434           /* No need to escape the escape if we are trying to elide
    435              outer quotes and nothing else is problematic.  */
    436           if (backslash_escapes && elide_outer_quotes && quote_string_len)
    437             goto store_c;
    438 
    439         c_and_shell_escape:
    440           if (quoting_style == shell_always_quoting_style
    441               && elide_outer_quotes)
    442             goto force_outer_quoting_style;
    443           /* Fall through.  */
    444         c_escape:
    445           if (backslash_escapes)
    446             {
    447               c = esc;
    448               goto store_escape;
    449             }
    450           break;
    451 
    452         case '{': case '}': /* sometimes special if isolated */
    453           if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
    454             break;
    455           /* Fall through.  */
    456         case '#': case '~':
    457           if (i != 0)
    458             break;
    459           /* Fall through.  */
    460         case ' ':
    461         case '!': /* special in bash */
    462         case '"': case '$': case '&':
    463         case '(': case ')': case '*': case ';':
    464         case '<':
    465         case '=': /* sometimes special in 0th or (with "set -k") later args */
    466         case '>': case '[':
    467         case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
    468         case '`': case '|':
    469           /* A shell special character.  In theory, '$' and '`' could
    470              be the first bytes of multibyte characters, which means
    471              we should check them with mbrtowc, but in practice this
    472              doesn't happen so it's not worth worrying about.  */
    473           if (quoting_style == shell_always_quoting_style
    474               && elide_outer_quotes)
    475             goto force_outer_quoting_style;
    476           break;
    477 
    478         case '\'':
    479           if (quoting_style == shell_always_quoting_style)
    480             {
    481               if (elide_outer_quotes)
    482                 goto force_outer_quoting_style;
    483               STORE ('\'');
    484               STORE ('\\');
    485               STORE ('\'');
    486             }
    487           break;
    488 
    489         case '%': case '+': case ',': case '-': case '.': case '/':
    490         case '0': case '1': case '2': case '3': case '4': case '5':
    491         case '6': case '7': case '8': case '9': case ':':
    492         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
    493         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
    494         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
    495         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
    496         case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
    497         case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
    498         case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
    499         case 'o': case 'p': case 'q': case 'r': case 's': case 't':
    500         case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
    501           /* These characters don't cause problems, no matter what the
    502              quoting style is.  They cannot start multibyte sequences.
    503              A digit or a special letter would cause trouble if it
    504              appeared at the beginning of quote_string because we'd then
    505              escape by prepending a backslash.  However, it's hard to
    506              imagine any locale that would use digits or letters as
    507              quotes, and set_custom_quoting is documented not to accept
    508              them.  Also, a digit or a special letter would cause
    509              trouble if it appeared in quote_these_too, but that's also
    510              documented as not accepting them.  */
    511           break;
    512 
    513         default:
    514           /* If we have a multibyte sequence, copy it until we reach
    515              its end, find an error, or come back to the initial shift
    516              state.  For C-like styles, if the sequence has
    517              unprintable characters, escape the whole sequence, since
    518              we can't easily escape single characters within it.  */
    519           {
    520             /* Length of multibyte sequence found so far.  */
    521             size_t m;
    522 
    523             bool printable;
    524 
    525             if (unibyte_locale)
    526               {
    527                 m = 1;
    528                 printable = isprint (c) != 0;
    529               }
    530             else
    531               {
    532                 mbstate_t mbstate;
    533                 memset (&mbstate, 0, sizeof mbstate);
    534 
    535                 m = 0;
    536                 printable = true;
    537                 if (argsize == SIZE_MAX)
    538                   argsize = strlen (arg);
    539 
    540                 do
    541                   {
    542                     wchar_t w;
    543                     size_t bytes = mbrtowc (&w, &arg[i + m],
    544                                             argsize - (i + m), &mbstate);
    545                     if (bytes == 0)
    546                       break;
    547                     else if (bytes == (size_t) -1)
    548                       {
    549                         printable = false;
    550                         break;
    551                       }
    552                     else if (bytes == (size_t) -2)
    553                       {
    554                         printable = false;
    555                         while (i + m < argsize && arg[i + m])
    556                           m++;
    557                         break;
    558                       }
    559                     else
    560                       {
    561                         /* Work around a bug with older shells that "see" a '\'
    562                            that is really the 2nd byte of a multibyte character.
    563                            In practice the problem is limited to ASCII
    564                            chars >= '@' that are shell special chars.  */
    565                         if ('[' == 0x5b && elide_outer_quotes
    566                             && quoting_style == shell_always_quoting_style)
    567                           {
    568                             size_t j;
    569                             for (j = 1; j < bytes; j++)
    570                               switch (arg[i + m + j])
    571                                 {
    572                                 case '[': case '\\': case '^':
    573                                 case '`': case '|':
    574                                   goto force_outer_quoting_style;
    575 
    576                                 default:
    577                                   break;
    578                                 }
    579                           }
    580 
    581                         if (! iswprint (w))
    582                           printable = false;
    583                         m += bytes;
    584                       }
    585                   }
    586                 while (! mbsinit (&mbstate));
    587               }
    588 
    589             if (1 < m || (backslash_escapes && ! printable))
    590               {
    591                 /* Output a multibyte sequence, or an escaped
    592                    unprintable unibyte character.  */
    593                 size_t ilim = i + m;
    594 
    595                 for (;;)
    596                   {
    597                     if (backslash_escapes && ! printable)
    598                       {
    599                         if (elide_outer_quotes)
    600                           goto force_outer_quoting_style;
    601                         STORE ('\\');
    602                         STORE ('0' + (c >> 6));
    603                         STORE ('0' + ((c >> 3) & 7));
    604                         c = '0' + (c & 7);
    605                       }
    606                     else if (is_right_quote)
    607                       {
    608                         STORE ('\\');
    609                         is_right_quote = false;
    610                       }
    611                     if (ilim <= i + 1)
    612                       break;
    613                     STORE (c);
    614                     c = arg[++i];
    615                   }
    616 
    617                 goto store_c;
    618               }
    619           }
    620         }
    621 
    622       if (! ((backslash_escapes || elide_outer_quotes)
    623              && quote_these_too
    624              && quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
    625           && !is_right_quote)
    626         goto store_c;
    627 
    628     store_escape:
    629       if (elide_outer_quotes)
    630         goto force_outer_quoting_style;
    631       STORE ('\\');
    632 
    633     store_c:
    634       STORE (c);
    635     }
    636 
    637   if (len == 0 && quoting_style == shell_always_quoting_style
    638       && elide_outer_quotes)
    639     goto force_outer_quoting_style;
    640 
    641   if (quote_string && !elide_outer_quotes)
    642     for (; *quote_string; quote_string++)
    643       STORE (*quote_string);
    644 
    645   if (len < buffersize)
    646     buffer[len] = '\0';
    647   return len;
    648 
    649  force_outer_quoting_style:
    650   /* Don't reuse quote_these_too, since the addition of outer quotes
    651      sufficiently quotes the specified characters.  */
    652   return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
    653                                    quoting_style,
    654                                    flags & ~QA_ELIDE_OUTER_QUOTES, NULL,
    655                                    left_quote, right_quote);
    656 }
    657 
    658 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
    659    argument ARG (of size ARGSIZE), using O to control quoting.
    660    If O is null, use the default.
    661    Terminate the output with a null character, and return the written
    662    size of the output, not counting the terminating null.
    663    If BUFFERSIZE is too small to store the output string, return the
    664    value that would have been returned had BUFFERSIZE been large enough.
    665    If ARGSIZE is SIZE_MAX, use the string length of the argument for
    666    ARGSIZE.  */
    667 size_t
    668 quotearg_buffer (char *buffer, size_t buffersize,
    669                  char const *arg, size_t argsize,
    670                  struct quoting_options const *o)
    671 {
    672   struct quoting_options const *p = o ? o : &default_quoting_options;
    673   int e = errno;
    674   size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
    675                                        p->style, p->flags, p->quote_these_too,
    676                                        p->left_quote, p->right_quote);
    677   errno = e;
    678   return r;
    679 }
    680 
    681 /* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O).  */
    682 char *
    683 quotearg_alloc (char const *arg, size_t argsize,
    684                 struct quoting_options const *o)
    685 {
    686   return quotearg_alloc_mem (arg, argsize, NULL, o);
    687 }
    688 
    689 /* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
    690    allocated storage containing the quoted string, and store the
    691    resulting size into *SIZE, if non-NULL.  The result can contain
    692    embedded null bytes only if ARGSIZE is not SIZE_MAX, SIZE is not
    693    NULL, and set_quoting_flags has not set the null byte elision
    694    flag.  */
    695 char *
    696 quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size,
    697                     struct quoting_options const *o)
    698 {
    699   struct quoting_options const *p = o ? o : &default_quoting_options;
    700   int e = errno;
    701   /* Elide embedded null bytes if we can't return a size.  */
    702   int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES);
    703   size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style,
    704                                              flags, p->quote_these_too,
    705                                              p->left_quote,
    706                                              p->right_quote) + 1;
    707   char *buf = xcharalloc (bufsize);
    708   quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags,
    709                             p->quote_these_too,
    710                             p->left_quote, p->right_quote);
    711   errno = e;
    712   if (size)
    713     *size = bufsize - 1;
    714   return buf;
    715 }
    716 
    717 /* A storage slot with size and pointer to a value.  */
    718 struct slotvec
    719 {
    720   size_t size;
    721   char *val;
    722 };
    723 
    724 /* Preallocate a slot 0 buffer, so that the caller can always quote
    725    one small component of a "memory exhausted" message in slot 0.  */
    726 static char slot0[256];
    727 static unsigned int nslots = 1;
    728 static struct slotvec slotvec0 = {sizeof slot0, slot0};
    729 static struct slotvec *slotvec = &slotvec0;
    730 
    731 void
    732 quotearg_free (void)
    733 {
    734   struct slotvec *sv = slotvec;
    735   unsigned int i;
    736   for (i = 1; i < nslots; i++)
    737     free (sv[i].val);
    738   if (sv[0].val != slot0)
    739     {
    740       free (sv[0].val);
    741       slotvec0.size = sizeof slot0;
    742       slotvec0.val = slot0;
    743     }
    744   if (sv != &slotvec0)
    745     {
    746       free (sv);
    747       slotvec = &slotvec0;
    748     }
    749   nslots = 1;
    750 }
    751 
    752 /* Use storage slot N to return a quoted version of argument ARG.
    753    ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
    754    null-terminated string.
    755    OPTIONS specifies the quoting options.
    756    The returned value points to static storage that can be
    757    reused by the next call to this function with the same value of N.
    758    N must be nonnegative.  N is deliberately declared with type "int"
    759    to allow for future extensions (using negative values).  */
    760 static char *
    761 quotearg_n_options (int n, char const *arg, size_t argsize,
    762                     struct quoting_options const *options)
    763 {
    764   int e = errno;
    765 
    766   unsigned int n0 = n;
    767   struct slotvec *sv = slotvec;
    768 
    769   if (n < 0)
    770     abort ();
    771 
    772   if (nslots <= n0)
    773     {
    774       /* FIXME: technically, the type of n1 should be 'unsigned int',
    775          but that evokes an unsuppressible warning from gcc-4.0.1 and
    776          older.  If gcc ever provides an option to suppress that warning,
    777          revert to the original type, so that the test in xalloc_oversized
    778          is once again performed only at compile time.  */
    779       size_t n1 = n0 + 1;
    780       bool preallocated = (sv == &slotvec0);
    781 
    782       if (xalloc_oversized (n1, sizeof *sv))
    783         xalloc_die ();
    784 
    785       slotvec = sv = xrealloc (preallocated ? NULL : sv, n1 * sizeof *sv);
    786       if (preallocated)
    787         *sv = slotvec0;
    788       memset (sv + nslots, 0, (n1 - nslots) * sizeof *sv);
    789       nslots = n1;
    790     }
    791 
    792   {
    793     size_t size = sv[n].size;
    794     char *val = sv[n].val;
    795     /* Elide embedded null bytes since we don't return a size.  */
    796     int flags = options->flags | QA_ELIDE_NULL_BYTES;
    797     size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize,
    798                                              options->style, flags,
    799                                              options->quote_these_too,
    800                                              options->left_quote,
    801                                              options->right_quote);
    802 
    803     if (size <= qsize)
    804       {
    805         sv[n].size = size = qsize + 1;
    806         if (val != slot0)
    807           free (val);
    808         sv[n].val = val = xcharalloc (size);
    809         quotearg_buffer_restyled (val, size, arg, argsize, options->style,
    810                                   flags, options->quote_these_too,
    811                                   options->left_quote,
    812                                   options->right_quote);
    813       }
    814 
    815     errno = e;
    816     return val;
    817   }
    818 }
    819 
    820 char *
    821 quotearg_n (int n, char const *arg)
    822 {
    823   return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
    824 }
    825 
    826 char *
    827 quotearg_n_mem (int n, char const *arg, size_t argsize)
    828 {
    829   return quotearg_n_options (n, arg, argsize, &default_quoting_options);
    830 }
    831 
    832 char *
    833 quotearg (char const *arg)
    834 {
    835   return quotearg_n (0, arg);
    836 }
    837 
    838 char *
    839 quotearg_mem (char const *arg, size_t argsize)
    840 {
    841   return quotearg_n_mem (0, arg, argsize);
    842 }
    843 
    844 char *
    845 quotearg_n_style (int n, enum quoting_style s, char const *arg)
    846 {
    847   struct quoting_options const o = quoting_options_from_style (s);
    848   return quotearg_n_options (n, arg, SIZE_MAX, &o);
    849 }
    850 
    851 char *
    852 quotearg_n_style_mem (int n, enum quoting_style s,
    853                       char const *arg, size_t argsize)
    854 {
    855   struct quoting_options const o = quoting_options_from_style (s);
    856   return quotearg_n_options (n, arg, argsize, &o);
    857 }
    858 
    859 char *
    860 quotearg_style (enum quoting_style s, char const *arg)
    861 {
    862   return quotearg_n_style (0, s, arg);
    863 }
    864 
    865 char *
    866 quotearg_style_mem (enum quoting_style s, char const *arg, size_t argsize)
    867 {
    868   return quotearg_n_style_mem (0, s, arg, argsize);
    869 }
    870 
    871 char *
    872 quotearg_char_mem (char const *arg, size_t argsize, char ch)
    873 {
    874   struct quoting_options options;
    875   options = default_quoting_options;
    876   set_char_quoting (&options, ch, 1);
    877   return quotearg_n_options (0, arg, argsize, &options);
    878 }
    879 
    880 char *
    881 quotearg_char (char const *arg, char ch)
    882 {
    883   return quotearg_char_mem (arg, SIZE_MAX, ch);
    884 }
    885 
    886 char *
    887 quotearg_colon (char const *arg)
    888 {
    889   return quotearg_char (arg, ':');
    890 }
    891 
    892 char *
    893 quotearg_colon_mem (char const *arg, size_t argsize)
    894 {
    895   return quotearg_char_mem (arg, argsize, ':');
    896 }
    897 
    898 char *
    899 quotearg_n_custom (int n, char const *left_quote,
    900                    char const *right_quote, char const *arg)
    901 {
    902   return quotearg_n_custom_mem (n, left_quote, right_quote, arg,
    903                                 SIZE_MAX);
    904 }
    905 
    906 char *
    907 quotearg_n_custom_mem (int n, char const *left_quote,
    908                        char const *right_quote,
    909                        char const *arg, size_t argsize)
    910 {
    911   struct quoting_options o = default_quoting_options;
    912   set_custom_quoting (&o, left_quote, right_quote);
    913   return quotearg_n_options (n, arg, argsize, &o);
    914 }
    915 
    916 char *
    917 quotearg_custom (char const *left_quote, char const *right_quote,
    918                  char const *arg)
    919 {
    920   return quotearg_n_custom (0, left_quote, right_quote, arg);
    921 }
    922 
    923 char *
    924 quotearg_custom_mem (char const *left_quote, char const *right_quote,
    925                      char const *arg, size_t argsize)
    926 {
    927   return quotearg_n_custom_mem (0, left_quote, right_quote, arg,
    928                                 argsize);
    929 }
    930 
    931 
    932 /* The quoting option used by the functions of quote.h.  */
    933 struct quoting_options quote_quoting_options =
    934   {
    935     locale_quoting_style,
    936     0,
    937     { 0 },
    938     NULL, NULL
    939   };
    940 
    941 char const *
    942 quote_n_mem (int n, char const *arg, size_t argsize)
    943 {
    944   return quotearg_n_options (n, arg, argsize, &quote_quoting_options);
    945 }
    946 
    947 char const *
    948 quote_mem (char const *arg, size_t argsize)
    949 {
    950   return quote_n_mem (0, arg, argsize);
    951 }
    952 
    953 char const *
    954 quote_n (int n, char const *arg)
    955 {
    956   return quote_n_mem (n, arg, SIZE_MAX);
    957 }
    958 
    959 char const *
    960 quote (char const *arg)
    961 {
    962   return quote_n (0, arg);
    963 }
    964