Skip to content

Commit ffe7881

Browse files
pfeatherstonepfeatherstone
andauthored
[unicode] fixed warning in convert_mbstring_to_wstring() (davisking#3110)
* surpress warnings in convert_mbstring_to_wstring() * fix * fixed convert_wstring_to_mbstring as well * Oops --------- Co-authored-by: pfeatherstone <pfeatherstone@pf>
1 parent 0d2153a commit ffe7881

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

dlib/unicode/unicode.cpp

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,37 @@ namespace dlib
9696

9797
const std::wstring convert_mbstring_to_wstring(const std::string &src)
9898
{
99-
std::vector<wchar_t> wstr(src.length()+5);
100-
std::mbstowcs(&wstr[0], src.c_str(), src.length()+1);
101-
return std::wstring(&wstr[0]);
99+
// Compute dst length
100+
std::mbstate_t st{};
101+
const char* p = src.c_str();
102+
size_t n = std::mbsrtowcs(nullptr, &p, 0, &st);
103+
if (n == static_cast<size_t>(-1)) throw std::runtime_error("Invalid multibyte sequence / wrong locale");
104+
105+
// Convert
106+
std::wstring out(n, L'\0');
107+
st = std::mbstate_t{};
108+
n = std::mbsrtowcs(&out[0], &p, out.size(), &st);
109+
if (n == static_cast<size_t>(-1)) throw std::runtime_error("Conversion failed");
110+
return out;
102111
}
103112

104113
// ----------------------------------------------------------------------------------------
105114

106115
const std::string convert_wstring_to_mbstring(const std::wstring &src)
107116
{
108-
using namespace std;
109-
std::string str;
110-
str.resize((src.length() + 1) * MB_CUR_MAX);
111-
wcstombs(&str[0], src.c_str(), str.size());
112-
return std::string(&str[0]);
117+
std::mbstate_t st{};
118+
const wchar_t* p = src.c_str();
119+
120+
// Compute length
121+
size_t n = std::wcsrtombs(nullptr, &p, 0, &st);
122+
if (n == static_cast<std::size_t>(-1)) throw std::runtime_error("Invalid wide sequence / locale mismatch");
123+
124+
// Convert
125+
std::string out(n, '\0');
126+
st = std::mbstate_t{};
127+
n = std::wcsrtombs(&out[0], &p, out.size(), &st);
128+
if (n == static_cast<std::size_t>(-1)) throw std::runtime_error("Conversion failed");
129+
return out;
113130
}
114131

115132
// ----------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)