changeset 8021:b6b4f354df23 v7.4.1305

commit https://github.com/vim/vim/commit/7c29f387819b5817b003d2ba73e2b5cf3cb3d0dd Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 12 19:08:15 2016 +0100 patch 7.4.1305 Problem: "\%1l^#.*" does not match on a line starting with "#". Solution: Do not clear the start-of-line flag. (Christian Brabandt)
author Christian Brabandt <cb@256bit.org>
date Fri, 12 Feb 2016 19:15:05 +0100
parents 7250994a8654
children 795f511dc6c3
files src/regexp.c src/regexp_nfa.c src/testdir/test36.in src/testdir/test36.ok src/version.c
diffstat 5 files changed, 22 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -1500,6 +1500,10 @@ vim_regcomp_had_eol(void)
 }
 #endif
 
+/* variables for parsing reginput */
+static int	at_start;	/* True when on the first character */
+static int	prev_at_start;  /* True when on the second character */
+
 /*
  * Parse regular expression, i.e. main body or parenthesized thing.
  *
@@ -1918,6 +1922,7 @@ regatom(int *flagp)
     int		    c;
     char_u	    *p;
     int		    extra = 0;
+    int		    save_prev_at_start = prev_at_start;
 
     *flagp = WORST;		/* Tentatively. */
 
@@ -2331,7 +2336,11 @@ regatom(int *flagp)
 			      else if (c == 'l' || c == 'c' || c == 'v')
 			      {
 				  if (c == 'l')
+				  {
 				      ret = regnode(RE_LNUM);
+				      if (save_prev_at_start)
+					  at_start = TRUE;
+				  }
 				  else if (c == 'c')
 				      ret = regnode(RE_COL);
 				  else
@@ -2946,10 +2955,6 @@ regoptail(char_u *p, char_u *val)
 /*
  * Functions for getting characters from the regexp input.
  */
-
-static int	at_start;	/* True when on the first character */
-static int	prev_at_start;  /* True when on the second character */
-
 /*
  * Start parsing at "str".
  */
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1128,6 +1128,7 @@ nfa_regatom(void)
     int		startc = -1;
     int		endc = -1;
     int		oldstartc = -1;
+    int		save_prev_at_start = prev_at_start;
 
     c = getchr();
     switch (c)
@@ -1467,9 +1468,13 @@ nfa_regatom(void)
 			if (c == 'l' || c == 'c' || c == 'v')
 			{
 			    if (c == 'l')
+			    {
 				/* \%{n}l  \%{n}<l  \%{n}>l  */
 				EMIT(cmp == '<' ? NFA_LNUM_LT :
 				     cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
+				if (save_prev_at_start)
+				    at_start = TRUE;
+			    }
 			    else if (c == 'c')
 				/* \%{n}c  \%{n}<c  \%{n}>c  */
 				EMIT(cmp == '<' ? NFA_COL_LT :
--- a/src/testdir/test36.in
+++ b/src/testdir/test36.in
@@ -98,6 +98,9 @@ p:s/\%#=2\U//g
 p:s/\%#=0[^A-Z]//g
 p:s/\%#=1[^A-Z]//g
 p:s/\%#=2[^A-Z]//g
+p:s/\%#=0\%204l^\t...//g
+p:s/\%#=1\%205l^\t...//g
+p:s/\%#=2\%206l^\t...//g
 :/^start-here/+1,$wq! test.out
 ENDTEST
 
--- a/src/testdir/test36.ok
+++ b/src/testdir/test36.ok
@@ -94,3 +94,6 @@ ABCDEFGHIXYZ
 ABCDEFGHIXYZ
 ABCDEFGHIXYZ
 ABCDEFGHIXYZ
+!"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
+!"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
+!"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
--- a/src/version.c
+++ b/src/version.c
@@ -748,6 +748,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1305,
+/**/
     1304,
 /**/
     1303,