This repository has been archived by the owner on Sep 4, 2019. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Tim Windsor
committed
Jan 30, 2013
1 parent
743a983
commit 5e83d1b
Showing
39 changed files
with
9,740 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,19 @@ | |||
#ifndef JSON_AUTOLINK_H_INCLUDED | |||
# define JSON_AUTOLINK_H_INCLUDED | |||
|
|||
# include "config.h" | |||
|
|||
# ifdef JSON_IN_CPPTL | |||
# include <cpptl/cpptl_autolink.h> | |||
# endif | |||
|
|||
# if !defined(JSON_NO_AUTOLINK) && !defined(JSON_DLL_BUILD) && !defined(JSON_IN_CPPTL) | |||
# define CPPTL_AUTOLINK_NAME "json" | |||
# undef CPPTL_AUTOLINK_DLL | |||
# ifdef JSON_DLL | |||
# define CPPTL_AUTOLINK_DLL | |||
# endif | |||
# include "autolink.h" | |||
# endif | |||
|
|||
#endif // JSON_AUTOLINK_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,43 @@ | |||
#ifndef JSON_CONFIG_H_INCLUDED | |||
# define JSON_CONFIG_H_INCLUDED | |||
|
|||
/// If defined, indicates that json library is embedded in CppTL library. | |||
//# define JSON_IN_CPPTL 1 | |||
|
|||
/// If defined, indicates that json may leverage CppTL library | |||
//# define JSON_USE_CPPTL 1 | |||
/// If defined, indicates that cpptl vector based map should be used instead of std::map | |||
/// as Value container. | |||
//# define JSON_USE_CPPTL_SMALLMAP 1 | |||
/// If defined, indicates that Json specific container should be used | |||
/// (hash table & simple deque container with customizable allocator). | |||
/// THIS FEATURE IS STILL EXPERIMENTAL! | |||
//# define JSON_VALUE_USE_INTERNAL_MAP 1 | |||
/// Force usage of standard new/malloc based allocator instead of memory pool based allocator. | |||
/// The memory pools allocator used optimization (initializing Value and ValueInternalLink | |||
/// as if it was a POD) that may cause some validation tool to report errors. | |||
/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined. | |||
//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1 | |||
|
|||
/// If defined, indicates that Json use exception to report invalid type manipulation | |||
/// instead of C assert macro. | |||
# define JSON_USE_EXCEPTION 1 | |||
|
|||
# ifdef JSON_IN_CPPTL | |||
# include <cpptl/config.h> | |||
# ifndef JSON_USE_CPPTL | |||
# define JSON_USE_CPPTL 1 | |||
# endif | |||
# endif | |||
|
|||
# ifdef JSON_IN_CPPTL | |||
# define JSON_API CPPTL_API | |||
# elif defined(JSON_DLL_BUILD) | |||
# define JSON_API __declspec(dllexport) | |||
# elif defined(JSON_DLL) | |||
# define JSON_API __declspec(dllimport) | |||
# else | |||
# define JSON_API | |||
# endif | |||
|
|||
#endif // JSON_CONFIG_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,42 @@ | |||
#ifndef CPPTL_JSON_FEATURES_H_INCLUDED | |||
# define CPPTL_JSON_FEATURES_H_INCLUDED | |||
|
|||
# include "forwards.h" | |||
|
|||
namespace Json { | |||
|
|||
/** \brief Configuration passed to reader and writer. | |||
* This configuration object can be used to force the Reader or Writer | |||
* to behave in a standard conforming way. | |||
*/ | |||
class JSON_API Features | |||
{ | |||
public: | |||
/** \brief A configuration that allows all features and assumes all strings are UTF-8. | |||
* - C & C++ comments are allowed | |||
* - Root object can be any JSON value | |||
* - Assumes Value strings are encoded in UTF-8 | |||
*/ | |||
static Features all(); | |||
|
|||
/** \brief A configuration that is strictly compatible with the JSON specification. | |||
* - Comments are forbidden. | |||
* - Root object must be either an array or an object value. | |||
* - Assumes Value strings are encoded in UTF-8 | |||
*/ | |||
static Features strictMode(); | |||
|
|||
/** \brief Initialize the configuration like JsonConfig::allFeatures; | |||
*/ | |||
Features(); | |||
|
|||
/// \c true if comments are allowed. Default: \c true. | |||
bool allowComments_; | |||
|
|||
/// \c true if root must be either an array or an object value. Default: \c false. | |||
bool strictRoot_; | |||
}; | |||
|
|||
} // namespace Json | |||
|
|||
#endif // CPPTL_JSON_FEATURES_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,39 @@ | |||
#ifndef JSON_FORWARDS_H_INCLUDED | |||
# define JSON_FORWARDS_H_INCLUDED | |||
|
|||
# include "config.h" | |||
|
|||
namespace Json { | |||
|
|||
// writer.h | |||
class FastWriter; | |||
class StyledWriter; | |||
|
|||
// reader.h | |||
class Reader; | |||
|
|||
// features.h | |||
class Features; | |||
|
|||
// value.h | |||
typedef int Int; | |||
typedef unsigned int UInt; | |||
class StaticString; | |||
class Path; | |||
class PathArgument; | |||
class Value; | |||
class ValueIteratorBase; | |||
class ValueIterator; | |||
class ValueConstIterator; | |||
#ifdef JSON_VALUE_USE_INTERNAL_MAP | |||
class ValueAllocator; | |||
class ValueMapAllocator; | |||
class ValueInternalLink; | |||
class ValueInternalArray; | |||
class ValueInternalMap; | |||
#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP | |||
|
|||
} // namespace Json | |||
|
|||
|
|||
#endif // JSON_FORWARDS_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,10 @@ | |||
#ifndef JSON_JSON_H_INCLUDED | |||
# define JSON_JSON_H_INCLUDED | |||
|
|||
# include "autolink.h" | |||
# include "value.h" | |||
# include "reader.h" | |||
# include "writer.h" | |||
# include "features.h" | |||
|
|||
#endif // JSON_JSON_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,196 @@ | |||
#ifndef CPPTL_JSON_READER_H_INCLUDED | |||
# define CPPTL_JSON_READER_H_INCLUDED | |||
|
|||
# include "features.h" | |||
# include "value.h" | |||
# include <deque> | |||
# include <stack> | |||
# include <string> | |||
# include <iostream> | |||
|
|||
namespace Json { | |||
|
|||
/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value. | |||
* | |||
*/ | |||
class JSON_API Reader | |||
{ | |||
public: | |||
typedef char Char; | |||
typedef const Char *Location; | |||
|
|||
/** \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 <a HREF="http://www.json.org">JSON</a> document. | |||
* \param document UTF-8 encoded string containing the document to read. | |||
* \param root [out] 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 <a HREF="http://www.json.org">JSON</a> document. | |||
* \param document UTF-8 encoded string containing the document to read. | |||
* \param root [out] 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( std::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. | |||
*/ | |||
std::string getFormatedErrorMessages() 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_; | |||
std::string message_; | |||
Location extra_; | |||
}; | |||
|
|||
typedef std::deque<ErrorInfo> Errors; | |||
|
|||
bool expectToken( TokenType type, Token &token, const char *message ); | |||
bool readToken( Token &token ); | |||
void skipSpaces(); | |||
bool match( Location 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 decodeString( Token &token ); | |||
bool decodeString( Token &token, std::string &decoded ); | |||
bool decodeDouble( Token &token ); | |||
bool decodeUnicodeCodePoint( Token &token, | |||
Location ¤t, | |||
Location end, | |||
unsigned int &unicode ); | |||
bool decodeUnicodeEscapeSequence( Token &token, | |||
Location ¤t, | |||
Location end, | |||
unsigned int &unicode ); | |||
bool addError( const std::string &message, | |||
Token &token, | |||
Location extra = 0 ); | |||
bool recoverFromError( TokenType skipUntilToken ); | |||
bool addErrorAndRecover( const std::string &message, | |||
Token &token, | |||
TokenType skipUntilToken ); | |||
void skipUntilSpace(); | |||
Value ¤tValue(); | |||
Char getNextChar(); | |||
void getLocationLineAndColumn( Location location, | |||
int &line, | |||
int &column ) const; | |||
std::string getLocationLineAndColumn( Location location ) const; | |||
void addComment( Location begin, | |||
Location end, | |||
CommentPlacement placement ); | |||
void skipCommentTokens( Token &token ); | |||
|
|||
typedef std::stack<Value *> Nodes; | |||
Nodes nodes_; | |||
Errors errors_; | |||
std::string document_; | |||
Location begin_; | |||
Location end_; | |||
Location current_; | |||
Location lastValueEnd_; | |||
Value *lastValue_; | |||
std::string commentsBefore_; | |||
Features features_; | |||
bool collectComments_; | |||
}; | |||
|
|||
/** \brief Read from 'sin' into 'root'. | |||
Always keep comments from the input JSON. | |||
This can be used to read a file into a particular sub-object. | |||
For example: | |||
\code | |||
Json::Value root; | |||
cin >> root["dir"]["file"]; | |||
cout << root; | |||
\endcode | |||
Result: | |||
\verbatim | |||
{ | |||
"dir": { | |||
"file": { | |||
// The input stream JSON would be nested here. | |||
} | |||
} | |||
} | |||
\endverbatim | |||
\throw std::exception on parse error. | |||
\see Json::operator<<() | |||
*/ | |||
std::istream& operator>>( std::istream&, Value& ); | |||
|
|||
} // namespace Json | |||
|
|||
#endif // CPPTL_JSON_READER_H_INCLUDED |
Oops, something went wrong.