From c26f7c60532a37a2bf0a5e69aa81081b440dfc38 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 20 Aug 2018 22:53:04 +0200 Subject: [PATCH] patch 8.1.0303: line2byte() is wrong for last line with 'noeol' Problem: line2byte() is wrong for last line with 'noeol' and 'nofixeol'. Solution: Fix off-by-one error. (Shane Harper, closes #3351) --- src/memline.c | 2 +- src/testdir/test_functions.vim | 12 +++++++++++- src/version.c | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/memline.c b/src/memline.c index a2f0b4f62..fb262acef 100644 --- a/src/memline.c +++ b/src/memline.c @@ -5267,7 +5267,7 @@ ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp) /* Don't count the last line break if 'noeol' and ('bin' or * 'nofixeol'). */ if ((!buf->b_p_fixeol || buf->b_p_bin) && !buf->b_p_eol - && buf->b_ml.ml_line_count == lnum) + && lnum > buf->b_ml.ml_line_count) size -= ffdos + 1; } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 13db0041e..848e7986c 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -682,6 +682,7 @@ endfunc func Test_byte2line_line2byte() new + set endofline call setline(1, ['a', 'bc', 'd']) set fileformat=unix @@ -702,7 +703,16 @@ func Test_byte2line_line2byte() call assert_equal([-1, -1, 1, 4, 8, 11, -1], \ map(range(-1, 5), 'line2byte(v:val)')) - set fileformat& + bw! + set noendofline nofixendofline + normal a- + for ff in ["unix", "mac", "dos"] + let &fileformat = ff + call assert_equal(1, line2byte(1)) + call assert_equal(2, line2byte(2)) " line2byte(line("$") + 1) is the buffer size plus one (as per :help line2byte). + endfor + + set endofline& fixendofline& fileformat& bw! endfunc diff --git a/src/version.c b/src/version.c index 42a81ccfa..d382ff316 100644 --- a/src/version.c +++ b/src/version.c @@ -794,6 +794,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 303, /**/ 302, /**/ -- 2.40.0