summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-02-12 19:08:15 +0100
committerBram Moolenaar <Bram@vim.org>2016-02-12 19:08:15 +0100
commit7c29f387819b5817b003d2ba73e2b5cf3cb3d0dd (patch)
treedddf01998f1273012d96d067bbd92828606da23c
parent7823a3bd2eed6ff9e544d201de96710bd5344aaf (diff)
downloadvim-7c29f387819b5817b003d2ba73e2b5cf3cb3d0dd.zip
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)
-rw-r--r--src/regexp.c13
-rw-r--r--src/regexp_nfa.c5
-rw-r--r--src/testdir/test36.in3
-rw-r--r--src/testdir/test36.ok3
-rw-r--r--src/version.c2
5 files changed, 22 insertions, 4 deletions
diff --git a/src/regexp.c b/src/regexp.c
index a07c6f411..9ed5c7570 100644
--- 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".
*/
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index 8bcf3bc41..865d67fdf 100644
--- 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 :
diff --git a/src/testdir/test36.in b/src/testdir/test36.in
index 8cdb5262b..5e8ce4484 100644
--- 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
diff --git a/src/testdir/test36.ok b/src/testdir/test36.ok
index f72a74b2b..df21ed1c5 100644
--- 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{|}~€‚›¦±¼ÇÓé
diff --git a/src/version.c b/src/version.c
index 625e3b054..b73ad024c 100644
--- 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,