lib/icu/Win32: pass std::string_view

This commit is contained in:
Max Kellermann 2020-04-03 15:00:01 +02:00
parent a269fc988b
commit 2d0798cd4d
3 changed files with 18 additions and 14 deletions

View File

@ -81,13 +81,15 @@ try {
return AllocatedString<>::Duplicate(src); return AllocatedString<>::Duplicate(src);
std::unique_ptr<wchar_t[]> buffer(new wchar_t[size]); std::unique_ptr<wchar_t[]> buffer(new wchar_t[size]);
if (LCMapStringEx(LOCALE_NAME_INVARIANT, int result = LCMapStringEx(LOCALE_NAME_INVARIANT,
LCMAP_SORTKEY|LINGUISTIC_IGNORECASE, LCMAP_SORTKEY|LINGUISTIC_IGNORECASE,
u.c_str(), -1, buffer.get(), size, u.c_str(), -1, buffer.get(), size,
nullptr, nullptr, 0) <= 0) nullptr, nullptr, 0);
if (result <= 0)
return AllocatedString<>::Duplicate(src); return AllocatedString<>::Duplicate(src);
return WideCharToMultiByte(CP_UTF8, buffer.get()); return WideCharToMultiByte(CP_UTF8,
{buffer.get(), size_t(result - 1)});
#else #else
#error not implemented #error not implemented

View File

@ -26,15 +26,16 @@
#include <windows.h> #include <windows.h>
AllocatedString<char> AllocatedString<char>
WideCharToMultiByte(unsigned code_page, const wchar_t *src) WideCharToMultiByte(unsigned code_page, std::wstring_view src)
{ {
int length = WideCharToMultiByte(code_page, 0, src, -1, nullptr, 0, int length = WideCharToMultiByte(code_page, 0, src.data(), src.size(),
nullptr, 0,
nullptr, nullptr); nullptr, nullptr);
if (length <= 0) if (length <= 0)
throw MakeLastError("Failed to convert from Unicode"); throw MakeLastError("Failed to convert from Unicode");
std::unique_ptr<char[]> buffer(new char[length]); std::unique_ptr<char[]> buffer(new char[length]);
length = WideCharToMultiByte(code_page, 0, src, -1, length = WideCharToMultiByte(code_page, 0, src.data(), src.size(),
buffer.get(), length, buffer.get(), length,
nullptr, nullptr); nullptr, nullptr);
if (length <= 0) if (length <= 0)
@ -44,14 +45,15 @@ WideCharToMultiByte(unsigned code_page, const wchar_t *src)
} }
AllocatedString<wchar_t> AllocatedString<wchar_t>
MultiByteToWideChar(unsigned code_page, const char *src) MultiByteToWideChar(unsigned code_page, std::string_view src)
{ {
int length = MultiByteToWideChar(code_page, 0, src, -1, nullptr, 0); int length = MultiByteToWideChar(code_page, 0, src.data(), src.size(),
nullptr, 0);
if (length <= 0) if (length <= 0)
throw MakeLastError("Failed to convert to Unicode"); throw MakeLastError("Failed to convert to Unicode");
std::unique_ptr<wchar_t[]> buffer(new wchar_t[length]); std::unique_ptr<wchar_t[]> buffer(new wchar_t[length]);
length = MultiByteToWideChar(code_page, 0, src, -1, length = MultiByteToWideChar(code_page, 0, src.data(), src.size(),
buffer.get(), length); buffer.get(), length);
if (length <= 0) if (length <= 0)
throw MakeLastError("Failed to convert to Unicode"); throw MakeLastError("Failed to convert to Unicode");

View File

@ -22,7 +22,7 @@
#include "util/Compiler.h" #include "util/Compiler.h"
#include <wchar.h> #include <string_view>
template<typename T> class AllocatedString; template<typename T> class AllocatedString;
@ -31,13 +31,13 @@ template<typename T> class AllocatedString;
*/ */
gcc_pure gcc_nonnull_all gcc_pure gcc_nonnull_all
AllocatedString<char> AllocatedString<char>
WideCharToMultiByte(unsigned code_page, const wchar_t *src); WideCharToMultiByte(unsigned code_page, std::wstring_view src);
/** /**
* Throws std::system_error on error. * Throws std::system_error on error.
*/ */
gcc_pure gcc_nonnull_all gcc_pure gcc_nonnull_all
AllocatedString<wchar_t> AllocatedString<wchar_t>
MultiByteToWideChar(unsigned code_page, const char *src); MultiByteToWideChar(unsigned code_page, std::string_view src);
#endif #endif