|
|
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.