Module Name: src
Committed By: dholland
Date: Sun Aug 11 00:28:46 UTC 2013
Modified Files:
src/usr.bin/tr: tr.c
Log Message:
Make tr -c work. Fixes PR 48113.
When -c is in effect, scan string1 first, complement it, and then
iterate over the results while scanning string2. Otherwise, scan
string1 and string2 together as before.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/usr.bin/tr/tr.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/tr/tr.c
diff -u src/usr.bin/tr/tr.c:1.14 src/usr.bin/tr/tr.c:1.15
--- src/usr.bin/tr/tr.c:1.14 Sun Aug 11 00:12:47 2013
+++ src/usr.bin/tr/tr.c Sun Aug 11 00:28:46 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: tr.c,v 1.14 2013/08/11 00:12:47 dholland Exp $ */
+/* $NetBSD: tr.c,v 1.15 2013/08/11 00:28:46 dholland Exp $ */
/*
* Copyright (c) 1988, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
#if 0
static char sccsid[] = "@(#)tr.c 8.2 (Berkeley) 5/4/95";
#endif
-__RCSID("$NetBSD: tr.c,v 1.14 2013/08/11 00:12:47 dholland Exp $");
+__RCSID("$NetBSD: tr.c,v 1.15 2013/08/11 00:28:46 dholland Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -93,7 +93,7 @@ __dead static void usage(void);
int
main(int argc, char **argv)
{
- int ch, ch2, cnt, lastch, *p;
+ int ch, ch2, lastch;
int cflag, dflag, sflag, isstring2;
STR *s1, *s2;
@@ -198,18 +198,37 @@ main(int argc, char **argv)
if (!isstring2)
usage();
- str_setstring(s1, argv[0]);
+ if (cflag) {
+ setup(string1, argv[0], s1, cflag);
+ ch = -1;
+ } else {
+ str_setstring(s1, argv[0]);
+ }
str_setstring(s2, argv[1]);
- if (cflag)
- for (cnt = NCHARS, p = string1; cnt--;)
- *p++ = OOBCH;
-
if (!next(s2, &ch2))
errx(1, "empty string2");
/* If string2 runs out of characters, use the last one specified. */
- while (next(s1, &ch)) {
+ while (1) {
+ if (cflag) {
+ ch++;
+ while (ch < NCHARS && string1[ch] == 0) {
+ if (string1[ch] == 0) {
+ string1[ch] = ch;
+ }
+ ch++;
+ }
+ if (ch == NCHARS) {
+ break;
+ }
+ }
+ else {
+ if (!next(s1, &ch)) {
+ break;
+ }
+ }
+
string1[ch] = ch2;
if (sflag) {
string2[ch2] = 1;
@@ -217,10 +236,6 @@ main(int argc, char **argv)
(void)next(s2, &ch2);
}
- if (cflag)
- for (cnt = 0, p = string1; cnt < NCHARS; ++p, ++cnt)
- *p = *p == OOBCH ? ch2 : cnt;
-
if (sflag)
for (lastch = OOBCH; (ch = getchar()) != EOF;) {
ch = string1[ch];
@@ -232,6 +247,7 @@ main(int argc, char **argv)
else
while ((ch = getchar()) != EOF)
(void)putchar(string1[ch]);
+
str_destroy(s1);
str_destroy(s2);
exit (0);