65 lines
988 B
Go
65 lines
988 B
Go
package treerack
|
|
|
|
func runesContain(rs []rune, r rune) bool {
|
|
for _, ri := range rs {
|
|
if ri == r {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func unescapeChar(c rune) rune {
|
|
switch c {
|
|
case 'n':
|
|
return '\n'
|
|
case 't':
|
|
return '\t'
|
|
case 'b':
|
|
return '\b'
|
|
case 'f':
|
|
return '\f'
|
|
case 'r':
|
|
return '\r'
|
|
case 'v':
|
|
return '\v'
|
|
default:
|
|
return c
|
|
}
|
|
}
|
|
|
|
func unescape(escape rune, banned []rune, chars []rune) ([]rune, error) {
|
|
var (
|
|
unescaped []rune
|
|
escaped bool
|
|
)
|
|
|
|
for _, ci := range chars {
|
|
if escaped {
|
|
unescaped = append(unescaped, unescapeChar(ci))
|
|
escaped = false
|
|
continue
|
|
}
|
|
|
|
switch {
|
|
case ci == escape:
|
|
escaped = true
|
|
case runesContain(banned, ci):
|
|
return nil, ErrInvalidEscapeCharacter
|
|
default:
|
|
unescaped = append(unescaped, ci)
|
|
}
|
|
}
|
|
|
|
if escaped {
|
|
return nil, ErrInvalidEscapeCharacter
|
|
}
|
|
|
|
return unescaped, nil
|
|
}
|
|
|
|
func unescapeCharSequence(s string) ([]rune, error) {
|
|
return unescape('\\', []rune{'"', '\\'}, []rune(s))
|
|
}
|