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

1.1       root        1: /*
                      2:  * Deal with duplicated lines in a file
                      3:  */
                      4: #include <stdio.h>
                      5: #include <ctype.h>
                      6: int    fields;
                      7: int    letters;
                      8: int    linec;
                      9: char   mode;
                     10: int    uniq;
                     11: char   *skip();
                     12: 
                     13: main(argc, argv)
                     14: int argc;
                     15: char *argv[];
                     16: {
                     17:        static char b1[1000], b2[1000];
                     18: 
                     19:        while(argc > 1) {
                     20:                if(*argv[1] == '-') {
                     21:                        if (isdigit(argv[1][1]))
                     22:                                fields = atoi(&argv[1][1]);
                     23:                        else mode = argv[1][1];
                     24:                        argc--;
                     25:                        argv++;
                     26:                        continue;
                     27:                }
                     28:                if(*argv[1] == '+') {
                     29:                        letters = atoi(&argv[1][1]);
                     30:                        argc--;
                     31:                        argv++;
                     32:                        continue;
                     33:                }
                     34:                if (freopen(argv[1], "r", stdin) == NULL)
                     35:                        printe("cannot open %s\n", argv[1]);
                     36:                break;
                     37:        }
                     38:        if(argc > 2 && freopen(argv[2], "w", stdout) == NULL)
                     39:                printe("cannot create %s\n", argv[2]);
                     40: 
                     41:        if(gline(b1))
                     42:                exit(0);
                     43:        for(;;) {
                     44:                linec++;
                     45:                if(gline(b2)) {
                     46:                        pline(b1);
                     47:                        exit(0);
                     48:                }
                     49:                if(!equal(b1, b2)) {
                     50:                        pline(b1);
                     51:                        linec = 0;
                     52:                        do {
                     53:                                linec++;
                     54:                                if(gline(b1)) {
                     55:                                        pline(b2);
                     56:                                        exit(0);
                     57:                                }
                     58:                        } while(equal(b1, b2));
                     59:                        pline(b2);
                     60:                        linec = 0;
                     61:                }
                     62:        }
                     63: }
                     64: 
                     65: gline(buf)
                     66: register char buf[];
                     67: {
                     68:        register c;
                     69: 
                     70:        while((c = getchar()) != '\n') {
                     71:                if(c == EOF)
                     72:                        return(1);
                     73:                *buf++ = c;
                     74:        }
                     75:        *buf = 0;
                     76:        return(0);
                     77: }
                     78: 
                     79: pline(buf)
                     80: register char buf[];
                     81: {
                     82: 
                     83:        switch(mode) {
                     84: 
                     85:        case 'u':
                     86:                if(uniq) {
                     87:                        uniq = 0;
                     88:                        return;
                     89:                }
                     90:                break;
                     91: 
                     92:        case 'd':
                     93:                if(uniq) break;
                     94:                return;
                     95: 
                     96:        case 'c':
                     97:                printf("%4d ", linec);
                     98:        }
                     99:        uniq = 0;
                    100:        fputs(buf, stdout);
                    101:        putchar('\n');
                    102: }
                    103: 
                    104: equal(b1, b2)
                    105: register char b1[], b2[];
                    106: {
                    107:        register char c;
                    108: 
                    109:        b1 = skip(b1);
                    110:        b2 = skip(b2);
                    111:        while((c = *b1++) != 0)
                    112:                if(c != *b2++) return(0);
                    113:        if(*b2 != 0)
                    114:                return(0);
                    115:        uniq++;
                    116:        return(1);
                    117: }
                    118: 
                    119: char *
                    120: skip(s)
                    121: register char *s;
                    122: {
                    123:        register nf, nl;
                    124: 
                    125:        nf = nl = 0;
                    126:        while(nf++ < fields) {
                    127:                while(*s == ' ' || *s == '\t')
                    128:                        s++;
                    129:                while( !(*s == ' ' || *s == '\t' || *s == 0) ) 
                    130:                        s++;
                    131:        }
                    132:        while(nl++ < letters && *s != 0) 
                    133:                        s++;
                    134:        return(s);
                    135: }
                    136: 
                    137: printe(p,s)
                    138: char *p,*s;
                    139: {
                    140:        fprintf(stderr, p, s);
                    141:        exit(1);
                    142: }

unix.superglobalmegacorp.com

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