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