fix/schema: fix string literals
This commit is contained in:
97
schema/util/util.go
Normal file
97
schema/util/util.go
Normal file
@@ -0,0 +1,97 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func InterpretString(in string) (string, error) {
|
||||
in = in[1 : len(in)-1]
|
||||
sb := strings.Builder{}
|
||||
s := []rune(in)
|
||||
for i := 0; i < len(s); {
|
||||
r := s[i]
|
||||
if r == '\\' {
|
||||
if i == len(s)-1 {
|
||||
return "", errors.New("illegal escape character")
|
||||
}
|
||||
switch s[i+1] {
|
||||
case 'a':
|
||||
sb.WriteRune('\a')
|
||||
i += 2
|
||||
break
|
||||
case 'b':
|
||||
sb.WriteRune('\b')
|
||||
i += 2
|
||||
break
|
||||
case 'f':
|
||||
sb.WriteRune('\f')
|
||||
i += 2
|
||||
break
|
||||
case 'n':
|
||||
sb.WriteRune('\n')
|
||||
i += 2
|
||||
break
|
||||
case 'r':
|
||||
sb.WriteRune('\r')
|
||||
i += 2
|
||||
break
|
||||
case 't':
|
||||
sb.WriteRune('\t')
|
||||
i += 2
|
||||
break
|
||||
case 'v':
|
||||
sb.WriteRune('\v')
|
||||
i += 2
|
||||
break
|
||||
case '\\':
|
||||
sb.WriteRune('\\')
|
||||
i += 2
|
||||
break
|
||||
case '"':
|
||||
sb.WriteRune('"')
|
||||
i += 2
|
||||
break
|
||||
case 'u':
|
||||
sub := s[i+2 : i+6]
|
||||
n, err := strconv.ParseInt(string(sub), 16, 64)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sb.WriteRune(rune(n))
|
||||
i += 6
|
||||
case 'U':
|
||||
sub := s[i+2 : i+10]
|
||||
n, err := strconv.ParseInt(string(sub), 16, 64)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sb.WriteRune(rune(n))
|
||||
i += 10
|
||||
case '0', '1', '2', '3', '4', '5', '6', '7':
|
||||
sub := s[i+1 : i+4]
|
||||
n, err := strconv.ParseInt(string(sub), 8, 64)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sb.WriteRune(rune(n))
|
||||
i += 4
|
||||
case 'x':
|
||||
sub := s[i+2 : i+4]
|
||||
n, err := strconv.ParseInt(string(sub), 16, 64)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
sb.WriteRune(rune(n))
|
||||
i += 4
|
||||
default:
|
||||
return "", errors.New("could not parse escape character")
|
||||
}
|
||||
} else {
|
||||
sb.WriteRune(r)
|
||||
i++
|
||||
}
|
||||
}
|
||||
return sb.String(), nil
|
||||
}
|
||||
Reference in New Issue
Block a user