in wfn/fsb.go [126:166]
func addSlashesAt(s string, at int) (string, int, error) {
b := make([]byte, 0, len(s)*2) // assume a quote for every character
embedded := false
i := at
for ; i < len(s) && s[i] != ':'; i++ {
c := s[i]
if unicode.IsLetter(rune(c)) || unicode.IsDigit(rune(c)) || c == '_' {
b = append(b, c)
embedded = true
continue
}
switch c {
case '\\':
i++
if i == len(s) {
return "", i, fmt.Errorf("unquoted '\\' at the end of the FSB fragment: %q", s)
}
b = append(b, c, s[i])
embedded = true
case '*':
// An unquoted asterisk must appear at the beginning or end of the string
if i != at && i != len(s)-1 && s[i+1] != ':' {
return Any, i, fmt.Errorf("unquoted '*' inside the FSB fragment: %q", s)
}
b = append(b, c)
embedded = true
case '?':
if !(i == at || i == len(s)-1 || s[i+1] == ':' || // at the beginning or at the end of the string
(!embedded && i > 0 && s[i-1] == c || // not embedded and preceded by the same symbol
(embedded && s[i+1] == c))) { // embedded and followed by the same symbol
return Any, i, fmt.Errorf("unquoted '?' inside the FSB fragment %q (%t, %d)", s, embedded, i)
}
b = append(b, c)
embedded = false
default:
b = append(b, '\\', c)
embedded = true
}
}
return string(append([]byte{}, b...)), i, nil
}