diff options
Diffstat (limited to 'vendor/github.com/bytedance/sonic/unquote/unquote.go')
-rw-r--r-- | vendor/github.com/bytedance/sonic/unquote/unquote.go | 31 |
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 } + + + |