Mercurial > hg > octave-kai > gnulib-hg
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 |
rev | line source |
---|---|
1248 | 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 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software Foundation, | |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
17 | |
18 /* Written by Paul Eggert <eggert@twinsun.com> */ | |
19 | |
20 #if HAVE_CONFIG_H | |
21 # include <config.h> | |
22 #endif | |
23 | |
24 #include <sys/types.h> | |
25 #include <quotearg.h> | |
26 #include <xalloc.h> | |
27 | |
28 #include <ctype.h> | |
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 | 37 #if HAVE_LIMITS_H |
38 # include <limits.h> | |
39 #endif | |
40 #ifndef CHAR_BIT | |
41 # define CHAR_BIT 8 | |
42 #endif | |
43 #ifndef UCHAR_MAX | |
44 # define UCHAR_MAX ((unsigned char) -1) | |
45 #endif | |
46 | |
2299 | 47 #if HAVE_C_BACKSLASH_A |
48 # define ALERT_CHAR '\a' | |
49 #else | |
50 # define ALERT_CHAR '\7' | |
51 #endif | |
52 | |
1248 | 53 #if HAVE_STDLIB_H |
54 # include <stdlib.h> | |
55 #endif | |
56 | |
57 #if HAVE_STRING_H | |
58 # include <string.h> | |
59 #endif | |
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 | 84 #define INT_BITS (sizeof (int) * CHAR_BIT) |
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 | 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 | 97 struct quoting_options |
98 { | |
99 /* Basic quoting style. */ | |
100 enum quoting_style style; | |
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 | 103 quoting style would not normally require them to be quoted. */ |
104 int quote_these_too[((UCHAR_MAX + 1) / INT_BITS | |
105 + ((UCHAR_MAX + 1) % INT_BITS != 0))]; | |
106 }; | |
107 | |
108 /* Names of quoting styles. */ | |
109 char const *const quoting_style_args[] = | |
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 | 129 }; |
130 | |
1282 | 131 /* The default quoting options. */ |
132 static struct quoting_options default_quoting_options; | |
133 | |
1248 | 134 /* Allocate a new set of quoting options, with contents initially identical |
1282 | 135 to O if O is not null, or to the default if O is null. |
1248 | 136 It is the caller's responsibility to free the result. */ |
137 struct quoting_options * | |
138 clone_quoting_options (struct quoting_options *o) | |
139 { | |
140 struct quoting_options *p | |
141 = (struct quoting_options *) xmalloc (sizeof (struct quoting_options)); | |
1282 | 142 *p = *(o ? o : &default_quoting_options); |
1248 | 143 return p; |
144 } | |
145 | |
1282 | 146 /* Get the value of O's quoting style. If O is null, use the default. */ |
1248 | 147 enum quoting_style |
148 get_quoting_style (struct quoting_options *o) | |
149 { | |
1282 | 150 return (o ? o : &default_quoting_options)->style; |
1248 | 151 } |
152 | |
1282 | 153 /* In O (or in the default if O is null), |
154 set the value of the quoting style to S. */ | |
1248 | 155 void |
156 set_quoting_style (struct quoting_options *o, enum quoting_style s) | |
157 { | |
1282 | 158 (o ? o : &default_quoting_options)->style = s; |
1248 | 159 } |
160 | |
1282 | 161 /* In O (or in the default if O is null), |
162 set the value of the quoting options for character C to I. | |
1248 | 163 Return the old value. Currently, the only values defined for I are |
164 0 (the default) and 1 (which means to quote the character even if | |
165 it would not otherwise be quoted). */ | |
166 int | |
167 set_char_quoting (struct quoting_options *o, char c, int i) | |
168 { | |
169 unsigned char uc = c; | |
1282 | 170 int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS; |
1248 | 171 int shift = uc % INT_BITS; |
172 int r = (*p >> shift) & 1; | |
173 *p ^= ((i & 1) ^ r) << shift; | |
174 return r; | |
175 } | |
176 | |
1282 | 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 | 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 | 463 argument ARG (of size ARGSIZE), using O to control quoting. |
1282 | 464 If O is null, use the default. |
1248 | 465 Terminate the output with a null character, and return the written |
466 size of the output, not counting the terminating null. | |
1282 | 467 If BUFFERSIZE is too small to store the output string, return the |
468 value that would have been returned had BUFFERSIZE been large enough. | |
1248 | 469 If ARGSIZE is -1, use the string length of the argument for ARGSIZE. */ |
470 size_t | |
1282 | 471 quotearg_buffer (char *buffer, size_t buffersize, |
1248 | 472 char const *arg, size_t argsize, |
473 struct quoting_options const *o) | |
474 { | |
1282 | 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 | 478 } |
479 | |
480 /* Use storage slot N to return a quoted version of the string ARG. | |
481 OPTIONS specifies the quoting options. | |
482 The returned value points to static storage that can be | |
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 | 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 | 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 | 491 static struct slotvec |
492 { | |
493 size_t size; | |
494 char *val; | |
495 } *slotvec; | |
496 | |
497 if (nslots <= n) | |
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 | 500 size_t s = n1 * sizeof (struct slotvec); |
501 if (! (0 < n1 && n1 == s / sizeof (struct slotvec))) | |
502 abort (); | |
503 slotvec = (struct slotvec *) xrealloc (slotvec, s); | |
504 memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec)); | |
505 nslots = n; | |
506 } | |
507 | |
508 { | |
509 size_t size = slotvec[n].size; | |
510 char *val = slotvec[n].val; | |
511 size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options); | |
512 | |
513 if (size <= qsize) | |
514 { | |
515 slotvec[n].size = size = qsize + 1; | |
516 slotvec[n].val = val = xrealloc (val, size); | |
517 quotearg_buffer (val, size, arg, (size_t) -1, options); | |
518 } | |
519 | |
520 return val; | |
521 } | |
522 } | |
523 | |
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 | 526 { |
1282 | 527 return quotearg_n_options (n, arg, &default_quoting_options); |
1248 | 528 } |
529 | |
530 char * | |
531 quotearg (char const *arg) | |
532 { | |
533 return quotearg_n (0, arg); | |
534 } | |
535 | |
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 | 552 quotearg_char (char const *arg, char ch) |
553 { | |
554 struct quoting_options options; | |
1282 | 555 options = default_quoting_options; |
1248 | 556 set_char_quoting (&options, ch, 1); |
557 return quotearg_n_options (0, arg, &options); | |
558 } | |
559 | |
560 char * | |
561 quotearg_colon (char const *arg) | |
562 { | |
563 return quotearg_char (arg, ':'); | |
564 } |