18 char *&ResultPtr,
const UTF8 *&ErrorPtr) {
19 assert(WideCharWidth == 1 || WideCharWidth == 2 || WideCharWidth == 4);
22 if (WideCharWidth == 1) {
23 const UTF8 *Pos =
reinterpret_cast<const UTF8*
>(Source.
begin());
29 ResultPtr += Source.
size();
31 }
else if (WideCharWidth == 2) {
35 UTF16 *targetStart =
reinterpret_cast<UTF16*
>(ResultPtr);
38 &sourceStart, sourceStart + Source.
size(),
39 &targetStart, targetStart + 2*Source.
size(), flags);
41 ResultPtr =
reinterpret_cast<char*
>(targetStart);
43 ErrorPtr = sourceStart;
44 }
else if (WideCharWidth == 4) {
48 UTF32 *targetStart =
reinterpret_cast<UTF32*
>(ResultPtr);
51 &sourceStart, sourceStart + Source.
size(),
52 &targetStart, targetStart + 4*Source.
size(), flags);
54 ResultPtr =
reinterpret_cast<char*
>(targetStart);
56 ErrorPtr = sourceStart;
59 &&
"ConvertUTF8toUTFXX exhausted target buffer");
65 const UTF32 *SourceEnd = SourceStart + 1;
66 UTF8 *TargetStart =
reinterpret_cast<UTF8 *
>(ResultPtr);
67 UTF8 *TargetEnd = TargetStart + 4;
69 &TargetStart, TargetEnd,
74 ResultPtr =
reinterpret_cast<char*
>(TargetStart);
79 return (S.
size() >= 2 &&
80 ((S[0] ==
'\xff' && S[1] ==
'\xfe') ||
81 (S[0] ==
'\xfe' && S[1] ==
'\xff')));
88 if (SrcBytes.
size() % 2)
96 const UTF16 *SrcEnd =
reinterpret_cast<const UTF16 *
>(SrcBytes.
end());
99 std::vector<UTF16> ByteSwapped;
101 ByteSwapped.insert(ByteSwapped.end(), Src, SrcEnd);
102 for (
unsigned I = 0, E = ByteSwapped.size();
I != E; ++
I)
104 Src = &ByteSwapped[0];
105 SrcEnd = &ByteSwapped[ByteSwapped.size() - 1] + 1;
114 UTF8 *Dst =
reinterpret_cast<UTF8 *
>(&Out[0]);
115 UTF8 *DstEnd = Dst + Out.size();
126 Out.resize(reinterpret_cast<char *>(Dst) - &Out[0]);
ConversionResult ConvertUTF32toUTF8(const UTF32 **sourceStart, const UTF32 *sourceEnd, UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags)
size_t size() const
size - Get the string size.
#define UNI_MAX_UTF8_BYTES_PER_CODE_POINT
ConversionResult ConvertUTF16toUTF8(const UTF16 **sourceStart, const UTF16 *sourceEnd, UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags)
Boolean isLegalUTF8String(const UTF8 **source, const UTF8 *sourceEnd)
#define UNI_UTF16_BYTE_ORDER_MARK_SWAPPED
#define UNI_UTF16_BYTE_ORDER_MARK_NATIVE
const char * data() const
size_t size() const
size - Get the array size.
uint16_t SwapByteOrder_16(uint16_t value)
bool ConvertUTF8toWide(unsigned WideCharWidth, llvm::StringRef Source, char *&ResultPtr, const UTF8 *&ErrorPtr)
bool ConvertCodePointToUTF8(unsigned Source, char *&ResultPtr)
bool empty() const
empty - Check if the array is empty.
ConversionResult ConvertUTF8toUTF32(const UTF8 **sourceStart, const UTF8 *sourceEnd, UTF32 **targetStart, UTF32 *targetEnd, ConversionFlags flags)
bool convertUTF16ToUTF8String(ArrayRef< char > SrcBytes, std::string &Out)
ConversionResult ConvertUTF8toUTF16(const UTF8 **sourceStart, const UTF8 *sourceEnd, UTF16 **targetStart, UTF16 *targetEnd, ConversionFlags flags)
bool hasUTF16ByteOrderMark(ArrayRef< char > S)