15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_JSON_JSON_PARSER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_JSON_JSON_PARSER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chromium and Chromium OS check out gtest to different places, so this is
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unable to compile on both if gtest_prod.h is included here. Instead, include
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its only contents -- this will need to be updated if the macro ever changes.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FRIEND_TEST(test_case_name, test_name)\
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)friend class test_case_name##_##test_name##_Test
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FRIEND_TEST_ALL_PREFIXES(test_case_name, test_name) \
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST(test_case_name, test_name); \
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST(test_case_name, DISABLED_##test_name); \
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST(test_case_name, FLAKY_##test_name)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_CHROMEOS
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JSONParserTest;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The implementation behind the JSONReader interface. This class is not meant
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to be used directly; it encapsulates logic that need not be exposed publicly.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This parser guarantees O(n) time through the input string. It also optimizes
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::StringValue by using StringPiece where possible when returning Value
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// objects by using "hidden roots," discussed in the implementation.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Iteration happens on the byte level, with the functions CanConsume and
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NextChar. The conversion from byte to JSON token happens without advancing
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the parser in GetNextToken/ParseToken, that is tokenization operates on
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the current parser position without advancing.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Built on top of these are a family of Consume functions that iterate
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internally. Invariant: on entry of a Consume function, the parser is wound
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the first byte of a valid JSON token. On exit, it is on the last byte
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of a token, such that the next iteration of the parser will be at the byte
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// immediately following the token, which would likely be the first byte of the
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// next token.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT_PRIVATE JSONParser {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit JSONParser(int options);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~JSONParser();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses the input string according to the set options and returns the
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result as a Value owned by the caller.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* Parse(const StringPiece& input);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the error code.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JSONReader::JsonParseError error_code() const;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the human-friendly error message.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetErrorMessage() const;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Token {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_OBJECT_BEGIN,           // {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_OBJECT_END,             // }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_ARRAY_BEGIN,            // [
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_ARRAY_END,              // ]
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_STRING,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_NUMBER,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_BOOL_TRUE,              // true
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_BOOL_FALSE,             // false
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_NULL,                   // null
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_LIST_SEPARATOR,         // ,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_OBJECT_PAIR_SEPARATOR,  // :
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_END_OF_INPUT,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_INVALID_TOKEN,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A helper class used for parsing strings. One optimization performed is to
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create base::Value with a StringPiece to avoid unnecessary std::string
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // copies. This is not possible if the input string needs to be decoded from
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UTF-16 to UTF-8, or if an escape sequence causes characters to be skipped.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This class centralizes that logic.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class StringBuilder {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Empty constructor. Used for creating a builder with which to Swap().
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StringBuilder();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pos| is the beginning of an input string, excluding the |"|.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit StringBuilder(const char* pos);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~StringBuilder();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Swaps the contents of |other| with this.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Swap(StringBuilder* other);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Either increases the |length_| of the string or copies the character if
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the StringBuilder has been converted. |c| must be in the basic ASCII
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // plane; all other characters need to be in UTF-8 units, appended with
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // AppendString below.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Append(const char& c);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Appends a string to the std::string. Must be Convert()ed to use.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AppendString(const std::string& str);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Converts the builder from its default StringPiece to a full std::string,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // performing a copy. Once a builder is converted, it cannot be made a
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // StringPiece again.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Convert();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns whether the builder can be converted to a StringPiece.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool CanBeStringPiece() const;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns the StringPiece representation. Returns an empty piece if it
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // cannot be converted.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StringPiece AsStringPiece();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns the builder as a std::string.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& AsString();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The beginning of the input string.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* pos_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Number of bytes in |pos_| that make up the string being built.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t length_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The copied string representation. NULL until Convert() is called.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Strong. scoped_ptr<T> has too much of an overhead here.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* string_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quick check that the stream has capacity to consume |length| more bytes.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CanConsume(int length);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The basic way to consume a single character in the stream. Consumes one
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // byte of the input stream and returns a pointer to the rest of it.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* NextChar();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Performs the equivalent of NextChar N times.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NextNChars(int n);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Skips over whitespace and comments to find the next token in the stream.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This does not advance the parser for non-whitespace or comment chars.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token GetNextToken();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Consumes whitespace characters and comments until the next non-that is
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // encountered.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EatWhitespaceAndComments();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function that consumes a comment, assuming that the parser is
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // currently wound to a '/'.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool EatComment();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls GetNextToken() and then ParseToken(). Caller owns the result.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* ParseNextToken();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes a token that represents the start of a Value ("a structural token"
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in RFC terms) and consumes it, returning the result as an object the
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // caller owns.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* ParseToken(Token token);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assuming that the parser is currently wound to '{', this parses a JSON
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // object into a DictionaryValue.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* ConsumeDictionary();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assuming that the parser is wound to '[', this parses a JSON list into a
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ListValue.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* ConsumeList();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls through ConsumeStringRaw and wraps it in a value.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* ConsumeString();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assuming that the parser is wound to a double quote, this parses a string,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // decoding any escape sequences and converts UTF-16 to UTF-8. Returns true on
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success and Swap()s the result into |out|. Returns false on failure with
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error information set.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ConsumeStringRaw(StringBuilder* out);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for ConsumeStringRaw() that consumes the next four or 10
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bytes (parser is wound to the first character of a HEX sequence, with the
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // potential for consuming another \uXXXX for a surrogate). Returns true on
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success and places the UTF8 code units in |dest_string|, and false on
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // failure.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DecodeUTF16(std::string* dest_string);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for ConsumeStringRaw() that takes a single code point,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // decodes it into UTF-8 units, and appends it to the given builder. The
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // point must be valid.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DecodeUTF8(const int32& point, StringBuilder* dest);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assuming that the parser is wound to the start of a valid JSON number,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this parses and converts it to either an int or double value.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* ConsumeNumber();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper that reads characters that are ints. Returns true if a number was
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // read and false on error.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadInt(bool allow_leading_zeros);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Consumes the literal values of |true|, |false|, and |null|, assuming the
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parser is wound to the first character of any of those.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* ConsumeLiteral();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compares two string buffers of a given length.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool StringsAreEqual(const char* left, const char* right, size_t len);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the error information to |code| at the current column, based on
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |index_| and |index_last_line_|, with an optional positive/negative
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // adjustment by |column_adjust|.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportError(JSONReader::JsonParseError code, int column_adjust);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Given the line and column number of an error, formats one of the error
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message contants from json_reader.h for human display.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string FormatErrorMessage(int line, int column,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const std::string& description);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // base::JSONParserOptions that control parsing.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int options_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pointer to the start of the input data.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* start_pos_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pointer to the current position in the input data. Equivalent to
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |start_pos_ + index_|.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* pos_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pointer to the last character of the input data.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* end_pos_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The index in the input stream to which the parser is wound.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of times the parser has recursed (current stack depth).
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int stack_depth_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The line number that the parser is at currently.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int line_number_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last value of |index_| on the previous line.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index_last_line_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Error information.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JSONReader::JsonParseError error_code_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int error_line_;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int error_column_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class JSONParserTest;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(JSONParserTest, NextChar);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeDictionary);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeList);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeString);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeLiterals);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeNumbers);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ErrorMessages);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(JSONParser);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_JSON_JSON_PARSER_H_
272