| Index: third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp
|
| diff --git a/third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp b/third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp
|
| index 6fc1f15a2df3867d4294cf5e13e0b588cf4c266e..5660728846eb8e9abba883701ba6d9187339dc11 100644
|
| --- a/third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp
|
| +++ b/third_party/WebKit/Source/wtf/text/TextCodecUTF16.cpp
|
| @@ -35,155 +35,159 @@ using namespace std;
|
|
|
| namespace WTF {
|
|
|
| -void TextCodecUTF16::registerEncodingNames(EncodingNameRegistrar registrar)
|
| -{
|
| - registrar("UTF-16LE", "UTF-16LE");
|
| - registrar("UTF-16BE", "UTF-16BE");
|
| -
|
| - registrar("ISO-10646-UCS-2", "UTF-16LE");
|
| - registrar("UCS-2", "UTF-16LE");
|
| - registrar("UTF-16", "UTF-16LE");
|
| - registrar("Unicode", "UTF-16LE");
|
| - registrar("csUnicode", "UTF-16LE");
|
| - registrar("unicodeFEFF", "UTF-16LE");
|
| -
|
| - registrar("unicodeFFFE", "UTF-16BE");
|
| +void TextCodecUTF16::registerEncodingNames(EncodingNameRegistrar registrar) {
|
| + registrar("UTF-16LE", "UTF-16LE");
|
| + registrar("UTF-16BE", "UTF-16BE");
|
| +
|
| + registrar("ISO-10646-UCS-2", "UTF-16LE");
|
| + registrar("UCS-2", "UTF-16LE");
|
| + registrar("UTF-16", "UTF-16LE");
|
| + registrar("Unicode", "UTF-16LE");
|
| + registrar("csUnicode", "UTF-16LE");
|
| + registrar("unicodeFEFF", "UTF-16LE");
|
| +
|
| + registrar("unicodeFFFE", "UTF-16BE");
|
| }
|
|
|
| -static PassOwnPtr<TextCodec> newStreamingTextDecoderUTF16LE(const TextEncoding&, const void*)
|
| -{
|
| - return adoptPtr(new TextCodecUTF16(true));
|
| +static PassOwnPtr<TextCodec> newStreamingTextDecoderUTF16LE(const TextEncoding&,
|
| + const void*) {
|
| + return adoptPtr(new TextCodecUTF16(true));
|
| }
|
|
|
| -static PassOwnPtr<TextCodec> newStreamingTextDecoderUTF16BE(const TextEncoding&, const void*)
|
| -{
|
| - return adoptPtr(new TextCodecUTF16(false));
|
| +static PassOwnPtr<TextCodec> newStreamingTextDecoderUTF16BE(const TextEncoding&,
|
| + const void*) {
|
| + return adoptPtr(new TextCodecUTF16(false));
|
| }
|
|
|
| -void TextCodecUTF16::registerCodecs(TextCodecRegistrar registrar)
|
| -{
|
| - registrar("UTF-16LE", newStreamingTextDecoderUTF16LE, 0);
|
| - registrar("UTF-16BE", newStreamingTextDecoderUTF16BE, 0);
|
| +void TextCodecUTF16::registerCodecs(TextCodecRegistrar registrar) {
|
| + registrar("UTF-16LE", newStreamingTextDecoderUTF16LE, 0);
|
| + registrar("UTF-16BE", newStreamingTextDecoderUTF16BE, 0);
|
| }
|
|
|
| -String TextCodecUTF16::decode(const char* bytes, size_t length, FlushBehavior flush, bool, bool& sawError)
|
| -{
|
| - // For compatibility reasons, ignore flush from fetch EOF.
|
| - const bool reallyFlush = flush != DoNotFlush && flush != FetchEOF;
|
| -
|
| - if (!length) {
|
| - if (!reallyFlush || !m_haveBufferedByte)
|
| - return String();
|
| - sawError = true;
|
| - return String(&replacementCharacter, 1);
|
| - }
|
| -
|
| - // FIXME: This should generate an error if there is an unpaired surrogate.
|
| -
|
| - const unsigned char* p = reinterpret_cast<const unsigned char*>(bytes);
|
| - size_t numBytes = length + m_haveBufferedByte;
|
| - size_t numCharsIn = numBytes / 2;
|
| - size_t numCharsOut = ((numBytes & 1) && reallyFlush) ? numCharsIn + 1 : numCharsIn;
|
| -
|
| - StringBuffer<UChar> buffer(numCharsOut);
|
| - UChar* q = buffer.characters();
|
| -
|
| - if (m_haveBufferedByte) {
|
| - UChar c;
|
| - if (m_littleEndian)
|
| - c = m_bufferedByte | (p[0] << 8);
|
| - else
|
| - c = (m_bufferedByte << 8) | p[0];
|
| - *q++ = c;
|
| - m_haveBufferedByte = false;
|
| - p += 1;
|
| - numCharsIn -= 1;
|
| +String TextCodecUTF16::decode(const char* bytes,
|
| + size_t length,
|
| + FlushBehavior flush,
|
| + bool,
|
| + bool& sawError) {
|
| + // For compatibility reasons, ignore flush from fetch EOF.
|
| + const bool reallyFlush = flush != DoNotFlush && flush != FetchEOF;
|
| +
|
| + if (!length) {
|
| + if (!reallyFlush || !m_haveBufferedByte)
|
| + return String();
|
| + sawError = true;
|
| + return String(&replacementCharacter, 1);
|
| + }
|
| +
|
| + // FIXME: This should generate an error if there is an unpaired surrogate.
|
| +
|
| + const unsigned char* p = reinterpret_cast<const unsigned char*>(bytes);
|
| + size_t numBytes = length + m_haveBufferedByte;
|
| + size_t numCharsIn = numBytes / 2;
|
| + size_t numCharsOut =
|
| + ((numBytes & 1) && reallyFlush) ? numCharsIn + 1 : numCharsIn;
|
| +
|
| + StringBuffer<UChar> buffer(numCharsOut);
|
| + UChar* q = buffer.characters();
|
| +
|
| + if (m_haveBufferedByte) {
|
| + UChar c;
|
| + if (m_littleEndian)
|
| + c = m_bufferedByte | (p[0] << 8);
|
| + else
|
| + c = (m_bufferedByte << 8) | p[0];
|
| + *q++ = c;
|
| + m_haveBufferedByte = false;
|
| + p += 1;
|
| + numCharsIn -= 1;
|
| + }
|
| +
|
| + if (m_littleEndian) {
|
| + for (size_t i = 0; i < numCharsIn; ++i) {
|
| + UChar c = p[0] | (p[1] << 8);
|
| + p += 2;
|
| + *q++ = c;
|
| }
|
| -
|
| - if (m_littleEndian) {
|
| - for (size_t i = 0; i < numCharsIn; ++i) {
|
| - UChar c = p[0] | (p[1] << 8);
|
| - p += 2;
|
| - *q++ = c;
|
| - }
|
| - } else {
|
| - for (size_t i = 0; i < numCharsIn; ++i) {
|
| - UChar c = (p[0] << 8) | p[1];
|
| - p += 2;
|
| - *q++ = c;
|
| - }
|
| + } else {
|
| + for (size_t i = 0; i < numCharsIn; ++i) {
|
| + UChar c = (p[0] << 8) | p[1];
|
| + p += 2;
|
| + *q++ = c;
|
| }
|
| + }
|
|
|
| - if (numBytes & 1) {
|
| - ASSERT(!m_haveBufferedByte);
|
| + if (numBytes & 1) {
|
| + ASSERT(!m_haveBufferedByte);
|
|
|
| - if (reallyFlush) {
|
| - sawError = true;
|
| - *q++ = replacementCharacter;
|
| - } else {
|
| - m_haveBufferedByte = true;
|
| - m_bufferedByte = p[0];
|
| - }
|
| + if (reallyFlush) {
|
| + sawError = true;
|
| + *q++ = replacementCharacter;
|
| + } else {
|
| + m_haveBufferedByte = true;
|
| + m_bufferedByte = p[0];
|
| }
|
| + }
|
|
|
| - buffer.shrink(q - buffer.characters());
|
| + buffer.shrink(q - buffer.characters());
|
|
|
| - return String::adopt(buffer);
|
| + return String::adopt(buffer);
|
| }
|
|
|
| -CString TextCodecUTF16::encode(const UChar* characters, size_t length, UnencodableHandling)
|
| -{
|
| - // We need to be sure we can double the length without overflowing.
|
| - // Since the passed-in length is the length of an actual existing
|
| - // character buffer, each character is two bytes, and we know
|
| - // the buffer doesn't occupy the entire address space, we can
|
| - // assert here that doubling the length does not overflow size_t
|
| - // and there's no need for a runtime check.
|
| - ASSERT(length <= numeric_limits<size_t>::max() / 2);
|
| -
|
| - char* bytes;
|
| - CString result = CString::newUninitialized(length * 2, bytes);
|
| -
|
| - // FIXME: CString is not a reasonable data structure for encoded UTF-16, which will have
|
| - // null characters inside it. Perhaps the result of encode should not be a CString.
|
| - if (m_littleEndian) {
|
| - for (size_t i = 0; i < length; ++i) {
|
| - UChar c = characters[i];
|
| - bytes[i * 2] = static_cast<char>(c);
|
| - bytes[i * 2 + 1] = c >> 8;
|
| - }
|
| - } else {
|
| - for (size_t i = 0; i < length; ++i) {
|
| - UChar c = characters[i];
|
| - bytes[i * 2] = c >> 8;
|
| - bytes[i * 2 + 1] = static_cast<char>(c);
|
| - }
|
| +CString TextCodecUTF16::encode(const UChar* characters,
|
| + size_t length,
|
| + UnencodableHandling) {
|
| + // We need to be sure we can double the length without overflowing.
|
| + // Since the passed-in length is the length of an actual existing
|
| + // character buffer, each character is two bytes, and we know
|
| + // the buffer doesn't occupy the entire address space, we can
|
| + // assert here that doubling the length does not overflow size_t
|
| + // and there's no need for a runtime check.
|
| + ASSERT(length <= numeric_limits<size_t>::max() / 2);
|
| +
|
| + char* bytes;
|
| + CString result = CString::newUninitialized(length * 2, bytes);
|
| +
|
| + // FIXME: CString is not a reasonable data structure for encoded UTF-16, which will have
|
| + // null characters inside it. Perhaps the result of encode should not be a CString.
|
| + if (m_littleEndian) {
|
| + for (size_t i = 0; i < length; ++i) {
|
| + UChar c = characters[i];
|
| + bytes[i * 2] = static_cast<char>(c);
|
| + bytes[i * 2 + 1] = c >> 8;
|
| + }
|
| + } else {
|
| + for (size_t i = 0; i < length; ++i) {
|
| + UChar c = characters[i];
|
| + bytes[i * 2] = c >> 8;
|
| + bytes[i * 2 + 1] = static_cast<char>(c);
|
| }
|
| + }
|
|
|
| - return result;
|
| + return result;
|
| }
|
|
|
| -CString TextCodecUTF16::encode(const LChar* characters, size_t length, UnencodableHandling)
|
| -{
|
| - // In the LChar case, we do actually need to perform this check in release. :)
|
| - RELEASE_ASSERT(length <= numeric_limits<size_t>::max() / 2);
|
| +CString TextCodecUTF16::encode(const LChar* characters,
|
| + size_t length,
|
| + UnencodableHandling) {
|
| + // In the LChar case, we do actually need to perform this check in release. :)
|
| + RELEASE_ASSERT(length <= numeric_limits<size_t>::max() / 2);
|
|
|
| - char* bytes;
|
| - CString result = CString::newUninitialized(length * 2, bytes);
|
| + char* bytes;
|
| + CString result = CString::newUninitialized(length * 2, bytes);
|
|
|
| - if (m_littleEndian) {
|
| - for (size_t i = 0; i < length; ++i) {
|
| - bytes[i * 2] = characters[i];
|
| - bytes[i * 2 + 1] = 0;
|
| - }
|
| - } else {
|
| - for (size_t i = 0; i < length; ++i) {
|
| - bytes[i * 2] = 0;
|
| - bytes[i * 2 + 1] = characters[i];
|
| - }
|
| + if (m_littleEndian) {
|
| + for (size_t i = 0; i < length; ++i) {
|
| + bytes[i * 2] = characters[i];
|
| + bytes[i * 2 + 1] = 0;
|
| + }
|
| + } else {
|
| + for (size_t i = 0; i < length; ++i) {
|
| + bytes[i * 2] = 0;
|
| + bytes[i * 2 + 1] = characters[i];
|
| }
|
| + }
|
|
|
| - return result;
|
| + return result;
|
| }
|
|
|
| -} // namespace WTF
|
| +} // namespace WTF
|
|
|