To: vim_dev@googlegroups.com Subject: Patch 8.1.2269 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- 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 ///