1a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met: 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions of source code must retain the above copyright 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer. 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions in binary form must reproduce the above 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// copyright notice, this list of conditions and the following 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// disclaimer in the documentation and/or other materials provided 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with the distribution. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Neither the name of Google Inc. nor the names of its 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// contributors may be used to endorse or promote products derived 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from this software without specific prior written permission. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_DATEPARSER_H_ 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_DATEPARSER_H_ 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "allocation.h" 324a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "char-predicates-inl.h" 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass DateParser : public AllStatic { 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Parse the string as a date. If parsing succeeds, return true after 4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // filling out the output array as follows (all integers are Smis): 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [0]: year 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [1]: month (0 = Jan, 1 = Feb, ...) 4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [2]: day 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [3]: hour 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [4]: minute 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // [5]: second 474111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // [6]: millisecond 484111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org // [7]: UTC offset in seconds, or null value if no timezone specified 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If parsing fails, return false (content of output array is not defined). 50bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org template <typename Char> 51a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org static bool Parse(Vector<Char> str, FixedArray* output, UnicodeCache* cache); 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org enum { 544111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND, UTC_OFFSET, OUTPUT_SIZE 55bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org }; 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Range testing 59bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org static inline bool Between(int x, int lo, int hi) { 60bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org return static_cast<unsigned>(x - lo) <= static_cast<unsigned>(hi - lo); 61bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } 624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Indicates a missing value. 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kNone = kMaxInt; 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 664f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // Maximal number of digits used to build the value of a numeral. 674f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // Remaining digits are ignored. 684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static const int kMaxSignificantDigits = 9; 694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // InputReader provides basic string parsing and character classification. 71bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org template <typename Char> 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen class InputReader BASE_EMBEDDED { 7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 74a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org InputReader(UnicodeCache* unicode_cache, Vector<Char> s) 75bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org : index_(0), 76bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer_(s), 77a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org unicode_cache_(unicode_cache) { 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Next(); 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 814f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int position() { return index_; } 824f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Advance to the next character of the string. 844f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org void Next() { 854f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org ch_ = (index_ < buffer_.length()) ? buffer_[index_] : 0; 864f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org index_++; 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 894f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // Read a string of digits as an unsigned number. Cap value at 904f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // kMaxSignificantDigits, but skip remaining digits if the numeral 914f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // is longer. 924f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int ReadUnsignedNumeral() { 93beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org int n = 0; 944f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int i = 0; 954f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org while (IsAsciiDigit()) { 964f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org if (i < kMaxSignificantDigits) n = n * 10 + ch_ - '0'; 974f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org i++; 984f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org Next(); 99beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org } 100beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org return n; 101beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org } 102beb2571dca14508fbbbb47a2f606327d5968ee92ager@chromium.org 10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Read a word (sequence of chars. >= 'A'), fill the given buffer with a 10443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // lower-case prefix, and pad any remainder of the buffer with zeroes. 10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return word length. 10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int ReadWord(uint32_t* prefix, int prefix_size) { 10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int len; 10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (len = 0; IsAsciiAlphaOrAbove(); Next(), len++) { 1093cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org if (len < prefix_size) prefix[len] = AsciiAlphaToLower(ch_); 11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = len; i < prefix_size; i++) prefix[i] = 0; 11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return len; 11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The skip methods return whether they actually skipped something. 1164a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com bool Skip(uint32_t c) { 1174a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com if (ch_ == c) { 1184a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Next(); 1194a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com return true; 1204a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 1214a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com return false; 1224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool SkipWhiteSpace() { 125a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (unicode_cache_->IsWhiteSpace(ch_)) { 1264a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Next(); 1274a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com return true; 1284a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 1294a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com return false; 13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool SkipParentheses() { 13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (ch_ != '(') return false; 13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int balance = 0; 13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen do { 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (ch_ == ')') --balance; 13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else if (ch_ == '(') ++balance; 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Next(); 13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } while (balance > 0 && ch_); 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Character testing/classification. Non-ASCII digits are not supported. 14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Is(uint32_t c) const { return ch_ == c; } 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsEnd() const { return ch_ == 0; } 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsAsciiDigit() const { return IsDecimalDigit(ch_); } 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsAsciiAlphaOrAbove() const { return ch_ >= 'A'; } 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsAsciiSign() const { return ch_ == '+' || ch_ == '-'; } 14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return 1 for '+' and -1 for '-'. 15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int GetAsciiSignValue() const { return 44 - static_cast<int>(ch_); } 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 154bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org int index_; 155bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org Vector<Char> buffer_; 15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uint32_t ch_; 157a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org UnicodeCache* unicode_cache_; 15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1604f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org enum KeywordType { 1614f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org INVALID, MONTH_NAME, TIME_ZONE_NAME, TIME_SEPARATOR, AM_PM 1624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org }; 1634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 1644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org struct DateToken { 1654f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org public: 1664f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsInvalid() { return tag_ == kInvalidTokenTag; } 1674f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsUnknown() { return tag_ == kUnknownTokenTag; } 1684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsNumber() { return tag_ == kNumberTag; } 1694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsSymbol() { return tag_ == kSymbolTag; } 1704f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsWhiteSpace() { return tag_ == kWhiteSpaceTag; } 1714f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsEndOfInput() { return tag_ == kEndOfInputTag; } 1724f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsKeyword() { return tag_ >= kKeywordTagStart; } 1734f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 1744f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int length() { return length_; } 1754f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 1764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int number() { 1774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org ASSERT(IsNumber()); 1784f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return value_; 1794f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 1804f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org KeywordType keyword_type() { 1814f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org ASSERT(IsKeyword()); 1824f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return static_cast<KeywordType>(tag_); 1834f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 1844f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int keyword_value() { 1854f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org ASSERT(IsKeyword()); 1864f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return value_; 1874f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 1884f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org char symbol() { 1894f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org ASSERT(IsSymbol()); 1904f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return static_cast<char>(value_); 1914f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 1924f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsSymbol(char symbol) { 1934f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return IsSymbol() && this->symbol() == symbol; 1944f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 1954f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsKeywordType(KeywordType tag) { 1964f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return tag_ == tag; 1974f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 1984f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsFixedLengthNumber(int length) { 1994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return IsNumber() && length_ == length; 2004f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2014f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsAsciiSign() { 2024f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return tag_ == kSymbolTag && (value_ == '-' || value_ == '+'); 2034f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2044f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int ascii_sign() { 2054f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org ASSERT(IsAsciiSign()); 2064f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return 44 - value_; 2074f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2084f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsKeywordZ() { 2094f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return IsKeywordType(TIME_ZONE_NAME) && length_ == 1 && value_ == 0; 2104f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2114f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsUnknown(int character) { 2124f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return IsUnknown() && value_ == character; 2134f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2144f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // Factory functions. 2154f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateToken Keyword(KeywordType tag, int value, int length) { 2164f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return DateToken(tag, length, value); 2174f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2184f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateToken Number(int value, int length) { 2194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return DateToken(kNumberTag, length, value); 2204f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2214f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateToken Symbol(char symbol) { 2224f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return DateToken(kSymbolTag, 1, symbol); 2234f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2244f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateToken EndOfInput() { 2254f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return DateToken(kEndOfInputTag, 0, -1); 2264f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateToken WhiteSpace(int length) { 2284f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return DateToken(kWhiteSpaceTag, length, -1); 2294f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateToken Unknown() { 2314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return DateToken(kUnknownTokenTag, 1, -1); 2324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2334f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateToken Invalid() { 2344f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return DateToken(kInvalidTokenTag, 0, -1); 2354f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 23683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 2374f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org private: 2384f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org enum TagType { 2394f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org kInvalidTokenTag = -6, 2404f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org kUnknownTokenTag = -5, 2414f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org kWhiteSpaceTag = -4, 2424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org kNumberTag = -3, 2434f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org kSymbolTag = -2, 2444f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org kEndOfInputTag = -1, 2454f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org kKeywordTagStart = 0 2464f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org }; 2474f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DateToken(int tag, int length, int value) 2484f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org : tag_(tag), 2494f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org length_(length), 2504f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org value_(value) { } 2514f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 2524f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int tag_; 2534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int length_; // Number of characters. 2544f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org int value_; 2554f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org }; 2564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 2574f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org template <typename Char> 2584f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org class DateStringTokenizer { 2594f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org public: 2604f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org explicit DateStringTokenizer(InputReader<Char>* in) 2614f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org : in_(in), next_(Scan()) { } 2624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DateToken Next() { 2634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DateToken result = next_; 2644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org next_ = Scan(); 2654f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return result; 2664f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2674f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 2684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DateToken Peek() { 2694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return next_; 2704f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2714f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool SkipSymbol(char symbol) { 2724f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org if (next_.IsSymbol(symbol)) { 2734f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org next_ = Scan(); 2744f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return true; 2754f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 2764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return false; 2774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 27883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 2794f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org private: 2804f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DateToken Scan(); 2814f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 2824f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org InputReader<Char>* in_; 2834f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DateToken next_; 2844f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org }; 2854f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 2864f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static int ReadMilliseconds(DateToken number); 28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // KeywordTable maps names of months, time zones, am/pm to numbers. 28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen class KeywordTable : public AllStatic { 29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Look up a word in the keyword table and return an index. 29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 'pre' contains a prefix of the word, zero-padded to size kPrefixLength 29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // and 'len' is the word length. 29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int Lookup(const uint32_t* pre, int len); 29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the type of the keyword at index i. 29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static KeywordType GetType(int i) { 29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<KeywordType>(array[i][kTypeOffset]); 29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the value of the keyword at index i. 30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static int GetValue(int i) { return array[i][kValueOffset]; } 30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kPrefixLength = 3; 30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kTypeOffset = kPrefixLength; 30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kValueOffset = kTypeOffset + 1; 30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kEntrySize = kValueOffset + 1; 30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int8_t array[][kEntrySize]; 30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen class TimeZoneComposer BASE_EMBEDDED { 31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TimeZoneComposer() : sign_(kNone), hour_(kNone), minute_(kNone) {} 31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Set(int offset_in_hours) { 31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen sign_ = offset_in_hours < 0 ? -1 : 1; 31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen hour_ = offset_in_hours * sign_; 31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen minute_ = 0; 31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetSign(int sign) { sign_ = sign < 0 ? -1 : 1; } 31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetAbsoluteHour(int hour) { hour_ = hour; } 31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetAbsoluteMinute(int minute) { minute_ = minute; } 32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsExpecting(int n) const { 32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return hour_ != kNone && minute_ == kNone && TimeComposer::IsMinute(n); 32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsUTC() const { return hour_ == 0 && minute_ == 0; } 32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Write(FixedArray* output); 3254f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool IsEmpty() { return hour_ == kNone; } 32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int sign_; 32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int hour_; 32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int minute_; 33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen class TimeComposer BASE_EMBEDDED { 33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TimeComposer() : index_(0), hour_offset_(kNone) {} 33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsEmpty() const { return index_ == 0; } 33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsExpecting(int n) const { 3374111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org return (index_ == 1 && IsMinute(n)) || 3384111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org (index_ == 2 && IsSecond(n)) || 3394111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org (index_ == 3 && IsMillisecond(n)); 34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Add(int n) { 34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return index_ < kSize ? (comp_[index_++] = n, true) : false; 34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool AddFinal(int n) { 34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!Add(n)) return false; 34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (index_ < kSize) comp_[index_++] = 0; 34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetHourOffset(int n) { hour_offset_ = n; } 35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Write(FixedArray* output); 35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool IsMinute(int x) { return Between(x, 0, 59); } 35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool IsHour(int x) { return Between(x, 0, 23); } 35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool IsSecond(int x) { return Between(x, 0, 59); } 35583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 3564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org private: 3574f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static bool IsHour12(int x) { return Between(x, 0, 12); } 3584111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org static bool IsMillisecond(int x) { return Between(x, 0, 999); } 35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3604111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org static const int kSize = 4; 36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int comp_[kSize]; 36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int index_; 36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int hour_offset_; 36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen class DayComposer BASE_EMBEDDED { 36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 3684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DayComposer() : index_(0), named_month_(kNone), is_iso_date_(false) {} 36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsEmpty() const { return index_ == 0; } 37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Add(int n) { 3714f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org if (index_ < kSize) { 3724f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org comp_[index_] = n; 3734f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org index_++; 3744f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return true; 3754f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 3764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return false; 37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void SetNamedMonth(int n) { named_month_ = n; } 37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool Write(FixedArray* output); 3804f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org void set_iso_date() { is_iso_date_ = true; } 38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool IsMonth(int x) { return Between(x, 1, 12); } 38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool IsDay(int x) { return Between(x, 1, 31); } 38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3844f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org private: 38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int kSize = 3; 38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int comp_[kSize]; 38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int index_; 38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int named_month_; 3894f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // If set, ensures that data is always parsed in year-month-date order. 3904f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org bool is_iso_date_; 39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 3924f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 3934f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // Tries to parse an ES5 Date Time String. Returns the next token 3944f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // to continue with in the legacy date string parser. If parsing is 3954f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // complete, returns DateToken::EndOfInput(). If terminally unsuccessful, 3964f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // returns DateToken::Invalid(). Otherwise parsing continues in the 3974f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org // legacy parser. 3984f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org template <typename Char> 3994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org static DateParser::DateToken ParseES5DateTime( 4004f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DateStringTokenizer<Char>* scanner, 4014f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org DayComposer* day, 4024f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org TimeComposer* time, 4034f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org TimeZoneComposer* tz); 40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_DATEPARSER_H_ 410