diff options
author | Bartosz Golaszewski <bartekgola@gmail.com> | 2013-07-30 06:29:42 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-07-30 06:29:42 +0200 |
commit | 79c618c41193eaaa092cb977f06fc112155ba92b (patch) | |
tree | 369938db46d4691ebbcc476386c7dafdac827887 /coreutils/catv.c | |
parent | d0bc708cb52693b9ed1dab495e5f99fb8e1122f7 (diff) | |
download | busybox-w32-79c618c41193eaaa092cb977f06fc112155ba92b.tar.gz busybox-w32-79c618c41193eaaa092cb977f06fc112155ba92b.tar.bz2 busybox-w32-79c618c41193eaaa092cb977f06fc112155ba92b.zip |
Refactor catv. Move visible() from stty to libbb.
Fixes the following TODO:
stty's visible() function and catv's guts are identical. Merge them into
an appropriate libbb function.
Also makes catv behave exactly like coreutils' cat -v e.g. it'll print 'M-^I'
instead of 'M- '.
function old new delta
visible - 70 +70
do_display 431 379 -52
catv_main 306 250 -56
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 70/-108) Total: -38 bytes
Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils/catv.c')
-rw-r--r-- | coreutils/catv.c | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/coreutils/catv.c b/coreutils/catv.c index 214b4311a..18b18104e 100644 --- a/coreutils/catv.c +++ b/coreutils/catv.c | |||
@@ -25,14 +25,20 @@ int catv_main(int argc UNUSED_PARAM, char **argv) | |||
25 | { | 25 | { |
26 | int retval = EXIT_SUCCESS; | 26 | int retval = EXIT_SUCCESS; |
27 | int fd; | 27 | int fd; |
28 | unsigned flags; | 28 | unsigned opts; |
29 | int flags = 0; | ||
29 | 30 | ||
30 | flags = getopt32(argv, "etv"); | 31 | opts = getopt32(argv, "etv"); |
31 | #define CATV_OPT_e (1<<0) | 32 | #define CATV_OPT_e (1<<0) |
32 | #define CATV_OPT_t (1<<1) | 33 | #define CATV_OPT_t (1<<1) |
33 | #define CATV_OPT_v (1<<2) | 34 | #define CATV_OPT_v (1<<2) |
34 | flags ^= CATV_OPT_v; | ||
35 | argv += optind; | 35 | argv += optind; |
36 | if (opts & (CATV_OPT_e | CATV_OPT_t)) | ||
37 | opts &= ~CATV_OPT_v; | ||
38 | if (opts & CATV_OPT_e) | ||
39 | flags |= VISIBLE_ENDLINE; | ||
40 | if (opts & CATV_OPT_t) | ||
41 | flags |= VISIBLE_SHOW_TABS; | ||
36 | 42 | ||
37 | /* Read from stdin if there's nothing else to do. */ | 43 | /* Read from stdin if there's nothing else to do. */ |
38 | if (!argv[0]) | 44 | if (!argv[0]) |
@@ -50,29 +56,17 @@ int catv_main(int argc UNUSED_PARAM, char **argv) | |||
50 | res = read(fd, read_buf, COMMON_BUFSIZE); | 56 | res = read(fd, read_buf, COMMON_BUFSIZE); |
51 | if (res < 0) | 57 | if (res < 0) |
52 | retval = EXIT_FAILURE; | 58 | retval = EXIT_FAILURE; |
53 | if (res < 1) | 59 | if (res <= 0) |
54 | break; | 60 | break; |
55 | for (i = 0; i < res; i++) { | 61 | for (i = 0; i < res; i++) { |
56 | unsigned char c = read_buf[i]; | 62 | unsigned char c = read_buf[i]; |
57 | 63 | if (opts & CATV_OPT_v) { | |
58 | if (c > 126 && (flags & CATV_OPT_v)) { | 64 | putchar(c); |
59 | if (c == 127) { | 65 | } else { |
60 | printf("^?"); | 66 | char buf[sizeof("M-^c")]; |
61 | continue; | 67 | visible(c, buf, flags); |
62 | } | 68 | fputs(buf, stdout); |
63 | printf("M-"); | ||
64 | c -= 128; | ||
65 | } | ||
66 | if (c < 32) { | ||
67 | if (c == 10) { | ||
68 | if (flags & CATV_OPT_e) | ||
69 | bb_putchar('$'); | ||
70 | } else if (flags & (c==9 ? CATV_OPT_t : CATV_OPT_v)) { | ||
71 | printf("^%c", c+'@'); | ||
72 | continue; | ||
73 | } | ||
74 | } | 69 | } |
75 | bb_putchar(c); | ||
76 | } | 70 | } |
77 | } | 71 | } |
78 | if (ENABLE_FEATURE_CLEAN_UP && fd) | 72 | if (ENABLE_FEATURE_CLEAN_UP && fd) |