annotate lib/quotearg.c @ 1282:c5862deb63ad

Update from patch-2.5.3.
author Jim Meyering <jim@meyering.net>
date Sat, 21 Mar 1998 08:49:00 +0000
parents 4d96c17d0c49
children 56dbd84ae920
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
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2 Copyright (C) 1998 Free Software Foundation, Inc.
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 #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30 # define ISASCII(c) 1
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 #else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 # define ISASCII(c) isascii (c)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 #ifdef isgraph
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 # define ISGRAPH(c) (ISASCII (c) && isgraph (c))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 #else
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 # define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 #if HAVE_LIMITS_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 # include <limits.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 #ifndef CHAR_BIT
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44 # define CHAR_BIT 8
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 #ifndef UCHAR_MAX
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47 # define UCHAR_MAX ((unsigned char) -1)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
48 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 #if HAVE_STDLIB_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 # include <stdlib.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54 #if HAVE_STRING_H
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 # include <string.h>
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 #endif
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 #define INT_BITS (sizeof (int) * CHAR_BIT)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 struct quoting_options
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62 /* Basic quoting style. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
63 enum quoting_style style;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64
Jim Meyering <jim@meyering.net>
parents:
diff changeset
65 /* Quote the chararacters indicated by this bit vector even if the
Jim Meyering <jim@meyering.net>
parents:
diff changeset
66 quoting style would not normally require them to be quoted. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
67 int quote_these_too[((UCHAR_MAX + 1) / INT_BITS
Jim Meyering <jim@meyering.net>
parents:
diff changeset
68 + ((UCHAR_MAX + 1) % INT_BITS != 0))];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
69 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71 /* Names of quoting styles. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
72 char const *const quoting_style_args[] =
Jim Meyering <jim@meyering.net>
parents:
diff changeset
73 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 "literal", "shell", "shell-always", "c", "escape", 0
Jim Meyering <jim@meyering.net>
parents:
diff changeset
75 };
Jim Meyering <jim@meyering.net>
parents:
diff changeset
76
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
77 /* The default quoting options. */
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
78 static struct quoting_options default_quoting_options;
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
79
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 /* 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
81 to O if O is not null, or to the default if O is null.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 It is the caller's responsibility to free the result. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 struct quoting_options *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 clone_quoting_options (struct quoting_options *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 struct quoting_options *p
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 = (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
88 *p = *(o ? o : &default_quoting_options);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89 return p;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
92 /* Get the value of O's quoting style. If O is null, use the default. */
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93 enum quoting_style
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 get_quoting_style (struct quoting_options *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
96 return (o ? o : &default_quoting_options)->style;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
99 /* 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
100 set the value of the quoting style to S. */
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 void
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 set_quoting_style (struct quoting_options *o, enum quoting_style s)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
104 (o ? o : &default_quoting_options)->style = s;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
107 /* 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
108 set the value of the quoting options for character C to I.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 Return the old value. Currently, the only values defined for I are
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 0 (the default) and 1 (which means to quote the character even if
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 it would not otherwise be quoted). */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 int
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 set_char_quoting (struct quoting_options *o, char c, int i)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 unsigned char uc = c;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
116 int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 int shift = uc % INT_BITS;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 int r = (*p >> shift) & 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 *p ^= ((i & 1) ^ r) << shift;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 return r;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
123 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 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
125 If O is null, use the default.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126 Terminate the output with a null character, and return the written
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 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
128 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
129 value that would have been returned had BUFFERSIZE been large enough.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130 If ARGSIZE is -1, use the string length of the argument for ARGSIZE. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 size_t
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
132 quotearg_buffer (char *buffer, size_t buffersize,
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133 char const *arg, size_t argsize,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 struct quoting_options const *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 unsigned char c;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137 size_t i;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 size_t len;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 int quote_mark;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
140 struct quoting_options const *p = o ? o : &default_quoting_options;
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
141 enum quoting_style quoting_style = p->style;
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
142 #define STORE(c) \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
143 do \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
144 { \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
145 if (len < buffersize) \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
146 buffer[len] = (c); \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
147 len++; \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
148 } \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
149 while (0)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151 switch (quoting_style)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
153 case shell_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154 if (! (argsize == -1 ? arg[0] == '\0' : argsize == 0))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 switch (arg[0])
Jim Meyering <jim@meyering.net>
parents:
diff changeset
157 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
158 case '#': case '~':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
159 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
160
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
162 len = 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163 for (i = 0; ; i++)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
164 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165 if (argsize == -1 ? arg[i] == '\0' : i == argsize)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
166 goto done;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 c = arg[i];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
169
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170 switch (c)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 case '\t': case '\n': case ' ':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 case '!': /* special in csh */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174 case '"': case '$': case '&': case '\'':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
175 case '(': case ')': case '*': case ';':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176 case '<': case '>': case '?': case '[': case '\\':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177 case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
178 case '`': case '|':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
179 goto needs_quoting;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
180 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
181
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
182 if (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
183 goto needs_quoting;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184
Jim Meyering <jim@meyering.net>
parents:
diff changeset
185 STORE (c);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
187
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 needs_quoting:;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
189 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 /* Fall through. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
193
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 case shell_always_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195 quote_mark = '\'';
Jim Meyering <jim@meyering.net>
parents:
diff changeset
196 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
197
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198 case c_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199 quote_mark = '"';
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
201
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
203 quote_mark = 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
204 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
205 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
206
Jim Meyering <jim@meyering.net>
parents:
diff changeset
207 len = 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
208
Jim Meyering <jim@meyering.net>
parents:
diff changeset
209 if (quote_mark)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
210 STORE (quote_mark);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
211
Jim Meyering <jim@meyering.net>
parents:
diff changeset
212 for (i = 0; ! (argsize == -1 ? arg[i] == '\0' : i == argsize); i++)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
213 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
214 c = arg[i];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
215
Jim Meyering <jim@meyering.net>
parents:
diff changeset
216 switch (quoting_style)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
217 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
218 case literal_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
219 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
220
Jim Meyering <jim@meyering.net>
parents:
diff changeset
221 case shell_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
222 case shell_always_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
223 if (c == '\'')
Jim Meyering <jim@meyering.net>
parents:
diff changeset
224 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
225 STORE ('\'');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
226 STORE ('\\');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
227 STORE ('\'');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
228 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
229 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
230
Jim Meyering <jim@meyering.net>
parents:
diff changeset
231 case c_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
232 case escape_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
233 switch (c)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
234 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
235 case '?': /* Do not generate trigraphs. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
236 case '\\': goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
237 /* Not all C compilers know what \a means. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
238 case 7 : c = 'a'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
239 case '\b': c = 'b'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
240 case '\f': c = 'f'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
241 case '\n': c = 'n'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
242 case '\r': c = 'r'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
243 case '\t': c = 't'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
244 case '\v': c = 'v'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
245
Jim Meyering <jim@meyering.net>
parents:
diff changeset
246 case ' ':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
247 if (quoting_style == escape_quoting_style)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
248 goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
249 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
250
Jim Meyering <jim@meyering.net>
parents:
diff changeset
251 case '"':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
252 if (quoting_style == c_quoting_style)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
253 goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
254 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
255
Jim Meyering <jim@meyering.net>
parents:
diff changeset
256 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
257 if (!ISGRAPH (c))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
258 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
259 STORE ('\\');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
260 STORE ('0' + (c >> 6));
Jim Meyering <jim@meyering.net>
parents:
diff changeset
261 STORE ('0' + ((c >> 3) & 3));
Jim Meyering <jim@meyering.net>
parents:
diff changeset
262 c = '0' + (c & 3);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
263 goto store_c;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
264 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
265 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
266 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
267
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
268 if (! (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
269 goto store_c;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
270
Jim Meyering <jim@meyering.net>
parents:
diff changeset
271 store_escape:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
272 STORE ('\\');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
273 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
274
Jim Meyering <jim@meyering.net>
parents:
diff changeset
275 store_c:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
276 STORE (c);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
277 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
278
Jim Meyering <jim@meyering.net>
parents:
diff changeset
279 if (quote_mark)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
280 STORE (quote_mark);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
281
Jim Meyering <jim@meyering.net>
parents:
diff changeset
282 done:
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
283 if (len < buffersize)
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
284 buffer[len] = '\0';
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
285 return len;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
286 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
287
Jim Meyering <jim@meyering.net>
parents:
diff changeset
288 /* Use storage slot N to return a quoted version of the string ARG.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
289 OPTIONS specifies the quoting options.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
290 The returned value points to static storage that can be
Jim Meyering <jim@meyering.net>
parents:
diff changeset
291 reused by the next call to this function with the same value of N.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
292 N must be nonnegative. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
293 static char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
294 quotearg_n_options (int n, char const *arg, struct quoting_options *options)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
295 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
296 static unsigned nslots;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
297 static struct slotvec
Jim Meyering <jim@meyering.net>
parents:
diff changeset
298 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
299 size_t size;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
300 char *val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
301 } *slotvec;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
302
Jim Meyering <jim@meyering.net>
parents:
diff changeset
303 if (nslots <= n)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
304 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
305 int n1 = n + 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
306 size_t s = n1 * sizeof (struct slotvec);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
307 if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
308 abort ();
Jim Meyering <jim@meyering.net>
parents:
diff changeset
309 slotvec = (struct slotvec *) xrealloc (slotvec, s);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
310 memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
Jim Meyering <jim@meyering.net>
parents:
diff changeset
311 nslots = n;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
312 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
313
Jim Meyering <jim@meyering.net>
parents:
diff changeset
314 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
315 size_t size = slotvec[n].size;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
316 char *val = slotvec[n].val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
317 size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
318
Jim Meyering <jim@meyering.net>
parents:
diff changeset
319 if (size <= qsize)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
320 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
321 slotvec[n].size = size = qsize + 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
322 slotvec[n].val = val = xrealloc (val, size);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
323 quotearg_buffer (val, size, arg, (size_t) -1, options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
324 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
325
Jim Meyering <jim@meyering.net>
parents:
diff changeset
326 return val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
327 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
328 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
329
Jim Meyering <jim@meyering.net>
parents:
diff changeset
330 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
331 quotearg_n (int n, char const *arg)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
332 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
333 return quotearg_n_options (n, arg, &default_quoting_options);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
334 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
335
Jim Meyering <jim@meyering.net>
parents:
diff changeset
336 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
337 quotearg (char const *arg)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
338 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
339 return quotearg_n (0, arg);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
340 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
341
Jim Meyering <jim@meyering.net>
parents:
diff changeset
342 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
343 quotearg_char (char const *arg, char ch)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
344 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
345 struct quoting_options options;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
346 options = default_quoting_options;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
347 set_char_quoting (&options, ch, 1);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
348 return quotearg_n_options (0, arg, &options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
349 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
350
Jim Meyering <jim@meyering.net>
parents:
diff changeset
351 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
352 quotearg_colon (char const *arg)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
353 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
354 return quotearg_char (arg, ':');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
355 }