Add an extra optional ^int parameter to most io read/write calls allowing for simplified or_return use with incrementing byte usage

This commit is contained in:
gingerBill
2021-09-29 13:59:47 +01:00
parent 94a27224b2
commit 8e2a0be804
3 changed files with 268 additions and 225 deletions
+124 -127
View File
@@ -349,244 +349,241 @@ write_type_builder :: proc(buf: ^strings.Builder, ti: ^Type_Info) -> int {
n, _ := write_type_writer(strings.to_writer(buf), ti)
return n
}
write_type_writer :: proc(w: io.Writer, ti: ^Type_Info) -> (n: int, err: io.Error) {
write_type_writer :: proc(w: io.Writer, ti: ^Type_Info, n_written: ^int = nil) -> (n: int, err: io.Error) {
defer if n_written != nil {
n_written^ += n
}
if ti == nil {
return io.write_string(w, "nil")
io.write_string(w, "nil", &n) or_return
return
}
_n1 :: proc(err: io.Error, n: ^int) -> io.Error {
n^ += 1 if err == nil else 0
return err
}
_n2 :: io.n_wrapper
_n :: proc{_n1, _n2}
switch info in ti.variant {
case Type_Info_Named:
return io.write_string(w, info.name)
io.write_string(w, info.name, &n) or_return
case Type_Info_Integer:
switch ti.id {
case int: return io.write_string(w, "int")
case uint: return io.write_string(w, "uint")
case uintptr: return io.write_string(w, "uintptr")
case int: io.write_string(w, "int", &n) or_return
case uint: io.write_string(w, "uint", &n) or_return
case uintptr: io.write_string(w, "uintptr", &n) or_return
case:
_n(io.write_byte(w, 'i' if info.signed else 'u'), &n) or_return
_n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
io.write_byte(w, 'i' if info.signed else 'u', &n) or_return
io.write_i64(w, i64(8*ti.size), 10, &n) or_return
switch info.endianness {
case .Platform: // Okay
case .Little: _n(io.write_string(w, "le"), &n) or_return
case .Big: _n(io.write_string(w, "be"), &n) or_return
case .Little: io.write_string(w, "le", &n) or_return
case .Big: io.write_string(w, "be", &n) or_return
}
}
case Type_Info_Rune:
_n(io.write_string(w, "rune"), &n) or_return
io.write_string(w, "rune", &n) or_return
case Type_Info_Float:
_n(io.write_byte(w, 'f'), &n) or_return
_n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
io.write_byte(w, 'f', &n) or_return
io.write_i64(w, i64(8*ti.size), 10, &n) or_return
switch info.endianness {
case .Platform: // Okay
case .Little: _n(io.write_string(w, "le"), &n) or_return
case .Big: _n(io.write_string(w, "be"), &n) or_return
case .Little: io.write_string(w, "le", &n) or_return
case .Big: io.write_string(w, "be", &n) or_return
}
case Type_Info_Complex:
_n(io.write_string(w, "complex"), &n) or_return
_n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
io.write_string(w, "complex", &n) or_return
io.write_i64(w, i64(8*ti.size), 10, &n) or_return
case Type_Info_Quaternion:
_n(io.write_string(w, "quaternion"), &n) or_return
_n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
io.write_string(w, "quaternion", &n) or_return
io.write_i64(w, i64(8*ti.size), 10, &n) or_return
case Type_Info_String:
if info.is_cstring {
_n(io.write_string(w, "cstring"), &n) or_return
io.write_string(w, "cstring", &n) or_return
} else {
_n(io.write_string(w, "string"), &n) or_return
io.write_string(w, "string", &n) or_return
}
case Type_Info_Boolean:
switch ti.id {
case bool: _n(io.write_string(w, "bool"), &n) or_return
case bool: io.write_string(w, "bool", &n) or_return
case:
_n(io.write_byte(w, 'b'), &n) or_return
_n(io.write_i64(w, i64(8*ti.size), 10), &n) or_return
io.write_byte(w, 'b', &n) or_return
io.write_i64(w, i64(8*ti.size), 10, &n) or_return
}
case Type_Info_Any:
_n(io.write_string(w, "any"), &n) or_return
io.write_string(w, "any", &n) or_return
case Type_Info_Type_Id:
_n(io.write_string(w, "typeid"), &n) or_return
io.write_string(w, "typeid", &n) or_return
case Type_Info_Pointer:
if info.elem == nil {
return io.write_string(w, "rawptr")
io.write_string(w, "rawptr", &n) or_return
} else {
_n(io.write_string(w, "^"), &n) or_return
return write_type(w, info.elem)
io.write_string(w, "^", &n) or_return
write_type(w, info.elem, &n) or_return
}
case Type_Info_Multi_Pointer:
_n(io.write_string(w, "[^]"), &n) or_return
return write_type(w, info.elem)
io.write_string(w, "[^]", &n) or_return
write_type(w, info.elem, &n) or_return
case Type_Info_Procedure:
_n(io.write_string(w, "proc"), &n) or_return
io.write_string(w, "proc", &n) or_return
if info.params == nil {
_n(io.write_string(w, "()"), &n) or_return
io.write_string(w, "()", &n) or_return
} else {
t := info.params.variant.(Type_Info_Tuple)
_n(io.write_string(w, "("), &n) or_return
io.write_string(w, "(", &n) or_return
for t, i in t.types {
if i > 0 {
_n(io.write_string(w, ", "), &n) or_return
io.write_string(w, ", ", &n) or_return
}
_n(write_type(w, t), &n) or_return
write_type(w, t, &n) or_return
}
_n(io.write_string(w, ")"), &n) or_return
io.write_string(w, ")", &n) or_return
}
if info.results != nil {
_n(io.write_string(w, " -> "), &n) or_return
_n(write_type(w, info.results), &n) or_return
io.write_string(w, " -> ", &n) or_return
write_type(w, info.results, &n) or_return
}
case Type_Info_Tuple:
count := len(info.names)
if count != 1 {
_n(io.write_string(w, "("), &n) or_return
io.write_string(w, "(", &n) or_return
}
for name, i in info.names {
if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
if i > 0 { io.write_string(w, ", ", &n) or_return }
t := info.types[i]
if len(name) > 0 {
_n(io.write_string(w, name), &n) or_return
_n(io.write_string(w, ": "), &n) or_return
io.write_string(w, name, &n) or_return
io.write_string(w, ": ", &n) or_return
}
_n(write_type(w, t), &n) or_return
write_type(w, t, &n) or_return
}
if count != 1 {
_n(io.write_string(w, ")"), &n) or_return
io.write_string(w, ")", &n) or_return
}
case Type_Info_Array:
_n(io.write_string(w, "["), &n) or_return
_n(io.write_i64(w, i64(info.count), 10), &n) or_return
_n(io.write_string(w, "]"), &n) or_return
_n(write_type(w, info.elem), &n) or_return
io.write_string(w, "[", &n) or_return
io.write_i64(w, i64(info.count), 10, &n) or_return
io.write_string(w, "]", &n) or_return
write_type(w, info.elem, &n) or_return
case Type_Info_Enumerated_Array:
_n(io.write_string(w, "["), &n) or_return
_n(write_type(w, info.index), &n) or_return
_n(io.write_string(w, "]"), &n) or_return
_n(write_type(w, info.elem), &n) or_return
io.write_string(w, "[", &n) or_return
write_type(w, info.index, &n) or_return
io.write_string(w, "]", &n) or_return
write_type(w, info.elem, &n) or_return
case Type_Info_Dynamic_Array:
_n(io.write_string(w, "[dynamic]"), &n) or_return
_n(write_type(w, info.elem), &n) or_return
io.write_string(w, "[dynamic]", &n) or_return
write_type(w, info.elem, &n) or_return
case Type_Info_Slice:
_n(io.write_string(w, "[]"), &n) or_return
_n(write_type(w, info.elem), &n) or_return
io.write_string(w, "[]", &n) or_return
write_type(w, info.elem, &n) or_return
case Type_Info_Map:
_n(io.write_string(w, "map["), &n) or_return
_n(write_type(w, info.key), &n) or_return
_n(io.write_byte(w, ']'), &n) or_return
_n(write_type(w, info.value), &n) or_return
io.write_string(w, "map[", &n) or_return
write_type(w, info.key, &n) or_return
io.write_byte(w, ']', &n) or_return
write_type(w, info.value, &n) or_return
case Type_Info_Struct:
switch info.soa_kind {
case .None: // Ignore
case .Fixed:
_n(io.write_string(w, "#soa["), &n) or_return
_n(io.write_i64(w, i64(info.soa_len)), &n) or_return
_n(io.write_byte(w, ']'), &n) or_return
_n(write_type(w, info.soa_base_type), &n) or_return
io.write_string(w, "#soa[", &n) or_return
io.write_i64(w, i64(info.soa_len), 10 &n) or_return
io.write_byte(w, ']', &n) or_return
write_type(w, info.soa_base_type, &n) or_return
return
case .Slice:
_n(io.write_string(w, "#soa[]"), &n) or_return
_n(write_type(w, info.soa_base_type), &n) or_return
io.write_string(w, "#soa[]", &n) or_return
write_type(w, info.soa_base_type, &n) or_return
return
case .Dynamic:
_n(io.write_string(w, "#soa[dynamic]"), &n) or_return
_n(write_type(w, info.soa_base_type), &n) or_return
io.write_string(w, "#soa[dynamic]", &n) or_return
write_type(w, info.soa_base_type, &n) or_return
return
}
_n(io.write_string(w, "struct "), &n) or_return
if info.is_packed { _n(io.write_string(w, "#packed "), &n) or_return }
if info.is_raw_union { _n(io.write_string(w, "#raw_union "), &n) or_return }
io.write_string(w, "struct ", &n) or_return
if info.is_packed { io.write_string(w, "#packed ", &n) or_return }
if info.is_raw_union { io.write_string(w, "#raw_union ", &n) or_return }
if info.custom_align {
_n(io.write_string(w, "#align "), &n) or_return
_n(io.write_i64(w, i64(ti.align), 10), &n) or_return
_n(io.write_byte(w, ' '), &n) or_return
io.write_string(w, "#align ", &n) or_return
io.write_i64(w, i64(ti.align), 10, &n) or_return
io.write_byte(w, ' ', &n) or_return
}
_n(io.write_byte(w, '{'), &n) or_return
io.write_byte(w, '{', &n) or_return
for name, i in info.names {
if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
_n(io.write_string(w, name), &n) or_return
_n(io.write_string(w, ": "), &n) or_return
_n(write_type(w, info.types[i]), &n) or_return
if i > 0 { io.write_string(w, ", ", &n) or_return }
io.write_string(w, name, &n) or_return
io.write_string(w, ": ", &n) or_return
write_type(w, info.types[i], &n) or_return
}
_n(io.write_byte(w, '}'), &n) or_return
io.write_byte(w, '}', &n) or_return
case Type_Info_Union:
_n(io.write_string(w, "union "), &n) or_return
io.write_string(w, "union ", &n) or_return
if info.maybe {
_n(io.write_string(w, "#maybe "), &n) or_return
io.write_string(w, "#maybe ", &n) or_return
}
if info.custom_align {
_n(io.write_string(w, "#align "), &n) or_return
_n(io.write_i64(w, i64(ti.align), 10), &n) or_return
_n(io.write_byte(w, ' '), &n) or_return
io.write_string(w, "#align ", &n) or_return
io.write_i64(w, i64(ti.align), 10, &n) or_return
io.write_byte(w, ' ', &n) or_return
}
_n(io.write_byte(w, '{'), &n) or_return
io.write_byte(w, '{', &n) or_return
for variant, i in info.variants {
if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
_n(write_type(w, variant), &n) or_return
if i > 0 { io.write_string(w, ", ", &n) or_return }
write_type(w, variant, &n) or_return
}
_n(io.write_byte(w, '}'), &n) or_return
io.write_byte(w, '}', &n) or_return
case Type_Info_Enum:
_n(io.write_string(w, "enum "), &n) or_return
_n(write_type(w, info.base), &n) or_return
_n(io.write_string(w, " {"), &n) or_return
io.write_string(w, "enum ", &n) or_return
write_type(w, info.base, &n) or_return
io.write_string(w, " {", &n) or_return
for name, i in info.names {
if i > 0 { _n(io.write_string(w, ", "), &n) or_return }
_n(io.write_string(w, name), &n) or_return
if i > 0 { io.write_string(w, ", ", &n) or_return }
io.write_string(w, name, &n) or_return
}
_n(io.write_byte(w, '}'), &n) or_return
io.write_byte(w, '}', &n) or_return
case Type_Info_Bit_Set:
_n(io.write_string(w, "bit_set["), &n) or_return
io.write_string(w, "bit_set[", &n) or_return
switch {
case is_enum(info.elem):
_n(write_type(w, info.elem), &n) or_return
write_type(w, info.elem, &n) or_return
case is_rune(info.elem):
_n(io.write_encoded_rune(w, rune(info.lower)), &n) or_return
_n(io.write_string(w, ".."), &n) or_return
_n(io.write_encoded_rune(w, rune(info.upper)), &n) or_return
io.write_encoded_rune(w, rune(info.lower), true, &n) or_return
io.write_string(w, "..", &n) or_return
io.write_encoded_rune(w, rune(info.upper), true, &n) or_return
case:
_n(io.write_i64(w, info.lower, 10), &n) or_return
_n(io.write_string(w, ".."), &n) or_return
_n(io.write_i64(w, info.upper, 10), &n) or_return
io.write_i64(w, info.lower, 10, &n) or_return
io.write_string(w, "..", &n) or_return
io.write_i64(w, info.upper, 10, &n) or_return
}
if info.underlying != nil {
_n(io.write_string(w, "; "), &n) or_return
_n(write_type(w, info.underlying), &n) or_return
io.write_string(w, "; ", &n) or_return
write_type(w, info.underlying, &n) or_return
}
_n(io.write_byte(w, ']'), &n) or_return
io.write_byte(w, ']', &n) or_return
case Type_Info_Simd_Vector:
_n(io.write_string(w, "#simd["), &n) or_return
_n(io.write_i64(w, i64(info.count)), &n) or_return
_n(io.write_byte(w, ']'), &n) or_return
_n(write_type(w, info.elem), &n) or_return
io.write_string(w, "#simd[", &n) or_return
io.write_i64(w, i64(info.count), 10, &n) or_return
io.write_byte(w, ']', &n) or_return
write_type(w, info.elem, &n) or_return
case Type_Info_Relative_Pointer:
_n(io.write_string(w, "#relative("), &n) or_return
_n(write_type(w, info.base_integer), &n) or_return
_n(io.write_string(w, ") "), &n) or_return
_n(write_type(w, info.pointer), &n) or_return
io.write_string(w, "#relative(", &n) or_return
write_type(w, info.base_integer, &n) or_return
io.write_string(w, ") ", &n) or_return
write_type(w, info.pointer, &n) or_return
case Type_Info_Relative_Slice:
_n(io.write_string(w, "#relative("), &n) or_return
_n(write_type(w, info.base_integer), &n) or_return
_n(io.write_string(w, ") "), &n) or_return
_n(write_type(w, info.slice), &n) or_return
io.write_string(w, "#relative(", &n) or_return
write_type(w, info.base_integer, &n) or_return
io.write_string(w, ") ", &n) or_return
write_type(w, info.slice, &n) or_return
}
return