rippled
json_reader.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_JSON_JSON_READER_H_INCLUDED
21 #define RIPPLE_JSON_JSON_READER_H_INCLUDED
22 
23 # define CPPTL_JSON_READER_H_INCLUDED
24 
25 #include <ripple/json/json_forwards.h>
26 #include <ripple/json/json_value.h>
27 #include <boost/asio/buffer.hpp>
28 #include <stack>
29 
30 namespace Json
31 {
32 
36 class Reader
37 {
38 public:
39  using Char = char;
40  using Location = const Char*;
41 
45  Reader () = default;
46 
53  bool parse ( std::string const& document, Value& root);
54 
61  bool parse ( const char* beginDoc, const char* endDoc, Value& root);
62 
65  bool parse ( std::istream& is, Value& root);
66 
73  template<class BufferSequence>
74  bool
75  parse(Value& root, BufferSequence const& bs);
76 
83 
84  static constexpr unsigned nest_limit {25};
85 
86 private:
87  enum TokenType
88  {
104  };
105 
106  class Token
107  {
108  public:
109  explicit Token() = default;
110 
114  };
115 
116  class ErrorInfo
117  {
118  public:
119  explicit ErrorInfo() = default;
120 
124  };
125 
127 
128  bool expectToken ( TokenType type, Token& token, const char* message );
129  bool readToken ( Token& token );
130  void skipSpaces ();
131  bool match ( Location pattern,
132  int patternLength );
133  bool readComment ();
134  bool readCStyleComment ();
135  bool readCppStyleComment ();
136  bool readString ();
138  bool readValue(unsigned depth);
139  bool readObject(Token& token, unsigned depth);
140  bool readArray (Token& token, unsigned depth);
141  bool decodeNumber ( Token& token );
142  bool decodeString ( Token& token );
143  bool decodeString ( Token& token, std::string& decoded );
144  bool decodeDouble ( Token& token );
145  bool decodeUnicodeCodePoint ( Token& token,
146  Location& current,
147  Location end,
148  unsigned int& unicode );
149  bool decodeUnicodeEscapeSequence ( Token& token,
150  Location& current,
151  Location end,
152  unsigned int& unicode );
153  bool addError ( std::string const& message,
154  Token& token,
155  Location extra = 0 );
156  bool recoverFromError ( TokenType skipUntilToken );
157  bool addErrorAndRecover ( std::string const& message,
158  Token& token,
159  TokenType skipUntilToken );
160  void skipUntilSpace ();
161  Value& currentValue ();
162  Char getNextChar ();
163  void getLocationLineAndColumn ( Location location,
164  int& line,
165  int& column ) const;
166  std::string getLocationLineAndColumn ( Location location ) const;
167  void skipCommentTokens ( Token& token );
168 
178 };
179 
180 template<class BufferSequence>
181 bool
182 Reader::parse(Value& root, BufferSequence const& bs)
183 {
184  using namespace boost::asio;
185  std::string s;
186  s.reserve (buffer_size(bs));
187  for (auto const& b : bs)
188  s.append(buffer_cast<char const*>(b), buffer_size(b));
189  return parse(s, root);
190 }
191 
217 
218 } // namespace Json
219 
220 #endif // CPPTL_JSON_READER_H_INCLUDED
Json::Reader::tokenFalse
@ tokenFalse
Definition: json_reader.h:98
Json::Reader::addError
bool addError(std::string const &message, Token &token, Location extra=0)
Definition: json_reader.cpp:819
std::string
STL class.
Json::Reader::Token::start_
Location start_
Definition: json_reader.h:112
Json::Reader::skipCommentTokens
void skipCommentTokens(Token &token)
Definition: json_reader.cpp:187
Json::Reader::Token
Definition: json_reader.h:106
Json::Reader::current_
Location current_
Definition: json_reader.h:175
Json::Reader::decodeDouble
bool decodeDouble(Token &token)
Definition: json_reader.cpp:627
std::string::reserve
T reserve(T... args)
Json::Reader::nodes_
Nodes nodes_
Definition: json_reader.h:170
Json::Reader::decodeString
bool decodeString(Token &token)
Definition: json_reader.cpp:664
Json::Reader::readCStyleComment
bool readCStyleComment()
Definition: json_reader.cpp:347
stack
Json::Reader::Token::Token
Token()=default
Json::Reader::tokenComment
@ tokenComment
Definition: json_reader.h:102
Json::Reader::readObject
bool readObject(Token &token, unsigned depth)
Definition: json_reader.cpp:427
Json::Reader::ErrorInfo
Definition: json_reader.h:116
Json::Reader::ErrorInfo::ErrorInfo
ErrorInfo()=default
Json::Reader
Unserialize a JSON document into a Value.
Definition: json_reader.h:36
Json::Reader::expectToken
bool expectToken(TokenType type, Token &token, const char *message)
Definition: json_reader.cpp:198
Json::Reader::ErrorInfo::extra_
Location extra_
Definition: json_reader.h:123
Json::Reader::tokenTrue
@ tokenTrue
Definition: json_reader.h:97
Json::Reader::readValue
bool readValue(unsigned depth)
Definition: json_reader.cpp:136
Json::Reader::tokenMemberSeparator
@ tokenMemberSeparator
Definition: json_reader.h:101
Json::Reader::lastValueEnd_
Location lastValueEnd_
Definition: json_reader.h:176
Json::Reader::Token::type_
TokenType type_
Definition: json_reader.h:111
Json
JSON (JavaScript Object Notation).
Definition: json_reader.cpp:26
Json::Reader::ErrorInfo::token_
Token token_
Definition: json_reader.h:121
Json::Reader::document_
std::string document_
Definition: json_reader.h:172
Json::Reader::decodeNumber
bool decodeNumber(Token &token)
Definition: json_reader.cpp:555
Json::Reader::end_
Location end_
Definition: json_reader.h:174
Json::Reader::match
bool match(Location pattern, int patternLength)
Definition: json_reader.cpp:315
Json::Reader::tokenObjectBegin
@ tokenObjectBegin
Definition: json_reader.h:90
Json::Reader::tokenEndOfStream
@ tokenEndOfStream
Definition: json_reader.h:89
Json::Reader::decodeUnicodeCodePoint
bool decodeUnicodeCodePoint(Token &token, Location &current, Location end, unsigned int &unicode)
Definition: json_reader.cpp:755
boost::asio
Definition: Overlay.h:42
Json::Reader::getLocationLineAndColumn
void getLocationLineAndColumn(Location location, int &line, int &column) const
Definition: json_reader.cpp:880
Json::Reader::decodeUnicodeEscapeSequence
bool decodeUnicodeEscapeSequence(Token &token, Location &current, Location end, unsigned int &unicode)
Definition: json_reader.cpp:789
std::deque< ErrorInfo >
Json::Reader::currentValue
Value & currentValue()
Definition: json_reader.cpp:863
Json::Reader::begin_
Location begin_
Definition: json_reader.h:173
Json::Reader::TokenType
TokenType
Definition: json_reader.h:87
Json::Reader::tokenInteger
@ tokenInteger
Definition: json_reader.h:95
std::string::append
T append(T... args)
Json::Reader::skipSpaces
void skipSpaces()
Definition: json_reader.cpp:300
Json::Reader::tokenArrayBegin
@ tokenArrayBegin
Definition: json_reader.h:92
Json::Reader::readComment
bool readComment()
Definition: json_reader.cpp:333
Json::Reader::Token::end_
Location end_
Definition: json_reader.h:113
Json::Reader::Char
char Char
Definition: json_reader.h:39
Json::Reader::tokenObjectEnd
@ tokenObjectEnd
Definition: json_reader.h:91
Json::Reader::Location
const Char * Location
Definition: json_reader.h:40
Json::Reader::tokenDouble
@ tokenDouble
Definition: json_reader.h:96
Json::Reader::errors_
Errors errors_
Definition: json_reader.h:171
Json::Reader::tokenArrayEnd
@ tokenArrayEnd
Definition: json_reader.h:93
Json::operator>>
std::istream & operator>>(std::istream &sin, Value &root)
Read from 'sin' into 'root'.
Definition: json_reader.cpp:945
Json::Reader::Reader
Reader()=default
Constructs a Reader allowing all features for parsing.
Json::Reader::nest_limit
static constexpr unsigned nest_limit
Definition: json_reader.h:84
Json::Reader::readToken
bool readToken(Token &token)
Definition: json_reader.cpp:210
Json::Reader::parse
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
Definition: json_reader.cpp:76
Json::Reader::getFormatedErrorMessages
std::string getFormatedErrorMessages() const
Returns a user friendly string that list errors in the parsed document.
Definition: json_reader.cpp:925
Json::Reader::lastValue_
Value * lastValue_
Definition: json_reader.h:177
Json::Reader::recoverFromError
bool recoverFromError(TokenType skipUntilToken)
Definition: json_reader.cpp:833
Json::Reader::readArray
bool readArray(Token &token, unsigned depth)
Definition: json_reader.cpp:504
Json::Reader::readNumber
Reader::TokenType readNumber()
Definition: json_reader.cpp:376
Json::Reader::ErrorInfo::message_
std::string message_
Definition: json_reader.h:122
Json::Reader::readCppStyleComment
bool readCppStyleComment()
Definition: json_reader.cpp:362
Json::Reader::skipUntilSpace
void skipUntilSpace()
std::istream
STL class.
Json::Reader::getNextChar
Char getNextChar()
Definition: json_reader.cpp:870
Json::Reader::tokenNull
@ tokenNull
Definition: json_reader.h:99
Json::Reader::tokenString
@ tokenString
Definition: json_reader.h:94
Json::Reader::addErrorAndRecover
bool addErrorAndRecover(std::string const &message, Token &token, TokenType skipUntilToken)
Definition: json_reader.cpp:853
Json::Reader::tokenError
@ tokenError
Definition: json_reader.h:103
Json::Value
Represents a JSON value.
Definition: json_value.h:141
Json::Reader::readString
bool readString()
Definition: json_reader.cpp:408
Json::Reader::tokenArraySeparator
@ tokenArraySeparator
Definition: json_reader.h:100