macOS fixes

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2023-09-14 15:40:50 +02:00
parent 51d7ee3493
commit edd480d64b
5 changed files with 25 additions and 19 deletions

View File

@ -1,4 +1,4 @@
/* /*
SPDX-License-Identifier: MIT SPDX-License-Identifier: MIT
Copyright © 2023 Amebis Copyright © 2023 Amebis
*/ */

View File

@ -23,8 +23,8 @@ namespace UnitTests
Assert::AreEqual( Assert::AreEqual(
L"Th\u00ed\u0161 i\u22c5 a te\u0073\u0304t. 😀😅", L"Th\u00ed\u0161 i\u22c5 a te\u0073\u0304t. 😀😅",
stdex::str2wstr("Thíš i⋅ a tes̄t. 😀😅", stdex::charset_id::utf8).c_str()); stdex::str2wstr("Thíš i⋅ a tes̄t. 😀😅", stdex::charset_id::utf8).c_str());
string src; std::string src;
wstring dst; std::wstring dst;
for (size_t i = 0; i < 2000; i++) { for (size_t i = 0; i < 2000; i++) {
src += "🐔Test🐮\r\n"; src += "🐔Test🐮\r\n";
dst += L"🐔Test🐮\r\n"; dst += L"🐔Test🐮\r\n";
@ -46,8 +46,8 @@ namespace UnitTests
Assert::AreEqual( Assert::AreEqual(
"Th\xc3\xad\xc5\xa1 i\xe2\x8b\x85 a tes\xcc\x84t. \xf0\x9f\x98\x80\xf0\x9f\x98\x85", "Th\xc3\xad\xc5\xa1 i\xe2\x8b\x85 a tes\xcc\x84t. \xf0\x9f\x98\x80\xf0\x9f\x98\x85",
stdex::wstr2str(L"Thíš i⋅ a tes̄t. 😀😅", stdex::charset_id::utf8).c_str()); stdex::wstr2str(L"Thíš i⋅ a tes̄t. 😀😅", stdex::charset_id::utf8).c_str());
wstring src; std::wstring src;
string dst; std::string dst;
for (size_t i = 0; i < 2000; i++) { for (size_t i = 0; i < 2000; i++) {
src += L"🐔Test🐮\r\n"; src += L"🐔Test🐮\r\n";
dst += "🐔Test🐮\r\n"; dst += "🐔Test🐮\r\n";
@ -71,7 +71,7 @@ namespace UnitTests
Assert::AreEqual( Assert::AreEqual(
"Thíš i· a teşt.", "Thíš i· a teşt.",
win1250_to_utf8.convert("Th\xed\x9a i\xb7 a te\xbat.").c_str()); win1250_to_utf8.convert("Th\xed\x9a i\xb7 a te\xbat.").c_str());
string src, dst; std::string src, dst;
for (size_t i = 0; i < 1000; i++) { for (size_t i = 0; i < 1000; i++) {
src += "V ko\x9eu\x9a\xe8ku zlobnega mizarja stopiclja fant in kli\xe8" "e 0123456789.\r\n"; src += "V ko\x9eu\x9a\xe8ku zlobnega mizarja stopiclja fant in kli\xe8" "e 0123456789.\r\n";
dst += "V kožuščku zlobnega mizarja stopiclja fant in kliče 0123456789.\r\n"; dst += "V kožuščku zlobnega mizarja stopiclja fant in kliče 0123456789.\r\n";

View File

@ -1,6 +1,6 @@
/* /*
SPDX-License-Identifier: MIT SPDX-License-Identifier: MIT
Copyright © 2023 Amebis Copyright © 2023 Amebis
*/ */
#pragma once #pragma once

View File

@ -14,6 +14,7 @@
#include <assert.h> #include <assert.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdint.h> #include <stdint.h>
#include <math.h>
#if defined(_WIN32) #if defined(_WIN32)
#ifndef _WINSOCKAPI_ #ifndef _WINSOCKAPI_
#include <winsock2.h> #include <winsock2.h>

View File

@ -86,15 +86,16 @@ namespace stdex
_Inout_ std::basic_string<T_to, _Traits_to, _Alloc_to> &dst, _Inout_ std::basic_string<T_to, _Traits_to, _Alloc_to> &dst,
_In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src) _In_reads_or_z_opt_(count_src) const T_from* src, _In_ size_t count_src)
{ {
constexpr DWORD dwFlagsMBWC = MB_PRECOMPOSED;
constexpr DWORD dwFlagsWCMB = 0;
constexpr LPCCH lpDefaultChar = NULL;
assert(src || !count_src); assert(src || !count_src);
count_src = stdex::strnlen(src, count_src); count_src = stdex::strnlen(src, count_src);
if (!count_src) _Unlikely_ if (!count_src) _Unlikely_
return; return;
#ifdef _WIN32 #ifdef _WIN32
constexpr DWORD dwFlagsMBWC = MB_PRECOMPOSED;
constexpr DWORD dwFlagsWCMB = 0;
constexpr LPCCH lpDefaultChar = NULL;
_Analysis_assume_(src); _Analysis_assume_(src);
if (m_from == m_to) _Unlikely_{ if (m_from == m_to) _Unlikely_{
dst.append(reinterpret_cast<const T_to*>(src), count_src); dst.append(reinterpret_cast<const T_to*>(src), count_src);
@ -195,17 +196,21 @@ namespace stdex
throw std::runtime_error("MultiByteToWideChar failed"); throw std::runtime_error("MultiByteToWideChar failed");
} }
#else #else
dst.reserve(dst.size() + count_src);
T_to buf[1024 / sizeof(T_to)]; T_to buf[1024 / sizeof(T_to)];
size_t src_size = stdex::mul(sizeof(T_from), count_src); size_t src_size = stdex::mul(sizeof(T_from), count_src);
do { for (;;) {
T_to* output = &buf[0]; T_to* output = &buf[0];
size_t output_size = sizeof(buf); size_t output_size = sizeof(buf);
errno = 0; errno = 0;
iconv(m_handle, (char**)&src, &src_size, (char**)&output, &output_size); iconv(m_handle, const_cast<char**>(reinterpret_cast<const char**>(&src)), &src_size, reinterpret_cast<char**>(&output), &output_size);
if (errno)
throw std::runtime_error("iconv failed");
dst.append(buf, reinterpret_cast<T_to*>(reinterpret_cast<char*>(buf) + sizeof(buf) - output_size)); dst.append(buf, reinterpret_cast<T_to*>(reinterpret_cast<char*>(buf) + sizeof(buf) - output_size));
} while (src_size); if (!errno)
break;
if (errno == E2BIG)
continue;
throw std::runtime_error("iconv failed");
}
#endif #endif
} }
@ -353,10 +358,10 @@ namespace stdex
"CP1250", // windows1250 "CP1250", // windows1250
"CP1251", // windows1251 "CP1251", // windows1251
"CP1252", // windows1252 "CP1252", // windows1252
} };
return return
charset == charset_id::system ? nl_langinfo(LC_CTYPE) : charset == charset_id::system ? nl_langinfo(LC_CTYPE) :
encodings[static_cast<std::underlying_type_t<charset_id>>(charset))]; encodings[static_cast<std::underlying_type_t<charset_id>>(charset)];
} }
protected: protected: