To: vim_dev@googlegroups.com
Subject: Patch 7.4.184
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
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)
Files: src/eval.c, src/testdir/test53.in, src/testdir/test53.ok
*** ../vim-7.4.183/src/eval.c 2014-02-05 22:13:02.366556787 +0100
--- src/eval.c 2014-02-22 22:13:26.644906020 +0100
***************
*** 8014,8020 ****
{"log10", 1, 1, f_log10},
#endif
#ifdef FEAT_LUA
! {"luaeval", 1, 2, f_luaeval},
#endif
{"map", 2, 2, f_map},
{"maparg", 1, 4, f_maparg},
--- 8014,8020 ----
{"log10", 1, 1, f_log10},
#endif
#ifdef FEAT_LUA
! {"luaeval", 1, 2, f_luaeval},
#endif
{"map", 2, 2, f_map},
{"maparg", 1, 4, f_maparg},
***************
*** 13905,13910 ****
--- 13905,13911 ----
int type;
{
char_u *str = NULL;
+ long len = 0;
char_u *expr = NULL;
char_u *pat;
regmatch_T regmatch;
***************
*** 13944,13950 ****
--- 13945,13954 ----
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,13974 ****
{
if (start < 0)
start = 0;
! if (start > (long)STRLEN(str))
goto theend;
/* When "count" argument is there ignore matches before "start",
* otherwise skip part of the string. Differs when pattern is "^"
--- 13972,13978 ----
{
if (start < 0)
start = 0;
! 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,13982 ****
--- 13980,13989 ----
if (argvars[3].v_type != VAR_UNKNOWN)
startcol = start;
else
+ {
str += start;
+ len -= start;
+ }
}
if (argvars[3].v_type != VAR_UNKNOWN)
***************
*** 14026,14031 ****
--- 14033,14044 ----
#else
startcol = (colnr_T)(regmatch.startp[0] + 1 - str);
#endif
+ if (startcol > (colnr_T)len
+ || str + startcol <= regmatch.startp[0])
+ {
+ match = FALSE;
+ break;
+ }
}
}
*** ../vim-7.4.183/src/testdir/test53.in 2013-10-02 21:54:57.000000000 +0200
--- src/testdir/test53.in 2014-02-22 22:08:24.260906501 +0100
***************
*** 4,9 ****
--- 4,11 ----
Also test match() and matchstr()
+ Also test the gn command and repeating it.
+
STARTTEST
:so small.vim
/^start:/
***************
*** 28,33 ****
--- 30,57 ----
: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,54 ****
--- 73,84 ----
:" 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,84 ****
--- 111,123 ----
Y
text
Y
+ --1
+ Johnny
+ --2
+ Johnny
+ --3
+ Depp
+ --4
+ Depp
+ --5
end:
*** ../vim-7.4.183/src/testdir/test53.ok 2013-10-02 21:54:57.000000000 +0200
--- src/testdir/test53.ok 2014-02-22 22:08:24.264906501 +0100
***************
*** 18,23 ****
--- 18,45 ----
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,33 ****
--- 52,64 ----
text
Y
+ --1
+
+ --2
+
+ --3
+ DEPP
+ --4
+ DEPP
+ --5
end:
*** ../vim-7.4.183/src/version.c 2014-02-15 19:47:46.685882910 +0100
--- src/version.c 2014-02-22 22:10:49.604906270 +0100
***************
*** 740,741 ****
--- 740,743 ----
{ /* Add new patch number below this line */
+ /**/
+ 184,
/**/
--
WOMAN: I didn't know we had a king. I thought we were an autonomous
collective.
DENNIS: You're fooling yourself. We're living in a dictatorship. A
self-perpetuating autocracy in which the working classes--
WOMAN: Oh there you go, bringing class into it again.
DENNIS: That's what it's all about if only people would--
The Quest for the Holy Grail (Monty Python)
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///