diff options
author | Rob Landley <rob@landley.net> | 2006-06-30 16:35:40 +0000 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2006-06-30 16:35:40 +0000 |
commit | cd545287c5335cf13006b646ca44597acc5e384b (patch) | |
tree | 8c7db9aee1b1aad464ad8e5f024deffb98f545ea | |
parent | 00c051e42d91bf39f8fa1937c01faf8265ac5c10 (diff) | |
download | busybox-w32-cd545287c5335cf13006b646ca44597acc5e384b.tar.gz busybox-w32-cd545287c5335cf13006b646ca44597acc5e384b.tar.bz2 busybox-w32-cd545287c5335cf13006b646ca44597acc5e384b.zip |
Fix bug 744 by moving the flushing logic into the exhausted read buffer test.
(Also some other minor cleanups while I was there, shouldn't affect the
resulting binary.)
-rw-r--r-- | coreutils/tr.c | 97 |
1 files changed, 22 insertions, 75 deletions
diff --git a/coreutils/tr.c b/coreutils/tr.c index 752b13bf8..594962f92 100644 --- a/coreutils/tr.c +++ b/coreutils/tr.c | |||
@@ -2,75 +2,59 @@ | |||
2 | /* | 2 | /* |
3 | * Mini tr implementation for busybox | 3 | * Mini tr implementation for busybox |
4 | * | 4 | * |
5 | ** Copyright (c) 1987,1997, Prentice Hall All rights reserved. | ||
6 | * | ||
7 | * The name of Prentice Hall may not be used to endorse or promote | ||
8 | * products derived from this software without specific prior | ||
9 | * written permission. | ||
10 | * | ||
5 | * Copyright (c) Michiel Huisjes | 11 | * Copyright (c) Michiel Huisjes |
6 | * | 12 | * |
7 | * This version of tr is adapted from Minix tr and was modified | 13 | * This version of tr is adapted from Minix tr and was modified |
8 | * by Erik Andersen <andersen@codepoet.org> to be used in busybox. | 14 | * by Erik Andersen <andersen@codepoet.org> to be used in busybox. |
9 | * | 15 | * |
10 | * This program is free software; you can redistribute it and/or modify | 16 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
18 | * General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU General Public License | ||
21 | * along with this program; if not, write to the Free Software | ||
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
23 | * | ||
24 | * Original copyright notice is retained at the end of this file. | ||
25 | */ | 17 | */ |
26 | 18 | ||
27 | #include <stdio.h> | ||
28 | #include <string.h> | ||
29 | #include <stdlib.h> | ||
30 | #include <unistd.h> | ||
31 | #include <ctype.h> | ||
32 | #include <sys/types.h> | ||
33 | #include "busybox.h" | 19 | #include "busybox.h" |
34 | 20 | ||
35 | #define ASCII 0377 | 21 | #define ASCII 0377 |
36 | 22 | ||
37 | /* some "globals" shared across this file */ | 23 | /* some "globals" shared across this file */ |
38 | static char com_fl, del_fl, sq_fl; | 24 | static char com_fl, del_fl, sq_fl; |
39 | static short in_index, out_index; | ||
40 | /* these last are pointers to static buffers declared in tr_main */ | 25 | /* these last are pointers to static buffers declared in tr_main */ |
41 | static unsigned char *poutput; | 26 | static unsigned char *poutput; |
42 | static unsigned char *pvector; | 27 | static unsigned char *pvector; |
43 | static unsigned char *pinvec, *poutvec; | 28 | static unsigned char *pinvec, *poutvec; |
44 | 29 | ||
45 | #define input bb_common_bufsiz1 | ||
46 | |||
47 | static void convert(void) | 30 | static void convert(void) |
48 | { | 31 | { |
49 | short read_chars = 0; | 32 | int read_chars = 0, in_index = 0, out_index = 0, c, coded, last = -1; |
50 | short c, coded; | ||
51 | short last = -1; | ||
52 | 33 | ||
53 | for (;;) { | 34 | for (;;) { |
35 | // If we're out of input, flush output and read more input. | ||
36 | |||
54 | if (in_index == read_chars) { | 37 | if (in_index == read_chars) { |
55 | if ((read_chars = read(0, input, BUFSIZ)) <= 0) { | 38 | if (out_index) { |
39 | if (write(1, (char *) poutput, out_index) != out_index) | ||
40 | bb_error_msg_and_die(bb_msg_write_error); | ||
41 | out_index = 0; | ||
42 | } | ||
43 | |||
44 | if ((read_chars = read(0, bb_common_bufsiz1, BUFSIZ)) <= 0) { | ||
56 | if (write(1, (char *) poutput, out_index) != out_index) | 45 | if (write(1, (char *) poutput, out_index) != out_index) |
57 | bb_error_msg(bb_msg_write_error); | 46 | bb_error_msg(bb_msg_write_error); |
58 | exit(0); | 47 | exit(0); |
59 | } | 48 | } |
60 | in_index = 0; | 49 | in_index = 0; |
61 | } | 50 | } |
62 | c = input[in_index++]; | 51 | c = bb_common_bufsiz1[in_index++]; |
63 | coded = pvector[c]; | 52 | coded = pvector[c]; |
64 | if (del_fl && pinvec[c]) | 53 | if (del_fl && pinvec[c]) |
65 | continue; | 54 | continue; |
66 | if (sq_fl && last == coded && (pinvec[c] || poutvec[coded])) | 55 | if (sq_fl && last == coded && (pinvec[c] || poutvec[coded])) |
67 | continue; | 56 | continue; |
68 | poutput[out_index++] = last = coded; | 57 | poutput[out_index++] = last = coded; |
69 | if (out_index == BUFSIZ) { | ||
70 | if (write(1, (char *) poutput, out_index) != out_index) | ||
71 | bb_error_msg_and_die(bb_msg_write_error); | ||
72 | out_index = 0; | ||
73 | } | ||
74 | } | 58 | } |
75 | 59 | ||
76 | /* NOTREACHED */ | 60 | /* NOTREACHED */ |
@@ -248,57 +232,20 @@ int tr_main(int argc, char **argv) | |||
248 | } | 232 | } |
249 | 233 | ||
250 | if (argv[idx] != NULL) { | 234 | if (argv[idx] != NULL) { |
251 | input_length = expand(argv[idx++], (unsigned char*)input); | 235 | input_length = expand(argv[idx++], bb_common_bufsiz1); |
252 | if (com_fl) | 236 | if (com_fl) |
253 | input_length = complement((unsigned char*)input, input_length); | 237 | input_length = complement(bb_common_bufsiz1, input_length); |
254 | if (argv[idx] != NULL) { | 238 | if (argv[idx] != NULL) { |
255 | if (*argv[idx] == '\0') | 239 | if (*argv[idx] == '\0') |
256 | bb_error_msg_and_die("STRING2 cannot be empty"); | 240 | bb_error_msg_and_die("STRING2 cannot be empty"); |
257 | output_length = expand(argv[idx], (unsigned char*)output); | 241 | output_length = expand(argv[idx], (unsigned char*)output); |
258 | map((unsigned char*)input, input_length, (unsigned char*)output, output_length); | 242 | map(bb_common_bufsiz1, input_length, (unsigned char*)output, output_length); |
259 | } | 243 | } |
260 | for (i = 0; i < input_length; i++) | 244 | for (i = 0; i < input_length; i++) |
261 | invec[(unsigned char)input[i]] = TRUE; | 245 | invec[bb_common_bufsiz1[i]] = TRUE; |
262 | for (i = 0; i < output_length; i++) | 246 | for (i = 0; i < output_length; i++) |
263 | outvec[(unsigned char)output[i]] = TRUE; | 247 | outvec[(unsigned char)output[i]] = TRUE; |
264 | } | 248 | } |
265 | convert(); | 249 | convert(); |
266 | return (0); | 250 | return (0); |
267 | } | 251 | } |
268 | |||
269 | /* | ||
270 | * Copyright (c) 1987,1997, Prentice Hall | ||
271 | * All rights reserved. | ||
272 | * | ||
273 | * Redistribution and use of the MINIX operating system in source and | ||
274 | * binary forms, with or without modification, are permitted provided | ||
275 | * that the following conditions are met: | ||
276 | * | ||
277 | * Redistributions of source code must retain the above copyright | ||
278 | * notice, this list of conditions and the following disclaimer. | ||
279 | * | ||
280 | * Redistributions in binary form must reproduce the above | ||
281 | * copyright notice, this list of conditions and the following | ||
282 | * disclaimer in the documentation and/or other materials provided | ||
283 | * with the distribution. | ||
284 | * | ||
285 | * Neither the name of Prentice Hall nor the names of the software | ||
286 | * authors or contributors may be used to endorse or promote | ||
287 | * products derived from this software without specific prior | ||
288 | * written permission. | ||
289 | * | ||
290 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND | ||
291 | * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, | ||
292 | * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
293 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||
294 | * IN NO EVENT SHALL PRENTICE HALL OR ANY AUTHORS OR CONTRIBUTORS BE | ||
295 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
296 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
297 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
298 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
299 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||
300 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | ||
301 | * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
302 | * | ||
303 | */ | ||
304 | |||