1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* quotearg.h - quote arguments for output
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1998-2002, 2004, 2006, 2008-2012 Free Software Foundation,
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Written by Paul Eggert <eggert@twinsun.com> */
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef QUOTEARG_H_
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define QUOTEARG_H_ 1
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <stddef.h>
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Basic quoting styles.  For each style, an example is given on the
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   input strings "simple", "\0 \t\n'\"\033?""?/\\", and "a:b", using
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   quotearg_buffer, quotearg_mem, and quotearg_colon_mem with that
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   style and the default flags and quoted characters.  Note that the
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   examples are shown here as valid C strings rather than what
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   displays on a terminal (with "??/" as a trigraph for "\\").  */
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum quoting_style
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Output names as-is (ls --quoting-style=literal).  Can result in
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       embedded null bytes if QA_ELIDE_NULL_BYTES is not in
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       effect.
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "\0 \t\n'\"\033??/\\", "a:b"
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", " \t\n'\"\033??/\\", "a:b"
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", " \t\n'\"\033??/\\", "a:b"
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    literal_quoting_style,
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    /* Quote names for the shell if they contain shell metacharacters
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       or would cause ambiguous output (ls --quoting-style=shell).
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       Can result in embedded null bytes if QA_ELIDE_NULL_BYTES is not
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       in effect.
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "'\0 \t\n'\\''\"\033??/\\'", "a:b"
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "' \t\n'\\''\"\033??/\\'", "a:b"
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "' \t\n'\\''\"\033??/\\'", "'a:b'"
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    shell_quoting_style,
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    /* Quote names for the shell, even if they would normally not
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       require quoting (ls --quoting-style=shell-always).  Can result
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       in embedded null bytes if QA_ELIDE_NULL_BYTES is not in effect.
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       Behaves like shell_quoting_style if QA_ELIDE_OUTER_QUOTES is in
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       effect.
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "'simple'", "'\0 \t\n'\\''\"\033??/\\'", "'a:b'"
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    shell_always_quoting_style,
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Quote names as for a C language string (ls --quoting-style=c).
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       Behaves like c_maybe_quoting_style if QA_ELIDE_OUTER_QUOTES is
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       in effect.  Split into consecutive strings if
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       QA_SPLIT_TRIGRAPHS.
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    c_quoting_style,
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    /* Like c_quoting_style except omit the surrounding double-quote
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       characters if no quoted characters are encountered.
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    c_maybe_quoting_style,
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Like c_quoting_style except always omit the surrounding
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       double-quote characters and ignore QA_SPLIT_TRIGRAPHS
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       (ls --quoting-style=escape).
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a\\:b"
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    escape_quoting_style,
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Like clocale_quoting_style, but use single quotes in the
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       default C locale or if the program does not use gettext
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       (ls --quoting-style=locale).  For UTF-8 locales, quote
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       characters will use Unicode.
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       LC_MESSAGES=C
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a\\:b'"
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       LC_MESSAGES=pt_PT.utf8
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253simple\302\273",
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253simple\302\273",
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253simple\302\273",
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    locale_quoting_style,
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    /* Like c_quoting_style except use quotation marks appropriate for
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       the locale and ignore QA_SPLIT_TRIGRAPHS
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       (ls --quoting-style=clocale).
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       LC_MESSAGES=C
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       LC_MESSAGES=pt_PT.utf8
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253simple\302\273",
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253simple\302\273",
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253simple\302\273",
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    clocale_quoting_style,
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Like clocale_quoting_style except use the custom quotation marks
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       set by set_custom_quoting.  If custom quotation marks are not
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       set, the behavior is undefined.
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       left_quote = right_quote = "'"
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a\\:b'"
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       left_quote = "(" and right_quote = ")"
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a\\:b)"
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       left_quote = ":" and right_quote = " "
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a\\:b "
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       left_quote = "\"'" and right_quote = "'\""
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       Notice that this is treated as a single level of quotes or two
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       levels where the outer quote need not be escaped within the inner
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotes.  For two levels where the outer quote must be escaped
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       within the inner quotes, you must use separate quotearg
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       invocations.
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_buffer:
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg:
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       quotearg_colon:
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a\\:b'\""
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    */
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    custom_quoting_style
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  };
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Flags for use in set_quoting_flags.  */
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wangenum quoting_flags
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  {
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Always elide null bytes from styles that do not quote them,
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       even when the length of the result is available to the
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       caller.  */
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    QA_ELIDE_NULL_BYTES = 0x01,
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* Omit the surrounding quote characters if no escaped characters
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       are encountered.  Note that if no other character needs
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       escaping, then neither does the escape character.  */
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    QA_ELIDE_OUTER_QUOTES = 0x02,
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* In the c_quoting_style and c_maybe_quoting_style, split ANSI
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       trigraph sequences into concatenated strings (for example,
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "?""?/" rather than "??/", which could be confused with
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       "\\").  */
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    QA_SPLIT_TRIGRAPHS = 0x04
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  };
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* For now, --quoting-style=literal is the default, but this may change.  */
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifndef DEFAULT_QUOTING_STYLE
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define DEFAULT_QUOTING_STYLE literal_quoting_style
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Names of quoting styles and their corresponding values.  */
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern char const *const quoting_style_args[];
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern enum quoting_style const quoting_style_vals[];
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct quoting_options;
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The functions listed below set and use a hidden variable
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   that contains the default quoting style options.  */
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate a new set of quoting options, with contents initially identical
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   to O if O is not null, or to the default if O is null.
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   It is the caller's responsibility to free the result.  */
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct quoting_options *clone_quoting_options (struct quoting_options *o);
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Get the value of O's quoting style.  If O is null, use the default.  */
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum quoting_style get_quoting_style (struct quoting_options *o);
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* In O (or in the default if O is null),
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   set the value of the quoting style to S.  */
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid set_quoting_style (struct quoting_options *o, enum quoting_style s);
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* In O (or in the default if O is null),
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   set the value of the quoting options for character C to I.
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Return the old value.  Currently, the only values defined for I are
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   0 (the default) and 1 (which means to quote the character even if
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it would not otherwise be quoted).  C must never be a digit or a
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   letter that has special meaning after a backslash (for example, "\t"
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   for tab).  */
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint set_char_quoting (struct quoting_options *o, char c, int i);
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* In O (or in the default if O is null),
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   set the value of the quoting options flag to I, which can be a
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   bitwise combination of enum quoting_flags, or 0 for default
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   behavior.  Return the old value.  */
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wangint set_quoting_flags (struct quoting_options *o, int i);
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* In O (or in the default if O is null),
27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   set the value of the quoting style to custom_quoting_style,
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   set the left quote to LEFT_QUOTE, and set the right quote to
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   RIGHT_QUOTE.  Each of LEFT_QUOTE and RIGHT_QUOTE must be
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   null-terminated and can be the empty string.  Because backslashes are
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   used for escaping, it does not make sense for RIGHT_QUOTE to contain
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   a backslash.  RIGHT_QUOTE must not begin with a digit or a letter
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   that has special meaning after a backslash (for example, "\t" for
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   tab).  */
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid set_custom_quoting (struct quoting_options *o,
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         char const *left_quote,
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         char const *right_quote);
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   argument ARG (of size ARGSIZE), using O to control quoting.
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If O is null, use the default.
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Terminate the output with a null character, and return the written
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   size of the output, not counting the terminating null.
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If BUFFERSIZE is too small to store the output string, return the
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   value that would have been returned had BUFFERSIZE been large enough.
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If ARGSIZE is -1, use the string length of the argument for ARGSIZE.
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   On output, BUFFER might contain embedded null bytes if ARGSIZE was
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   not -1, the style of O does not use backslash escapes, and the
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   flags of O do not request elision of null bytes.*/
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize_t quotearg_buffer (char *buffer, size_t buffersize,
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char const *arg, size_t argsize,
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        struct quoting_options const *o);
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Like quotearg_buffer, except return the result in a newly allocated
30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   buffer.  It is the caller's responsibility to free the result.  The
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   result will not contain embedded null bytes.  */
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg_alloc (char const *arg, size_t argsize,
30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                      struct quoting_options const *o);
30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Like quotearg_alloc, except that the length of the result,
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   excluding the terminating null byte, is stored into SIZE if it is
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   non-NULL.  The result might contain embedded null bytes if ARGSIZE
30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   was not -1, SIZE was not NULL, the style of O does not use
30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   backslash escapes, and the flags of O do not request elision of
31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   null bytes.*/
31105436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_alloc_mem (char const *arg, size_t argsize,
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          size_t *size, struct quoting_options const *o);
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Use storage slot N to return a quoted version of the string ARG.
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Use the default quoting options.
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   The returned value points to static storage that can be
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   reused by the next call to this function with the same value of N.
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   N must be nonnegative.  The output of all functions in the
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   quotearg_n family are guaranteed to not contain embedded null
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   bytes.*/
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg_n (int n, char const *arg);
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Equivalent to quotearg_n (0, ARG).  */
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg (char const *arg);
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Use storage slot N to return a quoted version of the argument ARG
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   of size ARGSIZE.  This is like quotearg_n (N, ARG), except it can
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   quote null bytes.  */
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_n_mem (int n, char const *arg, size_t argsize);
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Equivalent to quotearg_n_mem (0, ARG, ARGSIZE).  */
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_mem (char const *arg, size_t argsize);
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Use style S and storage slot N to return a quoted version of the string ARG.
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This is like quotearg_n (N, ARG), except that it uses S with no other
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   options to specify the quoting method.  */
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg_n_style (int n, enum quoting_style s, char const *arg);
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Use style S and storage slot N to return a quoted version of the
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   argument ARG of size ARGSIZE.  This is like quotearg_n_style
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (N, S, ARG), except it can quote null bytes.  */
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg_n_style_mem (int n, enum quoting_style s,
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            char const *arg, size_t argsize);
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Equivalent to quotearg_n_style (0, S, ARG).  */
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg_style (enum quoting_style s, char const *arg);
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Equivalent to quotearg_n_style_mem (0, S, ARG, ARGSIZE).  */
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_style_mem (enum quoting_style s,
35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                          char const *arg, size_t argsize);
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Like quotearg (ARG), except also quote any instances of CH.
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   See set_char_quoting for a description of acceptable CH values.  */
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg_char (char const *arg, char ch);
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Like quotearg_char (ARG, CH), except it can quote null bytes.  */
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_char_mem (char const *arg, size_t argsize, char ch);
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Equivalent to quotearg_char (ARG, ':').  */
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *quotearg_colon (char const *arg);
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Like quotearg_colon (ARG), except it can quote null bytes.  */
36305436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_colon_mem (char const *arg, size_t argsize);
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Like quotearg_n_style (N, S, ARG) but with S as custom_quoting_style
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   with left quote as LEFT_QUOTE and right quote as RIGHT_QUOTE.  See
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   set_custom_quoting for a description of acceptable LEFT_QUOTE and
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   RIGHT_QUOTE values.  */
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_n_custom (int n, char const *left_quote,
37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         char const *right_quote, char const *arg);
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Like quotearg_n_custom (N, LEFT_QUOTE, RIGHT_QUOTE, ARG) except it
37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   can quote null bytes.  */
37405436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_n_custom_mem (int n, char const *left_quote,
37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             char const *right_quote,
37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             char const *arg, size_t argsize);
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Equivalent to quotearg_n_custom (0, LEFT_QUOTE, RIGHT_QUOTE, ARG).  */
37905436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_custom (char const *left_quote, char const *right_quote,
38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       char const *arg);
38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Equivalent to quotearg_n_custom_mem (0, LEFT_QUOTE, RIGHT_QUOTE, ARG,
38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        ARGSIZE).  */
38405436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *quotearg_custom_mem (char const *left_quote,
38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           char const *right_quote,
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           char const *arg, size_t argsize);
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
38805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Free any dynamically allocated memory.  */
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid quotearg_free (void);
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* !QUOTEARG_H_ */
392