OLD | NEW |
1 // Copyright 2007-2010 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2010 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_UNICODE_INL_H_ | 5 #ifndef V8_UNICODE_INL_H_ |
6 #define V8_UNICODE_INL_H_ | 6 #define V8_UNICODE_INL_H_ |
7 | 7 |
8 #include "src/unicode.h" | 8 #include "src/unicode.h" |
9 #include "src/base/logging.h" | 9 #include "src/base/logging.h" |
10 #include "src/utils.h" | 10 #include "src/utils.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 } else { | 50 } else { |
51 entries_[c & kMask] = CacheEntry(c, 0); | 51 entries_[c & kMask] = CacheEntry(c, 0); |
52 return 0; | 52 return 0; |
53 } | 53 } |
54 } else { | 54 } else { |
55 return length; | 55 return length; |
56 } | 56 } |
57 } | 57 } |
58 | 58 |
59 | 59 |
60 uint16_t Latin1::ConvertNonLatin1ToLatin1(uint16_t c) { | |
61 DCHECK(c > Latin1::kMaxChar); | |
62 switch (c) { | |
63 // This are equivalent characters in unicode. | |
64 case 0x39c: | |
65 case 0x3bc: | |
66 return 0xb5; | |
67 // This is an uppercase of a Latin-1 character | |
68 // outside of Latin-1. | |
69 case 0x178: | |
70 return 0xff; | |
71 } | |
72 return 0; | |
73 } | |
74 | |
75 | |
76 unsigned Utf8::EncodeOneByte(char* str, uint8_t c) { | 60 unsigned Utf8::EncodeOneByte(char* str, uint8_t c) { |
77 static const int kMask = ~(1 << 6); | 61 static const int kMask = ~(1 << 6); |
78 if (c <= kMaxOneByteChar) { | 62 if (c <= kMaxOneByteChar) { |
79 str[0] = c; | 63 str[0] = c; |
80 return 1; | 64 return 1; |
81 } | 65 } |
82 str[0] = 0xC0 | (c >> 6); | 66 str[0] = 0xC0 | (c >> 6); |
83 str[1] = 0x80 | (c & kMask); | 67 str[1] = 0x80 | (c & kMask); |
84 return 2; | 68 return 2; |
85 } | 69 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 if (Utf16::IsTrailSurrogate(c) && | 130 if (Utf16::IsTrailSurrogate(c) && |
147 Utf16::IsLeadSurrogate(previous)) { | 131 Utf16::IsLeadSurrogate(previous)) { |
148 return kSizeOfUnmatchedSurrogate - kBytesSavedByCombiningSurrogates; | 132 return kSizeOfUnmatchedSurrogate - kBytesSavedByCombiningSurrogates; |
149 } | 133 } |
150 return 3; | 134 return 3; |
151 } else { | 135 } else { |
152 return 4; | 136 return 4; |
153 } | 137 } |
154 } | 138 } |
155 | 139 |
156 Utf8DecoderBase::Utf8DecoderBase() | |
157 : unbuffered_start_(NULL), | |
158 utf16_length_(0), | |
159 last_byte_of_buffer_unused_(false) {} | |
160 | |
161 Utf8DecoderBase::Utf8DecoderBase(uint16_t* buffer, | |
162 unsigned buffer_length, | |
163 const uint8_t* stream, | |
164 unsigned stream_length) { | |
165 Reset(buffer, buffer_length, stream, stream_length); | |
166 } | |
167 | |
168 template<unsigned kBufferSize> | |
169 Utf8Decoder<kBufferSize>::Utf8Decoder(const char* stream, unsigned length) | |
170 : Utf8DecoderBase(buffer_, | |
171 kBufferSize, | |
172 reinterpret_cast<const uint8_t*>(stream), | |
173 length) { | |
174 } | |
175 | |
176 template<unsigned kBufferSize> | |
177 void Utf8Decoder<kBufferSize>::Reset(const char* stream, unsigned length) { | |
178 Utf8DecoderBase::Reset(buffer_, | |
179 kBufferSize, | |
180 reinterpret_cast<const uint8_t*>(stream), | |
181 length); | |
182 } | |
183 | |
184 template <unsigned kBufferSize> | |
185 unsigned Utf8Decoder<kBufferSize>::WriteUtf16(uint16_t* data, | |
186 unsigned length) const { | |
187 DCHECK(length > 0); | |
188 if (length > utf16_length_) length = utf16_length_; | |
189 // memcpy everything in buffer. | |
190 unsigned buffer_length = | |
191 last_byte_of_buffer_unused_ ? kBufferSize - 1 : kBufferSize; | |
192 unsigned memcpy_length = length <= buffer_length ? length : buffer_length; | |
193 v8::internal::MemCopy(data, buffer_, memcpy_length * sizeof(uint16_t)); | |
194 if (length <= buffer_length) return length; | |
195 DCHECK(unbuffered_start_ != NULL); | |
196 // Copy the rest the slow way. | |
197 WriteUtf16Slow(unbuffered_start_, | |
198 data + buffer_length, | |
199 length - buffer_length); | |
200 return length; | |
201 } | |
202 | |
203 } // namespace unibrow | 140 } // namespace unibrow |
204 | 141 |
205 #endif // V8_UNICODE_INL_H_ | 142 #endif // V8_UNICODE_INL_H_ |
OLD | NEW |