From a31ff072d18a170d427d97a1e7fa1a5afe3b27bf Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 5 Dec 2022 16:27:20 -0700 Subject: [PATCH 1/2] stage2: make --color on affect progress bar too Before, --color on would affect colored compile error printing but not affect terminal progress bar printing. It was intended for this option to affect both; now it does. This causes a failure when building the language reference, which contains code for parsing terminal output and rendering HTML. Now it must be expanded to handle 'K' and 'D' codes to simulate a terminal cursor moving, and the CI will fail until that capability is added in a later commit of this branch. I extracted this change from #13560 so that the idea is not lost but we can solve this issue separately. --- src/Compilation.zig | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Compilation.zig b/src/Compilation.zig index 4c7489c0c8..b1fdf0755b 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -2356,7 +2356,16 @@ pub fn update(comp: *Compilation) !void { var progress: std.Progress = .{ .dont_print_on_dumb = true }; const main_progress_node = progress.start("", 0); defer main_progress_node.end(); - if (comp.color == .off) progress.terminal = null; + switch (comp.color) { + .off => { + progress.terminal = null; + }, + .on => { + progress.terminal = std.io.getStdErr(); + progress.supports_ansi_escape_codes = true; + }, + .auto => {}, + } try comp.performAllTheWork(main_progress_node); From 95fe23f572e30358d037301abf0eb82b6b61bdf8 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Tue, 3 Jan 2023 14:03:43 +0200 Subject: [PATCH 2/2] docgen: handle 'K' and 'D' escape codes --- doc/docgen.zig | 66 ++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/doc/docgen.zig b/doc/docgen.zig index 191dada602..4057a52f07 100644 --- a/doc/docgen.zig +++ b/doc/docgen.zig @@ -760,17 +760,6 @@ fn writeEscaped(out: anytype, input: []const u8) !void { //#define VT_BOLD "\x1b[0;1m" //#define VT_RESET "\x1b[0m" -const TermState = enum { - Start, - Escape, - LBracket, - Number, - AfterNumber, - Arg, - ArgNumber, - ExpectEnd, -}; - test "term color" { const input_bytes = "A\x1b[32;1mgreen\x1b[0mB"; const result = try termColor(std.testing.allocator, input_bytes); @@ -787,61 +776,80 @@ fn termColor(allocator: Allocator, input: []const u8) ![]u8 { var first_number: usize = undefined; var second_number: usize = undefined; var i: usize = 0; - var state = TermState.Start; + var state: enum { + start, + escape, + lbracket, + number, + after_number, + arg, + arg_number, + expect_end, + } = .start; + var last_new_line: usize = 0; var open_span_count: usize = 0; while (i < input.len) : (i += 1) { const c = input[i]; switch (state) { - TermState.Start => switch (c) { - '\x1b' => state = TermState.Escape, + .start => switch (c) { + '\x1b' => state = .escape, + '\n' => { + try out.writeByte(c); + last_new_line = buf.items.len; + }, else => try out.writeByte(c), }, - TermState.Escape => switch (c) { - '[' => state = TermState.LBracket, + .escape => switch (c) { + '[' => state = .lbracket, else => return error.UnsupportedEscape, }, - TermState.LBracket => switch (c) { + .lbracket => switch (c) { '0'...'9' => { number_start_index = i; - state = TermState.Number; + state = .number; }, else => return error.UnsupportedEscape, }, - TermState.Number => switch (c) { + .number => switch (c) { '0'...'9' => {}, else => { first_number = std.fmt.parseInt(usize, input[number_start_index..i], 10) catch unreachable; second_number = 0; - state = TermState.AfterNumber; + state = .after_number; i -= 1; }, }, - TermState.AfterNumber => switch (c) { - ';' => state = TermState.Arg, + .after_number => switch (c) { + ';' => state = .arg, + 'D' => state = .start, + 'K' => { + buf.items.len = last_new_line; + state = .start; + }, else => { - state = TermState.ExpectEnd; + state = .expect_end; i -= 1; }, }, - TermState.Arg => switch (c) { + .arg => switch (c) { '0'...'9' => { number_start_index = i; - state = TermState.ArgNumber; + state = .arg_number; }, else => return error.UnsupportedEscape, }, - TermState.ArgNumber => switch (c) { + .arg_number => switch (c) { '0'...'9' => {}, else => { second_number = std.fmt.parseInt(usize, input[number_start_index..i], 10) catch unreachable; - state = TermState.ExpectEnd; + state = .expect_end; i -= 1; }, }, - TermState.ExpectEnd => switch (c) { + .expect_end => switch (c) { 'm' => { - state = TermState.Start; + state = .start; while (open_span_count != 0) : (open_span_count -= 1) { try out.writeAll(""); }