commit - 417f792f5259aa51eb411679c35b4ad182138b59
commit + 4a1921341a413f7147802d912fe133977642d763
blob - 9d2038692730ad5d98cfb5580a3b415c18ea521e
blob + 88bc021b0c450da7455ca57d7946c90088dfc125
--- nfa.c
+++ nfa.c
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;
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;
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);
}
/*
}
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
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);
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
int m;
init();
+ pr = nfaprep(n_app);
//nfaprint(n_app); // XXX debug
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
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);
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);
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)