Skip to content

Commit ec32dae

Browse files
committed
Rename _strlen_clipped to strnlen (and use the system equivalent for char * inputs).
Add `strnlen` for `char16_t *` and `wchar_t *`.
1 parent 1cf573f commit ec32dae

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

core/extension/gdextension_interface.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -902,8 +902,9 @@ static void gdextension_string_new_with_wide_chars(GDExtensionUninitializedStrin
902902
}
903903

904904
static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {
905+
const size_t string_length = p_contents ? (p_size < 0 ? strlen(p_contents) : strnlen(p_contents, p_size)) : 0;
905906
String *dest = memnew_placement(r_dest, String);
906-
dest->append_latin1(Span(p_contents, p_contents ? _strlen_clipped(p_contents, p_size) : 0));
907+
dest->append_latin1(Span(p_contents, string_length));
907908
}
908909

909910
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
927928
}
928929

929930
static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count) {
931+
const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen(p_contents, p_char_count)) : 0;
930932
String *string = memnew_placement(r_dest, String);
931-
string->append_utf32(Span(p_contents, p_contents ? _strlen_clipped(p_contents, p_char_count) : 0));
933+
string->append_utf32(Span(p_contents, string_length));
932934
}
933935

934936
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
938940
dest->append_utf16((const char16_t *)p_contents, p_char_count);
939941
} else {
940942
// wchar_t is 32 bit (UTF-32).
943+
const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen((const char32_t *)p_contents, p_char_count)) : 0;
941944
String *string = memnew_placement(r_dest, String);
942-
string->append_utf32(Span((const char32_t *)p_contents, p_contents ? _strlen_clipped((const char32_t *)p_contents, p_char_count) : 0));
945+
string->append_utf32(Span((const char32_t *)p_contents, string_length));
943946
}
944947
}
945948

core/string/ustring.h

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,41 +66,47 @@ constexpr size_t strlen(const char32_t *p_str) {
6666
}
6767

6868
// strlen equivalent function for wchar_t * arguments; depends on the platform.
69-
constexpr size_t strlen(const wchar_t *str) {
69+
constexpr size_t strlen(const wchar_t *p_str) {
7070
// Use static_cast twice because reinterpret_cast is not allowed in constexpr
7171
#ifdef WINDOWS_ENABLED
7272
// wchar_t is 16-bit
73-
return strlen(static_cast<const char16_t *>(static_cast<const void *>(str)));
73+
return strlen(static_cast<const char16_t *>(static_cast<const void *>(p_str)));
7474
#else
7575
// wchar_t is 32-bit
76-
return strlen(static_cast<const char32_t *>(static_cast<const void *>(str)));
76+
return strlen(static_cast<const char32_t *>(static_cast<const void *>(p_str)));
7777
#endif
7878
}
7979

80-
constexpr size_t _strlen_clipped(const char *p_str, int p_clip_to_len) {
81-
if (p_clip_to_len < 0) {
82-
return strlen(p_str);
83-
}
84-
85-
int len = 0;
80+
// strnlen equivalent function for char16_t * arguments.
81+
constexpr size_t strnlen(const char16_t *p_str, size_t p_clip_to_len) {
82+
size_t len = 0;
8683
while (len < p_clip_to_len && *(p_str++) != 0) {
8784
len++;
8885
}
8986
return len;
9087
}
9188

92-
constexpr size_t _strlen_clipped(const char32_t *p_str, int p_clip_to_len) {
93-
if (p_clip_to_len < 0) {
94-
return strlen(p_str);
95-
}
96-
97-
int len = 0;
89+
// strnlen equivalent function for char32_t * arguments.
90+
constexpr size_t strnlen(const char32_t *p_str, size_t p_clip_to_len) {
91+
size_t len = 0;
9892
while (len < p_clip_to_len && *(p_str++) != 0) {
9993
len++;
10094
}
10195
return len;
10296
}
10397

98+
// strnlen equivalent function for wchar_t * arguments; depends on the platform.
99+
constexpr size_t strnlen(const wchar_t *p_str, size_t p_clip_to_len) {
100+
// Use static_cast twice because reinterpret_cast is not allowed in constexpr
101+
#ifdef WINDOWS_ENABLED
102+
// wchar_t is 16-bit
103+
return strnlen(static_cast<const char16_t *>(static_cast<const void *>(p_str)), p_clip_to_len);
104+
#else
105+
// wchar_t is 32-bit
106+
return strnlen(static_cast<const char32_t *>(static_cast<const void *>(p_str)), p_clip_to_len);
107+
#endif
108+
}
109+
104110
template <typename L, typename R>
105111
constexpr int64_t str_compare(const L *l_ptr, const R *r_ptr) {
106112
while (true) {

0 commit comments

Comments
 (0)