blob: c6a57be57b9a3b0afcf405b1d2cb7f96bd2e7d12 [file] [log] [blame]
Jon Ashburn752e06e2015-06-29 11:25:34 -06001/*
2 Copyright (c) 2009 Dave Gamble
Jon Ashburn1c75aec2016-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 Ashburn752e06e2015-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 Ashburn1c75aec2016-02-02 17:47:28 -070013
Jon Ashburn752e06e2015-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 Ashburn1c75aec2016-02-02 17:47:28 -070016
Jon Ashburn752e06e2015-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 Ashburn1c75aec2016-02-02 17:47:28 -070030extern "C" {
Jon Ashburn752e06e2015-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 Ashburn1c75aec2016-02-02 17:47:28 -070041
Jon Ashburn752e06e2015-06-29 11:25:34 -060042#define cJSON_IsReference 256
43#define cJSON_StringIsConst 512
44
45/* The cJSON structure: */
46typedef struct cJSON {
Jon Ashburn1c75aec2016-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 Ashburn752e06e2015-06-29 11:25:34 -060053
Jon Ashburn1c75aec2016-02-02 17:47:28 -070054 int type; /* The type of the item, as above. */
Jon Ashburn752e06e2015-06-29 11:25:34 -060055
Jon Ashburn1c75aec2016-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 Ashburn752e06e2015-06-29 11:25:34 -060059
Jon Ashburnc466da52016-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 Ashburn752e06e2015-06-29 11:25:34 -060062} cJSON;
63
64typedef struct cJSON_Hooks {
Jon Ashburn1c75aec2016-02-02 17:47:28 -070065 void *(*malloc_fn)(size_t sz);
66 void (*free_fn)(void *ptr);
Jon Ashburn752e06e2015-06-29 11:25:34 -060067} cJSON_Hooks;
68
69/* Supply malloc, realloc and free functions to cJSON */
Jon Ashburn1c75aec2016-02-02 17:47:28 -070070extern void cJSON_InitHooks(cJSON_Hooks *hooks);
Jon Ashburn752e06e2015-06-29 11:25:34 -060071
Jon Ashburn1c75aec2016-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 Ashburn752e06e2015-06-29 11:25:34 -060074extern cJSON *cJSON_Parse(const char *value);
Jon Ashburn1c75aec2016-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 Ashburn752e06e2015-06-29 11:25:34 -060085/* Delete a cJSON entity and all subentities. */
Jon Ashburn1c75aec2016-02-02 17:47:28 -070086extern void cJSON_Delete(cJSON *c);
Jon Ashburn752e06e2015-06-29 11:25:34 -060087
88/* Returns the number of items in an array (or object). */
Jon Ashburn1c75aec2016-02-02 17:47:28 -070089extern int cJSON_GetArraySize(cJSON *array);
90/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful.
91 */
92extern cJSON *cJSON_GetArrayItem(cJSON *array, int item);
Jon Ashburn752e06e2015-06-29 11:25:34 -060093/* Get item "string" from object. Case insensitive. */
Jon Ashburn1c75aec2016-02-02 17:47:28 -070094extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
Jon Ashburn752e06e2015-06-29 11:25:34 -060095
Jon Ashburn1c75aec2016-02-02 17:47:28 -070096/* For analysing failed parses. This returns a pointer to the parse error.
97 * You'll probably need to look a few chars back to make sense of it. Defined
98 * when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
Jon Ashburn752e06e2015-06-29 11:25:34 -060099extern const char *cJSON_GetErrorPtr(void);
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700100
Jon Ashburn752e06e2015-06-29 11:25:34 -0600101/* These calls create a cJSON item of the appropriate type. */
102extern cJSON *cJSON_CreateNull(void);
103extern cJSON *cJSON_CreateTrue(void);
104extern cJSON *cJSON_CreateFalse(void);
105extern cJSON *cJSON_CreateBool(int b);
106extern cJSON *cJSON_CreateNumber(double num);
107extern cJSON *cJSON_CreateString(const char *string);
108extern cJSON *cJSON_CreateArray(void);
109extern cJSON *cJSON_CreateObject(void);
110
111/* These utilities create an Array of count items. */
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700112extern cJSON *cJSON_CreateIntArray(const int *numbers, int count);
113extern cJSON *cJSON_CreateFloatArray(const float *numbers, int count);
114extern cJSON *cJSON_CreateDoubleArray(const double *numbers, int count);
115extern cJSON *cJSON_CreateStringArray(const char **strings, int count);
Jon Ashburn752e06e2015-06-29 11:25:34 -0600116
117/* Append item to the specified array/object. */
118extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700119extern void cJSON_AddItemToObject(cJSON *object, const char *string,
120 cJSON *item);
121extern void cJSON_AddItemToObjectCS(
122 cJSON *object, const char *string,
123 cJSON *item); /* Use this when string is definitely const (i.e. a literal,
124 or as good as), and will definitely survive the cJSON
125 object */
126/* Append reference to item to the specified array/object. Use this when you
127 * want to add an existing cJSON to a new cJSON, but don't want to corrupt your
128 * existing cJSON. */
Jon Ashburn752e06e2015-06-29 11:25:34 -0600129extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700130extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string,
131 cJSON *item);
Jon Ashburn752e06e2015-06-29 11:25:34 -0600132
133/* Remove/Detatch items from Arrays/Objects. */
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700134extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
135extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
136extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
137extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string);
138
Jon Ashburn752e06e2015-06-29 11:25:34 -0600139/* Update array items. */
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700140extern void cJSON_InsertItemInArray(
141 cJSON *array, int which,
142 cJSON *newitem); /* Shifts pre-existing items to the right. */
143extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
144extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string,
145 cJSON *newitem);
Jon Ashburn752e06e2015-06-29 11:25:34 -0600146
147/* Duplicate a cJSON item */
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700148extern cJSON *cJSON_Duplicate(cJSON *item, int recurse);
149/* Duplicate will create a new, identical cJSON item to the one you pass, in new
150memory that will
151need to be released. With recurse!=0, it will duplicate any children connected
152to the item.
Jon Ashburn752e06e2015-06-29 11:25:34 -0600153The item->next and ->prev pointers are always zero on return from Duplicate. */
154
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700155/* ParseWithOpts allows you to require (and check) that the JSON is null
156 * terminated, and to retrieve the pointer to the final byte parsed. */
157extern cJSON *cJSON_ParseWithOpts(const char *value,
158 const char **return_parse_end,
159 int require_null_terminated);
Jon Ashburn752e06e2015-06-29 11:25:34 -0600160
161extern void cJSON_Minify(char *json);
162
163/* Macros for creating things quickly. */
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700164#define cJSON_AddNullToObject(object, name) \
165 cJSON_AddItemToObject(object, name, cJSON_CreateNull())
166#define cJSON_AddTrueToObject(object, name) \
167 cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
168#define cJSON_AddFalseToObject(object, name) \
169 cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
170#define cJSON_AddBoolToObject(object, name, b) \
171 cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
172#define cJSON_AddNumberToObject(object, name, n) \
173 cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
174#define cJSON_AddStringToObject(object, name, s) \
175 cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
Jon Ashburn752e06e2015-06-29 11:25:34 -0600176
Jon Ashburn1c75aec2016-02-02 17:47:28 -0700177/* When assigning an integer value, it needs to be propagated to valuedouble
178 * too. */
179#define cJSON_SetIntValue(object, val) \
180 ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
181#define cJSON_SetNumberValue(object, val) \
182 ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
Jon Ashburn752e06e2015-06-29 11:25:34 -0600183
184#ifdef __cplusplus
185}
186#endif
187
188#endif