diff options
-rw-r--r-- | coreutils/tr.c | 27 | ||||
-rw-r--r-- | testsuite/tr/tr-works | 29 |
2 files changed, 38 insertions, 18 deletions
diff --git a/coreutils/tr.c b/coreutils/tr.c index 15a9d17b0..752b13bf8 100644 --- a/coreutils/tr.c +++ b/coreutils/tr.c | |||
@@ -116,7 +116,8 @@ static unsigned int expand(const char *arg, register unsigned char *buffer) | |||
116 | arg += 3; /* Skip the assumed a-z */ | 116 | arg += 3; /* Skip the assumed a-z */ |
117 | } else if (*arg == '[') { | 117 | } else if (*arg == '[') { |
118 | arg++; | 118 | arg++; |
119 | if (ENABLE_FEATURE_TR_CLASSES && *arg++ == ':') { | 119 | i = *arg++; |
120 | if (ENABLE_FEATURE_TR_CLASSES && i == ':') { | ||
120 | if (strncmp(arg, "alpha", 5) == 0) { | 121 | if (strncmp(arg, "alpha", 5) == 0) { |
121 | for (i = 'A'; i <= 'Z'; i++) | 122 | for (i = 'A'; i <= 'Z'; i++) |
122 | *buffer++ = i; | 123 | *buffer++ = i; |
@@ -124,12 +125,12 @@ static unsigned int expand(const char *arg, register unsigned char *buffer) | |||
124 | *buffer++ = i; | 125 | *buffer++ = i; |
125 | } | 126 | } |
126 | else if (strncmp(arg, "alnum", 5) == 0) { | 127 | else if (strncmp(arg, "alnum", 5) == 0) { |
128 | for (i = '0'; i <= '9'; i++) | ||
129 | *buffer++ = i; | ||
127 | for (i = 'A'; i <= 'Z'; i++) | 130 | for (i = 'A'; i <= 'Z'; i++) |
128 | *buffer++ = i; | 131 | *buffer++ = i; |
129 | for (i = 'a'; i <= 'z'; i++) | 132 | for (i = 'a'; i <= 'z'; i++) |
130 | *buffer++ = i; | 133 | *buffer++ = i; |
131 | for (i = '0'; i <= '9'; i++) | ||
132 | *buffer++ = i; | ||
133 | } | 134 | } |
134 | else if (strncmp(arg, "digit", 5) == 0) | 135 | else if (strncmp(arg, "digit", 5) == 0) |
135 | for (i = '0'; i <= '9'; i++) | 136 | for (i = '0'; i <= '9'; i++) |
@@ -140,10 +141,15 @@ static unsigned int expand(const char *arg, register unsigned char *buffer) | |||
140 | else if (strncmp(arg, "upper", 5) == 0) | 141 | else if (strncmp(arg, "upper", 5) == 0) |
141 | for (i = 'A'; i <= 'Z'; i++) | 142 | for (i = 'A'; i <= 'Z'; i++) |
142 | *buffer++ = i; | 143 | *buffer++ = i; |
143 | else if (strncmp(arg, "space", 5) == 0) | 144 | else if (strncmp(arg, "space", 5) == 0) { |
144 | strcat((char*)buffer, " \f\n\r\t\v"); | 145 | const char s[] = "\t\n\v\f\r "; |
145 | else if (strncmp(arg, "blank", 5) == 0) | 146 | strcat((char*)buffer, s); |
146 | strcat((char*)buffer, " \t"); | 147 | buffer += sizeof(s) - 1; |
148 | } | ||
149 | else if (strncmp(arg, "blank", 5) == 0) { | ||
150 | *buffer++ = '\t'; | ||
151 | *buffer++ = ' '; | ||
152 | } | ||
147 | /* gcc gives a warning if braces aren't used here */ | 153 | /* gcc gives a warning if braces aren't used here */ |
148 | else if (strncmp(arg, "punct", 5) == 0) { | 154 | else if (strncmp(arg, "punct", 5) == 0) { |
149 | for (i = 0; i <= ASCII; i++) | 155 | for (i = 0; i <= ASCII; i++) |
@@ -156,13 +162,13 @@ static unsigned int expand(const char *arg, register unsigned char *buffer) | |||
156 | *buffer++ = i; | 162 | *buffer++ = i; |
157 | } | 163 | } |
158 | else { | 164 | else { |
159 | strcat((char*)buffer, "[:"); | 165 | *buffer++ = '['; |
160 | arg++; | 166 | *buffer++ = ':'; |
161 | continue; | 167 | continue; |
162 | } | 168 | } |
163 | break; | 169 | break; |
164 | } | 170 | } |
165 | if (ENABLE_FEATURE_TR_EQUIV && *arg++ == '=') { | 171 | if (ENABLE_FEATURE_TR_EQUIV && i == '=') { |
166 | *buffer++ = *arg; | 172 | *buffer++ = *arg; |
167 | /* skip the closing =] */ | 173 | /* skip the closing =] */ |
168 | arg += 3; | 174 | arg += 3; |
@@ -173,7 +179,6 @@ static unsigned int expand(const char *arg, register unsigned char *buffer) | |||
173 | arg -= 2; | 179 | arg -= 2; |
174 | continue; | 180 | continue; |
175 | } | 181 | } |
176 | i = *arg++; | ||
177 | ac = *arg++; | 182 | ac = *arg++; |
178 | while (i <= ac) | 183 | while (i <= ac) |
179 | *buffer++ = i++; | 184 | *buffer++ = i++; |
diff --git a/testsuite/tr/tr-works b/testsuite/tr/tr-works index 8753a3f28..b7a6e8df7 100644 --- a/testsuite/tr/tr-works +++ b/testsuite/tr/tr-works | |||
@@ -1,9 +1,24 @@ | |||
1 | echo "cbaab" | tr abc zyx > logfile.gnu | 1 | run_tr () |
2 | echo "TESTING A B C" | tr [A-Z] [a-z] >> logfile.gnu | 2 | { |
3 | echo abc[] | tr a[b AXB >> logfile.gnu | 3 | echo -n "echo '$1' | tr '$2' '$3': " |
4 | 4 | echo "$1" | $bb tr "$2" "$3" | |
5 | echo "cbaab" | busybox tr abc zyx > logfile.bb | 5 | echo |
6 | echo "TESTING A B C" | busybox tr [A-Z] [a-z] >> logfile.bb | 6 | } |
7 | echo abc[] | busybox tr a[b AXB >> logfile.bb | 7 | tr_test () |
8 | { | ||
9 | run_tr "cbaab" abc zyx | ||
10 | run_tr "TESTING A B C" '[A-Z]' '[a-z]' | ||
11 | run_tr "abc[]" "a[b" AXB | ||
12 | run_tr abc '[:alpha:]' A-ZA-Z | ||
13 | run_tr abc56 '[:alnum:]' A-ZA-Zxxxxxxxxxx | ||
14 | run_tr 012 '[:digit:]' abcdefghi | ||
15 | run_tr abc56 '[:lower:]' '[:upper:]' | ||
16 | run_tr " " '[:space:]' 12345 | ||
17 | run_tr " " '[:blank:]' 12 | ||
18 | run_tr 'a b' '[= =]' X | ||
19 | run_tr "[:" '[:' ab | ||
20 | } | ||
8 | 21 | ||
22 | bb= tr_test > logfile.gnu | ||
23 | bb=busybox tr_test > logfile.bb | ||
9 | cmp logfile.gnu logfile.bb | 24 | cmp logfile.gnu logfile.bb |