diff --git a/core/extension/gdextension_interface.cpp b/core/extension/gdextension_interface.cpp index 011c96a66d2..d591fc62b25 100644 --- a/core/extension/gdextension_interface.cpp +++ b/core/extension/gdextension_interface.cpp @@ -902,8 +902,9 @@ static void gdextension_string_new_with_wide_chars(GDExtensionUninitializedStrin } static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) { + const size_t string_length = p_contents ? (p_size < 0 ? strlen(p_contents) : strnlen(p_contents, p_size)) : 0; String *dest = memnew_placement(r_dest, String); - dest->append_latin1(Span(p_contents, p_contents ? _strlen_clipped(p_contents, p_size) : 0)); + dest->append_latin1(Span(p_contents, string_length)); } static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) { @@ -927,8 +928,9 @@ static GDExtensionInt gdextension_string_new_with_utf16_chars_and_len2(GDExtensi } static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count) { + const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen(p_contents, p_char_count)) : 0; String *string = memnew_placement(r_dest, String); - string->append_utf32(Span(p_contents, p_contents ? _strlen_clipped(p_contents, p_char_count) : 0)); + string->append_utf32(Span(p_contents, string_length)); } static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_char_count) { @@ -938,8 +940,9 @@ static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitiali dest->append_utf16((const char16_t *)p_contents, p_char_count); } else { // wchar_t is 32 bit (UTF-32). + const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen((const char32_t *)p_contents, p_char_count)) : 0; String *string = memnew_placement(r_dest, String); - string->append_utf32(Span((const char32_t *)p_contents, p_contents ? _strlen_clipped((const char32_t *)p_contents, p_char_count) : 0)); + string->append_utf32(Span((const char32_t *)p_contents, string_length)); } } diff --git a/core/string/ustring.h b/core/string/ustring.h index 2a006de8d17..fc153a52e75 100644 --- a/core/string/ustring.h +++ b/core/string/ustring.h @@ -66,41 +66,47 @@ constexpr size_t strlen(const char32_t *p_str) { } // strlen equivalent function for wchar_t * arguments; depends on the platform. -constexpr size_t strlen(const wchar_t *str) { +constexpr size_t strlen(const wchar_t *p_str) { // Use static_cast twice because reinterpret_cast is not allowed in constexpr #ifdef WINDOWS_ENABLED // wchar_t is 16-bit - return strlen(static_cast(static_cast(str))); + return strlen(static_cast(static_cast(p_str))); #else // wchar_t is 32-bit - return strlen(static_cast(static_cast(str))); + return strlen(static_cast(static_cast(p_str))); #endif } -constexpr size_t _strlen_clipped(const char *p_str, int p_clip_to_len) { - if (p_clip_to_len < 0) { - return strlen(p_str); - } - - int len = 0; +// strnlen equivalent function for char16_t * arguments. +constexpr size_t strnlen(const char16_t *p_str, size_t p_clip_to_len) { + size_t len = 0; while (len < p_clip_to_len && *(p_str++) != 0) { len++; } return len; } -constexpr size_t _strlen_clipped(const char32_t *p_str, int p_clip_to_len) { - if (p_clip_to_len < 0) { - return strlen(p_str); - } - - int len = 0; +// strnlen equivalent function for char32_t * arguments. +constexpr size_t strnlen(const char32_t *p_str, size_t p_clip_to_len) { + size_t len = 0; while (len < p_clip_to_len && *(p_str++) != 0) { len++; } return len; } +// strnlen equivalent function for wchar_t * arguments; depends on the platform. +constexpr size_t strnlen(const wchar_t *p_str, size_t p_clip_to_len) { + // Use static_cast twice because reinterpret_cast is not allowed in constexpr +#ifdef WINDOWS_ENABLED + // wchar_t is 16-bit + return strnlen(static_cast(static_cast(p_str)), p_clip_to_len); +#else + // wchar_t is 32-bit + return strnlen(static_cast(static_cast(p_str)), p_clip_to_len); +#endif +} + template constexpr int64_t str_compare(const L *l_ptr, const R *r_ptr) { while (true) {