package stringutil // FindUnquoted returns the indexes of the instance of v in s, or empty slice if v is not present in s. // It ignores v present inside quoted runs. func FindUnquoted(s string, v rune, quote rune) []int { escaped := false quoted := false indexes := make([]int, 0) quotedIndexes := make([]int, 0) for i := 0; i < len(s); i++ { switch rune(s[i]) { case escape: escaped = !escaped // escape can escape itself. case quote: if escaped { escaped = false continue } quoted = !quoted if !quoted { quotedIndexes = quotedIndexes[:0] // drop possible indices inside quoted segment } case v: escaped = false if quoted { quotedIndexes = append(quotedIndexes, i) } else { indexes = append(indexes, i) } default: escaped = false } } return append(indexes, quotedIndexes...) }