Mercurial > vim
diff src/regexp_nfa.c @ 20772:097f5b5c907b v8.2.0938
patch 8.2.0938: NFA regexp uses tolower ()to compare ignore-case
Commit: https://github.com/vim/vim/commit/59de417b904bbd204e313f015839317b577bd124
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jun 9 19:34:54 2020 +0200
patch 8.2.0938: NFA regexp uses tolower ()to compare ignore-case
Problem: NFA regexp uses tolower() to compare ignore-case. (Thayne McCombs)
Solution: Use utf_fold() when possible. (ref. neovim https://github.com/vim/vim/issues/12456)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 09 Jun 2020 19:45:03 +0200 |
parents | ab0dc036f586 |
children | 9064044fd4f6 |
line wrap: on
line diff
--- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -5459,7 +5459,7 @@ find_match_text(colnr_T startcol, int re { c1 = PTR2CHAR(match_text + len1); c2 = PTR2CHAR(rex.line + col + len2); - if (c1 != c2 && (!rex.reg_ic || MB_TOLOWER(c1) != MB_TOLOWER(c2))) + if (c1 != c2 && (!rex.reg_ic || MB_CASEFOLD(c1) != MB_CASEFOLD(c2))) { match = FALSE; break; @@ -6271,11 +6271,11 @@ nfa_regmatch( } if (rex.reg_ic) { - int curc_low = MB_TOLOWER(curc); + int curc_low = MB_CASEFOLD(curc); int done = FALSE; for ( ; c1 <= c2; ++c1) - if (MB_TOLOWER(c1) == curc_low) + if (MB_CASEFOLD(c1) == curc_low) { result = result_if_matched; done = TRUE; @@ -6287,8 +6287,8 @@ nfa_regmatch( } else if (state->c < 0 ? check_char_class(state->c, curc) : (curc == state->c - || (rex.reg_ic && MB_TOLOWER(curc) - == MB_TOLOWER(state->c)))) + || (rex.reg_ic && MB_CASEFOLD(curc) + == MB_CASEFOLD(state->c)))) { result = result_if_matched; break; @@ -6713,7 +6713,7 @@ nfa_regmatch( result = (c == curc); if (!result && rex.reg_ic) - result = MB_TOLOWER(c) == MB_TOLOWER(curc); + result = MB_CASEFOLD(c) == MB_CASEFOLD(curc); // If rex.reg_icombine is not set only skip over the character // itself. When it is set skip over composing characters. if (result && enc_utf8 && !rex.reg_icombine) @@ -6882,7 +6882,7 @@ nfa_regmatch( // cheaper than adding a state that won't match. c = PTR2CHAR(rex.input + clen); if (c != prog->regstart && (!rex.reg_ic - || MB_TOLOWER(c) != MB_TOLOWER(prog->regstart))) + || MB_CASEFOLD(c) != MB_CASEFOLD(prog->regstart))) { #ifdef ENABLE_LOG fprintf(log_fd, " Skipping start state, regstart does not match\n");