0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

updated for version 7.4.184

Problem:    match() does not work properly with a {count} argument.
Solution:   Compute the length once and update it.  Quit the loop when at the
            end. (Hirohito Higashi)
This commit is contained in:
Bram Moolenaar
2014-02-22 22:18:47 +01:00
parent c86438205b
commit 9feaf6206f
4 changed files with 87 additions and 2 deletions

View File

@@ -13905,6 +13905,7 @@ find_some_match(argvars, rettv, type)
int type;
{
char_u *str = NULL;
long len = 0;
char_u *expr = NULL;
char_u *pat;
regmatch_T regmatch;
@@ -13944,7 +13945,10 @@ find_some_match(argvars, rettv, type)
li = l->lv_first;
}
else
{
expr = str = get_tv_string(&argvars[0]);
len = (long)STRLEN(str);
}
pat = get_tv_string_buf_chk(&argvars[1], patbuf);
if (pat == NULL)
@@ -13968,7 +13972,7 @@ find_some_match(argvars, rettv, type)
{
if (start < 0)
start = 0;
if (start > (long)STRLEN(str))
if (start > len)
goto theend;
/* When "count" argument is there ignore matches before "start",
* otherwise skip part of the string. Differs when pattern is "^"
@@ -13976,7 +13980,10 @@ find_some_match(argvars, rettv, type)
if (argvars[3].v_type != VAR_UNKNOWN)
startcol = start;
else
{
str += start;
len -= start;
}
}
if (argvars[3].v_type != VAR_UNKNOWN)
@@ -14026,6 +14033,12 @@ find_some_match(argvars, rettv, type)
#else
startcol = (colnr_T)(regmatch.startp[0] + 1 - str);
#endif
if (startcol > (colnr_T)len
|| str + startcol <= regmatch.startp[0])
{
match = FALSE;
break;
}
}
}

View File

@@ -4,6 +4,8 @@ Note that the end-of-line moves the cursor to the next test line.
Also test match() and matchstr()
Also test the gn command and repeating it.
STARTTEST
:so small.vim
/^start:/
@@ -28,6 +30,28 @@ fXdat
:put =matchstr(\"abcd\", \".\", 0, -1) " a
:put =match(\"abcd\", \".\", 0, 5) " -1
:put =match(\"abcd\", \".\", 0, -1) " 0
:put =match('abc', '.', 0, 1) " 0
:put =match('abc', '.', 0, 2) " 1
:put =match('abc', '.', 0, 3) " 2
:put =match('abc', '.', 0, 4) " -1
:put =match('abc', '.', 1, 1) " 1
:put =match('abc', '.', 2, 1) " 2
:put =match('abc', '.', 3, 1) " -1
:put =match('abc', '$', 0, 1) " 3
:put =match('abc', '$', 0, 2) " -1
:put =match('abc', '$', 1, 1) " 3
:put =match('abc', '$', 2, 1) " 3
:put =match('abc', '$', 3, 1) " 3
:put =match('abc', '$', 4, 1) " -1
:put =match('abc', '\zs', 0, 1) " 0
:put =match('abc', '\zs', 0, 2) " 1
:put =match('abc', '\zs', 0, 3) " 2
:put =match('abc', '\zs', 0, 4) " 3
:put =match('abc', '\zs', 0, 5) " -1
:put =match('abc', '\zs', 1, 1) " 1
:put =match('abc', '\zs', 2, 1) " 2
:put =match('abc', '\zs', 3, 1) " 3
:put =match('abc', '\zs', 4, 1) " -1
/^foobar
gncsearchmatch/one\_s*two\_s
:1
@@ -49,6 +73,12 @@ cgnj
:" Make sure there is no other match y uppercase.
/x59
gggnd
:" test repeating dgn
/^Johnny
ggdgn.
:" test repeating gUgn
/^Depp
gggUgn.
:/^start:/,/^end:/wq! test.out
ENDTEST
@@ -81,4 +111,13 @@ for (i=0; i<=10; i++)
Y
text
Y
--1
Johnny
--2
Johnny
--3
Depp
--4
Depp
--5
end:

View File

@@ -18,6 +18,28 @@ c
a
-1
0
0
1
2
-1
1
2
-1
3
-1
3
3
3
-1
0
1
2
3
-1
1
2
3
-1
SEARCH:
searchmatch
abcdx | | abcdx
@@ -30,4 +52,13 @@ for (j=0; i<=10; i++)
text
Y
--1
--2
--3
DEPP
--4
DEPP
--5
end:

View File

@@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
184,
/**/
183,
/**/