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