Annotation of 40BSD/cmd/refer/glue5.c, revision 1.1.1.1

1.1       root        1: # include "stdio.h"
                      2: # include "ctype.h"
                      3: /*
                      4:  * fgrep -- print all lines containing any of a set of keywords
                      5:  *
                      6:  *     status returns:
                      7:  *             0 - ok, and some matches
                      8:  *             1 - ok, but no matches
                      9:  *             2 - some error
                     10:  */
                     11: #define        MAXSIZ 700
                     12: #define QSIZE 400
                     13: struct words {
                     14:        char    inp;
                     15:        char    out;
                     16:        struct  words *nst;
                     17:        struct  words *link;
                     18:        struct  words *fail;
                     19: } 
                     20: *www, *smax, *q;
                     21: 
                     22: char   buf[2*BUFSIZ];
                     23: int    nsucc;
                     24: int    need;
                     25: char   *instr;
                     26: int    inct;
                     27: int    rflag;
                     28: int    xargc;
                     29: char   **xargv;
                     30: int    numwords;
                     31: int    nfound;
                     32: static int flag = 0;
                     33: 
                     34: 
                     35: fgrep(argc, argv)
                     36: char **argv;
                     37: {
                     38:        instr = nsucc = need = inct = rflag = numwords = nfound = 0;
                     39:        flag = 0;
                     40:        if (www==0)
                     41:                www = zalloc(MAXSIZ, sizeof (*www));
                     42:        if (www==NULL)
                     43:                err("Can't get space for machines", 0);
                     44:        for (q=www; q<www+MAXSIZ; q++) {
                     45:                q->inp =0; q->out =0; q->nst =0; q->link =0; q->fail =0;
                     46:        }
                     47:        xargc = argc-1;
                     48:        xargv = argv+1;
                     49:        while (xargc>0 && xargv[0][0]=='-')
                     50:                {
                     51:                switch(xargv[0][1])
                     52:                        {
                     53:                        case 'r': /* return value only */
                     54:                                rflag++;
                     55:                                break;
                     56:                        case 'n': /* number of answers needed */
                     57:                                need = xargv[1];
                     58:                                xargv++; xargc--;
                     59:                                break;
                     60:                        case 'i':
                     61:                                instr = xargv[1];
                     62:                                inct = xargv[2]+2;
                     63: # if D2
                     64: fprintf(stderr,"inct %d xargv.2. %o %d\n",inct, xargv[2],xargv[2]);
                     65: # endif
                     66:                                xargv += 2; xargc -= 2;
                     67:                                break;
                     68:                        }
                     69:                xargv++; xargc--;
                     70:                }
                     71:        if (xargc<=0)
                     72:                {
                     73:                write (2, "bad fgrep call\n", 15);
                     74:                exit(2);
                     75:                }
                     76: # if D1
                     77:        fprintf(stderr, "before cgoto\n");
                     78: # endif
                     79:        cgotofn();
                     80: # if D1
                     81:        fprintf(stderr, "before cfail\n");
                     82: # endif
                     83:        cfail();
                     84: # if D1
                     85:        fprintf(stderr, "before execute instr %.20s\n", instr? instr: "");
                     86:        fprintf(stderr, "end of string %d %c %c %c\n", inct, instr[inct-3],
                     87:                instr[inct-2], instr[inct-1]);
                     88: # endif
                     89:        execute();
                     90: # if D1
                     91:        fprintf(stderr, "returning nsucc %d\n", nsucc);
                     92:        fprintf(stderr, "fgrep done www %o\n",www);
                     93: # endif
                     94:        return(nsucc == 0);
                     95: }
                     96: 
                     97: execute()
                     98: {
                     99:        register char *p;
                    100:        register struct words *c;
                    101:        register ch;
                    102:        register ccount;
                    103:        int f;
                    104:        char *nlp;
                    105:        f=0;
                    106:        ccount = instr ? inct : 0;
                    107:        nfound=0;
                    108:        p = instr ? instr : buf;
                    109:        if (need == 0) need = numwords;
                    110:        nlp = p;
                    111:        c = www;
                    112: # if D2
                    113: fprintf(stderr, "in execute ccount %d inct %d\n",ccount, inct );
                    114: # endif
                    115:        for (;;) {
                    116: # if D3
                    117: fprintf(stderr, "down ccount\n");
                    118: # endif
                    119:                if (--ccount <= 0) {
                    120: # if D2
                    121: fprintf(stderr, "ex loop ccount %d instr %o\n",ccount, instr);
                    122: # endif
                    123:                        if (instr) break;
                    124:                        if (p == &buf[2*BUFSIZ]) p = buf;
                    125:                        if (p > &buf[BUFSIZ]) {
                    126:                                if ((ccount = read(f, p, &buf[2*BUFSIZ] - p)) <= 0) break;
                    127:                        }
                    128:                        else if ((ccount = read(f, p, BUFSIZ)) <= 0) break;
                    129: # if D2
                    130: fprintf(stderr, " normal read %d bytres\n", ccount);
                    131: {char xx[20]; sprintf(xx, "they are %%.%ds\n", ccount);
                    132: fprintf(stderr, xx, p);
                    133: }
                    134: # endif
                    135:                }
                    136: nstate:
                    137:                ch = *p;
                    138: # if D2
                    139: fprintf(stderr, "roaming along in ex ch %c c %o\n",ch,c);
                    140: # endif
                    141:                if (isupper(ch)) ch |= 040;
                    142:                if (c->inp == ch) {
                    143:                        c = c->nst;
                    144:                }
                    145:                else if (c->link != 0) {
                    146:                        c = c->link;
                    147:                        goto nstate;
                    148:                }
                    149:                else {
                    150:                        c = c->fail;
                    151:                        if (c==0) {
                    152:                                c = www;
                    153: istate:
                    154:                                if (c->inp == ch) {
                    155:                                        c = c->nst;
                    156:                                }
                    157:                                else if (c->link != 0) {
                    158:                                        c = c->link;
                    159:                                        goto istate;
                    160:                                }
                    161:                        }
                    162:                        else goto nstate;
                    163:                }
                    164:                if (c->out && new (c)) {
                    165: # if D2
                    166: fprintf(stderr, " found: nfound %d need %d\n",nfound,need);
                    167: # endif
                    168:                        if (++nfound >= need)
                    169:                        {
                    170: # if D1
                    171: fprintf(stderr, "found, p %o nlp %o ccount %d buf %o buf[2*BUFSIZ] %o\n",p,nlp,ccount,buf,buf+2*BUFSIZ);
                    172: # endif
                    173:                                if (instr==0)
                    174:                                while (*p++ != '\n') {
                    175: # if D3
                    176: fprintf(stderr, "down ccount2\n");
                    177: # endif
                    178:                                        if (--ccount <= 0) {
                    179:                                                if (p == &buf[2*BUFSIZ]) p = buf;
                    180:                                                if (p > &buf[BUFSIZ]) {
                    181:                                                        if ((ccount = read(f, p, &buf[2*BUFSIZ] - p)) <= 0) break;
                    182:                                                }
                    183:                                                else if ((ccount = read(f, p, BUFSIZ)) <= 0) break;
                    184: # if D2
                    185: fprintf(stderr, " read %d bytes\n",ccount);
                    186: { char xx[20]; sprintf(xx, "they are %%.%ds\n", ccount);
                    187: fprintf(stderr, xx, p);
                    188: }
                    189: # endif
                    190:                                        }
                    191:                                }
                    192:                                nsucc = 1;
                    193:                                if (rflag==0)
                    194:                                        {
                    195: # if D2
                    196: fprintf(stderr, "p %o nlp %o buf %o\n",p,nlp,buf);
                    197: if (p>nlp)
                    198: {write (2, "XX\n", 3); write (2, nlp, p-nlp); write (2, "XX\n", 3);}
                    199: # endif
                    200:                                        if (p > nlp) write(1, nlp, p-nlp);
                    201:                                        else {
                    202:                                                write(1, nlp, &buf[2*BUFSIZ] - nlp);
                    203:                                                write(1, buf, p-&buf[0]);
                    204:                                                }
                    205:                                        if (p[-1]!= '\n') write (1, "\n", 1);
                    206:                                        }
                    207:                                if (instr==0)
                    208:                                        {
                    209:                                        nlp = p;
                    210:                                        c = www;
                    211:                                        nfound=0; 
                    212:                                        }
                    213:                        }
                    214:                        else
                    215:                                ccount++;
                    216:                        continue;
                    217:                }
                    218: # if D2
                    219: fprintf(stderr, "nr end loop p %o\n",p);
                    220: # endif
                    221:                if (instr)
                    222:                        p++;
                    223:                else
                    224:                if (*p++ == '\n')
                    225:                {
                    226:                        nlp = p;
                    227:                        c = www;
                    228:                        nfound=0;
                    229:                }
                    230:        }
                    231:        if (instr==0)
                    232:                close(f);
                    233: }
                    234: 
                    235: cgotofn() {
                    236:        register c;
                    237:        register struct words *s;
                    238:        s = smax = www;
                    239: nword: 
                    240:        for(;;) {
                    241: # if D1
                    242:        fprintf(stderr, " in for loop c now %o %c\n",c, c>' ' ? c : ' ');
                    243: # endif
                    244:                if ((c = gch())==0) return;
                    245:                else if (c == '\n') {
                    246:                        s->out = 1;
                    247:                        s = www;
                    248:                }
                    249:                else {
                    250: loop:  
                    251:                        if (s->inp == c) {
                    252:                                s = s->nst;
                    253:                                continue;
                    254:                        }
                    255:                        if (s->inp == 0) goto enter;
                    256:                        if (s->link == 0) {
                    257:                                if (smax >= &www[MAXSIZ - 1]) overflo();
                    258:                                s->link = ++smax;
                    259:                                s = smax;
                    260:                                goto enter;
                    261:                        }
                    262:                        s = s->link;
                    263:                        goto loop;
                    264:                }
                    265:        }
                    266: 
                    267: enter:
                    268:        do {
                    269:                s->inp = c;
                    270:                if (smax >= &www[MAXSIZ - 1]) overflo();
                    271:                s->nst = ++smax;
                    272:                s = smax;
                    273:        } 
                    274:        while ((c = gch()) != '\n');
                    275:        smax->out = 1;
                    276:        s = www;
                    277:        numwords++;
                    278:        goto nword;
                    279: 
                    280: }
                    281: 
                    282: gch()
                    283: {
                    284:        static char *s;
                    285:        if (flag==0)
                    286:        {
                    287:                flag=1;
                    288:                s = *xargv++;
                    289: # if D1
                    290:        fprintf(stderr, "next arg is %s xargc %d\n",s,xargc);
                    291: # endif
                    292:                if (xargc-- <=0) return(0);
                    293:        }
                    294:        if (*s) return(*s++);
                    295:        for(flag=0; flag<2*BUFSIZ; flag++)
                    296:                buf[flag]=0;
                    297:        flag=0;
                    298:        return('\n');
                    299: }
                    300: 
                    301: overflo() {
                    302:        write(2,"wordlist too large\n", 19);
                    303:        exit(2);
                    304: }
                    305: cfail() {
                    306:        struct words *queue[QSIZE];
                    307:        struct words **front, **rear;
                    308:        struct words *state;
                    309:        register char c;
                    310:        register struct words *s;
                    311:        s = www;
                    312:        front = rear = queue;
                    313: init:  
                    314:        if ((s->inp) != 0) {
                    315:                *rear++ = s->nst;
                    316:                if (rear >= &queue[QSIZE - 1]) overflo();
                    317:        }
                    318:        if ((s = s->link) != 0) {
                    319:                goto init;
                    320:        }
                    321: 
                    322:        while (rear!=front) {
                    323:                s = *front;
                    324:                if (front == &queue[QSIZE-1])
                    325:                        front = queue;
                    326:                else front++;
                    327: cloop: 
                    328:                if ((c = s->inp) != 0) {
                    329:                        *rear = (q = s->nst);
                    330:                        if (front < rear)
                    331:                                if (rear >= &queue[QSIZE-1])
                    332:                                        if (front == queue) overflo();
                    333:                                        else rear = queue;
                    334:                        else rear++;
                    335:                        else
                    336:                                if (++rear == front) overflo();
                    337:                        state = s->fail;
                    338: floop: 
                    339:                        if (state == 0) state = www;
                    340:                        if (state->inp == c) {
                    341:                                q->fail = state->nst;
                    342:                                if ((state->nst)->out == 1) q->out = 1;
                    343:                                continue;
                    344:                        }
                    345:                        else if ((state = state->link) != 0)
                    346:                                goto floop;
                    347:                }
                    348:                if ((s = s->link) != 0)
                    349:                        goto cloop;
                    350:        }
                    351: }
                    352: static int seen[50];
                    353: new (x)
                    354: {
                    355:        int i;
                    356:        for(i=0; i<nfound; i++)
                    357:                if (seen[i]==x)
                    358:                        return(0);
                    359:        seen[i]=x;
                    360:        return(1);
                    361: }

unix.superglobalmegacorp.com

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