From 278a4952b91a4a28bbe25e4dc96e68fe203a9dc1 Mon Sep 17 00:00:00 2001 From: Arpad Ryszka Date: Sun, 29 Oct 2017 16:38:32 +0100 Subject: [PATCH] cleanup boot --- unescape.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 unescape.go diff --git a/unescape.go b/unescape.go new file mode 100644 index 0000000..f6bb163 --- /dev/null +++ b/unescape.go @@ -0,0 +1,64 @@ +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)) +}