From 423852e997bed35ec687a35023dd31bac0cf9168 Mon Sep 17 00:00:00 2001 From: Lander Gallastegi Date: Sun, 6 Oct 2024 16:12:05 +0200 Subject: [PATCH] Some fixes and cleanup --- src/core/libraries/dialogs/ime_dialog_ui.cpp | 100 +++---------------- src/core/libraries/dialogs/ime_dialog_ui.h | 5 +- 2 files changed, 14 insertions(+), 91 deletions(-) diff --git a/src/core/libraries/dialogs/ime_dialog_ui.cpp b/src/core/libraries/dialogs/ime_dialog_ui.cpp index 706d189ce..8c028e319 100644 --- a/src/core/libraries/dialogs/ime_dialog_ui.cpp +++ b/src/core/libraries/dialogs/ime_dialog_ui.cpp @@ -53,8 +53,9 @@ ImeDialogState::ImeDialogState(const OrbisImeDialogParam* param, if (param->title) { std::size_t title_len = std::char_traits::length(param->title); title = new char[title_len * 4 + 1]; + title[title_len * 4] = '\0'; - if (!ConvertOrbisToUTF8(param->title, title_len, title, title_len)) { + if (!ConvertOrbisToUTF8(param->title, title_len, title, title_len * 4)) { LOG_ERROR(Lib_ImeDialog, "Failed to convert title to utf8 encoding"); } } @@ -62,9 +63,10 @@ ImeDialogState::ImeDialogState(const OrbisImeDialogParam* param, if (param->placeholder) { std::size_t placeholder_len = std::char_traits::length(param->placeholder); placeholder = new char[placeholder_len * 4 + 1]; + placeholder[placeholder_len * 4] = '\0'; if (!ConvertOrbisToUTF8(param->placeholder, placeholder_len, placeholder, - placeholder_len)) { + placeholder_len * 4)) { LOG_ERROR(Lib_ImeDialog, "Failed to convert placeholder to utf8 encoding"); } } @@ -172,7 +174,7 @@ bool ImeDialogState::CallTextFilter() { } if (!ConvertOrbisToUTF8(out_text, out_text_length, current_text, - ORBIS_IME_DIALOG_MAX_TEXT_LENGTH)) { + ORBIS_IME_DIALOG_MAX_TEXT_LENGTH * 4)) { LOG_ERROR(Lib_ImeDialog, "Failed to convert text to utf8 encoding"); return false; } @@ -213,6 +215,7 @@ bool ImeDialogState::CallKeyboardFilter(const OrbisImeKeycode* src_keycode, u16* bool ImeDialogState::ConvertOrbisToUTF8(const char16_t* orbis_text, std::size_t orbis_text_len, char* utf8_text, std::size_t utf8_text_len) { + std::fill(utf8_text, utf8_text + utf8_text_len, '\0'); #ifndef _WIN32 std::size_t orbis_text_len_bytes = orbis_text_len * sizeof(char16_t); std::size_t utf8_text_len_bytes = utf8_text_len * sizeof(char); @@ -223,12 +226,7 @@ bool ImeDialogState::ConvertOrbisToUTF8(const char16_t* orbis_text, std::size_t std::size_t result = iconv(orbis_to_utf8, (char**)&orbis_text_ptr, &orbis_text_len_bytes, (char**)&utf8_text_ptr, &utf8_text_len_bytes); - if (result == (std::size_t)-1) { - return false; - } - - *utf8_text_ptr = '\0'; // Null-terminate the string - return true; + return result != (std::size_t)-1; #else int required_size = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast(orbis_text), @@ -241,18 +239,13 @@ bool ImeDialogState::ConvertOrbisToUTF8(const char16_t* orbis_text, std::size_t WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast(orbis_text), orbis_text_len, utf8_text, utf8_text_len, nullptr, nullptr); - if (required_size == 0) { - return false; - } - - utf8_text[converted_size] = '\0'; - - return true; + return converted_size != 0; #endif } bool ImeDialogState::ConvertUTF8ToOrbis(const char* utf8_text, std::size_t utf8_text_len, char16_t* orbis_text, std::size_t orbis_text_len) { + std::fill(orbis_text, orbis_text + orbis_text_len, u'\0'); #ifndef _WIN32 std::size_t utf8_text_len_bytes = utf8_text_len * sizeof(char); std::size_t orbis_text_len_bytes = orbis_text_len * sizeof(char16_t); @@ -263,12 +256,8 @@ bool ImeDialogState::ConvertUTF8ToOrbis(const char* utf8_text, std::size_t utf8_ std::size_t result = iconv(utf8_to_orbis, (char**)&utf8_text_ptr, &utf8_text_len_bytes, (char**)&orbis_text_ptr, &orbis_text_len_bytes); - if (result == (std::size_t)-1) { - return false; - } - - *orbis_text_ptr = u'\0'; // Null-terminate the string - return true; + + return result != (std::size_t)-1; #else int required_size = MultiByteToWideChar(CP_UTF8, 0, utf8_text, utf8_text_len, nullptr, 0); if (required_size > orbis_text_len) { @@ -279,70 +268,7 @@ bool ImeDialogState::ConvertUTF8ToOrbis(const char* utf8_text, std::size_t utf8_ MultiByteToWideChar(CP_UTF8, 0, utf8_text, utf8_text_len, reinterpret_cast(orbis_text), orbis_text_len); - if (required_size == 0) { - return false; - } - - orbis_text[converted_size] = u'\0'; - - return true; -#endif -} - -bool ImeDialogState::ConvertOrbisCharToUTF8(const char16_t orbis_char, char* utf8_char, - std::size_t& utf8_char_len) { - std::fill(utf8_char, utf8_char + 4, '\0'); -#ifndef _WIN32 - std::size_t orbis_char_len_bytes = sizeof(char16_t); - std::size_t utf8_char_len_bytes = utf8_char_len; - - char16_t orbis_char_ptr = orbis_char; - char* utf8_char_ptr = utf8_char; - - std::size_t result = iconv(orbis_to_utf8, (char**)&orbis_char_ptr, &orbis_char_len_bytes, - (char**)&utf8_char_ptr, &utf8_char_len_bytes); - - if (result == (std::size_t)-1) { - utf8_char_len = 0; - return false; - } - - utf8_char_len = 4 - utf8_char_len_bytes; - return true; -#else - int required_size = WideCharToMultiByte( - CP_UTF8, 0, reinterpret_cast(&orbis_char), 1, nullptr, 0, nullptr, nullptr); - if (required_size > 4) { - UNREACHABLE_MSG("UTF-8 character is never more than 4 bytes"); - } - - utf8_char_len = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast(&orbis_char), - 1, utf8_char, 4, nullptr, nullptr); - - return utf8_char_len != 0; -#endif -} - -bool ImeDialogState::ConvertUTF8CharToOrbis(const char* utf8_char, char16_t& orbis_char) { -#ifndef _WIN32 - std::size_t utf8_char_len_bytes = 4 * sizeof(char); - std::size_t orbis_char_len_bytes = sizeof(char16_t); - - char* utf8_char_ptr = const_cast(utf8_char); - char16_t* orbis_char_ptr = &orbis_char; - - std::size_t result = iconv(utf8_to_orbis, (char**)&utf8_char_ptr, &utf8_char_len_bytes, - (char**)&orbis_char_ptr, &orbis_char_len_bytes); - - if (result == (std::size_t)-1) { - return false; - } - - return true; -#else - int required_size = MultiByteToWideChar(CP_UTF8, 0, utf8_char, std::strlen(utf8_char), - reinterpret_cast(&orbis_char), 1); - return required_size != 0; + return converted_size != 0; #endif } @@ -543,7 +469,7 @@ int ImeDialogUi::InputTextCallback(ImGuiInputTextCallbackData* data) { .resourceId = 0, .timestamp = 0}; - if (!ui->state->ConvertUTF8CharToOrbis(event_char, src_keycode.character)) { + if (!ui->state->ConvertUTF8ToOrbis(event_char, 4, &src_keycode.character, 1)) { LOG_ERROR(Lib_ImeDialog, "Failed to convert orbis char to utf8"); return 0; } diff --git a/src/core/libraries/dialogs/ime_dialog_ui.h b/src/core/libraries/dialogs/ime_dialog_ui.h index c2b121137..6d2261f72 100644 --- a/src/core/libraries/dialogs/ime_dialog_ui.h +++ b/src/core/libraries/dialogs/ime_dialog_ui.h @@ -34,7 +34,7 @@ class ImeDialogState final { char* placeholder = nullptr; // A character can hold up to 4 bytes in UTF-8 - char current_text[ORBIS_IME_DIALOG_MAX_TEXT_LENGTH * 4] = {0}; + char current_text[ORBIS_IME_DIALOG_MAX_TEXT_LENGTH * 4 + 1] = {0}; #ifndef _WIN32 iconv_t orbis_to_utf8 = (iconv_t)-1; iconv_t utf8_to_orbis = (iconv_t)-1; @@ -59,9 +59,6 @@ private: std::size_t native_text_len); bool ConvertUTF8ToOrbis(const char* native_text, std::size_t utf8_text_len, char16_t* orbis_text, std::size_t orbis_text_len); - bool ConvertOrbisCharToUTF8(const char16_t orbis_char, char* utf8_char, - std::size_t& utf8_char_len); - bool ConvertUTF8CharToOrbis(const char* utf8_char, char16_t& orbis_char); }; class ImeDialogUi final : public ImGui::Layer {