Skip to content

Commit 177dc8d

Browse files
authored
Fix createStringFromData
1 parent 1f42ce2 commit 177dc8d

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

modules/yup_core/text/yup_String.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2245,24 +2245,25 @@ String String::createStringFromData (const void* const unknownData, int size)
22452245
if (size == 1)
22462246
return charToString ((yup_wchar) data[0]);
22472247

2248-
if (CharPointer_UTF16::isByteOrderMarkBigEndian (data)
2249-
|| CharPointer_UTF16::isByteOrderMarkLittleEndian (data))
2250-
{
2251-
const int numChars = size / 2 - 1;
2248+
const auto bigEndianData = CharPointer_UTF16::isByteOrderMarkBigEndian (data);
22522249

2253-
StringCreationHelper builder ((size_t) numChars);
2250+
if (bigEndianData || CharPointer_UTF16::isByteOrderMarkLittleEndian (data))
2251+
{
2252+
const auto numUnits = size / 2 - 1;
2253+
const auto src = unalignedPointerCast<const uint16*> (data + 2);
2254+
const auto swapBytes = bigEndianData ? ByteOrder::swapIfLittleEndian<uint16>
2255+
: ByteOrder::swapIfBigEndian<uint16>;
22542256

2255-
auto src = unalignedPointerCast<const uint16*> (data + 2);
2257+
StringCreationHelper builder ((size_t) numUnits);
22562258

2257-
if (CharPointer_UTF16::isByteOrderMarkBigEndian (data))
2259+
for (int i = 0; i < numUnits;)
22582260
{
2259-
for (int i = 0; i < numChars; ++i)
2260-
builder.write ((yup_wchar) ByteOrder::swapIfLittleEndian (src[i]));
2261-
}
2262-
else
2263-
{
2264-
for (int i = 0; i < numChars; ++i)
2265-
builder.write ((yup_wchar) ByteOrder::swapIfBigEndian (src[i]));
2261+
const uint16 wideBuffer[] { swapBytes (src[i]),
2262+
swapBytes ((i + 1 == numUnits) ? (uint16) 0 : src[i + 1]) };
2263+
const CharPointer_UTF16 ptr { reinterpret_cast<const CharPointer_UTF16::CharType*> (wideBuffer) };
2264+
2265+
builder.write (*ptr);
2266+
i += (int) ((ptr + 1).getAddress() - ptr.getAddress());
22662267
}
22672268

22682269
builder.write (0);
@@ -2745,3 +2746,4 @@ String String::dedentLines() const
27452746
}
27462747

27472748
} // namespace yup
2749+

0 commit comments

Comments
 (0)