Deprecate strings.write_quoted_* in favour of io.write_quoted_*; make reflect.write_type a little more robust with io.Error handling

This commit is contained in:
gingerBill
2021-09-29 13:42:58 +01:00
parent 4acb4c4ee2
commit 94a27224b2
5 changed files with 156 additions and 137 deletions
+3 -3
View File
@@ -8,6 +8,7 @@ import "core:path/filepath"
import "core:unicode/utf8" import "core:unicode/utf8"
import "core:unicode/utf16" import "core:unicode/utf16"
import "core:os" import "core:os"
import "core:io"
@(private) @(private)
Tokenizer :: tokenizer.Tokenizer Tokenizer :: tokenizer.Tokenizer
@@ -518,9 +519,8 @@ join_adjacent_string_literals :: proc(cpp: ^Preprocessor, initial_tok: ^Token) {
quote_string :: proc(s: string) -> []byte { quote_string :: proc(s: string) -> []byte {
b := &strings.Builder{} b := strings.make_builder(0, len(s)+2)
strings.init_builder(b, 0, len(s)+2) io.write_quoted_string(strings.to_writer(&b), s, '"')
strings.write_quoted_string(b, s, '"')
return b.buf[:] return b.buf[:]
} }
+11 -9
View File
@@ -77,11 +77,13 @@ fprintf :: proc(fd: os.Handle, fmt: string, args: ..any) -> int {
} }
fprint_type :: proc(fd: os.Handle, info: ^runtime.Type_Info) -> int { fprint_type :: proc(fd: os.Handle, info: ^runtime.Type_Info) -> int {
w := io.to_writer(os.stream_from_handle(fd)) w := io.to_writer(os.stream_from_handle(fd))
return wprint_type(w, info) n, _ := wprint_type(w, info)
return n
} }
fprint_typeid :: proc(fd: os.Handle, id: typeid) -> int { fprint_typeid :: proc(fd: os.Handle, id: typeid) -> int {
w := io.to_writer(os.stream_from_handle(fd)) w := io.to_writer(os.stream_from_handle(fd))
return wprint_typeid(w, id) n, _ := wprint_typeid(w, id)
return n
} }
// print* procedures return the number of bytes written // print* procedures return the number of bytes written
@@ -526,15 +528,15 @@ wprintf :: proc(w: io.Writer, fmt: string, args: ..any) -> int {
return int(size1 - size0) return int(size1 - size0)
} }
wprint_type :: proc(w: io.Writer, info: ^runtime.Type_Info) -> int { wprint_type :: proc(w: io.Writer, info: ^runtime.Type_Info) -> (int, io.Error) {
n := reflect.write_type(w, info) n, err := reflect.write_type(w, info)
io.flush(auto_cast w) io.flush(auto_cast w)
return n return n, err
} }
wprint_typeid :: proc(w: io.Writer, id: typeid) -> int { wprint_typeid :: proc(w: io.Writer, id: typeid) -> (int, io.Error) {
n := reflect.write_type(w, type_info_of(id)) n, err := reflect.write_type(w, type_info_of(id))
io.flush(auto_cast w) io.flush(auto_cast w)
return n return n, err
} }
@@ -971,7 +973,7 @@ fmt_string :: proc(fi: ^Info, s: string, verb: rune) {
} }
case 'q': // quoted string case 'q': // quoted string
strings.write_quoted_string(fi.writer, s, '"') io.write_quoted_string(fi.writer, s, '"')
case 'x', 'X': case 'x', 'X':
space := fi.space space := fi.space
+2 -2
View File
@@ -305,7 +305,7 @@ foreign libc {
@(link_name="chdir") _unix_chdir :: proc(buf: cstring) -> c.int --- @(link_name="chdir") _unix_chdir :: proc(buf: cstring) -> c.int ---
@(link_name="realpath") _unix_realpath :: proc(path: cstring, resolved_path: rawptr) -> rawptr --- @(link_name="realpath") _unix_realpath :: proc(path: cstring, resolved_path: rawptr) -> rawptr ---
@(link_name="exit") _unix_exit :: proc(status: int) -> ! --- @(link_name="exit") _unix_exit :: proc(status: c.int) -> ! ---
} }
foreign dl { foreign dl {
@@ -571,7 +571,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) {
} }
exit :: proc "contextless" (code: int) -> ! { exit :: proc "contextless" (code: int) -> ! {
_unix_exit(code) _unix_exit(i32(code))
} }
current_thread_id :: proc "contextless" () -> int { current_thread_id :: proc "contextless" () -> int {
+132 -122
View File
@@ -346,237 +346,247 @@ write_type :: proc{
} }
write_type_builder :: proc(buf: ^strings.Builder, ti: ^Type_Info) -> int { write_type_builder :: proc(buf: ^strings.Builder, ti: ^Type_Info) -> int {
return write_type_writer(strings.to_writer(buf), ti) n, _ := write_type_writer(strings.to_writer(buf), ti)
return n
} }
write_type_writer :: proc(w: io.Writer, ti: ^Type_Info) -> (n: int) { write_type_writer :: proc(w: io.Writer, ti: ^Type_Info) -> (n: int, err: io.Error) {
using strings
if ti == nil { if ti == nil {
return write_string(w, "nil") return io.write_string(w, "nil")
} }
_n1 :: proc(err: io.Error) -> int { return 1 if err == nil else 0 } _n1 :: proc(err: io.Error, n: ^int) -> io.Error {
_n2 :: proc(n: int, _: io.Error) -> int { return n } n^ += 1 if err == nil else 0
return err
}
_n2 :: io.n_wrapper
_n :: proc{_n1, _n2} _n :: proc{_n1, _n2}
switch info in ti.variant { switch info in ti.variant {
case Type_Info_Named: case Type_Info_Named:
return write_string(w, info.name) return io.write_string(w, info.name)
case Type_Info_Integer: case Type_Info_Integer:
switch ti.id { switch ti.id {
case int: return write_string(w, "int") case int: return io.write_string(w, "int")
case uint: return write_string(w, "uint") case uint: return io.write_string(w, "uint")
case uintptr: return write_string(w, "uintptr") case uintptr: return io.write_string(w, "uintptr")
case: case:
n += _n(io.write_byte(w, 'i' if info.signed else 'u')) _n(io.write_byte(w, 'i' if info.signed else 'u'), &n) or_return
n += _n(io.write_i64(w, i64(8*ti.size), 10)) _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
switch info.endianness { switch info.endianness {
case .Platform: // Okay case .Platform: // Okay
case .Little: n += write_string(w, "le") case .Little: _n(io.write_string(w, "le"), &n) or_return
case .Big: n += write_string(w, "be") case .Big: _n(io.write_string(w, "be"), &n) or_return
} }
} }
case Type_Info_Rune: case Type_Info_Rune:
n += _n(io.write_string(w, "rune")) _n(io.write_string(w, "rune"), &n) or_return
case Type_Info_Float: case Type_Info_Float:
n += _n(io.write_byte(w, 'f')) _n(io.write_byte(w, 'f'), &n) or_return
n += _n(io.write_i64(w, i64(8*ti.size), 10)) _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
switch info.endianness { switch info.endianness {
case .Platform: // Okay case .Platform: // Okay
case .Little: n += write_string(w, "le") case .Little: _n(io.write_string(w, "le"), &n) or_return
case .Big: n += write_string(w, "be") case .Big: _n(io.write_string(w, "be"), &n) or_return
} }
case Type_Info_Complex: case Type_Info_Complex:
n += _n(io.write_string(w, "complex")) _n(io.write_string(w, "complex"), &n) or_return
n += _n(io.write_i64(w, i64(8*ti.size), 10)) _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
case Type_Info_Quaternion: case Type_Info_Quaternion:
n += _n(io.write_string(w, "quaternion")) _n(io.write_string(w, "quaternion"), &n) or_return
n += _n(io.write_i64(w, i64(8*ti.size), 10)) _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
case Type_Info_String: case Type_Info_String:
if info.is_cstring { if info.is_cstring {
n += write_string(w, "cstring") _n(io.write_string(w, "cstring"), &n) or_return
} else { } else {
n += write_string(w, "string") _n(io.write_string(w, "string"), &n) or_return
} }
case Type_Info_Boolean: case Type_Info_Boolean:
switch ti.id { switch ti.id {
case bool: n += write_string(w, "bool") case bool: _n(io.write_string(w, "bool"), &n) or_return
case: case:
n += _n(io.write_byte(w, 'b')) _n(io.write_byte(w, 'b'), &n) or_return
n += _n(io.write_i64(w, i64(8*ti.size), 10)) _n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
} }
case Type_Info_Any: case Type_Info_Any:
n += write_string(w, "any") _n(io.write_string(w, "any"), &n) or_return
case Type_Info_Type_Id: case Type_Info_Type_Id:
n += write_string(w, "typeid") _n(io.write_string(w, "typeid"), &n) or_return
case Type_Info_Pointer: case Type_Info_Pointer:
if info.elem == nil { if info.elem == nil {
write_string(w, "rawptr") return io.write_string(w, "rawptr")
} else { } else {
write_string(w, "^") _n(io.write_string(w, "^"), &n) or_return
write_type(w, info.elem) return write_type(w, info.elem)
} }
case Type_Info_Multi_Pointer: case Type_Info_Multi_Pointer:
write_string(w, "[^]") _n(io.write_string(w, "[^]"), &n) or_return
write_type(w, info.elem) return write_type(w, info.elem)
case Type_Info_Procedure: case Type_Info_Procedure:
n += write_string(w, "proc") _n(io.write_string(w, "proc"), &n) or_return
if info.params == nil { if info.params == nil {
n += write_string(w, "()") _n(io.write_string(w, "()"), &n) or_return
} else { } else {
t := info.params.variant.(Type_Info_Tuple) t := info.params.variant.(Type_Info_Tuple)
n += write_string(w, "(") _n(io.write_string(w, "("), &n) or_return
for t, i in t.types { for t, i in t.types {
if i > 0 { if i > 0 {
n += write_string(w, ", ") _n(io.write_string(w, ", "), &n) or_return
} }
n += write_type(w, t) _n(write_type(w, t), &n) or_return
} }
n += write_string(w, ")") _n(io.write_string(w, ")"), &n) or_return
} }
if info.results != nil { if info.results != nil {
n += write_string(w, " -> ") _n(io.write_string(w, " -> "), &n) or_return
n += write_type(w, info.results) _n(write_type(w, info.results), &n) or_return
} }
case Type_Info_Tuple: case Type_Info_Tuple:
count := len(info.names) count := len(info.names)
if count != 1 { n += write_string(w, "(") } if count != 1 {
_n(io.write_string(w, "("), &n) or_return
}
for name, i in info.names { for name, i in info.names {
if i > 0 { n += write_string(w, ", ") } if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
t := info.types[i] t := info.types[i]
if len(name) > 0 { if len(name) > 0 {
n += write_string(w, name) _n(io.write_string(w, name), &n) or_return
n += write_string(w, ": ") _n(io.write_string(w, ": "), &n) or_return
} }
n += write_type(w, t) _n(write_type(w, t), &n) or_return
}
if count != 1 {
_n(io.write_string(w, ")"), &n) or_return
} }
if count != 1 { n += write_string(w, ")") }
case Type_Info_Array: case Type_Info_Array:
n += _n(io.write_string(w, "[")) _n(io.write_string(w, "["), &n) or_return
n += _n(io.write_i64(w, i64(info.count), 10)) _n(io.write_i64(w, i64(info.count), 10), &n) or_return
n += _n(io.write_string(w, "]")) _n(io.write_string(w, "]"), &n) or_return
n += write_type(w, info.elem) _n(write_type(w, info.elem), &n) or_return
case Type_Info_Enumerated_Array: case Type_Info_Enumerated_Array:
n += write_string(w, "[") _n(io.write_string(w, "["), &n) or_return
n += write_type(w, info.index) _n(write_type(w, info.index), &n) or_return
n += write_string(w, "]") _n(io.write_string(w, "]"), &n) or_return
n += write_type(w, info.elem) _n(write_type(w, info.elem), &n) or_return
case Type_Info_Dynamic_Array: case Type_Info_Dynamic_Array:
n += _n(io.write_string(w, "[dynamic]")) _n(io.write_string(w, "[dynamic]"), &n) or_return
n += write_type(w, info.elem) _n(write_type(w, info.elem), &n) or_return
case Type_Info_Slice: case Type_Info_Slice:
n += _n(io.write_string(w, "[]")) _n(io.write_string(w, "[]"), &n) or_return
n += write_type(w, info.elem) _n(write_type(w, info.elem), &n) or_return
case Type_Info_Map: case Type_Info_Map:
n += _n(io.write_string(w, "map[")) _n(io.write_string(w, "map["), &n) or_return
n += write_type(w, info.key) _n(write_type(w, info.key), &n) or_return
n += _n(io.write_byte(w, ']')) _n(io.write_byte(w, ']'), &n) or_return
n += write_type(w, info.value) _n(write_type(w, info.value), &n) or_return
case Type_Info_Struct: case Type_Info_Struct:
switch info.soa_kind { switch info.soa_kind {
case .None: // Ignore case .None: // Ignore
case .Fixed: case .Fixed:
n += _n(io.write_string(w, "#soa[")) _n(io.write_string(w, "#soa["), &n) or_return
n += _n(io.write_i64(w, i64(info.soa_len))) _n(io.write_i64(w, i64(info.soa_len)), &n) or_return
n += _n(io.write_byte(w, ']')) _n(io.write_byte(w, ']'), &n) or_return
n += write_type(w, info.soa_base_type) _n(write_type(w, info.soa_base_type), &n) or_return
return return
case .Slice: case .Slice:
n += _n(io.write_string(w, "#soa[]")) _n(io.write_string(w, "#soa[]"), &n) or_return
n += write_type(w, info.soa_base_type) _n(write_type(w, info.soa_base_type), &n) or_return
return return
case .Dynamic: case .Dynamic:
n += _n(io.write_string(w, "#soa[dynamic]")) _n(io.write_string(w, "#soa[dynamic]"), &n) or_return
n += write_type(w, info.soa_base_type) _n(write_type(w, info.soa_base_type), &n) or_return
return return
} }
n += write_string(w, "struct ") _n(io.write_string(w, "struct "), &n) or_return
if info.is_packed { n += write_string(w, "#packed ") } if info.is_packed { _n(io.write_string(w, "#packed "), &n) or_return }
if info.is_raw_union { n += write_string(w, "#raw_union ") } if info.is_raw_union { _n(io.write_string(w, "#raw_union "), &n) or_return }
if info.custom_align { if info.custom_align {
n += _n(io.write_string(w, "#align ")) _n(io.write_string(w, "#align "), &n) or_return
n += _n(io.write_i64(w, i64(ti.align), 10)) _n(io.write_i64(w, i64(ti.align), 10), &n) or_return
n += _n(io.write_byte(w, ' ')) _n(io.write_byte(w, ' '), &n) or_return
} }
n += _n(io.write_byte(w, '{')) _n(io.write_byte(w, '{'), &n) or_return
for name, i in info.names { for name, i in info.names {
if i > 0 { n += write_string(w, ", ") } if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
n += _n(io.write_string(w, name)) _n(io.write_string(w, name), &n) or_return
n += _n(io.write_string(w, ": ")) _n(io.write_string(w, ": "), &n) or_return
n += write_type(w, info.types[i]) _n(write_type(w, info.types[i]), &n) or_return
} }
n += _n(io.write_byte(w, '}')) _n(io.write_byte(w, '}'), &n) or_return
case Type_Info_Union: case Type_Info_Union:
n += write_string(w, "union ") _n(io.write_string(w, "union "), &n) or_return
if info.maybe {
_n(io.write_string(w, "#maybe "), &n) or_return
}
if info.custom_align { if info.custom_align {
n += write_string(w, "#align ") _n(io.write_string(w, "#align "), &n) or_return
n += _n(io.write_i64(w, i64(ti.align), 10)) _n(io.write_i64(w, i64(ti.align), 10), &n) or_return
n += _n(io.write_byte(w, ' ')) _n(io.write_byte(w, ' '), &n) or_return
} }
n += _n(io.write_byte(w, '{')) _n(io.write_byte(w, '{'), &n) or_return
for variant, i in info.variants { for variant, i in info.variants {
if i > 0 { n += write_string(w, ", ") } if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
n += write_type(w, variant) _n(write_type(w, variant), &n) or_return
} }
n += _n(io.write_byte(w, '}')) _n(io.write_byte(w, '}'), &n) or_return
case Type_Info_Enum: case Type_Info_Enum:
n += write_string(w, "enum ") _n(io.write_string(w, "enum "), &n) or_return
n += write_type(w, info.base) _n(write_type(w, info.base), &n) or_return
n += write_string(w, " {") _n(io.write_string(w, " {"), &n) or_return
for name, i in info.names { for name, i in info.names {
if i > 0 { n += write_string(w, ", ") } if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
n += write_string(w, name) _n(io.write_string(w, name), &n) or_return
} }
n += _n(io.write_byte(w, '}')) _n(io.write_byte(w, '}'), &n) or_return
case Type_Info_Bit_Set: case Type_Info_Bit_Set:
n += write_string(w, "bit_set[") _n(io.write_string(w, "bit_set["), &n) or_return
switch { switch {
case is_enum(info.elem): case is_enum(info.elem):
n += write_type(w, info.elem) _n(write_type(w, info.elem), &n) or_return
case is_rune(info.elem): case is_rune(info.elem):
n += write_encoded_rune(w, rune(info.lower)) _n(io.write_encoded_rune(w, rune(info.lower)), &n) or_return
n += write_string(w, "..") _n(io.write_string(w, ".."), &n) or_return
n += write_encoded_rune(w, rune(info.upper)) _n(io.write_encoded_rune(w, rune(info.upper)), &n) or_return
case: case:
n += _n(io.write_i64(w, info.lower, 10)) _n(io.write_i64(w, info.lower, 10), &n) or_return
n += write_string(w, "..") _n(io.write_string(w, ".."), &n) or_return
n += _n(io.write_i64(w, info.upper, 10)) _n(io.write_i64(w, info.upper, 10), &n) or_return
} }
if info.underlying != nil { if info.underlying != nil {
n += write_string(w, "; ") _n(io.write_string(w, "; "), &n) or_return
n += write_type(w, info.underlying) _n(write_type(w, info.underlying), &n) or_return
} }
n += _n(io.write_byte(w, ']')) _n(io.write_byte(w, ']'), &n) or_return
case Type_Info_Simd_Vector: case Type_Info_Simd_Vector:
n += write_string(w, "#simd[") _n(io.write_string(w, "#simd["), &n) or_return
n += _n(io.write_i64(w, i64(info.count))) _n(io.write_i64(w, i64(info.count)), &n) or_return
n += _n(io.write_byte(w, ']')) _n(io.write_byte(w, ']'), &n) or_return
n += write_type(w, info.elem) _n(write_type(w, info.elem), &n) or_return
case Type_Info_Relative_Pointer: case Type_Info_Relative_Pointer:
n += write_string(w, "#relative(") _n(io.write_string(w, "#relative("), &n) or_return
n += write_type(w, info.base_integer) _n(write_type(w, info.base_integer), &n) or_return
n += write_string(w, ") ") _n(io.write_string(w, ") "), &n) or_return
n += write_type(w, info.pointer) _n(write_type(w, info.pointer), &n) or_return
case Type_Info_Relative_Slice: case Type_Info_Relative_Slice:
n += write_string(w, "#relative(") _n(io.write_string(w, "#relative("), &n) or_return
n += write_type(w, info.base_integer) _n(write_type(w, info.base_integer), &n) or_return
n += write_string(w, ") ") _n(io.write_string(w, ") "), &n) or_return
n += write_type(w, info.slice) _n(write_type(w, info.slice), &n) or_return
} }
return return
+8 -1
View File
@@ -166,7 +166,8 @@ write_quoted_rune :: proc(w: io.Writer, r: rune) -> (n: int) {
n += _write_byte(w, DIGITS_LOWER[buf[0]>>4]) n += _write_byte(w, DIGITS_LOWER[buf[0]>>4])
n += _write_byte(w, DIGITS_LOWER[buf[0]&0xf]) n += _write_byte(w, DIGITS_LOWER[buf[0]&0xf])
} else { } else {
n += write_escaped_rune(w, r, quote) i, _ := io.write_escaped_rune(w, r, quote)
n += i
} }
n += _write_byte(w, quote) n += _write_byte(w, quote)
return return
@@ -216,11 +217,13 @@ write_quoted_string :: proc{
write_quoted_string_writer, write_quoted_string_writer,
} }
@(deprecated="prefer io.write_quoted_string")
write_quoted_string_builder :: proc(b: ^Builder, str: string, quote: byte = '"') -> (n: int) { write_quoted_string_builder :: proc(b: ^Builder, str: string, quote: byte = '"') -> (n: int) {
n, _ = io.write_quoted_string(to_writer(b), str, quote) n, _ = io.write_quoted_string(to_writer(b), str, quote)
return return
} }
@(deprecated="prefer io.write_quoted_string")
write_quoted_string_writer :: proc(w: io.Writer, str: string, quote: byte = '"') -> (n: int) { write_quoted_string_writer :: proc(w: io.Writer, str: string, quote: byte = '"') -> (n: int) {
n, _ = io.write_quoted_string(w, str, quote) n, _ = io.write_quoted_string(w, str, quote)
return return
@@ -231,11 +234,13 @@ write_encoded_rune :: proc{
write_encoded_rune_writer, write_encoded_rune_writer,
} }
@(deprecated="prefer io.write_encoded_rune")
write_encoded_rune_builder :: proc(b: ^Builder, r: rune, write_quote := true) -> (n: int) { write_encoded_rune_builder :: proc(b: ^Builder, r: rune, write_quote := true) -> (n: int) {
n, _ = io.write_encoded_rune(to_writer(b), r, write_quote) n, _ = io.write_encoded_rune(to_writer(b), r, write_quote)
return return
} }
@(deprecated="prefer io.write_encoded_rune")
write_encoded_rune_writer :: proc(w: io.Writer, r: rune, write_quote := true) -> (n: int) { write_encoded_rune_writer :: proc(w: io.Writer, r: rune, write_quote := true) -> (n: int) {
n, _ = io.write_encoded_rune(w, r, write_quote) n, _ = io.write_encoded_rune(w, r, write_quote)
return return
@@ -247,11 +252,13 @@ write_escaped_rune :: proc{
write_escaped_rune_writer, write_escaped_rune_writer,
} }
@(deprecated="prefer io.write_escaped_rune")
write_escaped_rune_builder :: proc(b: ^Builder, r: rune, quote: byte, html_safe := false) -> (n: int) { write_escaped_rune_builder :: proc(b: ^Builder, r: rune, quote: byte, html_safe := false) -> (n: int) {
n, _ = io.write_escaped_rune(to_writer(b), r, quote, html_safe) n, _ = io.write_escaped_rune(to_writer(b), r, quote, html_safe)
return return
} }
@(deprecated="prefer io.write_escaped_rune")
write_escaped_rune_writer :: proc(w: io.Writer, r: rune, quote: byte, html_safe := false) -> (n: int) { write_escaped_rune_writer :: proc(w: io.Writer, r: rune, quote: byte, html_safe := false) -> (n: int) {
n, _ = io.write_escaped_rune(w, r, quote, html_safe) n, _ = io.write_escaped_rune(w, r, quote, html_safe)
return return