@ -1,13 +1,16 @@
/*
Copyright ( c ) 2009 - 2017 Dave Gamble and cJSON contributors
Copyright ( c ) 2009 Dave Gamble
Permission is hereby granted , free of charge , to any person obtaining a copy
of this software and associated documentation files ( the " Software " ) , to deal
in the Software without restriction , including without limitation the rights
to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
copies of the Software , and to permit persons to whom the Software is
furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
@ -39,24 +42,15 @@ extern "C"
{
# endif
/* project version */
# define CJSON_VERSION_MAJOR 1
# define CJSON_VERSION_MINOR 7
# define CJSON_VERSION_PATCH 1
# include <stddef.h>
/* cJSON Types: */
# define cJSON_Invalid (0)
# define cJSON_False (1 << 0)
# define cJSON_True (1 << 1)
# define cJSON_NULL (1 << 2)
# define cJSON_Number (1 << 3)
# define cJSON_String (1 << 4)
# define cJSON_Array (1 << 5)
# define cJSON_Object (1 << 6)
# define cJSON_Raw (1 << 7) /* raw json */
# define cJSON_False 0
# define cJSON_True 1
# define cJSON_NULL 2
# define cJSON_Number 3
# define cJSON_String 4
# define cJSON_Array 5
# define cJSON_Object 6
# define is_cJSON_Null(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_NULL)
# define is_cJSON_Array(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_Array)
# define is_cJSON_String(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_String)
@ -66,232 +60,108 @@ extern "C"
# define is_cJSON_False(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_False)
# define cJSON_IsReference 256
# define cJSON_StringIsConst 512
/* The cJSON structure: */
typedef struct cJSON
{
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON * next ;
struct cJSON * prev ;
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
struct cJSON * child ;
typedef struct cJSON {
struct cJSON * next , * prev ; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON * child ; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
/* The type of the item, as above. */
int type ;
int32_t type ; /* The type of the item, as above. */
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
char * valuestring ;
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
int valueint ;
/* The item's number, if type==cJSON_Number */
double valuedouble ;
char * valuestring ; /* The item's string, if type==cJSON_String */
int64_t valueint ; /* The item's number, if type==cJSON_Number */
double valuedouble ; /* The item's number, if type==cJSON_Number */
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
char * string ;
char * string ; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
uint32_t cjsonid ;
} cJSON ;
typedef struct cJSON_Hooks
{
typedef struct cJSON_Hooks {
void * ( * malloc_fn ) ( size_t sz ) ;
void ( * free_fn ) ( void * ptr ) ;
} cJSON_Hooks ;
typedef int cJSON_bool ;
# if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
# define __WINDOWS__
# endif
# ifdef __WINDOWS__
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options:
CJSON_HIDE_SYMBOLS - Define this in the case where you don ' t want to ever dllexport symbols
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols ( default )
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
For * nix builds that support visibility attribute , you can define similar behavior by
setting default visibility to hidden by adding
- fvisibility = hidden ( for gcc )
or
- xldscope = hidden ( for sun cc )
to CFLAGS
then using the CJSON_API_VISIBILITY flag to " export " the same symbols the way CJSON_EXPORT_SYMBOLS does
*/
/* export symbols by default, this is necessary for copy pasting the C and header file */
# if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
# define CJSON_EXPORT_SYMBOLS
# endif
# if defined(CJSON_HIDE_SYMBOLS)
# define CJSON_PUBLIC(type) type __stdcall
# elif defined(CJSON_EXPORT_SYMBOLS)
# define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall
# elif defined(CJSON_IMPORT_SYMBOLS)
# define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall
# endif
# else /* !WIN32 */
# if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
# define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
# else
# define CJSON_PUBLIC(type) type
# endif
# endif
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
* This is to prevent stack overflows . */
# ifndef CJSON_NESTING_LIMIT
# define CJSON_NESTING_LIMIT 1000
# endif
/* returns the version of cJSON as a string */
CJSON_PUBLIC ( const char * ) cJSON_Version ( void ) ;
/* Supply malloc, realloc and free functions to cJSON */
CJSON_PUBLIC ( void ) cJSON_InitHooks ( cJSON_Hooks * hooks ) ;
extern void cJSON_InitHooks ( cJSON_Hooks * hooks ) ;
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
CJSON_PUBLIC ( cJSON * ) cJSON_Parse ( const char * value ) ;
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
CJSON_PUBLIC ( cJSON * ) cJSON_ParseWithOpts ( const char * value , const char * * return_parse_end , cJSON_bool require_null_terminated ) ;
/* Render a cJSON entity to text for transfer/storage. */
CJSON_PUBLIC ( char * ) cJSON_Print ( const cJSON * item ) ;
/* Render a cJSON entity to text for transfer/storage without any formatting. */
CJSON_PUBLIC ( char * ) cJSON_PrintUnformatted ( const cJSON * item ) ;
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
CJSON_PUBLIC ( char * ) cJSON_PrintBuffered ( const cJSON * item , int prebuffer , cJSON_bool fmt ) ;
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
CJSON_PUBLIC ( cJSON_bool ) cJSON_PrintPreallocated ( cJSON * item , char * buffer , const int length , const cJSON_bool format ) ;
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */
extern cJSON * cJSON_Parse ( const char * value ) ;
/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */
extern char * cJSON_Print ( cJSON * item ) ;
/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */
extern char * cJSON_PrintUnformatted ( cJSON * item ) ;
/* Delete a cJSON entity and all subentities. */
CJSON_PUBLIC ( void ) cJSON_Delete ( cJSON * c ) ;
extern void cJSON_Delete ( cJSON * c ) ;
/* Returns the number of items in an array (or object). */
CJSON_PUBLIC ( int ) cJSON_GetArraySize ( const cJSON * array ) ;
extern int cJSON_GetArraySize ( cJSON * array ) ;
/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */
CJSON_PUBLIC ( cJSON * ) cJSON_GetArrayItem ( const cJSON * array , int index ) ;
extern cJSON * cJSON_GetArrayItem ( cJSON * array , int32_t item ) ;
/* Get item "string" from object. Case insensitive. */
CJSON_PUBLIC ( cJSON * ) cJSON_GetObjectItem ( const cJSON * const object , const char * const string ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_GetObjectItemCaseSensitive ( const cJSON * const object , const char * const string ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_HasObjectItem ( const cJSON * object , const char * string ) ;
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
CJSON_PUBLIC ( const char * ) cJSON_GetErrorPtr ( void ) ;
/* Check if the item is a string and return its valuestring */
CJSON_PUBLIC ( char * ) cJSON_GetStringValue ( cJSON * item ) ;
/* These functions check the type of an item */
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsInvalid ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsFalse ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsTrue ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsBool ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsNull ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsNumber ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsString ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsArray ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsObject ( const cJSON * const item ) ;
CJSON_PUBLIC ( cJSON_bool ) cJSON_IsRaw ( const cJSON * const item ) ;
extern cJSON * cJSON_GetObjectItem ( cJSON * object , const char * string ) ;
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
extern const char * cJSON_GetErrorPtr ( void ) ;
/* These calls create a cJSON item of the appropriate type. */
CJSON_PUBLIC ( cJSON * ) cJSON_CreateNull ( void ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateTrue ( void ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateFalse ( void ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateBool ( cJSON_bool boolean ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateNumber ( double num ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateString ( const char * string ) ;
/* raw json */
CJSON_PUBLIC ( cJSON * ) cJSON_CreateRaw ( const char * raw ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateArray ( void ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateObject ( void ) ;
/* Create a string where valuestring references a string so
* it will not be freed by cJSON_Delete */
CJSON_PUBLIC ( cJSON * ) cJSON_CreateStringReference ( const char * string ) ;
/* Create an object/arrray that only references it's elements so
* they will not be freed by cJSON_Delete */
CJSON_PUBLIC ( cJSON * ) cJSON_CreateObjectReference ( const cJSON * child ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateArrayReference ( const cJSON * child ) ;
extern cJSON * cJSON_CreateNull ( void ) ;
extern cJSON * cJSON_CreateTrue ( void ) ;
extern cJSON * cJSON_CreateFalse ( void ) ;
extern cJSON * cJSON_CreateBool ( int32_t b ) ;
extern cJSON * cJSON_CreateNumber ( double num ) ;
extern cJSON * cJSON_CreateString ( const char * string ) ;
extern cJSON * cJSON_CreateArray ( void ) ;
extern cJSON * cJSON_CreateObject ( void ) ;
/* These utilities create an Array of count items. */
CJSON_PUBLIC ( cJSON * ) cJSON_CreateIntArray ( const int * numbers , int count ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateFloatArray ( const float * numbers , int count ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateDoubleArray ( const double * numbers , int count ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_CreateStringArray ( const char * * strings , int count ) ;
extern cJSON * cJSON_CreateIntArray ( int64_t * numbers , int32_t count ) ;
extern cJSON * cJSON_CreateFloatArray ( float * numbers , int32_t count ) ;
extern cJSON * cJSON_CreateDoubleArray ( double * numbers , int32_t count ) ;
extern cJSON * cJSON_CreateStringArray ( char * * strings , int32_t count ) ;
/* Append item to the specified array/object. */
CJSON_PUBLIC ( void ) cJSON_AddItemToArray ( cJSON * array , cJSON * item ) ;
CJSON_PUBLIC ( void ) cJSON_AddItemToObject ( cJSON * object , const char * string , cJSON * item ) ;
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
* WARNING : When this function was used , make sure to always check that ( item - > type & cJSON_StringIsConst ) is zero before
* writing to ` item - > string ` */
CJSON_PUBLIC ( void ) cJSON_AddItemToObjectCS ( cJSON * object , const char * string , cJSON * item ) ;
extern void cJSON_AddItemToArray ( cJSON * array , cJSON * item ) ;
extern void cJSON_AddItemToObject ( cJSON * object , const char * string , cJSON * item ) ;
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
CJSON_PUBLIC ( void ) cJSON_AddItemReferenceToArray ( cJSON * array , cJSON * item ) ;
CJSON_PUBLIC ( void ) cJSON_AddItemReferenceToObject ( cJSON * object , const char * string , cJSON * item ) ;
extern void cJSON_AddItemReferenceToArray ( cJSON * array , cJSON * item ) ;
extern void cJSON_AddItemReferenceToObject ( cJSON * object , const char * string , cJSON * item ) ;
/* Remove/Detatch items from Arrays/Objects. */
CJSON_PUBLIC ( cJSON * ) cJSON_DetachItemViaPointer ( cJSON * parent , cJSON * const item ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_DetachItemFromArray ( cJSON * array , int which ) ;
CJSON_PUBLIC ( void ) cJSON_DeleteItemFromArray ( cJSON * array , int which ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_DetachItemFromObject ( cJSON * object , const char * string ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_DetachItemFromObjectCaseSensitive ( cJSON * object , const char * string ) ;
CJSON_PUBLIC ( void ) cJSON_DeleteItemFromObject ( cJSON * object , const char * string ) ;
CJSON_PUBLIC ( void ) cJSON_DeleteItemFromObjectCaseSensitive ( cJSON * object , const char * string ) ;
extern cJSON * cJSON_DetachItemFromArray ( cJSON * array , int32_t which ) ;
extern void cJSON_DeleteItemFromArray ( cJSON * array , int32_t which ) ;
extern cJSON * cJSON_DetachItemFromObject ( cJSON * object , const char * string ) ;
extern void cJSON_DeleteItemFromObject ( cJSON * object , const char * string ) ;
/* Update array items. */
CJSON_PUBLIC ( void ) cJSON_InsertItemInArray ( cJSON * array , int which , cJSON * newitem ) ; /* Shifts pre-existing items to the right. */
CJSON_PUBLIC ( cJSON_bool ) cJSON_ReplaceItemViaPointer ( cJSON * const parent , cJSON * const item , cJSON * replacement ) ;
CJSON_PUBLIC ( void ) cJSON_ReplaceItemInArray ( cJSON * array , int which , cJSON * newitem ) ;
CJSON_PUBLIC ( void ) cJSON_ReplaceItemInObject ( cJSON * object , const char * string , cJSON * newitem ) ;
CJSON_PUBLIC ( void ) cJSON_ReplaceItemInObjectCaseSensitive ( cJSON * object , const char * string , cJSON * newitem ) ;
extern void cJSON_ReplaceItemInArray ( cJSON * array , int32_t which , cJSON * newitem ) ;
extern void cJSON_ReplaceItemInObject ( cJSON * object , const char * string , cJSON * newitem ) ;
/* Duplicate a cJSON item */
CJSON_PUBLIC ( cJSON * ) cJSON_Duplicate ( const cJSON * item , cJSON_bool recurse ) ;
extern cJSON * cJSON_Duplicate ( cJSON * item , int32_t recurse ) ;
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
need to be released . With recurse ! = 0 , it will duplicate any children connected to the item .
The item - > next and - > prev pointers are always zero on return from Duplicate . */
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
* case_sensitive determines if object keys are treated case sensitive ( 1 ) or case insensitive ( 0 ) */
CJSON_PUBLIC ( cJSON_bool ) cJSON_Compare ( const cJSON * const a , const cJSON * const b , const cJSON_bool case_sensitive ) ;
CJSON_PUBLIC ( void ) cJSON_Minify ( char * json ) ;
/* Helper functions for creating and adding items to an object at the same time.
* They return the added item or NULL on failure . */
CJSON_PUBLIC ( cJSON * ) cJSON_AddNullToObject ( cJSON * const object , const char * const name ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddTrueToObject ( cJSON * const object , const char * const name ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddFalseToObject ( cJSON * const object , const char * const name ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddBoolToObject ( cJSON * const object , const char * const name , const cJSON_bool boolean ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddNumberToObject ( cJSON * const object , const char * const name , const double number ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddStringToObject ( cJSON * const object , const char * const name , const char * const string ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddRawToObject ( cJSON * const object , const char * const name , const char * const raw ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddObjectToObject ( cJSON * const object , const char * const name ) ;
CJSON_PUBLIC ( cJSON * ) cJSON_AddArrayToObject ( cJSON * const object , const char * const name ) ;
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
extern cJSON * cJSON_ParseWithOpts ( const char * value , const char * * return_parse_end , int32_t require_null_terminated ) ;
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
# define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
/* helper for the cJSON_SetNumberValue macro */
CJSON_PUBLIC ( double ) cJSON_SetNumberHelper ( cJSON * object , double number ) ;
# define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
extern void cJSON_Minify ( char * json ) ;
/* Macro for iterating over an array or object */
# define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
/* Macros for creating things quickly. */
# define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
# define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
# define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
# define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
# define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
# define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
CJSON_PUBLIC ( void * ) cJSON_malloc ( size_t size ) ;
CJSON_PUBLIC ( void ) cJSON_free ( void * object ) ;
struct destbuf { char buf [ MAX_JSON_FIELD ] ; } ;
# define jfieldname get_cJSON_fieldname
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
# define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val))
# define jfieldstr get_cJSON_fieldname
# ifdef __cplusplus
}
# endif
struct destbuf { char buf [ MAX_JSON_FIELD ] ; } ;
char * cJSON_str ( cJSON * json ) ;
char * jstr ( cJSON * json , char * field ) ;
char * jprint ( cJSON * json , int32_t freeflag ) ;
@ -358,5 +228,10 @@ struct destbuf { char buf[MAX_JSON_FIELD]; };
# define jtrue cJSON_CreateTrue
# define jfalse cJSON_CreateFalse
# define jfieldname get_cJSON_fieldname
# ifdef __cplusplus
}
# endif
# endif