1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* quotearg.c - quote arguments for output
5 Copyright (C) 1998-2002, 2004-2011 Free Software Foundation, Inc.
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 /* Written by Paul Eggert <eggert@twinsun.com> */
38 #define _(msgid) gettext (msgid)
39 #define N_(msgid) msgid
42 # define SIZE_MAX ((size_t) -1)
45 #define INT_BITS (sizeof (int) * CHAR_BIT)
47 struct quoting_options
49 /* Basic quoting style. */
50 enum quoting_style style;
52 /* Additional flags. Bitwise combination of enum quoting_flags. */
55 /* Quote the characters indicated by this bit vector even if the
56 quoting style would not normally require them to be quoted. */
57 unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
59 /* The left quote for custom_quoting_style. */
60 char const *left_quote;
62 /* The right quote for custom_quoting_style. */
63 char const *right_quote;
66 /* Names of quoting styles. */
67 char const *const quoting_style_args[] =
80 /* Correspondences to quoting style names. */
81 enum quoting_style const quoting_style_vals[] =
83 literal_quoting_style,
85 shell_always_quoting_style,
87 c_maybe_quoting_style,
93 /* The default quoting options. */
94 static struct quoting_options default_quoting_options;
96 /* Allocate a new set of quoting options, with contents initially identical
97 to O if O is not null, or to the default if O is null.
98 It is the caller's responsibility to free the result. */
99 struct quoting_options *
100 clone_quoting_options (struct quoting_options *o)
103 struct quoting_options *p = xmemdup (o ? o : &default_quoting_options,
109 /* Get the value of O's quoting style. If O is null, use the default. */
111 get_quoting_style (struct quoting_options *o)
113 return (o ? o : &default_quoting_options)->style;
116 /* In O (or in the default if O is null),
117 set the value of the quoting style to S. */
119 set_quoting_style (struct quoting_options *o, enum quoting_style s)
121 (o ? o : &default_quoting_options)->style = s;
124 /* In O (or in the default if O is null),
125 set the value of the quoting options for character C to I.
126 Return the old value. Currently, the only values defined for I are
127 0 (the default) and 1 (which means to quote the character even if
128 it would not otherwise be quoted). */
130 set_char_quoting (struct quoting_options *o, char c, int i)
132 unsigned char uc = c;
134 (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
135 int shift = uc % INT_BITS;
136 int r = (*p >> shift) & 1;
137 *p ^= ((i & 1) ^ r) << shift;
141 /* In O (or in the default if O is null),
142 set the value of the quoting options flag to I, which can be a
143 bitwise combination of enum quoting_flags, or 0 for default
144 behavior. Return the old value. */
146 set_quoting_flags (struct quoting_options *o, int i)
150 o = &default_quoting_options;
157 set_custom_quoting (struct quoting_options *o,
158 char const *left_quote, char const *right_quote)
161 o = &default_quoting_options;
162 o->style = custom_quoting_style;
163 if (!left_quote || !right_quote)
165 o->left_quote = left_quote;
166 o->right_quote = right_quote;
169 /* Return quoting options for STYLE, with no extra quoting. */
170 static struct quoting_options
171 quoting_options_from_style (enum quoting_style style)
173 struct quoting_options o;
176 memset (o.quote_these_too, 0, sizeof o.quote_these_too);
180 /* MSGID approximates a quotation mark. Return its translation if it
181 has one; otherwise, return either it or "\"", depending on S. */
183 gettext_quote (char const *msgid, enum quoting_style s)
185 char const *translation = _(msgid);
186 if (translation == msgid && s == clocale_quoting_style)
191 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
192 argument ARG (of size ARGSIZE), using QUOTING_STYLE, FLAGS, and
193 QUOTE_THESE_TOO to control quoting.
194 Terminate the output with a null character, and return the written
195 size of the output, not counting the terminating null.
196 If BUFFERSIZE is too small to store the output string, return the
197 value that would have been returned had BUFFERSIZE been large enough.
198 If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
200 This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
201 ARGSIZE, O), except it breaks O into its component pieces and is
202 not careful about errno. */
205 quotearg_buffer_restyled (char *buffer, size_t buffersize,
206 char const *arg, size_t argsize,
207 enum quoting_style quoting_style, int flags,
208 unsigned int const *quote_these_too,
209 char const *left_quote,
210 char const *right_quote)
214 char const *quote_string = 0;
215 size_t quote_string_len = 0;
216 bool backslash_escapes = false;
217 bool unibyte_locale = MB_CUR_MAX == 1;
218 bool elide_outer_quotes = (flags & QA_ELIDE_OUTER_QUOTES) != 0;
223 if (len < buffersize) \
229 switch (quoting_style)
231 case c_maybe_quoting_style:
232 quoting_style = c_quoting_style;
233 elide_outer_quotes = true;
235 case c_quoting_style:
236 if (!elide_outer_quotes)
238 backslash_escapes = true;
240 quote_string_len = 1;
243 case escape_quoting_style:
244 backslash_escapes = true;
245 elide_outer_quotes = false;
248 case locale_quoting_style:
249 case clocale_quoting_style:
250 case custom_quoting_style:
252 if (quoting_style != custom_quoting_style)
255 Get translations for open and closing quotation marks.
257 The message catalog should translate "`" to a left
258 quotation mark suitable for the locale, and similarly for
259 "'". If the catalog has no translation,
260 locale_quoting_style quotes `like this', and
261 clocale_quoting_style quotes "like this".
263 For example, an American English Unicode locale should
264 translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
265 should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
266 MARK). A British English Unicode locale should instead
267 translate these to U+2018 (LEFT SINGLE QUOTATION MARK)
268 and U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
270 If you don't know what to put here, please see
271 <http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
272 and use glyphs suitable for your language. */
273 left_quote = gettext_quote (N_("`"), quoting_style);
274 right_quote = gettext_quote (N_("'"), quoting_style);
276 if (!elide_outer_quotes)
277 for (quote_string = left_quote; *quote_string; quote_string++)
278 STORE (*quote_string);
279 backslash_escapes = true;
280 quote_string = right_quote;
281 quote_string_len = strlen (quote_string);
285 case shell_quoting_style:
286 quoting_style = shell_always_quoting_style;
287 elide_outer_quotes = true;
289 case shell_always_quoting_style:
290 if (!elide_outer_quotes)
293 quote_string_len = 1;
296 case literal_quoting_style:
297 elide_outer_quotes = false;
304 for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++)
308 bool is_right_quote = false;
310 if (backslash_escapes
312 && i + quote_string_len <= argsize
313 && memcmp (arg + i, quote_string, quote_string_len) == 0)
315 if (elide_outer_quotes)
316 goto force_outer_quoting_style;
317 is_right_quote = true;
324 if (backslash_escapes)
326 if (elide_outer_quotes)
327 goto force_outer_quoting_style;
329 /* If quote_string were to begin with digits, we'd need to
330 test for the end of the arg as well. However, it's
331 hard to imagine any locale that would use digits in
332 quotes, and set_custom_quoting is documented not to
334 if (i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9')
340 /* We don't have to worry that this last '0' will be
341 backslash-escaped because, again, quote_string should
342 not start with it and because quote_these_too is
343 documented as not accepting it. */
345 else if (flags & QA_ELIDE_NULL_BYTES)
350 switch (quoting_style)
352 case shell_always_quoting_style:
353 if (elide_outer_quotes)
354 goto force_outer_quoting_style;
357 case c_quoting_style:
358 if ((flags & QA_SPLIT_TRIGRAPHS)
359 && i + 2 < argsize && arg[i + 1] == '?')
363 case '(': case ')': case '-': case '/':
364 case '<': case '=': case '>':
365 /* Escape the second '?' in what would otherwise be
367 if (elide_outer_quotes)
368 goto force_outer_quoting_style;
387 case '\a': esc = 'a'; goto c_escape;
388 case '\b': esc = 'b'; goto c_escape;
389 case '\f': esc = 'f'; goto c_escape;
390 case '\n': esc = 'n'; goto c_and_shell_escape;
391 case '\r': esc = 'r'; goto c_and_shell_escape;
392 case '\t': esc = 't'; goto c_and_shell_escape;
393 case '\v': esc = 'v'; goto c_escape;
395 /* No need to escape the escape if we are trying to elide
396 outer quotes and nothing else is problematic. */
397 if (backslash_escapes && elide_outer_quotes && quote_string_len)
401 if (quoting_style == shell_always_quoting_style
402 && elide_outer_quotes)
403 goto force_outer_quoting_style;
406 if (backslash_escapes)
413 case '{': case '}': /* sometimes special if isolated */
414 if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
422 case '!': /* special in bash */
423 case '"': case '$': case '&':
424 case '(': case ')': case '*': case ';':
426 case '=': /* sometimes special in 0th or (with "set -k") later args */
428 case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
430 /* A shell special character. In theory, '$' and '`' could
431 be the first bytes of multibyte characters, which means
432 we should check them with mbrtowc, but in practice this
433 doesn't happen so it's not worth worrying about. */
434 if (quoting_style == shell_always_quoting_style
435 && elide_outer_quotes)
436 goto force_outer_quoting_style;
440 if (quoting_style == shell_always_quoting_style)
442 if (elide_outer_quotes)
443 goto force_outer_quoting_style;
450 case '%': case '+': case ',': case '-': case '.': case '/':
451 case '0': case '1': case '2': case '3': case '4': case '5':
452 case '6': case '7': case '8': case '9': case ':':
453 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
454 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
455 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
456 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
457 case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
458 case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
459 case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
460 case 'o': case 'p': case 'q': case 'r': case 's': case 't':
461 case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
462 /* These characters don't cause problems, no matter what the
463 quoting style is. They cannot start multibyte sequences.
464 A digit or a special letter would cause trouble if it
465 appeared at the beginning of quote_string because we'd then
466 escape by prepending a backslash. However, it's hard to
467 imagine any locale that would use digits or letters as
468 quotes, and set_custom_quoting is documented not to accept
469 them. Also, a digit or a special letter would cause
470 trouble if it appeared in quote_these_too, but that's also
471 documented as not accepting them. */
475 /* If we have a multibyte sequence, copy it until we reach
476 its end, find an error, or come back to the initial shift
477 state. For C-like styles, if the sequence has
478 unprintable characters, escape the whole sequence, since
479 we can't easily escape single characters within it. */
481 /* Length of multibyte sequence found so far. */
489 printable = isprint (c) != 0;
494 memset (&mbstate, 0, sizeof mbstate);
498 if (argsize == SIZE_MAX)
499 argsize = strlen (arg);
504 size_t bytes = mbrtowc (&w, &arg[i + m],
505 argsize - (i + m), &mbstate);
508 else if (bytes == (size_t) -1)
513 else if (bytes == (size_t) -2)
516 while (i + m < argsize && arg[i + m])
522 /* Work around a bug with older shells that "see" a '\'
523 that is really the 2nd byte of a multibyte character.
524 In practice the problem is limited to ASCII
525 chars >= '@' that are shell special chars. */
526 if ('[' == 0x5b && elide_outer_quotes
527 && quoting_style == shell_always_quoting_style)
530 for (j = 1; j < bytes; j++)
531 switch (arg[i + m + j])
533 case '[': case '\\': case '^':
535 goto force_outer_quoting_style;
547 while (! mbsinit (&mbstate));
550 if (1 < m || (backslash_escapes && ! printable))
552 /* Output a multibyte sequence, or an escaped
553 unprintable unibyte character. */
558 if (backslash_escapes && ! printable)
560 if (elide_outer_quotes)
561 goto force_outer_quoting_style;
563 STORE ('0' + (c >> 6));
564 STORE ('0' + ((c >> 3) & 7));
567 else if (is_right_quote)
570 is_right_quote = false;
583 if (! ((backslash_escapes || elide_outer_quotes)
585 && quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
590 if (elide_outer_quotes)
591 goto force_outer_quoting_style;
598 if (len == 0 && quoting_style == shell_always_quoting_style
599 && elide_outer_quotes)
600 goto force_outer_quoting_style;
602 if (quote_string && !elide_outer_quotes)
603 for (; *quote_string; quote_string++)
604 STORE (*quote_string);
606 if (len < buffersize)
610 force_outer_quoting_style:
611 /* Don't reuse quote_these_too, since the addition of outer quotes
612 sufficiently quotes the specified characters. */
613 return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
615 flags & ~QA_ELIDE_OUTER_QUOTES, NULL,
616 left_quote, right_quote);
619 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
620 argument ARG (of size ARGSIZE), using O to control quoting.
621 If O is null, use the default.
622 Terminate the output with a null character, and return the written
623 size of the output, not counting the terminating null.
624 If BUFFERSIZE is too small to store the output string, return the
625 value that would have been returned had BUFFERSIZE been large enough.
626 If ARGSIZE is SIZE_MAX, use the string length of the argument for
629 quotearg_buffer (char *buffer, size_t buffersize,
630 char const *arg, size_t argsize,
631 struct quoting_options const *o)
633 struct quoting_options const *p = o ? o : &default_quoting_options;
635 size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
636 p->style, p->flags, p->quote_these_too,
637 p->left_quote, p->right_quote);
642 /* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O). */
644 quotearg_alloc (char const *arg, size_t argsize,
645 struct quoting_options const *o)
647 return quotearg_alloc_mem (arg, argsize, NULL, o);
650 /* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
651 allocated storage containing the quoted string, and store the
652 resulting size into *SIZE, if non-NULL. The result can contain
653 embedded null bytes only if ARGSIZE is not SIZE_MAX, SIZE is not
654 NULL, and set_quoting_flags has not set the null byte elision
657 quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size,
658 struct quoting_options const *o)
660 struct quoting_options const *p = o ? o : &default_quoting_options;
662 /* Elide embedded null bytes if we can't return a size. */
663 int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES);
664 size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style,
665 flags, p->quote_these_too,
668 char *buf = xcharalloc (bufsize);
669 quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags,
671 p->left_quote, p->right_quote);
678 /* A storage slot with size and pointer to a value. */
685 /* Preallocate a slot 0 buffer, so that the caller can always quote
686 one small component of a "memory exhausted" message in slot 0. */
687 static char slot0[256];
688 static unsigned int nslots = 1;
689 static struct slotvec slotvec0 = {sizeof slot0, slot0};
690 static struct slotvec *slotvec = &slotvec0;
695 struct slotvec *sv = slotvec;
697 for (i = 1; i < nslots; i++)
699 if (sv[0].val != slot0)
702 slotvec0.size = sizeof slot0;
703 slotvec0.val = slot0;
713 /* Use storage slot N to return a quoted version of argument ARG.
714 ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
715 null-terminated string.
716 OPTIONS specifies the quoting options.
717 The returned value points to static storage that can be
718 reused by the next call to this function with the same value of N.
719 N must be nonnegative. N is deliberately declared with type "int"
720 to allow for future extensions (using negative values). */
722 quotearg_n_options (int n, char const *arg, size_t argsize,
723 struct quoting_options const *options)
728 struct slotvec *sv = slotvec;
735 /* FIXME: technically, the type of n1 should be `unsigned int',
736 but that evokes an unsuppressible warning from gcc-4.0.1 and
737 older. If gcc ever provides an option to suppress that warning,
738 revert to the original type, so that the test in xalloc_oversized
739 is once again performed only at compile time. */
741 bool preallocated = (sv == &slotvec0);
743 if (xalloc_oversized (n1, sizeof *sv))
746 slotvec = sv = xrealloc (preallocated ? NULL : sv, n1 * sizeof *sv);
749 memset (sv + nslots, 0, (n1 - nslots) * sizeof *sv);
754 size_t size = sv[n].size;
755 char *val = sv[n].val;
756 /* Elide embedded null bytes since we don't return a size. */
757 int flags = options->flags | QA_ELIDE_NULL_BYTES;
758 size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize,
759 options->style, flags,
760 options->quote_these_too,
762 options->right_quote);
766 sv[n].size = size = qsize + 1;
769 sv[n].val = val = xcharalloc (size);
770 quotearg_buffer_restyled (val, size, arg, argsize, options->style,
771 flags, options->quote_these_too,
773 options->right_quote);
782 quotearg_n (int n, char const *arg)
784 return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
788 quotearg_n_mem (int n, char const *arg, size_t argsize)
790 return quotearg_n_options (n, arg, argsize, &default_quoting_options);
794 quotearg (char const *arg)
796 return quotearg_n (0, arg);
800 quotearg_mem (char const *arg, size_t argsize)
802 return quotearg_n_mem (0, arg, argsize);
806 quotearg_n_style (int n, enum quoting_style s, char const *arg)
808 struct quoting_options const o = quoting_options_from_style (s);
809 return quotearg_n_options (n, arg, SIZE_MAX, &o);
813 quotearg_n_style_mem (int n, enum quoting_style s,
814 char const *arg, size_t argsize)
816 struct quoting_options const o = quoting_options_from_style (s);
817 return quotearg_n_options (n, arg, argsize, &o);
821 quotearg_style (enum quoting_style s, char const *arg)
823 return quotearg_n_style (0, s, arg);
827 quotearg_style_mem (enum quoting_style s, char const *arg, size_t argsize)
829 return quotearg_n_style_mem (0, s, arg, argsize);
833 quotearg_char_mem (char const *arg, size_t argsize, char ch)
835 struct quoting_options options;
836 options = default_quoting_options;
837 set_char_quoting (&options, ch, 1);
838 return quotearg_n_options (0, arg, argsize, &options);
842 quotearg_char (char const *arg, char ch)
844 return quotearg_char_mem (arg, SIZE_MAX, ch);
848 quotearg_colon (char const *arg)
850 return quotearg_char (arg, ':');
854 quotearg_colon_mem (char const *arg, size_t argsize)
856 return quotearg_char_mem (arg, argsize, ':');
860 quotearg_n_custom (int n, char const *left_quote,
861 char const *right_quote, char const *arg)
863 return quotearg_n_custom_mem (n, left_quote, right_quote, arg,
868 quotearg_n_custom_mem (int n, char const *left_quote,
869 char const *right_quote,
870 char const *arg, size_t argsize)
872 struct quoting_options o = default_quoting_options;
873 set_custom_quoting (&o, left_quote, right_quote);
874 return quotearg_n_options (n, arg, argsize, &o);
878 quotearg_custom (char const *left_quote, char const *right_quote,
881 return quotearg_n_custom (0, left_quote, right_quote, arg);
885 quotearg_custom_mem (char const *left_quote, char const *right_quote,
886 char const *arg, size_t argsize)
888 return quotearg_n_custom_mem (0, left_quote, right_quote, arg,