Research V7 development
[unix-history] / usr / src / cmd / cat.c
CommitLineData
34ba1ef9
KT
1/*
2 * Concatenate files.
3 */
4
5#include <stdio.h>
6#include <sys/types.h>
7#include <sys/stat.h>
8
9char stdbuf[BUFSIZ];
10
11main(argc, argv)
12char **argv;
13{
14 int fflg = 0;
15 register FILE *fi;
16 register c;
17 int dev, ino = -1;
18 struct stat statb;
19
20 setbuf(stdout, stdbuf);
21 for( ; argc>1 && argv[1][0]=='-'; argc--,argv++) {
22 switch(argv[1][1]) {
23 case 0:
24 break;
25 case 'u':
26 setbuf(stdout, (char *)NULL);
27 continue;
28 }
29 break;
30 }
31 fstat(fileno(stdout), &statb);
32 statb.st_mode &= S_IFMT;
33 if (statb.st_mode!=S_IFCHR && statb.st_mode!=S_IFBLK) {
34 dev = statb.st_dev;
35 ino = statb.st_ino;
36 }
37 if (argc < 2) {
38 argc = 2;
39 fflg++;
40 }
41 while (--argc > 0) {
42 if (fflg || (*++argv)[0]=='-' && (*argv)[1]=='\0')
43 fi = stdin;
44 else {
45 if ((fi = fopen(*argv, "r")) == NULL) {
46 fprintf(stderr, "cat: can't open %s\n", *argv);
47 continue;
48 }
49 }
50 fstat(fileno(fi), &statb);
51 if (statb.st_dev==dev && statb.st_ino==ino) {
52 fprintf(stderr, "cat: input %s is output\n",
53 fflg?"-": *argv);
54 fclose(fi);
55 continue;
56 }
57 while ((c = getc(fi)) != EOF)
58 putchar(c);
59 if (fi!=stdin)
60 fclose(fi);
61 }
62 return(0);
63}