| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008 Apple, Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008 Apple, Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 result.append(static_cast<UChar>(c & 0xF7FF)); | 62 result.append(static_cast<UChar>(c & 0xF7FF)); |
| 63 } | 63 } |
| 64 | 64 |
| 65 return result.toString(); | 65 return result.toString(); |
| 66 } | 66 } |
| 67 | 67 |
| 68 template <typename CharType> | 68 template <typename CharType> |
| 69 static CString encodeComplexUserDefined(const CharType* characters, | 69 static CString encodeComplexUserDefined(const CharType* characters, |
| 70 size_t length, | 70 size_t length, |
| 71 UnencodableHandling handling) { | 71 UnencodableHandling handling) { |
| 72 Vector<char> result(length); | 72 size_t targetLength = length; |
| 73 Vector<char> result(targetLength); |
| 73 char* bytes = result.data(); | 74 char* bytes = result.data(); |
| 74 | 75 |
| 75 size_t resultLength = 0; | 76 size_t resultLength = 0; |
| 76 for (size_t i = 0; i < length;) { | 77 for (size_t i = 0; i < length;) { |
| 77 UChar32 c; | 78 UChar32 c; |
| 79 // TODO(jsbell): Will the input for x-user-defined ever be LChars? |
| 78 U16_NEXT(characters, i, length, c); | 80 U16_NEXT(characters, i, length, c); |
| 81 // If the input was a surrogate pair (non-BMP character) then we |
| 82 // overestimated the length. |
| 83 if (c > 0xffff) |
| 84 --targetLength; |
| 79 signed char signedByte = static_cast<signed char>(c); | 85 signed char signedByte = static_cast<signed char>(c); |
| 80 if ((signedByte & 0xF7FF) == c) { | 86 if ((signedByte & 0xF7FF) == c) { |
| 81 bytes[resultLength++] = signedByte; | 87 bytes[resultLength++] = signedByte; |
| 82 } else { | 88 } else { |
| 83 // No way to encode this character with x-user-defined. | 89 // No way to encode this character with x-user-defined. |
| 84 UnencodableReplacementArray replacement; | 90 UnencodableReplacementArray replacement; |
| 85 int replacementLength = | 91 int replacementLength = |
| 86 TextCodec::getUnencodableReplacement(c, handling, replacement); | 92 TextCodec::getUnencodableReplacement(c, handling, replacement); |
| 87 result.grow(resultLength + replacementLength + length - i); | 93 DCHECK_GT(replacementLength, 0); |
| 88 bytes = result.data(); | 94 // Only one char was initially reserved per input character, so grow if |
| 95 // necessary. Note that in the case of surrogate pairs and |
| 96 // QuestionMarksForUnencodables the result length may be shorter than |
| 97 // the input length. |
| 98 targetLength += replacementLength - 1; |
| 99 if (targetLength > result.size()) { |
| 100 result.grow(targetLength); |
| 101 bytes = result.data(); |
| 102 } |
| 89 memcpy(bytes + resultLength, replacement, replacementLength); | 103 memcpy(bytes + resultLength, replacement, replacementLength); |
| 90 resultLength += replacementLength; | 104 resultLength += replacementLength; |
| 91 } | 105 } |
| 92 } | 106 } |
| 93 | 107 |
| 94 return CString(bytes, resultLength); | 108 return CString(bytes, resultLength); |
| 95 } | 109 } |
| 96 | 110 |
| 97 template <typename CharType> | 111 template <typename CharType> |
| 98 CString TextCodecUserDefined::encodeCommon(const CharType* characters, | 112 CString TextCodecUserDefined::encodeCommon(const CharType* characters, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 123 return encodeCommon(characters, length, handling); | 137 return encodeCommon(characters, length, handling); |
| 124 } | 138 } |
| 125 | 139 |
| 126 CString TextCodecUserDefined::encode(const LChar* characters, | 140 CString TextCodecUserDefined::encode(const LChar* characters, |
| 127 size_t length, | 141 size_t length, |
| 128 UnencodableHandling handling) { | 142 UnencodableHandling handling) { |
| 129 return encodeCommon(characters, length, handling); | 143 return encodeCommon(characters, length, handling); |
| 130 } | 144 } |
| 131 | 145 |
| 132 } // namespace WTF | 146 } // namespace WTF |
| OLD | NEW |