diff options
author | Hinidu <hinidu@gmail.com> | 2014-04-04 21:00:51 +0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-04-08 13:36:16 -0300 |
commit | f826b4c616961450307b2a88763b0b48dfa44524 (patch) | |
tree | f9c0956f568c9dea6f451e712bf254b222e8c855 | |
parent | 10f899e8e716a7d3c484cf295b962869b7dc3bb6 (diff) | |
download | rneovim-f826b4c616961450307b2a88763b0b48dfa44524.tar.gz rneovim-f826b4c616961450307b2a88763b0b48dfa44524.tar.bz2 rneovim-f826b4c616961450307b2a88763b0b48dfa44524.zip |
vim-patch: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)
https://code.google.com/p/vim/source/detail?r=9ac2fc63501d3eff92446c03b2822b30b169db5a
-rw-r--r-- | src/eval.c | 15 | ||||
-rw-r--r-- | src/testdir/test53.in | 39 | ||||
-rw-r--r-- | src/testdir/test53.ok | 31 | ||||
-rw-r--r-- | src/version.c | 3 |
4 files changed, 85 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c index dd4b233a2f..802012758a 100644 --- a/src/eval.c +++ b/src/eval.c @@ -11465,6 +11465,7 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int start); static void find_some_match(typval_T *argvars, typval_T *rettv, int type) { char_u *str = NULL; + long len = 0; char_u *expr = NULL; char_u *pat; regmatch_T regmatch; @@ -11498,8 +11499,10 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int type) if ((l = argvars[0].vval.v_list) == NULL) goto theend; li = l->lv_first; - } else + } else { expr = str = get_tv_string(&argvars[0]); + len = (long)STRLEN(str); + } pat = get_tv_string_buf_chk(&argvars[1], patbuf); if (pat == NULL) @@ -11519,15 +11522,17 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int type) } else { 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 "^" * or "\<". */ if (argvars[3].v_type != VAR_UNKNOWN) startcol = start; - else + else { str += start; + len -= start; + } } if (argvars[3].v_type != VAR_UNKNOWN) @@ -11566,6 +11571,10 @@ static void find_some_match(typval_T *argvars, typval_T *rettv, int type) } else { startcol = (colnr_T)(regmatch.startp[0] + (*mb_ptr2len)(regmatch.startp[0]) - str); + 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 47cf6f562f..011c9ae39d 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 e469869abb..d7ffa6bc51 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 092c295b82..15e1517a17 100644 --- a/src/version.c +++ b/src/version.c @@ -202,6 +202,9 @@ static char *(features[]) = { static int included_patches[] = { // Add new patch number below this line + 184, + //183, + //182, 181, //180, //179, |