summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-04-05 14:00:32 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-05 14:00:32 +0100
commit72bb10df1fb3eb69bc91f5babfb8881ce098cba1 (patch)
treee2f392f6e2c6567e6686027b70021ed6a862d723
parent0f68e6c07aaf62c034a242f183b93c1bb44e7f93 (diff)
downloadvim-git-72bb10df1fb3eb69bc91f5babfb8881ce098cba1.tar.gz
patch 8.2.4693: new regexp does not accept pattern "\%>0v"v8.2.4693
Problem: new regexp does not accept pattern "\%>0v". Solution: Do accept digit zero.
-rw-r--r--src/regexp_bt.c5
-rw-r--r--src/regexp_nfa.c4
-rw-r--r--src/testdir/test_regexp_latin.vim15
-rw-r--r--src/version.c2
4 files changed, 23 insertions, 3 deletions
diff --git a/src/regexp_bt.c b/src/regexp_bt.c
index 0b3487fa0..18bad8054 100644
--- a/src/regexp_bt.c
+++ b/src/regexp_bt.c
@@ -1617,6 +1617,7 @@ regatom(int *flagp)
long_u n = 0;
int cmp;
int cur = FALSE;
+ int got_digit = FALSE;
cmp = c;
if (cmp == '<' || cmp == '>')
@@ -1628,6 +1629,7 @@ regatom(int *flagp)
}
while (VIM_ISDIGIT(c))
{
+ got_digit = TRUE;
n = n * 10 + (c - '0');
c = getchr();
}
@@ -1645,7 +1647,8 @@ regatom(int *flagp)
}
break;
}
- else if (c == 'l' || c == 'c' || c == 'v')
+ else if ((c == 'l' || c == 'c' || c == 'v')
+ && (cur || got_digit))
{
if (cur && n)
{
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index d658a6bd7..2c79a49e4 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1640,6 +1640,7 @@ nfa_regatom(void)
long_u n = 0;
int cmp = c;
int cur = FALSE;
+ int got_digit = FALSE;
if (c == '<' || c == '>')
c = getchr();
@@ -1668,12 +1669,13 @@ nfa_regatom(void)
}
n = tmp;
c = getchr();
+ got_digit = TRUE;
}
if (c == 'l' || c == 'c' || c == 'v')
{
long_u limit = INT_MAX;
- if (!cur && n == 0)
+ if (!cur && !got_digit)
{
semsg(_(e_nfa_regexp_missing_value_in_chr),
no_Magic(c));
diff --git a/src/testdir/test_regexp_latin.vim b/src/testdir/test_regexp_latin.vim
index dfb367b5f..0b288f69f 100644
--- a/src/testdir/test_regexp_latin.vim
+++ b/src/testdir/test_regexp_latin.vim
@@ -91,16 +91,29 @@ func Test_multi_failure()
set re=0
endfunc
-func Test_column_failure()
+func Test_column_success_failure()
+ new
+ call setline(1, 'xbar')
+
set re=1
+ %s/\%>0v./A/
+ call assert_equal('Abar', getline(1))
call assert_fails('/\%v', 'E71:')
+ call assert_fails('/\%>v', 'E71:')
call assert_fails('/\%c', 'E71:')
+ call assert_fails('/\%<c', 'E71:')
call assert_fails('/\%l', 'E71:')
set re=2
+ %s/\%>0v./B/
+ call assert_equal('Bbar', getline(1))
call assert_fails('/\%v', 'E1273:')
+ call assert_fails('/\%>v', 'E1273:')
call assert_fails('/\%c', 'E1273:')
+ call assert_fails('/\%<c', 'E1273:')
call assert_fails('/\%l', 'E1273:')
+
set re=0
+ bwipe!
endfunc
func Test_recursive_addstate()
diff --git a/src/version.c b/src/version.c
index 4451f7d91..203b9472b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4693,
+/**/
4692,
/**/
4691,