diff options
-rw-r--r-- | coreutils/printf.c | 154 |
1 files changed, 21 insertions, 133 deletions
diff --git a/coreutils/printf.c b/coreutils/printf.c index 053b01ee5..da5e46a58 100644 --- a/coreutils/printf.c +++ b/coreutils/printf.c @@ -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); + } + + } +} |