in wfn/matching.go [348:388]
func matchStr(s, t string) Relation {
escaped := false
matchesAs := Equal
idx := 0
for ; idx < len(t); idx++ {
if idx >= len(s) {
return Disjoint
}
if !escaped && s[idx] == '*' {
if idx == len(s)-1 {
return Superset
}
for i := idx; i < len(t); i++ {
if matchStr(s[idx+1:], t[i:]) != Disjoint {
return Superset
}
}
return Disjoint
}
if (escaped || s[idx] != '?') && s[idx] != t[idx] {
return Disjoint
} else if !escaped && s[idx] == '?' {
matchesAs = Superset
}
if s[idx] == '\\' {
escaped = !escaped
} else {
escaped = false
}
}
for ; idx < len(s); idx++ {
if s[idx] != '*' {
return Disjoint
}
}
if len(s) > len(t) {
return Superset
}
return matchesAs
}