GUIHyperText: Fix bug with UTF8 chars in action name + simplify UTF8 stringw conversion (#9437)

Co-authored-by: Pierre-Yves Rollo <dev@pyrollo.com>
This commit is contained in:
Jean-Patrick Guerrero 2020-03-07 14:01:11 +01:00 committed by GitHub
parent ce8cdc0333
commit 0e88176db8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 39 deletions

@ -405,7 +405,7 @@ u32 ParsedText::parseTag(const wchar_t *text, u32 cursor)
AttrsList attrs; AttrsList attrs;
while (c != L'>') { while (c != L'>') {
std::string attr_name = ""; std::string attr_name = "";
std::string attr_val = ""; core::stringw attr_val = L"";
while (c == ' ') { while (c == ' ') {
c = text[++cursor]; c = text[++cursor];
@ -435,13 +435,13 @@ u32 ParsedText::parseTag(const wchar_t *text, u32 cursor)
return 0; return 0;
while (c != L'>' && c != L' ') { while (c != L'>' && c != L' ') {
attr_val += (char)c; attr_val += c;
c = text[++cursor]; c = text[++cursor];
if (c == L'\0') if (c == L'\0')
return 0; return 0;
} }
attrs[attr_name] = attr_val; attrs[attr_name] = stringw_to_utf8(attr_val);
} }
++cursor; // Last ">" ++cursor; // Last ">"
@ -486,7 +486,7 @@ u32 ParsedText::parseTag(const wchar_t *text, u32 cursor)
else else
enterElement(ELEMENT_ITEM); enterElement(ELEMENT_ITEM);
m_element->text = strtostrw(attrs["name"]); m_element->text = utf8_to_stringw(attrs["name"]);
if (attrs.count("float")) { if (attrs.count("float")) {
if (attrs["float"] == "left") if (attrs["float"] == "left")
@ -626,7 +626,7 @@ TextDrawer::TextDrawer(const wchar_t *text, Client *client,
if (e.type == ParsedText::ELEMENT_IMAGE) { if (e.type == ParsedText::ELEMENT_IMAGE) {
video::ITexture *texture = video::ITexture *texture =
m_client->getTextureSource()-> m_client->getTextureSource()->
getTexture(strwtostr(e.text)); getTexture(stringw_to_utf8(e.text));
if (texture) if (texture)
dim = texture->getOriginalSize(); dim = texture->getOriginalSize();
} }
@ -952,7 +952,7 @@ void TextDrawer::draw(const core::rect<s32> &dest_rect,
case ParsedText::ELEMENT_IMAGE: { case ParsedText::ELEMENT_IMAGE: {
video::ITexture *texture = video::ITexture *texture =
m_client->getTextureSource()->getTexture( m_client->getTextureSource()->getTexture(
strwtostr(el.text)); stringw_to_utf8(el.text));
if (texture != 0) if (texture != 0)
m_environment->getVideoDriver()->draw2DImage( m_environment->getVideoDriver()->draw2DImage(
texture, rect, texture, rect,
@ -965,7 +965,7 @@ void TextDrawer::draw(const core::rect<s32> &dest_rect,
case ParsedText::ELEMENT_ITEM: { case ParsedText::ELEMENT_ITEM: {
IItemDefManager *idef = m_client->idef(); IItemDefManager *idef = m_client->idef();
ItemStack item; ItemStack item;
item.deSerialize(strwtostr(el.text), idef); item.deSerialize(stringw_to_utf8(el.text), idef);
drawItemStack( drawItemStack(
m_environment->getVideoDriver(), m_environment->getVideoDriver(),
@ -1083,7 +1083,7 @@ bool GUIHyperText::OnEvent(const SEvent &event)
for (auto &tag : element->tags) { for (auto &tag : element->tags) {
if (tag->name == "action") { if (tag->name == "action") {
Text = core::stringw(L"action:") + Text = core::stringw(L"action:") +
strtostrw(tag->attrs["name"]); utf8_to_stringw(tag->attrs["name"]);
if (Parent) { if (Parent) {
SEvent newEvent; SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT; newEvent.EventType = EET_GUI_EVENT;

@ -860,28 +860,3 @@ std::wstring translate_string(const std::wstring &s) {
translate_all(s, i, res); translate_all(s, i, res);
return res; return res;
} }
/**
* Create a std::string from a irr::core:stringw.
*/
std::string strwtostr(const irr::core::stringw &str)
{
std::string text = core::stringc(str.c_str()).c_str();
return text;
}
/**
* Create a irr::core:stringw from a std::string.
*/
irr::core::stringw strtostrw(const std::string &str)
{
size_t size = str.size();
// s.size() doesn't include NULL terminator
wchar_t *text = new wchar_t[size + sizeof(wchar_t)];
const char *data = &str[0];
mbsrtowcs(text, &data, size, NULL);
text[size] = L'\0';
return text;
}

@ -726,11 +726,19 @@ inline std::string str_join(const std::vector<std::string> &list,
} }
/** /**
* Create a std::string from a irr::core::stringw. * Create a UTF8 std::string from a irr::core::stringw.
*/ */
std::string strwtostr(const irr::core::stringw &str); inline std::string stringw_to_utf8(const irr::core::stringw &input)
{
std::wstring str(input.c_str());
return wide_to_utf8(str);
}
/** /**
* Create a irr::core:stringw from a std::string. * Create a irr::core:stringw from a UTF8 std::string.
*/ */
irr::core::stringw strtostrw(const std::string &str); inline irr::core::stringw utf8_to_stringw(const std::string &input)
{
std::wstring str = utf8_to_wide(input);
return irr::core::stringw(str.c_str());
}