diff options
| author | gingerBill <bill@gingerbill.org> | 2023-05-22 20:44:07 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-05-22 20:44:07 +0100 |
| commit | e3360a0e5d0d2b91cd153d5cbc332f27cbb67661 (patch) | |
| tree | b8adfdc3a5ba6f642dcad93b49d72620373e7319 /core/encoding | |
| parent | 418144473405e3221ec32e8ce7073eed15a0a2cc (diff) | |
| parent | c7d571f0b5fbd8748f357ee920fde840d27da792 (diff) | |
Merge branch 'master' of https://github.com/odin-lang/Odin
Diffstat (limited to 'core/encoding')
| -rw-r--r-- | core/encoding/json/marshal.odin | 6 | ||||
| -rw-r--r-- | core/encoding/json/parser.odin | 11 |
2 files changed, 13 insertions, 4 deletions
diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 4cf9264c5..d25015ac7 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -153,7 +153,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: case complex128: r, i = f64(real(z)), f64(imag(z)) case: return .Unsupported_Type } - + io.write_byte(w, '[') or_return io.write_f64(w, r) or_return io.write_string(w, ", ") or_return @@ -165,8 +165,8 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: case runtime.Type_Info_String: switch s in a { - case string: io.write_quoted_string(w, s) or_return - case cstring: io.write_quoted_string(w, string(s)) or_return + case string: io.write_quoted_string(w, s, '"', nil, true) or_return + case cstring: io.write_quoted_string(w, string(s), '"', nil, true) or_return } case runtime.Type_Info_Boolean: diff --git a/core/encoding/json/parser.odin b/core/encoding/json/parser.odin index ed36ae33b..d007e16d7 100644 --- a/core/encoding/json/parser.odin +++ b/core/encoding/json/parser.odin @@ -2,6 +2,7 @@ package json import "core:mem" import "core:unicode/utf8" +import "core:unicode/utf16" import "core:strconv" Parser :: struct { @@ -403,11 +404,19 @@ unquote_string :: proc(token: Token, spec: Specification, allocator := context.a } i += 6 + // If this is a surrogate pair, decode as such by taking the next rune too. + if r >= utf8.SURROGATE_MIN && r <= utf8.SURROGATE_HIGH_MAX && len(s) > i + 2 && s[i:i+2] == "\\u" { + r2 := get_u4_rune(s[i:]) + if r2 >= utf8.SURROGATE_LOW_MIN && r2 <= utf8.SURROGATE_MAX { + i += 6 + r = utf16.decode_surrogate_pair(r, r2) + } + } + buf, buf_width := utf8.encode_rune(r) copy(b[w:], buf[:buf_width]) w += buf_width - case '0': if spec != .JSON { b[w] = '\x00' |