To: vim-dev@vim.org
Subject: Patch 7.1.258
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 7.1.258
Problem: Crash when doing "d/\n/e" and 'virtualedit' is "all". (Andy Wokula)
Solution: Avoid that the column becomes negative. Also fixes other problems
with the end of a pattern match is in column zero. (A.Politz)
Files: src/search.c
*** ../vim-7.1.257/src/search.c Sat Jan 26 21:15:00 2008
--- src/search.c Wed Feb 20 13:22:23 2008
***************
*** 624,630 ****
#ifdef FEAT_EVAL
submatch = first_submatch(®match);
#endif
! /* Line me be past end of buffer for "\n\zs". */
if (lnum + matchpos.lnum > buf->b_ml.ml_line_count)
ptr = (char_u *)"";
else
--- 624,630 ----
#ifdef FEAT_EVAL
submatch = first_submatch(®match);
#endif
! /* "lnum" may be past end of buffer for "\n\zs". */
if (lnum + matchpos.lnum > buf->b_ml.ml_line_count)
ptr = (char_u *)"";
else
***************
*** 833,853 ****
continue;
}
! if (options & SEARCH_END && !(options & SEARCH_NOOF))
{
pos->lnum = lnum + endpos.lnum;
! pos->col = endpos.col - 1;
! #ifdef FEAT_MBYTE
! if (has_mbyte)
{
! /* 'e' offset may put us just below the last line */
! if (pos->lnum > buf->b_ml.ml_line_count)
! ptr = (char_u *)"";
! else
! ptr = ml_get_buf(buf, pos->lnum, FALSE);
! pos->col -= (*mb_head_off)(ptr, ptr + pos->col);
}
#endif
}
else
{
--- 833,870 ----
continue;
}
! /* With the SEARCH_END option move to the last character
! * of the match. Don't do it for an empty match, end
! * should be same as start then. */
! if (options & SEARCH_END && !(options & SEARCH_NOOF)
! && !(matchpos.lnum == endpos.lnum
! && matchpos.col == endpos.col))
{
+ /* For a match in the first column, set the position
+ * on the NUL in the previous line. */
pos->lnum = lnum + endpos.lnum;
! pos->col = endpos.col;
! if (endpos.col == 0)
{
! if (pos->lnum > 1) /* just in case */
! {
! --pos->lnum;
! pos->col = (colnr_T)STRLEN(ml_get_buf(buf,
! pos->lnum, FALSE));
! }
}
+ else
+ {
+ --pos->col;
+ #ifdef FEAT_MBYTE
+ if (has_mbyte
+ && pos->lnum <= buf->b_ml.ml_line_count)
+ {
+ ptr = ml_get_buf(buf, pos->lnum, FALSE);
+ pos->col -= (*mb_head_off)(ptr, ptr + pos->col);
+ }
#endif
+ }
}
else
{
*** ../vim-7.1.257/src/version.c Wed Feb 20 12:43:05 2008
--- src/version.c Wed Feb 20 13:37:32 2008
***************
*** 668,669 ****
--- 668,671 ----
{ /* Add new patch number below this line */
+ /**/
+ 258,
/**/
--
Micro$oft: where do you want to go today?
Linux: where do you want to go tomorrow?
FreeBSD: are you guys coming, or what?
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute -- http://www.A-A-P.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///