From 2a777da6f240ef4f3c00979607fc193cb5a511de Mon Sep 17 00:00:00 2001 From: viri Date: Sun, 6 Jun 2021 20:23:07 -0600 Subject: [PATCH 1/2] windows: remove `TCHAR` idiom entirely --- lib/std/os/windows.zig | 12 ++++++------ lib/std/os/windows/bits.zig | 4 ---- lib/std/os/windows/kernel32.zig | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index 8e8351e4464d..b5da153e5907 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -1922,19 +1922,19 @@ pub fn loadWinsockExtensionFunction(comptime T: type, sock: ws2_32.SOCKET, guid: pub fn unexpectedError(err: Win32Error) std.os.UnexpectedError { if (std.os.unexpected_error_tracing) { // 614 is the length of the longest windows error desciption - var buf_u16: [614]u16 = undefined; - var buf_u8: [614]u8 = undefined; + var buf_wstr: [614]WCHAR = undefined; + var buf_utf8: [614]u8 = undefined; const len = kernel32.FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, err, MAKELANGID(LANG.NEUTRAL, SUBLANG.DEFAULT), - &buf_u16, - buf_u16.len / @sizeOf(TCHAR), + &buf_wstr, + buf_wstr.len, null, ); - _ = std.unicode.utf16leToUtf8(&buf_u8, buf_u16[0..len]) catch unreachable; - std.debug.warn("error.Unexpected: GetLastError({}): {s}\n", .{ @enumToInt(err), buf_u8[0..len] }); + _ = std.unicode.utf16leToUtf8(&buf_utf8, buf_wstr[0..len]) catch unreachable; + std.debug.warn("error.Unexpected: GetLastError({}): {s}\n", .{ @enumToInt(err), buf_utf8[0..len] }); std.debug.dumpCurrentStackTrace(null); } return error.Unexpected; diff --git a/lib/std/os/windows/bits.zig b/lib/std/os/windows/bits.zig index 6fff56e71e6c..f4819544f597 100644 --- a/lib/std/os/windows/bits.zig +++ b/lib/std/os/windows/bits.zig @@ -52,23 +52,19 @@ pub const INT = c_int; pub const LPBYTE = *BYTE; pub const LPCH = *CHAR; pub const LPCSTR = [*:0]const CHAR; -pub const LPCTSTR = [*:0]const TCHAR; pub const LPCVOID = *const c_void; pub const LPDWORD = *DWORD; pub const LPSTR = [*:0]CHAR; -pub const LPTSTR = if (UNICODE) LPWSTR else LPSTR; pub const LPVOID = *c_void; pub const LPWSTR = [*:0]WCHAR; pub const LPCWSTR = [*:0]const WCHAR; pub const PVOID = *c_void; pub const PWSTR = [*:0]WCHAR; pub const SIZE_T = usize; -pub const TCHAR = if (UNICODE) WCHAR else u8; pub const UINT = c_uint; pub const ULONG_PTR = usize; pub const LONG_PTR = isize; pub const DWORD_PTR = ULONG_PTR; -pub const UNICODE = false; pub const WCHAR = u16; pub const WORD = u16; pub const DWORD = u32; diff --git a/lib/std/os/windows/kernel32.zig b/lib/std/os/windows/kernel32.zig index f2e8b87d74c2..e50301f799b2 100644 --- a/lib/std/os/windows/kernel32.zig +++ b/lib/std/os/windows/kernel32.zig @@ -89,7 +89,7 @@ pub extern "kernel32" fn GetCommandLineW() callconv(WINAPI) LPWSTR; pub extern "kernel32" fn GetConsoleMode(in_hConsoleHandle: HANDLE, out_lpMode: *DWORD) callconv(WINAPI) BOOL; pub extern "kernel32" fn GetConsoleScreenBufferInfo(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: *CONSOLE_SCREEN_BUFFER_INFO) callconv(WINAPI) BOOL; -pub extern "kernel32" fn FillConsoleOutputCharacterA(hConsoleOutput: HANDLE, cCharacter: TCHAR, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfCharsWritten: LPDWORD) callconv(WINAPI) BOOL; +pub extern "kernel32" fn FillConsoleOutputCharacterA(hConsoleOutput: HANDLE, cCharacter: CHAR, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfCharsWritten: LPDWORD) callconv(WINAPI) BOOL; pub extern "kernel32" fn FillConsoleOutputAttribute(hConsoleOutput: HANDLE, wAttribute: WORD, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfAttrsWritten: LPDWORD) callconv(WINAPI) BOOL; pub extern "kernel32" fn SetConsoleCursorPosition(hConsoleOutput: HANDLE, dwCursorPosition: COORD) callconv(WINAPI) BOOL; From 1c816459b7913b72a5281f56fdff67b9cff07db5 Mon Sep 17 00:00:00 2001 From: viri Date: Sun, 6 Jun 2021 20:26:08 -0600 Subject: [PATCH 2/2] std.Progress: use `*W` functions on windows Closes #534. See: https://source.winehq.org/git/wine.git/blob/refs/heads/stable:/dlls/kernelbase/console.c#l520 --- lib/std/Progress.zig | 2 +- lib/std/os/windows/kernel32.zig | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/std/Progress.zig b/lib/std/Progress.zig index c912b60f5708..059f6e73a78e 100644 --- a/lib/std/Progress.zig +++ b/lib/std/Progress.zig @@ -234,7 +234,7 @@ fn refreshWithHeldLock(self: *Progress) void { self.terminal = null; break :winapi; } - if (windows.kernel32.FillConsoleOutputCharacterA( + if (windows.kernel32.FillConsoleOutputCharacterW( file.handle, ' ', fill_chars, diff --git a/lib/std/os/windows/kernel32.zig b/lib/std/os/windows/kernel32.zig index e50301f799b2..8f100a95115e 100644 --- a/lib/std/os/windows/kernel32.zig +++ b/lib/std/os/windows/kernel32.zig @@ -90,6 +90,7 @@ pub extern "kernel32" fn GetConsoleMode(in_hConsoleHandle: HANDLE, out_lpMode: * pub extern "kernel32" fn GetConsoleScreenBufferInfo(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: *CONSOLE_SCREEN_BUFFER_INFO) callconv(WINAPI) BOOL; pub extern "kernel32" fn FillConsoleOutputCharacterA(hConsoleOutput: HANDLE, cCharacter: CHAR, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfCharsWritten: LPDWORD) callconv(WINAPI) BOOL; +pub extern "kernel32" fn FillConsoleOutputCharacterW(hConsoleOutput: HANDLE, cCharacter: WCHAR, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfCharsWritten: LPDWORD) callconv(WINAPI) BOOL; pub extern "kernel32" fn FillConsoleOutputAttribute(hConsoleOutput: HANDLE, wAttribute: WORD, nLength: DWORD, dwWriteCoord: COORD, lpNumberOfAttrsWritten: LPDWORD) callconv(WINAPI) BOOL; pub extern "kernel32" fn SetConsoleCursorPosition(hConsoleOutput: HANDLE, dwCursorPosition: COORD) callconv(WINAPI) BOOL;