summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/unquote/unquote.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/unquote/unquote.go')
-rw-r--r--vendor/github.com/bytedance/sonic/unquote/unquote.go31
1 files changed, 26 insertions, 5 deletions
diff --git a/vendor/github.com/bytedance/sonic/unquote/unquote.go b/vendor/github.com/bytedance/sonic/unquote/unquote.go
index 23fca736e..d81406b2a 100644
--- a/vendor/github.com/bytedance/sonic/unquote/unquote.go
+++ b/vendor/github.com/bytedance/sonic/unquote/unquote.go
@@ -25,27 +25,45 @@ import (
`github.com/bytedance/sonic/internal/rt`
)
+// String unescapes a escaped string (not including `"` at begining and end)
+// It validates invalid UTF8 and replace with `\ufffd`
func String(s string) (ret string, err types.ParsingError) {
mm := make([]byte, 0, len(s))
- err = intoBytesUnsafe(s, &mm)
+ err = intoBytesUnsafe(s, &mm, true)
ret = rt.Mem2Str(mm)
return
}
+// IntoBytes is same with String besides it output result into a buffer m
func IntoBytes(s string, m *[]byte) types.ParsingError {
if cap(*m) < len(s) {
return types.ERR_EOF
} else {
- return intoBytesUnsafe(s, m)
+ return intoBytesUnsafe(s, m, true)
}
}
-func intoBytesUnsafe(s string, m *[]byte) types.ParsingError {
+// String unescapes a escaped string (not including `"` at begining and end)
+// - replace enables replacing invalid utf8 escaped char with `\uffd`
+func _String(s string, replace bool) (ret string, err error) {
+ mm := make([]byte, 0, len(s))
+ err = intoBytesUnsafe(s, &mm, replace)
+ ret = rt.Mem2Str(mm)
+ return
+}
+
+func intoBytesUnsafe(s string, m *[]byte, replace bool) types.ParsingError {
pos := -1
slv := (*rt.GoSlice)(unsafe.Pointer(m))
str := (*rt.GoString)(unsafe.Pointer(&s))
- /* unquote as the default configuration, replace invalid unicode with \ufffd */
- ret := native.Unquote(str.Ptr, str.Len, slv.Ptr, &pos, types.F_UNICODE_REPLACE)
+
+ flags := uint64(0)
+ if replace {
+ /* unquote as the default configuration, replace invalid unicode with \ufffd */
+ flags |= types.F_UNICODE_REPLACE
+ }
+
+ ret := native.Unquote(str.Ptr, str.Len, slv.Ptr, &pos, flags)
/* check for errors */
if ret < 0 {
@@ -57,3 +75,6 @@ func intoBytesUnsafe(s string, m *[]byte) types.ParsingError {
runtime.KeepAlive(s)
return 0
}
+
+
+