1 /* quotearg.c - quote arguments for output
3 Copyright (C) 1998-2002, 2004-2016 Free Software Foundation, Inc.
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.
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.
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/>. */
18 /* Written by Paul Eggert <eggert@twinsun.com> */
20 /* Without this pragma, gcc 4.7.0 20111124 mistakenly suggests that
21 the quoting_options_from_style function might be candidate for
23 #if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
24 # pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
33 #include "c-strcaseeq.h"
34 #include "localcharset.h"
46 #define _(msgid) gettext (msgid)
47 #define N_(msgid) msgid
50 # define SIZE_MAX ((size_t) -1)
53 #define INT_BITS (sizeof (int) * CHAR_BIT)
55 struct quoting_options
57 /* Basic quoting style. */
58 enum quoting_style style;
60 /* Additional flags. Bitwise combination of enum quoting_flags. */
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];
67 /* The left quote for custom_quoting_style. */
68 char const *left_quote;
70 /* The right quote for custom_quoting_style. */
71 char const *right_quote;
74 /* Names of quoting styles. */
75 char const *const quoting_style_args[] =
81 "shell-escape-always",
90 /* Correspondences to quoting style names. */
91 enum quoting_style const quoting_style_vals[] =
93 literal_quoting_style,
95 shell_always_quoting_style,
96 shell_escape_quoting_style,
97 shell_escape_always_quoting_style,
99 c_maybe_quoting_style,
100 escape_quoting_style,
101 locale_quoting_style,
102 clocale_quoting_style
105 /* The default quoting options. */
106 static struct quoting_options default_quoting_options;
108 /* Allocate a new set of quoting options, with contents initially identical
109 to O if O is not null, or to the default if O is null.
110 It is the caller's responsibility to free the result. */
111 struct quoting_options *
112 clone_quoting_options (struct quoting_options *o)
115 struct quoting_options *p = xmemdup (o ? o : &default_quoting_options,
121 /* Get the value of O's quoting style. If O is null, use the default. */
123 get_quoting_style (struct quoting_options const *o)
125 return (o ? o : &default_quoting_options)->style;
128 /* In O (or in the default if O is null),
129 set the value of the quoting style to S. */
131 set_quoting_style (struct quoting_options *o, enum quoting_style s)
133 (o ? o : &default_quoting_options)->style = s;
136 /* In O (or in the default if O is null),
137 set the value of the quoting options for character C to I.
138 Return the old value. Currently, the only values defined for I are
139 0 (the default) and 1 (which means to quote the character even if
140 it would not otherwise be quoted). */
142 set_char_quoting (struct quoting_options *o, char c, int i)
144 unsigned char uc = c;
146 (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
147 int shift = uc % INT_BITS;
148 int r = (*p >> shift) & 1;
149 *p ^= ((i & 1) ^ r) << shift;
153 /* In O (or in the default if O is null),
154 set the value of the quoting options flag to I, which can be a
155 bitwise combination of enum quoting_flags, or 0 for default
156 behavior. Return the old value. */
158 set_quoting_flags (struct quoting_options *o, int i)
162 o = &default_quoting_options;
169 set_custom_quoting (struct quoting_options *o,
170 char const *left_quote, char const *right_quote)
173 o = &default_quoting_options;
174 o->style = custom_quoting_style;
175 if (!left_quote || !right_quote)
177 o->left_quote = left_quote;
178 o->right_quote = right_quote;
181 /* Return quoting options for STYLE, with no extra quoting. */
182 static struct quoting_options /* NOT PURE!! */
183 quoting_options_from_style (enum quoting_style style)
185 struct quoting_options o = { literal_quoting_style, 0, { 0 }, NULL, NULL };
186 if (style == custom_quoting_style)
192 /* MSGID approximates a quotation mark. Return its translation if it
193 has one; otherwise, return either it or "\"", depending on S.
195 S is either clocale_quoting_style or locale_quoting_style. */
197 gettext_quote (char const *msgid, enum quoting_style s)
199 char const *translation = _(msgid);
200 char const *locale_code;
202 if (translation != msgid)
205 /* For UTF-8 and GB-18030, use single quotes U+2018 and U+2019.
206 Here is a list of other locales that include U+2018 and U+2019:
208 ISO-8859-7 0xA1 KOI8-T 0x91
209 CP869 0x8B CP874 0x91
210 CP932 0x81 0x65 CP936 0xA1 0xAE
211 CP949 0xA1 0xAE CP950 0xA1 0xA5
212 CP1250 0x91 CP1251 0x91
213 CP1252 0x91 CP1253 0x91
214 CP1254 0x91 CP1255 0x91
215 CP1256 0x91 CP1257 0x91
216 EUC-JP 0xA1 0xC6 EUC-KR 0xA1 0xAE
217 EUC-TW 0xA1 0xE4 BIG5 0xA1 0xA5
218 BIG5-HKSCS 0xA1 0xA5 EUC-CN 0xA1 0xAE
219 GBK 0xA1 0xAE Georgian-PS 0x91
222 None of these is still in wide use; using iconv is overkill. */
223 locale_code = locale_charset ();
224 if (STRCASEEQ (locale_code, "UTF-8", 'U','T','F','-','8',0,0,0,0))
225 return msgid[0] == '`' ? "\xe2\x80\x98": "\xe2\x80\x99";
226 if (STRCASEEQ (locale_code, "GB18030", 'G','B','1','8','0','3','0',0,0))
227 return msgid[0] == '`' ? "\xa1\ae": "\xa1\xaf";
229 return (s == clocale_quoting_style ? "\"" : "'");
232 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
233 argument ARG (of size ARGSIZE), using QUOTING_STYLE, FLAGS, and
234 QUOTE_THESE_TOO to control quoting.
235 Terminate the output with a null character, and return the written
236 size of the output, not counting the terminating null.
237 If BUFFERSIZE is too small to store the output string, return the
238 value that would have been returned had BUFFERSIZE been large enough.
239 If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
241 This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
242 ARGSIZE, O), except it breaks O into its component pieces and is
243 not careful about errno. */
246 quotearg_buffer_restyled (char *buffer, size_t buffersize,
247 char const *arg, size_t argsize,
248 enum quoting_style quoting_style, int flags,
249 unsigned int const *quote_these_too,
250 char const *left_quote,
251 char const *right_quote)
255 char const *quote_string = 0;
256 size_t quote_string_len = 0;
257 bool backslash_escapes = false;
258 bool unibyte_locale = MB_CUR_MAX == 1;
259 bool elide_outer_quotes = (flags & QA_ELIDE_OUTER_QUOTES) != 0;
260 bool pending_shell_escape_end = false;
261 bool encountered_single_quote = false;
262 bool all_c_and_shell_quote_compat = true;
267 if (len < buffersize) \
273 #define START_ESC() \
276 if (elide_outer_quotes) \
277 goto force_outer_quoting_style; \
279 if (quoting_style == shell_always_quoting_style \
280 && ! pending_shell_escape_end) \
285 pending_shell_escape_end = true; \
294 if (pending_shell_escape_end && ! escaping) \
298 pending_shell_escape_end = false; \
303 switch (quoting_style)
305 case c_maybe_quoting_style:
306 quoting_style = c_quoting_style;
307 elide_outer_quotes = true;
309 case c_quoting_style:
310 if (!elide_outer_quotes)
312 backslash_escapes = true;
314 quote_string_len = 1;
317 case escape_quoting_style:
318 backslash_escapes = true;
319 elide_outer_quotes = false;
322 case locale_quoting_style:
323 case clocale_quoting_style:
324 case custom_quoting_style:
326 if (quoting_style != custom_quoting_style)
329 Get translations for open and closing quotation marks.
330 The message catalog should translate "`" to a left
331 quotation mark suitable for the locale, and similarly for
332 "'". For example, a French Unicode local should translate
333 these to U+00AB (LEFT-POINTING DOUBLE ANGLE
334 QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
335 QUOTATION MARK), respectively.
337 If the catalog has no translation, we will try to
338 use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
339 Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
340 current locale is not Unicode, locale_quoting_style
341 will quote 'like this', and clocale_quoting_style will
342 quote "like this". You should always include translations
343 for "`" and "'" even if U+2018 and U+2019 are appropriate
346 If you don't know what to put here, please see
347 <http://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
348 and use glyphs suitable for your language. */
349 left_quote = gettext_quote (N_("`"), quoting_style);
350 right_quote = gettext_quote (N_("'"), quoting_style);
352 if (!elide_outer_quotes)
353 for (quote_string = left_quote; *quote_string; quote_string++)
354 STORE (*quote_string);
355 backslash_escapes = true;
356 quote_string = right_quote;
357 quote_string_len = strlen (quote_string);
361 case shell_escape_quoting_style:
362 backslash_escapes = true;
364 case shell_quoting_style:
365 elide_outer_quotes = true;
367 case shell_escape_always_quoting_style:
368 if (!elide_outer_quotes)
369 backslash_escapes = true;
371 case shell_always_quoting_style:
372 quoting_style = shell_always_quoting_style;
373 if (!elide_outer_quotes)
376 quote_string_len = 1;
379 case literal_quoting_style:
380 elide_outer_quotes = false;
387 for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++)
391 bool is_right_quote = false;
392 bool escaping = false;
393 bool c_and_shell_quote_compat = false;
395 if (backslash_escapes
396 && quoting_style != shell_always_quoting_style
398 && (i + quote_string_len
399 <= (argsize == SIZE_MAX && 1 < quote_string_len
400 /* Use strlen only if we must: when argsize is SIZE_MAX,
401 and when the quote string is more than 1 byte long.
402 If we do call strlen, save the result. */
403 ? (argsize = strlen (arg)) : argsize))
404 && memcmp (arg + i, quote_string, quote_string_len) == 0)
406 if (elide_outer_quotes)
407 goto force_outer_quoting_style;
408 is_right_quote = true;
415 if (backslash_escapes)
418 /* If quote_string were to begin with digits, we'd need to
419 test for the end of the arg as well. However, it's
420 hard to imagine any locale that would use digits in
421 quotes, and set_custom_quoting is documented not to
422 accept them. Use only a single \0 with shell-escape
423 as currently digits are not printed within $'...' */
424 if (quoting_style != shell_always_quoting_style
425 && i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9')
431 /* We don't have to worry that this last '0' will be
432 backslash-escaped because, again, quote_string should
433 not start with it and because quote_these_too is
434 documented as not accepting it. */
436 else if (flags & QA_ELIDE_NULL_BYTES)
441 switch (quoting_style)
443 case shell_always_quoting_style:
444 if (elide_outer_quotes)
445 goto force_outer_quoting_style;
448 case c_quoting_style:
449 if ((flags & QA_SPLIT_TRIGRAPHS)
450 && i + 2 < argsize && arg[i + 1] == '?')
454 case '(': case ')': case '-': case '/':
455 case '<': case '=': case '>':
456 /* Escape the second '?' in what would otherwise be
458 if (elide_outer_quotes)
459 goto force_outer_quoting_style;
478 case '\a': esc = 'a'; goto c_escape;
479 case '\b': esc = 'b'; goto c_escape;
480 case '\f': esc = 'f'; goto c_escape;
481 case '\n': esc = 'n'; goto c_and_shell_escape;
482 case '\r': esc = 'r'; goto c_and_shell_escape;
483 case '\t': esc = 't'; goto c_and_shell_escape;
484 case '\v': esc = 'v'; goto c_escape;
486 /* Never need to escape '\' in shell case. */
487 if (quoting_style == shell_always_quoting_style)
489 if (elide_outer_quotes)
490 goto force_outer_quoting_style;
494 /* No need to escape the escape if we are trying to elide
495 outer quotes and nothing else is problematic. */
496 if (backslash_escapes && elide_outer_quotes && quote_string_len)
500 if (quoting_style == shell_always_quoting_style
501 && elide_outer_quotes)
502 goto force_outer_quoting_style;
505 if (backslash_escapes)
512 case '{': case '}': /* sometimes special if isolated */
513 if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
521 c_and_shell_quote_compat = true;
523 case '!': /* special in bash */
524 case '"': case '$': case '&':
525 case '(': case ')': case '*': case ';':
527 case '=': /* sometimes special in 0th or (with "set -k") later args */
529 case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
531 /* A shell special character. In theory, '$' and '`' could
532 be the first bytes of multibyte characters, which means
533 we should check them with mbrtowc, but in practice this
534 doesn't happen so it's not worth worrying about. */
535 if (quoting_style == shell_always_quoting_style
536 && elide_outer_quotes)
537 goto force_outer_quoting_style;
541 encountered_single_quote = true;
542 c_and_shell_quote_compat = true;
543 if (quoting_style == shell_always_quoting_style)
545 if (elide_outer_quotes)
546 goto force_outer_quoting_style;
550 pending_shell_escape_end = false;
554 case '%': case '+': case ',': case '-': case '.': case '/':
555 case '0': case '1': case '2': case '3': case '4': case '5':
556 case '6': case '7': case '8': case '9': case ':':
557 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
558 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
559 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
560 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
561 case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
562 case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
563 case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
564 case 'o': case 'p': case 'q': case 'r': case 's': case 't':
565 case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
566 /* These characters don't cause problems, no matter what the
567 quoting style is. They cannot start multibyte sequences.
568 A digit or a special letter would cause trouble if it
569 appeared at the beginning of quote_string because we'd then
570 escape by prepending a backslash. However, it's hard to
571 imagine any locale that would use digits or letters as
572 quotes, and set_custom_quoting is documented not to accept
573 them. Also, a digit or a special letter would cause
574 trouble if it appeared in quote_these_too, but that's also
575 documented as not accepting them. */
576 c_and_shell_quote_compat = true;
580 /* If we have a multibyte sequence, copy it until we reach
581 its end, find an error, or come back to the initial shift
582 state. For C-like styles, if the sequence has
583 unprintable characters, escape the whole sequence, since
584 we can't easily escape single characters within it. */
586 /* Length of multibyte sequence found so far. */
594 printable = isprint (c) != 0;
599 memset (&mbstate, 0, sizeof mbstate);
603 if (argsize == SIZE_MAX)
604 argsize = strlen (arg);
609 size_t bytes = mbrtowc (&w, &arg[i + m],
610 argsize - (i + m), &mbstate);
613 else if (bytes == (size_t) -1)
618 else if (bytes == (size_t) -2)
621 while (i + m < argsize && arg[i + m])
627 /* Work around a bug with older shells that "see" a '\'
628 that is really the 2nd byte of a multibyte character.
629 In practice the problem is limited to ASCII
630 chars >= '@' that are shell special chars. */
631 if ('[' == 0x5b && elide_outer_quotes
632 && quoting_style == shell_always_quoting_style)
635 for (j = 1; j < bytes; j++)
636 switch (arg[i + m + j])
638 case '[': case '\\': case '^':
640 goto force_outer_quoting_style;
652 while (! mbsinit (&mbstate));
655 c_and_shell_quote_compat = printable;
657 if (1 < m || (backslash_escapes && ! printable))
659 /* Output a multibyte sequence, or an escaped
660 unprintable unibyte character. */
665 if (backslash_escapes && ! printable)
668 STORE ('0' + (c >> 6));
669 STORE ('0' + ((c >> 3) & 7));
672 else if (is_right_quote)
675 is_right_quote = false;
689 if (! (((backslash_escapes && quoting_style != shell_always_quoting_style)
690 || elide_outer_quotes)
692 && quote_these_too[c / INT_BITS] >> (c % INT_BITS) & 1)
703 if (! c_and_shell_quote_compat)
704 all_c_and_shell_quote_compat = false;
707 if (len == 0 && quoting_style == shell_always_quoting_style
708 && elide_outer_quotes)
709 goto force_outer_quoting_style;
711 /* Single shell quotes (') are commonly enough used as an apostrophe,
712 that we attempt to minimize the quoting in this case. Note itʼs
713 better to use the apostrophe modifier "\u02BC" if possible, as that
714 renders better and works with the word match regex \W+ etc. */
715 if (quoting_style == shell_always_quoting_style && ! elide_outer_quotes
716 && all_c_and_shell_quote_compat && encountered_single_quote)
717 return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
719 flags, quote_these_too,
720 left_quote, right_quote);
722 if (quote_string && !elide_outer_quotes)
723 for (; *quote_string; quote_string++)
724 STORE (*quote_string);
726 if (len < buffersize)
730 force_outer_quoting_style:
731 /* Don't reuse quote_these_too, since the addition of outer quotes
732 sufficiently quotes the specified characters. */
733 if (quoting_style == shell_always_quoting_style && backslash_escapes)
734 quoting_style = shell_escape_always_quoting_style;
735 return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
737 flags & ~QA_ELIDE_OUTER_QUOTES, NULL,
738 left_quote, right_quote);
741 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
742 argument ARG (of size ARGSIZE), using O to control quoting.
743 If O is null, use the default.
744 Terminate the output with a null character, and return the written
745 size of the output, not counting the terminating null.
746 If BUFFERSIZE is too small to store the output string, return the
747 value that would have been returned had BUFFERSIZE been large enough.
748 If ARGSIZE is SIZE_MAX, use the string length of the argument for
751 quotearg_buffer (char *buffer, size_t buffersize,
752 char const *arg, size_t argsize,
753 struct quoting_options const *o)
755 struct quoting_options const *p = o ? o : &default_quoting_options;
757 size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
758 p->style, p->flags, p->quote_these_too,
759 p->left_quote, p->right_quote);
764 /* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O). */
766 quotearg_alloc (char const *arg, size_t argsize,
767 struct quoting_options const *o)
769 return quotearg_alloc_mem (arg, argsize, NULL, o);
772 /* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
773 allocated storage containing the quoted string, and store the
774 resulting size into *SIZE, if non-NULL. The result can contain
775 embedded null bytes only if ARGSIZE is not SIZE_MAX, SIZE is not
776 NULL, and set_quoting_flags has not set the null byte elision
779 quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size,
780 struct quoting_options const *o)
782 struct quoting_options const *p = o ? o : &default_quoting_options;
784 /* Elide embedded null bytes if we can't return a size. */
785 int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES);
786 size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style,
787 flags, p->quote_these_too,
790 char *buf = xcharalloc (bufsize);
791 quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags,
793 p->left_quote, p->right_quote);
800 /* A storage slot with size and pointer to a value. */
807 /* Preallocate a slot 0 buffer, so that the caller can always quote
808 one small component of a "memory exhausted" message in slot 0. */
809 static char slot0[256];
810 static unsigned int nslots = 1;
811 static struct slotvec slotvec0 = {sizeof slot0, slot0};
812 static struct slotvec *slotvec = &slotvec0;
817 struct slotvec *sv = slotvec;
819 for (i = 1; i < nslots; i++)
821 if (sv[0].val != slot0)
824 slotvec0.size = sizeof slot0;
825 slotvec0.val = slot0;
835 /* Use storage slot N to return a quoted version of argument ARG.
836 ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
837 null-terminated string.
838 OPTIONS specifies the quoting options.
839 The returned value points to static storage that can be
840 reused by the next call to this function with the same value of N.
841 N must be nonnegative. N is deliberately declared with type "int"
842 to allow for future extensions (using negative values). */
844 quotearg_n_options (int n, char const *arg, size_t argsize,
845 struct quoting_options const *options)
850 struct slotvec *sv = slotvec;
857 /* FIXME: technically, the type of n1 should be 'unsigned int',
858 but that evokes an unsuppressible warning from gcc-4.0.1 and
859 older. If gcc ever provides an option to suppress that warning,
860 revert to the original type, so that the test in xalloc_oversized
861 is once again performed only at compile time. */
863 bool preallocated = (sv == &slotvec0);
865 if (xalloc_oversized (n1, sizeof *sv))
868 slotvec = sv = xrealloc (preallocated ? NULL : sv, n1 * sizeof *sv);
871 memset (sv + nslots, 0, (n1 - nslots) * sizeof *sv);
876 size_t size = sv[n].size;
877 char *val = sv[n].val;
878 /* Elide embedded null bytes since we don't return a size. */
879 int flags = options->flags | QA_ELIDE_NULL_BYTES;
880 size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize,
881 options->style, flags,
882 options->quote_these_too,
884 options->right_quote);
888 sv[n].size = size = qsize + 1;
891 sv[n].val = val = xcharalloc (size);
892 quotearg_buffer_restyled (val, size, arg, argsize, options->style,
893 flags, options->quote_these_too,
895 options->right_quote);
904 quotearg_n (int n, char const *arg)
906 return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
910 quotearg_n_mem (int n, char const *arg, size_t argsize)
912 return quotearg_n_options (n, arg, argsize, &default_quoting_options);
916 quotearg (char const *arg)
918 return quotearg_n (0, arg);
922 quotearg_mem (char const *arg, size_t argsize)
924 return quotearg_n_mem (0, arg, argsize);
928 quotearg_n_style (int n, enum quoting_style s, char const *arg)
930 struct quoting_options const o = quoting_options_from_style (s);
931 return quotearg_n_options (n, arg, SIZE_MAX, &o);
935 quotearg_n_style_mem (int n, enum quoting_style s,
936 char const *arg, size_t argsize)
938 struct quoting_options const o = quoting_options_from_style (s);
939 return quotearg_n_options (n, arg, argsize, &o);
943 quotearg_style (enum quoting_style s, char const *arg)
945 return quotearg_n_style (0, s, arg);
949 quotearg_style_mem (enum quoting_style s, char const *arg, size_t argsize)
951 return quotearg_n_style_mem (0, s, arg, argsize);
955 quotearg_char_mem (char const *arg, size_t argsize, char ch)
957 struct quoting_options options;
958 options = default_quoting_options;
959 set_char_quoting (&options, ch, 1);
960 return quotearg_n_options (0, arg, argsize, &options);
964 quotearg_char (char const *arg, char ch)
966 return quotearg_char_mem (arg, SIZE_MAX, ch);
970 quotearg_colon (char const *arg)
972 return quotearg_char (arg, ':');
976 quotearg_colon_mem (char const *arg, size_t argsize)
978 return quotearg_char_mem (arg, argsize, ':');
982 quotearg_n_style_colon (int n, enum quoting_style s, char const *arg)
984 struct quoting_options options;
985 options = quoting_options_from_style (s);
986 set_char_quoting (&options, ':', 1);
987 return quotearg_n_options (n, arg, SIZE_MAX, &options);
991 quotearg_n_custom (int n, char const *left_quote,
992 char const *right_quote, char const *arg)
994 return quotearg_n_custom_mem (n, left_quote, right_quote, arg,
999 quotearg_n_custom_mem (int n, char const *left_quote,
1000 char const *right_quote,
1001 char const *arg, size_t argsize)
1003 struct quoting_options o = default_quoting_options;
1004 set_custom_quoting (&o, left_quote, right_quote);
1005 return quotearg_n_options (n, arg, argsize, &o);
1009 quotearg_custom (char const *left_quote, char const *right_quote,
1012 return quotearg_n_custom (0, left_quote, right_quote, arg);
1016 quotearg_custom_mem (char const *left_quote, char const *right_quote,
1017 char const *arg, size_t argsize)
1019 return quotearg_n_custom_mem (0, left_quote, right_quote, arg,
1024 /* The quoting option used by the functions of quote.h. */
1025 struct quoting_options quote_quoting_options =
1027 locale_quoting_style,
1034 quote_n_mem (int n, char const *arg, size_t argsize)
1036 return quotearg_n_options (n, arg, argsize, "e_quoting_options);
1040 quote_mem (char const *arg, size_t argsize)
1042 return quote_n_mem (0, arg, argsize);
1046 quote_n (int n, char const *arg)
1048 return quote_n_mem (n, arg, SIZE_MAX);
1052 quote (char const *arg)
1054 return quote_n (0, arg);