annotate lib/quotearg.c @ 1650:aa48c3374848

(quotearg_n_options): Declare n1 to be of type unsigned int, not just int.
author Jim Meyering <jim@meyering.net>
date Sat, 16 Jan 1999 15:55:20 +0000
parents e4824ae11924
children 8ae2c5884032
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
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
2 Copyright (C) 1998, 1999 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 #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 {
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
74 "literal",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
75 "shell",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
76 "shell-always",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
77 "c",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
78 "escape",
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
79 0
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
80 };
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
81
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
82 /* Correspondances to quoting style names. */
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
83 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
84 {
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
85 literal_quoting_style,
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
86 shell_quoting_style,
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
87 shell_always_quoting_style,
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
88 c_quoting_style,
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
89 escape_quoting_style
1248
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 /* The default quoting options. */
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
93 static struct quoting_options default_quoting_options;
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
94
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95 /* 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
96 to O if O is not null, or to the default if O is null.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 It is the caller's responsibility to free the result. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98 struct quoting_options *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 clone_quoting_options (struct quoting_options *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 struct quoting_options *p
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 = (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
103 *p = *(o ? o : &default_quoting_options);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104 return p;
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 /* Get the value of O's quoting style. If O is null, use the default. */
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 enum quoting_style
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 get_quoting_style (struct quoting_options *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
111 return (o ? o : &default_quoting_options)->style;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
114 /* 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
115 set the value of the quoting style to S. */
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 void
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 set_quoting_style (struct quoting_options *o, enum quoting_style s)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
119 (o ? o : &default_quoting_options)->style = s;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
122 /* 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
123 set the value of the quoting options for character C to I.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 Return the old value. Currently, the only values defined for I are
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125 0 (the default) and 1 (which means to quote the character even if
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126 it would not otherwise be quoted). */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 int
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 set_char_quoting (struct quoting_options *o, char c, int i)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130 unsigned char uc = c;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
131 int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132 int shift = uc % INT_BITS;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133 int r = (*p >> shift) & 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 *p ^= ((i & 1) ^ r) << shift;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 return r;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
138 /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 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
140 If O is null, use the default.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141 Terminate the output with a null character, and return the written
Jim Meyering <jim@meyering.net>
parents:
diff changeset
142 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
143 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
144 value that would have been returned had BUFFERSIZE been large enough.
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
145 If ARGSIZE is -1, use the string length of the argument for ARGSIZE. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
146 size_t
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
147 quotearg_buffer (char *buffer, size_t buffersize,
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148 char const *arg, size_t argsize,
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149 struct quoting_options const *o)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151 unsigned char c;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152 size_t i;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
153 size_t len;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154 int quote_mark;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
155 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
156 enum quoting_style quoting_style = p->style;
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
157 #define STORE(c) \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
158 do \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
159 { \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
160 if (len < buffersize) \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
161 buffer[len] = (c); \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
162 len++; \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
163 } \
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
164 while (0)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165
Jim Meyering <jim@meyering.net>
parents:
diff changeset
166 switch (quoting_style)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 case shell_quoting_style:
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
169 if (! (argsize == (size_t) -1 ? arg[0] == '\0' : argsize == 0))
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 switch (arg[0])
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 case '#': case '~':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
175
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177 len = 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
178 for (i = 0; ; i++)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
179 {
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
180 if (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
181 goto done;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
182
Jim Meyering <jim@meyering.net>
parents:
diff changeset
183 c = arg[i];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184
Jim Meyering <jim@meyering.net>
parents:
diff changeset
185 switch (c)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
187 case '\t': case '\n': case ' ':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 case '!': /* special in csh */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
189 case '"': case '$': case '&': case '\'':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 case '(': case ')': case '*': case ';':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191 case '<': case '>': case '?': case '[': case '\\':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
193 case '`': case '|':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 goto needs_quoting;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
196
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
197 if (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198 goto needs_quoting;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200 STORE (c);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
201 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202
Jim Meyering <jim@meyering.net>
parents:
diff changeset
203 needs_quoting:;
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 /* Fall through. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
208
Jim Meyering <jim@meyering.net>
parents:
diff changeset
209 case shell_always_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
210 quote_mark = '\'';
Jim Meyering <jim@meyering.net>
parents:
diff changeset
211 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
212
Jim Meyering <jim@meyering.net>
parents:
diff changeset
213 case c_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
214 quote_mark = '"';
Jim Meyering <jim@meyering.net>
parents:
diff changeset
215 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
216
Jim Meyering <jim@meyering.net>
parents:
diff changeset
217 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
218 quote_mark = 0;
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
Jim Meyering <jim@meyering.net>
parents:
diff changeset
222 len = 0;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
223
Jim Meyering <jim@meyering.net>
parents:
diff changeset
224 if (quote_mark)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
225 STORE (quote_mark);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
226
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
227 for (i = 0; ! (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize); i++)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
228 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
229 c = arg[i];
Jim Meyering <jim@meyering.net>
parents:
diff changeset
230
Jim Meyering <jim@meyering.net>
parents:
diff changeset
231 switch (quoting_style)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
232 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
233 case literal_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
234 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
235
Jim Meyering <jim@meyering.net>
parents:
diff changeset
236 case shell_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
237 case shell_always_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
238 if (c == '\'')
Jim Meyering <jim@meyering.net>
parents:
diff changeset
239 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
240 STORE ('\'');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
241 STORE ('\\');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
242 STORE ('\'');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
243 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
244 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
245
Jim Meyering <jim@meyering.net>
parents:
diff changeset
246 case c_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
247 case escape_quoting_style:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
248 switch (c)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
249 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
250 case '?': /* Do not generate trigraphs. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
251 case '\\': goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
252 /* Not all C compilers know what \a means. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
253 case 7 : c = 'a'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
254 case '\b': c = 'b'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
255 case '\f': c = 'f'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
256 case '\n': c = 'n'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
257 case '\r': c = 'r'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
258 case '\t': c = 't'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
259 case '\v': c = 'v'; goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
260
Jim Meyering <jim@meyering.net>
parents:
diff changeset
261 case '"':
Jim Meyering <jim@meyering.net>
parents:
diff changeset
262 if (quoting_style == c_quoting_style)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
263 goto store_escape;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
264 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
265
Jim Meyering <jim@meyering.net>
parents:
diff changeset
266 default:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
267 if (!ISGRAPH (c))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
268 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
269 STORE ('\\');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
270 STORE ('0' + (c >> 6));
1565
56dbd84ae920 (quotearg_buffer): Use `7' as the mask, not `3'.
Jim Meyering <jim@meyering.net>
parents: 1282
diff changeset
271 STORE ('0' + ((c >> 3) & 7));
56dbd84ae920 (quotearg_buffer): Use `7' as the mask, not `3'.
Jim Meyering <jim@meyering.net>
parents: 1282
diff changeset
272 c = '0' + (c & 7);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
273 goto store_c;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
274 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
275 break;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
276 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
277
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
278 if (! (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
279 goto store_c;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
280
Jim Meyering <jim@meyering.net>
parents:
diff changeset
281 store_escape:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
282 STORE ('\\');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
283 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
284
Jim Meyering <jim@meyering.net>
parents:
diff changeset
285 store_c:
Jim Meyering <jim@meyering.net>
parents:
diff changeset
286 STORE (c);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
287 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
288
Jim Meyering <jim@meyering.net>
parents:
diff changeset
289 if (quote_mark)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
290 STORE (quote_mark);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
291
Jim Meyering <jim@meyering.net>
parents:
diff changeset
292 done:
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
293 if (len < buffersize)
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
294 buffer[len] = '\0';
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
295 return len;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
296 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
297
Jim Meyering <jim@meyering.net>
parents:
diff changeset
298 /* Use storage slot N to return a quoted version of the string ARG.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
299 OPTIONS specifies the quoting options.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
300 The returned value points to static storage that can be
Jim Meyering <jim@meyering.net>
parents:
diff changeset
301 reused by the next call to this function with the same value of N.
Jim Meyering <jim@meyering.net>
parents:
diff changeset
302 N must be nonnegative. */
Jim Meyering <jim@meyering.net>
parents:
diff changeset
303 static char *
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
304 quotearg_n_options (unsigned int n, char const *arg,
1598
d0dff44eca51 (quotearg_n_options): Make `options' parameter be `const'.
Jim Meyering <jim@meyering.net>
parents: 1597
diff changeset
305 struct quoting_options const *options)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
306 {
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
307 static unsigned int nslots;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
308 static struct slotvec
Jim Meyering <jim@meyering.net>
parents:
diff changeset
309 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
310 size_t size;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
311 char *val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
312 } *slotvec;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
313
Jim Meyering <jim@meyering.net>
parents:
diff changeset
314 if (nslots <= n)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
315 {
1650
aa48c3374848 (quotearg_n_options): Declare n1 to be of type
Jim Meyering <jim@meyering.net>
parents: 1633
diff changeset
316 unsigned int n1 = n + 1;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
317 size_t s = n1 * sizeof (struct slotvec);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
318 if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
Jim Meyering <jim@meyering.net>
parents:
diff changeset
319 abort ();
Jim Meyering <jim@meyering.net>
parents:
diff changeset
320 slotvec = (struct slotvec *) xrealloc (slotvec, s);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
321 memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
Jim Meyering <jim@meyering.net>
parents:
diff changeset
322 nslots = n;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
323 }
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 size_t size = slotvec[n].size;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
327 char *val = slotvec[n].val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
328 size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
329
Jim Meyering <jim@meyering.net>
parents:
diff changeset
330 if (size <= qsize)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
331 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
332 slotvec[n].size = size = qsize + 1;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
333 slotvec[n].val = val = xrealloc (val, size);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
334 quotearg_buffer (val, size, arg, (size_t) -1, options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
335 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
336
Jim Meyering <jim@meyering.net>
parents:
diff changeset
337 return val;
Jim Meyering <jim@meyering.net>
parents:
diff changeset
338 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
339 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
340
Jim Meyering <jim@meyering.net>
parents:
diff changeset
341 char *
1597
287550eb5c15 (quotearg_buffer): Cast -1 to size_t before comparing.
Jim Meyering <jim@meyering.net>
parents: 1565
diff changeset
342 quotearg_n (unsigned int n, char const *arg)
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
343 {
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
344 return quotearg_n_options (n, arg, &default_quoting_options);
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
345 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
346
Jim Meyering <jim@meyering.net>
parents:
diff changeset
347 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
348 quotearg (char const *arg)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
349 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
350 return quotearg_n (0, arg);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
351 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
352
Jim Meyering <jim@meyering.net>
parents:
diff changeset
353 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
354 quotearg_char (char const *arg, char ch)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
355 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
356 struct quoting_options options;
1282
c5862deb63ad Update from patch-2.5.3.
Jim Meyering <jim@meyering.net>
parents: 1248
diff changeset
357 options = default_quoting_options;
1248
Jim Meyering <jim@meyering.net>
parents:
diff changeset
358 set_char_quoting (&options, ch, 1);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
359 return quotearg_n_options (0, arg, &options);
Jim Meyering <jim@meyering.net>
parents:
diff changeset
360 }
Jim Meyering <jim@meyering.net>
parents:
diff changeset
361
Jim Meyering <jim@meyering.net>
parents:
diff changeset
362 char *
Jim Meyering <jim@meyering.net>
parents:
diff changeset
363 quotearg_colon (char const *arg)
Jim Meyering <jim@meyering.net>
parents:
diff changeset
364 {
Jim Meyering <jim@meyering.net>
parents:
diff changeset
365 return quotearg_char (arg, ':');
Jim Meyering <jim@meyering.net>
parents:
diff changeset
366 }