|
|
1.1 root 1: #include "re.h"
2: #include "lre.h"
3: #include "hdr.h"
4:
5: #ifndef MINSTATE
6: #define MINSTATE 32
7: #endif
8:
9: void
10: eg_stateinit(re_re *r)
11: {
12: r->statelim = MINSTATE;
13: r->states = 0;
14: r->threshhold = 2;
15: }
16:
17: void
18: eg_clrstates(re_re *r)
19: {
20: r->nstates = 0;
21: if(r->states == 0){
22: r->states = (State *)egmalloc(r->statelim*sizeof(State), "states");
23: if (!r->states)
24: return;
25: }
26: }
27:
28: void
29: eg_savestate(re_re *r, State *s)
30: {
31: r->initialstate = s-r->states;
32: r->istate = r->states[r->initialstate]; /* save for reset */
33: r->istate.init = 1;
34: r->flushed = 0;
35: }
36:
37: State *
38: eg_startstate(re_re *r)
39: {
40: register i;
41:
42: if(r->flushed > r->threshhold){
43: int slim = r->statelim*2;
44: if(slim > 512)
45: slim = 512;
46: if(slim > r->statelim){
47: for(i = 0; i < r->statelim; i++)
48: memset((char *)r->states[i].tab, 0, sizeof r->states[i].tab);
49: r->states = (State *)egrealloc((char *)r->states,
50: (r->statelim = slim)*sizeof(State), "states");
51: if (!r->states)
52: return 0;
53: }
54: r->flushed = 0;
55: r->threshhold++;
56: r->states[r->initialstate] = r->istate;
57: r->nstates = r->initialstate+1;
58: }
59: return(r->states+r->initialstate);
60: }
61:
62: eg_getstate(register re_re *r)
63: {
64: if(r->nstates >= r->statelim){
65: r->nstates = r->initialstate+1;
66: r->states[r->initialstate] = r->istate;
67: (void)eg_posalloc(r, -1);
68: r->flushed++;
69: }
70: r->states[r->nstates].init = 0;
71: return(r->nstates++);
72: }
73:
74: State *
75: eg_stateof(re_re *r, register Positionset *ps)
76: {
77: register State *s;
78: register i;
79: register *p, *e;
80:
81: for(i = 0, s = r->states; i < r->nstates; i++, s++){
82: if(s->npos == ps->count){
83: for(p = s->pos+r->posbase, e = p+s->npos; p < e;)
84: if(ps->base[*p++] == 0){
85: goto next;
86: }
87: return(s);
88: }
89: next:;
90: }
91: return(0);
92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.