2
0
mirror of https://github.com/junegunn/fzf synced 2024-11-02 21:40:34 +00:00

Fix panic when pattern occurs after 2^15-th column

Fix #666
This commit is contained in:
Junegunn Choi 2016-09-21 01:15:06 +09:00
parent 37f43fbb35
commit 791076d366
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
2 changed files with 18 additions and 7 deletions

View File

@ -257,13 +257,14 @@ func FuzzyMatchV2(caseSensitive bool, forward bool, input util.Chars, pattern []
} }
// Reuse pre-allocated integer slice to avoid unnecessary sweeping of garbages // Reuse pre-allocated integer slice to avoid unnecessary sweeping of garbages
offset := 0 offset16 := 0
offset32 := 0
// Bonus point for each position // Bonus point for each position
offset, B := alloc16(offset, slab, N, false) offset16, B := alloc16(offset16, slab, N, false)
// The first occurrence of each character in the pattern // The first occurrence of each character in the pattern
offset, F := alloc16(offset, slab, M, false) offset32, F := alloc32(offset32, slab, M, false)
// Rune array // Rune array
_, T := alloc32(0, slab, N, false) offset32, T := alloc32(offset32, slab, N, false)
// Phase 1. Check if there's a match and calculate bonus for each point // Phase 1. Check if there's a match and calculate bonus for each point
pidx, lastIdx, prevClass := 0, 0, charNonWord pidx, lastIdx, prevClass := 0, 0, charNonWord
@ -291,7 +292,7 @@ func FuzzyMatchV2(caseSensitive bool, forward bool, input util.Chars, pattern []
if pidx < M { if pidx < M {
if char == pattern[pidx] { if char == pattern[pidx] {
lastIdx = idx lastIdx = idx
F[pidx] = int16(idx) F[pidx] = int32(idx)
pidx++ pidx++
} }
} else { } else {
@ -307,10 +308,10 @@ func FuzzyMatchV2(caseSensitive bool, forward bool, input util.Chars, pattern []
// Phase 2. Fill in score matrix (H) // Phase 2. Fill in score matrix (H)
// Unlike the original algorithm, we do not allow omission. // Unlike the original algorithm, we do not allow omission.
width := lastIdx - int(F[0]) + 1 width := lastIdx - int(F[0]) + 1
offset, H := alloc16(offset, slab, width*M, false) offset16, H := alloc16(offset16, slab, width*M, false)
// Possible length of consecutive chunk at each position. // Possible length of consecutive chunk at each position.
offset, C := alloc16(offset, slab, width*M, false) offset16, C := alloc16(offset16, slab, width*M, false)
maxScore, maxScorePos := int16(0), 0 maxScore, maxScorePos := int16(0), 0
for i := 0; i < M; i++ { for i := 0; i < M; i++ {

View File

@ -1,6 +1,7 @@
package algo package algo
import ( import (
"math"
"sort" "sort"
"strings" "strings"
"testing" "testing"
@ -154,3 +155,12 @@ func TestEmptyPattern(t *testing.T) {
assertMatch(t, SuffixMatch, true, dir, "foobar", "", 6, 6, 0) assertMatch(t, SuffixMatch, true, dir, "foobar", "", 6, 6, 0)
} }
} }
func TestLongString(t *testing.T) {
bytes := make([]byte, math.MaxUint16*2)
for i := range bytes {
bytes[i] = 'x'
}
bytes[math.MaxUint16] = 'z'
assertMatch(t, FuzzyMatchV2, true, true, string(bytes), "zx", math.MaxUint16, math.MaxUint16+2, scoreMatch*2+bonusConsecutive)
}