xref: /aosp_15_r20/external/toybox/toys/posix/cat.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1 /* cat.c - copy inputs to stdout.
2  *
3  * Copyright 2006 Rob Landley <[email protected]>
4  *
5  * See http://opengroup.org/onlinepubs/9699919799/utilities/cat.html
6 
7 USE_CAT(NEWTOY(cat, "uvte", TOYFLAG_BIN))
8 
9 config CAT
10   bool "cat"
11   default y
12   help
13     usage: cat [-etuv] [FILE...]
14 
15     Copy (concatenate) files to stdout.  If no files listed, copy from stdin.
16     Filename "-" is a synonym for stdin.
17 
18     -e	Mark each newline with $
19     -t	Show tabs as ^I
20     -u	Copy one byte at a time (slow)
21     -v	Display nonprinting characters as escape sequences with M-x for
22     	high ascii characters (>127), and ^x for other nonprinting chars
23 */
24 
25 #define FOR_cat
26 #define FORCE_FLAGS
27 #include "toys.h"
28 
do_cat(int fd,char * name)29 static void do_cat(int fd, char *name)
30 {
31   int i, len, size = FLAG(u) ? 1 : sizeof(toybuf);
32 
33   for(;;) {
34     len = read(fd, toybuf, size);
35     if (len<0) perror_msg_raw(name);
36     if (len<1) break;
37     if (toys.optflags&~FLAG_u) {
38       for (i = 0; i<len; i++) {
39         char c = toybuf[i];
40 
41         if (c>126 && FLAG(v)) {
42           if (c>127) {
43             printf("M-");
44             c -= 128;
45           }
46           if (c == 127) {
47             printf("^?");
48             continue;
49           }
50         }
51         if (c<32) {
52           if (c == 10) {
53             if (FLAG(e)) xputc('$');
54           } else if (c==9 ? FLAG(t) : FLAG(v)) {
55             printf("^%c", c+'@');
56             continue;
57           }
58         }
59         xputc(c);
60       }
61     } else xwrite(1, toybuf, len);
62   }
63 }
64 
cat_main(void)65 void cat_main(void)
66 {
67   loopfiles(toys.optargs, do_cat);
68 }
69