vim-patch:8.2.1599: missing line end when skipping a long line with :cgetfile

Problem:    Missing line end when skipping a long line with :cgetfile.
Solution:   Fix off-by-one error. (closes vim/vim#6870)
59941cbd80
This commit is contained in:
Jan Edmund Lazo
2020-10-06 23:14:41 -04:00
parent 4a6e201e37
commit 670a577c6b
2 changed files with 19 additions and 1 deletions

View File

@@ -808,7 +808,7 @@ retry:
}
break;
}
if (STRLEN(IObuff) < IOSIZE - 1 || IObuff[IOSIZE - 1] == '\n') {
if (STRLEN(IObuff) < IOSIZE - 1 || IObuff[IOSIZE - 2] == '\n') {
break;
}
}

View File

@@ -1597,6 +1597,24 @@ func Test_long_lines()
call s:long_lines_tests('l')
endfunc
func Test_cgetfile_on_long_lines()
" Problematic values if the line is longer than 4096 bytes. Then 1024 bytes
" are read at a time.
for len in [4078, 4079, 4080, 5102, 5103, 5104, 6126, 6127, 6128, 7150, 7151, 7152]
let lines = [
\ '/tmp/file1:1:1:aaa',
\ '/tmp/file2:1:1:%s',
\ '/tmp/file3:1:1:bbb',
\ '/tmp/file4:1:1:ccc',
\ ]
let lines[1] = substitute(lines[1], '%s', repeat('x', len), '')
call writefile(lines, 'Xcqetfile.txt')
cgetfile Xcqetfile.txt
call assert_equal(4, getqflist(#{size: v:true}).size, 'with length ' .. len)
endfor
call delete('Xcqetfile.txt')
endfunc
func s:create_test_file(filename)
let l = []
for i in range(1, 20)