aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-03-15 16:41:55 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-03-15 16:41:55 +0000
commit9210a36495f90343989a7cd90b2c1949803c7460 (patch)
treec37f4fe3426aeeef03775669ba20a8b869abb84e
parentfc58ba1298519712bf42e44ab71a916fb0dfba05 (diff)
downloadbusybox-w32-9210a36495f90343989a7cd90b2c1949803c7460.tar.gz
busybox-w32-9210a36495f90343989a7cd90b2c1949803c7460.tar.bz2
busybox-w32-9210a36495f90343989a7cd90b2c1949803c7460.zip
tr: support -C as synonym to -c
-rw-r--r--coreutils/tr.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/coreutils/tr.c b/coreutils/tr.c
index bf6fa2996..d89b80bec 100644
--- a/coreutils/tr.c
+++ b/coreutils/tr.c
@@ -49,6 +49,14 @@ static void map(char *pvector,
49 * Escapes, e.g., \a ==> Control-G 49 * Escapes, e.g., \a ==> Control-G
50 * Character classes, e.g. [:upper:] ==> A...Z 50 * Character classes, e.g. [:upper:] ==> A...Z
51 * Equiv classess, e.g. [=A=] ==> A (hmmmmmmm?) 51 * Equiv classess, e.g. [=A=] ==> A (hmmmmmmm?)
52 * not supported:
53 * \ooo-\ooo - octal ranges
54 * [x*N] - repeat char x N times
55 * [x*] - repeat char x until it fills STRING2:
56 * # echo qwe123 | /usr/bin/tr 123456789 '[d]'
57 * qwe[d]
58 * # echo qwe123 | /usr/bin/tr 123456789 '[d*]'
59 * qweddd
52 */ 60 */
53static unsigned expand(const char *arg, char **buffer_p) 61static unsigned expand(const char *arg, char **buffer_p)
54{ 62{
@@ -208,7 +216,7 @@ int tr_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
208int tr_main(int argc UNUSED_PARAM, char **argv) 216int tr_main(int argc UNUSED_PARAM, char **argv)
209{ 217{
210 int i; 218 int i;
211 smalluint flags; 219 smalluint opts;
212 ssize_t read_chars; 220 ssize_t read_chars;
213 size_t in_index, out_index; 221 size_t in_index, out_index;
214 unsigned last = UCHAR_MAX + 1; /* not equal to any char */ 222 unsigned last = UCHAR_MAX + 1; /* not equal to any char */
@@ -221,22 +229,27 @@ int tr_main(int argc UNUSED_PARAM, char **argv)
221 char *invec = vector + ASCII; 229 char *invec = vector + ASCII;
222 char *outvec = vector + ASCII * 2; 230 char *outvec = vector + ASCII * 2;
223 231
224#define TR_OPT_complement (1 << 0) 232#define TR_OPT_complement (3 << 0)
225#define TR_OPT_delete (1 << 1) 233#define TR_OPT_delete (1 << 2)
226#define TR_OPT_squeeze_reps (1 << 2) 234#define TR_OPT_squeeze_reps (1 << 3)
227 235
228 for (i = 0; i < ASCII; i++) { 236 for (i = 0; i < ASCII; i++) {
229 vector[i] = i; 237 vector[i] = i;
230 /*invec[i] = outvec[i] = FALSE; - done by xzalloc */ 238 /*invec[i] = outvec[i] = FALSE; - done by xzalloc */
231 } 239 }
232 240
241 /* -C/-c difference is that -C complements "characters",
242 * and -c complements "values" (binary bytes I guess).
243 * In POSIX locale, these are the same.
244 */
245
233 opt_complementary = "-1"; 246 opt_complementary = "-1";
234 flags = getopt32(argv, "+cds"); /* '+': stop at first non-option */ 247 opts = getopt32(argv, "+Ccds"); /* '+': stop at first non-option */
235 argv += optind; 248 argv += optind;
236 249
237 str1_length = expand(*argv++, &str1); 250 str1_length = expand(*argv++, &str1);
238 str2_length = 0; 251 str2_length = 0;
239 if (flags & TR_OPT_complement) 252 if (opts & TR_OPT_complement)
240 str1_length = complement(str1, str1_length); 253 str1_length = complement(str1, str1_length);
241 if (*argv) { 254 if (*argv) {
242 if (argv[0][0] == '\0') 255 if (argv[0][0] == '\0')
@@ -271,10 +284,10 @@ int tr_main(int argc UNUSED_PARAM, char **argv)
271 in_index = 0; 284 in_index = 0;
272 } 285 }
273 c = str1[in_index++]; 286 c = str1[in_index++];
274 if ((flags & TR_OPT_delete) && invec[c]) 287 if ((opts & TR_OPT_delete) && invec[c])
275 continue; 288 continue;
276 coded = vector[c]; 289 coded = vector[c];
277 if ((flags & TR_OPT_squeeze_reps) && last == coded 290 if ((opts & TR_OPT_squeeze_reps) && last == coded
278 && (invec[c] || outvec[coded]) 291 && (invec[c] || outvec[coded])
279 ) { 292 ) {
280 continue; 293 continue;