|
|
1.1 root 1: #include "re.h"
2: #include "lre.h"
3: #include "hdr.h"
4:
5: static void traverse(Expr *);
6:
7: #define MAXLIT 256 /* is plenty big enough */
8: static unsigned char tmp[MAXLIT], best[MAXLIT];
9: static unsigned char *p;
10: static int bestlen;
11: #define START { p = tmp ; }
12: #define ADD(c) { if(p >= &tmp[MAXLIT]) p--; *p++ = c; }
13: #define FINISH { ADD(0) if((p-tmp) > bestlen) memmove((char *)best, (char *)tmp, bestlen = p-tmp); }
14:
15: re_lit(re_re *r, unsigned char **b, unsigned char **e)
16: {
17: bestlen = 0;
18: START
19: traverse(r->root);
20: FINISH
21: if(bestlen < 3)
22: return(0);
23: *b = best;
24: *e = best+bestlen-1;
25: return(1);
26: }
27:
28: static void
29: traverse(register Expr *e)
30: {
31: switch(e->type)
32: {
33: case Literal:
34: ADD(e->lit)
35: break;
36: case Charclass:
37: if((int)e->l == 1)
38: ADD(*(char *)e->r)
39: else {
40: FINISH
41: START
42: }
43: break;
44: case Cat:
45: traverse(e->l);
46: traverse(e->r);
47: break;
48: case Plus:
49: traverse(e->l);
50: FINISH /* can't go on past a + */
51: START /* but we can start with one! */
52: traverse(e->l);
53: break;
54: case EOP:
55: FINISH
56: START
57: traverse(e->l);
58: break;
59: default:
60: FINISH
61: START
62: break;
63: }
64: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.