OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 unsigned& offset); | 194 unsigned& offset); |
195 static inline bool EncodeAsciiCharacter(uchar c, byte* buffer, | 195 static inline bool EncodeAsciiCharacter(uchar c, byte* buffer, |
196 unsigned capacity, unsigned& offset); | 196 unsigned capacity, unsigned& offset); |
197 static inline bool EncodeNonAsciiCharacter(uchar c, byte* buffer, | 197 static inline bool EncodeNonAsciiCharacter(uchar c, byte* buffer, |
198 unsigned capacity, unsigned& offset); | 198 unsigned capacity, unsigned& offset); |
199 static inline uchar DecodeCharacter(const byte* buffer, unsigned* offset); | 199 static inline uchar DecodeCharacter(const byte* buffer, unsigned* offset); |
200 virtual void Rewind() = 0; | 200 virtual void Rewind() = 0; |
201 | 201 |
202 protected: | 202 protected: |
203 virtual void FillBuffer() = 0; | 203 virtual void FillBuffer() = 0; |
| 204 virtual bool BoundsCheck(unsigned offset) = 0; |
204 // The number of characters left in the current buffer | 205 // The number of characters left in the current buffer |
205 unsigned remaining_; | 206 unsigned remaining_; |
206 // The current offset within the buffer | 207 // The current offset within the buffer |
207 unsigned cursor_; | 208 unsigned cursor_; |
208 // The buffer containing the decoded characters. | 209 // The buffer containing the decoded characters. |
209 const byte* buffer_; | 210 const byte* buffer_; |
210 }; | 211 }; |
211 | 212 |
212 // --- I n p u t B u f f e r --- | 213 // --- I n p u t B u f f e r --- |
213 | 214 |
214 /** | 215 /** |
215 * Provides efficient access to encoded characters in strings. It | 216 * Provides efficient access to encoded characters in strings. It |
216 * does so by reading characters one block at a time, rather than one | 217 * does so by reading characters one block at a time, rather than one |
217 * character at a time, which gives string implementations an | 218 * character at a time, which gives string implementations an |
218 * opportunity to optimize the decoding. | 219 * opportunity to optimize the decoding. |
219 */ | 220 */ |
220 template <class Reader, class Input = Reader*, unsigned kSize = 256> | 221 template <class Reader, class Input = Reader*, unsigned kSize = 256> |
221 class InputBuffer : public CharacterStream { | 222 class InputBuffer : public CharacterStream { |
222 public: | 223 public: |
223 virtual void Rewind(); | 224 virtual void Rewind(); |
224 inline void Reset(Input input); | 225 inline void Reset(Input input); |
225 void Seek(unsigned position); | 226 void Seek(unsigned position); |
226 inline void Reset(unsigned position, Input input); | 227 inline void Reset(unsigned position, Input input); |
227 protected: | 228 protected: |
228 InputBuffer() { } | 229 InputBuffer() { } |
229 explicit InputBuffer(Input input) { Reset(input); } | 230 explicit InputBuffer(Input input) { Reset(input); } |
230 virtual void FillBuffer(); | 231 virtual void FillBuffer(); |
| 232 virtual bool BoundsCheck(unsigned offset) { |
| 233 return (buffer_ != util_buffer_) || (offset < kSize); |
| 234 } |
231 | 235 |
232 // A custom offset that can be used by the string implementation to | 236 // A custom offset that can be used by the string implementation to |
233 // mark progress within the encoded string. | 237 // mark progress within the encoded string. |
234 unsigned offset_; | 238 unsigned offset_; |
235 // The input string | 239 // The input string |
236 Input input_; | 240 Input input_; |
237 // To avoid heap allocation, we keep an internal buffer to which | 241 // To avoid heap allocation, we keep an internal buffer to which |
238 // the encoded string can write its characters. The string | 242 // the encoded string can write its characters. The string |
239 // implementation is free to decide whether it wants to use this | 243 // implementation is free to decide whether it wants to use this |
240 // buffer or not. | 244 // buffer or not. |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 static const int kMaxWidth = 1; | 318 static const int kMaxWidth = 1; |
315 static int Convert(uchar c, | 319 static int Convert(uchar c, |
316 uchar n, | 320 uchar n, |
317 uchar* result, | 321 uchar* result, |
318 bool* allow_caching_ptr); | 322 bool* allow_caching_ptr); |
319 }; | 323 }; |
320 | 324 |
321 } // namespace unibrow | 325 } // namespace unibrow |
322 | 326 |
323 #endif // V8_UNICODE_H_ | 327 #endif // V8_UNICODE_H_ |
OLD | NEW |