| ... | ... | @@ -18,6 +18,7 @@ pub fn format(context: var, comptime Errors: type, output: fn (@typeOf(context), |
| 18 | 18 | OpenBrace, |
| 19 | 19 | CloseBrace, |
| 20 | 20 | FormatString, |
| 21 | Pointer, |
| 21 | 22 | }; |
| 22 | 23 | |
| 23 | 24 | comptime var start_index = 0; |
| ... | ... | @@ -54,6 +55,7 @@ pub fn format(context: var, comptime Errors: type, output: fn (@typeOf(context), |
| 54 | 55 | state = State.Start; |
| 55 | 56 | start_index = i + 1; |
| 56 | 57 | }, |
| 58 | '*' => state = State.Pointer, |
| 57 | 59 | else => { |
| 58 | 60 | state = State.FormatString; |
| 59 | 61 | }, |
| ... | ... | @@ -75,6 +77,17 @@ pub fn format(context: var, comptime Errors: type, output: fn (@typeOf(context), |
| 75 | 77 | }, |
| 76 | 78 | else => {}, |
| 77 | 79 | }, |
| 80 | State.Pointer => switch (c) { |
| 81 | '}' => { |
| 82 | try output(context, @typeName(@typeOf(args[next_arg]).Child)); |
| 83 | try output(context, "@"); |
| 84 | try formatInt(@ptrToInt(args[next_arg]), 16, false, 0, context, Errors, output); |
| 85 | next_arg += 1; |
| 86 | state = State.Start; |
| 87 | start_index = i + 1; |
| 88 | }, |
| 89 | else => @compileError("Unexpected format character after '*'"), |
| 90 | }, |
| 78 | 91 | } |
| 79 | 92 | } |
| 80 | 93 | comptime { |
| ... | ... | @@ -861,6 +874,27 @@ test "fmt.format" { |
| 861 | 874 | const value: u8 = 'a'; |
| 862 | 875 | try testFmt("u8: a\n", "u8: {c}\n", value); |
| 863 | 876 | } |
| 877 | { |
| 878 | const value: [3]u8 = "abc"; |
| 879 | try testFmt("array: abc\n", "array: {}\n", value); |
| 880 | try testFmt("array: abc\n", "array: {}\n", &value); |
| 881 | |
| 882 | var buf: [100]u8 = undefined; |
| 883 | try testFmt( |
| 884 | try bufPrint(buf[0..], "array: [3]u8@{x}\n", @ptrToInt(&value)), |
| 885 | "array: {*}\n", |
| 886 | &value, |
| 887 | ); |
| 888 | } |
| 889 | { |
| 890 | const value: []const u8 = "abc"; |
| 891 | try testFmt("slice: abc\n", "slice: {}\n", value); |
| 892 | } |
| 893 | { |
| 894 | const value = @intToPtr(*i32, 0xdeadbeef); |
| 895 | try testFmt("pointer: i32@deadbeef\n", "pointer: {}\n", value); |
| 896 | try testFmt("pointer: i32@deadbeef\n", "pointer: {*}\n", value); |
| 897 | } |
| 864 | 898 | try testFmt("buf: Test \n", "buf: {s5}\n", "Test"); |
| 865 | 899 | try testFmt("buf: Test\n Other text", "buf: {s}\n Other text", "Test"); |
| 866 | 900 | try testFmt("cstr: Test C\n", "cstr: {s}\n", c"Test C"); |