Annotation of 42BSD/bin/cat.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)cat.c       4.6 (Berkeley) 8/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: }

unix.superglobalmegacorp.com

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