xref: /original-bsd/bin/cat/cat.c (revision 8251a00e)
1 #ifndef lint
2 static	char *sccsid = "@(#)cat.c	4.6 (Berkeley) 08/11/83";
3 #endif
4 
5 /*
6  * Concatenate files.
7  */
8 
9 #include <stdio.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 
13 char	stdbuf[BUFSIZ];
14 int	bflg, eflg, nflg, sflg, tflg, vflg;
15 int	spaced, col, lno, inline;
16 
17 main(argc, argv)
18 char **argv;
19 {
20 	int fflg = 0;
21 	register FILE *fi;
22 	register c;
23 	int dev, ino = -1;
24 	struct stat statb;
25 
26 	lno = 1;
27 	setbuf(stdout, stdbuf);
28 	for( ; argc>1 && argv[1][0]=='-'; argc--,argv++) {
29 		switch(argv[1][1]) {
30 		case 0:
31 			break;
32 		case 'u':
33 			setbuf(stdout, (char *)NULL);
34 			continue;
35 		case 'n':
36 			nflg++;
37 			continue;
38 		case 'b':
39 			bflg++;
40 			nflg++;
41 			continue;
42 		case 'v':
43 			vflg++;
44 			continue;
45 		case 's':
46 			sflg++;
47 			continue;
48 		case 'e':
49 			eflg++;
50 			vflg++;
51 			continue;
52 		case 't':
53 			tflg++;
54 			vflg++;
55 			continue;
56 		}
57 		break;
58 	}
59 	if (fstat(fileno(stdout), &statb) == 0) {
60 		statb.st_mode &= S_IFMT;
61 		if (statb.st_mode!=S_IFCHR && statb.st_mode!=S_IFBLK) {
62 			dev = statb.st_dev;
63 			ino = statb.st_ino;
64 		}
65 	}
66 	if (argc < 2) {
67 		argc = 2;
68 		fflg++;
69 	}
70 	while (--argc > 0) {
71 		if (fflg || (*++argv)[0]=='-' && (*argv)[1]=='\0')
72 			fi = stdin;
73 		else {
74 			if ((fi = fopen(*argv, "r")) == NULL) {
75 				perror(*argv);
76 				continue;
77 			}
78 		}
79 		if (fstat(fileno(fi), &statb) == 0) {
80 			if ((statb.st_mode & S_IFMT) == S_IFREG &&
81 			    statb.st_dev==dev && statb.st_ino==ino) {
82 				fprintf(stderr, "cat: input %s is output\n",
83 				   fflg?"-": *argv);
84 				fclose(fi);
85 				continue;
86 			}
87 		}
88 		if (nflg||sflg||vflg)
89 			copyopt(fi);
90 		else {
91 			while ((c = getc(fi)) != EOF)
92 				putchar(c);
93 		}
94 		if (fi!=stdin)
95 			fclose(fi);
96 	}
97 	if (ferror(stdout))
98 		fprintf(stderr, "cat: output write error\n");
99 	return(0);
100 }
101 
102 copyopt(f)
103 	register FILE *f;
104 {
105 	register int c;
106 
107 top:
108 	c = getc(f);
109 	if (c == EOF)
110 		return;
111 	if (c == '\n') {
112 		if (inline == 0) {
113 			if (sflg && spaced)
114 				goto top;
115 			spaced = 1;
116 		}
117 		if (nflg && bflg==0 && inline == 0)
118 			printf("%6d\t", lno++);
119 		if (eflg)
120 			putchar('$');
121 		putchar('\n');
122 		inline = 0;
123 		goto top;
124 	}
125 	if (nflg && inline == 0)
126 		printf("%6d\t", lno++);
127 	inline = 1;
128 	if (vflg) {
129 		if (tflg==0 && c == '\t')
130 			putchar(c);
131 		else {
132 			if (c > 0177) {
133 				printf("M-");
134 				c &= 0177;
135 			}
136 			if (c < ' ')
137 				printf("^%c", c+'@');
138 			else if (c == 0177)
139 				printf("^?");
140 			else
141 				putchar(c);
142 		}
143 	} else
144 		putchar(c);
145 	spaced = 0;
146 	goto top;
147 }
148