diff options
| -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 | |||
