authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-09-21 16:14:47+02:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-11-05 16:10:34+01:00
log0316ac959c1435eba4c63579feb0dced05fba366
tree74e454b639a4499b90977f17bc56660166581cf8
parent675de8d6b723aa4be6a51e7f371364799dd7491b

Make std.formatBuf UTF-8 aware


1 files changed, 35 insertions(+), 19 deletions(-)

lib/std/fmt.zig+35-19
......@@ -672,25 +672,34 @@ pub fn formatBuf(
672672 options: FormatOptions,
673673 writer: anytype,
674674) !void {
675 const width = options.width orelse buf.len;
676 const padding = if (width > buf.len) (width - buf.len) else 0;
677
678 switch (options.alignment) {
679 .Left => {
680 try writer.writeAll(buf);
681 try writer.writeByteNTimes(options.fill, padding);
682 },
683 .Center => {
684 const left_padding = padding / 2;
685 const right_padding = (padding + 1) / 2;
686 try writer.writeByteNTimes(options.fill, left_padding);
687 try writer.writeAll(buf);
688 try writer.writeByteNTimes(options.fill, right_padding);
689 },
690 .Right => {
691 try writer.writeByteNTimes(options.fill, padding);
692 try writer.writeAll(buf);
693 },
675 if (options.width) |min_width| {
676 // In case of error assume the buffer content is ASCII-encoded
677 const width = unicode.utf8CountCodepoints(buf) catch |_| buf.len;
678 const padding = if (width < min_width) min_width - width else 0;
679
680 if (padding == 0)
681 return writer.writeAll(buf);
682
683 switch (options.alignment) {
684 .Left => {
685 try writer.writeAll(buf);
686 try writer.writeByteNTimes(options.fill, padding);
687 },
688 .Center => {
689 const left_padding = padding / 2;
690 const right_padding = (padding + 1) / 2;
691 try writer.writeByteNTimes(options.fill, left_padding);
692 try writer.writeAll(buf);
693 try writer.writeByteNTimes(options.fill, right_padding);
694 },
695 .Right => {
696 try writer.writeByteNTimes(options.fill, padding);
697 try writer.writeAll(buf);
698 },
699 }
700 } else {
701 // Fast path, avoid counting the number of codepoints
702 try writer.writeAll(buf);
694703 }
695704}
696705
......@@ -1442,6 +1451,10 @@ test "int.padded" {
14421451 try testFmt("i16: '-12345'", "i16: '{:4}'", .{@as(i16, -12345)});
14431452 try testFmt("i16: '+12345'", "i16: '{:4}'", .{@as(i16, 12345)});
14441453 try testFmt("u16: '12345'", "u16: '{:4}'", .{@as(u16, 12345)});
1454
1455 try testFmt("UTF-8: 'ü '", "UTF-8: '{u:<4}'", .{'ü'});
1456 try testFmt("UTF-8: ' ü'", "UTF-8: '{u:>4}'", .{'ü'});
1457 try testFmt("UTF-8: ' ü '", "UTF-8: '{u:^4}'", .{'ü'});
14451458}
14461459
14471460test "buffer" {
......@@ -1971,6 +1984,9 @@ test "padding" {
19711984 try testFmt("==================Filled", "{:=>24}", .{"Filled"});
19721985 try testFmt(" Centered ", "{:^24}", .{"Centered"});
19731986 try testFmt("-", "{:-^1}", .{""});
1987 try testFmt("==crêpe===", "{:=^10}", .{"crêpe"});
1988 try testFmt("=====crêpe", "{:=>10}", .{"crêpe"});
1989 try testFmt("crêpe=====", "{:=<10}", .{"crêpe"});
19741990}
19751991
19761992test "decimal float padding" {