StreamingTextDecoderICU::~StreamingTextDecoderICU() { releaseICUConverter(); }
TextCodecICU::~TextCodecICU() { releaseICUConverter(); }
DeprecatedString StreamingTextDecoderICU::toUnicode(const char* chs, int len, bool flush) { ASSERT_ARG(len, len >= 0); if (!chs) return DeprecatedString(); if (len <= 0 && !flush) return ""; // Handle normal case. if (!m_atStart) return convert(chs, len, flush); // Check to see if we found a BOM. int numBufferedBytes = m_numBufferedBytes; int buf1Len = numBufferedBytes; int buf2Len = len; const unsigned char* buf1 = m_bufferedBytes; const unsigned char* buf2 = reinterpret_cast<const unsigned char*>(chs); unsigned char c1 = buf1Len ? (--buf1Len, *buf1++) : buf2Len ? (--buf2Len, *buf2++) : 0; unsigned char c2 = buf1Len ? (--buf1Len, *buf1++) : buf2Len ? (--buf2Len, *buf2++) : 0; unsigned char c3 = buf1Len ? (--buf1Len, *buf1++) : buf2Len ? (--buf2Len, *buf2++) : 0; int BOMLength = 0; if (c1 == 0xFF && c2 == 0xFE) { if (m_encoding != TextEncoding(UTF16Encoding, LittleEndian)) { releaseICUConverter(); m_encoding = TextEncoding(UTF16Encoding, LittleEndian); m_littleEndian = true; } BOMLength = 2; } else if (c1 == 0xFE && c2 == 0xFF) { if (m_encoding != TextEncoding(UTF16Encoding, BigEndian)) { releaseICUConverter(); m_encoding = TextEncoding(UTF16Encoding, BigEndian); m_littleEndian = false; } BOMLength = 2; } else if (c1 == 0xEF && c2 == 0xBB && c3 == 0xBF) { if (m_encoding != TextEncoding(UTF8Encoding)) { releaseICUConverter(); m_encoding = TextEncoding(UTF8Encoding); } BOMLength = 3; } // Handle case where we found a BOM. if (BOMLength != 0) { ASSERT(numBufferedBytes + len >= BOMLength); int skip = BOMLength - numBufferedBytes; m_numBufferedBytes = 0; m_atStart = false; return len == skip ? DeprecatedString("") : convert(chs + skip, len - skip, flush); } // Handle case where we know there is no BOM coming. const int bufferSize = sizeof(m_bufferedBytes); if (numBufferedBytes + len > bufferSize || flush) { m_atStart = false; if (numBufferedBytes == 0) { return convert(chs, len, flush); } unsigned char bufferedBytes[sizeof(m_bufferedBytes)]; memcpy(bufferedBytes, m_bufferedBytes, numBufferedBytes); m_numBufferedBytes = 0; return convert(bufferedBytes, numBufferedBytes, false) + convert(chs, len, flush); } // Continue to look for the BOM. memcpy(&m_bufferedBytes[numBufferedBytes], chs, len); m_numBufferedBytes += len; return ""; }