aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-11-03 20:35:40 +0200
committerArnold D. Robbins <arnold@skeeve.com>2014-11-03 20:35:40 +0200
commit204bec7af64c61489e37007d45de936482007977 (patch)
tree422dc414082262eebf770b8c7aa48c9b26f698d4
parentaf1cce266d1b6c875cf01db6c47ada89cbf64411 (diff)
parentc9936ef0d4d7a7f263831bead31c5ffcf8b0a8d3 (diff)
downloadegawk-204bec7af64c61489e37007d45de936482007977.tar.gz
egawk-204bec7af64c61489e37007d45de936482007977.tar.bz2
egawk-204bec7af64c61489e37007d45de936482007977.zip
Merge branch 'gawk-4.1-stable'
-rw-r--r--ChangeLog4
-rw-r--r--re.c9
2 files changed, 11 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0e17cb80..ed4c2b9a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2014-11-03 Norihiro Tanaka <noritnk@kcn.ne.jp>
+
+ * re.c (research): Use dfa superset to improve matching speed.
+
2014-11-02 Arnold D. Robbins <arnold@skeeve.com>
* profile.c (div_on_left_mul_on_right): New function.
diff --git a/re.c b/re.c
index 9118129e..12c212a6 100644
--- a/re.c
+++ b/re.c
@@ -284,13 +284,18 @@ research(Regexp *rp, char *str, int start,
if (rp->dfa && ! no_bol && ! need_start) {
char save;
size_t count = 0;
+ struct dfa *superset = dfasuperset(rp->dfareg);
/*
* dfa likes to stick a '\n' right after the matched
* text. So we just save and restore the character.
*/
save = str[start+len];
- ret = dfaexec(rp->dfareg, str+start, str+start+len, true,
- &count, &try_backref);
+ if (superset)
+ ret = dfaexec(superset, str+start, str+start+len,
+ true, NULL, NULL);
+ if (ret)
+ ret = dfaexec(rp->dfareg, str+start, str+start+len,
+ true, &count, &try_backref);
str[start+len] = save;
}