From 6647c3f05428234749bd13b8d0ea1736a03a6a04 Mon Sep 17 00:00:00 2001 From: data-man Date: Wed, 13 May 2020 18:07:52 +0500 Subject: [PATCH] Fixes fmt padding for some types --- lib/std/fmt.zig | 54 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 7421357a61..16b3439f0c 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -334,16 +334,16 @@ pub fn formatType( return formatValue(value, fmt, options, out_stream); }, .Void => { - return out_stream.writeAll("void"); + return formatBuf("void", options, out_stream); }, .Bool => { - return out_stream.writeAll(if (value) "true" else "false"); + return formatBuf(if (value) "true" else "false", options, out_stream); }, .Optional => { if (value) |payload| { return formatType(payload, fmt, options, out_stream, max_depth); } else { - return out_stream.writeAll("null"); + return formatBuf("null", options, out_stream); } }, .ErrorUnion => { @@ -495,7 +495,7 @@ fn formatValue( switch (@typeInfo(T)) { .Float => return formatFloatValue(value, fmt, options, out_stream), .Int, .ComptimeInt => return formatIntValue(value, fmt, options, out_stream), - .Bool => return out_stream.writeAll(if (value) "true" else "false"), + .Bool => return formatBuf(if (value) "true" else "false", options, out_stream), else => comptime unreachable, } } @@ -561,9 +561,7 @@ pub fn formatText( options: FormatOptions, out_stream: var, ) !void { - if (fmt.len == 0) { - return out_stream.writeAll(bytes); - } else if (comptime std.mem.eql(u8, fmt, "s")) { + if (comptime std.mem.eql(u8, fmt, "s") or (fmt.len == 0)) { return formatBuf(bytes, options, out_stream); } else if (comptime (std.mem.eql(u8, fmt, "x") or std.mem.eql(u8, fmt, "X"))) { for (bytes) |c| { @@ -588,13 +586,30 @@ pub fn formatBuf( options: FormatOptions, out_stream: var, ) !void { - try out_stream.writeAll(buf); - - const width = options.width orelse 0; - var leftover_padding = if (width > buf.len) (width - buf.len) else return; + const width = options.width orelse buf.len; + const alignment = options.alignment orelse .Left; + var padding = if (width > buf.len) (width - buf.len) else 0; const pad_byte = [1]u8{options.fill}; - while (leftover_padding > 0) : (leftover_padding -= 1) { - try out_stream.writeAll(&pad_byte); + switch (alignment) { + .Left => { + try out_stream.writeAll(buf); + while (padding > 0) : (padding -= 1) { + try out_stream.writeAll(&pad_byte); + } + }, + .Center => { + const padl = padding / 2; + var i: usize = 0; + while (i < padl) : (i += 1) try out_stream.writeAll(&pad_byte); + try out_stream.writeAll(buf); + while (i < padding) : (i += 1) try out_stream.writeAll(&pad_byte); + }, + .Right => { + while (padding > 0) : (padding -= 1) { + try out_stream.writeAll(&pad_byte); + } + try out_stream.writeAll(buf); + }, } } @@ -1686,3 +1701,16 @@ test "vector" { test "enum-literal" { try testFmt(".hello_world", "{}", .{.hello_world}); } + +test "padding" { + try testFmt("Simple", "{}", .{"Simple"}); + try testFmt("true ", "{:10}", .{true}); + try testFmt(" true", "{:>10}", .{true}); + try testFmt("======true", "{:=>10}", .{true}); + try testFmt("true======", "{:=<10}", .{true}); + try testFmt(" true ", "{:^10}", .{true}); + try testFmt("===true===", "{:=^10}", .{true}); + try testFmt("Minimum width", "{:18} width", .{"Minimum"}); + try testFmt("==================Filled", "{:=>24}", .{"Filled"}); + try testFmt(" Centered ", "{:^24}", .{"Centered"}); +}