blob: f0059abdcb8ae49ca7cd887efea49c7b08c00d33 [file] [log] [blame]
Jon Ashburnffd5d672015-06-29 11:25:34 -06001/*
2 Copyright (c) 2009 Dave Gamble
Jon Ashburn44aed662016-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 Ashburnffd5d672015-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 Ashburn44aed662016-02-02 17:47:28 -070013
Jon Ashburnffd5d672015-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 Ashburn44aed662016-02-02 17:47:28 -070016
Jon Ashburnffd5d672015-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 Ashburn44aed662016-02-02 17:47:28 -070030extern "C" {
Jon Ashburnffd5d672015-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 Ashburn44aed662016-02-02 17:47:28 -070041
Jon Ashburnffd5d672015-06-29 11:25:34 -060042#define cJSON_IsReference 256
43#define cJSON_StringIsConst 512
44
45/* The cJSON structure: */
46typedef struct cJSON {
Jon Ashburn44aed662016-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 */
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -070050 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 Ashburnffd5d672015-06-29 11:25:34 -060053
Jon Ashburn44aed662016-02-02 17:47:28 -070054 int type; /* The type of the item, as above. */
Jon Ashburnffd5d672015-06-29 11:25:34 -060055
Jon Ashburn44aed662016-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 Ashburnffd5d672015-06-29 11:25:34 -060059
Jon Ashburn9b2a8c92016-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 Ashburnffd5d672015-06-29 11:25:34 -060062} cJSON;
63
64typedef struct cJSON_Hooks {
Jon Ashburn44aed662016-02-02 17:47:28 -070065 void *(*malloc_fn)(size_t sz);
66 void (*free_fn)(void *ptr);
Jon Ashburnffd5d672015-06-29 11:25:34 -060067} cJSON_Hooks;
68
69/* Supply malloc, realloc and free functions to cJSON */
Jon Ashburn44aed662016-02-02 17:47:28 -070070extern void cJSON_InitHooks(cJSON_Hooks *hooks);
Jon Ashburnffd5d672015-06-29 11:25:34 -060071
Jon Ashburn44aed662016-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 Ashburnffd5d672015-06-29 11:25:34 -060074extern cJSON *cJSON_Parse(const char *value);
Jon Ashburn44aed662016-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 Ashburnffd5d672015-06-29 11:25:34 -060085/* Delete a cJSON entity and all subentities. */
Jon Ashburn44aed662016-02-02 17:47:28 -070086extern void cJSON_Delete(cJSON *c);
Mark Young74d013a2016-06-30 13:02:42 -060087/* Delete an item allocated inside the JSON parser*/
88extern void cJSON_Free(void *p);
Jon Ashburnffd5d672015-06-29 11:25:34 -060089
90/* Returns the number of items in an array (or object). */
Jon Ashburn44aed662016-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 Ashburnffd5d672015-06-29 11:25:34 -060095/* Get item "string" from object. Case insensitive. */
Jon Ashburn44aed662016-02-02 17:47:28 -070096extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
Jon Ashburnffd5d672015-06-29 11:25:34 -060097
Jon Ashburn44aed662016-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 Ashburnffd5d672015-06-29 11:25:34 -0600101extern const char *cJSON_GetErrorPtr(void);
Jon Ashburn44aed662016-02-02 17:47:28 -0700102
Jon Ashburnffd5d672015-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 Ashburn44aed662016-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 Ashburnffd5d672015-06-29 11:25:34 -0600118
119/* Append item to the specified array/object. */
120extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -0700121extern void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
122extern void cJSON_AddItemToObjectCS(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 */
Jon Ashburn44aed662016-02-02 17:47:28 -0700126/* 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 Ashburnffd5d672015-06-29 11:25:34 -0600129extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -0700130extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
Jon Ashburnffd5d672015-06-29 11:25:34 -0600131
132/* Remove/Detatch items from Arrays/Objects. */
Jon Ashburn44aed662016-02-02 17:47:28 -0700133extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
134extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
135extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
136extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string);
137
Jon Ashburnffd5d672015-06-29 11:25:34 -0600138/* Update array items. */
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -0700139extern void cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
Jon Ashburn44aed662016-02-02 17:47:28 -0700140extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -0700141extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem);
Jon Ashburnffd5d672015-06-29 11:25:34 -0600142
143/* Duplicate a cJSON item */
Jon Ashburn44aed662016-02-02 17:47:28 -0700144extern cJSON *cJSON_Duplicate(cJSON *item, int recurse);
145/* Duplicate will create a new, identical cJSON item to the one you pass, in new
146memory that will
147need to be released. With recurse!=0, it will duplicate any children connected
148to the item.
Jon Ashburnffd5d672015-06-29 11:25:34 -0600149The item->next and ->prev pointers are always zero on return from Duplicate. */
150
Jon Ashburn44aed662016-02-02 17:47:28 -0700151/* ParseWithOpts allows you to require (and check) that the JSON is null
152 * terminated, and to retrieve the pointer to the final byte parsed. */
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -0700153extern cJSON *cJSON_ParseWithOpts(const char *value, const char **return_parse_end, int require_null_terminated);
Jon Ashburnffd5d672015-06-29 11:25:34 -0600154
155extern void cJSON_Minify(char *json);
156
157/* Macros for creating things quickly. */
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -0700158#define cJSON_AddNullToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
159#define cJSON_AddTrueToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
160#define cJSON_AddFalseToObject(object, name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
161#define cJSON_AddBoolToObject(object, name, b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
162#define cJSON_AddNumberToObject(object, name, n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
163#define cJSON_AddStringToObject(object, name, s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
Jon Ashburnffd5d672015-06-29 11:25:34 -0600164
Jon Ashburn44aed662016-02-02 17:47:28 -0700165/* When assigning an integer value, it needs to be propagated to valuedouble
166 * too. */
Mark Lobodzinskibc9caa52017-01-26 12:16:30 -0700167#define cJSON_SetIntValue(object, val) ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
168#define cJSON_SetNumberValue(object, val) ((object) ? (object)->valueint = (object)->valuedouble = (val) : (val))
Jon Ashburnffd5d672015-06-29 11:25:34 -0600169
170#ifdef __cplusplus
171}
172#endif
173
174#endif