diff options
-rw-r--r-- | scripts/echo.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/scripts/echo.c b/scripts/echo.c index 7474ccdd4..e3a07adf0 100644 --- a/scripts/echo.c +++ b/scripts/echo.c | |||
@@ -153,25 +153,32 @@ int main(int argc, char **argv) | |||
153 | if (!eflag) { | 153 | if (!eflag) { |
154 | /* optimization for very common case */ | 154 | /* optimization for very common case */ |
155 | fputs(arg, stdout); | 155 | fputs(arg, stdout); |
156 | } else while ((c = *arg++)) { | 156 | } else |
157 | if (c == eflag) { /* Check for escape seq. */ | 157 | while ((c = *arg++) != '\0') { |
158 | if (c == eflag) { | ||
159 | /* This is an "\x" sequence */ | ||
160 | |||
158 | if (*arg == 'c') { | 161 | if (*arg == 'c') { |
159 | /* '\c' means cancel newline and | 162 | /* "\c" means cancel newline and |
160 | * ignore all subsequent chars. */ | 163 | * ignore all subsequent chars. */ |
161 | goto ret; | 164 | goto ret; |
162 | } | 165 | } |
163 | { | 166 | /* Since SUSv3 mandates a first digit of 0, 4-digit octals |
164 | /* Since SUSv3 mandates a first digit of 0, 4-digit octals | 167 | * of the form \0### are accepted. */ |
165 | * of the form \0### are accepted. */ | 168 | if (*arg == '0') { |
166 | if (*arg == '0') { | 169 | if ((unsigned char)(arg[1] - '0') < 8) { |
167 | /* NB: don't turn "...\0" into "...\" */ | 170 | /* 2nd char is 0..7: skip leading '0' */ |
168 | if (arg[1] && ((unsigned char)(arg[1]) - '0') < 8) { | 171 | arg++; |
169 | arg++; | ||
170 | } | ||
171 | } | 172 | } |
172 | /* bb_process_escape_sequence handles NUL correctly | 173 | } |
173 | * ("...\" case. */ | 174 | /* bb_process_escape_sequence handles NUL correctly |
174 | c = bb_process_escape_sequence(&arg); | 175 | * ("...\" case). */ |
176 | { | ||
177 | /* optimization: don't force arg to be on-stack, | ||
178 | * use another variable for that. ~30 bytes win */ | ||
179 | const char *z = arg; | ||
180 | c = bb_process_escape_sequence(&z); | ||
181 | arg = z; | ||
175 | } | 182 | } |
176 | } | 183 | } |
177 | putchar(c); | 184 | putchar(c); |