blob: e4c747c128f676af200ec669099ef778ca1839a2 [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 Ashburn23d36b12016-02-02 17:47:28 -070060 char *
61 string; /* The item's name string, if this item is the child of, or is
62 in the list of subitems of an object. */
Jon Ashburn2077e382015-06-29 11:25:34 -060063} cJSON;
64
65typedef struct cJSON_Hooks {
Jon Ashburn23d36b12016-02-02 17:47:28 -070066 void *(*malloc_fn)(size_t sz);
67 void (*free_fn)(void *ptr);
Jon Ashburn2077e382015-06-29 11:25:34 -060068} cJSON_Hooks;
69
70/* Supply malloc, realloc and free functions to cJSON */
Jon Ashburn23d36b12016-02-02 17:47:28 -070071extern void cJSON_InitHooks(cJSON_Hooks *hooks);
Jon Ashburn2077e382015-06-29 11:25:34 -060072
Jon Ashburn23d36b12016-02-02 17:47:28 -070073/* Supply a block of JSON, and this returns a cJSON object you can interrogate.
74 * Call cJSON_Delete when finished. */
Jon Ashburn2077e382015-06-29 11:25:34 -060075extern cJSON *cJSON_Parse(const char *value);
Jon Ashburn23d36b12016-02-02 17:47:28 -070076/* Render a cJSON entity to text for transfer/storage. Free the char* when
77 * finished. */
78extern char *cJSON_Print(cJSON *item);
79/* Render a cJSON entity to text for transfer/storage without any formatting.
80 * Free the char* when finished. */
81extern char *cJSON_PrintUnformatted(cJSON *item);
82/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess
83 * at the final size. guessing well reduces reallocation. fmt=0 gives
84 * unformatted, =1 gives formatted */
85extern char *cJSON_PrintBuffered(cJSON *item, int prebuffer, int fmt);
Jon Ashburn2077e382015-06-29 11:25:34 -060086/* Delete a cJSON entity and all subentities. */
Jon Ashburn23d36b12016-02-02 17:47:28 -070087extern void cJSON_Delete(cJSON *c);
Jon Ashburn2077e382015-06-29 11:25:34 -060088
89/* Returns the number of items in an array (or object). */
Jon Ashburn23d36b12016-02-02 17:47:28 -070090extern int cJSON_GetArraySize(cJSON *array);
91/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful.
92 */
93extern cJSON *cJSON_GetArrayItem(cJSON *array, int item);
Jon Ashburn2077e382015-06-29 11:25:34 -060094/* Get item "string" from object. Case insensitive. */
Jon Ashburn23d36b12016-02-02 17:47:28 -070095extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
Jon Ashburn2077e382015-06-29 11:25:34 -060096
Jon Ashburn23d36b12016-02-02 17:47:28 -070097/* For analysing failed parses. This returns a pointer to the parse error.
98 * You'll probably need to look a few chars back to make sense of it. Defined
99 * when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
Jon Ashburn2077e382015-06-29 11:25:34 -0600100extern const char *cJSON_GetErrorPtr(void);
Jon Ashburn23d36b12016-02-02 17:47:28 -0700101
Jon Ashburn2077e382015-06-29 11:25:34 -0600102/* These calls create a cJSON item of the appropriate type. */
103extern cJSON *cJSON_CreateNull(void);
104extern cJSON *cJSON_CreateTrue(void);
105extern cJSON *cJSON_CreateFalse(void);
106extern cJSON *cJSON_CreateBool(int b);
107extern cJSON *cJSON_CreateNumber(double num);
108extern cJSON *cJSON_CreateString(const char *string);
109extern cJSON *cJSON_CreateArray(void);
110extern cJSON *cJSON_CreateObject(void);
111
112/* These utilities create an Array of count items. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700113extern cJSON *cJSON_CreateIntArray(const int *numbers, int count);
114extern cJSON *cJSON_CreateFloatArray(const float *numbers, int count);
115extern cJSON *cJSON_CreateDoubleArray(const double *numbers, int count);
116extern cJSON *cJSON_CreateStringArray(const char **strings, int count);
Jon Ashburn2077e382015-06-29 11:25:34 -0600117
118/* Append item to the specified array/object. */
119extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
Jon Ashburn23d36b12016-02-02 17:47:28 -0700120extern void cJSON_AddItemToObject(cJSON *object, const char *string,
121 cJSON *item);
122extern void cJSON_AddItemToObjectCS(
123 cJSON *object, const char *string,
124 cJSON *item); /* Use this when string is definitely const (i.e. a literal,
125 or as good as), and will definitely survive the cJSON
126 object */
127/* Append reference to item to the specified array/object. Use this when you
128 * want to add an existing cJSON to a new cJSON, but don't want to corrupt your
129 * existing cJSON. */
Jon Ashburn2077e382015-06-29 11:25:34 -0600130extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
Jon Ashburn23d36b12016-02-02 17:47:28 -0700131extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string,
132 cJSON *item);
Jon Ashburn2077e382015-06-29 11:25:34 -0600133
134/* Remove/Detatch items from Arrays/Objects. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700135extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
136extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
137extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
138extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string);
139
Jon Ashburn2077e382015-06-29 11:25:34 -0600140/* Update array items. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700141extern void cJSON_InsertItemInArray(
142 cJSON *array, int which,
143 cJSON *newitem); /* Shifts pre-existing items to the right. */
144extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
145extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string,
146 cJSON *newitem);
Jon Ashburn2077e382015-06-29 11:25:34 -0600147
148/* Duplicate a cJSON item */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700149extern cJSON *cJSON_Duplicate(cJSON *item, int recurse);
150/* Duplicate will create a new, identical cJSON item to the one you pass, in new
151memory that will
152need to be released. With recurse!=0, it will duplicate any children connected
153to the item.
Jon Ashburn2077e382015-06-29 11:25:34 -0600154The item->next and ->prev pointers are always zero on return from Duplicate. */
155
Jon Ashburn23d36b12016-02-02 17:47:28 -0700156/* ParseWithOpts allows you to require (and check) that the JSON is null
157 * terminated, and to retrieve the pointer to the final byte parsed. */
158extern cJSON *cJSON_ParseWithOpts(const char *value,
159 const char **return_parse_end,
160 int require_null_terminated);
Jon Ashburn2077e382015-06-29 11:25:34 -0600161
162extern void cJSON_Minify(char *json);
163
164/* Macros for creating things quickly. */
Jon Ashburn23d36b12016-02-02 17:47:28 -0700165#define cJSON_AddNullToObject(object, name) \
166 cJSON_AddItemToObject(object, name, cJSON_CreateNull())
167#define cJSON_AddTrueToObject(object, name) \
168 cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
169#define cJSON_AddFalseToObject(object, name) \
170 cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
171#define cJSON_AddBoolToObject(object, name, b) \
172 cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
173#define cJSON_AddNumberToObject(object, name, n) \
174 cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
175#define cJSON_AddStringToObject(object, name, s) \
176 cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
Jon Ashburn2077e382015-06-29 11:25:34 -0600177
Jon Ashburn23d36b12016-02-02 17:47:28 -0700178/* When assigning an integer value, it needs to be propagated to valuedouble
179 * too. */
180#define cJSON_SetIntValue(object, val) \
181 ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
182#define cJSON_SetNumberValue(object, val) \
183 ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
Jon Ashburn2077e382015-06-29 11:25:34 -0600184
185#ifdef __cplusplus
186}
187#endif
188
189#endif