annotate lib/quotearg.c @ 2703:08bfe8406b31

Make inclusion of <wchar.h> independent of whether HAVE_MBRTOWC is set. Required at least for irix-5.6, which lacks mbrtowc.
author Jim Meyering <jim@meyering.net>
date Tue, 04 Jul 2000 17:31:56 +0000
parents 0013b0a829f1
children dd796bd10e53
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* quotearg.c - quote arguments for output
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
2 Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 any later version.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 GNU General Public License for more details.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 /* Written by Paul Eggert <eggert@twinsun.com> */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 #if HAVE_CONFIG_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 # include <config.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 #include <sys/types.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include <quotearg.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #include <xalloc.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 #include <ctype.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29
1920
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
30 #if ENABLE_NLS
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
31 # include <libintl.h>
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
32 # define _(text) gettext (text)
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
33 #else
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
34 # define _(text) text
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
35 #endif
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
36
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 #if HAVE_LIMITS_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 # include <limits.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 #ifndef CHAR_BIT
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 # define CHAR_BIT 8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 #ifndef UCHAR_MAX
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 # define UCHAR_MAX ((unsigned char) -1)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46
2299
8ed5c871e719 (ALERT_CHAR): New macro.
Jim Meyering <jim@meyering.net>
parents: 2237
diff changeset
47 #if HAVE_C_BACKSLASH_A
8ed5c871e719 (ALERT_CHAR): New macro.
Jim Meyering <jim@meyering.net>
parents: 2237
diff changeset
48 # define ALERT_CHAR '\a'
8ed5c871e719 (ALERT_CHAR): New macro.
Jim Meyering <jim@meyering.net>
parents: 2237
diff changeset
49 #else
8ed5c871e719 (ALERT_CHAR): New macro.
Jim Meyering <jim@meyering.net>
parents: 2237
diff changeset
50 # define ALERT_CHAR '\7'
8ed5c871e719 (ALERT_CHAR): New macro.
Jim Meyering <jim@meyering.net>
parents: 2237
diff changeset
51 #endif
8ed5c871e719 (ALERT_CHAR): New macro.
Jim Meyering <jim@meyering.net>
parents: 2237
diff changeset
52
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 #if HAVE_STDLIB_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 # include <stdlib.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 #if HAVE_STRING_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 # include <string.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60
2703
08bfe8406b31 Make inclusion of <wchar.h> independent of whether
Jim Meyering <jim@meyering.net>
parents: 2692
diff changeset
61 #if HAVE_WCHAR_H
08bfe8406b31 Make inclusion of <wchar.h> independent of whether
Jim Meyering <jim@meyering.net>
parents: 2692
diff changeset
62 # include <wchar.h>
08bfe8406b31 Make inclusion of <wchar.h> independent of whether
Jim Meyering <jim@meyering.net>
parents: 2692
diff changeset
63 #endif
08bfe8406b31 Make inclusion of <wchar.h> independent of whether
Jim Meyering <jim@meyering.net>
parents: 2692
diff changeset
64
2641
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
65 #if HAVE_MBRTOWC && HAVE_WCHAR_H
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
66 # if !HAVE_MBSTATE_T_OBJECT
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
67 # define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
68 # endif
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
69 #else
2692
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
70 # define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0)
2641
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
71 # define mbsinit(ps) 1
2692
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
72 # define iswprint(wc) ISPRINT ((unsigned char) (wc))
2641
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
73 #endif
0fd2ca768e87 Include <wctype.h> after <wchar.h>,
Jim Meyering <jim@meyering.net>
parents: 2299
diff changeset
74
2692
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
75 #ifndef iswprint
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
76 # if HAVE_WCTYPE_H
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
77 # include <wctype.h>
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
78 # endif
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
79 # if !defined iswprint && !HAVE_ISWPRINT
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
80 # define iswprint(wc) 1
0013b0a829f1 (mbrtowc): Assign to *pwc, and return 1 only if result is nonzero.
Jim Meyering <jim@meyering.net>
parents: 2689
diff changeset
81 # endif
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
82 #endif
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
83
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 #define INT_BITS (sizeof (int) * CHAR_BIT)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85
2234
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
86 #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
87 /* Undefine to protect against the definition in wctype.h of solaris2.6. */
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
88 # undef ISASCII
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
89 # define ISASCII(c) 1
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
90 #else
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
91 # define ISASCII(c) isascii (c)
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
92 #endif
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
93 /* Undefine to protect against the definition in wctype.h of solaris2.6. */
2237
5fc41d889f78 fix typo. sheesh
Jim Meyering <jim@meyering.net>
parents: 2234
diff changeset
94 #undef ISPRINT
2234
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
95 #define ISPRINT(c) (ISASCII (c) && isprint (c))
c4a8e51bfd93 (ISASCII): Add #undef and move definition to follow
Jim Meyering <jim@meyering.net>
parents: 2183
diff changeset
96
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 struct quoting_options
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 /* Basic quoting style. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 enum quoting_style style;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
102 /* Quote the characters indicated by this bit vector even if the
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 quoting style would not normally require them to be quoted. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 int quote_these_too[((UCHAR_MAX + 1) / INT_BITS
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 + ((UCHAR_MAX + 1) % INT_BITS != 0))];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 /* Names of quoting styles. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 char const *const quoting_style_args[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 {
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
111 "literal",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
112 "shell",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
113 "shell-always",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
114 "c",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
115 "escape",
1920
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
116 "locale",
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
117 0
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
118 };
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
119
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
120 /* Correspondences to quoting style names. */
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
121 enum quoting_style const quoting_style_vals[] =
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
122 {
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
123 literal_quoting_style,
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
124 shell_quoting_style,
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
125 shell_always_quoting_style,
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
126 c_quoting_style,
1920
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
127 escape_quoting_style,
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
128 locale_quoting_style
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
131 /* The default quoting options. */
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
132 static struct quoting_options default_quoting_options;
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
133
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 /* Allocate a new set of quoting options, with contents initially identical
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
135 to O if O is not null, or to the default if O is null.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 It is the caller's responsibility to free the result. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137 struct quoting_options *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 clone_quoting_options (struct quoting_options *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 struct quoting_options *p
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141 = (struct quoting_options *) xmalloc (sizeof (struct quoting_options));
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
142 *p = *(o ? o : &default_quoting_options);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
143 return p;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
145
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
146 /* Get the value of O's quoting style. If O is null, use the default. */
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
147 enum quoting_style
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148 get_quoting_style (struct quoting_options *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
150 return (o ? o : &default_quoting_options)->style;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
153 /* In O (or in the default if O is null),
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
154 set the value of the quoting style to S. */
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 void
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 set_quoting_style (struct quoting_options *o, enum quoting_style s)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
157 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
158 (o ? o : &default_quoting_options)->style = s;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
159 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
160
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
161 /* In O (or in the default if O is null),
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
162 set the value of the quoting options for character C to I.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163 Return the old value. Currently, the only values defined for I are
Jim Meyering <jim@meyering.net>
parents:
diff changeset
164 0 (the default) and 1 (which means to quote the character even if
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165 it would not otherwise be quoted). */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
166 int
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167 set_char_quoting (struct quoting_options *o, char c, int i)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
169 unsigned char uc = c;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
170 int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 int shift = uc % INT_BITS;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 int r = (*p >> shift) & 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 *p ^= ((i & 1) ^ r) << shift;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174 return r;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
175 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
177 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
178 argument ARG (of size ARGSIZE), using QUOTING_STYLE and the
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
179 non-quoting-style part of O to control quoting.
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
180 Terminate the output with a null character, and return the written
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
181 size of the output, not counting the terminating null.
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
182 If BUFFERSIZE is too small to store the output string, return the
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
183 value that would have been returned had BUFFERSIZE been large enough.
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
184 If ARGSIZE is -1, use the string length of the argument for ARGSIZE.
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
185
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
186 This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
187 ARGSIZE, O), except it uses QUOTING_STYLE instead of the quoting
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
188 style specified by O, and O may not be null. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
189
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
190 static size_t
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
191 quotearg_buffer_restyled (char *buffer, size_t buffersize,
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
192 char const *arg, size_t argsize,
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
193 enum quoting_style quoting_style,
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
194 struct quoting_options const *o)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
195 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
196 size_t i;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
197 size_t len = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
198 char const *quote_string = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
199 size_t quote_string_len = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
200 int backslash_escapes = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
201
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
202 #define STORE(c) \
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
203 do \
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
204 { \
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
205 if (len < buffersize) \
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
206 buffer[len] = (c); \
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
207 len++; \
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
208 } \
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
209 while (0)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
210
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
211 switch (quoting_style)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
212 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
213 case c_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
214 STORE ('"');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
215 backslash_escapes = 1;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
216 quote_string = "\"";
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
217 quote_string_len = 1;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
218 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
219
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
220 case escape_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
221 backslash_escapes = 1;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
222 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
223
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
224 case locale_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
225 for (quote_string = _("`"); *quote_string; quote_string++)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
226 STORE (*quote_string);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
227 backslash_escapes = 1;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
228 quote_string = _("'");
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
229 quote_string_len = strlen (quote_string);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
230 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
231
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
232 case shell_always_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
233 STORE ('\'');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
234 quote_string = "'";
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
235 quote_string_len = 1;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
236 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
237
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
238 default:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
239 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
240 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
241
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
242 for (i = 0; ! (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize); i++)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
243 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
244 unsigned char c;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
245 unsigned char esc;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
246
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
247 if (backslash_escapes
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
248 && quote_string_len
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
249 && i + quote_string_len <= argsize
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
250 && memcmp (arg + i, quote_string, quote_string_len) == 0)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
251 STORE ('\\');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
252
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
253 c = arg[i];
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
254 switch (c)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
255 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
256 case '?':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
257 switch (quoting_style)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
258 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
259 case shell_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
260 goto use_shell_always_quoting_style;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
261
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
262 case c_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
263 if (i + 2 < argsize && arg[i + 1] == '?')
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
264 switch (arg[i + 2])
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
265 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
266 case '!': case '\'':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
267 case '(': case ')': case '-': case '/':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
268 case '<': case '=': case '>':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
269 /* Escape the second '?' in what would otherwise be
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
270 a trigraph. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
271 i += 2;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
272 c = arg[i + 2];
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
273 STORE ('?');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
274 STORE ('\\');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
275 STORE ('?');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
276 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
277 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
278 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
279
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
280 default:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
281 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
282 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
283 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
284
2299
8ed5c871e719 (ALERT_CHAR): New macro.
Jim Meyering <jim@meyering.net>
parents: 2237
diff changeset
285 case ALERT_CHAR: esc = 'a'; goto c_escape;
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
286 case '\b': esc = 'b'; goto c_escape;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
287 case '\f': esc = 'f'; goto c_escape;
2145
d0a924014953 (quotearg_buffer_restyled): Do not quote
Jim Meyering <jim@meyering.net>
parents: 2124
diff changeset
288 case '\n': esc = 'n'; goto c_and_shell_escape;
d0a924014953 (quotearg_buffer_restyled): Do not quote
Jim Meyering <jim@meyering.net>
parents: 2124
diff changeset
289 case '\r': esc = 'r'; goto c_and_shell_escape;
d0a924014953 (quotearg_buffer_restyled): Do not quote
Jim Meyering <jim@meyering.net>
parents: 2124
diff changeset
290 case '\t': esc = 't'; goto c_and_shell_escape;
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
291 case '\v': esc = 'v'; goto c_escape;
2145
d0a924014953 (quotearg_buffer_restyled): Do not quote
Jim Meyering <jim@meyering.net>
parents: 2124
diff changeset
292 case '\\': esc = c; goto c_and_shell_escape;
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
293
2145
d0a924014953 (quotearg_buffer_restyled): Do not quote
Jim Meyering <jim@meyering.net>
parents: 2124
diff changeset
294 c_and_shell_escape:
d0a924014953 (quotearg_buffer_restyled): Do not quote
Jim Meyering <jim@meyering.net>
parents: 2124
diff changeset
295 if (quoting_style == shell_quoting_style)
d0a924014953 (quotearg_buffer_restyled): Do not quote
Jim Meyering <jim@meyering.net>
parents: 2124
diff changeset
296 goto use_shell_always_quoting_style;
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
297 c_escape:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
298 if (backslash_escapes)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
299 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
300 c = esc;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
301 goto store_escape;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
302 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
303 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
304
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
305 case '#': case '~':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
306 if (i != 0)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
307 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
308 /* Fall through. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
309 case ' ':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
310 case '!': /* special in bash */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
311 case '"': case '$': case '&':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
312 case '(': case ')': case '*': case ';':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
313 case '<': case '>': case '[':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
314 case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
315 case '`': case '|':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
316 /* A shell special character. In theory, '$' and '`' could
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
317 be the first bytes of multibyte characters, which means
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
318 we should check them with mbrtowc, but in practice this
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
319 doesn't happen so it's not worth worrying about. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
320 if (quoting_style == shell_quoting_style)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
321 goto use_shell_always_quoting_style;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
322 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
323
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
324 case '\'':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
325 switch (quoting_style)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
326 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
327 case shell_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
328 goto use_shell_always_quoting_style;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
329
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
330 case shell_always_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
331 STORE ('\'');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
332 STORE ('\\');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
333 STORE ('\'');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
334 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
335
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
336 default:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
337 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
338 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
339 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
340
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
341 case '%': case '+': case ',': case '-': case '.': case '/':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
342 case '0': case '1': case '2': case '3': case '4': case '5':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
343 case '6': case '7': case '8': case '9': case ':': case '=':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
344 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
345 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
346 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
347 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
348 case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
349 case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
350 case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
351 case 'o': case 'p': case 'q': case 'r': case 's': case 't':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
352 case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
353 case '{': case '}':
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
354 /* These characters don't cause problems, no matter what the
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
355 quoting style is. They cannot start multibyte sequences. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
356 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
357
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
358 default:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
359 /* If we have a multibyte sequence, copy it until we reach
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
360 its end, find an error, or come back to the initial shift
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
361 state. For C-like styles, if the sequence has
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
362 unprintable characters, escape the whole sequence, since
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
363 we can't easily escape single characters within it. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
364 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
365 /* Length of multibyte sequence found so far. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
366 size_t m = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
367
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
368 int printable = 1;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
369 mbstate_t mbstate;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
370 memset (&mbstate, 0, sizeof mbstate);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
371
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
372 if (argsize == (size_t) -1)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
373 argsize = strlen (arg);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
374
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
375 do
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
376 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
377 wchar_t w;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
378 size_t bytes = mbrtowc (&w, &arg[i + m],
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
379 argsize - (i + m), &mbstate);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
380 if (bytes == 0)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
381 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
382 else if (bytes == (size_t) -1)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
383 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
384 printable = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
385 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
386 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
387 else if (bytes == (size_t) -2)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
388 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
389 printable = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
390 while (i + m < argsize && arg[i + m])
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
391 m++;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
392 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
393 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
394 else
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
395 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
396 if (! iswprint (w))
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
397 printable = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
398 m += bytes;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
399 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
400 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
401 while (! mbsinit (&mbstate));
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
402
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
403 if (m <= 1)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
404 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
405 /* Escape a unibyte character like a multibyte
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
406 sequence if using backslash escapes, and if the
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
407 character is not printable. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
408 m = backslash_escapes && ! ISPRINT (c);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
409 printable = 0;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
410 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
411
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
412 if (m)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
413 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
414 /* Output a multibyte sequence, or an escaped
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
415 unprintable unibyte character. */
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
416 size_t imax = i + m - 1;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
417
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
418 for (;;)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
419 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
420 if (backslash_escapes && ! printable)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
421 {
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
422 STORE ('\\');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
423 STORE ('0' + (c >> 6));
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
424 STORE ('0' + ((c >> 3) & 7));
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
425 c = '0' + (c & 7);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
426 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
427 if (i == imax)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
428 break;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
429 STORE (c);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
430 c = arg[++i];
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
431 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
432
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
433 goto store_c;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
434 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
435 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
436 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
437
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
438 if (! (backslash_escapes
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
439 && o->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
440 goto store_c;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
441
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
442 store_escape:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
443 STORE ('\\');
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
444
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
445 store_c:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
446 STORE (c);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
447 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
448
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
449 if (quote_string)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
450 for (; *quote_string; quote_string++)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
451 STORE (*quote_string);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
452
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
453 if (len < buffersize)
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
454 buffer[len] = '\0';
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
455 return len;
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
456
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
457 use_shell_always_quoting_style:
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
458 return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
459 shell_always_quoting_style, o);
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
460 }
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
461
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
462 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
463 argument ARG (of size ARGSIZE), using O to control quoting.
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
464 If O is null, use the default.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
465 Terminate the output with a null character, and return the written
Jim Meyering <jim@meyering.net>
parents:
diff changeset
466 size of the output, not counting the terminating null.
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
467 If BUFFERSIZE is too small to store the output string, return the
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
468 value that would have been returned had BUFFERSIZE been large enough.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
469 If ARGSIZE is -1, use the string length of the argument for ARGSIZE. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
470 size_t
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
471 quotearg_buffer (char *buffer, size_t buffersize,
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
472 char const *arg, size_t argsize,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
473 struct quoting_options const *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
474 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
475 struct quoting_options const *p = o ? o : &default_quoting_options;
2124
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
476 return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
30abc8682bdf Quote multibyte characters correctly.
Jim Meyering <jim@meyering.net>
parents: 1920
diff changeset
477 p->style, p);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
478 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
479
Jim Meyering <jim@meyering.net>
parents:
diff changeset
480 /* Use storage slot N to return a quoted version of the string ARG.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
481 OPTIONS specifies the quoting options.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
482 The returned value points to static storage that can be
Jim Meyering <jim@meyering.net>
parents:
diff changeset
483 reused by the next call to this function with the same value of N.
1663
8ae2c5884032 (quotearg_n_options): Revert type of parameter `n'
Jim Meyering <jim@meyering.net>
parents: 1650
diff changeset
484 N must be nonnegative. N is deliberately declared with type `int'
8ae2c5884032 (quotearg_n_options): Revert type of parameter `n'
Jim Meyering <jim@meyering.net>
parents: 1650
diff changeset
485 to allow for future extensions (using negative values). */
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
486 static char *
1663
8ae2c5884032 (quotearg_n_options): Revert type of parameter `n'
Jim Meyering <jim@meyering.net>
parents: 1650
diff changeset
487 quotearg_n_options (int n, char const *arg,
1598
d0dff44eca51 (quotearg_n_options): Make `options' parameter be `const'.
Jim Meyering <jim@meyering.net>
parents: 1597
diff changeset
488 struct quoting_options const *options)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
489 {
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
490 static unsigned int nslots;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
491 static struct slotvec
Jim Meyering <jim@meyering.net>
parents:
diff changeset
492 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
493 size_t size;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
494 char *val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
495 } *slotvec;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
496
Jim Meyering <jim@meyering.net>
parents:
diff changeset
497 if (nslots <= n)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
498 {
1663
8ae2c5884032 (quotearg_n_options): Revert type of parameter `n'
Jim Meyering <jim@meyering.net>
parents: 1650
diff changeset
499 int n1 = n + 1;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
500 size_t s = n1 * sizeof (struct slotvec);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
501 if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
502 abort ();
Jim Meyering <jim@meyering.net>
parents:
diff changeset
503 slotvec = (struct slotvec *) xrealloc (slotvec, s);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
504 memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
Jim Meyering <jim@meyering.net>
parents:
diff changeset
505 nslots = n;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
506 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
507
Jim Meyering <jim@meyering.net>
parents:
diff changeset
508 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
509 size_t size = slotvec[n].size;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
510 char *val = slotvec[n].val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
511 size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
512
Jim Meyering <jim@meyering.net>
parents:
diff changeset
513 if (size <= qsize)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
514 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
515 slotvec[n].size = size = qsize + 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
516 slotvec[n].val = val = xrealloc (val, size);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
517 quotearg_buffer (val, size, arg, (size_t) -1, options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
518 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
519
Jim Meyering <jim@meyering.net>
parents:
diff changeset
520 return val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
521 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
522 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
523
Jim Meyering <jim@meyering.net>
parents:
diff changeset
524 char *
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
525 quotearg_n (unsigned int n, char const *arg)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
526 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
527 return quotearg_n_options (n, arg, &default_quoting_options);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
528 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
529
Jim Meyering <jim@meyering.net>
parents:
diff changeset
530 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
531 quotearg (char const *arg)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
532 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
533 return quotearg_n (0, arg);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
534 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
535
Jim Meyering <jim@meyering.net>
parents:
diff changeset
536 char *
1920
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
537 quotearg_n_style (unsigned int n, enum quoting_style s, char const *arg)
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
538 {
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
539 struct quoting_options o;
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
540 o.style = s;
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
541 memset (o.quote_these_too, 0, sizeof o.quote_these_too);
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
542 return quotearg_n_options (n, arg, &o);
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
543 }
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
544
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
545 char *
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
546 quotearg_style (enum quoting_style s, char const *arg)
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
547 {
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
548 return quotearg_n_style (0, s, arg);
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
549 }
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
550
78f6058b59a6 Include <libintl.h> if ENABLE_NLS.
Jim Meyering <jim@meyering.net>
parents: 1891
diff changeset
551 char *
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
552 quotearg_char (char const *arg, char ch)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
553 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
554 struct quoting_options options;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
555 options = default_quoting_options;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
556 set_char_quoting (&options, ch, 1);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
557 return quotearg_n_options (0, arg, &options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
558 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
559
Jim Meyering <jim@meyering.net>
parents:
diff changeset
560 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
561 quotearg_colon (char const *arg)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
562 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
563 return quotearg_char (arg, ':');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
564 }