|
|
1.1 ! root 1: ! 2: ! 3: /* ! 4: * cat -- concatinate and print ! 5: */ ! 6: #include <errno.h> ! 7: #include <stdio.h> ! 8: #include <access.h> ! 9: ! 10: int uflag; /* don't buffer */ ! 11: char *filename; /* current input file name */ ! 12: ! 13: main( argc, argv) ! 14: char *argv[]; ! 15: { ! 16: static char obuf[BUFSIZ]; ! 17: register int i = 0; ! 18: ! 19: ++argv; ! 20: if (--argc>0 && strcmp( *argv, "-u")==0) { ! 21: ++argv; ! 22: --argc; ! 23: ++uflag; ! 24: setbuf( stdout, (char *)NULL); ! 25: } ! 26: else ! 27: setbuf( stdout, obuf); ! 28: ! 29: if (argc <= 0) ! 30: cat("-"); ! 31: else ! 32: { while (*argv) ! 33: { if (strcmp(*argv, "-") && access(*argv, AREAD)) ! 34: { fprintf(stderr, "cat: %s: %s\n", *argv, ! 35: sys_errlist[errno]); ! 36: *argv[0] = 0; /* flag arg as invalid */ ! 37: } ! 38: i++; /* count the arg */ ! 39: argv++; /* advance to next arg */ ! 40: } ! 41: ! 42: argv -= i; /* back to start of filename args to process */ ! 43: ! 44: do { ! 45: if (*argv[0] == 0) /* arg to skip? */ ! 46: { argv++; ! 47: continue; /* yes */ ! 48: } ! 49: cat(*argv++); ! 50: } while (--argc); ! 51: } ! 52: exit(0); ! 53: } ! 54: ! 55: ! 56: cat(file) ! 57: char *file; ! 58: { ! 59: register c; ! 60: register FILE *f; ! 61: extern char *sys_errlist[]; ! 62: extern errno; ! 63: ! 64: if (strcmp( file, "-") == 0) { ! 65: filename = "<stdin>"; ! 66: f = stdin; ! 67: } ! 68: else { ! 69: filename = file; ! 70: f = fopen( file, "r"); ! 71: if (f == (FILE *)NULL) ! 72: { fprintf(stderr, "cat: %s: %s\n", file, sys_errlist[errno]); ! 73: return; ! 74: } ! 75: } ! 76: if (uflag) ! 77: setbuf( f, (char *)NULL); ! 78: ! 79: while ((c=getc( f)) != EOF) { ! 80: putchar( c); ! 81: if (ferror( stdout)) ! 82: fatal( errno==EIO? "write error": sys_errlist[errno]); ! 83: } ! 84: ! 85: if (ferror( f)) ! 86: fatal( errno==EIO? "read error": sys_errlist[errno]); ! 87: if (f != stdin) ! 88: fclose( f); ! 89: } ! 90: ! 91: ! 92: fatal( mesg) ! 93: char *mesg; ! 94: { ! 95: ! 96: fflush( stdout); ! 97: printerr( "cat: ", filename, ": ", mesg, "\n", (char *)0); ! 98: exit(1); ! 99: } ! 100: ! 101: ! 102: printerr( arg0) ! 103: char *arg0; ! 104: { ! 105: register char **pp; ! 106: ! 107: for (pp= &arg0; *pp; ) ! 108: fputs( *pp++, stderr); ! 109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.