123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #+build ignore
- package custom_formatter_example
- import "core:fmt"
- import "core:io"
- SomeType :: struct {
- value: int,
- }
- My_Custom_Base_Type :: distinct u32
- main :: proc() {
- // Ensure the fmt._user_formatters map is initialized
- fmt.set_user_formatters(new(map[typeid]fmt.User_Formatter))
- // Register custom formatters for my favorite types
- err := fmt.register_user_formatter(type_info_of(SomeType).id, SomeType_Formatter)
- assert(err == .None)
- err = fmt.register_user_formatter(type_info_of(My_Custom_Base_Type).id, My_Custom_Base_Formatter)
- assert(err == .None)
- // Use the custom formatters.
- fmt.printfln("SomeType{{42}}: '%v'", SomeType{42})
- fmt.printfln("My_Custom_Base_Type(0xdeadbeef): '%v'", My_Custom_Base_Type(0xdeadbeef))
- }
- SomeType_Formatter :: proc(fi: ^fmt.Info, arg: any, verb: rune) -> bool {
- m := cast(^SomeType)arg.data
- switch verb {
- case 'v', 'd': // We handle `%v` and `%d`
- fmt.fmt_int(fi, u64(m.value), true, 8 * size_of(SomeType), verb)
- case:
- return false
- }
- return true
- }
- My_Custom_Base_Formatter :: proc(fi: ^fmt.Info, arg: any, verb: rune) -> bool {
- m := cast(^My_Custom_Base_Type)arg.data
- switch verb {
- case 'v', 'b':
- value := u64(m^)
- for value > 0 {
- if value & 1 == 1 {
- io.write_string(fi.writer, "Hellope!", &fi.n)
- } else {
- io.write_string(fi.writer, "Hellope?", &fi.n)
- }
- value >>= 1
- }
- case:
- return false
- }
- return true
- }
|