X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Ftr.c;h=a00e3613427318e10eabffa07c867c250cad5610;hb=138d71bc35b86964a4c2bd97f7f578edfead1925;hp=07922af175fb19c2b2a33506eb18176a189942b2;hpb=8b7a0d807a3ec8cfcbc4e4cb3067237b438bae14;p=oweals%2Fbusybox.git diff --git a/coreutils/tr.c b/coreutils/tr.c index 07922af17..a00e36134 100644 --- a/coreutils/tr.c +++ b/coreutils/tr.c @@ -31,7 +31,9 @@ #include #include "busybox.h" -static const int ASCII = 0377; +/* This must be a #define, since when DODEBUG and BUFFERS_GO_IN_BSS are + * enabled, we otherwise get a "storage size isn't constant error. */ +#define ASCII 0377 /* some "globals" shared across this file */ static char com_fl, del_fl, sq_fl; @@ -42,7 +44,7 @@ static unsigned char *pvector; static char *pinvec, *poutvec; -static void convert() +static void convert(void) { short read_chars = 0; short c, coded; @@ -52,7 +54,7 @@ static void convert() if (in_index == read_chars) { if ((read_chars = read(0, (char *) pinput, BUFSIZ)) <= 0) { if (write(1, (char *) poutput, out_index) != out_index) - write(2, write_error, strlen(write_error)); + bb_error_msg(bb_msg_write_error); exit(0); } in_index = 0; @@ -65,10 +67,8 @@ static void convert() continue; poutput[out_index++] = last = coded; if (out_index == BUFSIZ) { - if (write(1, (char *) poutput, out_index) != out_index) { - write(2, write_error, strlen(write_error)); - exit(1); - } + if (write(1, (char *) poutput, out_index) != out_index) + bb_error_msg_and_die(bb_msg_write_error); out_index = 0; } } @@ -102,7 +102,17 @@ static unsigned int expand(const char *arg, register unsigned char *buffer) while (*arg) { if (*arg == '\\') { arg++; - *buffer++ = process_escape_sequence(&arg); + *buffer++ = bb_process_escape_sequence(&arg); + } else if (*(arg+1) == '-') { + ac = *(arg+2); + if(ac == 0) { + *buffer++ = *arg++; + continue; + } + i = *arg; + while (i <= ac) + *buffer++ = i++; + arg += 3; /* Skip the assumed a-z */ } else if (*arg == '[') { arg++; i = *arg++; @@ -145,11 +155,11 @@ extern int tr_main(int argc, char **argv) int output_length=0, input_length; int idx = 1; int i; - RESERVE_BB_BUFFER(output, BUFSIZ); - RESERVE_BB_BUFFER(input, BUFSIZ); - RESERVE_BB_UBUFFER(vector, ASCII+1); - RESERVE_BB_BUFFER(invec, ASCII+1); - RESERVE_BB_BUFFER(outvec, ASCII+1); + RESERVE_CONFIG_BUFFER(output, BUFSIZ); + RESERVE_CONFIG_BUFFER(input, BUFSIZ); + RESERVE_CONFIG_UBUFFER(vector, ASCII+1); + RESERVE_CONFIG_BUFFER(invec, ASCII+1); + RESERVE_CONFIG_BUFFER(outvec, ASCII+1); /* ... but make them available globally */ poutput = output; @@ -171,7 +181,7 @@ extern int tr_main(int argc, char **argv) sq_fl = TRUE; break; default: - show_usage(); + bb_show_usage(); } } idx++; @@ -187,7 +197,7 @@ extern int tr_main(int argc, char **argv) input_length = complement(input, input_length); if (argv[idx] != NULL) { if (*argv[idx] == '\0') - error_msg_and_die("STRING2 cannot be empty"); + bb_error_msg_and_die("STRING2 cannot be empty"); output_length = expand(argv[idx], output); map(input, input_length, output, output_length); }