in pattern/search_pattern.go [22:74]
func WildcardMatch(pattern, text string, caseInsensitive bool) bool {
patternLen := len(pattern)
textLen := len(text)
if patternLen == 0 {
return textLen == 0
}
if pattern == "*" {
return true
}
if caseInsensitive {
pattern = strings.ToLower(pattern)
text = strings.ToLower(text)
}
i := 0
p := 0
iStar := textLen
pStar := 0
for i < textLen {
if p < patternLen {
switch pattern[p] {
case text[i]:
i++
p++
continue
case '?':
i++
p++
continue
case '*':
iStar = i
pStar = p
p++
continue
}
}
if iStar == textLen {
return false
}
iStar++
i = iStar
p = pStar + 1
}
for p < patternLen && pattern[p] == '*' {
p++
}
return p == patternLen && i == textLen
}