Patch 8.1.2269
Problem: Tags file with very long line stops using binary search.
Solution: Reallocate the buffer if needed.
Files: src/tag.c, src/testdir/test_tagjump.vim
*** ../vim-8.1.2268/src/tag.c 2019-10-18 20:53:30.697741631 +0200
--- src/tag.c 2019-11-07 23:06:28.181634266 +0100
***************
*** 1937,1943 ****
*/
else if (state == TS_SKIP_BACK)
{
! search_info.curr_offset -= LSIZE * 2;
if (search_info.curr_offset < 0)
{
search_info.curr_offset = 0;
--- 1937,1943 ----
*/
else if (state == TS_SKIP_BACK)
{
! search_info.curr_offset -= lbuf_size * 2;
if (search_info.curr_offset < 0)
{
search_info.curr_offset = 0;
***************
*** 1955,1961 ****
/* Adjust the search file offset to the correct position */
search_info.curr_offset_used = search_info.curr_offset;
vim_fseek(fp, search_info.curr_offset, SEEK_SET);
! eof = vim_fgets(lbuf, LSIZE, fp);
if (!eof && search_info.curr_offset != 0)
{
/* The explicit cast is to work around a bug in gcc 3.4.2
--- 1955,1961 ----
/* Adjust the search file offset to the correct position */
search_info.curr_offset_used = search_info.curr_offset;
vim_fseek(fp, search_info.curr_offset, SEEK_SET);
! eof = vim_fgets(lbuf, lbuf_size, fp);
if (!eof && search_info.curr_offset != 0)
{
/* The explicit cast is to work around a bug in gcc 3.4.2
***************
*** 1967,1979 ****
vim_fseek(fp, search_info.low_offset, SEEK_SET);
search_info.curr_offset = search_info.low_offset;
}
! eof = vim_fgets(lbuf, LSIZE, fp);
}
/* skip empty and blank lines */
while (!eof && vim_isblankline(lbuf))
{
search_info.curr_offset = vim_ftell(fp);
! eof = vim_fgets(lbuf, LSIZE, fp);
}
if (eof)
{
--- 1967,1979 ----
vim_fseek(fp, search_info.low_offset, SEEK_SET);
search_info.curr_offset = search_info.low_offset;
}
! eof = vim_fgets(lbuf, lbuf_size, fp);
}
/* skip empty and blank lines */
while (!eof && vim_isblankline(lbuf))
{
search_info.curr_offset = vim_ftell(fp);
! eof = vim_fgets(lbuf, lbuf_size, fp);
}
if (eof)
{
***************
*** 1996,2005 ****
{
#ifdef FEAT_CSCOPE
if (use_cscope)
! eof = cs_fgets(lbuf, LSIZE);
else
#endif
! eof = vim_fgets(lbuf, LSIZE, fp);
} while (!eof && vim_isblankline(lbuf));
if (eof)
--- 1996,2005 ----
{
#ifdef FEAT_CSCOPE
if (use_cscope)
! eof = cs_fgets(lbuf, lbuf_size);
else
#endif
! eof = vim_fgets(lbuf, lbuf_size, fp);
} while (!eof && vim_isblankline(lbuf));
if (eof)
***************
*** 2230,2257 ****
// When the line is too long the NUL will not be in the
// last-but-one byte (see vim_fgets()).
// Has been reported for Mozilla JS with extremely long names.
! // In that case we can't parse it and we ignore the line.
! if (lbuf[LSIZE - 2] != NUL
#ifdef FEAT_CSCOPE
&& !use_cscope
#endif
)
{
! if (p_verbose >= 5)
! {
! verbose_enter();
! msg(_("Ignoring long line in tags file"));
! verbose_leave();
! }
! #ifdef FEAT_TAG_BINS
! if (state != TS_LINEAR)
! {
! // Avoid getting stuck.
! linear = TRUE;
! state = TS_LINEAR;
! vim_fseek(fp, search_info.low_offset, SEEK_SET);
! }
! #endif
continue;
}
--- 2230,2250 ----
// When the line is too long the NUL will not be in the
// last-but-one byte (see vim_fgets()).
// Has been reported for Mozilla JS with extremely long names.
! // In that case we need to increase lbuf_size.
! if (lbuf[lbuf_size - 2] != NUL
#ifdef FEAT_CSCOPE
&& !use_cscope
#endif
)
{
! lbuf_size *= 2;
! vim_free(lbuf);
! lbuf = alloc(lbuf_size);
! if (lbuf == NULL)
! goto findtag_end;
! // this will try the same thing again, make sure the offset is
! // different
! search_info.curr_offset = 0;
continue;
}
***************
*** 3367,3372 ****
--- 3360,3367 ----
break;
#endif
*pbuf_end++ = *str++;
+ if (pbuf_end - pbuf + 1 >= LSIZE)
+ break;
}
*pbuf_end = NUL;
*** ../vim-8.1.2268/src/testdir/test_tagjump.vim 2019-10-12
20:17:24.605773312 +0200
--- src/testdir/test_tagjump.vim 2019-11-07 22:57:01.051787724 +0100
***************
*** 459,465 ****
call assert_report(v:exception)
catch /.*/
endtry
! call assert_equal('Ignoring long line in tags file',
split(execute('messages'), '\n')[-1])
call writefile([
\
'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
django/contrib/admin/templates/admin/edit_inline/stacked.html 16;" j
line:16 language:HTML'
\ ], 'Xtags')
--- 459,466 ----
call assert_report(v:exception)
catch /.*/
endtry
! call assert_equal('Searching tags file Xtags', split(execute('messages'),
'\n')[-1])
!
call writefile([
\
'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
django/contrib/admin/templates/admin/edit_inline/stacked.html 16;" j
line:16 language:HTML'
\ ], 'Xtags')
***************
*** 470,477 ****
call assert_report(v:exception)
catch /.*/
endtry
! call assert_equal('Ignoring long line in tags file',
split(execute('messages'), '\n')[-1])
call delete('Xtags')
set tags&
let &verbose = old_vbs
endfunc
--- 471,496 ----
call assert_report(v:exception)
catch /.*/
endtry
! call assert_equal('Searching tags file Xtags', split(execute('messages'),
'\n')[-1])
!
! " binary search works in file with long line
! call writefile([
! \ 'asdfasfd nowhere 16',
! \ 'foobar Xsomewhere 3; "
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567',
! \ 'zasdfasfd nowhere 16',
! \ ], 'Xtags')
! call writefile([
! \ 'one',
! \ 'two',
! \ 'trhee',
! \ 'four',
! \ ], 'Xsomewhere')
! tag foobar
! call assert_equal('Xsomewhere', expand('%'))
! call assert_equal(3, getcurpos()[1])
!
call delete('Xtags')
+ call delete('Xsomewhere')
set tags&
let &verbose = old_vbs
endfunc
*** ../vim-8.1.2268/src/version.c 2019-11-07 20:48:38.729213691 +0100
--- src/version.c 2019-11-07 22:25:55.118872708 +0100
***************
*** 743,744 ****
--- 743,746 ----
{ /* Add new patch number below this line */
+ /**/
+ 2269,
/**/
--
Never overestimate a man's ability to underestimate a woman.
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/201911072209.xA7M9VlU011760%40masaka.moolenaar.net.