|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.