commit - 403aa76810963c691542041c7ccce8dcab90487b
commit + ed4d5d022fc7fef0a97e5bcd973f93d3f5eaa331
blob - 2c83d11b339042c80f64d6821bbabca4da703f5a
blob + 1722e03753bff277083f0fa53e6b78aab8d46692
--- nfa.c
+++ nfa.c
sub_t *sub; /* the "subconscious" mind of the automaton */
out_t *out; /* output subroutine */
void *env; /* user-supplied environment for sub and out */
+
+ struct set act; /* set of "active" states */
+ struct set next; /* set of "next active" states */
struct set eps; /* which states carry epsilon edges */
int sz;
bunch_t buf[];
};
+
+void
+nfareset(struct prep *pr)
+{
+ pr->act.n = pr->next.n = pr->a.size + 1;
+ pr->act.sz = pr->next.sz = pr->sz;
+ pr->act.bits = pr->buf;
+ pr->next.bits = pr->buf + pr->sz;
+
+ memset(pr->act.bits, 0, pr->act.sz * sizeof(bunch_t));
+ setinsert(&pr->act, 0);
+}
struct prep *
nfaprep(NFA a, sub_t *sub, out_t *out, void *env)
pr->out = out;
pr->env = env;
+ nfareset(pr);
+
#if BITSET
/* compute epsilon map (which states carry epsilon edges) */
pr->eps.bits = pr->buf + 2 * setsz;
}
int
-match_(struct prep *pr, const char *input, size_t sz)
+nfacont(struct prep *pr, const char *input, size_t sz)
{
NFA a = pr->a;
struct set act, next;
int result = -1; /* no match */
const char *p;
- /* initialize state sets */
- act.n = next.n = a.size + 1;
- act.sz = next.sz = pr->sz;
- act.bits = pr->buf;
- next.bits = pr->buf + pr->sz;
- memset(act.bits, 0, act.sz * sizeof(bunch_t));
- setinsert(&act, 0);
+ /* get state sets from prep */
+ act = pr->act;
+ next = pr->next;
/* iterate over the input */
for(i = 0; i <= sz; ) {
next.bits = tmp;
}
+ /* store state sets back into prep for future use */
+ pr->act = act;
+ pr->next = next;
+
return result;
}
int
-match(NFA a, sub_t *sub, out_t *out, void *env, const char *input, size_t sz)
+nfarun(struct prep *pr, const char *input, size_t sz)
{
+ nfareset(pr);
+ return nfacont(pr, input, sz);
+}
+
+int
+nfamatch(NFA a, sub_t *sub, out_t *out, void *env, const char *inp, size_t sz)
+{
struct prep *pr;
int result;
pr = nfaprep(a, sub, out, env);
- result = match_(pr, input, sz);
+ result = nfarun(pr, inp, sz);
free(pr);
return result;
blob - 4ab6613d29bc4385fdca19d300caef5972951859
blob + 22a469b798cb78f7b90b30d82f3a274e4ddf577b
--- nfa.h
+++ nfa.h
struct prep;
struct prep *nfaprep(NFA, sub_t *, out_t *, void *);
+void nfareset(struct prep *);
+int nfarun(struct prep *, const char *, size_t);
+int nfacont(struct prep *, const char *, size_t);
-int match_(struct prep *, const char *, size_t);
-int match(NFA, sub_t *, out_t *, void *, const char *, size_t);
+int nfamatch(NFA, sub_t *, out_t *, void *, const char *, size_t);
blob - e3ee4065da968c4b9522c07e0bc757cefefb25ef
blob + 109812125ad9e36833c3be6cb874930d70a822b6
--- test_nfa.c
+++ test_nfa.c
/* warmup */
sz = strlen(inputs[0]);
for (i = 0; i < N; i++)
- match_(pr, inputs[0], sz);
+ nfarun(pr, inputs[0], sz);
for (p = inputs; *p != NULL; p++) {
printf("%30.30s ", *p);
env.input = *p;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t0);
for (i = 0; i < N; i++)
- n = match_(pr, *p, sz);
+ n = nfarun(pr, *p, sz);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t);
timespecsub(&t, &t0, &td);
inp = argv[i];
sz = strlen(inp);
env.input = inp;
- n = match(nfa, sub, out_print, &env, inp, sz);
+ n = nfamatch(nfa, sub, out_print, &env, inp, sz);
printf("\n");
if (n == -1)