printf: fix this case: printf "%b" '\0057usr\0057bin\n'

It was not accepting \0NNN. Standard printf tool does.

function                                             old     new   delta
printf_main                                          869     886     +17

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2012-03-07 11:57:47 +01:00
parent d4acaf70c5
commit 69d81a1c1b

View File

@ -131,13 +131,28 @@ static double my_xstrtod(const char *arg)
return result; return result;
} }
/* Handles %b */
static void print_esc_string(const char *str) static void print_esc_string(const char *str)
{ {
char c; char c;
while ((c = *str) != '\0') { while ((c = *str) != '\0') {
str++; str++;
if (c == '\\') if (c == '\\') {
c = bb_process_escape_sequence(&str); /* %b also accepts 4-digit octals of the form \0### */
if (*str == '0') {
if ((unsigned char)(str[1] - '0') < 8) {
/* 2nd char is 0..7: skip leading '0' */
str++;
}
}
{
/* optimization: don't force arg to be on-stack,
* use another variable for that. */
const char *z = str;
c = bb_process_escape_sequence(&z);
str = z;
}
}
putchar(c); putchar(c);
} }
} }