]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1445: negative matchfuzzy scores although there is a match v9.1.1445
authorGirish Palya <girishji@gmail.com>
Mon, 9 Jun 2025 18:43:03 +0000 (20:43 +0200)
committerChristian Brabandt <cb@256bit.org>
Mon, 9 Jun 2025 18:43:03 +0000 (20:43 +0200)
Problem:  negative matchfuzzy scores although there is a match
          (Maxim Kim)
Solution: reset the score if a match has been found but the score is
          negative (Girish Palya)

The fuzzy algorithm may miss some matches in long strings due to recursion
limits. As a result, the score can end up negative even when matches exist.
In such cases, reset the score to ensure it is non-negative.

fixes: ##17449
closes: #17469

Signed-off-by: Girish Palya <girishji@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/search.c
src/testdir/test_matchfuzzy.vim
src/version.c

index 14990e2a21bc37caef70164b2c119bdc142f3fb9..425d0d3b5ee4c9c4ddb2d6637fb9b6c62f2b8c8e 100644 (file)
@@ -4413,6 +4413,10 @@ fuzzy_match_compute_score(
     // Apply unmatched penalty
     unmatched = strSz - numMatches;
     score += UNMATCHED_LETTER_PENALTY * unmatched;
+    // In a long string, not all matches may be found due to the recursion limit.
+    // If at least one match is found, reset the score to a non-negative value.
+    if (score < 0 && numMatches > 0)
+       score = 0;
 
     // Apply ordering bonuses
     for (i = 0; i < numMatches; ++i)
index 7e35d3547681b9bd32b1c04d0515010fa46d729e..a16bae5ee32821b56257a16ca9bedd8ae2ea1e63 100644 (file)
@@ -125,7 +125,7 @@ func Test_matchfuzzypos()
   call assert_equal([[], [], []], matchfuzzypos([], 'abc'))
 
   " match in a long string
-  call assert_equal([[repeat('x', 300) .. 'abc'], [[300, 301, 302]], [-60]],
+  call assert_equal([[repeat('x', 300) .. 'abc'], [[300, 301, 302]], [155]],
         \ matchfuzzypos([repeat('x', 300) .. 'abc'], 'abc'))
 
   " preference for camel case match
@@ -258,7 +258,7 @@ func Test_matchfuzzypos_mbyte()
   call assert_equal([[], [], []], ['세 마리의 작은 돼지', '마리의', '마리의 작은', '작은 돼지']->matchfuzzypos('파란 하늘'))
 
   " match in a long string
-  call assert_equal([[repeat('ぶ', 300) .. 'ẼẼẼ'], [[300, 301, 302]], [-110]],
+  call assert_equal([[repeat('ぶ', 300) .. 'ẼẼẼ'], [[300, 301, 302]], [105]],
         \ matchfuzzypos([repeat('ぶ', 300) .. 'ẼẼẼ'], 'ẼẼẼ'))
   " preference for camel case match
   call assert_equal([['xѳѵҁxxѳѴҁ'], [[6, 7, 8]], [219]], matchfuzzypos(['xѳѵҁxxѳѴҁ'], 'ѳѵҁ'))
index ec8c923a03de3038d61aefe3370c0b13e91bd5d1..2b14b155526992cb330a1f09d56b812e70b7ada8 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1445,
 /**/
     1444,
 /**/