|
|
1.1 ! root 1: #include "hdr.h" ! 2: #include "y.tab.h" ! 3: ! 4: cgotofn() { ! 5: register i; ! 6: count = cntpos = 0; ! 7: nxtpos = 0; ! 8: nxtfoll = MAXPOS-1; ! 9: begout = 0; ! 10: for (i=1; i<=line; i++) colpos[i] = 0; ! 11: if (first(line-1)==0) { ! 12: colpos[line] = 1; ! 13: cntpos++; ! 14: begout = 1; ! 15: } ! 16: for (i=1; i<=line; i++) tmpstat[i] = begstat[i] = colpos[i]; ! 17: count = begcnt = cntpos-1; /* leave out position 1 */ ! 18: tmpstat[1] = begstat[1] = 0; ! 19: addstate(1); ! 20: inxtpos = nxtpos; ! 21: istat = nxtst(states+1,LEFT); ! 22: } ! 23: ! 24: State * ! 25: nxtst(ss,c) ! 26: State *ss; ! 27: char c; ! 28: { ! 29: register i, num, k; ! 30: int pos, curpos, number, newpos; ! 31: int s = ss-states; ! 32: num = positions[state[s]]; ! 33: count = begcnt; ! 34: for (i=3; i<=line; i++) tmpstat[i] = begstat[i]; ! 35: pos = state[s] + 1; ! 36: for (i=0; i<num; i++) { ! 37: curpos = positions[pos]; ! 38: if ((k = name[curpos]) >= 0) { ! 39: if ( ! 40: (k == c) ! 41: | (k == DOT && c != LEFT && c != RIGHT) ! 42: | (k == CCL && member(c, right[curpos], 1)) ! 43: | (k == NCCL && member(c, right[curpos], 0) && c != LEFT && c != RIGHT) ! 44: ) { ! 45: if (foll[curpos] == 0) { ! 46: cntpos = 0; ! 47: for (k=1; k<=line; k++) colpos[k] = 0; ! 48: follow(curpos); ! 49: addfoll(curpos); ! 50: } ! 51: number = positions[foll[curpos]]; ! 52: newpos = foll[curpos] - 1; ! 53: for (k=0; k<number; k++) { ! 54: if (tmpstat[positions[newpos]] != 1) { ! 55: tmpstat[positions[newpos]] = 1; ! 56: count++; ! 57: } ! 58: newpos--; ! 59: } ! 60: } ! 61: } ! 62: pos++; ! 63: } ! 64: if (notin(nstate)) { ! 65: if (++nstate >= NSTATES) { ! 66: nxtpos = inxtpos; ! 67: reinit = 1; ! 68: nstate = 1; ! 69: addstate(1); ! 70: return states+1; ! 71: } ! 72: addstate(nstate); ! 73: return(states[s].gotofn[c] = states+nstate); ! 74: } ! 75: else { ! 76: return(states[s].gotofn[c] = states+xstate); ! 77: } ! 78: } ! 79: ! 80: first(v) { ! 81: register b; ! 82: if (left[v] == 0) { ! 83: if (colpos[v] != 1) { ! 84: colpos[v] = 1; ! 85: cntpos++; ! 86: } ! 87: return(1); ! 88: } ! 89: else if (right[v] == 0) { ! 90: if (first(left[v]) == 0) return (0); ! 91: else if (name[v] == PLUS) return (1); ! 92: else return (0); ! 93: } ! 94: else if (name[v] == CAT) { ! 95: if (first(left[v]) == 0 && first(right[v]) == 0) return (0); ! 96: else return (1); ! 97: } ! 98: else { /* name[v] == OR */ ! 99: b = first(right[v]); ! 100: if (first(left[v]) == 0 || b == 0) return (0); ! 101: else return (1); ! 102: } ! 103: } ! 104: ! 105: member(symb, set, torf) { ! 106: register i, num, pos; ! 107: num = chars[set]; ! 108: pos = set + 1; ! 109: for (i=0; i<num; i++) ! 110: if (symb == chars[pos++]) return (torf); ! 111: return (!torf); ! 112: } ! 113: ! 114: notin(n) { ! 115: register i, j, pos; ! 116: for (i=1; i<=n; i++) { ! 117: if (positions[state[i]] == count) { ! 118: pos = state[i] + 1; ! 119: for (j=0; j < count; j++) { ! 120: if (tmpstat[positions[pos++]] != 1) goto nxt; } ! 121: xstate = i; ! 122: return (0); ! 123: } ! 124: nxt: ; ! 125: } ! 126: return (1); ! 127: } ! 128: ! 129: addstate(n) { ! 130: register i; ! 131: if (nxtpos + count >= nxtfoll) { ! 132: overflo(); } ! 133: for (i=0; i<NCHARS; i++) ! 134: states[n].gotofn[i] = 0; ! 135: state[n] = nxtpos; ! 136: positions[nxtpos++] = count; ! 137: for (i=3; i <= line; i++) { ! 138: if (tmpstat[i] == 1) { ! 139: positions[nxtpos++] = i; ! 140: } ! 141: } ! 142: if (tmpstat[line] == 1) ! 143: states[n].out = 1; ! 144: else ! 145: states[n].out = 0; ! 146: } ! 147: ! 148: addfoll(n) { ! 149: register i; ! 150: if (nxtfoll - cntpos <= nxtpos) { ! 151: overflo(); } ! 152: foll[n] = nxtfoll; ! 153: positions[nxtfoll--] = cntpos; ! 154: for (i=3; i <= line; i++) { ! 155: if (colpos[i] == 1) { ! 156: positions[nxtfoll--] = i; ! 157: } ! 158: } ! 159: } ! 160: ! 161: follow(v) int v; { ! 162: int p; ! 163: if (v == line) return; ! 164: p = parent[v]; ! 165: switch(name[p]) { ! 166: case STAR: ! 167: case PLUS: first(v); ! 168: follow(p); ! 169: return; ! 170: ! 171: case OR: ! 172: case QUEST: follow(p); ! 173: return; ! 174: ! 175: case CAT: if (v == left[p]) { ! 176: if (first(right[p]) == 0) { ! 177: follow(p); ! 178: return; ! 179: } ! 180: } ! 181: else follow(p); ! 182: return; ! 183: case FINAL: if (colpos[line] != 1) { ! 184: colpos[line] = 1; ! 185: cntpos++; ! 186: } ! 187: return; ! 188: } ! 189: } ! 190: ! 191: clearg() { ! 192: register i; ! 193: reinit = 0; ! 194: states[1].out = begout; ! 195: for (i=0; i<NCHARS; i++) ! 196: states[1].gotofn[i] = 0; ! 197: nstate = 1; ! 198: state[1] = 0; ! 199: istat = nxtst(states+1,LEFT); ! 200: } ! 201: ! 202: execute(file) ! 203: char *file; ! 204: { ! 205: register char *p; ! 206: register State *cstat, *t; ! 207: int len; ! 208: char *nlp; ! 209: int f; ! 210: ! 211: #define READLINE if((p = nlp = Frdline(f)) == 0)\ ! 212: goto done;\ ! 213: else /* Frdline nulls the \n, put it back */\ ! 214: len = FIOLINELEN(f), nlp[len++] = RIGHT ! 215: ! 216: if (file) { ! 217: if ((f = open(file, 0)) < 0) { ! 218: fprint(2, "egrep: can't open %s\n", file); ! 219: badbotch=1; ! 220: return; ! 221: } ! 222: } ! 223: else f = 0; ! 224: Finit(f, (char *)0); ! 225: Ftie(f, 1); /* link input f with stdout */ ! 226: lnum = 1; ! 227: tln = 0; ! 228: READLINE; ! 229: cstat = istat; ! 230: if (cstat->out) goto found; ! 231: for (;;) { ! 232: if ((t = cstat->gotofn[*p]) == 0) ! 233: cstat = nxtst(cstat, *p); ! 234: else ! 235: cstat = t; ! 236: if (cstat->out) { ! 237: found: ! 238: if (vflag == 0) { ! 239: succeed: nsucc = 1; ! 240: if (cflag) tln++; ! 241: else if (sflag) ! 242: ; /* ugh */ ! 243: else if (lflag) { ! 244: Fprint(1, "%s\n", file); ! 245: close(f); ! 246: return; ! 247: } ! 248: else { ! 249: if (nfile > 1 && hflag) ! 250: Fprint(1, "%s:", file); ! 251: if (bflag) ! 252: Fprint(1, "%ld:", (FIOSEEK(f)-len)/BLKSIZE); ! 253: if (nflag) ! 254: Fprint(1, "%ld:", lnum); ! 255: Fwrite(1, nlp, len); ! 256: } ! 257: } ! 258: lnum++; ! 259: READLINE; ! 260: if (reinit == 1) clearg(); ! 261: if ((cstat = istat)->out) ! 262: goto found; /* we are a match already */ ! 263: else ! 264: continue; /* normal pattern matching loop */ ! 265: } ! 266: if (*p++ == RIGHT) { ! 267: if (vflag) goto succeed; ! 268: else { ! 269: lnum++; ! 270: READLINE; ! 271: if (reinit == 1) clearg(); ! 272: if ((cstat = istat)->out) ! 273: goto found; /* we are a match already */ ! 274: } ! 275: } ! 276: } ! 277: done: close(f); ! 278: if (cflag) { ! 279: if (nfile > 1) ! 280: Fprint("%s:", file); ! 281: Fprint(1, "%ld\n", tln); ! 282: } ! 283: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.