To: vim_dev@googlegroups.com Subject: Patch 8.2.3410 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3410 Problem: Crash with linebreak, listchars and large tabstop. Solution: Account for different size listchars for a tab. (closes #8841) Files: src/drawline.c, src/testdir/test_listlbr_utf8.vim *** ../vim-8.2.3409/src/drawline.c 2021-08-31 20:57:51.193860845 +0200 --- src/drawline.c 2021-09-07 20:44:19.204314055 +0200 *************** *** 2109,2163 **** int i; int saved_nextra = n_extra; ! #ifdef FEAT_CONCEAL if (vcol_off > 0) // there are characters to conceal tab_len += vcol_off; // boguscols before FIX_FOR_BOGUSCOLS macro from above if (wp->w_p_list && wp->w_lcs_chars.tab1 && old_boguscols > 0 && n_extra > tab_len) tab_len += n_extra - tab_len; ! #endif ! ! // if n_extra > 0, it gives the number of chars, to // use for a tab, else we need to calculate the width ! // for a tab len = (tab_len * mb_char2len(wp->w_lcs_chars.tab2)); if (n_extra > 0) len += n_extra - tab_len; c = wp->w_lcs_chars.tab1; p = alloc(len + 1); ! vim_memset(p, ' ', len); ! p[len] = NUL; ! vim_free(p_extra_free); ! p_extra_free = p; ! for (i = 0; i < tab_len; i++) { ! int lcs = wp->w_lcs_chars.tab2; ! ! if (*p == NUL) { ! tab_len = i; ! break; ! } ! // if tab3 is given, need to change the char ! // for tab ! if (wp->w_lcs_chars.tab3 && i == tab_len - 1) ! lcs = wp->w_lcs_chars.tab3; ! mb_char2bytes(lcs, p); ! p += mb_char2len(lcs); ! n_extra += mb_char2len(lcs) - (saved_nextra > 0 ? 1 : 0); } - p_extra = p_extra_free; - #ifdef FEAT_CONCEAL - // n_extra will be increased by FIX_FOX_BOGUSCOLS - // macro below, so need to adjust for that here - if (vcol_off > 0) - n_extra -= vcol_off; - #endif } #endif #ifdef FEAT_CONCEAL --- 2109,2168 ---- int i; int saved_nextra = n_extra; ! # ifdef FEAT_CONCEAL if (vcol_off > 0) // there are characters to conceal tab_len += vcol_off; + // boguscols before FIX_FOR_BOGUSCOLS macro from above if (wp->w_p_list && wp->w_lcs_chars.tab1 && old_boguscols > 0 && n_extra > tab_len) tab_len += n_extra - tab_len; ! # endif ! // If n_extra > 0, it gives the number of chars, to // use for a tab, else we need to calculate the width ! // for a tab. len = (tab_len * mb_char2len(wp->w_lcs_chars.tab2)); + if (wp->w_lcs_chars.tab3) + len += mb_char2len(wp->w_lcs_chars.tab3); if (n_extra > 0) len += n_extra - tab_len; c = wp->w_lcs_chars.tab1; p = alloc(len + 1); ! if (p == NULL) ! n_extra = 0; ! else { ! vim_memset(p, ' ', len); ! p[len] = NUL; ! vim_free(p_extra_free); ! p_extra_free = p; ! for (i = 0; i < tab_len; i++) { ! int lcs = wp->w_lcs_chars.tab2; ! if (*p == NUL) ! { ! tab_len = i; ! break; ! } ! ! // if tab3 is given, use it for the last char ! if (wp->w_lcs_chars.tab3 && i == tab_len - 1) ! lcs = wp->w_lcs_chars.tab3; ! p += mb_char2bytes(lcs, p); ! n_extra += mb_char2len(lcs) - (saved_nextra > 0 ? 1 : 0); + } + p_extra = p_extra_free; + # ifdef FEAT_CONCEAL + // n_extra will be increased by FIX_FOX_BOGUSCOLS + // macro below, so need to adjust for that here + if (vcol_off > 0) + n_extra -= vcol_off; + # endif } } #endif #ifdef FEAT_CONCEAL *** ../vim-8.2.3409/src/testdir/test_listlbr_utf8.vim 2020-08-12 18:50:31.879655802 +0200 --- src/testdir/test_listlbr_utf8.vim 2021-09-07 20:41:48.852648856 +0200 *************** *** 70,75 **** --- 70,85 ---- call s:close_windows() endfunc + " this was causing a crash + func Test_linebreak_with_list_and_tabs() + set linebreak list listchars=tab:⇤\ ⇥ tabstop=100 + new + call setline(1, "\t\t\ttext") + redraw + bwipe! + set nolinebreak nolist listchars&vim tabstop=8 + endfunc + func Test_linebreak_with_nolist() call s:test_windows('setl nolist') call setline(1, "\t*mask = nil;") *** ../vim-8.2.3409/src/version.c 2021-09-07 19:26:46.114706317 +0200 --- src/version.c 2021-09-07 20:42:56.164499501 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3410, /**/ -- A)bort, R)etry, P)lease don't bother me again /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///