From: Bram Moolenaar Date: Sat, 22 Feb 2014 21:18:47 +0000 (+0100) Subject: updated for version 7.4.184 X-Git-Tag: v7.4.184 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9feaf6206f73b367f3167ffff927c1a5d2d90954;p=vim 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) --- 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; + } } } diff --git a/src/testdir/test53.in b/src/testdir/test53.in index 47cf6f562..011c9ae39 100644 --- a/src/testdir/test53.in +++ b/src/testdir/test53.in @@ -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: diff --git a/src/testdir/test53.ok b/src/testdir/test53.ok index e469869ab..d7ffa6bc5 100644 --- a/src/testdir/test53.ok +++ b/src/testdir/test53.ok @@ -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: diff --git a/src/version.c b/src/version.c index 9f37a7489..40deff6da 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 184, /**/ 183, /**/