changeset 4615:5679b8ddd8cc v7.3.1055

updated for version 7.3.1055 Problem: Negated collection does not match newline. Solution: Handle newline differently. (Hiroshi Shirosaki)
author Bram Moolenaar <bram@vim.org>
date Thu, 30 May 2013 11:51:08 +0200
parents 560c247794b8
children e8bc429ce5fc
files src/regexp_nfa.c src/testdir/test64.in src/testdir/test64.ok src/version.c
diffstat 4 files changed, 21 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1203,13 +1203,6 @@ collection:
 		}
 		mb_ptr_adv(regparse);
 
-		if (extra == ADD_NL)	    /* \_[] also matches \n */
-		{
-		    EMIT(reg_string ? NL : NFA_NEWL);
-		    TRY_NEG();
-		    EMIT_GLUE();
-		}
-
 		/* skip the trailing ] */
 		regparse = endp;
 		mb_ptr_adv(regparse);
@@ -1219,6 +1212,14 @@ collection:
 		    EMIT(NFA_END_NEG_RANGE);
 		    EMIT(NFA_CONCAT);
 		}
+
+		/* \_[] also matches \n but it's not negated */
+		if (extra == ADD_NL)
+		{
+		    EMIT(reg_string ? NL : NFA_NEWL);
+		    EMIT(NFA_OR);
+		}
+
 		return OK;
 	    } /* if exists closing ] */
 
--- a/src/testdir/test64.in
+++ b/src/testdir/test64.in
@@ -344,9 +344,13 @@ STARTTEST
 :call add(tl, [0, '\(<<\)\@1<=span.', 'xxspanxxxx<spanxx<<spanyyy'])
 :call add(tl, [0, '\(<<\)\@2<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
 :"
+:"""" "\_" prepended negated collection matches EOL
+:call add(tl, [2, '\_[^8-9]\+', "asfi\n9888", "asfi\n"])
+:call add(tl, [2, '\_[^a]\+', "asfi\n9888", "sfi\n9888"])
+:"
+:"
 :"""" Run the tests
 :"
-:"
 :for t in tl
 :  let re = t[0]
 :  let pat = t[1]
--- a/src/testdir/test64.ok
+++ b/src/testdir/test64.ok
@@ -731,6 +731,12 @@ OK 0 - \(<<\)\@1<=span.
 OK 1 - \(<<\)\@1<=span.
 OK 0 - \(<<\)\@2<=span.
 OK 1 - \(<<\)\@2<=span.
+OK 0 - \_[^8-9]\+
+OK 1 - \_[^8-9]\+
+OK 2 - \_[^8-9]\+
+OK 0 - \_[^a]\+
+OK 1 - \_[^a]\+
+OK 2 - \_[^a]\+
 192.168.0.1
 192.168.0.1
 192.168.0.1
--- 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 */
 /**/
+    1055,
+/**/
     1054,
 /**/
     1053,