Add extra pointer printing options to fmt.printf

This commit is contained in:
gingerBill
2019-03-15 23:49:47 +00:00
parent 231f3cc15a
commit 14c6f2f258
+18 -2
View File
@@ -673,13 +673,20 @@ fmt_cstring :: proc(fi: ^Info, s: cstring, verb: rune) {
} }
fmt_pointer :: proc(fi: ^Info, p: rawptr, verb: rune) { fmt_pointer :: proc(fi: ^Info, p: rawptr, verb: rune) {
u := u64(uintptr(p));
switch verb { switch verb {
case 'p', 'v': case 'p', 'v':
u := u64(uintptr(p));
if !fi.hash || verb == 'v' { if !fi.hash || verb == 'v' {
strings.write_string(fi.buf, "0x"); strings.write_string(fi.buf, "0x");
} }
_fmt_int(fi, u, 16, false, 8*size_of(rawptr), __DIGITS_UPPER); _fmt_int(fi, u, 16, false, 8*size_of(rawptr), __DIGITS_UPPER);
case 'b': _fmt_int(fi, u, 2, false, 8*size_of(rawptr), __DIGITS_UPPER);
case 'o': _fmt_int(fi, u, 8, false, 8*size_of(rawptr), __DIGITS_UPPER);
case 'd': _fmt_int(fi, u, 10, false, 8*size_of(rawptr), __DIGITS_UPPER);
case 'x': _fmt_int(fi, u, 16, false, 8*size_of(rawptr), __DIGITS_UPPER);
case 'X': _fmt_int(fi, u, 16, false, 8*size_of(rawptr), __DIGITS_UPPER);
case: case:
fmt_bad_verb(fi, verb); fmt_bad_verb(fi, verb);
} }
@@ -1046,6 +1053,10 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
} }
case runtime.Type_Info_Dynamic_Array: case runtime.Type_Info_Dynamic_Array:
if verb == 'p' {
slice := cast(^mem.Raw_Dynamic_Array)v.data;
fmt_pointer(fi, slice.data, 'p');
} else {
strings.write_byte(fi.buf, '['); strings.write_byte(fi.buf, '[');
defer strings.write_byte(fi.buf, ']'); defer strings.write_byte(fi.buf, ']');
array := cast(^mem.Raw_Dynamic_Array)v.data; array := cast(^mem.Raw_Dynamic_Array)v.data;
@@ -1055,6 +1066,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
data := uintptr(array.data) + uintptr(i*info.elem_size); data := uintptr(array.data) + uintptr(i*info.elem_size);
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb); fmt_arg(fi, any{rawptr(data), info.elem.id}, verb);
} }
}
case runtime.Type_Info_Simd_Vector: case runtime.Type_Info_Simd_Vector:
if info.is_x86_mmx { if info.is_x86_mmx {
@@ -1071,6 +1083,10 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
case runtime.Type_Info_Slice: case runtime.Type_Info_Slice:
if verb == 'p' {
slice := cast(^mem.Raw_Slice)v.data;
fmt_pointer(fi, slice.data, 'p');
} else {
strings.write_byte(fi.buf, '['); strings.write_byte(fi.buf, '[');
defer strings.write_byte(fi.buf, ']'); defer strings.write_byte(fi.buf, ']');
slice := cast(^mem.Raw_Slice)v.data; slice := cast(^mem.Raw_Slice)v.data;
@@ -1080,7 +1096,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
data := uintptr(slice.data) + uintptr(i*info.elem_size); data := uintptr(slice.data) + uintptr(i*info.elem_size);
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb); fmt_arg(fi, any{rawptr(data), info.elem.id}, verb);
} }
}
case runtime.Type_Info_Map: case runtime.Type_Info_Map:
if verb != 'v' { if verb != 'v' {
fmt_bad_verb(fi, verb); fmt_bad_verb(fi, verb);