Annotation of 3BSD/cmd/cat.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Concatenate files.
                      3:  */
                      4: 
                      5: #include <stdio.h>
                      6: #include <sys/types.h>
                      7: #include <sys/stat.h>
                      8: 
                      9: char   stdbuf[BUFSIZ];
                     10: 
                     11: main(argc, argv)
                     12: char **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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.