Annotation of 42BSD/usr.bin/refer/glue5.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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