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