use bb_xbind/bb_xlisten
[oweals/busybox.git] / coreutils / tr.c
index d6c5e346eefbf2b5e1f4a194e693897ebd5d14ac..752b13bf863affe1a90ae1be8a4bed5d4eb089b5 100644 (file)
@@ -116,7 +116,8 @@ static unsigned int expand(const char *arg, register unsigned char *buffer)
                        arg += 3; /* Skip the assumed a-z */
                } else if (*arg == '[') {
                        arg++;
-                       if (ENABLE_FEATURE_TR_CLASSES && *arg++ == ':') {
+                       i = *arg++;
+                       if (ENABLE_FEATURE_TR_CLASSES && i == ':') {
                                if (strncmp(arg, "alpha", 5) == 0) {
                                        for (i = 'A'; i <= 'Z'; i++)
                                                *buffer++ = i;
@@ -124,12 +125,12 @@ static unsigned int expand(const char *arg, register unsigned char *buffer)
                                                *buffer++ = i;
                                }
                                else if (strncmp(arg, "alnum", 5) == 0) {
+                                       for (i = '0'; i <= '9'; i++)
+                                               *buffer++ = i;
                                        for (i = 'A'; i <= 'Z'; i++)
                                                *buffer++ = i;
                                        for (i = 'a'; i <= 'z'; i++)
                                                *buffer++ = i;
-                                       for (i = '0'; i <= '9'; i++)
-                                               *buffer++ = i;
                                }
                                else if (strncmp(arg, "digit", 5) == 0)
                                        for (i = '0'; i <= '9'; i++)
@@ -140,10 +141,15 @@ static unsigned int expand(const char *arg, register unsigned char *buffer)
                                else if (strncmp(arg, "upper", 5) == 0)
                                        for (i = 'A'; i <= 'Z'; i++)
                                                *buffer++ = i;
-                               else if (strncmp(arg, "space", 5) == 0)
-                                       strcat((char*)buffer, " \f\n\r\t\v");
-                               else if (strncmp(arg, "blank", 5) == 0)
-                                       strcat((char*)buffer, " \t");
+                               else if (strncmp(arg, "space", 5) == 0) {
+                                   const char s[] = "\t\n\v\f\r ";
+                                       strcat((char*)buffer, s);
+                                       buffer += sizeof(s) - 1;
+                               }
+                               else if (strncmp(arg, "blank", 5) == 0) {
+                                       *buffer++ = '\t';
+                                       *buffer++ = ' ';
+                               }
                                /* gcc gives a warning if braces aren't used here */
                                else if (strncmp(arg, "punct", 5) == 0) {
                                        for (i = 0; i <= ASCII; i++)
@@ -156,13 +162,13 @@ static unsigned int expand(const char *arg, register unsigned char *buffer)
                                                        *buffer++ = i;
                                }
                                else {
-                                       strcat((char*)buffer, "[:");
-                                       arg++;
+                                       *buffer++ = '[';
+                                       *buffer++ = ':';
                                        continue;
                                }
                                break;
                        }
-                       if (ENABLE_FEATURE_TR_EQUIV && *arg++ == '=') {
+                       if (ENABLE_FEATURE_TR_EQUIV && i == '=') {
                                *buffer++ = *arg;
                                /* skip the closing =] */
                                arg += 3;
@@ -173,7 +179,6 @@ static unsigned int expand(const char *arg, register unsigned char *buffer)
                                arg -= 2;
                                continue;
                        }
-                       i = *arg++;
                        ac = *arg++;
                        while (i <= ac)
                                *buffer++ = i++;
@@ -202,14 +207,14 @@ static int complement(unsigned char *buffer, int buffer_len)
        return ix;
 }
 
-extern int tr_main(int argc, char **argv)
+int tr_main(int argc, char **argv)
 {
        register unsigned char *ptr;
        int output_length=0, input_length;
        int idx = 1;
        int i;
        RESERVE_CONFIG_BUFFER(output, BUFSIZ);
-       RESERVE_CONFIG_UBUFFER(vector, ASCII+1);
+       RESERVE_CONFIG_BUFFER(vector, ASCII+1);
        RESERVE_CONFIG_BUFFER(invec,  ASCII+1);
        RESERVE_CONFIG_BUFFER(outvec, ASCII+1);