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