tr: special-case "\-" before trying to parse it as escape
No binary (build failed)
—
(log yok)
| @@ -113,20 +113,20 @@ static unsigned expand(char *arg, char **buffer_p) | |
| *buffer_p = buffer = xrealloc(buffer, size); | |
| } | |
| if (*arg == '\\') { | |
| - | const char *z; |
| - | arg++; |
| - | z = arg; |
| - | ac = bb_process_escape_sequence(&z); |
| - | if (ac == '\\' && *z == '-') { |
| - | /* An escaped dash isn't a range, don't fall through */ |
| - | buffer[pos++] = *z; |
| + | char *z = ++arg; |
| + | if (*z == '-') { |
| + | /* "\-X" isn't a range, but a literal dash and X */ |
| + | buffer[pos++] = '-'; |
| continue; | |
| } | |
| - | arg = (char *)z; |
| - | arg--; |
| + | ac = bb_process_escape_sequence((void*)&z); |
| + | // if unknown seq "\k": ac='\', z->k: store '\' before 'k' |
| + | // if known seq "\n": ac='\n', z->past n: store '\n' into 'n' |
| + | // if known seq "\041": ac='!', z->past 1: store '!' into '1' |
| + | arg = z - 1; |
| *arg = ac; | |
| /* | |
| - | * fall through, there may be a range. |
| + | * fall through, there may be a range. Example: "\n-@" |
| * If not, current char will be treated anyway. | |
| */ | |
| } | |
| @@ -139,10 +139,9 @@ static unsigned expand(char *arg, char **buffer_p) | |
| 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; |
| + | char *z = arg; |
| + | ac = bb_process_escape_sequence((void*)&z); |
| + | arg = z; |
| } | |
| while (i <= ac) /* ok: i is unsigned _int_ */ | |
| buffer[pos++] = i++; | |
| @@ -15,6 +15,12 @@ | |
| #undef _tolower | |
| #define _tolower(X) ((X)|((char) 0x20)) | |
| + | /* (*ptr) points to string directly after '\'. |
| + | * Analyze it, if it's special (n, 003, etc) return |
| + | * corresponding char ('\n', 0x03, etc) and advance |
| + | * (*ptr) to point after the special part of the string. |
| + | * Otherwise: return '\' and do not advance (*ptr). |
| + | */ |
| char FAST_FUNC bb_process_escape_sequence(const char **ptr) | |
| { | |
| const char *q; | |