@@ -324,7 +324,27 @@ void String::parse_utf32(const Span<char32_t> &p_cstr) {
324324 return ;
325325 }
326326
327- copy_from_unchecked (p_cstr.ptr (), p_cstr.size ());
327+ resize (p_cstr.size () + 1 );
328+ const char32_t *src = p_cstr.ptr ();
329+ const char32_t *end = p_cstr.ptr () + p_cstr.size ();
330+ char32_t *dst = ptrw ();
331+
332+ // Copy the string, and check for UTF-32 problems.
333+ for (; src < end; ++src, ++dst) {
334+ const char32_t chr = *src;
335+ if ((chr & 0xfffff800 ) == 0xd800 ) {
336+ print_unicode_error (vformat (" Unpaired surrogate (%x)" , (uint32_t )chr), true );
337+ *dst = _replacement_char;
338+ continue ;
339+ }
340+ if (chr > 0x10ffff ) {
341+ print_unicode_error (vformat (" Invalid unicode codepoint (%x)" , (uint32_t )chr), true );
342+ *dst = _replacement_char;
343+ continue ;
344+ }
345+ *dst = chr;
346+ }
347+ *dst = 0 ;
328348}
329349
330350void String::parse_utf32 (const char32_t &p_char) {
@@ -354,27 +374,12 @@ void String::parse_utf32(const char32_t &p_char) {
354374// p_char != nullptr
355375// p_length > 0
356376// p_length <= p_char strlen
377+ // p_char is a valid UTF32 string
357378void String::copy_from_unchecked (const char32_t *p_char, const int p_length) {
358- resize (p_length + 1 );
359-
360- const char32_t *end = p_char + p_length;
379+ resize (p_length + 1 ); // + 1 for \0
361380 char32_t *dst = ptrw ();
362-
363- for (; p_char < end; ++p_char, ++dst) {
364- const char32_t chr = *p_char;
365- if ((chr & 0xfffff800 ) == 0xd800 ) {
366- print_unicode_error (vformat (" Unpaired surrogate (%x)" , (uint32_t )chr));
367- *dst = _replacement_char;
368- continue ;
369- }
370- if (chr > 0x10ffff ) {
371- print_unicode_error (vformat (" Invalid unicode codepoint (%x)" , (uint32_t )chr));
372- *dst = _replacement_char;
373- continue ;
374- }
375- *dst = chr;
376- }
377- *dst = 0 ;
381+ memcpy (dst, p_char, p_length * sizeof (char32_t ));
382+ *(dst + p_length) = _null;
378383}
379384
380385String String::operator +(const String &p_str) const {
0 commit comments