Commit Diff


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)