Skip to content

Commit 1818453

Browse files
committed
Make use of latin1 encoding explicit in gdextension_interface.cpp.
1 parent 30bb49e commit 1818453

File tree

2 files changed

+35
-30
lines changed

2 files changed

+35
-30
lines changed

core/extension/gdextension_interface.cpp

+25-27
Original file line numberDiff line numberDiff line change
@@ -872,84 +872,82 @@ static GDExtensionPtrUtilityFunction gdextension_variant_get_ptr_utility_functio
872872
//string helpers
873873

874874
static void gdextension_string_new_with_latin1_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) {
875-
memnew_placement(r_dest, String(p_contents));
875+
String *dest = memnew_placement(r_dest, String);
876+
dest->parse_latin1(Span<char>(p_contents, p_contents ? strlen(p_contents) : 0));
876877
}
877878

878879
static void gdextension_string_new_with_utf8_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) {
879-
memnew_placement(r_dest, String);
880-
String *dest = reinterpret_cast<String *>(r_dest);
880+
String *dest = memnew_placement(r_dest, String);
881881
dest->parse_utf8(p_contents);
882882
}
883883

884884
static void gdextension_string_new_with_utf16_chars(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents) {
885-
memnew_placement(r_dest, String);
886-
String *dest = reinterpret_cast<String *>(r_dest);
885+
String *dest = memnew_placement(r_dest, String);
887886
dest->parse_utf16(p_contents);
888887
}
889888

890889
static void gdextension_string_new_with_utf32_chars(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents) {
891-
memnew_placement(r_dest, String((const char32_t *)p_contents));
890+
String *dest = memnew_placement(r_dest, String);
891+
dest->parse_utf32(Span(p_contents, p_contents ? strlen(p_contents) : 0));
892892
}
893893

894894
static void gdextension_string_new_with_wide_chars(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents) {
895895
if constexpr (sizeof(wchar_t) == 2) {
896-
// wchar_t is 16 bit, parse.
897-
memnew_placement(r_dest, String);
898-
String *dest = reinterpret_cast<String *>(r_dest);
896+
// wchar_t is 16 bit (UTF-16).
897+
String *dest = memnew_placement(r_dest, String);
899898
dest->parse_utf16((const char16_t *)p_contents);
900899
} else {
901-
// wchar_t is 32 bit, copy.
902-
memnew_placement(r_dest, String((const char32_t *)p_contents));
900+
// wchar_t is 32 bit (UTF-32).
901+
String *string = memnew_placement(r_dest, String);
902+
string->parse_utf32(Span((const char32_t *)p_contents, p_contents ? strlen(p_contents) : 0));
903903
}
904904
}
905905

906906
static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {
907-
memnew_placement(r_dest, String(p_contents, p_size));
907+
String *dest = memnew_placement(r_dest, String);
908+
dest->parse_latin1(Span(p_contents, p_contents ? _strlen_clipped(p_contents, p_size) : 0));
908909
}
909910

910911
static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {
911-
memnew_placement(r_dest, String);
912-
String *dest = reinterpret_cast<String *>(r_dest);
912+
String *dest = memnew_placement(r_dest, String);
913913
dest->parse_utf8(p_contents, p_size);
914914
}
915915

916916
static GDExtensionInt gdextension_string_new_with_utf8_chars_and_len2(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {
917-
memnew_placement(r_dest, String);
918-
String *dest = reinterpret_cast<String *>(r_dest);
917+
String *dest = memnew_placement(r_dest, String);
919918
return (GDExtensionInt)dest->parse_utf8(p_contents, p_size);
920919
}
921920

922921
static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count) {
923-
memnew_placement(r_dest, String);
924-
String *dest = reinterpret_cast<String *>(r_dest);
922+
String *dest = memnew_placement(r_dest, String);
925923
dest->parse_utf16(p_contents, p_char_count);
926924
}
927925

928926
static GDExtensionInt gdextension_string_new_with_utf16_chars_and_len2(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count, GDExtensionBool p_default_little_endian) {
929-
memnew_placement(r_dest, String);
930-
String *dest = reinterpret_cast<String *>(r_dest);
927+
String *dest = memnew_placement(r_dest, String);
931928
return (GDExtensionInt)dest->parse_utf16(p_contents, p_char_count, p_default_little_endian);
932929
}
933930

934931
static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count) {
935-
memnew_placement(r_dest, String((const char32_t *)p_contents, p_char_count));
932+
String *string = memnew_placement(r_dest, String);
933+
string->parse_utf32(Span(p_contents, p_contents ? _strlen_clipped(p_contents, p_char_count) : 0));
936934
}
937935

938936
static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_char_count) {
939937
if constexpr (sizeof(wchar_t) == 2) {
940-
// wchar_t is 16 bit, parse.
941-
memnew_placement(r_dest, String);
942-
String *dest = reinterpret_cast<String *>(r_dest);
938+
// wchar_t is 16 bit (UTF-16).
939+
String *dest = memnew_placement(r_dest, String);
943940
dest->parse_utf16((const char16_t *)p_contents, p_char_count);
944941
} else {
945-
// wchar_t is 32 bit, copy.
946-
memnew_placement(r_dest, String((const char32_t *)p_contents, p_char_count));
942+
// wchar_t is 32 bit (UTF-32).
943+
String *string = memnew_placement(r_dest, String);
944+
string->parse_utf32(Span((const char32_t *)p_contents, p_contents ? _strlen_clipped((const char32_t *)p_contents, p_char_count) : 0));
947945
}
948946
}
949947

950948
static GDExtensionInt gdextension_string_to_latin1_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) {
951949
String *self = (String *)p_self;
952-
CharString cs = self->ascii(true);
950+
CharString cs = self->latin1();
953951
GDExtensionInt len = cs.length();
954952
if (r_text) {
955953
const char *s_text = cs.ptr();

core/string/ustring.h

+10-3
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,6 @@ class String {
246246
static const char32_t _replacement_char;
247247

248248
// Known-length copy.
249-
void parse_latin1(const Span<char> &p_cstr);
250-
void parse_utf32(const Span<char32_t> &p_cstr);
251-
void parse_utf32(const char32_t &p_char);
252249
void copy_from_unchecked(const char32_t *p_char, int p_length);
253250

254251
// NULL-terminated c string copy - automatically parse the string to find the length.
@@ -514,6 +511,13 @@ class String {
514511
s.parse_ascii(p_range);
515512
return s;
516513
}
514+
CharString latin1() const { return ascii(true); }
515+
void parse_latin1(const Span<char> &p_cstr);
516+
static String latin1(const Span<char> &p_string) {
517+
String string;
518+
string.parse_latin1(p_string);
519+
return string;
520+
}
517521

518522
CharString utf8() const;
519523
Error parse_utf8(const char *p_utf8, int p_len = -1, bool p_skip_cr = false);
@@ -531,6 +535,9 @@ class String {
531535
static String utf16(const char16_t *p_utf16, int p_len = -1);
532536
static String utf16(const Span<char16_t> &p_range) { return utf16(p_range.ptr(), p_range.size()); }
533537

538+
void parse_utf32(const Span<char32_t> &p_cstr);
539+
void parse_utf32(const char32_t &p_char);
540+
534541
static uint32_t hash(const char32_t *p_cstr, int p_len); /* hash the string */
535542
static uint32_t hash(const char32_t *p_cstr); /* hash the string */
536543
static uint32_t hash(const wchar_t *p_cstr, int p_len); /* hash the string */

0 commit comments

Comments
 (0)