diff --git a/include/json/reader.h b/include/json/reader.h index 8b388b0..805200a 100644 --- a/include/json/reader.h +++ b/include/json/reader.h @@ -37,209 +37,214 @@ namespace Json { * \deprecated Use CharReader and CharReaderBuilder. */ class [[deprecated( - "deprecated Use CharReader and CharReaderBuilder.")]] JSON_API Reader { -public: - typedef char Char; - typedef const Char* Location; - - /** \brief An error tagged with where in the JSON text it was encountered. - * - * The offsets give the [start, limit) range of bytes within the text. Note - * that this is bytes, not codepoints. - */ - struct StructuredError { - ptrdiff_t offset_start; - ptrdiff_t offset_limit; - String message; - }; - - /** \brief Constructs a Reader allowing all features for parsing. - */ - Reader(); - - /** \brief Constructs a Reader allowing the specified feature set for parsing. - */ - Reader(const Features& features); - - /** \brief Read a Value from a JSON - * document. - * - * \param document UTF-8 encoded string containing the document - * to read. - * \param[out] root Contains the root value of the document if it - * was successfully parsed. - * \param collectComments \c true to collect comment and allow writing - * them back during serialization, \c false to - * discard comments. This parameter is ignored - * if Features::allowComments_ is \c false. - * \return \c true if the document was successfully parsed, \c false if an - * error occurred. - */ - bool parse(const std::string& document, Value& root, - bool collectComments = true); - - /** \brief Read a Value from a JSON - * document. - * - * \param beginDoc Pointer on the beginning of the UTF-8 encoded - * string of the document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string - * of the document to read. Must be >= beginDoc. - * \param[out] root Contains the root value of the document if it - * was successfully parsed. - * \param collectComments \c true to collect comment and allow writing - * them back during serialization, \c false to - * discard comments. This parameter is ignored - * if Features::allowComments_ is \c false. - * \return \c true if the document was successfully parsed, \c false if an - * error occurred. - */ - bool parse(const char* beginDoc, const char* endDoc, Value& root, - bool collectComments = true); - - /// \brief Parse from input stream. - /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse(IStream & is, Value & root, bool collectComments = true); - - /** \brief Returns a user friendly string that list errors in the parsed - * document. - * - * \return Formatted error message with the list of errors with their - * location in the parsed document. An empty string is returned if no error - * occurred during parsing. - * \deprecated Use getFormattedErrorMessages() instead (typo fix). - */ - [[deprecated("Use getFormattedErrorMessages() instead.")]] String - getFormatedErrorMessages() const; - - /** \brief Returns a user friendly string that list errors in the parsed - * document. - * - * \return Formatted error message with the list of errors with their - * location in the parsed document. An empty string is returned if no error - * occurred during parsing. - */ - String getFormattedErrorMessages() const; - - /** \brief Returns a vector of structured errors encountered while parsing. - * - * \return A (possibly empty) vector of StructuredError objects. Currently - * only one error can be returned, but the caller should tolerate multiple - * errors. This can occur if the parser recovers from a non-fatal parse - * error and then encounters additional errors. - */ - std::vector getStructuredErrors() const; - - /** \brief Add a semantic error message. - * - * \param value JSON Value location associated with the error - * \param message The error message. - * \return \c true if the error was successfully added, \c false if the Value - * offset exceeds the document size. - */ - bool pushError(const Value& value, const String& message); - - /** \brief Add a semantic error message with extra context. - * - * \param value JSON Value location associated with the error - * \param message The error message. - * \param extra Additional JSON Value location to contextualize the error - * \return \c true if the error was successfully added, \c false if either - * Value offset exceeds the document size. - */ - bool pushError(const Value& value, const String& message, const Value& extra); - - /** \brief Return whether there are any errors. - * - * \return \c true if there are no errors to report \c false if errors have - * occurred. - */ - bool good() const; - -private: - enum TokenType { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo { - public: - Token token_; - String message_; - Location extra_; - }; - - typedef std::deque Errors; - - bool readToken(Token & token); - void skipSpaces(); - bool match(const Char* pattern, int patternLength); - bool readComment(); - bool readCStyleComment(); - bool readCppStyleComment(); - bool readString(); - void readNumber(); - bool readValue(); - bool readObject(Token & token); - bool readArray(Token & token); - bool decodeNumber(Token & token); - bool decodeNumber(Token & token, Value & decoded); - bool decodeString(Token & token); - bool decodeString(Token & token, String & decoded); - bool decodeDouble(Token & token); - bool decodeDouble(Token & token, Value & decoded); - bool decodeUnicodeCodePoint(Token & token, Location & current, Location end, - unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token & token, Location & current, - Location end, unsigned int& unicode); - bool addError(const String& message, Token& token, Location extra = nullptr); - bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const String& message, Token& token, - TokenType skipUntilToken); - void skipUntilSpace(); - Value& currentValue(); - Char getNextChar(); - void getLocationLineAndColumn(Location location, int& line, int& column) - const; - String getLocationLineAndColumn(Location location) const; - void addComment(Location begin, Location end, CommentPlacement placement); - void skipCommentTokens(Token & token); - - static bool containsNewLine(Location begin, Location end); - static String normalizeEOL(Location begin, Location end); - - typedef std::stack Nodes; - Nodes nodes_; - Errors errors_; - String document_; - Location begin_{}; - Location end_{}; - Location current_{}; - Location lastValueEnd_{}; - Value* lastValue_{}; - String commentsBefore_; - Features features_; - bool collectComments_{}; -}; // Reader + "deprecated Use CharReader and CharReaderBuilder.")]] JSON_API + Reader { + public: + typedef char Char; + typedef const Char* Location; + + /** \brief An error tagged with where in the JSON text it was + * encountered. + * + * The offsets give the [start, limit) range of bytes within the + * text. Note that this is bytes, not codepoints. + */ + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + String message; + }; + + /** \brief Constructs a Reader allowing all features for parsing. + */ + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set + * for parsing. + */ + Reader(const Features& features); + + /** \brief Read a Value from a JSON document. + * + * \param document UTF-8 encoded string containing the + * document to read. \param[out] root Contains the root + * value of the document if it was successfully parsed. \param + * collectComments \c true to collect comment and allow writing them + * back during serialization, \c false to discard comments. This + * parameter is ignored if Features::allowComments_ is \c false. + * \return \c true if the document was successfully parsed, \c false + * if an error occurred. + */ + bool parse(const std::string& document, Value& root, + bool collectComments = true); + + /** \brief Read a Value from a JSON document. + * + * \param beginDoc Pointer on the beginning of the UTF-8 + * encoded string of the document to read. \param endDoc + * Pointer on the end of the UTF-8 encoded string of the document to + * read. Must be >= beginDoc. \param[out] root Contains + * the root value of the document if it was successfully parsed. + * \param collectComments \c true to collect comment and allow + * writing them back during serialization, \c false to discard + * comments. This parameter is ignored if Features::allowComments_ + * is \c false. \return \c true if the document was successfully + * parsed, \c false if an error occurred. + */ + bool parse(const char* beginDoc, const char* endDoc, Value& root, + bool collectComments = true); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse(IStream & is, Value & root, bool collectComments = true); + + /** \brief Returns a user friendly string that list errors in the + * parsed document. + * + * \return Formatted error message with the list of errors with + * their location in the parsed document. An empty string is + * returned if no error occurred during parsing. \deprecated Use + * getFormattedErrorMessages() instead (typo fix). + */ + [[deprecated("Use getFormattedErrorMessages() instead.")]] String + getFormatedErrorMessages() const; + + /** \brief Returns a user friendly string that list errors in the + * parsed document. + * + * \return Formatted error message with the list of errors with + * their location in the parsed document. An empty string is + * returned if no error occurred during parsing. + */ + String getFormattedErrorMessages() const; + + /** \brief Returns a vector of structured errors encountered while + * parsing. + * + * \return A (possibly empty) vector of StructuredError objects. + * Currently only one error can be returned, but the caller should + * tolerate multiple errors. This can occur if the parser recovers + * from a non-fatal parse error and then encounters additional + * errors. + */ + std::vector getStructuredErrors() const; + + /** \brief Add a semantic error message. + * + * \param value JSON Value location associated with the error + * \param message The error message. + * \return \c true if the error was successfully added, \c false if + * the Value offset exceeds the document size. + */ + bool pushError(const Value& value, const String& message); + + /** \brief Add a semantic error message with extra context. + * + * \param value JSON Value location associated with the error + * \param message The error message. + * \param extra Additional JSON Value location to contextualize + * the error \return \c true if the error was successfully added, \c + * false if either Value offset exceeds the document size. + */ + bool pushError(const Value& value, const String& message, + const Value& extra); + + /** \brief Return whether there are any errors. + * + * \return \c true if there are no errors to report \c false if + * errors have occurred. + */ + bool good() const; + + private: + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + String message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token & token); + void skipSpaces(); + bool match(const Char* pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject(Token & token); + bool readArray(Token & token); + bool decodeNumber(Token & token); + bool decodeNumber(Token & token, Value & decoded); + bool decodeString(Token & token); + bool decodeString(Token & token, String & decoded); + bool decodeDouble(Token & token); + bool decodeDouble(Token & token, Value & decoded); + bool decodeUnicodeCodePoint(Token & token, Location & current, + Location end, unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token & token, Location & current, + Location end, + unsigned int& unicode); + bool addError(const String& message, Token& token, + Location extra = nullptr); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const String& message, Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void getLocationLineAndColumn(Location location, int& line, + int& column) const; + String getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, + CommentPlacement placement); + void skipCommentTokens(Token & token); + + static bool containsNewLine(Location begin, Location end); + static String normalizeEOL(Location begin, Location end); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + String document_; + Location begin_{}; + Location end_{}; + Location current_{}; + Location lastValueEnd_{}; + Value* lastValue_{}; + String commentsBefore_; + Features features_; + bool collectComments_{}; + }; // Reader /** Interface for reading JSON from a char array. */ diff --git a/include/json/writer.h b/include/json/writer.h index 9799a3b..63d31a0 100644 --- a/include/json/writer.h +++ b/include/json/writer.h @@ -165,7 +165,7 @@ public: #pragma warning(push) #pragma warning(disable : 4996) // Deriving from deprecated class #endif -class [[deprecated("Use StreamWriterBuilder instead")]] JSON_API FastWriter +class[[deprecated("Use StreamWriterBuilder instead")]] JSON_API FastWriter : public Writer { public: FastWriter(); @@ -225,7 +225,7 @@ private: #pragma warning(push) #pragma warning(disable : 4996) // Deriving from deprecated class #endif -class [[deprecated("Use StreamWriterBuilder instead")]] JSON_API StyledWriter +class[[deprecated("Use StreamWriterBuilder instead")]] JSON_API StyledWriter : public Writer { public: StyledWriter(); @@ -295,7 +295,7 @@ private: #pragma warning(disable : 4996) // Deriving from deprecated class #endif class [[deprecated( - "Use StreamWriterBuilder instead")]] JSON_API StyledStreamWriter { + "Use StreamWriterBuilder instead")]] JSON_API StyledStreamWriter { public: /** * \param indentation Each level will be indented by this amount extra. diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 4f71e77..10767eb 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -212,14 +212,17 @@ Exception::Exception(String msg) : msg_(std::move(msg)) {} Exception::~Exception() JSONCPP_NOEXCEPT {} char const* Exception::what() const JSONCPP_NOEXCEPT { return msg_.c_str(); } RuntimeError::RuntimeError(String const& msg) : Exception(msg) {} -LogicError::LogicError(String const& msg) : Exception(msg) {} -[[noreturn]] void throwRuntimeError(String const& msg) { +LogicError::LogicError(String const& msg) + : Exception(msg){}[[noreturn]] void throwRuntimeError(String const& msg) { throw RuntimeError(msg); } [[noreturn]] void throwLogicError(String const& msg) { throw LogicError(msg); } #else // !JSON_USE_EXCEPTION -[[noreturn]] void throwRuntimeError(String const& msg) { abort(); } -[[noreturn]] void throwLogicError(String const& msg) { abort(); } +[[noreturn]] void throwRuntimeError(String const& msg) { + abort(); +}[[noreturn]] void throwLogicError(String const& msg) { + abort(); +} #endif // ////////////////////////////////////////////////////////////////// @@ -233,7 +236,9 @@ LogicError::LogicError(String const& msg) : Exception(msg) {} // Notes: policy_ indicates if the string was allocated when // a string is stored. -Value::CZString::CZString(ArrayIndex index) : cstr_(nullptr), index_(index) {} +Value::CZString::CZString(ArrayIndex index) + : cstr_(nullptr), index_(index) { +} Value::CZString::CZString(char const* str, unsigned length,