1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2007-2008 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_UNICODE_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_UNICODE_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <sys/types.h> 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * \file 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Definitions and convenience functions for working with unicode. 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace unibrow { 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef unsigned int uchar; 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktypedef unsigned char byte; 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * The max length of the result of converting the case of a single 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * character. 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic const int kMaxMappingSize = 4; 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T, int size = 256> 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Predicate { 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Predicate() { } 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool get(uchar c); 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Test; 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool CalculateValue(uchar c); 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct CacheEntry { 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline CacheEntry() : code_point_(0), value_(0) { } 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline CacheEntry(uchar code_point, bool value) 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : code_point_(code_point), 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value_(value) { } 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar code_point_ : 21; 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool value_ : 1; 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = size; 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMask = kSize - 1; 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CacheEntry entries_[kSize]; 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A cache used in case conversion. It caches the value for characters 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// that either have no mapping or map to a single character independent 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// of context. Characters that map to more than one character or that 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// map differently depending on context are always looked up. 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class T, int size = 256> 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Mapping { 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Mapping() { } 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int get(uchar c, uchar n, uchar* result); 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Test; 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int CalculateValue(uchar c, uchar n, uchar* result); 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct CacheEntry { 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline CacheEntry() : code_point_(kNoChar), offset_(0) { } 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline CacheEntry(uchar code_point, signed offset) 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : code_point_(code_point), 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block offset_(offset) { } 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar code_point_; 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block signed offset_; 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNoChar = (1 << 21) - 1; 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = size; 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMask = kSize - 1; 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CacheEntry entries_[kSize]; 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass UnicodeData { 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Test; 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int GetByteCount(); 10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const uchar kMaxCodePoint; 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- U t f 8 --- 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename Data> 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Buffer { 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Buffer(Data data, unsigned length) : data_(data), length_(length) { } 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Buffer() : data_(0), length_(0) { } 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Data data() { return data_; } 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned length() { return length_; } 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Data data_; 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned length_; 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Utf8 { 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline uchar Length(uchar chr); 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline unsigned Encode(char* out, uchar c); 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const byte* ReadBlock(Buffer<const char*> str, byte* buffer, 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned capacity, unsigned* chars_read, unsigned* offset); 1230d5e116f6aee03185f237311a943491bb079a768Kristian Monsen static uchar CalculateValue(const byte* str, 1240d5e116f6aee03185f237311a943491bb079a768Kristian Monsen unsigned length, 1250d5e116f6aee03185f237311a943491bb079a768Kristian Monsen unsigned* cursor); 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uchar kBadChar = 0xFFFD; 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const unsigned kMaxEncodedSize = 4; 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const unsigned kMaxOneByteChar = 0x7f; 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const unsigned kMaxTwoByteChar = 0x7ff; 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const unsigned kMaxThreeByteChar = 0xffff; 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const unsigned kMaxFourByteChar = 0x1fffff; 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block template <unsigned s> friend class Utf8InputBuffer; 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Test; 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline uchar ValueOf(const byte* str, 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned length, 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned* cursor); 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- C h a r a c t e r S t r e a m --- 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CharacterStream { 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uchar GetNext(); 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_more() { return remaining_ != 0; } 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Note that default implementation is not efficient. 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void Seek(unsigned); 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned Length(); 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~CharacterStream() { } 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool EncodeCharacter(uchar c, byte* buffer, unsigned capacity, 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned& offset); 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool EncodeAsciiCharacter(uchar c, byte* buffer, 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned capacity, unsigned& offset); 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool EncodeNonAsciiCharacter(uchar c, byte* buffer, 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned capacity, unsigned& offset); 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline uchar DecodeCharacter(const byte* buffer, unsigned* offset); 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void Rewind() = 0; 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void FillBuffer() = 0; 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The number of characters left in the current buffer 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned remaining_; 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The current offset within the buffer 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned cursor_; 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The buffer containing the decoded characters. 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const byte* buffer_; 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- I n p u t B u f f e r --- 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/** 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Provides efficient access to encoded characters in strings. It 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * does so by reading characters one block at a time, rather than one 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * character at a time, which gives string implementations an 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * opportunity to optimize the decoding. 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <class Reader, class Input = Reader*, unsigned kSize = 256> 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass InputBuffer : public CharacterStream { 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void Rewind(); 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void Reset(Input input); 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Seek(unsigned position); 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void Reset(unsigned position, Input input); 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InputBuffer() { } 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit InputBuffer(Input input) { Reset(input); } 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void FillBuffer(); 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // A custom offset that can be used by the string implementation to 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // mark progress within the encoded string. 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block unsigned offset_; 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The input string 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Input input_; 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // To avoid heap allocation, we keep an internal buffer to which 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the encoded string can write its characters. The string 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // implementation is free to decide whether it wants to use this 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // buffer or not. 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block byte util_buffer_[kSize]; 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --- U t f 8 I n p u t B u f f e r --- 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <unsigned s = 256> 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Utf8InputBuffer : public InputBuffer<Utf8, Buffer<const char*>, s> { 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Utf8InputBuffer() { } 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Utf8InputBuffer(const char* data, unsigned length); 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void Reset(const char* data, unsigned length) { 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InputBuffer<Utf8, Buffer<const char*>, s>::Reset( 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Buffer<const char*>(data, length)); 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 214bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Uppercase { 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Lowercase { 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Letter { 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Space { 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Number { 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct WhiteSpace { 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct LineTerminator { 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct CombiningMark { 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct ConnectorPunctuation { 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool Is(uchar c); 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct ToLowercase { 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxWidth = 3; 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Convert(uchar c, 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar n, 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar* result, 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool* allow_caching_ptr); 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct ToUppercase { 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxWidth = 3; 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Convert(uchar c, 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar n, 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar* result, 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool* allow_caching_ptr); 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Ecma262Canonicalize { 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxWidth = 1; 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Convert(uchar c, 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar n, 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar* result, 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool* allow_caching_ptr); 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct Ecma262UnCanonicalize { 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxWidth = 4; 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Convert(uchar c, 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar n, 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar* result, 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool* allow_caching_ptr); 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct CanonicalizationRange { 271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxWidth = 1; 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int Convert(uchar c, 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar n, 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uchar* result, 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool* allow_caching_ptr); 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} // namespace unibrow 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_UNICODE_H_ 281