]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1395: search_stat not reset when pattern differs in case v9.1.1395
authorChristian Brabandt <cb@256bit.org>
Fri, 16 May 2025 17:38:50 +0000 (19:38 +0200)
committerChristian Brabandt <cb@256bit.org>
Fri, 16 May 2025 17:38:50 +0000 (19:38 +0200)
Problem:  search_stat not reset when pattern differs in case
          (tahzibijafar)
Solution: use STRNCMP instead of MB_STRNICMP macro

There was a long standing todo comment, that using MB_STRNICMP is wrong.
So let's change it to STRNCMP() instead. Even if it not handle
multi-byte characters correctly, then Vim will rather recompute the
search stat, instead of re-using the old (and possibly wrong) value.

fixes: #17312
closes: #17314

Signed-off-by: Christian Brabandt <cb@256bit.org>
src/search.c
src/testdir/test_search_stat.vim
src/version.c

index ea7e65492e22ffed3200275e2bc5cdf867b3cd4a..14990e2a21bc37caef70164b2c119bdc142f3fb9 100644 (file)
@@ -3291,12 +3291,9 @@ update_search_stat(
               || (dirc == '/' && LT_POS(p, lastpos)));
 
     // If anything relevant changed the count has to be recomputed.
-    // MB_STRNICMP ignores case, but we should not ignore case.
-    // Unfortunately, there is no MB_STRNICMP function.
-    // XXX: above comment should be "no MB_STRCMP function" ?
     if (!(chgtick == CHANGEDTICK(curbuf)
        && (lastpat != NULL
-           && MB_STRNICMP(lastpat, spats[last_idx].pat, lastpatlen) == 0
+           && STRNCMP(lastpat, spats[last_idx].pat, lastpatlen) == 0
            && lastpatlen == spats[last_idx].patlen
        )
        && EQUAL_POS(lastpos, *cursor_pos)
index b57b7ba7b09312a4f3a13214be7a322df59c464e..c8e055d7db14ac1d7d5c33090a609b11d3b1ca90 100644 (file)
@@ -459,4 +459,23 @@ func Test_search_stat_backwards()
   call StopVimInTerminal(buf)
 endfunc
 
+func Test_search_stat_smartcase_ignorecase()
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+    set shm-=S ignorecase smartcase
+    call setline(1, [' MainmainmainmmmainmAin', ''])
+  END
+  call writefile(lines, 'Xsearchstat_ignorecase', '5')
+
+  let buf = RunVimInTerminal('-S Xsearchstat_ignorecase', #{rows: 10})
+  call term_sendkeys(buf, "/main\<cr>nnnn")
+  call WaitForAssert({-> assert_match('\[5\/5\]', term_getline(buf, 10))}, 1000)
+
+  call term_sendkeys(buf, "/mAin\<cr>")
+  call WaitForAssert({-> assert_match('\[1\/1\]', term_getline(buf, 10))}, 1000)
+
+  call StopVimInTerminal(buf)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 4e856703556d76a145469bf6b7ddf3ba5cd0de5d..e367036ea2bbcfcfd5e008f4972d57fdb610acdc 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1395,
 /**/
     1394,
 /**/