# HG changeset patch # User Rob Landley # Date 1419362987 21600 # Node ID f67b1e9e91b4a6c0ffb32b96a6524d6a0f19290b # Parent 45fb262230c995993fab125fe395a3b0cb2db1e1 Merge catv back into cat as discussed on the list. Add comments about infrastructure upgrades needed to restore separate catv option. diff -r 45fb262230c9 -r f67b1e9e91b4 toys/other/catv.c --- a/toys/other/catv.c Mon Dec 22 17:04:47 2014 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* cat -v implementation for toybox - * - * Copyright (C) 2006, 2007 Rob Landley - * - * See "Cat -v considered harmful" at - * http://cm.bell-labs.com/cm/cs/doc/84/kp.ps.gz - -USE_CATV(NEWTOY(catv, "vte", TOYFLAG_USR|TOYFLAG_BIN)) - -config CATV - bool "catv" - default y - help - usage: catv [-evt] [filename...] - - Display nonprinting characters as escape sequences. Use M-x for - high ascii characters (>127), and ^x for other nonprinting chars. - - -e Mark each newline with $ - -t Show tabs as ^I - -v Don't use ^x or M-x escapes. -*/ - -#define FOR_catv -#include "toys.h" - -// Callback function for loopfiles() - -static void do_catv(int fd, char *name) -{ - for(;;) { - int i, len; - - len = read(fd, toybuf, sizeof(toybuf)); - if (len < 0) toys.exitval = EXIT_FAILURE; - if (len < 1) break; - for (i=0; i 126 && (toys.optflags & FLAG_v)) { - if (c > 127) { - printf("M-"); - c -= 128; - } - if (c == 127) { - printf("^?"); - continue; - } - } - if (c < 32) { - if (c == 10) { - if (toys.optflags & FLAG_e) xputc('$'); - } else if (toys.optflags & (c==9 ? FLAG_t : FLAG_v)) { - printf("^%c", c+'@'); - continue; - } - } - xputc(c); - } - } -} - -void catv_main(void) -{ - toys.optflags ^= FLAG_v; - loopfiles(toys.optargs, do_catv); -} diff -r 45fb262230c9 -r f67b1e9e91b4 toys/posix/cat.c --- a/toys/posix/cat.c Mon Dec 22 17:04:47 2014 -0600 +++ b/toys/posix/cat.c Tue Dec 23 13:29:47 2014 -0600 @@ -3,8 +3,12 @@ * Copyright 2006 Rob Landley * * See http://opengroup.org/onlinepubs/9699919799/utilities/cat.html + * + * And "Cat -v considered harmful" at + * http://cm.bell-labs.com/cm/cs/doc/84/kp.ps.gz -USE_CAT(NEWTOY(cat, "u", TOYFLAG_BIN)) +USE_CAT(NEWTOY(cat, "u"USE_CAT_V("vte"), TOYFLAG_BIN)) +#USE_CATV(NEWTOY(catv, USE_CATV("vte"), TOYFLAG_USR|TOYFLAG_BIN)) config CAT bool "cat" @@ -16,19 +20,76 @@ Filename "-" is a synonym for stdin. -u Copy one byte at a time (slow). + +config CAT_V + bool "cat -etv" + default y + depends on CAT + help + usage: cat [-evt] + + Display nonprinting characters as escape sequences. Use M-x for + + -e Mark each newline with $ + -t Show tabs as ^I + -v Display nonprinting characters as escape sequences. Use M-x for + high ascii characters (>127), and ^x for other nonprinting chars. */ +/* +todo: + +config CATV + bool "catv" + default y + depends on !CAT_V + help + usage: catv [-evt] [filename...] + + Display nonprinting characters as escape sequences. Use M-x for + high ascii characters (>127), and ^x for other nonprinting chars. + + -e Mark each newline with $ + -t Show tabs as ^I + -v Don't use ^x or M-x escapes. +*/ + +#define FOR_cat #include "toys.h" static void do_cat(int fd, char *name) { - int len, size=toys.optflags ? 1 : sizeof(toybuf); + int i, len, size=(toys.optflags & FLAG_u) ? 1 : sizeof(toybuf); - for (;;) { + for(;;) { len = read(fd, toybuf, size); - if (len<0) perror_msg("%s",name); - if (len<1) break; - xwrite(1, toybuf, len); + if (len < 0) toys.exitval = EXIT_FAILURE; + if (len < 1) break; + if (CFG_CAT_V && (toys.optflags&~FLAG_u)) { + for (i=0; i 126 && (toys.optflags & FLAG_v)) { + if (c > 127) { + printf("M-"); + c -= 128; + } + if (c == 127) { + printf("^?"); + continue; + } + } + if (c < 32) { + if (c == 10) { + if (toys.optflags & FLAG_e) xputc('$'); + } else if (toys.optflags & (c==9 ? FLAG_t : FLAG_v)) { + printf("^%c", c+'@'); + continue; + } + } + xputc(c); + } + } else xwrite(1, toybuf, len); } } @@ -36,3 +97,15 @@ { loopfiles(toys.optargs, do_cat); } + +//todo: +//void catv_main(void) +//{ +// toys.optflags ^= FLAG_v; +// loopfiles(toys.optargs, do_catv); +//} + +// The common infrastructure is testing FLAG_h which is only defined in cat +// context (not catv), but catv can't use cat's flag context if cat is disabled +// and its flags are zero. Need to upgrade flag parsing infrastructure so +// defining FORCE_FLAGS along with FOR_command doesn't zero unused flag macros.