1589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Redistribution and use in source and binary forms, with or without 3589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// modification, are permitted provided that the following conditions are 4589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// met: 5589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// 6589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// * Redistributions of source code must retain the above copyright 7589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// notice, this list of conditions and the following disclaimer. 8589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// * Redistributions in binary form must reproduce the above 9589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// copyright notice, this list of conditions and the following 10589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// disclaimer in the documentation and/or other materials provided 11589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// with the distribution. 12589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// contributors may be used to endorse or promote products derived 14589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// from this software without specific prior written permission. 15589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// 16589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 28589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#ifndef V8_SCANNER_CHARACTER_STREAMS_H_ 29589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define V8_SCANNER_CHARACTER_STREAMS_H_ 30589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 31589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#include "scanner.h" 32589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 33589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochnamespace v8 { 34589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochnamespace internal { 35589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 36589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// A buffered character stream based on a random access character 37589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// source (ReadBlock can be called with pos_ pointing to any position, 38589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// even positions before the current). 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass BufferedUtf16CharacterStream: public Utf16CharacterStream { 40589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public: 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BufferedUtf16CharacterStream(); 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual ~BufferedUtf16CharacterStream(); 43589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 44589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void PushBack(uc32 character); 45589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 46589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch protected: 47589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static const unsigned kBufferSize = 512; 48589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static const unsigned kPushBackStepSize = 16; 49589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 50589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned SlowSeekForward(unsigned delta); 51589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual bool ReadBlock(); 52589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void SlowPushBack(uc16 character); 53589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 54589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned BufferSeekForward(unsigned delta) = 0; 55589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned FillBuffer(unsigned position, unsigned length) = 0; 56589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 57589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch const uc16* pushback_limit_; 58589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch uc16 buffer_[kBufferSize]; 59589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 60589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 61589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 62589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// Generic string stream. 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass GenericStringUtf16CharacterStream: public BufferedUtf16CharacterStream { 64589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public: 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GenericStringUtf16CharacterStream(Handle<String> data, 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch unsigned start_position, 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch unsigned end_position); 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual ~GenericStringUtf16CharacterStream(); 69589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 70589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch protected: 71589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned BufferSeekForward(unsigned delta); 72589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned FillBuffer(unsigned position, unsigned length); 73589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 74589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Handle<String> string_; 75589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch unsigned start_position_; 76589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch unsigned length_; 77589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 78589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 79589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Utf16 stream based on a literal UTF-8 string. 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass Utf8ToUtf16CharacterStream: public BufferedUtf16CharacterStream { 82589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public: 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Utf8ToUtf16CharacterStream(const byte* data, unsigned length); 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual ~Utf8ToUtf16CharacterStream(); 85589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 86589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch protected: 87589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned BufferSeekForward(unsigned delta); 88589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned FillBuffer(unsigned char_position, unsigned length); 89589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch void SetRawPosition(unsigned char_position); 90589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 91589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch const byte* raw_data_; 92589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch unsigned raw_data_length_; // Measured in bytes, not characters. 93589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch unsigned raw_data_pos_; 94589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // The character position of the character at raw_data[raw_data_pos_]. 95589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Not necessarily the same as pos_. 96589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch unsigned raw_character_position_; 97589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 98589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 99589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 100589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch// UTF16 buffer to read characters from an external string. 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass ExternalTwoByteStringUtf16CharacterStream: public Utf16CharacterStream { 102589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public: 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ExternalTwoByteStringUtf16CharacterStream(Handle<ExternalTwoByteString> data, 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int start_position, 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int end_position); 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual ~ExternalTwoByteStringUtf16CharacterStream(); 107589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 108589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void PushBack(uc32 character) { 109589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ASSERT(buffer_cursor_ > raw_data_); 110589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch buffer_cursor_--; 111589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch pos_--; 112589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 113589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 114589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch protected: 115589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual unsigned SlowSeekForward(unsigned delta) { 116589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Fast case always handles seeking. 117589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return 0; 118589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 119589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual bool ReadBlock() { 120589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Entire string is read at start. 121589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return false; 122589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 123589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Handle<ExternalTwoByteString> source_; 124589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch const uc16* raw_data_; // Pointer to the actual array of characters. 125589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 126589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 127589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} } // namespace v8::internal 128589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#endif // V8_SCANNER_CHARACTER_STREAMS_H_ 130