Skip to content

Commit 6c3c436

Browse files
authored
Merge pull request #7609 from choyy/win-errormessage
use FormatMessageW for Windows system error messages
2 parents e782a2f + 62fa217 commit 6c3c436

1 file changed

Lines changed: 16 additions & 2 deletions

File tree

core/src/xmake/os/strerror.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,22 @@ tb_int_t xm_os_strerror(lua_State *lua) {
6464
lua_pushstring(lua, strerr);
6565
} else {
6666
#if defined(TB_CONFIG_OS_WINDOWS) && !defined(TB_COMPILER_LIKE_UNIX)
67-
tb_char_t strerr[128] = { 0 };
68-
tb_snprintf(strerr, sizeof(strerr), "Unknown Error (%lu)", (tb_size_t)GetLastError());
67+
DWORD error_code = GetLastError();
68+
tb_char_t strerr[128 * 2] = { 0 };
69+
tb_wchar_t wstrerr[128] = { 0 };
70+
tb_size_t len = 0;
71+
if (FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
72+
NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
73+
wstrerr, tb_arrayn(wstrerr), NULL) &&
74+
(len = tb_wcslen(wstrerr)) > 0) {
75+
while (len > 0 && (wstrerr[len - 1] == L'\r' || wstrerr[len - 1] == L'\n')) {
76+
wstrerr[--len] = L'\0';
77+
}
78+
WideCharToMultiByte(CP_UTF8, 0, wstrerr, -1, strerr, sizeof(strerr), tb_null, tb_null);
79+
}
80+
if (strerr[0] == '\0') {
81+
tb_snprintf(strerr, sizeof(strerr), "Unknown Error (%lu)", (tb_size_t)error_code);
82+
}
6983
lua_pushstring(lua, strerr);
7084
#else
7185
lua_pushstring(lua, strerror(errno));

0 commit comments

Comments
 (0)