mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-28 18:30:06 +00:00
Begin supporting string16 across the core library
This commit is contained in:
@@ -298,7 +298,7 @@ tag_base64_unmarshal :: proc(_: ^Tag_Implementation, d: Decoder, _: Tag_Number,
|
||||
|
||||
#partial switch t in ti.variant {
|
||||
case reflect.Type_Info_String:
|
||||
|
||||
assert(!t.is_utf16)
|
||||
if t.is_cstring {
|
||||
length := base64.decoded_len(bytes)
|
||||
builder := strings.builder_make(0, length+1)
|
||||
|
||||
@@ -335,6 +335,8 @@ _unmarshal_value :: proc(d: Decoder, v: any, hdr: Header, allocator := context.a
|
||||
_unmarshal_bytes :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header, add: Add, allocator := context.allocator, loc := #caller_location) -> (err: Unmarshal_Error) {
|
||||
#partial switch t in ti.variant {
|
||||
case reflect.Type_Info_String:
|
||||
assert(!t.is_utf16)
|
||||
|
||||
bytes := err_conv(_decode_bytes(d, add, allocator=allocator, loc=loc)) or_return
|
||||
|
||||
if t.is_cstring {
|
||||
|
||||
@@ -353,10 +353,10 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err:
|
||||
#partial switch info in ti.variant {
|
||||
case runtime.Type_Info_String:
|
||||
switch x in v {
|
||||
case string:
|
||||
return x == ""
|
||||
case cstring:
|
||||
return x == nil || x == ""
|
||||
case string: return x == ""
|
||||
case cstring: return x == nil || x == ""
|
||||
case string16: return x == ""
|
||||
case cstring16: return x == nil || x == ""
|
||||
}
|
||||
case runtime.Type_Info_Any:
|
||||
return v.(any) == nil
|
||||
|
||||
@@ -570,7 +570,9 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm
|
||||
key_ptr: rawptr
|
||||
|
||||
#partial switch tk in t.key.variant {
|
||||
case runtime.Type_Info_String:
|
||||
case runtime.Type_Info_String:
|
||||
assert(!tk.is_utf16)
|
||||
|
||||
key_ptr = rawptr(&key)
|
||||
key_cstr: cstring
|
||||
if reflect.is_cstring(t.key) {
|
||||
|
||||
@@ -127,6 +127,8 @@ parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info:
|
||||
}
|
||||
|
||||
case runtime.Type_Info_String:
|
||||
assert(!specific_type_info.is_utf16)
|
||||
|
||||
if specific_type_info.is_cstring {
|
||||
cstr_ptr := (^cstring)(ptr)
|
||||
if cstr_ptr != nil {
|
||||
|
||||
+8
-8
@@ -2346,14 +2346,14 @@ fmt_array :: proc(fi: ^Info, data: rawptr, n: int, elem_size: int, elem: ^reflec
|
||||
}
|
||||
|
||||
switch reflect.type_info_base(elem).id {
|
||||
case byte: fmt_string(fi, string(([^]byte)(data)[:n]), verb); return
|
||||
case u16: print_utf16(fi, ([^]u16)(data)[:n]); return
|
||||
case u16le: print_utf16(fi, ([^]u16le)(data)[:n]); return
|
||||
case u16be: print_utf16(fi, ([^]u16be)(data)[:n]); return
|
||||
case u32: print_utf32(fi, ([^]u32)(data)[:n]); return
|
||||
case u32le: print_utf32(fi, ([^]u32le)(data)[:n]); return
|
||||
case u32be: print_utf32(fi, ([^]u32be)(data)[:n]); return
|
||||
case rune: print_utf32(fi, ([^]rune)(data)[:n]); return
|
||||
case byte: fmt_string(fi, string (([^]byte)(data)[:n]), verb); return
|
||||
case u16: fmt_string16(fi, string16(([^]u16) (data)[:n]), verb); return
|
||||
case u16le: print_utf16(fi, ([^]u16le)(data)[:n]); return
|
||||
case u16be: print_utf16(fi, ([^]u16be)(data)[:n]); return
|
||||
case u32: print_utf32(fi, ([^]u32)(data)[:n]); return
|
||||
case u32le: print_utf32(fi, ([^]u32le)(data)[:n]); return
|
||||
case u32be: print_utf32(fi, ([^]u32be)(data)[:n]); return
|
||||
case rune: print_utf32(fi, ([^]rune)(data)[:n]); return
|
||||
}
|
||||
}
|
||||
if verb == 'p' {
|
||||
|
||||
+2
-2
@@ -319,7 +319,6 @@ write_string :: proc(s: Writer, str: string, n_written: ^int = nil) -> (n: int,
|
||||
write_string16 :: proc(s: Writer, str: string16, n_written: ^int = nil) -> (n: int, err: Error) {
|
||||
for i := 0; i < len(str); i += 1 {
|
||||
r := rune(utf16.REPLACEMENT_CHAR)
|
||||
|
||||
switch c := str[i]; {
|
||||
case c < utf16._surr1, utf16._surr3 <= c:
|
||||
r = rune(c)
|
||||
@@ -329,7 +328,8 @@ write_string16 :: proc(s: Writer, str: string16, n_written: ^int = nil) -> (n: i
|
||||
i += 1
|
||||
}
|
||||
|
||||
w, err := write_rune(s, r, n_written)
|
||||
w: int
|
||||
w, err = write_rune(s, r, n_written)
|
||||
n += w
|
||||
if err != nil {
|
||||
return
|
||||
|
||||
@@ -511,9 +511,11 @@ write_type_writer :: #force_no_inline proc(w: io.Writer, ti: ^Type_Info, n_writt
|
||||
io.write_i64(w, i64(8*ti.size), 10, &n) or_return
|
||||
case Type_Info_String:
|
||||
if info.is_cstring {
|
||||
io.write_string(w, "cstring", &n) or_return
|
||||
} else {
|
||||
io.write_string(w, "string", &n) or_return
|
||||
io.write_byte(w, 'c', &n) or_return
|
||||
}
|
||||
io.write_string(w, "string", &n) or_return
|
||||
if info.is_utf16 {
|
||||
io.write_string(w, "16", &n) or_return
|
||||
}
|
||||
case Type_Info_Boolean:
|
||||
switch ti.id {
|
||||
|
||||
Reference in New Issue
Block a user