updated for version 7.3.1082
Problem: New regexp engine: Problem with \@= matching.
Solution: Save and restore nfa_match.
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index 1dc56a3..69370ac 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -3332,11 +3332,8 @@
int result;
int size = 0;
int flag = 0;
- int old_reglnum = -1;
int go_to_nextline = FALSE;
nfa_thread_T *t;
- char_u *old_reginput = NULL;
- char_u *old_regline = NULL;
nfa_list_T list[3];
nfa_list_T *listtbl[2][2];
nfa_list_T *ll;
@@ -3560,15 +3557,18 @@
break;
case NFA_START_INVISIBLE:
- /* Save global variables, and call nfa_regmatch() to check if
- * the current concat matches at this position. The concat
- * ends with the node NFA_END_INVISIBLE */
- old_reginput = reginput;
- old_regline = regline;
- old_reglnum = reglnum;
+ {
+ char_u *save_reginput = reginput;
+ char_u *save_regline = regline;
+ int save_reglnum = reglnum;
+ int save_nfa_match = nfa_match;
+
+ /* Call nfa_regmatch() to check if the current concat matches
+ * at this position. The concat ends with the node
+ * NFA_END_INVISIBLE */
if (listids == NULL)
{
- listids = (int *) lalloc(sizeof(int) * nstate, TRUE);
+ listids = (int *)lalloc(sizeof(int) * nstate, TRUE);
if (listids == NULL)
{
EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
@@ -3588,7 +3588,12 @@
result = nfa_regmatch(t->state->out, submatch, m);
nfa_set_neg_listids(start);
nfa_restore_listids(start, listids);
- nfa_match = FALSE;
+
+ /* restore position in input text */
+ reginput = save_reginput;
+ regline = save_regline;
+ reglnum = save_reglnum;
+ nfa_match = save_nfa_match;
#ifdef ENABLE_LOG
log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
@@ -3610,10 +3615,6 @@
{
int j;
- /* Restore position in input text */
- reginput = old_reginput;
- regline = old_regline;
- reglnum = old_reglnum;
/* Copy submatch info from the recursive call */
if (REG_MULTI)
for (j = 1; j < m->in_use; j++)
@@ -3635,12 +3636,8 @@
addstate_here(thislist, t->state->out1->out, &t->sub,
&listidx);
}
- else
- {
- /* continue with next input char */
- reginput = old_reginput;
- }
break;
+ }
case NFA_BOL:
if (reginput == regline)