From 995d1cd785c735db42b1cb3508b60e6c460fa838 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 22 Jul 2018 15:47:37 -0400 Subject: [PATCH] string_util: Get rid of separate resize() in CPToUTF16(), UTF16ToUTF8(), CodeToUTF8() and UTF8ToUTF16() There's no need to perform the resize separately here, since the constructor allows presizing the buffer. Also move the empty string check before the construction of the string to make the early out more straightforward. --- src/common/string_util.cpp | 42 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 670c857dd..27f37b86d 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -288,31 +288,37 @@ std::u16string UTF8ToUTF16(const std::string& input) { } static std::wstring CPToUTF16(u32 code_page, const std::string& input) { - auto const size = + const auto size = MultiByteToWideChar(code_page, 0, input.data(), static_cast(input.size()), nullptr, 0); - std::wstring output; - output.resize(size); + if (size == 0) { + return L""; + } - if (size == 0 || - size != MultiByteToWideChar(code_page, 0, input.data(), static_cast(input.size()), - &output[0], static_cast(output.size()))) + std::wstring output(size, L'\0'); + + if (size != MultiByteToWideChar(code_page, 0, input.data(), static_cast(input.size()), + &output[0], static_cast(output.size()))) { output.clear(); + } return output; } std::string UTF16ToUTF8(const std::wstring& input) { - auto const size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast(input.size()), + const auto size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast(input.size()), nullptr, 0, nullptr, nullptr); + if (size == 0) { + return ""; + } - std::string output; - output.resize(size); + std::string output(size, '\0'); - if (size == 0 || - size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast(input.size()), - &output[0], static_cast(output.size()), nullptr, nullptr)) + if (size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast(input.size()), + &output[0], static_cast(output.size()), nullptr, + nullptr)) { output.clear(); + } return output; } @@ -333,8 +339,6 @@ std::string CP1252ToUTF8(const std::string& input) { template static std::string CodeToUTF8(const char* fromcode, const std::basic_string& input) { - std::string result; - iconv_t const conv_desc = iconv_open("UTF-8", fromcode); if ((iconv_t)(-1) == conv_desc) { LOG_ERROR(Common, "Iconv initialization failure [{}]: {}", fromcode, strerror(errno)); @@ -346,8 +350,7 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string& // Multiply by 4, which is the max number of bytes to encode a codepoint const size_t out_buffer_size = 4 * in_bytes; - std::string out_buffer; - out_buffer.resize(out_buffer_size); + std::string out_buffer(out_buffer_size, '\0'); auto src_buffer = &input[0]; size_t src_bytes = in_bytes; @@ -372,6 +375,7 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string& } } + std::string result; out_buffer.resize(out_buffer_size - dst_bytes); out_buffer.swap(result); @@ -381,8 +385,6 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string& } std::u16string UTF8ToUTF16(const std::string& input) { - std::u16string result; - iconv_t const conv_desc = iconv_open("UTF-16LE", "UTF-8"); if ((iconv_t)(-1) == conv_desc) { LOG_ERROR(Common, "Iconv initialization failure [UTF-8]: {}", strerror(errno)); @@ -394,8 +396,7 @@ std::u16string UTF8ToUTF16(const std::string& input) { // Multiply by 4, which is the max number of bytes to encode a codepoint const size_t out_buffer_size = 4 * sizeof(char16_t) * in_bytes; - std::u16string out_buffer; - out_buffer.resize(out_buffer_size); + std::u16string out_buffer(out_buffer_size, char16_t{}); char* src_buffer = const_cast(&input[0]); size_t src_bytes = in_bytes; @@ -420,6 +421,7 @@ std::u16string UTF8ToUTF16(const std::string& input) { } } + std::u16string result; out_buffer.resize(out_buffer_size - dst_bytes); out_buffer.swap(result);