std/fmt: Move pointer parsing out of main state machine

This allows us to format a pointer with alignment/padding as we would
with any other format specifier.

e.g. {*:5}
This commit is contained in:
Marc Tiehuis 2019-08-05 19:07:31 +12:00
parent 57b90d2d98
commit 6844dafeca

View File

@ -69,7 +69,6 @@ pub fn format(
FormatFillAndAlign, FormatFillAndAlign,
FormatWidth, FormatWidth,
FormatPrecision, FormatPrecision,
Pointer,
}; };
comptime var start_index = 0; comptime var start_index = 0;
@ -109,9 +108,6 @@ pub fn format(
state = .Start; state = .Start;
start_index = i; start_index = i;
}, },
'*' => {
state = .Pointer;
},
':' => { ':' => {
state = if (comptime peekIsAlign(fmt[i..])) State.FormatFillAndAlign else State.FormatWidth; state = if (comptime peekIsAlign(fmt[i..])) State.FormatFillAndAlign else State.FormatWidth;
specifier_end = i; specifier_end = i;
@ -256,19 +252,6 @@ pub fn format(
@compileError("Unexpected character in precision value: " ++ [_]u8{c}); @compileError("Unexpected character in precision value: " ++ [_]u8{c});
}, },
}, },
.Pointer => switch (c) {
'}' => {
const arg_to_print = comptime nextArg(&used_pos_args, maybe_pos_arg, &next_arg);
try output(context, @typeName(@typeOf(args[arg_to_print]).Child));
try output(context, "@");
try formatInt(@ptrToInt(args[arg_to_print]), 16, false, 0, context, Errors, output);
state = .Start;
start_index = i + 1;
},
else => @compileError("Unexpected format character after '*'"),
},
} }
} }
comptime { comptime {
@ -299,6 +282,13 @@ pub fn formatType(
output: fn (@typeOf(context), []const u8) Errors!void, output: fn (@typeOf(context), []const u8) Errors!void,
max_depth: usize, max_depth: usize,
) Errors!void { ) Errors!void {
if (comptime std.mem.eql(u8, fmt, "*")) {
try output(context, @typeName(@typeOf(value).Child));
try output(context, "@");
try formatInt(@ptrToInt(value), 16, false, 0, context, Errors, output);
return;
}
const T = @typeOf(value); const T = @typeOf(value);
switch (@typeInfo(T)) { switch (@typeInfo(T)) {
.ComptimeInt, .Int, .Float => { .ComptimeInt, .Int, .Float => {