diff options
Diffstat (limited to 'WebCore/platform/text/TextCodecUserDefined.cpp')
-rw-r--r-- | WebCore/platform/text/TextCodecUserDefined.cpp | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/WebCore/platform/text/TextCodecUserDefined.cpp b/WebCore/platform/text/TextCodecUserDefined.cpp index a420992..2dae0f3 100644 --- a/WebCore/platform/text/TextCodecUserDefined.cpp +++ b/WebCore/platform/text/TextCodecUserDefined.cpp @@ -29,6 +29,7 @@ #include "CString.h" #include "PlatformString.h" #include "StringBuffer.h" +#include <stdio.h> using std::auto_ptr; @@ -49,7 +50,7 @@ void TextCodecUserDefined::registerCodecs(TextCodecRegistrar registrar) registrar("x-user-defined", newStreamingTextDecoderUserDefined, 0); } -String TextCodecUserDefined::decode(const char* bytes, size_t length, bool) +String TextCodecUserDefined::decode(const char* bytes, size_t length, bool, bool, bool&) { StringBuffer buffer(length); @@ -61,7 +62,7 @@ String TextCodecUserDefined::decode(const char* bytes, size_t length, bool) return String::adopt(buffer); } -static CString encodeComplexUserDefined(const UChar* characters, size_t length, bool allowEntities) +static CString encodeComplexUserDefined(const UChar* characters, size_t length, UnencodableHandling handling) { Vector<char> result(length); char* bytes = result.data(); @@ -71,27 +72,23 @@ static CString encodeComplexUserDefined(const UChar* characters, size_t length, UChar32 c; U16_NEXT(characters, i, length, c); signed char signedByte = c; - if ((signedByte & 0xf7ff) == c) + if ((signedByte & 0xF7FF) == c) bytes[resultLength++] = signedByte; else { // No way to encode this character with x-user-defined. - if (allowEntities) { - char entityBuffer[16]; - sprintf(entityBuffer, "&#%u;", c); - size_t entityLength = strlen(entityBuffer); - result.grow(resultLength + entityLength + length - i); - bytes = result.data(); - memcpy(bytes + resultLength, entityBuffer, entityLength); - resultLength += entityLength; - } else - bytes[resultLength++] = '?'; + UnencodableReplacementArray replacement; + int replacementLength = TextCodec::getUnencodableReplacement(c, handling, replacement); + result.grow(resultLength + replacementLength + length - i); + bytes = result.data(); + memcpy(bytes + resultLength, replacement, replacementLength); + resultLength += replacementLength; } } return CString(bytes, resultLength); } -CString TextCodecUserDefined::encode(const UChar* characters, size_t length, bool allowEntities) +CString TextCodecUserDefined::encode(const UChar* characters, size_t length, UnencodableHandling handling) { char* bytes; CString string = CString::newUninitialized(length, bytes); @@ -108,7 +105,7 @@ CString TextCodecUserDefined::encode(const UChar* characters, size_t length, boo return string; // If it wasn't all ASCII, call the function that handles more-complex cases. - return encodeComplexUserDefined(characters, length, allowEntities); + return encodeComplexUserDefined(characters, length, handling); } } // namespace WebCore |