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