blob: cab30515e6139b9182c22d7f56ed191d6635903f [file] [log] [blame]
Jon Ashburn2077e382015-06-29 11:25:34 -06001/*
2 Copyright (c) 2009 Dave Gamble
Jon Ashburn23d36b12016-02-02 17:47:28 -07003 Copyright (c) 2015-2016 The Khronos Group Inc.
4 Copyright (c) 2015-2016 Valve Corporation
5 Copyright (c) 2015-2016 LunarG, Inc.
6
Jon Ashburn2077e382015-06-29 11:25:34 -06007 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software and associated documentation files (the "Software"), to deal
9 in the Software without restriction, including without limitation the rights
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
Jon Ashburn23d36b12016-02-02 17:47:28 -070013
Jon Ashburn2077e382015-06-29 11:25:34 -060014 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
Jon Ashburn23d36b12016-02-02 17:47:28 -070016
Jon Ashburn2077e382015-06-29 11:25:34 -060017 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 THE SOFTWARE.
24*/
25
26#ifndef cJSON__h
27#define cJSON__h
28
29#ifdef __cplusplus
Jon Ashburn23d36b12016-02-02 17:47:28 -070030extern "C" {
Jon Ashburn2077e382015-06-29 11:25:34 -060031#endif
32
33/* cJSON Types: */
34#define cJSON_False 0
35#define cJSON_True 1
36#define cJSON_NULL 2
37#define cJSON_Number 3
38#define cJSON_String 4
39#define cJSON_Array 5
40#define cJSON_Object 6
Jon Ashburn23d36b12016-02-02 17:47:28 -070041
Jon Ashburn2077e382015-06-29 11:25:34 -060042#define cJSON_IsReference 256
43#define cJSON_StringIsConst 512
44
45/* The cJSON structure: */
46typedef struct cJSON {
Jon Ashburn23d36b12016-02-02 17:47:28 -070047 struct cJSON *next, *prev; /* next/prev allow you to walk array/object
48 chains. Alternatively, use
49 GetArraySize/GetArrayItem/GetObjectItem */
50 struct cJSON *child; /* An array or object item will have a child pointer
51 pointing to a chain of the items in the
52 array/object. */
Jon Ashburn2077e382015-06-29 11:25:34 -060053
Jon Ashburn23d36b12016-02-02 17:47:28 -070054 int type; /* The type of the item, as above. */
Jon Ashburn2077e382015-06-29 11:25:34 -060055
Jon Ashburn23d36b12016-02-02 17:47:28 -070056 char *valuestring; /* The item's string, if type==cJSON_String */
57 int valueint; /* The item's number, if type==cJSON_Number */
58 double valuedouble; /* The item's number, if type==cJSON_Number */
Jon Ashburn2077e382015-06-29 11:25:34 -060059
Jon Ashburncc407a22016-04-15 09:25:03 -060060 char *string; /* The item's name string, if this item is the child of, or is
61 in the list of subitems of an object. */
Jon Ashburn2077e382015-06-29 11:25:34 -060062} cJSON;
63
64typedef struct cJSON_Hooks {
Jon Ashburn23d36b12016-02-02 17:47:28 -070065 void *(*malloc_fn)(size_t sz);
66 void (*free_fn)(void *ptr);
Jon Ashburn2077e382015-06-29 11:25:34 -060067} cJSON_Hooks;
68
69/* Supply malloc, realloc and free functions to cJSON */
Jon Ashburn23d36b12016-02-02 17:47:28 -070070extern void cJSON_InitHooks(cJSON_Hooks *hooks);
Jon Ashburn2077e382015-06-29 11:25:34 -060071
Jon Ashburn23d36b12016-02-02 17:47:28 -070072/* Supply a block of JSON, and this returns a cJSON object you can interrogate.
73 * Call cJSON_Delete when finished. */
Jon Ashburn2077e382015-06-29 11:25:34 -060074extern cJSON *cJSON_Parse(const char *value);
Jon Ashburn23d36b12016-02-02 17:47:28 -070075/* Render a cJSON entity to text for transfer/storage. Free the char* when
76 * finished. */
77extern char *cJSON_Print(cJSON *item);
78/* Render a cJSON entity to text for transfer/storage without any formatting.
79 * Free the char* when finished. */
80extern char *cJSON_PrintUnformatted(cJSON *item);
81/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess
82 * at the final size. guessing well reduces reallocation. fmt=0 gives
83 * unformatted, =1 gives formatted */
84extern char *cJSON_PrintBuffered(cJSON *item, int prebuffer, int fmt);
Jon Ashburn2077e382015-06-29 11:25:34 -060085/* Delete a cJSON entity and all subentities. */
Jon Ashburn23d36b12016-02-02 17:47:28 -070086extern void cJSON_Delete(cJSON *c);
Mark Young0ad83132016-06-30 13:02:42 -060087/* Delete an item allocated inside the JSON parser*/
88extern void cJSON_Free(void *p);
Jon Ashburn2077e382015-06-29 11:25:34 -060089
90/* Returns the number of items in an array (or object). */
Jon Ashburn23d36b12016-02-02 17:47:28 -070091extern int cJSON_GetArraySize(cJSON *array);
92/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful.
93 */
94extern cJSON *cJSON_GetArrayItem(cJSON *array, int item);
Jon Ashburn2077e382015-06-29 11:25:34 -060095/* Get item "string" from object. Case insensitive. */
Jon Ashburn23d36b12016-02-02 17:47:28 -070096extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
Jon Ashburn2077e382015-06-29 11:25:34 -060097
Jon Ashburn23d36b12016-02-02 17:47:28 -070098/* For analysing failed parses. This returns a pointer to the parse error.
99 * You'll probably need to look a few chars back to make sense of it. Defined
100 * when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
Jon Ashburn2077e382015-06-29 11:25:34 -0600101extern const char *cJSON_GetErrorPtr(void);
Jon Ashburn23d36b12016-02-02 17:47:28 -0700102
Jon Ashburn2077e382015-06-29 11:25:34 -0600103/* These calls create a cJSON item of the appropriate type. */
104extern cJSON *cJSON_CreateNull(void);
105extern cJSON *cJSON_CreateTrue(void);
106extern cJSON *cJSON_CreateFalse(void);
107extern cJSON *cJSON_CreateBool(int b);
108extern cJSON *cJSON_CreateNumber(double num);
109extern cJSON *cJSON_CreateString(const char *string);
110extern cJSON *cJSON_CreateArray(void);
111extern cJSON *cJSON_CreateObject(void);
112
113/* These utilities create an Array of count items. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700114extern cJSON *cJSON_CreateIntArray(const int *numbers, int count);
115extern cJSON *cJSON_CreateFloatArray(const float *numbers, int count);
116extern cJSON *cJSON_CreateDoubleArray(const double *numbers, int count);
117extern cJSON *cJSON_CreateStringArray(const char **strings, int count);
Jon Ashburn2077e382015-06-29 11:25:34 -0600118
119/* Append item to the specified array/object. */
120extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
Jon Ashburn23d36b12016-02-02 17:47:28 -0700121extern void cJSON_AddItemToObject(cJSON *object, const char *string,
122 cJSON *item);
123extern void cJSON_AddItemToObjectCS(
124 cJSON *object, const char *string,
125 cJSON *item); /* Use this when string is definitely const (i.e. a literal,
126 or as good as), and will definitely survive the cJSON
127 object */
128/* Append reference to item to the specified array/object. Use this when you
129 * want to add an existing cJSON to a new cJSON, but don't want to corrupt your
130 * existing cJSON. */
Jon Ashburn2077e382015-06-29 11:25:34 -0600131extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
Jon Ashburn23d36b12016-02-02 17:47:28 -0700132extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string,
133 cJSON *item);
Jon Ashburn2077e382015-06-29 11:25:34 -0600134
135/* Remove/Detatch items from Arrays/Objects. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700136extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
137extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
138extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
139extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string);
140
Jon Ashburn2077e382015-06-29 11:25:34 -0600141/* Update array items. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700142extern void cJSON_InsertItemInArray(
143 cJSON *array, int which,
144 cJSON *newitem); /* Shifts pre-existing items to the right. */
145extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
146extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string,
147 cJSON *newitem);
Jon Ashburn2077e382015-06-29 11:25:34 -0600148
149/* Duplicate a cJSON item */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700150extern cJSON *cJSON_Duplicate(cJSON *item, int recurse);
151/* Duplicate will create a new, identical cJSON item to the one you pass, in new
152memory that will
153need to be released. With recurse!=0, it will duplicate any children connected
154to the item.
Jon Ashburn2077e382015-06-29 11:25:34 -0600155The item->next and ->prev pointers are always zero on return from Duplicate. */
156
Jon Ashburn23d36b12016-02-02 17:47:28 -0700157/* ParseWithOpts allows you to require (and check) that the JSON is null
158 * terminated, and to retrieve the pointer to the final byte parsed. */
159extern cJSON *cJSON_ParseWithOpts(const char *value,
160 const char **return_parse_end,
161 int require_null_terminated);
Jon Ashburn2077e382015-06-29 11:25:34 -0600162
163extern void cJSON_Minify(char *json);
164
165/* Macros for creating things quickly. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700166#define cJSON_AddNullToObject(object, name) \
167 cJSON_AddItemToObject(object, name, cJSON_CreateNull())
168#define cJSON_AddTrueToObject(object, name) \
169 cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
170#define cJSON_AddFalseToObject(object, name) \
171 cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
172#define cJSON_AddBoolToObject(object, name, b) \
173 cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
174#define cJSON_AddNumberToObject(object, name, n) \
175 cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
176#define cJSON_AddStringToObject(object, name, s) \
177 cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
Jon Ashburn2077e382015-06-29 11:25:34 -0600178
Jon Ashburn23d36b12016-02-02 17:47:28 -0700179/* When assigning an integer value, it needs to be propagated to valuedouble
180 * too. */
181#define cJSON_SetIntValue(object, val) \
182 ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
183#define cJSON_SetNumberValue(object, val) \
184 ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
Jon Ashburn2077e382015-06-29 11:25:34 -0600185
186#ifdef __cplusplus
187}
188#endif
189
190#endif