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