|
|
researchv10 Norman
#include "re.h"
#include "lre.h"
#include "hdr.h"
#ifndef MINSTATE
#define MINSTATE 32
#endif
void
eg_stateinit(re_re *r)
{
r->statelim = MINSTATE;
r->states = 0;
r->threshhold = 2;
}
void
eg_clrstates(re_re *r)
{
r->nstates = 0;
if(r->states == 0){
r->states = (State *)egmalloc(r->statelim*sizeof(State), "states");
if (!r->states)
return;
}
}
void
eg_savestate(re_re *r, State *s)
{
r->initialstate = s-r->states;
r->istate = r->states[r->initialstate]; /* save for reset */
r->istate.init = 1;
r->flushed = 0;
}
State *
eg_startstate(re_re *r)
{
register i;
if(r->flushed > r->threshhold){
int slim = r->statelim*2;
if(slim > 512)
slim = 512;
if(slim > r->statelim){
for(i = 0; i < r->statelim; i++)
memset((char *)r->states[i].tab, 0, sizeof r->states[i].tab);
r->states = (State *)egrealloc((char *)r->states,
(r->statelim = slim)*sizeof(State), "states");
if (!r->states)
return 0;
}
r->flushed = 0;
r->threshhold++;
r->states[r->initialstate] = r->istate;
r->nstates = r->initialstate+1;
}
return(r->states+r->initialstate);
}
eg_getstate(register re_re *r)
{
if(r->nstates >= r->statelim){
r->nstates = r->initialstate+1;
r->states[r->initialstate] = r->istate;
(void)eg_posalloc(r, -1);
r->flushed++;
}
r->states[r->nstates].init = 0;
return(r->nstates++);
}
State *
eg_stateof(re_re *r, register Positionset *ps)
{
register State *s;
register i;
register *p, *e;
for(i = 0, s = r->states; i < r->nstates; i++, s++){
if(s->npos == ps->count){
for(p = s->pos+r->posbase, e = p+s->npos; p < e;)
if(ps->base[*p++] == 0){
goto next;
}
return(s);
}
next:;
}
return(0);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.