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 | |
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')
-rw-r--r-- | coreutils/catv.c | 38 | ||||
-rw-r--r-- | coreutils/stty.c | 39 |
2 files changed, 23 insertions, 54 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) |
diff --git a/coreutils/stty.c b/coreutils/stty.c index d1e74f437..378a848e7 100644 --- a/coreutils/stty.c +++ b/coreutils/stty.c | |||
@@ -781,36 +781,6 @@ struct globals { | |||
781 | G.max_col = 80; \ | 781 | G.max_col = 80; \ |
782 | } while (0) | 782 | } while (0) |
783 | 783 | ||
784 | |||
785 | /* Return a string that is the printable representation of character CH */ | ||
786 | /* Adapted from 'cat' by Torbjorn Granlund */ | ||
787 | static const char *visible(unsigned ch) | ||
788 | { | ||
789 | char *bpout = G.buf; | ||
790 | |||
791 | if (ch == _POSIX_VDISABLE) | ||
792 | return "<undef>"; | ||
793 | |||
794 | if (ch >= 128) { | ||
795 | ch -= 128; | ||
796 | *bpout++ = 'M'; | ||
797 | *bpout++ = '-'; | ||
798 | } | ||
799 | |||
800 | if (ch < 32) { | ||
801 | *bpout++ = '^'; | ||
802 | *bpout++ = ch + 64; | ||
803 | } else if (ch < 127) { | ||
804 | *bpout++ = ch; | ||
805 | } else { | ||
806 | *bpout++ = '^'; | ||
807 | *bpout++ = '?'; | ||
808 | } | ||
809 | |||
810 | *bpout = '\0'; | ||
811 | return G.buf; | ||
812 | } | ||
813 | |||
814 | static void set_speed_or_die(enum speed_setting type, const char *arg, | 784 | static void set_speed_or_die(enum speed_setting type, const char *arg, |
815 | struct termios *mode) | 785 | struct termios *mode) |
816 | { | 786 | { |
@@ -1038,6 +1008,7 @@ static void do_display(const struct termios *mode, int all) | |||
1038 | #endif | 1008 | #endif |
1039 | 1009 | ||
1040 | for (i = 0; i != CIDX_min; ++i) { | 1010 | for (i = 0; i != CIDX_min; ++i) { |
1011 | char ch; | ||
1041 | /* If swtch is the same as susp, don't print both */ | 1012 | /* If swtch is the same as susp, don't print both */ |
1042 | #if VSWTCH == VSUSP | 1013 | #if VSWTCH == VSUSP |
1043 | if (i == CIDX_swtch) | 1014 | if (i == CIDX_swtch) |
@@ -1051,8 +1022,12 @@ static void do_display(const struct termios *mode, int all) | |||
1051 | continue; | 1022 | continue; |
1052 | } | 1023 | } |
1053 | #endif | 1024 | #endif |
1054 | wrapf("%s = %s;", nth_string(control_name, i), | 1025 | ch = mode->c_cc[control_info[i].offset]; |
1055 | visible(mode->c_cc[control_info[i].offset])); | 1026 | if (ch == _POSIX_VDISABLE) |
1027 | strcpy(G.buf, "<undef>"); | ||
1028 | else | ||
1029 | visible(ch, G.buf, 0); | ||
1030 | wrapf("%s = %s;", nth_string(control_name, i), G.buf); | ||
1056 | } | 1031 | } |
1057 | #if VEOF == VMIN | 1032 | #if VEOF == VMIN |
1058 | if ((mode->c_lflag & ICANON) == 0) | 1033 | if ((mode->c_lflag & ICANON) == 0) |