Rename _strlen_clipped to strnlen (and use the system equivalent for char * inputs).
Add `strnlen` for `char16_t *` and `wchar_t *`.
This commit is contained in:
@ -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) {
|
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);
|
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) {
|
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) {
|
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 *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) {
|
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);
|
dest->append_utf16((const char16_t *)p_contents, p_char_count);
|
||||||
} else {
|
} else {
|
||||||
// wchar_t is 32 bit (UTF-32).
|
// 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 *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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -66,41 +66,47 @@ constexpr size_t strlen(const char32_t *p_str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// strlen equivalent function for wchar_t * arguments; depends on the platform.
|
// 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
|
// Use static_cast twice because reinterpret_cast is not allowed in constexpr
|
||||||
#ifdef WINDOWS_ENABLED
|
#ifdef WINDOWS_ENABLED
|
||||||
// wchar_t is 16-bit
|
// wchar_t is 16-bit
|
||||||
return strlen(static_cast<const char16_t *>(static_cast<const void *>(str)));
|
return strlen(static_cast<const char16_t *>(static_cast<const void *>(p_str)));
|
||||||
#else
|
#else
|
||||||
// wchar_t is 32-bit
|
// wchar_t is 32-bit
|
||||||
return strlen(static_cast<const char32_t *>(static_cast<const void *>(str)));
|
return strlen(static_cast<const char32_t *>(static_cast<const void *>(p_str)));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr size_t _strlen_clipped(const char *p_str, int p_clip_to_len) {
|
// strnlen equivalent function for char16_t * arguments.
|
||||||
if (p_clip_to_len < 0) {
|
constexpr size_t strnlen(const char16_t *p_str, size_t p_clip_to_len) {
|
||||||
return strlen(p_str);
|
size_t len = 0;
|
||||||
}
|
|
||||||
|
|
||||||
int len = 0;
|
|
||||||
while (len < p_clip_to_len && *(p_str++) != 0) {
|
while (len < p_clip_to_len && *(p_str++) != 0) {
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr size_t _strlen_clipped(const char32_t *p_str, int p_clip_to_len) {
|
// strnlen equivalent function for char32_t * arguments.
|
||||||
if (p_clip_to_len < 0) {
|
constexpr size_t strnlen(const char32_t *p_str, size_t p_clip_to_len) {
|
||||||
return strlen(p_str);
|
size_t len = 0;
|
||||||
}
|
|
||||||
|
|
||||||
int len = 0;
|
|
||||||
while (len < p_clip_to_len && *(p_str++) != 0) {
|
while (len < p_clip_to_len && *(p_str++) != 0) {
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
return 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<const char16_t *>(static_cast<const void *>(p_str)), p_clip_to_len);
|
||||||
|
#else
|
||||||
|
// wchar_t is 32-bit
|
||||||
|
return strnlen(static_cast<const char32_t *>(static_cast<const void *>(p_str)), p_clip_to_len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
template <typename L, typename R>
|
template <typename L, typename R>
|
||||||
constexpr int64_t str_compare(const L *l_ptr, const R *r_ptr) {
|
constexpr int64_t str_compare(const L *l_ptr, const R *r_ptr) {
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|||||||
Reference in New Issue
Block a user