diff --git a/Source/platform/vita/keyboard.cpp b/Source/platform/vita/keyboard.cpp index 1ba7379d9..35b636819 100644 --- a/Source/platform/vita/keyboard.cpp +++ b/Source/platform/vita/keyboard.cpp @@ -30,13 +30,19 @@ static void utf16_to_utf8(const uint16_t *src, uint8_t *dst) *dst = '\0'; } -static void utf8_to_utf16(const uint8_t *src, uint16_t *dst) +static void utf8_to_utf16(const uint8_t *src, size_t src_size, uint16_t *dst) { - for (int i = 0; src[i];) { + for (size_t i = 0; i < src_size && src[i];) { if ((src[i] & 0xE0) == 0xE0) { + if (i + 2 >= src_size) { + break; + } *(dst++) = ((src[i] & 0x0F) << 12) | ((src[i + 1] & 0x3F) << 6) | (src[i + 2] & 0x3F); i += 3; } else if ((src[i] & 0xC0) == 0xC0) { + if (i + 1 >= src_size) { + break; + } *(dst++) = ((src[i] & 0x1F) << 6) | (src[i + 1] & 0x3F); i += 2; } else { @@ -76,7 +82,7 @@ static int vita_input_thread(void *ime_buffer) return 0; } -static int vita_keyboard_get(const char *guide_text, const char *initial_text, int max_len, SceWChar16 *buf) +static int vita_keyboard_get(devilution::string_view guide_text, devilution::string_view initial_text, unsigned max_len, SceWChar16 *buf) { SceWChar16 title[SCE_IME_DIALOG_MAX_TITLE_LENGTH]; SceWChar16 text[SCE_IME_DIALOG_MAX_TEXT_LENGTH]; @@ -84,8 +90,8 @@ static int vita_keyboard_get(const char *guide_text, const char *initial_text, i SDL_memset(&title, 0, sizeof(title)); SDL_memset(&text, 0, sizeof(text)); - utf8_to_utf16((const uint8_t *)guide_text, title); - utf8_to_utf16((const uint8_t *)initial_text, text); + utf8_to_utf16(reinterpret_cast(guide_text.data()), guide_text.size(), title); + utf8_to_utf16(reinterpret_cast(initial_text.data()), initial_text.size(), text); SceImeDialogParam param; sceImeDialogParamInit(¶m); @@ -109,7 +115,7 @@ static int vita_keyboard_get(const char *guide_text, const char *initial_text, i return 1; } -void vita_start_text_input(const char *guide_text, const char *initial_text, int max_length) +void vita_start_text_input(devilution::string_view guide_text, devilution::string_view initial_text, unsigned max_length) { SceWChar16 ime_buffer[SCE_IME_DIALOG_MAX_TEXT_LENGTH]; if (vita_keyboard_get(guide_text, initial_text, max_length, ime_buffer)) { diff --git a/Source/platform/vita/keyboard.h b/Source/platform/vita/keyboard.h index 8a229527d..2f8372756 100644 --- a/Source/platform/vita/keyboard.h +++ b/Source/platform/vita/keyboard.h @@ -1,3 +1,5 @@ #pragma once -void vita_start_text_input(const char *guide_text, const char *initial_text, int max_length); +#include "utils/stdcompat/string_view.hpp" + +void vita_start_text_input(devilution::string_view guide_text, devilution::string_view initial_text, unsigned max_length);