1303 files changed, 32187 insertions, 57138 deletions
diff --git a/coreutils/tr.c b/coreutils/tr.c index e67948a..f552096 100644 --- a/coreutils/tr.c +++ b/coreutils/tr.c @@ -18,9 +18,6 @@ /* http://www.opengroup.org/onlinepubs/009695399/utilities/tr.html * TODO: graph, print */ - -//kbuild:lib-$(CONFIG_TR) += tr.o - //config:config TR //config: bool "tr" //config: default y @@ -47,6 +44,10 @@ //config: useful for cases when no other way of expressing a character //config: is possible. +//applet:IF_TR(APPLET(tr, BB_DIR_USR_BIN, BB_SUID_DROP)) + +//kbuild:lib-$(CONFIG_TR) += tr.o + //usage:#define tr_trivial_usage //usage: "[-cds] STRING1 [STRING2]" //usage:#define tr_full_usage "\n\n" @@ -91,7 +92,6 @@ static void map(char *pvector, * Character classes, e.g. [:upper:] ==> A...Z * Equiv classess, e.g. [=A=] ==> A (hmmmmmmm?) * not supported: - * \ooo-\ooo - octal ranges * [x*N] - repeat char x N times * [x*] - repeat char x until it fills STRING2: * # echo qwe123 | /usr/bin/tr 123456789 '[d]' @@ -99,7 +99,7 @@ static void map(char *pvector, * # echo qwe123 | /usr/bin/tr 123456789 '[d*]' * qweddd */ -static unsigned expand(const char *arg, char **buffer_p) +static unsigned expand(char *arg, char **buffer_p) { char *buffer = *buffer_p; unsigned pos = 0; @@ -113,9 +113,17 @@ static unsigned expand(const char *arg, char **buffer_p) *buffer_p = buffer = xrealloc(buffer, size); } if (*arg == '\\') { + const char *z; arg++; - buffer[pos++] = bb_process_escape_sequence(&arg); - continue; + z = arg; + ac = bb_process_escape_sequence(&z); + arg = (char *)z; + arg--; + *arg = ac; + /* + * fall through, there may be a range. + * If not, current char will be treated anyway. + */ } if (arg[1] == '-') { /* "0-9..." */ ac = arg[2]; @@ -124,9 +132,15 @@ static unsigned expand(const char *arg, char **buffer_p) continue; /* next iter will copy '-' and stop */ } i = (unsigned char) *arg; + arg += 3; /* skip 0-9 or 0-\ */ + if (ac == '\\') { + const char *z; + z = arg; + ac = bb_process_escape_sequence(&z); + arg = (char *)z; + } while (i <= ac) /* ok: i is unsigned _int_ */ buffer[pos++] = i++; - arg += 3; /* skip 0-9 */ continue; } if ((ENABLE_FEATURE_TR_CLASSES || ENABLE_FEATURE_TR_EQUIV) |