|
|
1.1 ! root 1: # To unbundle, sh this file ! 2: echo mkfile 1>&2 ! 3: sed 's/.//' >mkfile <<'//GO.SYSIN DD mkfile' ! 4: -CFLAGS=-O ! 5: -YFLAGS=-d ! 6: -NPROC=2 ! 7: - ! 8: -egrep: gram.o main.o egrep.o bm.o anal.o ! 9: - $CC $CFLAGS -o $target $prereq ! 10: - ! 11: -install: egrep ! 12: - cp egrep /usr/bin/egrep ! 13: - strip /usr/bin/egrep ! 14: - chmod 775 /usr/bin/egrep ! 15: - chown bin,bin /usr/bin/egrep ! 16: - ! 17: -clean:V: ! 18: - rm -f *.o egrep ! 19: - ! 20: -y.tab.h: gram.o ! 21: -egrep.o anal.o: y.tab.h ! 22: -anal.o bm.o egrep.o main.o gram.o: hdr.h ! 23: - ! 24: -pp: ! 25: - smallpr mkfile hdr.h anal.c bm.c egrep.c gram.y main.c ! 26: - ! 27: -egrep.bundle:V: ! 28: - bundle mkfile *.h *.c *.y > $target ! 29: //GO.SYSIN DD mkfile ! 30: echo hdr.h 1>&2 ! 31: sed 's/.//' >hdr.h <<'//GO.SYSIN DD hdr.h' ! 32: -#include <fio.h> ! 33: -#include <ctype.h> ! 34: -#include <libc.h> ! 35: - ! 36: -#define BLKSIZE 1024 /* size of reported disk blocks */ ! 37: -#define MAXLIN 10000 ! 38: -#define MAXPOS 20000 ! 39: -#define NCHARS 256 ! 40: -#define NSTATES 128 ! 41: -#define FINAL -1 ! 42: -#define LEFT '\177' /* serves as ^ */ ! 43: -#define RIGHT '\n' /* serves as record separator and as $ */ ! 44: - ! 45: -typedef struct State ! 46: -{ ! 47: - struct State *gotofn[NCHARS]; ! 48: - int out; ! 49: -} State; ! 50: -extern State states[]; ! 51: -State *nxtst(); ! 52: -extern int state[]; ! 53: -extern int line; ! 54: -extern int name[]; ! 55: -extern int left[]; ! 56: -extern int right[]; ! 57: -extern int parent[]; ! 58: -extern int foll[]; ! 59: -extern int positions[]; ! 60: -extern char chars[]; ! 61: -extern int nxtpos; ! 62: -extern int nxtfoll; ! 63: -extern int inxtpos; ! 64: -extern int nxtfoll; ! 65: -extern int nxtchar; ! 66: -extern int tmpstat[]; ! 67: -extern State *istat; ! 68: -extern int nstate; ! 69: -extern int xstate; ! 70: -extern int count; ! 71: -extern char *input; ! 72: -extern char *progname; ! 73: - ! 74: -extern char reinit; ! 75: - ! 76: -extern int begout; ! 77: -extern int begcnt; ! 78: -extern int begstat[]; ! 79: - ! 80: -extern int colpos[]; ! 81: -extern int cntpos; ! 82: - ! 83: -extern long lnum; ! 84: -extern int bflag; ! 85: -extern int cflag; ! 86: -extern int fflag; ! 87: -extern int hflag; ! 88: -extern int iflag; ! 89: -extern int lflag; ! 90: -extern int nflag; ! 91: -extern int sflag; ! 92: -extern int vflag; ! 93: -extern int nfile; ! 94: -extern long tln; ! 95: -extern int nsucc; ! 96: -extern int badbotch; ! 97: - ! 98: -extern int expfile; ! 99: - ! 100: -extern int bmegrep; ! 101: -extern int scanexit; ! 102: //GO.SYSIN DD hdr.h ! 103: echo y.tab.h 1>&2 ! 104: sed 's/.//' >y.tab.h <<'//GO.SYSIN DD y.tab.h' ! 105: -# define CHAR 257 ! 106: -# define DOT 258 ! 107: -# define CCL 259 ! 108: -# define NCCL 260 ! 109: -# define OR 261 ! 110: -# define CAT 262 ! 111: -# define STAR 263 ! 112: -# define PLUS 264 ! 113: -# define QUEST 265 ! 114: //GO.SYSIN DD y.tab.h ! 115: echo anal.c 1>&2 ! 116: sed 's/.//' >anal.c <<'//GO.SYSIN DD anal.c' ! 117: -#include "hdr.h" ! 118: -#include "y.tab.h" ! 119: - ! 120: -#define NLIT 256 ! 121: -#define LSTART litp = litb ! 122: -#define LEND {*litp = 0; if(strlen(litb) > strlen(blit))strcpy(blit,litb);} ! 123: - ! 124: -static char *litp, litb[NLIT], *blit; ! 125: - ! 126: - ! 127: -/* ! 128: - islit has to return 1 if we are to use boyer-moore. ! 129: - in this case, set buf to the literal string and ! 130: - set bmegrep to 1 if there is a regular expression ! 131: - beside the literal (literal can be anywhere). ! 132: -*/ ! 133: -islit(buf) ! 134: - char *buf; ! 135: -{ ! 136: - bmegrep = 0; ! 137: - blit = buf; ! 138: - *blit = 0; ! 139: - LSTART; ! 140: - ! 141: -/* pr(line-2, ""); */ ! 142: - ! 143: - lit(line-2); ! 144: - LEND; ! 145: - if(strlen(blit) > 1){ ! 146: - /* bmegrep set by lit */ ! 147: - return(1); ! 148: - } ! 149: - return(0); ! 150: -} ! 151: - ! 152: -/* ! 153: - lit builds literal strings in litb. we ensure these are compulsory ! 154: - literal string by only descending the right nodes. ! 155: -*/ ! 156: -lit(n) ! 157: -{ ! 158: - if(name[n] == CAT){ ! 159: - lit(left[n]); ! 160: - lit(right[n]); ! 161: - } else if(name[n] == PLUS){ ! 162: - lit(left[n]); ! 163: - LEND; /* can't go on past a + */ ! 164: - LSTART; ! 165: - bmegrep = 1; ! 166: - lit(left[n]); /* but we can start with one! */ ! 167: - } else if((name[n] == CCL) && (chars[right[n]] == 1)){ ! 168: - *litp++ = chars[right[n]+1]; ! 169: - if(litp == &litb[NLIT]) ! 170: - litp--; ! 171: - } else if(left[n] == 0 && name[n] < 256 ! 172: - && name[n] != LEFT && name[n] != RIGHT){ ! 173: - *litp++ = name[n]; ! 174: - if(litp == &litb[NLIT]) ! 175: - litp--; ! 176: - } else { ! 177: - LEND; ! 178: - LSTART; ! 179: - bmegrep = 1; ! 180: - } ! 181: -} ! 182: - ! 183: -/*#ifdef DEBUG*/ ! 184: - ! 185: -pr(n, s) ! 186: - char *s; ! 187: -{ ! 188: - char buf[256]; ! 189: - int i, cnt; ! 190: - ! 191: - print("%s", s); ! 192: - sprint(buf, "%s ", s); ! 193: - switch(name[n]) ! 194: - { ! 195: - case FINAL: print("expr=\n"); pr(left[n], buf); break; ! 196: - case DOT: print("%d: .\n",n); break; ! 197: - case STAR: print("%d: *\n",n); pr(left[n], buf); break; ! 198: - case PLUS: print("%d: +\n",n); pr(left[n], buf); break; ! 199: - case QUEST: print("%d: ?\n",n); pr(left[n], buf); break; ! 200: - case CAT: print("%d: cat\n", n); pr(left[n], buf); pr(right[n], buf); break; ! 201: - case OR: print("%d: or\n", n); pr(left[n], buf); pr(right[n], buf); break; ! 202: - case NCCL: ! 203: - case CCL: print("%d: [%s", n, name[n]==NCCL? "^":""); ! 204: - for(i = right[n], cnt = chars[i++]; cnt > 0; cnt--) ! 205: - print("%c", chars[i++]); ! 206: - print("]\n"); ! 207: - break; ! 208: - default: ! 209: - if(name[n] < 256) ! 210: - print("%d: '%c'\n", n, name[n]); ! 211: - else ! 212: - print("URK %d\n", name[n]); ! 213: - break; ! 214: - } ! 215: -} ! 216: -/*#endif*/ ! 217: //GO.SYSIN DD anal.c ! 218: echo bm.c 1>&2 ! 219: sed 's/.//' >bm.c <<'//GO.SYSIN DD bm.c' ! 220: -#include "hdr.h" ! 221: - ! 222: -#define LARGE 100000 ! 223: - ! 224: -static int delta0[256]; ! 225: -static char cmap[256]; ! 226: -static char *bmpat; ! 227: - ! 228: -bmprep(pattern) ! 229: - char *pattern; ! 230: -{ ! 231: - register int j, patlen; ! 232: - ! 233: - patlen = strlen(bmpat = pattern); ! 234: - for(j = 0; j < 256; j++){ ! 235: - delta0[j] = patlen; ! 236: - cmap[j] = j; ! 237: - } ! 238: - for(j = 0; j < patlen-1; j++) ! 239: - delta0[pattern[j]] = patlen-j-1; ! 240: - delta0[pattern[patlen-1]] = LARGE; ! 241: - if(iflag){ ! 242: - for(j = 0; j < patlen-1; j++) ! 243: - if(islower(pattern[j])) ! 244: - delta0[toupper(pattern[j])] = patlen-j-1; ! 245: - if(islower(pattern[patlen-1])) ! 246: - delta0[toupper(pattern[patlen-1])] = LARGE; ! 247: - for(j = 'A'; j <= 'Z'; j++) ! 248: - cmap[j] = tolower(j); ! 249: - } ! 250: -} ! 251: - ! 252: -bmexecute(file) ! 253: -char *file; ! 254: -{ ! 255: - register char *p; ! 256: - register char *endpt; ! 257: - register char *s; ! 258: - register int j; ! 259: - int len, patlen = strlen(bmpat); ! 260: - char *rdpt; ! 261: - int fd, eof, n; ! 262: - long seek; ! 263: - char *nlp, *proc, *np, *op; ! 264: - char buf[8*8192]; ! 265: - ! 266: - if(file){ ! 267: - if((fd = open(file, 0)) < 0){ ! 268: - fprint(2, "%s: can't open %s\n", progname, file); ! 269: - badbotch=1; ! 270: - return; ! 271: - } ! 272: - } else ! 273: - fd = 0; ! 274: - lnum = 1; ! 275: - tln = 0; ! 276: - rdpt = buf; ! 277: - seek = 0; ! 278: - for(eof = 0; eof == 0;){ ! 279: - Fflush(1); ! 280: - if((n = read(fd, rdpt, &buf[sizeof buf]-rdpt)) <= 0){ ! 281: - if(rdpt == buf) ! 282: - break; /* eof, nothing left to process */ ! 283: - *rdpt = '\n'; /* terminate */ ! 284: - endpt = rdpt+1; ! 285: - eof = 1; ! 286: - } else { ! 287: - for(p = &rdpt[n]; p >= rdpt;) ! 288: - if(*--p == '\n') ! 289: - break; ! 290: - if(p < rdpt){ /* line bigger than buf!! */ ! 291: - rdpt = &buf[sizeof buf/2]; /* chop in half */ ! 292: - continue; /* reading */ ! 293: - } ! 294: - endpt = p+1; ! 295: - } ! 296: - /* ! 297: - invariants: ! 298: - no newline between buf and rdpt[-1] ! 299: - lnum = nlines before buf ! 300: - seek = char offset of buf[0] ! 301: - last char read is rdpt[n-1] ! 302: - first char after last \n is endpt ! 303: - ! 304: - following is exited to three places: ! 305: - succeed: match ! 306: - refresh: !match (readjust ptrs and loop) ! 307: - ! 308: - */ ! 309: - p = buf+patlen-1; ! 310: - proc = buf-1; ! 311: - scan: ! 312: - for(;;){ ! 313: - while((p += delta0[*(unsigned char *)p]) < endpt) ! 314: - ; ! 315: - if(p < (buf+LARGE)){ /* no match */ ! 316: - goto refresh; ! 317: - } ! 318: - p -= LARGE; ! 319: - for(j = patlen-2, s = p-1; j >= 0; j--) ! 320: - if(cmap[*s--] != bmpat[j]) ! 321: - break; ! 322: - if(j < 0) /* match!! */ ! 323: - goto succeed; ! 324: - fail: ! 325: - p++; ! 326: - } ! 327: - succeed: ! 328: - if(bmegrep || !cflag || !sflag){ /* lflag doesn't matter */ ! 329: - nlp = memchr(p, '\n', (endpt+1)-p); ! 330: - op = p; ! 331: - p -= patlen-1; ! 332: - while(*p != '\n') ! 333: - if(--p < buf) break; ! 334: - p++; ! 335: - if(bmegrep) ! 336: - if(legrep(p) == 0){ ! 337: - p = op; ! 338: - goto fail; ! 339: - } ! 340: - } ! 341: - nsucc = 1; ! 342: - if (cflag){ ! 343: - tln++; ! 344: - p = nlp+1; ! 345: - goto scan; ! 346: - } else if(sflag){ ! 347: - if(scanexit) exit(0); ! 348: - } else if(lflag){ ! 349: - Fprint(1, "%s\n", file); ! 350: - close(fd); ! 351: - return; ! 352: - } else { ! 353: - if (nfile > 1 && hflag) ! 354: - Fprint(1, "%s:", file); ! 355: - if (bflag) ! 356: - Fprint(1, "%ld:", (seek+(p-buf))/BLKSIZE); ! 357: - if (nflag){ ! 358: - while(np = memchr(proc+1, '\n', p-proc)){ ! 359: - lnum++; ! 360: - proc = np; ! 361: - } ! 362: - Fprint(1, "%ld:", lnum); ! 363: - } ! 364: - Fwrite(1, p, nlp-p+1); ! 365: - p = nlp+1; ! 366: - if(p < endpt) ! 367: - goto scan; ! 368: - } ! 369: - refresh: ! 370: - if(nflag){ /* count newlines that we haven't proc */ ! 371: - while(proc = memchr(proc+1, '\n', endpt-proc)) ! 372: - lnum++; ! 373: - } ! 374: - memcpy(buf, endpt, j = &rdpt[n]-endpt); ! 375: - rdpt = &buf[j]; ! 376: - seek += n; ! 377: - } ! 378: -done: close(fd); ! 379: - if (cflag) { ! 380: - if (nfile > 1) ! 381: - Fprint(1, "%s:", file); ! 382: - Fprint(1, "%ld\n", tln); ! 383: - } ! 384: -} ! 385: - ! 386: -/* ! 387: - isn't egrep pretty when it just has to mtach or not? ! 388: -*/ ! 389: - ! 390: -legrep(p) ! 391: - register char *p; ! 392: -{ ! 393: - register State *cstat, *t; ! 394: - ! 395: - if(reinit == 1) ! 396: - clearg(); ! 397: - cstat = istat; ! 398: - if(cstat->out) ! 399: - return(1); ! 400: - for(;;){ ! 401: - if((t = cstat->gotofn[*(unsigned char *)p]) == 0) ! 402: - cstat = nxtst(cstat, *(unsigned char *)p); ! 403: - else ! 404: - cstat = t; ! 405: - if(cstat->out){ ! 406: - return(1); ! 407: - } ! 408: - if(*p++ == RIGHT){ ! 409: - return(0); ! 410: - } ! 411: - } ! 412: -} ! 413: //GO.SYSIN DD bm.c ! 414: echo egrep.c 1>&2 ! 415: sed 's/.//' >egrep.c <<'//GO.SYSIN DD egrep.c' ! 416: -#include "hdr.h" ! 417: -#include "y.tab.h" ! 418: - ! 419: -cgotofn() { ! 420: - register i; ! 421: - count = cntpos = 0; ! 422: - nxtpos = 0; ! 423: - nxtfoll = MAXPOS-1; ! 424: - begout = 0; ! 425: - for (i=1; i<=line; i++) colpos[i] = 0; ! 426: - if (first(line-1)==0) { ! 427: - colpos[line] = 1; ! 428: - cntpos++; ! 429: - begout = 1; ! 430: - } ! 431: - for (i=1; i<=line; i++) tmpstat[i] = begstat[i] = colpos[i]; ! 432: - count = begcnt = cntpos-1; /* leave out position 1 */ ! 433: - tmpstat[1] = begstat[1] = 0; ! 434: - addstate(1); ! 435: - inxtpos = nxtpos; ! 436: - istat = nxtst(states+1,LEFT); ! 437: -} ! 438: - ! 439: -State * ! 440: -nxtst(ss,c) ! 441: -State *ss; ! 442: -char c; ! 443: -{ ! 444: - register i, num, k; ! 445: - int pos, curpos, number, newpos; ! 446: - int s = ss-states; ! 447: - num = positions[state[s]]; ! 448: - count = begcnt; ! 449: - for (i=3; i<=line; i++) tmpstat[i] = begstat[i]; ! 450: - pos = state[s] + 1; ! 451: - for (i=0; i<num; i++) { ! 452: - curpos = positions[pos]; ! 453: - if ((k = name[curpos]) >= 0) { ! 454: - if ( ! 455: - (k == c) ! 456: - | (k == DOT && c != LEFT && c != RIGHT) ! 457: - | (k == CCL && member(c, right[curpos], 1)) ! 458: - | (k == NCCL && member(c, right[curpos], 0) && c != LEFT && c != RIGHT) ! 459: - ) { ! 460: - if (foll[curpos] == 0) { ! 461: - cntpos = 0; ! 462: - for (k=1; k<=line; k++) colpos[k] = 0; ! 463: - follow(curpos); ! 464: - addfoll(curpos); ! 465: - } ! 466: - number = positions[foll[curpos]]; ! 467: - newpos = foll[curpos] - 1; ! 468: - for (k=0; k<number; k++) { ! 469: - if (tmpstat[positions[newpos]] != 1) { ! 470: - tmpstat[positions[newpos]] = 1; ! 471: - count++; ! 472: - } ! 473: - newpos--; ! 474: - } ! 475: - } ! 476: - } ! 477: - pos++; ! 478: - } ! 479: - if (notin(nstate)) { ! 480: - if (++nstate >= NSTATES) { ! 481: - nxtpos = inxtpos; ! 482: - reinit = 1; ! 483: - nstate = 1; ! 484: - addstate(1); ! 485: - return states+1; ! 486: - } ! 487: - addstate(nstate); ! 488: - return(states[s].gotofn[c] = states+nstate); ! 489: - } ! 490: - else { ! 491: - return(states[s].gotofn[c] = states+xstate); ! 492: - } ! 493: -} ! 494: - ! 495: -first(v) { ! 496: - register b; ! 497: - if (left[v] == 0) { ! 498: - if (colpos[v] != 1) { ! 499: - colpos[v] = 1; ! 500: - cntpos++; ! 501: - } ! 502: - return(1); ! 503: - } ! 504: - else if (right[v] == 0) { ! 505: - if (first(left[v]) == 0) return (0); ! 506: - else if (name[v] == PLUS) return (1); ! 507: - else return (0); ! 508: - } ! 509: - else if (name[v] == CAT) { ! 510: - if (first(left[v]) == 0 && first(right[v]) == 0) return (0); ! 511: - else return (1); ! 512: - } ! 513: - else { /* name[v] == OR */ ! 514: - b = first(right[v]); ! 515: - if (first(left[v]) == 0 || b == 0) return (0); ! 516: - else return (1); ! 517: - } ! 518: -} ! 519: - ! 520: -member(symb, set, torf) { ! 521: - register i, num, pos; ! 522: - num = chars[set]; ! 523: - pos = set + 1; ! 524: - for (i=0; i<num; i++) ! 525: - if (symb == chars[pos++]) return (torf); ! 526: - return (!torf); ! 527: -} ! 528: - ! 529: -notin(n) { ! 530: - register i, j, pos; ! 531: - for (i=1; i<=n; i++) { ! 532: - if (positions[state[i]] == count) { ! 533: - pos = state[i] + 1; ! 534: - for (j=0; j < count; j++) { ! 535: - if (tmpstat[positions[pos++]] != 1) goto nxt; } ! 536: - xstate = i; ! 537: - return (0); ! 538: - } ! 539: - nxt: ; ! 540: - } ! 541: - return (1); ! 542: -} ! 543: - ! 544: -addstate(n) { ! 545: - register i; ! 546: - if (nxtpos + count >= nxtfoll) { ! 547: - overflo(); } ! 548: - for (i=0; i<NCHARS; i++) ! 549: - states[n].gotofn[i] = 0; ! 550: - state[n] = nxtpos; ! 551: - positions[nxtpos++] = count; ! 552: - for (i=3; i <= line; i++) { ! 553: - if (tmpstat[i] == 1) { ! 554: - positions[nxtpos++] = i; ! 555: - } ! 556: - } ! 557: - if (tmpstat[line] == 1) ! 558: - states[n].out = 1; ! 559: - else ! 560: - states[n].out = 0; ! 561: -} ! 562: - ! 563: -addfoll(n) { ! 564: - register i; ! 565: - if (nxtfoll - cntpos <= nxtpos) { ! 566: - overflo(); } ! 567: - foll[n] = nxtfoll; ! 568: - positions[nxtfoll--] = cntpos; ! 569: - for (i=3; i <= line; i++) { ! 570: - if (colpos[i] == 1) { ! 571: - positions[nxtfoll--] = i; ! 572: - } ! 573: - } ! 574: -} ! 575: - ! 576: -follow(v) int v; { ! 577: - int p; ! 578: - if (v == line) return; ! 579: - p = parent[v]; ! 580: - switch(name[p]) { ! 581: - case STAR: ! 582: - case PLUS: first(v); ! 583: - follow(p); ! 584: - return; ! 585: - ! 586: - case OR: ! 587: - case QUEST: follow(p); ! 588: - return; ! 589: - ! 590: - case CAT: if (v == left[p]) { ! 591: - if (first(right[p]) == 0) { ! 592: - follow(p); ! 593: - return; ! 594: - } ! 595: - } ! 596: - else follow(p); ! 597: - return; ! 598: - case FINAL: if (colpos[line] != 1) { ! 599: - colpos[line] = 1; ! 600: - cntpos++; ! 601: - } ! 602: - return; ! 603: - } ! 604: -} ! 605: - ! 606: -clearg() { ! 607: - register i; ! 608: - reinit = 0; ! 609: - states[1].out = begout; ! 610: - for (i=0; i<NCHARS; i++) ! 611: - states[1].gotofn[i] = 0; ! 612: - nstate = 1; ! 613: - state[1] = 0; ! 614: - istat = nxtst(states+1,LEFT); ! 615: -} ! 616: - ! 617: -execute(file) ! 618: -char *file; ! 619: -{ ! 620: - register char *p; ! 621: - register State *cstat, *t; ! 622: - int len; ! 623: - char *nlp; ! 624: - int f; ! 625: - ! 626: -#define READLINE if((p = nlp = Frdline(f)) == 0)\ ! 627: - goto done;\ ! 628: - else /* Frdline nulls the \n, put it back */\ ! 629: - len = FIOLINELEN(f), nlp[len++] = RIGHT ! 630: - ! 631: - if (file) { ! 632: - if ((f = open(file, 0)) < 0) { ! 633: - fprint(2, "%s: can't open %s\n", progname, file); ! 634: - badbotch=1; ! 635: - return; ! 636: - } ! 637: - } ! 638: - else f = 0; ! 639: - Finit(f, (char *)0); ! 640: - Ftie(f, 1); /* link input f with stdout */ ! 641: - lnum = 1; ! 642: - tln = 0; ! 643: - READLINE; ! 644: - cstat = istat; ! 645: - if (cstat->out) goto found; ! 646: - for (;;) { ! 647: - if ((t = cstat->gotofn[*p]) == 0) ! 648: - cstat = nxtst(cstat, *p); ! 649: - else ! 650: - cstat = t; ! 651: - if (cstat->out) { ! 652: - found: ! 653: - if (vflag == 0) { ! 654: - succeed: nsucc = 1; ! 655: - if (cflag) tln++; ! 656: - else if (sflag){ ! 657: - if(scanexit) exit(0); ! 658: - } else if (lflag) { ! 659: - Fprint(1, "%s\n", file); ! 660: - close(f); ! 661: - return; ! 662: - } ! 663: - else { ! 664: - if (nfile > 1 && hflag) ! 665: - Fprint(1, "%s:", file); ! 666: - if (bflag) ! 667: - Fprint(1, "%ld:", (FIOSEEK(f)-len)/BLKSIZE); ! 668: - if (nflag) ! 669: - Fprint(1, "%ld:", lnum); ! 670: - Fwrite(1, nlp, len); ! 671: - } ! 672: - } ! 673: - lnum++; ! 674: - READLINE; ! 675: - if (reinit == 1) clearg(); ! 676: - if ((cstat = istat)->out) ! 677: - goto found; /* we are a match already */ ! 678: - else ! 679: - continue; /* normal pattern matching loop */ ! 680: - } ! 681: - if (*p++ == RIGHT) { ! 682: - if (vflag) goto succeed; ! 683: - else { ! 684: - lnum++; ! 685: - READLINE; ! 686: - if (reinit == 1) clearg(); ! 687: - if ((cstat = istat)->out) ! 688: - goto found; /* we are a match already */ ! 689: - } ! 690: - } ! 691: - } ! 692: -done: close(f); ! 693: - if (cflag) { ! 694: - if (nfile > 1) ! 695: - Fprint(1, "%s:", file); ! 696: - Fprint(1, "%ld\n", tln); ! 697: - } ! 698: -} ! 699: //GO.SYSIN DD egrep.c ! 700: echo main.c 1>&2 ! 701: sed 's/.//' >main.c <<'//GO.SYSIN DD main.c' ! 702: -#include "hdr.h" ! 703: - ! 704: -State states[NSTATES]; ! 705: -State *nxtst(); ! 706: -int state[NSTATES]; ! 707: -int line = 1; ! 708: -int name[MAXLIN]; ! 709: -int left[MAXLIN]; ! 710: -int right[MAXLIN]; ! 711: -int parent[MAXLIN]; ! 712: -int foll[MAXLIN]; ! 713: -int positions[MAXPOS]; ! 714: -char chars[MAXLIN]; ! 715: -int nxtpos = 0; ! 716: -int inxtpos; ! 717: -int nxtchar = 0; ! 718: -int tmpstat[MAXLIN]; ! 719: -int begstat[MAXLIN]; ! 720: -int colpos[MAXLIN]; ! 721: -State *istat; ! 722: -int nstate = 1; ! 723: -int xstate; ! 724: -int count; ! 725: -int icount; ! 726: -char *input; ! 727: -char *progname; ! 728: -int begout; ! 729: -int begcnt; ! 730: -int cntpos; ! 731: -int nxtfoll; ! 732: - ! 733: -char reinit = 0; ! 734: - ! 735: -long lnum; ! 736: -int bflag; ! 737: -int cflag; ! 738: -int fflag; ! 739: -int hflag = 1; ! 740: -int iflag; ! 741: -int lflag; ! 742: -int nflag; ! 743: -int sflag; ! 744: -int vflag; ! 745: -int nfile; ! 746: -long tln; ! 747: -int nsucc; ! 748: -int badbotch; ! 749: - ! 750: -int expfile; ! 751: -int bmegrep = 0; ! 752: -int scanexit = 0; ! 753: - ! 754: -extern char *optarg; ! 755: -extern int optind, getopt(); ! 756: - ! 757: -usage() ! 758: -{ ! 759: - fprint(2, "usage: %s [ -bchilnsv ] [ -e pattern ] [ -f file ] [ pattern ] [ file ] ...\n", progname); ! 760: - exit(2); ! 761: -} ! 762: - ! 763: -main(argc, argv) ! 764: -char **argv; ! 765: -{ ! 766: - register c; ! 767: - int errflg = 0; ! 768: - int (*fn)(), execute(), bmexecute(); ! 769: - int etext(); ! 770: - char *ffile; ! 771: - char buf[2048]; ! 772: - ! 773: - if(progname = strrchr(argv[0], '/')) ! 774: - progname++; ! 775: - else ! 776: - progname = argv[0]; ! 777: - ! 778: -#ifdef forfutureuse ! 779: - switch (progname[0]) { ! 780: - case 'f': fgrep++; break; ! 781: - case 'e': egrep++; break; ! 782: - case 'g': grep++; break; ! 783: - } ! 784: -#endif ! 785: - ! 786: - while(( c = getopt(argc, argv, "bchie:f:lnsv?")) != -1) ! 787: - switch(c) { ! 788: - ! 789: - case 'b': ! 790: - bflag++; ! 791: - continue; ! 792: - ! 793: - case 'c': ! 794: - cflag++; ! 795: - continue; ! 796: - ! 797: - case 'e': ! 798: - input = optarg; ! 799: - continue; ! 800: - ! 801: - case 'f': ! 802: - fflag++; ! 803: - ffile = optarg; ! 804: - continue; ! 805: - ! 806: - case 'h': ! 807: - hflag = 0; ! 808: - continue; ! 809: - ! 810: - case 'i': ! 811: - iflag++; ! 812: - continue; ! 813: - ! 814: - case 'l': ! 815: - lflag++; ! 816: - continue; ! 817: - ! 818: - case 'n': ! 819: - nflag++; ! 820: - continue; ! 821: - ! 822: - case 's': ! 823: - sflag++; ! 824: - continue; ! 825: - ! 826: - case 'v': ! 827: - vflag++; ! 828: - continue; ! 829: - ! 830: - case '?': ! 831: - errflg++; ! 832: - continue; ! 833: - } ! 834: - ! 835: - if (errflg) ! 836: - usage(); ! 837: - ! 838: - argc -= optind; ! 839: - argv += optind; ! 840: - if (fflag) { ! 841: - if ((expfile = open(ffile, 0)) < 0) { ! 842: - fprint(2, "%s: can't open %s\n", progname, ffile); ! 843: - exit(2); ! 844: - } ! 845: - } else if (input == 0) { ! 846: - if ((input = *argv++) == 0) ! 847: - usage(); ! 848: - argc--; ! 849: - } ! 850: - Finit(1, (char *)0); ! 851: - ! 852: -#ifdef MAILPREP ! 853: - mailprep(); ! 854: -#endif /* MAILPREP */ ! 855: - ! 856: - yyparse(); ! 857: - ! 858: -#ifdef MAILPREP ! 859: - maildone(); ! 860: -#endif /* MAILPREP */ ! 861: - ! 862: - if(!vflag && islit(buf)){ ! 863: - bmprep(buf); ! 864: - fn = bmexecute; ! 865: - } else ! 866: - fn = execute; ! 867: - ! 868: - cgotofn(); ! 869: - nfile = argc; ! 870: - if (argc<=0) { ! 871: - if (lflag) exit(1); ! 872: - scanexit = 1; ! 873: - (*fn)((char *)0); ! 874: - } ! 875: - else while (--argc >= 0) { ! 876: - if (reinit == 1) clearg(); ! 877: - scanexit = argc == 0; ! 878: - (*fn)(*argv++); ! 879: - } ! 880: - exit(badbotch ? 2 : nsucc==0); ! 881: -} ! 882: //GO.SYSIN DD main.c ! 883: echo y.tab.c 1>&2 ! 884: sed 's/.//' >y.tab.c <<'//GO.SYSIN DD y.tab.c' ! 885: -# define CHAR 257 ! 886: -# define DOT 258 ! 887: -# define CCL 259 ! 888: -# define NCCL 260 ! 889: -# define OR 261 ! 890: -# define CAT 262 ! 891: -# define STAR 263 ! 892: -# define PLUS 264 ! 893: -# define QUEST 265 ! 894: - ! 895: -# line 16 "gram.y" ! 896: -#include "hdr.h" ! 897: -#define yyclearin yychar = -1 ! 898: -#define yyerrok yyerrflag = 0 ! 899: -extern int yychar; ! 900: -extern short yyerrflag; ! 901: -#ifndef YYMAXDEPTH ! 902: -#define YYMAXDEPTH 150 ! 903: -#endif ! 904: -#ifndef YYSTYPE ! 905: -#define YYSTYPE int ! 906: -#endif ! 907: -YYSTYPE yylval, yyval; ! 908: -# define YYERRCODE 256 ! 909: - ! 910: -# line 63 "gram.y" ! 911: - ! 912: -yyerror(s) { ! 913: - fprint(2, "egrep: %s\n", s); ! 914: - exit(2); ! 915: -} ! 916: - ! 917: -yylex() { ! 918: - extern int yylval; ! 919: - int cclcnt, x; ! 920: - register char c, d; ! 921: - switch(c = nextch()) { ! 922: - case '^': c = LEFT; ! 923: - goto defchar; ! 924: - case '$': c = RIGHT; ! 925: - goto defchar; ! 926: - case '|': return (OR); ! 927: - case '*': return (STAR); ! 928: - case '+': return (PLUS); ! 929: - case '?': return (QUEST); ! 930: - case '(': return (c); ! 931: - case ')': return (c); ! 932: - case '.': return (DOT); ! 933: - case '\0': return (0); ! 934: - case RIGHT: return (OR); ! 935: - case '[': ! 936: - x = CCL; ! 937: - cclcnt = 0; ! 938: - count = nxtchar++; ! 939: - if ((c = nextch()) == '^') { ! 940: - x = NCCL; ! 941: - c = nextch(); ! 942: - } ! 943: - do { ! 944: - if (c == '\0') synerror(); ! 945: - if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) { ! 946: - if ((d = nextch()) != 0) { ! 947: - c = chars[nxtchar-1]; ! 948: - while (c < d) { ! 949: - if (iflag && isalpha(c)) { ! 950: - if (nxtchar >= MAXLIN-1) overflo(); ! 951: - chars[nxtchar++] = isupper(++c)?tolower(c):toupper(c); ! 952: - chars[nxtchar++] = c; ! 953: - cclcnt += 2; ! 954: - } ! 955: - else { ! 956: - if (nxtchar >= MAXLIN) overflo(); ! 957: - chars[nxtchar++] = ++c; ! 958: - cclcnt++; ! 959: - } ! 960: - } ! 961: - continue; ! 962: - } ! 963: - } ! 964: - if (iflag&&isalpha(c)) { ! 965: - if (nxtchar >= MAXLIN-1) overflo(); ! 966: - chars[nxtchar++] = isupper(c)?tolower(c):toupper(c); ! 967: - chars[nxtchar++] = c; ! 968: - cclcnt += 2; ! 969: - } ! 970: - else { ! 971: - if (nxtchar >= MAXLIN) overflo(); ! 972: - chars[nxtchar++] = c; ! 973: - cclcnt++; ! 974: - } ! 975: - } while ((c = nextch()) != ']'); ! 976: - chars[count] = cclcnt; ! 977: - return (x); ! 978: - case '\\': ! 979: - if ((c = nextch()) == '\0') synerror(); ! 980: - else if (c == '\n') c = nextch(); ! 981: - defchar: ! 982: - default: yylval = c; return (CHAR); ! 983: - } ! 984: -} ! 985: - ! 986: -static int mailfd = -1; ! 987: - ! 988: -nextch() { ! 989: - register c; ! 990: - if (fflag) { ! 991: - if ((c = Fgetc(expfile)) < 0) ! 992: - c = 0; ! 993: - } ! 994: - else c = *input++; ! 995: -if(mailfd >= 0) Fputc(mailfd, c? c : '\n'); ! 996: - return(c); ! 997: -} ! 998: - ! 999: -synerror() { ! 1000: - fprint(2, "egrep: syntax error\n"); ! 1001: - exit(2); ! 1002: -} ! 1003: - ! 1004: -enter(x) int x; { ! 1005: - if(line >= MAXLIN) overflo(); ! 1006: - name[line] = x; ! 1007: - left[line] = 0; ! 1008: - right[line] = 0; ! 1009: - return(line++); ! 1010: -} ! 1011: - ! 1012: -cclenter(x) int x; { ! 1013: - register linno; ! 1014: - linno = enter(x); ! 1015: - right[linno] = count; ! 1016: - return (linno); ! 1017: -} ! 1018: - ! 1019: -node(x, l, r) { ! 1020: - if(line >= MAXLIN) overflo(); ! 1021: - name[line] = x; ! 1022: - left[line] = l; ! 1023: - right[line] = r; ! 1024: - parent[l] = line; ! 1025: - parent[r] = line; ! 1026: - return(line++); ! 1027: -} ! 1028: - ! 1029: -unary(x, d) { ! 1030: - if(line >= MAXLIN) overflo(); ! 1031: - name[line] = x; ! 1032: - left[line] = d; ! 1033: - right[line] = 0; ! 1034: - parent[d] = line; ! 1035: - return(line++); ! 1036: -} ! 1037: -overflo() { ! 1038: - fprint(2, "egrep: regular expression too long\n"); ! 1039: - exit(2); ! 1040: -} ! 1041: -#include <errno.h> ! 1042: -#define NAME "/tmp/grepdata" ! 1043: -mailprep() ! 1044: -{ ! 1045: - umask(0); ! 1046: - mailfd = open(NAME, 1); ! 1047: - if((mailfd < 0) && (errno != ECONC)) ! 1048: - mailfd = creat(NAME, 03666); ! 1049: - if(mailfd >= 0){ ! 1050: - Finit(mailfd, (char *)0); ! 1051: - Fseek(mailfd, 0L, 2); ! 1052: - Fprint(mailfd, "\321egrep: "); ! 1053: - } ! 1054: -} ! 1055: - ! 1056: -maildone() ! 1057: -{ ! 1058: - if(mailfd >= 0){ ! 1059: - Fflush(mailfd); ! 1060: - close(mailfd); ! 1061: - } ! 1062: -} ! 1063: -short yyexca[] ={ ! 1064: --1, 1, ! 1065: - 0, -1, ! 1066: - -2, 0, ! 1067: --1, 5, ! 1068: - 0, 2, ! 1069: - -2, 0, ! 1070: --1, 13, ! 1071: - 0, 5, ! 1072: - -2, 0, ! 1073: --1, 14, ! 1074: - 0, 12, ! 1075: - 257, 12, ! 1076: - 258, 12, ! 1077: - 259, 12, ! 1078: - 260, 12, ! 1079: - 261, 12, ! 1080: - 40, 12, ! 1081: - 41, 12, ! 1082: - -2, 0, ! 1083: --1, 19, ! 1084: - 0, 4, ! 1085: - -2, 0, ! 1086: --1, 20, ! 1087: - 0, 11, ! 1088: - 261, 11, ! 1089: - 41, 11, ! 1090: - -2, 0, ! 1091: --1, 23, ! 1092: - 0, 3, ! 1093: - -2, 0, ! 1094: - }; ! 1095: -# define YYNPROD 18 ! 1096: -# define YYLAST 261 ! 1097: -short yyact[]={ ! 1098: - ! 1099: - 10, 22, 4, 14, 11, 2, 1, 5, 0, 0, ! 1100: - 10, 15, 16, 17, 18, 0, 19, 20, 3, 0, ! 1101: - 10, 0, 0, 12, 0, 20, 0, 20, 0, 0, ! 1102: - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1103: - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1104: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1105: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1106: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1107: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1108: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1109: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1110: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1111: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1112: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1113: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1114: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1115: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1116: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1117: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1118: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1119: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 1120: - 0, 0, 0, 0, 0, 0, 11, 6, 7, 8, ! 1121: - 9, 21, 0, 15, 16, 17, 11, 6, 7, 8, ! 1122: - 9, 23, 0, 15, 16, 17, 11, 6, 7, 8, ! 1123: - 9, 13, 0, 15, 16, 17, 11, 6, 7, 8, ! 1124: - 9, 0, 0, 15, 16, 17, 11, 6, 7, 8, ! 1125: - 9 }; ! 1126: -short yypact[]={ ! 1127: - ! 1128: --259,-1000,-1000, 0,-1000, -20,-1000,-1000,-1000,-1000, ! 1129: - 0,-1000, 0, 0,-252,-1000,-1000,-1000, -40, -30, ! 1130: - -10, 0,-1000, 0 }; ! 1131: -short yypgo[]={ ! 1132: - ! 1133: - 0, 6, 5, 18, 3 }; ! 1134: -short yyr1[]={ ! 1135: - ! 1136: - 0, 1, 2, 2, 2, 2, 3, 4, 4, 4, ! 1137: - 4, 4, 4, 4, 4, 4, 4, 4 }; ! 1138: -short yyr2[]={ ! 1139: - ! 1140: - 0, 1, 2, 4, 3, 3, 0, 1, 1, 1, ! 1141: - 1, 3, 2, 2, 2, 2, 3, 1 }; ! 1142: -short yychk[]={ ! 1143: - ! 1144: --1000, -1, -2, -3, 261, -4, 257, 258, 259, 260, ! 1145: - 40, 256, -3, 261, -4, 263, 264, 265, -4, -4, ! 1146: - -4, 261, 41, 261 }; ! 1147: -short yydef[]={ ! 1148: - ! 1149: - 6, -2, 1, 0, 6, -2, 7, 8, 9, 10, ! 1150: - 0, 17, 0, -2, -2, 13, 14, 15, 0, -2, ! 1151: - -2, 0, 16, -2 }; ! 1152: -# ifdef YYDEBUG ! 1153: -# include "y.debug" ! 1154: -# endif ! 1155: - ! 1156: -# define YYFLAG -1000 ! 1157: -# define YYERROR goto yyerrlab ! 1158: -# define YYACCEPT return(0) ! 1159: -# define YYABORT return(1) ! 1160: - ! 1161: -/* parser for yacc output */ ! 1162: - ! 1163: -#ifdef YYDEBUG ! 1164: -int yydebug = 0; /* 1 for debugging */ ! 1165: -#endif ! 1166: -YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */ ! 1167: -int yychar = -1; /* current input token number */ ! 1168: -int yynerrs = 0; /* number of errors */ ! 1169: -short yyerrflag = 0; /* error recovery flag */ ! 1170: - ! 1171: -yyparse() ! 1172: -{ short yys[YYMAXDEPTH]; ! 1173: - int yyj, yym; ! 1174: - register YYSTYPE *yypvt; ! 1175: - register int yystate, yyn; ! 1176: - register short *yyps; ! 1177: - register YYSTYPE *yypv; ! 1178: - register short *yyxi; ! 1179: - ! 1180: - yystate = 0; ! 1181: - yychar = -1; ! 1182: - yynerrs = 0; ! 1183: - yyerrflag = 0; ! 1184: - yyps= &yys[-1]; ! 1185: - yypv= &yyv[-1]; ! 1186: - ! 1187: -yystack: /* put a state and value onto the stack */ ! 1188: -#ifdef YYDEBUG ! 1189: - if(yydebug >= 3) ! 1190: - if(yychar < 0 || yytoknames[yychar] == 0) ! 1191: - printf("char %d in %s", yychar, yystates[yystate]); ! 1192: - else ! 1193: - printf("%s in %s", yytoknames[yychar], yystates[yystate]); ! 1194: -#endif ! 1195: - if( ++yyps >= &yys[YYMAXDEPTH] ) { ! 1196: - yyerror( "yacc stack overflow" ); ! 1197: - return(1); ! 1198: - } ! 1199: - *yyps = yystate; ! 1200: - ++yypv; ! 1201: - *yypv = yyval; ! 1202: -yynewstate: ! 1203: - yyn = yypact[yystate]; ! 1204: - if(yyn <= YYFLAG) goto yydefault; /* simple state */ ! 1205: - if(yychar<0) { ! 1206: - yychar = yylex(); ! 1207: -#ifdef YYDEBUG ! 1208: - if(yydebug >= 2) { ! 1209: - if(yychar <= 0) ! 1210: - printf("lex EOF\n"); ! 1211: - else if(yytoknames[yychar]) ! 1212: - printf("lex %s\n", yytoknames[yychar]); ! 1213: - else ! 1214: - printf("lex (%c)\n", yychar); ! 1215: - } ! 1216: -#endif ! 1217: - if(yychar < 0) ! 1218: - yychar = 0; ! 1219: - } ! 1220: - if((yyn += yychar) < 0 || yyn >= YYLAST) ! 1221: - goto yydefault; ! 1222: - if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */ ! 1223: - yychar = -1; ! 1224: - yyval = yylval; ! 1225: - yystate = yyn; ! 1226: - if( yyerrflag > 0 ) --yyerrflag; ! 1227: - goto yystack; ! 1228: - } ! 1229: -yydefault: ! 1230: - /* default state action */ ! 1231: - if( (yyn=yydef[yystate]) == -2 ) { ! 1232: - if(yychar < 0) { ! 1233: - yychar = yylex(); ! 1234: -#ifdef YYDEBUG ! 1235: - if(yydebug >= 2) ! 1236: - if(yychar < 0) ! 1237: - printf("lex EOF\n"); ! 1238: - else ! 1239: - printf("lex %s\n", yytoknames[yychar]); ! 1240: -#endif ! 1241: - if(yychar < 0) ! 1242: - yychar = 0; ! 1243: - } ! 1244: - /* look through exception table */ ! 1245: - for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate); ! 1246: - yyxi += 2 ) ; /* VOID */ ! 1247: - while( *(yyxi+=2) >= 0 ){ ! 1248: - if( *yyxi == yychar ) break; ! 1249: - } ! 1250: - if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */ ! 1251: - } ! 1252: - if( yyn == 0 ){ /* error */ ! 1253: - /* error ... attempt to resume parsing */ ! 1254: - switch( yyerrflag ){ ! 1255: - case 0: /* brand new error */ ! 1256: -#ifdef YYDEBUG ! 1257: - yyerror("syntax error\n%s", yystates[yystate]); ! 1258: - if(yytoknames[yychar]) ! 1259: - yyerror("saw %s\n", yytoknames[yychar]); ! 1260: - else if(yychar >= ' ' && yychar < '\177') ! 1261: - yyerror("saw `%c'\n", yychar); ! 1262: - else if(yychar == 0) ! 1263: - yyerror("saw EOF\n"); ! 1264: - else ! 1265: - yyerror("saw char 0%o\n", yychar); ! 1266: -#else ! 1267: - yyerror( "syntax error" ); ! 1268: -#endif ! 1269: -yyerrlab: ! 1270: - ++yynerrs; ! 1271: - case 1: ! 1272: - case 2: /* incompletely recovered error ... try again */ ! 1273: - yyerrflag = 3; ! 1274: - /* find a state where "error" is a legal shift action */ ! 1275: - while ( yyps >= yys ) { ! 1276: - yyn = yypact[*yyps] + YYERRCODE; ! 1277: - if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){ ! 1278: - yystate = yyact[yyn]; /* simulate a shift of "error" */ ! 1279: - goto yystack; ! 1280: - } ! 1281: - yyn = yypact[*yyps]; ! 1282: - /* the current yyps has no shift onn "error", pop stack */ ! 1283: -#ifdef YYDEBUG ! 1284: - if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] ); ! 1285: -#endif ! 1286: - --yyps; ! 1287: - --yypv; ! 1288: - } ! 1289: - /* there is no state on the stack with an error shift ... abort */ ! 1290: -yyabort: ! 1291: - return(1); ! 1292: - case 3: /* no shift yet; clobber input char */ ! 1293: -#ifdef YYDEBUG ! 1294: - if( yydebug ) { ! 1295: - printf("error recovery discards "); ! 1296: - if(yytoknames[yychar]) ! 1297: - printf("%s\n", yytoknames[yychar]); ! 1298: - else if(yychar >= ' ' && yychar < '\177') ! 1299: - printf("`%c'\n", yychar); ! 1300: - else if(yychar == 0) ! 1301: - printf("EOF\n"); ! 1302: - else ! 1303: - printf("char 0%o\n", yychar); ! 1304: - } ! 1305: -#endif ! 1306: - if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */ ! 1307: - yychar = -1; ! 1308: - goto yynewstate; /* try again in the same state */ ! 1309: - } ! 1310: - } ! 1311: - /* reduction by production yyn */ ! 1312: -#ifdef YYDEBUG ! 1313: - if(yydebug) { char *s; ! 1314: - printf("reduce %d in:\n\t", yyn); ! 1315: - for(s = yystates[yystate]; *s; s++) { ! 1316: - putchar(*s); ! 1317: - if(*s == '\n' && *(s+1)) ! 1318: - putchar('\t'); ! 1319: - } ! 1320: - } ! 1321: -#endif ! 1322: - yyps -= yyr2[yyn]; ! 1323: - yypvt = yypv; ! 1324: - yypv -= yyr2[yyn]; ! 1325: - yyval = yypv[1]; ! 1326: - yym=yyn; ! 1327: - /* consult goto table to find next state */ ! 1328: - yyn = yyr1[yyn]; ! 1329: - yyj = yypgo[yyn] + *yyps + 1; ! 1330: - if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]]; ! 1331: - switch(yym){ ! 1332: - ! 1333: -case 1: ! 1334: -# line 21 "gram.y" ! 1335: -{ unary(FINAL, yypvt[-0]); ! 1336: - line--; ! 1337: - } break; ! 1338: -case 2: ! 1339: -# line 26 "gram.y" ! 1340: -{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break; ! 1341: -case 3: ! 1342: -# line 28 "gram.y" ! 1343: -{ yyval = node(CAT, yypvt[-2], yypvt[-1]); } break; ! 1344: -case 4: ! 1345: -# line 30 "gram.y" ! 1346: -{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break; ! 1347: -case 5: ! 1348: -# line 32 "gram.y" ! 1349: -{ yyval = node(CAT, yypvt[-2], yypvt[-1]); } break; ! 1350: -case 6: ! 1351: -# line 35 "gram.y" ! 1352: -{ yyval = enter(DOT); ! 1353: - yyval = unary(STAR, yyval); } break; ! 1354: -case 7: ! 1355: -# line 39 "gram.y" ! 1356: -{ yyval = iflag?node(OR, enter(tolower(yypvt[-0])), enter(toupper(yypvt[-0]))):enter(yypvt[-0]); } break; ! 1357: -case 8: ! 1358: -# line 41 "gram.y" ! 1359: -{ yyval = enter(DOT); } break; ! 1360: -case 9: ! 1361: -# line 43 "gram.y" ! 1362: -{ yyval = cclenter(CCL); } break; ! 1363: -case 10: ! 1364: -# line 45 "gram.y" ! 1365: -{ yyval = cclenter(NCCL); } break; ! 1366: -case 11: ! 1367: -# line 49 "gram.y" ! 1368: -{ yyval = node(OR, yypvt[-2], yypvt[-0]); } break; ! 1369: -case 12: ! 1370: -# line 51 "gram.y" ! 1371: -{ yyval = node(CAT, yypvt[-1], yypvt[-0]); } break; ! 1372: -case 13: ! 1373: -# line 53 "gram.y" ! 1374: -{ yyval = unary(STAR, yypvt[-1]); } break; ! 1375: -case 14: ! 1376: -# line 55 "gram.y" ! 1377: -{ yyval = unary(PLUS, yypvt[-1]); } break; ! 1378: -case 15: ! 1379: -# line 57 "gram.y" ! 1380: -{ yyval = unary(QUEST, yypvt[-1]); } break; ! 1381: -case 16: ! 1382: -# line 59 "gram.y" ! 1383: -{ yyval = yypvt[-1]; } break; ! 1384: - } ! 1385: - goto yystack; /* stack new state and value */ ! 1386: -} ! 1387: //GO.SYSIN DD y.tab.c ! 1388: echo gram.y 1>&2 ! 1389: sed 's/.//' >gram.y <<'//GO.SYSIN DD gram.y' ! 1390: -/* ! 1391: - * egrep -- print lines containing (or not containing) a regular expression ! 1392: - * ! 1393: - * status returns: ! 1394: - * 0 - ok, and some matches ! 1395: - * 1 - ok, but no matches ! 1396: - * 2 - some error; matches irrelevant ! 1397: - */ ! 1398: -%token CHAR DOT CCL NCCL OR CAT STAR PLUS QUEST ! 1399: -%left OR ! 1400: -%left CHAR DOT CCL NCCL '(' ! 1401: -%left CAT ! 1402: -%left STAR PLUS QUEST ! 1403: - ! 1404: -%{ ! 1405: -#include "hdr.h" ! 1406: -%} ! 1407: - ! 1408: -%% ! 1409: -s: t ! 1410: - { unary(FINAL, $1); ! 1411: - line--; ! 1412: - } ! 1413: - ; ! 1414: -t: b r ! 1415: - { $$ = node(CAT, $1, $2); } ! 1416: - | OR b r OR ! 1417: - { $$ = node(CAT, $2, $3); } ! 1418: - | OR b r ! 1419: - { $$ = node(CAT, $2, $3); } ! 1420: - | b r OR ! 1421: - { $$ = node(CAT, $1, $2); } ! 1422: - ; ! 1423: -b: ! 1424: - { $$ = enter(DOT); ! 1425: - $$ = unary(STAR, $$); } ! 1426: - ; ! 1427: -r: CHAR ! 1428: - { $$ = iflag?node(OR, enter(tolower($1)), enter(toupper($1))):enter($1); } ! 1429: - | DOT ! 1430: - { $$ = enter(DOT); } ! 1431: - | CCL ! 1432: - { $$ = cclenter(CCL); } ! 1433: - | NCCL ! 1434: - { $$ = cclenter(NCCL); } ! 1435: - ; ! 1436: - ! 1437: -r: r OR r ! 1438: - { $$ = node(OR, $1, $3); } ! 1439: - | r r %prec CAT ! 1440: - { $$ = node(CAT, $1, $2); } ! 1441: - | r STAR ! 1442: - { $$ = unary(STAR, $1); } ! 1443: - | r PLUS ! 1444: - { $$ = unary(PLUS, $1); } ! 1445: - | r QUEST ! 1446: - { $$ = unary(QUEST, $1); } ! 1447: - | '(' r ')' ! 1448: - { $$ = $2; } ! 1449: - | error ! 1450: - ; ! 1451: - ! 1452: -%% ! 1453: -yyerror(s) { ! 1454: - fprint(2, "%s: %s\n", progname, s); ! 1455: - exit(2); ! 1456: -} ! 1457: - ! 1458: -yylex() { ! 1459: - extern int yylval; ! 1460: - int cclcnt, x; ! 1461: - register char c, d; ! 1462: - switch(c = nextch()) { ! 1463: - case '^': c = LEFT; ! 1464: - goto defchar; ! 1465: - case '$': c = RIGHT; ! 1466: - goto defchar; ! 1467: - case '|': return (OR); ! 1468: - case '*': return (STAR); ! 1469: - case '+': return (PLUS); ! 1470: - case '?': return (QUEST); ! 1471: - case '(': return (c); ! 1472: - case ')': return (c); ! 1473: - case '.': return (DOT); ! 1474: - case '\0': return (0); ! 1475: - case RIGHT: return (OR); ! 1476: - case '[': ! 1477: - x = CCL; ! 1478: - cclcnt = 0; ! 1479: - count = nxtchar++; ! 1480: - if ((c = nextch()) == '^') { ! 1481: - x = NCCL; ! 1482: - c = nextch(); ! 1483: - } ! 1484: - do { ! 1485: - if (c == '\0') synerror(); ! 1486: - if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) { ! 1487: - if ((d = nextch()) != 0) { ! 1488: - c = chars[nxtchar-1]; ! 1489: - while (c < d) { ! 1490: - if (iflag && isalpha(c)) { ! 1491: - if (nxtchar >= MAXLIN-1) overflo(); ! 1492: - chars[nxtchar++] = isupper(++c)?tolower(c):toupper(c); ! 1493: - chars[nxtchar++] = c; ! 1494: - cclcnt += 2; ! 1495: - } ! 1496: - else { ! 1497: - if (nxtchar >= MAXLIN) overflo(); ! 1498: - chars[nxtchar++] = ++c; ! 1499: - cclcnt++; ! 1500: - } ! 1501: - } ! 1502: - continue; ! 1503: - } ! 1504: - } ! 1505: - if (iflag&&isalpha(c)) { ! 1506: - if (nxtchar >= MAXLIN-1) overflo(); ! 1507: - chars[nxtchar++] = isupper(c)?tolower(c):toupper(c); ! 1508: - chars[nxtchar++] = c; ! 1509: - cclcnt += 2; ! 1510: - } ! 1511: - else { ! 1512: - if (nxtchar >= MAXLIN) overflo(); ! 1513: - chars[nxtchar++] = c; ! 1514: - cclcnt++; ! 1515: - } ! 1516: - } while ((c = nextch()) != ']'); ! 1517: - chars[count] = cclcnt; ! 1518: - return (x); ! 1519: - case '\\': ! 1520: - if ((c = nextch()) == '\0') synerror(); ! 1521: - else if (c == '\n') c = nextch(); ! 1522: - defchar: ! 1523: - default: yylval = c; return (CHAR); ! 1524: - } ! 1525: -} ! 1526: - ! 1527: -#ifdef MAILPREP ! 1528: -static int mailfd = -1; ! 1529: -#endif /* MAILPREP */ ! 1530: - ! 1531: -nextch() { ! 1532: - register c; ! 1533: - if (fflag) { ! 1534: - if ((c = Fgetc(expfile)) < 0) ! 1535: - c = 0; ! 1536: - } ! 1537: - else c = *input++; ! 1538: -#ifdef MAILPREP ! 1539: -if(mailfd >= 0) Fputc(mailfd, c? c : '\n'); ! 1540: -#endif /* MAILPREP */ ! 1541: - return(c); ! 1542: -} ! 1543: - ! 1544: -synerror() { ! 1545: - fprint(2, "%s: syntax error\n", progname); ! 1546: - exit(2); ! 1547: -} ! 1548: - ! 1549: -enter(x) int x; { ! 1550: - if(line >= MAXLIN) overflo(); ! 1551: - name[line] = x; ! 1552: - left[line] = 0; ! 1553: - right[line] = 0; ! 1554: - return(line++); ! 1555: -} ! 1556: - ! 1557: -cclenter(x) int x; { ! 1558: - register linno; ! 1559: - linno = enter(x); ! 1560: - right[linno] = count; ! 1561: - return (linno); ! 1562: -} ! 1563: - ! 1564: -node(x, l, r) { ! 1565: - if(line >= MAXLIN) overflo(); ! 1566: - name[line] = x; ! 1567: - left[line] = l; ! 1568: - right[line] = r; ! 1569: - parent[l] = line; ! 1570: - parent[r] = line; ! 1571: - return(line++); ! 1572: -} ! 1573: - ! 1574: -unary(x, d) { ! 1575: - if(line >= MAXLIN) overflo(); ! 1576: - name[line] = x; ! 1577: - left[line] = d; ! 1578: - right[line] = 0; ! 1579: - parent[d] = line; ! 1580: - return(line++); ! 1581: -} ! 1582: -overflo() { ! 1583: - fprint(2, "%s: regular expression too long\n", progname); ! 1584: - exit(2); ! 1585: -} ! 1586: - ! 1587: -#ifdef MAILPREP ! 1588: -#include <errno.h> ! 1589: -#define NAME "/tmp/grepdata" ! 1590: -mailprep() ! 1591: -{ ! 1592: - umask(0); ! 1593: - mailfd = open(NAME, 1); ! 1594: - if((mailfd < 0) && (errno != ECONC)) ! 1595: - mailfd = creat(NAME, 03666); ! 1596: - if(mailfd >= 0){ ! 1597: - Finit(mailfd, (char *)0); ! 1598: - Fseek(mailfd, 0L, 2); ! 1599: - Fprint(mailfd, "\321egrep: "); ! 1600: - } ! 1601: -} ! 1602: - ! 1603: -maildone() ! 1604: -{ ! 1605: - if(mailfd >= 0){ ! 1606: - Fflush(mailfd); ! 1607: - close(mailfd); ! 1608: - } ! 1609: -} ! 1610: -#endif /* MAILPREP */ ! 1611: //GO.SYSIN DD gram.y
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.