summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-02-22 22:18:47 +0100
committerBram Moolenaar <Bram@vim.org>2014-02-22 22:18:47 +0100
commit9feaf6206f73b367f3167ffff927c1a5d2d90954 (patch)
treef010ea22782640430d332511a97adb7ee8865520 /src/eval.c
parentc86438205ba1d7b5ecadaa700c7f9943fdaf9838 (diff)
downloadvim-9feaf6206f73b367f3167ffff927c1a5d2d90954.zip
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)
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/eval.c b/src/eval.c
index 65a947bbd..80fc33706 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -8014,7 +8014,7 @@ static struct fst
{"log10", 1, 1, f_log10},
#endif
#ifdef FEAT_LUA
- {"luaeval", 1, 2, f_luaeval},
+ {"luaeval", 1, 2, f_luaeval},
#endif
{"map", 2, 2, f_map},
{"maparg", 1, 4, f_maparg},
@@ -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;
+ }
}
}