core: Import cJSON code from the payproc project.
[gpgme.git] / src / cJSON.h
1 /* cJSON.h
2  * Copyright (c) 2009 Dave Gamble
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20  * THE SOFTWARE.
21  *
22  * SPDX-License-Identifier: MIT
23  */
24
25 #ifndef cJSON__h
26 #define cJSON__h
27
28 #ifdef __cplusplus
29 extern "C"
30 {
31 #if 0 /*(to make Emacs auto-indent happy)*/
32 }
33 #endif
34 #endif
35
36 /* cJSON Types: */
37 #define cJSON_False  0
38 #define cJSON_True   1
39 #define cJSON_NULL   2
40 #define cJSON_Number 3
41 #define cJSON_String 4
42 #define cJSON_Array  5
43 #define cJSON_Object 6
44
45 #define cJSON_IsReference 256
46
47 /* The cJSON structure: */
48 typedef struct cJSON
49 {
50   /* next/prev allow you to walk array/object chains. Alternatively,
51      use GetArraySize/GetArrayItem/GetObjectItem */
52   struct cJSON *next, *prev;
53
54   /* An array or object item will have a child pointer pointing to a
55      chain of the items in the array/object. */
56   struct cJSON *child;
57
58   int type;             /* The type of the item, as above. */
59
60   char *valuestring;    /* The item's string, if type==cJSON_String */
61   int valueint;         /* The item's number, if type==cJSON_Number */
62   double valuedouble;   /* The item's number, if type==cJSON_Number */
63
64   /* The item's name string, if this item is the child of, or is in
65      the list of subitems of an object. */
66   char *string;
67 } cJSON;
68
69 typedef struct cJSON *cjson_t;
70
71 /* Macros to test the type of an object.  */
72 #define cjson_is_boolean(a) (!((a)->type & ~1))
73 #define cjson_is_false(a)   ((a)->type == cJSON_False)
74 #define cjson_is_true(a)    ((a)->type == cJSON_True)
75 #define cjson_is_null(a)    ((a)->type == cJSON_NULL)
76 #define cjson_is_number(a)  ((a)->type == cJSON_Number)
77 #define cjson_is_string(a)  ((a)->type == cJSON_String)
78 #define cjson_is_array(a)   ((a)->type == cJSON_Array)
79 #define cjson_is_object(a)  ((a)->type == cJSON_Object)
80
81 /* Supply a block of JSON, and this returns a cJSON object you can
82    interrogate. Call cJSON_Delete when finished. */
83 extern cJSON *cJSON_Parse(const char *value, size_t *r_erroff);
84
85 /* Render a cJSON entity to text for transfer/storage. Free the char*
86    when finished. */
87 extern char  *cJSON_Print(cJSON *item);
88
89 /* Render a cJSON entity to text for transfer/storage without any
90    formatting. Free the char* when finished. */
91 extern char  *cJSON_PrintUnformatted(cJSON *item);
92
93 /* Delete a cJSON entity and all subentities. */
94 extern void   cJSON_Delete(cJSON *c);
95
96 /* Returns the number of items in an array (or object). */
97 extern int    cJSON_GetArraySize(cJSON *array);
98
99 /* Retrieve item number "item" from array "array". Returns NULL if
100    unsuccessful. */
101 extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
102
103 /* Get item "string" from object. Case insensitive. */
104 extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
105
106 /* These calls create a cJSON item of the appropriate type. */
107 extern cJSON *cJSON_CreateNull(void);
108 extern cJSON *cJSON_CreateTrue(void);
109 extern cJSON *cJSON_CreateFalse(void);
110 extern cJSON *cJSON_CreateBool(int b);
111 extern cJSON *cJSON_CreateNumber(double num);
112 extern cJSON *cJSON_CreateString(const char *string);
113 extern cJSON *cJSON_CreateArray(void);
114 extern cJSON *cJSON_CreateObject(void);
115
116 /* These utilities create an Array of count items. */
117 extern cJSON *cJSON_CreateIntArray(const int *numbers,int count);
118 extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
119 extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
120 extern cJSON *cJSON_CreateStringArray(const char **strings,int count);
121
122 /* Append item to the specified array/object. */
123 extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
124 extern void cJSON_AddItemToObject(cJSON *object,
125                                   const char *string, cJSON *item);
126
127 /* Append reference to item to the specified array/object. Use this
128    when you want to add an existing cJSON to a new cJSON, but don't
129    want to corrupt your existing cJSON. */
130 extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
131 extern void cJSON_AddItemReferenceToObject(cJSON *object,
132                                            const char *string,cJSON *item);
133
134 /* Remove/Detatch items from Arrays/Objects. */
135 extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
136 extern void   cJSON_DeleteItemFromArray(cJSON *array,int which);
137 extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
138 extern void   cJSON_DeleteItemFromObject(cJSON *object,const char *string);
139
140 /* Update array items. */
141 extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
142 extern void cJSON_ReplaceItemInObject(cJSON *object,
143                                       const char *string, cJSON *newitem);
144
145 /* Duplicate a cJSON item */
146 extern cJSON *cJSON_Duplicate(cJSON *item,int recurse);
147
148 /* Duplicate will create a new, identical cJSON item to the one you
149    pass, in new memory that will need to be released. With recurse!=0,
150    it will duplicate any children connected to the item.  The
151    item->next and ->prev pointers are always zero on return from
152    Duplicate. */
153
154 /* ParseWithOpts allows you to require (and check) that the JSON is
155    null terminated, and to retrieve the pointer to the final byte
156    parsed. */
157 extern cJSON *cJSON_ParseWithOpts(const char *value,
158                                   const char **return_parse_end,
159                                   int require_null_terminated,
160                                   size_t *r_erroff);
161
162 extern void cJSON_Minify(char *json);
163
164 /* Macros for creating things quickly. */
165 #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))
177
178 /* When assigning an integer value, it needs to be propagated to
179    valuedouble too. */
180 #define cJSON_SetIntValue(object,val) \
181   ((object)?(object)->valueint=(object)->valuedouble=(val):(val))
182
183 #ifdef __cplusplus
184 }
185 #endif
186
187 #endif /* cJSON__h */