Annotation of researchv9/cmd/egrep/egrep.c, revision 1.1.1.1

1.1       root        1: #include       "hdr.h"
                      2: #include       "y.tab.h"
                      3: 
                      4: cgotofn() {
                      5:        register i;
                      6:        count = cntpos = 0;
                      7:        nxtpos = 0;
                      8:        nxtfoll = MAXPOS-1;
                      9:        begout = 0;
                     10:        for (i=1; i<=line; i++) colpos[i] = 0;
                     11:        if (first(line-1)==0) {
                     12:                colpos[line] = 1;
                     13:                cntpos++;
                     14:                begout = 1;
                     15:        }
                     16:        for (i=1; i<=line; i++) tmpstat[i] = begstat[i] = colpos[i];
                     17:        count = begcnt = cntpos-1;      /* leave out position 1 */
                     18:        tmpstat[1] = begstat[1] = 0;
                     19:        addstate(1);
                     20:        inxtpos = nxtpos;
                     21:        istat = nxtst(states+1,LEFT);
                     22: }
                     23: 
                     24: State *
                     25: nxtst(ss,c)
                     26: State *ss;
                     27: char c;
                     28: {
                     29:        register i, num, k;
                     30:        int pos, curpos, number, newpos;
                     31:        int s = ss-states;
                     32:        num = positions[state[s]];
                     33:        count = begcnt;
                     34:        for (i=3; i<=line; i++) tmpstat[i] = begstat[i];
                     35:        pos = state[s] + 1;
                     36:        for (i=0; i<num; i++) {
                     37:                curpos = positions[pos];
                     38:                if ((k = name[curpos]) >= 0) {
                     39:                        if (
                     40:                                (k == c)
                     41:                                | (k == DOT && c != LEFT && c != RIGHT)
                     42:                                | (k == CCL && member(c, right[curpos], 1))
                     43:                                | (k == NCCL && member(c, right[curpos], 0) && c != LEFT && c != RIGHT)
                     44:                        ) {
                     45:                                if (foll[curpos] == 0) {
                     46:                                        cntpos = 0;
                     47:                                        for (k=1; k<=line; k++) colpos[k] = 0;
                     48:                                        follow(curpos);
                     49:                                        addfoll(curpos);
                     50:                                }
                     51:                                number = positions[foll[curpos]];
                     52:                                newpos = foll[curpos] - 1;
                     53:                                for (k=0; k<number; k++) {
                     54:                                        if (tmpstat[positions[newpos]] != 1) {
                     55:                                                tmpstat[positions[newpos]] = 1;
                     56:                                                count++;
                     57:                                        }
                     58:                                        newpos--;
                     59:                                }
                     60:                        }
                     61:                }
                     62:                pos++;
                     63:        }
                     64:        if (notin(nstate)) {
                     65:                if (++nstate >= NSTATES) {
                     66:                        nxtpos = inxtpos;
                     67:                        reinit = 1;
                     68:                        nstate = 1;
                     69:                        addstate(1);
                     70:                        return states+1;
                     71:                }
                     72:                addstate(nstate);
                     73:                return(states[s].gotofn[c] = states+nstate);
                     74:        }
                     75:        else {
                     76:                return(states[s].gotofn[c] = states+xstate);
                     77:        }
                     78: }
                     79: 
                     80: first(v) {
                     81:        register b;
                     82:        if (left[v] == 0) {
                     83:                if (colpos[v] != 1) {
                     84:                        colpos[v] = 1;
                     85:                        cntpos++;
                     86:                }
                     87:                return(1);
                     88:        }
                     89:        else if (right[v] == 0) {
                     90:                if (first(left[v]) == 0) return (0);
                     91:                else if (name[v] == PLUS) return (1);
                     92:                else return (0);
                     93:        }
                     94:        else if (name[v] == CAT) {
                     95:                if (first(left[v]) == 0 && first(right[v]) == 0) return (0);
                     96:                else return (1);
                     97:        }
                     98:        else { /* name[v] == OR */
                     99:                b = first(right[v]);
                    100:                if (first(left[v]) == 0 || b == 0) return (0);
                    101:                else return (1);
                    102:        }
                    103: }
                    104: 
                    105: member(symb, set, torf) {
                    106:        register i, num, pos;
                    107:        num = chars[set];
                    108:        pos = set + 1;
                    109:        for (i=0; i<num; i++)
                    110:                if (symb == chars[pos++]) return (torf);
                    111:        return (!torf);
                    112: }
                    113: 
                    114: notin(n) {
                    115:        register i, j, pos;
                    116:        for (i=1; i<=n; i++) {
                    117:                if (positions[state[i]] == count) {
                    118:                        pos = state[i] + 1;
                    119:                        for (j=0; j < count; j++) {
                    120:                                if (tmpstat[positions[pos++]] != 1) goto nxt; }
                    121:                        xstate = i;
                    122:                        return (0);
                    123:                }
                    124:                nxt: ;
                    125:        }
                    126:        return (1);
                    127: }
                    128: 
                    129: addstate(n) {
                    130:        register i;
                    131:        if (nxtpos + count >= nxtfoll) {
                    132:                overflo(); }
                    133:        for (i=0; i<NCHARS; i++)
                    134:                states[n].gotofn[i] = 0;
                    135:        state[n] = nxtpos;
                    136:        positions[nxtpos++] = count;
                    137:        for (i=3; i <= line; i++) {
                    138:                if (tmpstat[i] == 1) {
                    139:                        positions[nxtpos++] = i;
                    140:                }
                    141:        }
                    142:        if (tmpstat[line] == 1)
                    143:                states[n].out = 1;
                    144:        else
                    145:                states[n].out = 0;
                    146: }
                    147: 
                    148: addfoll(n) {
                    149:        register i;
                    150:        if (nxtfoll - cntpos <= nxtpos) {
                    151:                overflo(); }
                    152:        foll[n] = nxtfoll;
                    153:        positions[nxtfoll--] = cntpos;
                    154:        for (i=3; i <= line; i++) {
                    155:                if (colpos[i] == 1) {
                    156:                        positions[nxtfoll--] = i;
                    157:                }
                    158:        }
                    159: }
                    160: 
                    161: follow(v) int v; {
                    162:        int p;
                    163:        if (v == line) return;
                    164:        p = parent[v];
                    165:        switch(name[p]) {
                    166:                case STAR:
                    167:                case PLUS:      first(v);
                    168:                                follow(p);
                    169:                                return;
                    170: 
                    171:                case OR:
                    172:                case QUEST:     follow(p);
                    173:                                return;
                    174: 
                    175:                case CAT:       if (v == left[p]) {
                    176:                                        if (first(right[p]) == 0) {
                    177:                                                follow(p);
                    178:                                                return;
                    179:                                        }
                    180:                                }
                    181:                                else follow(p);
                    182:                                return;
                    183:                case FINAL:     if (colpos[line] != 1) {
                    184:                                        colpos[line] = 1;
                    185:                                        cntpos++;
                    186:                                }
                    187:                                return;
                    188:        }
                    189: }
                    190: 
                    191: clearg() {
                    192:        register i;
                    193:        reinit = 0;
                    194:        states[1].out = begout;
                    195:        for (i=0; i<NCHARS; i++)
                    196:                states[1].gotofn[i] = 0;
                    197:        nstate = 1;
                    198:        state[1] = 0;
                    199:        istat = nxtst(states+1,LEFT);
                    200: }
                    201: 
                    202: execute(file)
                    203: char *file;
                    204: {
                    205:        register char *p;
                    206:        register State *cstat, *t;
                    207:        int len;
                    208:        char *nlp;
                    209:        int f;
                    210: 
                    211: #define        READLINE        if((p = nlp = Frdline(f)) == 0)\
                    212:                                goto done;\
                    213:                        else    /* Frdline nulls the \n, put it back */\
                    214:                                len = FIOLINELEN(f), nlp[len++] = RIGHT
                    215: 
                    216:        if (file) {
                    217:                if ((f = open(file, 0)) < 0) {
                    218:                        fprint(2, "egrep: can't open %s\n", file);
                    219:                        badbotch=1;
                    220:                        return;
                    221:                }
                    222:        }
                    223:        else f = 0;
                    224:        Finit(f, (char *)0);
                    225:        Ftie(f, 1);             /* link input f with stdout */
                    226:        lnum = 1;
                    227:        tln = 0;
                    228:        READLINE;
                    229:        cstat = istat;
                    230:        if (cstat->out) goto found;
                    231:        for (;;) {
                    232:                if ((t = cstat->gotofn[*p]) == 0)
                    233:                        cstat = nxtst(cstat, *p);
                    234:                else
                    235:                        cstat = t;
                    236:                if (cstat->out) {
                    237:                found:
                    238:                        if (vflag == 0) {
                    239:                succeed:        nsucc = 1;
                    240:                                if (cflag) tln++;
                    241:                                else if (sflag)
                    242:                                        ;       /* ugh */
                    243:                                else if (lflag) {
                    244:                                        Fprint(1, "%s\n", file);
                    245:                                        close(f);
                    246:                                        return;
                    247:                                }
                    248:                                else {
                    249:                                        if (nfile > 1 && hflag)
                    250:                                                Fprint(1, "%s:", file);
                    251:                                        if (bflag)
                    252:                                                Fprint(1, "%ld:", (FIOSEEK(f)-len)/BLKSIZE);
                    253:                                        if (nflag)
                    254:                                                Fprint(1, "%ld:", lnum);
                    255:                                        Fwrite(1, nlp, len);
                    256:                                }
                    257:                        }
                    258:                        lnum++;
                    259:                        READLINE;
                    260:                        if (reinit == 1) clearg();
                    261:                        if ((cstat = istat)->out)
                    262:                                goto found;     /* we are a match already */
                    263:                        else
                    264:                                continue;       /* normal pattern matching loop */
                    265:                }
                    266:                if (*p++ == RIGHT) {
                    267:                        if (vflag) goto succeed;
                    268:                        else {
                    269:                                lnum++;
                    270:                                READLINE;
                    271:                                if (reinit == 1) clearg();
                    272:                                if ((cstat = istat)->out)
                    273:                                        goto found;     /* we are a match already */
                    274:                        }
                    275:                }
                    276:        }
                    277: done:  close(f);
                    278:        if (cflag) {
                    279:                if (nfile > 1)
                    280:                        Fprint("%s:", file);
                    281:                Fprint(1, "%ld\n", tln);
                    282:        }
                    283: }

unix.superglobalmegacorp.com

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