Patch by Felipe Kellermann, use the common escape handling function and remove some unused code.
No binary (build failed)
—
(log yok)
| @@ -58,68 +58,19 @@ | |
| #include <assert.h> | |
| #include "busybox.h" | |
| - | |
| - | #ifndef S_IFMT |
| - | static const int S_IFMT = 0170000; |
| - | #endif |
| - | #if !defined(S_ISBLK) && defined(S_IFBLK) |
| - | # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) |
| - | #endif |
| - | #if !defined(S_ISCHR) && defined(S_IFCHR) |
| - | # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) |
| - | #endif |
| - | #if !defined(S_ISDIR) && defined(S_IFDIR) |
| - | # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) |
| - | #endif |
| - | #if !defined(S_ISREG) && defined(S_IFREG) |
| - | # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) |
| - | #endif |
| - | #if !defined(S_ISFIFO) && defined(S_IFIFO) |
| - | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) |
| - | #endif |
| - | #if !defined(S_ISLNK) && defined(S_IFLNK) |
| - | # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) |
| - | #endif |
| - | #if !defined(S_ISSOCK) && defined(S_IFSOCK) |
| - | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) |
| - | #endif |
| - | #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */ |
| - | # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) |
| - | # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) |
| - | #endif |
| - | #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */ |
| - | # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) |
| - | #endif |
| - | |
| - | #define IN_CTYPE_DOMAIN(c) 1 |
| - | |
| - | #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c)) |
| - | #define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) |
| - | #define ISDIGIT(c) (((unsigned char) (c)) - '0' <= 9) |
| - | |
| - | #define isodigit(c) ((c) >= '0' && (c) <= '7') |
| - | #define hextobin(c) ((c)>='a'&&(c)<='f' ? (c)-'a'+10 : (c)>='A'&&(c)<='F' ? (c)-'A'+10 : (c)-'0') |
| - | #define octtobin(c) ((c) - '0') |
| - | |
| static double xstrtod __P((char *s)); | |
| - | static int print_esc __P((char *escstart)); |
| - | static int print_formatted __P((char *format, int argc, char **argv)); |
| static long xstrtol __P((char *s)); | |
| static unsigned long xstrtoul __P((char *s)); | |
| + | static void print_esc_string __P((char *str)); |
| + | static int print_formatted __P((char *format, int argc, char **argv)); |
| static void print_direc __P( (char *start, size_t length, | |
| int field_width, int precision, char *argument)); | |
| - | static void print_esc_char __P((int c)); |
| - | static void print_esc_string __P((char *str)); |
| - | |
| - | /* The value to return to the calling program. */ |
| - | static int exit_status; |
| int printf_main(int argc, char **argv) | |
| { | |
| char *format; | |
| int args_used; | |
| - | exit_status = 0; |
| if (argc <= 1 || **(argv + 1) == '-') { | |
| bb_show_usage(); | |
| } | |
| @@ -140,7 +91,7 @@ int printf_main(int argc, char **argv) | |
| fprintf(stderr, "excess args ignored"); | |
| */ | |
| - | return(exit_status); |
| + | return EXIT_SUCCESS; |
| } | |
| /* Print the text in FORMAT, using ARGV (with ARGC elements) for | |
| @@ -188,7 +139,7 @@ static int print_formatted(char *format, int argc, char **argv) | |
| } else | |
| field_width = 0; | |
| } else | |
| - | while (ISDIGIT(*f)) { |
| + | while (isdigit(*f)) { |
| ++f; | |
| ++direc_length; | |
| } | |
| @@ -205,7 +156,7 @@ static int print_formatted(char *format, int argc, char **argv) | |
| } else | |
| precision = 0; | |
| } else | |
| - | while (ISDIGIT(*f)) { |
| + | while (isdigit(*f)) { |
| ++f; | |
| ++direc_length; | |
| } | |
| @@ -230,7 +181,10 @@ static int print_formatted(char *format, int argc, char **argv) | |
| break; | |
| case '\\': | |
| - | f += print_esc(f); |
| + | if (*++f == 'c') |
| + | exit(0); |
| + | putchar(bb_process_escape_sequence((const char **)&f)); |
| + | f--; |
| break; | |
| default: | |
| @@ -241,84 +195,6 @@ static int print_formatted(char *format, int argc, char **argv) | |
| return save_argc - argc; | |
| } | |
| - | /* Print a \ escape sequence starting at ESCSTART. |
| - | Return the number of characters in the escape sequence |
| - | besides the backslash. */ |
| - | |
| - | static int print_esc(char *escstart) |
| - | { |
| - | register char *p = escstart + 1; |
| - | int esc_value = 0; /* Value of \nnn escape. */ |
| - | int esc_length; /* Length of \nnn escape. */ |
| - | |
| - | /* \0ooo and \xhhh escapes have maximum length of 3 chars. */ |
| - | if (*p == 'x') { |
| - | for (esc_length = 0, ++p; |
| - | esc_length < 3 && ISXDIGIT(*p); ++esc_length, ++p) |
| - | esc_value = esc_value * 16 + hextobin(*p); |
| - | /* if (esc_length == 0) |
| - | fprintf(stderr, "missing hex in esc"); |
| - | */ |
| - | putchar(esc_value); |
| - | } else if (*p == '0') { |
| - | for (esc_length = 0, ++p; |
| - | esc_length < 3 && isodigit(*p); ++esc_length, ++p) |
| - | esc_value = esc_value * 8 + octtobin(*p); |
| - | putchar(esc_value); |
| - | } else if (strchr("\"\\abcfnrtv", *p)) |
| - | print_esc_char(*p++); |
| - | /* else |
| - | fprintf(stderr, "\\%c: invalid esc", *p); |
| - | */ |
| - | return p - escstart - 1; |
| - | } |
| - | |
| - | /* Output a single-character \ escape. */ |
| - | |
| - | static void print_esc_char(int c) |
| - | { |
| - | switch (c) { |
| - | case 'a': /* Alert. */ |
| - | putchar(7); |
| - | break; |
| - | case 'b': /* Backspace. */ |
| - | putchar(8); |
| - | break; |
| - | case 'c': /* Cancel the rest of the output. */ |
| - | exit(0); |
| - | break; |
| - | case 'f': /* Form feed. */ |
| - | putchar(12); |
| - | break; |
| - | case 'n': /* New line. */ |
| - | putchar(10); |
| - | break; |
| - | case 'r': /* Carriage return. */ |
| - | putchar(13); |
| - | break; |
| - | case 't': /* Horizontal tab. */ |
| - | putchar(9); |
| - | break; |
| - | case 'v': /* Vertical tab. */ |
| - | putchar(11); |
| - | break; |
| - | default: |
| - | putchar(c); |
| - | break; |
| - | } |
| - | } |
| - | |
| - | /* Print string STR, evaluating \ escapes. */ |
| - | |
| - | static void print_esc_string(char *str) |
| - | { |
| - | for (; *str; str++) |
| - | if (*str == '\\') |
| - | str += print_esc(str); |
| - | else |
| - | putchar(*str); |
| - | } |
| - | |
| static void | |
| print_direc(char *start, size_t length, int field_width, int precision, | |
| char *argument) | |
| @@ -426,3 +302,15 @@ static double xstrtod(char *arg) | |
| return result; | |
| } | |
| + | static void print_esc_string(char *str) |
| + | { |
| + | for (; *str; str++) { |
| + | if (*str == '\\') { |
| + | str++; |
| + | putchar(bb_process_escape_sequence((const char **)&str)); |
| + | } else { |
| + | putchar(*str); |
| + | } |
| + | |
| + | } |
| + | } |