func addSlashesAt()

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
}