X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fcatv.c;h=6bb73ba63d5e8341113fafbddf5a7d0b8b13761b;hb=8893023ba27ea87b12a333960271c9f86cdebf7b;hp=ce927465b9b91d2d1ac4cd8dce7be6805863f6f4;hpb=fe7cd642b0b732f5d41403c2f6983ad676b69dd9;p=oweals%2Fbusybox.git diff --git a/coreutils/catv.c b/coreutils/catv.c index ce927465b..6bb73ba63 100644 --- a/coreutils/catv.c +++ b/coreutils/catv.c @@ -4,41 +4,56 @@ * * Copyright (C) 2006 Rob Landley * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ /* See "Cat -v considered harmful" at * http://cm.bell-labs.com/cm/cs/doc/84/kp.ps.gz */ -#include "libbb.h" +//usage:#define catv_trivial_usage +//usage: "[-etv] [FILE]..." +//usage:#define catv_full_usage "\n\n" +//usage: "Display nonprinting characters as ^x or M-x\n" +//usage: "\n -e End each line with $" +//usage: "\n -t Show tabs as ^I" +//usage: "\n -v Don't use ^x or M-x escapes" -int catv_main(int argc, char **argv); -int catv_main(int argc, char **argv) -{ - int retval = EXIT_SUCCESS; - int fd; - unsigned flags; +#include "libbb.h" - flags = getopt32(argv, "etv"); #define CATV_OPT_e (1<<0) #define CATV_OPT_t (1<<1) #define CATV_OPT_v (1<<2) - flags ^= CATV_OPT_v; +struct BUG_const_mismatch { + char BUG_const_mismatch[ + CATV_OPT_e == VISIBLE_ENDLINE && CATV_OPT_t == VISIBLE_SHOW_TABS + ? 1 : -1 + ]; +}; + +int catv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int catv_main(int argc UNUSED_PARAM, char **argv) +{ + int retval = EXIT_SUCCESS; + int fd; + unsigned opts; + opts = getopt32(argv, "etv"); argv += optind; +#if 0 /* These consts match, we can just pass "opts" to visible() */ + if (opts & CATV_OPT_e) + flags |= VISIBLE_ENDLINE; + if (opts & CATV_OPT_t) + flags |= VISIBLE_SHOW_TABS; +#endif /* Read from stdin if there's nothing else to do. */ - fd = 0; - if (!argv[0]) { - argv--; - goto jump_in; - } + if (!argv[0]) + *--argv = (char*)"-"; do { - fd = open_or_warn(*argv, O_RDONLY); + fd = open_or_warn_stdin(*argv); if (fd < 0) { retval = EXIT_FAILURE; continue; } - jump_in: for (;;) { int i, res; @@ -46,29 +61,17 @@ int catv_main(int argc, char **argv) res = read(fd, read_buf, COMMON_BUFSIZE); if (res < 0) retval = EXIT_FAILURE; - if (res < 1) + if (res <= 0) break; for (i = 0; i < res; i++) { unsigned char c = read_buf[i]; - - if (c > 126 && (flags & CATV_OPT_v)) { - if (c == 127) { - printf("^?"); - continue; - } - printf("M-"); - c -= 128; - } - if (c < 32) { - if (c == 10) { - if (flags & CATV_OPT_e) - putchar('$'); - } else if (flags & (c==9 ? CATV_OPT_t : CATV_OPT_v)) { - printf("^%c", c+'@'); - continue; - } + if (opts & CATV_OPT_v) { + putchar(c); + } else { + char buf[sizeof("M-^c")]; + visible(c, buf, opts); + fputs(buf, stdout); } - putchar(c); } } if (ENABLE_FEATURE_CLEAN_UP && fd)