unicode: Cleanup

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2024-02-12 17:58:36 +01:00
parent 0a719e3081
commit 10f999c7bf

View File

@ -182,7 +182,6 @@ namespace stdex
return; return;
#ifdef _WIN32 #ifdef _WIN32
DWORD dwFlagsMBWC = static_cast<UINT>(m_from_wincp) < CP_UTF7 ? MB_PRECOMPOSED : 0;
constexpr DWORD dwFlagsWCMB = 0; constexpr DWORD dwFlagsWCMB = 0;
constexpr LPCCH lpDefaultChar = NULL; constexpr LPCCH lpDefaultChar = NULL;
@ -197,6 +196,7 @@ namespace stdex
_Assume_(count_src < INT_MAX || count_src == SIZE_MAX); _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
// Try to convert to stack buffer first. // Try to convert to stack buffer first.
DWORD dwFlagsMBWC = static_cast<UINT>(m_from_wincp) < CP_UTF7 ? MB_PRECOMPOSED : 0;
WCHAR szStackBuffer[1024 / sizeof(WCHAR)]; WCHAR szStackBuffer[1024 / sizeof(WCHAR)];
#pragma warning(suppress: 6387) // Testing indicates src may be NULL when count_src is also 0. Is SAL of the lpMultiByteStr parameter wrong? #pragma warning(suppress: 6387) // Testing indicates src may be NULL when count_src is also 0. Is SAL of the lpMultiByteStr parameter wrong?
int cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), szStackBuffer, _countof(szStackBuffer)); int cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), szStackBuffer, _countof(szStackBuffer));
@ -205,7 +205,8 @@ namespace stdex
dst.append(reinterpret_cast<const T_to*>(szStackBuffer), count_src != SIZE_MAX ? wcsnlen(szStackBuffer, cch) : static_cast<size_t>(cch) - 1); dst.append(reinterpret_cast<const T_to*>(szStackBuffer), count_src != SIZE_MAX ? wcsnlen(szStackBuffer, cch) : static_cast<size_t>(cch) - 1);
return; return;
} }
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { DWORD dwResult = GetLastError();
if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
// Query the required output size. Allocate buffer. Then convert again. // Query the required output size. Allocate buffer. Then convert again.
cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), NULL, 0); cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), NULL, 0);
size_t offset = dst.size(); size_t offset = dst.size();
@ -214,7 +215,7 @@ namespace stdex
dst.resize(offset + (count_src != SIZE_MAX ? wcsnlen(&dst[offset], cch) : static_cast<size_t>(cch) - 1)); dst.resize(offset + (count_src != SIZE_MAX ? wcsnlen(&dst[offset], cch) : static_cast<size_t>(cch) - 1));
return; return;
} }
throw std::system_error(GetLastError(), std::system_category(), "MultiByteToWideChar failed"); throw std::system_error(dwResult, std::system_category(), "MultiByteToWideChar failed");
} }
#pragma warning(suppress: 4127) #pragma warning(suppress: 4127)
@ -230,7 +231,8 @@ namespace stdex
dst.append(reinterpret_cast<const T_to*>(szStackBuffer), count_src != SIZE_MAX ? strnlen(szStackBuffer, cch) : static_cast<size_t>(cch) - 1); dst.append(reinterpret_cast<const T_to*>(szStackBuffer), count_src != SIZE_MAX ? strnlen(szStackBuffer, cch) : static_cast<size_t>(cch) - 1);
return; return;
} }
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { DWORD dwResult = GetLastError();
if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
// Query the required output size. Allocate buffer. Then convert again. // Query the required output size. Allocate buffer. Then convert again.
cch = WideCharToMultiByte(static_cast<UINT>(m_to_wincp), dwFlagsWCMB, reinterpret_cast<LPCWCH>(src), static_cast<int>(count_src), NULL, 0, lpDefaultChar, NULL); cch = WideCharToMultiByte(static_cast<UINT>(m_to_wincp), dwFlagsWCMB, reinterpret_cast<LPCWCH>(src), static_cast<int>(count_src), NULL, 0, lpDefaultChar, NULL);
size_t offset = dst.size(); size_t offset = dst.size();
@ -239,7 +241,7 @@ namespace stdex
dst.resize(offset + (count_src != SIZE_MAX ? strnlen(&dst[offset], cch) : static_cast<size_t>(cch) - 1)); dst.resize(offset + (count_src != SIZE_MAX ? strnlen(&dst[offset], cch) : static_cast<size_t>(cch) - 1));
return; return;
} }
throw std::system_error(GetLastError(), std::system_category(), "WideCharToMultiByte failed"); throw std::system_error(dwResult, std::system_category(), "WideCharToMultiByte failed");
} }
#pragma warning(suppress: 4127) #pragma warning(suppress: 4127)
@ -247,6 +249,7 @@ namespace stdex
_Assume_(count_src < INT_MAX || count_src == SIZE_MAX); _Assume_(count_src < INT_MAX || count_src == SIZE_MAX);
// Try to convert to stack buffer first. // Try to convert to stack buffer first.
DWORD dwFlagsMBWC = static_cast<UINT>(m_from_wincp) < CP_UTF7 ? MB_PRECOMPOSED : 0, dwResult;
WCHAR szStackBufferMBWC[512 / sizeof(WCHAR)]; WCHAR szStackBufferMBWC[512 / sizeof(WCHAR)];
#pragma warning(suppress: 6387) // Testing indicates src may be NULL when count_src is also 0. Is SAL of the lpMultiByteStr parameter wrong? #pragma warning(suppress: 6387) // Testing indicates src may be NULL when count_src is also 0. Is SAL of the lpMultiByteStr parameter wrong?
int cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), szStackBufferMBWC, _countof(szStackBufferMBWC)); int cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), szStackBufferMBWC, _countof(szStackBufferMBWC));
@ -264,7 +267,8 @@ namespace stdex
dst.append(reinterpret_cast<const T_to*>(szStackBufferWCMB), strnlen(szStackBufferWCMB, cch)); dst.append(reinterpret_cast<const T_to*>(szStackBufferWCMB), strnlen(szStackBufferWCMB, cch));
return; return;
} }
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { dwResult = GetLastError();
if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
// Query the required output size. Allocate buffer. Then convert again. // Query the required output size. Allocate buffer. Then convert again.
cch = WideCharToMultiByte(static_cast<UINT>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC, static_cast<int>(count_inter), NULL, 0, lpDefaultChar, NULL); cch = WideCharToMultiByte(static_cast<UINT>(m_to_wincp), dwFlagsWCMB, szStackBufferMBWC, static_cast<int>(count_inter), NULL, 0, lpDefaultChar, NULL);
size_t offset = dst.size(); size_t offset = dst.size();
@ -273,9 +277,10 @@ namespace stdex
dst.resize(offset + strnlen(&dst[offset], cch)); dst.resize(offset + strnlen(&dst[offset], cch));
return; return;
} }
throw std::system_error(GetLastError(), std::system_category(), "WideCharToMultiByte failed"); throw std::system_error(dwResult, std::system_category(), "WideCharToMultiByte failed");
} }
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { dwResult = GetLastError();
if (dwResult == ERROR_INSUFFICIENT_BUFFER) {
// Query the required output size. Allocate buffer. Then convert again. // Query the required output size. Allocate buffer. Then convert again.
cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), NULL, 0); cch = MultiByteToWideChar(static_cast<UINT>(m_from_wincp), dwFlagsMBWC, reinterpret_cast<LPCCH>(src), static_cast<int>(count_src), NULL, 0);
std::unique_ptr<WCHAR[]> szBufferMBWC(new WCHAR[cch]); std::unique_ptr<WCHAR[]> szBufferMBWC(new WCHAR[cch]);
@ -290,7 +295,7 @@ namespace stdex
dst.resize(offset + strnlen(&dst[offset], cch)); dst.resize(offset + strnlen(&dst[offset], cch));
return; return;
} }
throw std::system_error(GetLastError(), std::system_category(), "MultiByteToWideChar failed"); throw std::system_error(dwResult, std::system_category(), "MultiByteToWideChar failed");
} }
#else #else
dst.reserve(dst.size() + count_src); dst.reserve(dst.size() + count_src);