diff --git a/vlib/builtin/builtin.v b/vlib/builtin/builtin.v index 25ee8406f6..12f1f02e15 100644 --- a/vlib/builtin/builtin.v +++ b/vlib/builtin/builtin.v @@ -6,6 +6,9 @@ module builtin __global g_m2_buf byteptr __global g_m2_ptr byteptr +type FnExitCb fn() +fn C.atexit(f FnExitCb) int + pub fn exit(code int) { C.exit(code) } @@ -66,48 +69,25 @@ pub fn eprintln(s string) { if s.str == 0 { eprintln('eprintln(NIL)') } - $if !windows { - C.fflush(C.stdout) - C.fflush(C.stderr) - C.fprintf(C.stderr, '%.*s\n', s.len, s.str) - C.fflush(C.stderr) - return - } - // TODO issues with stderr and cross compiling for Linux - println(s) + C.fflush(C.stdout) + C.fflush(C.stderr) + C.write(2, s.str, s.len) + C.write(2, c'\n', 1) + C.fflush(C.stderr) } pub fn eprint(s string) { if s.str == 0 { eprintln('eprint(NIL)') } - $if !windows { - C.fflush(C.stdout) - C.fflush(C.stderr) - C.fprintf(C.stderr, '%.*s', s.len, s.str) - C.fflush(C.stderr) - return - } - print(s) + C.fflush(C.stdout) + C.fflush(C.stderr) + C.write(2, s.str, s.len) + C.fflush(C.stderr) } pub fn print(s string) { - $if windows { - output_handle := C.GetStdHandle(C.STD_OUTPUT_HANDLE) - mut bytes_written := 0 - if is_atty(1) > 0 { - wide_str := s.to_wide() - wide_len := C.wcslen(wide_str) - C.WriteConsole(output_handle, wide_str, wide_len, &bytes_written, 0) - unsafe { - free(wide_str) - } - } else { - C.WriteFile(output_handle, s.str, s.len, &bytes_written, 0) - } - } $else { - C.printf('%.*s', s.len, s.str) - } + C.write(1, s.str, s.len) } const ( diff --git a/vlib/builtin/builtin_windows.c.v b/vlib/builtin/builtin_windows.c.v index 44bb33e241..239d87b80b 100644 --- a/vlib/builtin/builtin_windows.c.v +++ b/vlib/builtin/builtin_windows.c.v @@ -59,11 +59,25 @@ const ( symopt_debug = 0x80000000 ) +// g_original_codepage - used to restore the original windows console code page when exiting +__global g_original_codepage u32=0 +// utf8 to stdout needs C.SetConsoleOutputCP(C.CP_UTF8) +fn C.GetConsoleOutputCP() u32 +fn C.SetConsoleOutputCP(wCodePageID u32) bool +fn restore_codepage() { + C.SetConsoleOutputCP( g_original_codepage ) +} + fn builtin_init() { + g_original_codepage = C.GetConsoleOutputCP() + C.SetConsoleOutputCP(C.CP_UTF8) + C.atexit(restore_codepage) if is_atty(1) > 0 { C.SetConsoleMode(C.GetStdHandle(C.STD_OUTPUT_HANDLE), C.ENABLE_PROCESSED_OUTPUT | 0x0004) // enable_virtual_terminal_processing + C.SetConsoleMode(C.GetStdHandle(C.STD_ERROR_HANDLE), C.ENABLE_PROCESSED_OUTPUT | 0x0004) // enable_virtual_terminal_processing unsafe { C.setbuf(C.stdout, 0) + C.setbuf(C.stderr, 0) } } add_unhandled_exception_handler()