commit ed4d5d022fc7fef0a97e5bcd973f93d3f5eaa331 from: Sven M. Hallberg date: Wed Feb 09 18:59:44 2022 UTC nfareset/nfarun/nfacont commit - 403aa76810963c691542041c7ccce8dcab90487b commit + ed4d5d022fc7fef0a97e5bcd973f93d3f5eaa331 blob - 2c83d11b339042c80f64d6821bbabca4da703f5a blob + 1722e03753bff277083f0fa53e6b78aab8d46692 --- nfa.c +++ nfa.c @@ -416,11 +416,26 @@ struct prep { 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) @@ -440,6 +455,8 @@ 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; @@ -636,7 +653,7 @@ generate(struct prep *pr, const struct set *act, const } 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; @@ -645,13 +662,9 @@ match_(struct prep *pr, const char *input, size_t sz) 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; ) { @@ -687,17 +700,28 @@ match_(struct prep *pr, const char *input, size_t 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 @@ -68,6 +68,8 @@ typedef int out_t(struct range r, size_t state, const 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 @@ -205,7 +205,7 @@ benchmark(NFA a) /* 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); @@ -215,7 +215,7 @@ benchmark(NFA a) 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); @@ -278,7 +278,7 @@ main(int argc, char **argv) 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)