changeset 4669:2d15582e132f v7.3.1082

updated for version 7.3.1082 Problem: New regexp engine: Problem with \@= matching. Solution: Save and restore nfa_match.
author Bram Moolenaar <bram@vim.org>
date Fri, 31 May 2013 21:45:09 +0200
parents aed971d62627
children 053beb7bf8ba
files src/regexp_nfa.c src/testdir/test64.in src/testdir/test64.ok src/version.c
diffstat 4 files changed, 23 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -3332,11 +3332,8 @@ nfa_regmatch(start, submatch, m)
     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 @@ nfa_regmatch(start, submatch, m)
 		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 @@ nfa_regmatch(start, submatch, m)
 		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 @@ nfa_regmatch(start, submatch, m)
 		{
 		    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 @@ nfa_regmatch(start, submatch, m)
 		    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)
--- a/src/testdir/test64.in
+++ b/src/testdir/test64.in
@@ -305,6 +305,7 @@ STARTTEST
 :call add(tl, [2, '\v(abc)@=..', 'xabcd', 'ab', 'abc'])
 :call add(tl, [2, '\(.*John\)\@=.*Bob', 'here is John, and here is B'])
 :call add(tl, [2, '\(John.*\)\@=.*Bob', 'John is Bobs friend', 'John is Bob', 'John is Bobs friend'])
+:call add(tl, [2, '\<\S\+\())\)\@=', '$((i=i+1))', 'i=i+1', '))'])
 :call add(tl, [2, '.*John\&.*Bob', 'here is John, and here is B'])
 :call add(tl, [2, '.*John\&.*Bob', 'John is Bobs friend', 'John is Bob'])
 :call add(tl, [2, '\v(test1)@=.*yep', 'this is a test1, yep it is', 'test1, yep', 'test1'])
--- a/src/testdir/test64.ok
+++ b/src/testdir/test64.ok
@@ -669,6 +669,9 @@ OK 2 - \(.*John\)\@=.*Bob
 OK 0 - \(John.*\)\@=.*Bob
 OK 1 - \(John.*\)\@=.*Bob
 OK 2 - \(John.*\)\@=.*Bob
+OK 0 - \<\S\+\())\)\@=
+OK 1 - \<\S\+\())\)\@=
+OK 2 - \<\S\+\())\)\@=
 OK 0 - .*John\&.*Bob
 OK 1 - .*John\&.*Bob
 OK 2 - .*John\&.*Bob
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1082,
+/**/
     1081,
 /**/
     1080,