mirror of
https://github.com/ziglang/zig.git
synced 2025-12-17 19:53:06 +00:00
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:
parent
57b90d2d98
commit
6844dafeca
24
std/fmt.zig
24
std/fmt.zig
@ -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 => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user