summaryrefslogtreecommitdiff
path: root/lib/dfa.c
diff options
context:
space:
mode:
authorNorihiro Tanaka <noritnk@kcn.ne.jp>2018-09-19 08:35:49 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2018-09-19 08:36:44 -0700
commit617a6097466d818e425609eff9ed85039aea25db (patch)
tree199d9ac58ab290d1eaee247e8ee9450060831202 /lib/dfa.c
parent5007177e5d024465e384250f7f8a2040fe72f445 (diff)
downloadgnulib-617a6097466d818e425609eff9ed85039aea25db.tar.gz
dfa: optimization for state merge
* lib/dfa.c (merge2): New function. (merge_nfa_state): Use it.
Diffstat (limited to 'lib/dfa.c')
-rw-r--r--lib/dfa.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/dfa.c b/lib/dfa.c
index 13b2a0bafb..d04bcbe640 100644
--- a/lib/dfa.c
+++ b/lib/dfa.c
@@ -2102,6 +2102,21 @@ merge (position_set const *s1, position_set const *s2, position_set *m)
merge_constrained (s1, s2, -1, m);
}
+static void
+merge2 (position_set *dst, position_set const *src, position_set *m)
+{
+ if (src->nelem < 4)
+ {
+ for (ptrdiff_t i = 0; i < src->nelem; ++i)
+ insert (src->elems[i], dst);
+ }
+ else
+ {
+ merge (src, dst, m);
+ copy (m, dst);
+ }
+}
+
/* Delete a position from a set. Return the nonzero constraint of the
deleted position, or zero if there was no such position. */
static unsigned int
@@ -2388,8 +2403,7 @@ merge_nfa_state (struct dfa *d, size_t *queue, ptrdiff_t nqueue, size_t tindex,
if (flags[sindex] & OPT_REPEAT)
delete (sindex, &follows[sindex]);
- merge (&follows[dindex], &follows[sindex], merged);
- copy (merged, &follows[dindex]);
+ merge2 (&follows[dindex], &follows[sindex], merged);
/* Mark it as pruned in future. */
follows[tindex].elems[j].constraint = 0;