commit 4a1921341a413f7147802d912fe133977642d763 from: Sven M. Hallberg date: Thu Nov 03 18:04:11 2022 UTC rework prep/run interface commit - 417f792f5259aa51eb411679c35b4ad182138b59 commit + 4a1921341a413f7147802d912fe133977642d763 blob - 9d2038692730ad5d98cfb5580a3b415c18ea521e blob + 88bc021b0c450da7455ca57d7946c90088dfc125 --- nfa.c +++ nfa.c @@ -492,33 +492,19 @@ struct prep { out_t *out; /* output subroutine */ void *env; /* user-supplied environment for sub and out */ + int pos; /* current input position */ + int match; /* length of longest match so far */ + struct set act; /* set of "active" states */ struct set next; /* set of "next active" states */ struct set eps; /* which states carry epsilon edges */ - int pos; /* current input position */ - int match; /* length of longest match so far */ - - int sz; - bunch_t buf[]; + int sz; /* number of bunch_t's used per set */ + bunch_t buf[]; /* blob of storage used by the sets */ }; - -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; - pr->pos = 0; - pr->match = -1; /* no match */ - - 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) +nfaprep(NFA a) { struct prep *pr; int setsz; @@ -529,14 +515,11 @@ nfaprep(NFA a, sub_t *sub, out_t *out, void *env) pr = malloc(sizeof(struct prep) + 3 * setsz * sizeof(bunch_t)); assert (pr != NULL); // XXX - pr->a = a; - pr->sz = setsz; - pr->sub = sub; - pr->out = out; - pr->env = env; + pr->act.n = pr->next.n = pr->a.size + 1; + pr->act.sz = pr->next.sz = setsz; + pr->act.bits = pr->buf; + pr->next.bits = pr->buf + setsz; - nfareset(pr); - #if BITSET /* compute epsilon map (which states carry epsilon edges) */ pr->eps.bits = pr->buf + 2 * setsz; @@ -548,7 +531,27 @@ nfaprep(NFA a, sub_t *sub, out_t *out, void *env) setinsert(&pr->eps, i); #endif + pr->a = a; + pr->sz = setsz; + return pr; +} + +void +nfainit(struct prep *pr, sub_t *sub, out_t *out, void *env) +{ + assert(pr != NULL); + + pr->sub = sub; + pr->out = out; + pr->env = env; + pr->pos = 0; + pr->match = -1; /* no match */ + + memset(pr->act.bits, 0, pr->act.sz * sizeof(bunch_t)); + // XXX is this memset actually necessary?? i.e.: does + // the nfa engine leave act empty anyway? + setinsert(&pr->act, 0); } /* @@ -800,23 +803,36 @@ nfaend(struct prep *pr) } int -nfarun(struct prep *pr, const char *input, size_t sz) +nfarunp(struct prep *pr, + sub_t *sub, out_t *out, void *env, const char *inp, size_t sz) { - nfareset(pr); - nfacont(pr, input, sz); + nfainit(pr, sub, out, env); + nfacont(pr, inp, sz); nfaend(pr); return pr->match; } int -nfamatch(NFA a, sub_t *sub, out_t *out, void *env, const char *inp, size_t sz) +nfarun(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 = nfarun(pr, inp, sz); + pr = nfaprep(a); + result = nfarunp(pr, sub, out, env, inp, sz); free(pr); return result; } + +int +nfamatchp(struct prep *pr, const char *inp, size_t sz) +{ + return nfarunp(pr, NULL, NULL, NULL, inp, sz); +} + +int +nfamatch(NFA a, const char *inp, size_t sz) +{ + return nfarun(a, NULL, NULL, NULL, inp, sz); +} blob - 4f0469ded72cbdf780791c0dcc475a13146592d3 blob + 15ccef21122501887631f6fb22b9263f0c6046c6 --- nfa.h +++ nfa.h @@ -50,8 +50,10 @@ NFA nop(void); NFA think(int); NFA epsilon(void); -/* combinators */ NFA str(const char *); +NFA outstr(const char *); + +/* combinators */ NFA seq_(NFA, ...); /* -> macro seq() */ NFA choice_(NFA, ...); /* -> macro choice() */ NFA opt(NFA); @@ -67,15 +69,16 @@ NFA star(NFA); typedef int sub_t(int symbol, size_t state, int pos, void *env); typedef int out_t(struct range r, size_t state, int pos, void *env); -struct prep; -struct prep *nfaprep(NFA, sub_t *, out_t *, void *); -void nfareset(struct prep *); -int nfarun(struct prep *, const char *, size_t); +struct prep *nfaprep(NFA); +void nfainit(struct prep *, sub_t *, out_t *, void *); int nfacont(struct prep *, const char *, size_t); int nfaend(struct prep *); -/* convenience wrapper combining nfaprep, nfarun, and nfaend */ -int nfamatch(NFA, sub_t *, out_t *, void *, const char *, size_t); +/* convenience wrappers combining nfaprep/nfainit, nfacont, and nfaend */ +int nfarun(NFA, sub_t *, out_t *, void *, const char *, size_t); +int nfarunp(struct prep *, sub_t *, out_t *, void *, const char *, size_t); +int nfamatch(NFA, const char *, size_t); +int nfamatchp(struct prep *, const char *, size_t); /* diagnostics */ blob - 98c532c584d5181ca916047dcb186b565aaa6450 blob + 17531c235789f3bd6d3c6552850f3bb148d954c0 --- simcard.c +++ simcard.c @@ -264,6 +264,7 @@ main(int argc, char *argv[]) int m; init(); + pr = nfaprep(n_app); //nfaprint(n_app); // XXX debug @@ -275,9 +276,7 @@ main(int argc, char *argv[]) assert(feof(stdin)); // XXX env.input = buf; - pr = nfaprep(n_app, sub, out, &env); - - m = nfarun(pr, buf, n); + m = nfarunp(pr, sub, out, &env, buf, n); if (m == -1) { fprintf(stderr, "Protocol error.\n"); return 1; blob - 46680b86e2e990fd02f90848980f04ee43c9a317 blob + 8ad2754311ad3a9f71549f4965915e40c16093e1 --- test_nfa.c +++ test_nfa.c @@ -123,12 +123,12 @@ benchmark(NFA a) size_t sz; env.input = inputs[0]; - pr = nfaprep(a, sub, out_bench, &env); + pr = nfaprep(a); /* warmup */ sz = strlen(inputs[0]); for (i = 0; i < N; i++) - nfarun(pr, inputs[0], sz); + nfarunp(pr, sub, out_bench, &env, inputs[0], sz); for (p = inputs; *p != NULL; p++) { printf("%30.30s ", *p); @@ -138,7 +138,7 @@ benchmark(NFA a) env.input = *p; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t0); for (i = 0; i < N; i++) - n = nfarun(pr, *p, sz); + n = nfarunp(pr, sub, out_bench, &env, *p, sz); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t); timespecsub(&t, &t0, &td); @@ -201,7 +201,7 @@ main(int argc, char **argv) inp = argv[i]; sz = strlen(inp); env.input = inp; - n = nfamatch(nfa, sub, out_print, &env, inp, sz); + n = nfarun(nfa, sub, out_print, &env, inp, sz); printf("\n"); if (n == -1)