From 11d4ea518166ffbc0c2fe85d090723e8f299486c Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Sat, 15 Jul 2017 22:27:24 +0300 Subject: Revert 92ec6835548d36 - don't use DFA if need_start is true. --- re.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 're.c') diff --git a/re.c b/re.c index 878c884e..d1b0ee7f 100644 --- a/re.c +++ b/re.c @@ -268,17 +268,26 @@ research(Regexp *rp, char *str, int start, rp->pat.not_bol = 1; /* - * Always do dfa search if can; if it fails, we won't bother - * with the regex search. + * Always do dfa search if can; if it fails, then even if + * need_start is true, we won't bother with the regex search. * * The dfa matcher doesn't have a no_bol flag, so don't bother * trying it in that case. * + * 7/2008: Skip the dfa matcher if need_start. The dfa matcher + * has bugs in certain multibyte cases and it's too difficult + * to try to special case things. + * 7/2017: Apparently there are some cases where DFA gets + * stuck, even in the C locale, so we use dfa only if not need_start. + * + * Should that issue ever get resolved, note this comment: + * * 7/2016: The dfa matcher can't handle a case where searching * starts in the middle of a string, so don't bother trying it * in that case. + * if (rp->dfa && ! no_bol && start == 0) ... */ - if (rp->dfa && ! no_bol && start == 0) { + if (rp->dfa && ! no_bol && ! need_start) { char save; size_t count = 0; struct dfa *superset = dfasuperset(rp->dfareg); -- cgit v1.2.3