authorgravatar for emekankurumeh@outlook.comemekoi <emekankurumeh@outlook.com> 2018-11-07 23:36:36-06:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-08 00:36:36-05:00
log8e69a18d8c01aaf2bf4f0c0f8495e47cb36c284f
treec1b44cc9f694148f8ef25b752181c67d59705c15
parentac8898e68150fc9cd2bc04ee6c4ef4d3005b8c27

made colored output more consistent (#1706)

* made colored output more consistent * added os.supportsAnsiEscapeCodes

4 files changed, 69 insertions(+), 36 deletions(-)

src/os.cpp-4
......@@ -1128,9 +1128,6 @@ Error os_get_cwd(Buf *out_cwd) {
11281128#define is_wprefix(s, prefix) \
11291129 (wcsncmp((s), (prefix), sizeof(prefix) / sizeof(WCHAR) - 1) == 0)
11301130static bool is_stderr_cyg_pty(void) {
1131#if defined(__MINGW32__)
1132 return false;
1133#else
11341131 HANDLE stderr_handle = GetStdHandle(STD_ERROR_HANDLE);
11351132 if (stderr_handle == INVALID_HANDLE_VALUE)
11361133 return false;
......@@ -1182,7 +1179,6 @@ static bool is_stderr_cyg_pty(void) {
11821179 }
11831180 free(nameinfo);
11841181 return (p != NULL);
1185#endif
11861182}
11871183#endif
11881184
std/debug/index.zig+56-31
......@@ -171,7 +171,9 @@ pub fn panicExtra(trace: ?*const builtin.StackTrace, first_trace_addr: ?usize, c
171171 os.abort();
172172}
173173
174const RED = "\x1b[31;1m";
174175const GREEN = "\x1b[32;1m";
176const CYAN = "\x1b[36;1m";
175177const WHITE = "\x1b[37;1m";
176178const DIM = "\x1b[2m";
177179const RESET = "\x1b[0m";
......@@ -454,38 +456,61 @@ const TtyColor = enum.{
454456
455457/// TODO this is a special case hack right now. clean it up and maybe make it part of std.fmt
456458fn setTtyColor(tty_color: TtyColor) void {
457 const S = struct.{
458 var attrs: windows.WORD = undefined;
459 var init_attrs = false;
460 };
461 if (!S.init_attrs) {
462 S.init_attrs = true;
463 var info: windows.CONSOLE_SCREEN_BUFFER_INFO = undefined;
464 // TODO handle error
465 _ = windows.GetConsoleScreenBufferInfo(stderr_file.handle, &info);
466 S.attrs = info.wAttributes;
467 }
459 if (os.supportsAnsiEscapeCodes(stderr_file.handle)) {
460 switch (tty_color) {
461 TtyColor.Red => {
462 stderr_file.write(RED) catch return;
463 },
464 TtyColor.Green => {
465 stderr_file.write(GREEN) catch return;
466 },
467 TtyColor.Cyan => {
468 stderr_file.write(CYAN) catch return;
469 },
470 TtyColor.White, TtyColor.Bold => {
471 stderr_file.write(WHITE) catch return;
472 },
473 TtyColor.Dim => {
474 stderr_file.write(DIM) catch return;
475 },
476 TtyColor.Reset => {
477 stderr_file.write(RESET) catch return;
478 },
479 }
480 } else {
481 const S = struct.{
482 var attrs: windows.WORD = undefined;
483 var init_attrs = false;
484 };
485 if (!S.init_attrs) {
486 S.init_attrs = true;
487 var info: windows.CONSOLE_SCREEN_BUFFER_INFO = undefined;
488 // TODO handle error
489 _ = windows.GetConsoleScreenBufferInfo(stderr_file.handle, &info);
490 S.attrs = info.wAttributes;
491 }
468492
469 // TODO handle errors
470 switch (tty_color) {
471 TtyColor.Red => {
472 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_RED | windows.FOREGROUND_INTENSITY);
473 },
474 TtyColor.Green => {
475 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_GREEN | windows.FOREGROUND_INTENSITY);
476 },
477 TtyColor.Cyan => {
478 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_GREEN | windows.FOREGROUND_BLUE | windows.FOREGROUND_INTENSITY);
479 },
480 TtyColor.White, TtyColor.Bold => {
481 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_RED | windows.FOREGROUND_GREEN | windows.FOREGROUND_BLUE | windows.FOREGROUND_INTENSITY);
482 },
483 TtyColor.Dim => {
484 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_INTENSITY);
485 },
486 TtyColor.Reset => {
487 _ = windows.SetConsoleTextAttribute(stderr_file.handle, S.attrs);
488 },
493 // TODO handle errors
494 switch (tty_color) {
495 TtyColor.Red => {
496 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_RED | windows.FOREGROUND_INTENSITY);
497 },
498 TtyColor.Green => {
499 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_GREEN | windows.FOREGROUND_INTENSITY);
500 },
501 TtyColor.Cyan => {
502 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_GREEN | windows.FOREGROUND_BLUE | windows.FOREGROUND_INTENSITY);
503 },
504 TtyColor.White, TtyColor.Bold => {
505 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_RED | windows.FOREGROUND_GREEN | windows.FOREGROUND_BLUE | windows.FOREGROUND_INTENSITY);
506 },
507 TtyColor.Dim => {
508 _ = windows.SetConsoleTextAttribute(stderr_file.handle, windows.FOREGROUND_INTENSITY);
509 },
510 TtyColor.Reset => {
511 _ = windows.SetConsoleTextAttribute(stderr_file.handle, S.attrs);
512 },
513 }
489514 }
490515}
491516
std/os/index.zig+12
......@@ -2272,6 +2272,18 @@ pub fn isTty(handle: FileHandle) bool {
22722272 }
22732273}
22742274
2275pub fn supportsAnsiEscapeCodes(handle: FileHandle) bool {
2276 if (is_windows) {
2277 return windows_util.windowsIsCygwinPty(handle);
2278 } else {
2279 if (builtin.link_libc) {
2280 return c.isatty(handle) != 0;
2281 } else {
2282 return posix.isatty(handle);
2283 }
2284 }
2285}
2286
22752287pub const PosixSocketError = error.{
22762288 /// Permission to create a socket of the specified type and/or
22772289 /// pro‐tocol is denied.
std/os/windows/util.zig+1-1
......@@ -91,7 +91,7 @@ pub fn windowsIsCygwinPty(handle: windows.HANDLE) bool {
9191 @ptrCast(*c_void, &name_info_bytes[0]),
9292 @intCast(u32, name_info_bytes.len),
9393 ) == 0) {
94 return true;
94 return false;
9595 }
9696
9797 const name_info = @ptrCast(*const windows.FILE_NAME_INFO, &name_info_bytes[0]);