diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2004-09-15 02:05:23 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2004-09-15 02:05:23 +0000 |
commit | 240a91d8a17ba8168775de85dd91eebef8c243a6 (patch) | |
tree | e731e0a6e3738a5deceb04cfcfc9efee1d9cafe1 | |
parent | b6570d07c4ae956a1ab5c11a6c38a4e7ef611b6d (diff) | |
download | busybox-w32-240a91d8a17ba8168775de85dd91eebef8c243a6.tar.gz busybox-w32-240a91d8a17ba8168775de85dd91eebef8c243a6.tar.bz2 busybox-w32-240a91d8a17ba8168775de85dd91eebef8c243a6.zip |
Patch by Felipe Kellermann, use the common escape handling function and remove some unused code.
-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 @@ | |||
58 | #include <assert.h> | 58 | #include <assert.h> |
59 | #include "busybox.h" | 59 | #include "busybox.h" |
60 | 60 | ||
61 | |||
62 | #ifndef S_IFMT | ||
63 | static const int S_IFMT = 0170000; | ||
64 | #endif | ||
65 | #if !defined(S_ISBLK) && defined(S_IFBLK) | ||
66 | # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) | ||
67 | #endif | ||
68 | #if !defined(S_ISCHR) && defined(S_IFCHR) | ||
69 | # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) | ||
70 | #endif | ||
71 | #if !defined(S_ISDIR) && defined(S_IFDIR) | ||
72 | # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) | ||
73 | #endif | ||
74 | #if !defined(S_ISREG) && defined(S_IFREG) | ||
75 | # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | ||
76 | #endif | ||
77 | #if !defined(S_ISFIFO) && defined(S_IFIFO) | ||
78 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) | ||
79 | #endif | ||
80 | #if !defined(S_ISLNK) && defined(S_IFLNK) | ||
81 | # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) | ||
82 | #endif | ||
83 | #if !defined(S_ISSOCK) && defined(S_IFSOCK) | ||
84 | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) | ||
85 | #endif | ||
86 | #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */ | ||
87 | # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) | ||
88 | # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) | ||
89 | #endif | ||
90 | #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */ | ||
91 | # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) | ||
92 | #endif | ||
93 | |||
94 | #define IN_CTYPE_DOMAIN(c) 1 | ||
95 | |||
96 | #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c)) | ||
97 | #define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) | ||
98 | #define ISDIGIT(c) (((unsigned char) (c)) - '0' <= 9) | ||
99 | |||
100 | #define isodigit(c) ((c) >= '0' && (c) <= '7') | ||
101 | #define hextobin(c) ((c)>='a'&&(c)<='f' ? (c)-'a'+10 : (c)>='A'&&(c)<='F' ? (c)-'A'+10 : (c)-'0') | ||
102 | #define octtobin(c) ((c) - '0') | ||
103 | |||
104 | static double xstrtod __P((char *s)); | 61 | static double xstrtod __P((char *s)); |
105 | static int print_esc __P((char *escstart)); | ||
106 | static int print_formatted __P((char *format, int argc, char **argv)); | ||
107 | static long xstrtol __P((char *s)); | 62 | static long xstrtol __P((char *s)); |
108 | static unsigned long xstrtoul __P((char *s)); | 63 | static unsigned long xstrtoul __P((char *s)); |
64 | static void print_esc_string __P((char *str)); | ||
65 | static int print_formatted __P((char *format, int argc, char **argv)); | ||
109 | static void print_direc __P( (char *start, size_t length, | 66 | static void print_direc __P( (char *start, size_t length, |
110 | int field_width, int precision, char *argument)); | 67 | int field_width, int precision, char *argument)); |
111 | static void print_esc_char __P((int c)); | ||
112 | static void print_esc_string __P((char *str)); | ||
113 | |||
114 | /* The value to return to the calling program. */ | ||
115 | static int exit_status; | ||
116 | 68 | ||
117 | int printf_main(int argc, char **argv) | 69 | int printf_main(int argc, char **argv) |
118 | { | 70 | { |
119 | char *format; | 71 | char *format; |
120 | int args_used; | 72 | int args_used; |
121 | 73 | ||
122 | exit_status = 0; | ||
123 | if (argc <= 1 || **(argv + 1) == '-') { | 74 | if (argc <= 1 || **(argv + 1) == '-') { |
124 | bb_show_usage(); | 75 | bb_show_usage(); |
125 | } | 76 | } |
@@ -140,7 +91,7 @@ int printf_main(int argc, char **argv) | |||
140 | fprintf(stderr, "excess args ignored"); | 91 | fprintf(stderr, "excess args ignored"); |
141 | */ | 92 | */ |
142 | 93 | ||
143 | return(exit_status); | 94 | return EXIT_SUCCESS; |
144 | } | 95 | } |
145 | 96 | ||
146 | /* Print the text in FORMAT, using ARGV (with ARGC elements) for | 97 | /* 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) | |||
188 | } else | 139 | } else |
189 | field_width = 0; | 140 | field_width = 0; |
190 | } else | 141 | } else |
191 | while (ISDIGIT(*f)) { | 142 | while (isdigit(*f)) { |
192 | ++f; | 143 | ++f; |
193 | ++direc_length; | 144 | ++direc_length; |
194 | } | 145 | } |
@@ -205,7 +156,7 @@ static int print_formatted(char *format, int argc, char **argv) | |||
205 | } else | 156 | } else |
206 | precision = 0; | 157 | precision = 0; |
207 | } else | 158 | } else |
208 | while (ISDIGIT(*f)) { | 159 | while (isdigit(*f)) { |
209 | ++f; | 160 | ++f; |
210 | ++direc_length; | 161 | ++direc_length; |
211 | } | 162 | } |
@@ -230,7 +181,10 @@ static int print_formatted(char *format, int argc, char **argv) | |||
230 | break; | 181 | break; |
231 | 182 | ||
232 | case '\\': | 183 | case '\\': |
233 | f += print_esc(f); | 184 | if (*++f == 'c') |
185 | exit(0); | ||
186 | putchar(bb_process_escape_sequence((const char **)&f)); | ||
187 | f--; | ||
234 | break; | 188 | break; |
235 | 189 | ||
236 | default: | 190 | default: |
@@ -241,84 +195,6 @@ static int print_formatted(char *format, int argc, char **argv) | |||
241 | return save_argc - argc; | 195 | return save_argc - argc; |
242 | } | 196 | } |
243 | 197 | ||
244 | /* Print a \ escape sequence starting at ESCSTART. | ||
245 | Return the number of characters in the escape sequence | ||
246 | besides the backslash. */ | ||
247 | |||
248 | static int print_esc(char *escstart) | ||
249 | { | ||
250 | register char *p = escstart + 1; | ||
251 | int esc_value = 0; /* Value of \nnn escape. */ | ||
252 | int esc_length; /* Length of \nnn escape. */ | ||
253 | |||
254 | /* \0ooo and \xhhh escapes have maximum length of 3 chars. */ | ||
255 | if (*p == 'x') { | ||
256 | for (esc_length = 0, ++p; | ||
257 | esc_length < 3 && ISXDIGIT(*p); ++esc_length, ++p) | ||
258 | esc_value = esc_value * 16 + hextobin(*p); | ||
259 | /* if (esc_length == 0) | ||
260 | fprintf(stderr, "missing hex in esc"); | ||
261 | */ | ||
262 | putchar(esc_value); | ||
263 | } else if (*p == '0') { | ||
264 | for (esc_length = 0, ++p; | ||
265 | esc_length < 3 && isodigit(*p); ++esc_length, ++p) | ||
266 | esc_value = esc_value * 8 + octtobin(*p); | ||
267 | putchar(esc_value); | ||
268 | } else if (strchr("\"\\abcfnrtv", *p)) | ||
269 | print_esc_char(*p++); | ||
270 | /* else | ||
271 | fprintf(stderr, "\\%c: invalid esc", *p); | ||
272 | */ | ||
273 | return p - escstart - 1; | ||
274 | } | ||
275 | |||
276 | /* Output a single-character \ escape. */ | ||
277 | |||
278 | static void print_esc_char(int c) | ||
279 | { | ||
280 | switch (c) { | ||
281 | case 'a': /* Alert. */ | ||
282 | putchar(7); | ||
283 | break; | ||
284 | case 'b': /* Backspace. */ | ||
285 | putchar(8); | ||
286 | break; | ||
287 | case 'c': /* Cancel the rest of the output. */ | ||
288 | exit(0); | ||
289 | break; | ||
290 | case 'f': /* Form feed. */ | ||
291 | putchar(12); | ||
292 | break; | ||
293 | case 'n': /* New line. */ | ||
294 | putchar(10); | ||
295 | break; | ||
296 | case 'r': /* Carriage return. */ | ||
297 | putchar(13); | ||
298 | break; | ||
299 | case 't': /* Horizontal tab. */ | ||
300 | putchar(9); | ||
301 | break; | ||
302 | case 'v': /* Vertical tab. */ | ||
303 | putchar(11); | ||
304 | break; | ||
305 | default: | ||
306 | putchar(c); | ||
307 | break; | ||
308 | } | ||
309 | } | ||
310 | |||
311 | /* Print string STR, evaluating \ escapes. */ | ||
312 | |||
313 | static void print_esc_string(char *str) | ||
314 | { | ||
315 | for (; *str; str++) | ||
316 | if (*str == '\\') | ||
317 | str += print_esc(str); | ||
318 | else | ||
319 | putchar(*str); | ||
320 | } | ||
321 | |||
322 | static void | 198 | static void |
323 | print_direc(char *start, size_t length, int field_width, int precision, | 199 | print_direc(char *start, size_t length, int field_width, int precision, |
324 | char *argument) | 200 | char *argument) |
@@ -426,3 +302,15 @@ static double xstrtod(char *arg) | |||
426 | return result; | 302 | return result; |
427 | } | 303 | } |
428 | 304 | ||
305 | static void print_esc_string(char *str) | ||
306 | { | ||
307 | for (; *str; str++) { | ||
308 | if (*str == '\\') { | ||
309 | str++; | ||
310 | putchar(bb_process_escape_sequence((const char **)&str)); | ||
311 | } else { | ||
312 | putchar(*str); | ||
313 | } | ||
314 | |||
315 | } | ||
316 | } | ||