|
@@ -1247,6 +1247,18 @@ fmt_write_array :: proc(fi: ^Info, array_data: rawptr, count: int, elem_size: in
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+@(private)
|
|
|
|
+handle_tag :: proc(info: reflect.Type_Info_Struct, i: int, verb: ^rune) -> (do_continue: bool) {
|
|
|
|
+ tag := info.tags[i]
|
|
|
|
+ if value, ok := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "fmt"); ok {
|
|
|
|
+ if value == "-" {
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false
|
|
|
|
+}
|
|
|
|
+
|
|
fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
write_padded_number :: proc(fi: ^Info, i: i64, width: int) {
|
|
write_padded_number :: proc(fi: ^Info, i: i64, width: int) {
|
|
n := width-1
|
|
n := width-1
|
|
@@ -1465,6 +1477,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
defer io.write_byte(fi.writer, '}', &fi.n)
|
|
defer io.write_byte(fi.writer, '}', &fi.n)
|
|
|
|
|
|
for name, i in b.names {
|
|
for name, i in b.names {
|
|
|
|
+ verb := 'v'
|
|
field_count += 1
|
|
field_count += 1
|
|
|
|
|
|
if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
|
if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
|
@@ -1481,7 +1494,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
} else {
|
|
} else {
|
|
data := rawptr(uintptr(v.data) + b.offsets[i] + index*t_size)
|
|
data := rawptr(uintptr(v.data) + b.offsets[i] + index*t_size)
|
|
- fmt_arg(fi, any{data, t.id}, 'v')
|
|
|
|
|
|
+ fmt_arg(fi, any{data, t.id}, verb)
|
|
}
|
|
}
|
|
|
|
|
|
if hash { io.write_string(fi.writer, ",\n", &fi.n) }
|
|
if hash { io.write_string(fi.writer, ",\n", &fi.n) }
|
|
@@ -1490,6 +1503,10 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
} else {
|
|
} else {
|
|
field_count := -1
|
|
field_count := -1
|
|
for name, i in b.names {
|
|
for name, i in b.names {
|
|
|
|
+ verb := 'v'
|
|
|
|
+ if handle_tag(b, i, &verb) {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
field_count += 1
|
|
field_count += 1
|
|
|
|
|
|
if !hash && field_count > 0 { io.write_string(fi.writer, ", ") }
|
|
if !hash && field_count > 0 { io.write_string(fi.writer, ", ") }
|
|
@@ -1504,7 +1521,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
} else {
|
|
} else {
|
|
data := rawptr(uintptr(v.data) + b.offsets[i])
|
|
data := rawptr(uintptr(v.data) + b.offsets[i])
|
|
- fmt_arg(fi, any{data, t.id}, 'v')
|
|
|
|
|
|
+ fmt_arg(fi, any{data, t.id}, verb)
|
|
}
|
|
}
|
|
|
|
|
|
if hash { io.write_string(fi.writer, ",\n", &fi.n) }
|
|
if hash { io.write_string(fi.writer, ",\n", &fi.n) }
|
|
@@ -1793,6 +1810,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
defer io.write_byte(fi.writer, '}', &fi.n)
|
|
defer io.write_byte(fi.writer, '}', &fi.n)
|
|
|
|
|
|
for i in 0..<actual_field_count {
|
|
for i in 0..<actual_field_count {
|
|
|
|
+ verb := 'v'
|
|
name := info.names[i]
|
|
name := info.names[i]
|
|
field_count += 1
|
|
field_count += 1
|
|
|
|
|
|
@@ -1811,7 +1829,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
} else {
|
|
} else {
|
|
data := rawptr(uintptr(v.data) + info.offsets[i] + index*t_size)
|
|
data := rawptr(uintptr(v.data) + info.offsets[i] + index*t_size)
|
|
- fmt_arg(fi, any{data, t.id}, 'v')
|
|
|
|
|
|
+ fmt_arg(fi, any{data, t.id}, verb)
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
t := info.types[i].variant.(runtime.Type_Info_Pointer).elem
|
|
t := info.types[i].variant.(runtime.Type_Info_Pointer).elem
|
|
@@ -1821,7 +1839,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
} else {
|
|
} else {
|
|
field_ptr := (^^byte)(uintptr(v.data) + info.offsets[i])^
|
|
field_ptr := (^^byte)(uintptr(v.data) + info.offsets[i])^
|
|
data := rawptr(uintptr(field_ptr) + index*t_size)
|
|
data := rawptr(uintptr(field_ptr) + index*t_size)
|
|
- fmt_arg(fi, any{data, t.id}, 'v')
|
|
|
|
|
|
+ fmt_arg(fi, any{data, t.id}, verb)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1831,6 +1849,11 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
} else {
|
|
} else {
|
|
field_count := -1
|
|
field_count := -1
|
|
for name, i in info.names {
|
|
for name, i in info.names {
|
|
|
|
+ verb := 'v'
|
|
|
|
+ if handle_tag(info, i, &verb) {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
field_count += 1
|
|
field_count += 1
|
|
|
|
|
|
if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
|
if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) }
|
|
@@ -1841,11 +1864,12 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|
io.write_string(fi.writer, name, &fi.n)
|
|
io.write_string(fi.writer, name, &fi.n)
|
|
io.write_string(fi.writer, " = ", &fi.n)
|
|
io.write_string(fi.writer, " = ", &fi.n)
|
|
|
|
|
|
|
|
+
|
|
if t := info.types[i]; reflect.is_any(t) {
|
|
if t := info.types[i]; reflect.is_any(t) {
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
io.write_string(fi.writer, "any{}", &fi.n)
|
|
} else {
|
|
} else {
|
|
data := rawptr(uintptr(v.data) + info.offsets[i])
|
|
data := rawptr(uintptr(v.data) + info.offsets[i])
|
|
- fmt_arg(fi, any{data, t.id}, 'v')
|
|
|
|
|
|
+ fmt_arg(fi, any{data, t.id}, verb)
|
|
}
|
|
}
|
|
|
|
|
|
if hash {
|
|
if hash {
|