Merge pull request #4025 from zhaowenlan1779/port-yuzu-775
Port "string_util: Minor changes" from yuzu
This commit is contained in:
commit
9af731793a
|
@ -230,21 +230,21 @@ void SplitString(const std::string& str, const char delim, std::vector<std::stri
|
||||||
std::istringstream iss(str);
|
std::istringstream iss(str);
|
||||||
output.resize(1);
|
output.resize(1);
|
||||||
|
|
||||||
while (std::getline(iss, *output.rbegin(), delim))
|
while (std::getline(iss, *output.rbegin(), delim)) {
|
||||||
output.push_back("");
|
output.emplace_back();
|
||||||
|
}
|
||||||
|
|
||||||
output.pop_back();
|
output.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TabsToSpaces(int tab_size, const std::string& in) {
|
std::string TabsToSpaces(int tab_size, std::string in) {
|
||||||
const std::string spaces(tab_size, ' ');
|
|
||||||
std::string out(in);
|
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
while (out.npos != (i = out.find('\t')))
|
|
||||||
out.replace(i, 1, spaces);
|
|
||||||
|
|
||||||
return out;
|
while ((i = in.find('\t')) != std::string::npos) {
|
||||||
|
in.replace(i, 1, tab_size, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ReplaceAll(std::string result, const std::string& src, const std::string& dest) {
|
std::string ReplaceAll(std::string result, const std::string& src, const std::string& dest) {
|
||||||
|
@ -288,31 +288,37 @@ std::u16string UTF8ToUTF16(const std::string& input) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::wstring CPToUTF16(u32 code_page, 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<int>(input.size()), nullptr, 0);
|
MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()), nullptr, 0);
|
||||||
|
|
||||||
std::wstring output;
|
if (size == 0) {
|
||||||
output.resize(size);
|
return L"";
|
||||||
|
}
|
||||||
|
|
||||||
if (size == 0 ||
|
std::wstring output(size, L'\0');
|
||||||
size != MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()),
|
|
||||||
&output[0], static_cast<int>(output.size())))
|
if (size != MultiByteToWideChar(code_page, 0, input.data(), static_cast<int>(input.size()),
|
||||||
|
&output[0], static_cast<int>(output.size()))) {
|
||||||
output.clear();
|
output.clear();
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string UTF16ToUTF8(const std::wstring& input) {
|
std::string UTF16ToUTF8(const std::wstring& input) {
|
||||||
auto const size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
const auto size = WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
||||||
nullptr, 0, nullptr, nullptr);
|
nullptr, 0, nullptr, nullptr);
|
||||||
|
if (size == 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
std::string output;
|
std::string output(size, '\0');
|
||||||
output.resize(size);
|
|
||||||
|
|
||||||
if (size == 0 ||
|
if (size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
||||||
size != WideCharToMultiByte(CP_UTF8, 0, input.data(), static_cast<int>(input.size()),
|
&output[0], static_cast<int>(output.size()), nullptr,
|
||||||
&output[0], static_cast<int>(output.size()), nullptr, nullptr))
|
nullptr)) {
|
||||||
output.clear();
|
output.clear();
|
||||||
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
@ -333,8 +339,6 @@ std::string CP1252ToUTF8(const std::string& input) {
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>& input) {
|
static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>& input) {
|
||||||
std::string result;
|
|
||||||
|
|
||||||
iconv_t const conv_desc = iconv_open("UTF-8", fromcode);
|
iconv_t const conv_desc = iconv_open("UTF-8", fromcode);
|
||||||
if ((iconv_t)(-1) == conv_desc) {
|
if ((iconv_t)(-1) == conv_desc) {
|
||||||
LOG_ERROR(Common, "Iconv initialization failure [{}]: {}", fromcode, strerror(errno));
|
LOG_ERROR(Common, "Iconv initialization failure [{}]: {}", fromcode, strerror(errno));
|
||||||
|
@ -346,8 +350,7 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>&
|
||||||
// Multiply by 4, which is the max number of bytes to encode a codepoint
|
// Multiply by 4, which is the max number of bytes to encode a codepoint
|
||||||
const size_t out_buffer_size = 4 * in_bytes;
|
const size_t out_buffer_size = 4 * in_bytes;
|
||||||
|
|
||||||
std::string out_buffer;
|
std::string out_buffer(out_buffer_size, '\0');
|
||||||
out_buffer.resize(out_buffer_size);
|
|
||||||
|
|
||||||
auto src_buffer = &input[0];
|
auto src_buffer = &input[0];
|
||||||
size_t src_bytes = in_bytes;
|
size_t src_bytes = in_bytes;
|
||||||
|
@ -372,6 +375,7 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string result;
|
||||||
out_buffer.resize(out_buffer_size - dst_bytes);
|
out_buffer.resize(out_buffer_size - dst_bytes);
|
||||||
out_buffer.swap(result);
|
out_buffer.swap(result);
|
||||||
|
|
||||||
|
@ -381,8 +385,6 @@ static std::string CodeToUTF8(const char* fromcode, const std::basic_string<T>&
|
||||||
}
|
}
|
||||||
|
|
||||||
std::u16string UTF8ToUTF16(const std::string& input) {
|
std::u16string UTF8ToUTF16(const std::string& input) {
|
||||||
std::u16string result;
|
|
||||||
|
|
||||||
iconv_t const conv_desc = iconv_open("UTF-16LE", "UTF-8");
|
iconv_t const conv_desc = iconv_open("UTF-16LE", "UTF-8");
|
||||||
if ((iconv_t)(-1) == conv_desc) {
|
if ((iconv_t)(-1) == conv_desc) {
|
||||||
LOG_ERROR(Common, "Iconv initialization failure [UTF-8]: {}", strerror(errno));
|
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
|
// 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;
|
const size_t out_buffer_size = 4 * sizeof(char16_t) * in_bytes;
|
||||||
|
|
||||||
std::u16string out_buffer;
|
std::u16string out_buffer(out_buffer_size, char16_t{});
|
||||||
out_buffer.resize(out_buffer_size);
|
|
||||||
|
|
||||||
char* src_buffer = const_cast<char*>(&input[0]);
|
char* src_buffer = const_cast<char*>(&input[0]);
|
||||||
size_t src_bytes = in_bytes;
|
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.resize(out_buffer_size - dst_bytes);
|
||||||
out_buffer.swap(result);
|
out_buffer.swap(result);
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ static bool TryParse(const std::string& str, N* const output) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TabsToSpaces(int tab_size, const std::string& in);
|
std::string TabsToSpaces(int tab_size, std::string in);
|
||||||
|
|
||||||
void SplitString(const std::string& str, char delim, std::vector<std::string>& output);
|
void SplitString(const std::string& str, char delim, std::vector<std::string>& output);
|
||||||
|
|
||||||
|
|
Reference in New Issue