|
|
1.1 root 1: #include "head.h"
2: #define CBRA 1
3: #define CCHR 2
4: #define CDOT 4
5: #define CCL 6
6: #define NCCL 8
7: #define CDOL 10
8: #define CEOF 11
9: #define CKET 12
10: #define CBACK 18
11:
12: #define CSTAR 01
13:
14: #define LBSIZE BUFSIZ
15: #define ESIZE 256
16: #define NBRA 9
17:
18: char expbuf[ESIZE];
19: int circf;
20: char *braslist[NBRA];
21: char *braelist[NBRA];
22: char bittab[] = {
23: 1,
24: 2,
25: 4,
26: 8,
27: 16,
28: 32,
29: 64,
30: 128
31: };
32:
33: dore() {
34: register int line;
35: register char *p;
36:
37: circf = 0;
38: line = fline;
39: compile(re);
40: do {
41: if (redir) fnext();
42: else fprev();
43: p = fbuf;
44: while(*p++ != '\n')
45: ;
46: *--p = '\0';
47: if (match(fbuf)) goto l1;
48: } while (fline != line);
49: error("No match");
50: l1: *p = '\n';
51: fprint();
52: }
53:
54:
55: compile(astr)
56: char *astr;
57: {
58: register c;
59: register char *ep, *sp;
60: char *cstart;
61: char *lastep;
62: int cclcnt;
63: char bracket[NBRA], *bracketp;
64: int closed;
65: char numbra;
66: char neg;
67:
68: ep = expbuf;
69: sp = astr;
70: lastep = 0;
71: bracketp = bracket;
72: closed = numbra = 0;
73: if (*sp == '^') {
74: circf++;
75: sp++;
76: }
77: for (;;) {
78: if (ep >= &expbuf[ESIZE])
79: goto cerror;
80: if ((c = *sp++) != '*')
81: lastep = ep;
82: switch (c) {
83:
84: case '\0':
85: *ep++ = CEOF;
86: return;
87:
88: case '.':
89: *ep++ = CDOT;
90: continue;
91:
92: case '*':
93: if (lastep==0 || *lastep==CBRA || *lastep==CKET)
94: goto defchar;
95: *lastep |= CSTAR;
96: continue;
97:
98: case '$':
99: if (*sp != '\0')
100: goto defchar;
101: *ep++ = CDOL;
102: continue;
103:
104: case '[':
105: if(&ep[17] >= &expbuf[ESIZE])
106: goto cerror;
107: *ep++ = CCL;
108: neg = 0;
109: if((c = *sp++) == '^') {
110: neg = 1;
111: c = *sp++;
112: }
113: cstart = sp;
114: do {
115: if (c=='\0')
116: goto cerror;
117: if (c=='-' && sp>cstart && *sp!=']') {
118: for (c = sp[-2]; c<*sp; c++)
119: ep[c>>3] |= bittab[c&07];
120: sp++;
121: }
122: ep[c>>3] |= bittab[c&07];
123: } while((c = *sp++) != ']');
124: if(neg) {
125: for(cclcnt = 0; cclcnt < 16; cclcnt++)
126: ep[cclcnt] ^= -1;
127: ep[0] &= 0376;
128: }
129:
130: ep += 16;
131:
132: continue;
133:
134: case '\\':
135: if((c = *sp++) == '(') {
136: if(numbra >= NBRA) {
137: goto cerror;
138: }
139: *bracketp++ = numbra;
140: *ep++ = CBRA;
141: *ep++ = numbra++;
142: continue;
143: }
144: if(c == ')') {
145: if(bracketp <= bracket) {
146: goto cerror;
147: }
148: *ep++ = CKET;
149: *ep++ = *--bracketp;
150: closed++;
151: continue;
152: }
153:
154: if(c >= '1' && c <= '9') {
155: if((c -= '1') >= closed)
156: goto cerror;
157: *ep++ = CBACK;
158: *ep++ = c;
159: continue;
160: }
161:
162: defchar:
163: default:
164: *ep++ = CCHR;
165: *ep++ = c;
166: }
167: }
168: cerror:
169: errexit("RE error\n", (char *)NULL);
170: }
171:
172: match(p1)
173: register char *p1; {
174: register char *p2;
175: register c;
176: p2 = expbuf;
177: if (circf) {
178: if (advance(p1, p2))
179: goto found;
180: goto nfound;
181: }
182: /* fast check for first character */
183: if (*p2==CCHR) {
184: c = p2[1];
185: do {
186: if (*p1!=c)
187: continue;
188: if (advance(p1, p2))
189: goto found;
190: } while (*p1++);
191: goto nfound;
192: }
193: /* regular algorithm */
194: do {
195: if (advance(p1, p2))
196: goto found;
197: } while (*p1++);
198: nfound:
199: return(0);
200: found:
201: return(1);
202: }
203:
204: advance(lp, ep)
205: register char *lp, *ep;
206: {
207: register char *curlp;
208: char c;
209: char *bbeg;
210: int ct;
211:
212: for (;;) switch (*ep++) {
213:
214: case CCHR:
215: if (*ep++ == *lp++)
216: continue;
217: return(0);
218:
219: case CDOT:
220: if (*lp++)
221: continue;
222: return(0);
223:
224: case CDOL:
225: if (*lp=='\0')
226: continue;
227: return(0);
228:
229: case CEOF:
230: return(1);
231:
232: case CCL:
233: c = *lp++ & 0177;
234: if(ep[c>>3] & bittab[c & 07]) {
235: ep += 16;
236: continue;
237: }
238: return(0);
239: case CBRA:
240: braslist[*ep++] = lp;
241: continue;
242:
243: case CKET:
244: braelist[*ep++] = lp;
245: continue;
246:
247: case CBACK:
248: bbeg = braslist[*ep];
249: if (braelist[*ep]==0)
250: return(0);
251: ct = braelist[*ep++] - bbeg;
252: if(ecmp(bbeg, lp, ct)) {
253: lp += ct;
254: continue;
255: }
256: return(0);
257:
258: case CBACK|CSTAR:
259: bbeg = braslist[*ep];
260: if (braelist[*ep]==0)
261: return(0);
262: ct = braelist[*ep++] - bbeg;
263: curlp = lp;
264: while(ecmp(bbeg, lp, ct))
265: lp += ct;
266: while(lp >= curlp) {
267: if(advance(lp, ep)) return(1);
268: lp -= ct;
269: }
270: return(0);
271:
272:
273: case CDOT|CSTAR:
274: curlp = lp;
275: while (*lp++);
276: goto star;
277:
278: case CCHR|CSTAR:
279: curlp = lp;
280: while (*lp++ == *ep);
281: ep++;
282: goto star;
283:
284: case CCL|CSTAR:
285: curlp = lp;
286: do {
287: c = *lp++ & 0177;
288: } while(ep[c>>3] & bittab[c & 07]);
289: ep += 16;
290: goto star;
291:
292: star:
293: if(--lp == curlp) {
294: continue;
295: }
296:
297: if(*ep == CCHR) {
298: c = ep[1];
299: do {
300: if(*lp != c)
301: continue;
302: if(advance(lp, ep))
303: return(1);
304: } while(lp-- > curlp);
305: return(0);
306: }
307:
308: do {
309: if (advance(lp, ep))
310: return(1);
311: } while (lp-- > curlp);
312: return(0);
313:
314: default:
315: errexit("RE botch\n", (char *)NULL);
316: }
317: }
318: ecmp(a, b, count)
319: char *a, *b;
320: {
321: register cc = count;
322: while(cc--)
323: if(*a++ != *b++) return(0);
324: return(1);
325: }
326:
327:
328: errexit(s)
329: char *s; {
330: error(s);
331: return;
332: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.