To: vim_dev@googlegroups.com Subject: Patch 8.2.4029 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4029 Problem: Debugging NFA regexp my crash, cached indent may be wrong. Solution: Fix some debug warnings in the NFA regexp code. Make sure log_fd is set when used. Fix breakindent and indent caching. (Christian Brabandt, closes #9482) Files: src/indent.c, src/optionstr.c, src/regexp_nfa.c *** ../vim-8.2.4028/src/indent.c 2022-01-01 14:19:44.044353848 +0000 --- src/indent.c 2022-01-07 16:48:21.717837465 +0000 *************** *** 915,927 **** win_T *wp, char_u *line) // start of the line { ! static int prev_indent = 0; // cached indent value ! static long prev_ts = 0L; // cached tabstop value ! static char_u *prev_line = NULL; // cached pointer to line static varnumber_T prev_tick = 0; // changedtick of cached value # ifdef FEAT_VARTABS ! static int *prev_vts = NULL; // cached vartabs values # endif int bri = 0; // window width minus window margin space, i.e. what rests for text const int eff_wwidth = wp->w_width --- 915,929 ---- win_T *wp, char_u *line) // start of the line { ! static int prev_indent = 0; // cached indent value ! static long prev_ts = 0L; // cached tabstop value ! static char_u *prev_line = NULL; // cached pointer to line static varnumber_T prev_tick = 0; // changedtick of cached value # ifdef FEAT_VARTABS ! static int *prev_vts = NULL; // cached vartabs values # endif + static int prev_list = 0; // cached list value + static int prev_listopt = 0; // cached w_p_briopt_list value int bri = 0; // window width minus window margin space, i.e. what rests for text const int eff_wwidth = wp->w_width *************** *** 929,937 **** && (vim_strchr(p_cpo, CPO_NUMCOL) == NULL) ? number_width(wp) + 1 : 0); ! // used cached indent, unless pointer or 'tabstop' changed if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts || prev_tick != CHANGEDTICK(wp->w_buffer) # ifdef FEAT_VARTABS || prev_vts != wp->w_buffer->b_p_vts_array # endif --- 931,940 ---- && (vim_strchr(p_cpo, CPO_NUMCOL) == NULL) ? number_width(wp) + 1 : 0); ! // used cached indent, unless line, 'tabstop' or briopt_list changed if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts || prev_tick != CHANGEDTICK(wp->w_buffer) + || prev_listopt != wp->w_briopt_list # ifdef FEAT_VARTABS || prev_vts != wp->w_buffer->b_p_vts_array # endif *************** *** 949,954 **** --- 952,979 ---- prev_indent = get_indent_str(line, (int)wp->w_buffer->b_p_ts, wp->w_p_list); # endif + prev_listopt = wp->w_briopt_list; + // add additional indent for numbered lists + if (wp->w_briopt_list != 0) + { + regmatch_T regmatch; + + regmatch.regprog = vim_regcomp(curbuf->b_p_flp, + RE_MAGIC + RE_STRING + RE_AUTO + RE_STRICT); + + if (regmatch.regprog != NULL) + { + regmatch.rm_ic = FALSE; + if (vim_regexec(®match, line, 0)) + { + if (wp->w_briopt_list > 0) + prev_list = wp->w_briopt_list; + else + prev_list = (*regmatch.endp - *regmatch.startp); + } + vim_regfree(regmatch.regprog); + } + } } bri = prev_indent + wp->w_briopt_shift; *************** *** 958,979 **** // add additional indent for numbered lists if (wp->w_briopt_list != 0) { ! regmatch_T regmatch; ! ! regmatch.regprog = vim_regcomp(curbuf->b_p_flp, ! RE_MAGIC + RE_STRING + RE_AUTO + RE_STRICT); ! if (regmatch.regprog != NULL) ! { ! regmatch.rm_ic = FALSE; ! if (vim_regexec(®match, line, 0)) ! { ! if (wp->w_briopt_list > 0) ! bri += wp->w_briopt_list; ! else ! bri = (*regmatch.endp - *regmatch.startp); ! } ! vim_regfree(regmatch.regprog); ! } } // indent minus the length of the showbreak string --- 983,992 ---- // add additional indent for numbered lists if (wp->w_briopt_list != 0) { ! if (wp->w_briopt_list > 0) ! bri += prev_list; ! else ! bri = prev_list; } // indent minus the length of the showbreak string *** ../vim-8.2.4028/src/optionstr.c 2022-01-05 20:24:34.276005641 +0000 --- src/optionstr.c 2022-01-07 16:48:21.717837465 +0000 *************** *** 756,761 **** --- 756,764 ---- { if (briopt_check(curwin) == FAIL) errmsg = e_invalid_argument; + // list setting requires a redraw + if (curwin->w_briopt_list) + redraw_all_later(NOT_VALID); } #endif *************** *** 2610,2615 **** --- 2613,2626 ---- update_package_paths_in_lua(); #endif + #if defined(FEAT_LINEBREAK) + // Changing Formatlistpattern when briopt includes the list setting: + // redraw + if ((varp == &p_flp || varp == &(curbuf->b_p_flp)) + && curwin->w_briopt_list) + redraw_all_later(NOT_VALID); + #endif + if (curwin->w_curswant != MAXCOL && (get_option_flags(opt_idx) & (P_CURSWANT | P_RALL)) != 0) curwin->w_set_curswant = TRUE; *** ../vim-8.2.4028/src/regexp_nfa.c 2022-01-05 20:24:34.276005641 +0000 --- src/regexp_nfa.c 2022-01-07 16:53:54.976703867 +0000 *************** *** 2885,2891 **** char_u save[2]; STRNCPY(save, &p[last], 2); ! STRNCPY(&p[last], "+-", 2); fprintf(debugf, " %s", p); STRNCPY(&p[last], save, 2); } --- 2885,2891 ---- char_u save[2]; STRNCPY(save, &p[last], 2); ! memcpy(&p[last], "+-", 2); fprintf(debugf, " %s", p); STRNCPY(&p[last], save, 2); } *************** *** 4292,4297 **** --- 4292,4314 ---- #ifdef ENABLE_LOG static void + open_debug_log(int result) + { + log_fd = fopen(NFA_REGEXP_RUN_LOG, "a"); + if (log_fd == NULL) + { + emsg(_(e_log_open_failed)); + log_fd = stderr; + } + + fprintf(log_fd, "****************************\n"); + fprintf(log_fd, "FINISHED RUNNING nfa_regmatch() recursively\n"); + fprintf(log_fd, "MATCH = %s\n", result == TRUE ? "OK" : result == MAYBE + ? "MAYBE" : "FALSE"); + fprintf(log_fd, "****************************\n"); + } + + static void report_state(char *action, regsub_T *sub, nfa_state_T *state, *************** *** 4307,4312 **** --- 4324,4332 ---- else col = (int)(sub->list.line[0].start - rex.line); nfa_set_code(state->c); + if (log_fd == NULL) + open_debug_log(MAYBE); + fprintf(log_fd, "> %s state %d to list %d. char %d: %s (start col %d)%s\n", action, abs(state->id), lid, state->c, code, col, pim_info(pim)); *************** *** 5430,5448 **** nfa_endp = save_nfa_endp; #ifdef ENABLE_LOG ! log_fd = fopen(NFA_REGEXP_RUN_LOG, "a"); ! if (log_fd != NULL) ! { ! fprintf(log_fd, "****************************\n"); ! fprintf(log_fd, "FINISHED RUNNING nfa_regmatch() recursively\n"); ! fprintf(log_fd, "MATCH = %s\n", result == TRUE ? "OK" : "FALSE"); ! fprintf(log_fd, "****************************\n"); ! } ! else ! { ! emsg(_(e_log_open_failed)); ! log_fd = stderr; ! } #endif return result; --- 5450,5456 ---- nfa_endp = save_nfa_endp; #ifdef ENABLE_LOG ! open_debug_log(result); #endif return result; *************** *** 5775,5793 **** #ifdef ENABLE_LOG log_fd = fopen(NFA_REGEXP_RUN_LOG, "a"); ! if (log_fd != NULL) ! { ! fprintf(log_fd, "**********************************\n"); ! nfa_set_code(start->c); ! fprintf(log_fd, " RUNNING nfa_regmatch() starting with state %d, code %s\n", ! abs(start->id), code); ! fprintf(log_fd, "**********************************\n"); ! } ! else { emsg(_(e_log_open_failed)); log_fd = stderr; } #endif thislist = &list[0]; --- 5783,5798 ---- #ifdef ENABLE_LOG log_fd = fopen(NFA_REGEXP_RUN_LOG, "a"); ! if (log_fd == NULL) { emsg(_(e_log_open_failed)); log_fd = stderr; } + fprintf(log_fd, "**********************************\n"); + nfa_set_code(start->c); + fprintf(log_fd, " RUNNING nfa_regmatch() starting with state %d, code %s\n", + abs(start->id), code); + fprintf(log_fd, "**********************************\n"); #endif thislist = &list[0]; *************** *** 6919,6925 **** #ifdef DEBUG if (c < 0) ! siemsg("INTERNAL: Negative state char: %ld", c); #endif result = (c == curc); --- 6924,6930 ---- #ifdef DEBUG if (c < 0) ! siemsg("INTERNAL: Negative state char: %ld", (long)c); #endif result = (c == curc); *** ../vim-8.2.4028/src/version.c 2022-01-07 15:45:13.495500428 +0000 --- src/version.c 2022-01-07 16:50:36.125358099 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4029, /**/ -- hundred-and-one symptoms of being an internet addict: 246. You use up your free 1 Gbyte in two days. /// 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 ///