updated for version 7.4.289
Problem: Pattern with repeated backreference does not match with new regexp
engine. (Urtica Dioica)
Solution: Also check the end of a submatch when deciding to put a state in
the state list.
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index 7cbfe0a..d855df3 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -3945,6 +3945,7 @@
/*
* Return TRUE if "sub1" and "sub2" have the same start positions.
+ * When using back-references also check the end position.
*/
static int
sub_equal(sub1, sub2)
@@ -3976,6 +3977,23 @@
if (s1 != -1 && sub1->list.multi[i].start.col
!= sub2->list.multi[i].start.col)
return FALSE;
+
+ if (nfa_has_backref)
+ {
+ if (i < sub1->in_use)
+ s1 = sub1->list.multi[i].end.lnum;
+ else
+ s1 = -1;
+ if (i < sub2->in_use)
+ s2 = sub2->list.multi[i].end.lnum;
+ else
+ s2 = -1;
+ if (s1 != s2)
+ return FALSE;
+ if (s1 != -1 && sub1->list.multi[i].end.col
+ != sub2->list.multi[i].end.col)
+ return FALSE;
+ }
}
}
else
@@ -3992,6 +4010,19 @@
sp2 = NULL;
if (sp1 != sp2)
return FALSE;
+ if (nfa_has_backref)
+ {
+ if (i < sub1->in_use)
+ sp1 = sub1->list.line[i].end;
+ else
+ sp1 = NULL;
+ if (i < sub2->in_use)
+ sp2 = sub2->list.line[i].end;
+ else
+ sp2 = NULL;
+ if (sp1 != sp2)
+ return FALSE;
+ }
}
}