Commit Diff


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)