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