#include "config.h"
#include "UTextProvider.h"
#include <algorithm>
#include <string.h>
namespace WTF {
static inline void fixPointer(const UText* source, UText* destination, const void*& pointer)
{
if (pointer >= source->pExtra && pointer < static_cast<char*>(source->pExtra) + source->extraSize) {
pointer = static_cast<char*>(destination->pExtra) + (static_cast<const char*>(pointer) - static_cast<const char*>(source->pExtra));
} else if (pointer >= source && pointer < reinterpret_cast<const char*>(source) + source->sizeOfStruct) {
pointer = reinterpret_cast<char*>(destination) + (static_cast<const char*>(pointer) - reinterpret_cast<const char*>(source));
}
}
UText* uTextCloneImpl(UText* destination, const UText* source, UBool deep, UErrorCode* status)
{
ASSERT_UNUSED(deep, !deep);
if (U_FAILURE(*status))
return nullptr;
int32_t extraSize = source->extraSize;
destination = utext_setup(destination, extraSize, status);
if (U_FAILURE(*status))
return destination;
void* extraNew = destination->pExtra;
int32_t flags = destination->flags;
int sizeToCopy = std::min(source->sizeOfStruct, destination->sizeOfStruct);
memcpy(destination, source, sizeToCopy);
destination->pExtra = extraNew;
destination->flags = flags;
memcpy(destination->pExtra, source->pExtra, extraSize);
fixPointer(source, destination, destination->context);
fixPointer(source, destination, destination->p);
fixPointer(source, destination, destination->q);
ASSERT(!destination->r);
const void* chunkContents = static_cast<const void*>(destination->chunkContents);
fixPointer(source, destination, chunkContents);
destination->chunkContents = static_cast<const UChar*>(chunkContents);
return destination;
}
}