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

View File

@ -26,15 +26,16 @@
#include <windows.h>
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);
if (length <= 0)
throw MakeLastError("Failed to convert from Unicode");
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,
nullptr, nullptr);
if (length <= 0)
@ -44,14 +45,15 @@ WideCharToMultiByte(unsigned code_page, const wchar_t *src)
}
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)
throw MakeLastError("Failed to convert to Unicode");
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);
if (length <= 0)
throw MakeLastError("Failed to convert to Unicode");

View File

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