mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
General beast update, fixes, optimizations, features:
* Clean ups, optimizations, and new File::commonDocumentsDirectory enum * Replace sortArray with std::sort for performance * More error tolerance in XML parser, speedups * Refactor some byte-order mark detection code * Add String::appendCharPointer overloads * More XML parser optimisations and better error detection * Misc performance tweaks * Fixes for support of non utf8 strings * Increased precision when storing strings in XmlElement * Minor clean-ups * Minor fix to XmlDocument * Cleanups to CriticalSection and related synchronization primitives * Fix DynamicArray unit test
This commit is contained in:
@@ -481,6 +481,31 @@ void String::append (const String& textToAppend, size_t maxCharsToTake)
|
||||
appendCharPointer (textToAppend.text, maxCharsToTake);
|
||||
}
|
||||
|
||||
void String::appendCharPointer (const CharPointerType textToAppend)
|
||||
{
|
||||
appendCharPointer (textToAppend, textToAppend.findTerminatingNull());
|
||||
}
|
||||
|
||||
void String::appendCharPointer (const CharPointerType startOfTextToAppend,
|
||||
const CharPointerType endOfTextToAppend)
|
||||
{
|
||||
bassert (startOfTextToAppend.getAddress() != nullptr && endOfTextToAppend.getAddress() != nullptr);
|
||||
|
||||
const int extraBytesNeeded = getAddressDifference (endOfTextToAppend.getAddress(),
|
||||
startOfTextToAppend.getAddress());
|
||||
bassert (extraBytesNeeded >= 0);
|
||||
|
||||
if (extraBytesNeeded > 0)
|
||||
{
|
||||
const size_t byteOffsetOfNull = getByteOffsetOfEnd();
|
||||
preallocateBytes (byteOffsetOfNull + (size_t) extraBytesNeeded);
|
||||
|
||||
CharPointerType::CharType* const newStringStart = addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull);
|
||||
memcpy (newStringStart, startOfTextToAppend.getAddress(), extraBytesNeeded);
|
||||
CharPointerType (addBytesToPointer (newStringStart, extraBytesNeeded)).writeNull();
|
||||
}
|
||||
}
|
||||
|
||||
String& String::operator+= (const wchar_t* const t)
|
||||
{
|
||||
appendCharPointer (castToCharPointer_wchar_t (t));
|
||||
@@ -1778,9 +1803,9 @@ int String::getHexValue32() const noexcept { return HexConverter<int> ::st
|
||||
int64 String::getHexValue64() const noexcept { return HexConverter<int64>::stringToHex (text); }
|
||||
|
||||
//==============================================================================
|
||||
String String::createStringFromData (const void* const data_, const int size)
|
||||
String String::createStringFromData (const void* const unknownData, const int size)
|
||||
{
|
||||
const uint8* const data = static_cast <const uint8*> (data_);
|
||||
const uint8* const data = static_cast<const uint8*> (unknownData);
|
||||
|
||||
if (size <= 0 || data == nullptr)
|
||||
return empty;
|
||||
@@ -1788,17 +1813,16 @@ String String::createStringFromData (const void* const data_, const int size)
|
||||
if (size == 1)
|
||||
return charToString ((beast_wchar) data[0]);
|
||||
|
||||
if ((data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkBE2)
|
||||
|| (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkLE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkLE2))
|
||||
if (CharPointer_UTF16::isByteOrderMarkBigEndian (data)
|
||||
|| CharPointer_UTF16::isByteOrderMarkLittleEndian (data))
|
||||
{
|
||||
const bool bigEndian = (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1);
|
||||
const int numChars = size / 2 - 1;
|
||||
|
||||
StringCreationHelper builder ((size_t) numChars);
|
||||
|
||||
const uint16* const src = (const uint16*) (data + 2);
|
||||
|
||||
if (bigEndian)
|
||||
if (CharPointer_UTF16::isByteOrderMarkBigEndian (data))
|
||||
{
|
||||
for (int i = 0; i < numChars; ++i)
|
||||
builder.write ((beast_wchar) ByteOrder::swapIfLittleEndian (src[i]));
|
||||
@@ -1814,16 +1838,12 @@ String String::createStringFromData (const void* const data_, const int size)
|
||||
}
|
||||
|
||||
const uint8* start = data;
|
||||
const uint8* end = data + size;
|
||||
|
||||
if (size >= 3
|
||||
&& data[0] == (uint8) CharPointer_UTF8::byteOrderMark1
|
||||
&& data[1] == (uint8) CharPointer_UTF8::byteOrderMark2
|
||||
&& data[2] == (uint8) CharPointer_UTF8::byteOrderMark3)
|
||||
if (size >= 3 && CharPointer_UTF8::isByteOrderMark (data))
|
||||
start += 3;
|
||||
|
||||
return String (CharPointer_UTF8 ((const char*) start),
|
||||
CharPointer_UTF8 ((const char*) end));
|
||||
CharPointer_UTF8 ((const char*) (data + size)));
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
Reference in New Issue
Block a user