1 /* cat.c - copy inputs to stdout. 2 * 3 * Copyright 2006 Rob Landley <rob (at) landley.net> 4 * 5 * See http://opengroup.org/onlinepubs/9699919799/utilities/cat.html 6 * 7 * And "Cat -v considered harmful" at 8 * http://cm.bell-labs.com/cm/cs/doc/84/kp.ps.gz 9 10 USE_CAT(NEWTOY(cat, "u"USE_CAT_V("vte"), TOYFLAG_BIN)) 11 USE_CATV(NEWTOY(catv, USE_CATV("vte"), TOYFLAG_USR|TOYFLAG_BIN)) 12 13 config CAT 14 bool "cat" 15 default y 16 help 17 usage: cat [-u] [file...] 18 19 Copy (concatenate) files to stdout. If no files listed, copy from stdin. 20 Filename "-" is a synonym for stdin. 21 22 -u Copy one byte at a time (slow). 23 24 config CAT_V 25 bool "cat -etv" 26 default n 27 depends on CAT 28 help 29 usage: cat [-evt] 30 31 -e Mark each newline with $ 32 -t Show tabs as ^I 33 -v Display nonprinting characters as escape sequences. Use M-x for 34 high ascii characters (>127), and ^x for other nonprinting chars. 35 36 config CATV 37 bool "catv" 38 default y 39 help 40 usage: catv [-evt] [filename...] 41 42 Display nonprinting characters as escape sequences. Use M-x for 43 high ascii characters (>127), and ^x for other nonprinting chars. 44 45 -e Mark each newline with $ 46 -t Show tabs as ^I 47 -v Don't use ^x or M-x escapes. 48 */ 49 50 #define FOR_cat 51 #define FORCE_FLAGS 52 #include "toys.h" 53 54 static void do_cat(int fd, char *name) 55 { 56 int i, len, size=(toys.optflags & FLAG_u) ? 1 : sizeof(toybuf); 57 58 for(;;) { 59 len = read(fd, toybuf, size); 60 if (len < 0) toys.exitval = EXIT_FAILURE; 61 if (len < 1) break; 62 if ((CFG_CAT_V || CFG_CATV) && (toys.optflags&~FLAG_u)) { 63 for (i=0; i<len; i++) { 64 char c=toybuf[i]; 65 66 if (c > 126 && (toys.optflags & FLAG_v)) { 67 if (c > 127) { 68 printf("M-"); 69 c -= 128; 70 } 71 if (c == 127) { 72 printf("^?"); 73 continue; 74 } 75 } 76 if (c < 32) { 77 if (c == 10) { 78 if (toys.optflags & FLAG_e) xputc('$'); 79 } else if (toys.optflags & (c==9 ? FLAG_t : FLAG_v)) { 80 printf("^%c", c+'@'); 81 continue; 82 } 83 } 84 xputc(c); 85 } 86 } else xwrite(1, toybuf, len); 87 } 88 } 89 90 void cat_main(void) 91 { 92 loopfiles(toys.optargs, do_cat); 93 } 94 95 void catv_main(void) 96 { 97 toys.optflags ^= FLAG_v; 98 loopfiles(toys.optargs, do_cat); 99 } 100