To: vim_dev@googlegroups.com Subject: Patch 9.0.0951 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0951 (after 9.0.0950) Problem: Trying every character position for a match is inefficient. Solution: Use the start position of the match ignoring "\zs". Files: src/regexp_nfa.c, src/regexp_bt.c, src/regexp.c, src/regexp.h *** ../vim-9.0.0950/src/regexp_nfa.c 2022-11-25 21:13:43.179753030 +0000 --- src/regexp_nfa.c 2022-11-26 11:34:01.830736656 +0000 *************** *** 7378,7384 **** // If match_text is set it contains the full text that must match. // Nothing else to try. Doesn't handle combining chars well. if (prog->match_text != NULL && !rex.reg_icombine) ! return find_match_text(col, prog->regstart, prog->match_text); } // If the start column is past the maximum column: no need to try. --- 7378,7391 ---- // If match_text is set it contains the full text that must match. // Nothing else to try. Doesn't handle combining chars well. if (prog->match_text != NULL && !rex.reg_icombine) ! { ! retval = find_match_text(col, prog->regstart, prog->match_text); ! if (REG_MULTI) ! rex.reg_mmatch->rmm_matchcol = col; ! else ! rex.reg_match->rm_matchcol = col; ! return retval; ! } } // If the start column is past the maximum column: no need to try. *************** *** 7414,7424 **** --- 7421,7439 ---- if (end->lnum < start->lnum || (end->lnum == start->lnum && end->col < start->col)) rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + + // startpos[0] may be set by "\zs", also return the column where + // the whole pattern matched. + rex.reg_mmatch->rmm_matchcol = col; } else { if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) rex.reg_match->endp[0] = rex.reg_match->startp[0]; + + // startpos[0] may be set by "\zs", also return the column where + // the whole pattern matched. + rex.reg_match->rm_matchcol = col; } } *** ../vim-9.0.0950/src/regexp_bt.c 2022-09-08 12:17:02.006342437 +0100 --- src/regexp_bt.c 2022-11-26 11:31:11.470918625 +0000 *************** *** 4842,4852 **** static long bt_regexec_both( char_u *line, ! colnr_T col, // column to start looking for match int *timed_out) // flag set on timeout or NULL { bt_regprog_T *prog; char_u *s; long retval = 0L; // Create "regstack" and "backpos" if they are not allocated yet. --- 4842,4853 ---- static long bt_regexec_both( char_u *line, ! colnr_T startcol, // column to start looking for match int *timed_out) // flag set on timeout or NULL { bt_regprog_T *prog; char_u *s; + colnr_T col = startcol; long retval = 0L; // Create "regstack" and "backpos" if they are not allocated yet. *************** *** 5042,5052 **** --- 5043,5061 ---- if (end->lnum < start->lnum || (end->lnum == start->lnum && end->col < start->col)) rex.reg_mmatch->endpos[0] = rex.reg_mmatch->startpos[0]; + + // startpos[0] may be set by "\zs", also return the column where + // the whole pattern matched. + rex.reg_mmatch->rmm_matchcol = col; } else { if (rex.reg_match->endp[0] < rex.reg_match->startp[0]) rex.reg_match->endp[0] = rex.reg_match->startp[0]; + + // startpos[0] may be set by "\zs", also return the column where + // the whole pattern matched. + rex.reg_match->rm_matchcol = col; } } *** ../vim-9.0.0950/src/regexp.c 2022-11-25 21:13:43.179753030 +0000 --- src/regexp.c 2022-11-26 11:03:52.706186807 +0000 *************** *** 1123,1132 **** --- 1123,1134 ---- typedef struct { regmatch_T *reg_match; regmmatch_T *reg_mmatch; + char_u **reg_startp; char_u **reg_endp; lpos_T *reg_startpos; lpos_T *reg_endpos; + win_T *reg_win; buf_T *reg_buf; linenr_T reg_firstlnum; *** ../vim-9.0.0950/src/regexp.h 2022-06-05 13:46:55.000000000 +0100 --- src/regexp.h 2022-11-26 11:04:44.769964495 +0000 *************** *** 133,138 **** --- 133,140 ---- regprog_T *regprog; char_u *startp[NSUBEXP]; char_u *endp[NSUBEXP]; + + colnr_T rm_matchcol; // match start without "\zs" int rm_ic; } regmatch_T; *************** *** 149,154 **** --- 151,158 ---- regprog_T *regprog; lpos_T startpos[NSUBEXP]; lpos_T endpos[NSUBEXP]; + + colnr_T rmm_matchcol; // match start without "\zs" int rmm_ic; colnr_T rmm_maxcol; // when not zero: maximum column } regmmatch_T; *** ../vim-9.0.0950/src/version.c 2022-11-25 21:13:43.183753030 +0000 --- src/version.c 2022-11-26 10:55:17.186345279 +0000 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 951, /**/ -- hundred-and-one symptoms of being an internet addict: 145. You e-mail your boss, informing him you'll be late. /// 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 ///