vim-patch:9.0.0951: trying every character position for a match is inefficient (#21198)

Problem:    Trying every character position for a match is inefficient.
Solution:   Use the start position of the match ignoring "\zs".

01105b37a1

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2022-11-26 21:28:47 +08:00
committed by GitHub
parent 84465a8c15
commit 7e9981d246
4 changed files with 32 additions and 3 deletions

View File

@@ -4930,15 +4930,16 @@ static long regtry(bt_regprog_T *prog, colnr_T col, proftime_T *tm, int *timed_o
/// Match a regexp against a string ("line" points to the string) or multiple
/// lines (if "line" is NULL, use reg_getline()).
///
/// @param col column to start search
/// @param startcol column to start looking for match
/// @param tm timeout limit or NULL
/// @param timed_out flag set on timeout or NULL
///
/// @return 0 for failure, or number of lines contained in the match.
static long bt_regexec_both(char_u *line, colnr_T col, proftime_T *tm, int *timed_out)
static long bt_regexec_both(char_u *line, colnr_T startcol, proftime_T *tm, int *timed_out)
{
bt_regprog_T *prog;
char_u *s;
colnr_T col = startcol;
long retval = 0L;
// Create "regstack" and "backpos" if they are not allocated yet.
@@ -5113,10 +5114,18 @@ theend:
|| (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;
}
}