spelling: fix misspellings
[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  * Note that this code has been modified from the original code taken
25  * from cjson-code-58.zip.
26  */
27
28 #ifndef cJSON_h
29 #define cJSON_h
30
31 #ifdef __cplusplus
32 extern "C"
33 {
34 #if 0 /*(to make Emacs auto-indent happy)*/
35 }
36 #endif
37 #endif
38
39 /* cJSON Types: */
40 #define cJSON_False  0
41 #define cJSON_True   1
42 #define cJSON_NULL   2
43 #define cJSON_Number 3
44 #define cJSON_String 4
45 #define cJSON_Array  5
46 #define cJSON_Object 6
47
48 #define cJSON_IsReference 256
49
50 /* The cJSON structure: */
51 typedef struct cJSON
52 {
53   /* next/prev allow you to walk array/object chains. Alternatively,
54      use GetArraySize/GetArrayItem/GetObjectItem */
55   struct cJSON *next, *prev;
56
57   /* An array or object item will have a child pointer pointing to a
58      chain of the items in the array/object. */
59   struct cJSON *child;
60
61   int type;             /* The type of the item, as above. */
62
63   char *valuestring;    /* The item's string, if type==cJSON_String */
64   int valueint;         /* The item's number, if type==cJSON_Number */
65   double valuedouble;   /* The item's number, if type==cJSON_Number */
66
67   /* The item's name string, if this item is the child of, or is in
68      the list of subitems of an object. */
69   char *string;
70 } cJSON;
71
72 typedef struct cJSON *cjson_t;
73
74 /* Macros to test the type of an object.  */
75 #define cjson_is_boolean(a) (!((a)->type & ~1))
76 #define cjson_is_false(a)   ((a)->type == cJSON_False)
77 #define cjson_is_true(a)    ((a)->type == cJSON_True)
78 #define cjson_is_null(a)    ((a)->type == cJSON_NULL)
79 #define cjson_is_number(a)  ((a)->type == cJSON_Number)
80 #define cjson_is_string(a)  ((a)->type == cJSON_String)
81 #define cjson_is_array(a)   ((a)->type == cJSON_Array)
82 #define cjson_is_object(a)  ((a)->type == cJSON_Object)
83
84 /* Supply a block of JSON, and this returns a cJSON object you can
85    interrogate. Call cJSON_Delete when finished. */
86 extern cJSON *cJSON_Parse(const char *value, size_t *r_erroff);
87
88 /* Render a cJSON entity to text for transfer/storage. Free the char*
89    when finished. */
90 extern char  *cJSON_Print(cJSON *item);
91
92 /* Render a cJSON entity to text for transfer/storage without any
93    formatting. Free the char* when finished. */
94 extern char  *cJSON_PrintUnformatted(cJSON *item);
95
96 /* Delete a cJSON entity and all subentities. */
97 extern void   cJSON_Delete(cJSON *c);
98
99 /* Returns the number of items in an array (or object). */
100 extern int    cJSON_GetArraySize(cJSON *array);
101
102 /* Retrieve item number "item" from array "array". Returns NULL if
103    unsuccessful. */
104 extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);
105
106 /* Get item "string" from object. Case insensitive. */
107 extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
108
109 /* These calls create a cJSON item of the appropriate type. */
110 extern cJSON *cJSON_CreateNull(void);
111 extern cJSON *cJSON_CreateTrue(void);
112 extern cJSON *cJSON_CreateFalse(void);
113 extern cJSON *cJSON_CreateBool(int b);
114 extern cJSON *cJSON_CreateNumber(double num);
115 extern cJSON *cJSON_CreateString(const char *string);
116 extern cJSON *cJSON_CreateStringConvey (char *string);
117 extern cJSON *cJSON_CreateArray(void);
118 extern cJSON *cJSON_CreateObject(void);
119
120 /* These utilities create an Array of count items. */
121 extern cJSON *cJSON_CreateIntArray(const int *numbers,int count);
122 extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count);
123 extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count);
124 extern cJSON *cJSON_CreateStringArray(const char **strings,int count);
125
126 /* Append item to the specified array. */
127 extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
128
129 /* Append item to the specified object. */
130 extern cJSON *cJSON_AddItemToObject(cJSON *object, const char *name,
131                                     cJSON *item);
132 extern cJSON *cJSON_AddNullToObject (cJSON *object, const char *name);
133 extern cJSON *cJSON_AddTrueToObject (cJSON *object, const char *name);
134 extern cJSON *cJSON_AddFalseToObject (cJSON *object, const char *name);
135 extern cJSON *cJSON_AddBoolToObject (cJSON *object, const char *name, int b);
136 extern cJSON *cJSON_AddNumberToObject (cJSON *object, const char *name,
137                                        double num);
138 extern cJSON *cJSON_AddStringToObject (cJSON *object, const char *name,
139                                        const char *string);
140
141 /* Append reference to item to the specified array/object. Use this
142    when you want to add an existing cJSON to a new cJSON, but don't
143    want to corrupt your existing cJSON. */
144 extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
145 extern void cJSON_AddItemReferenceToObject(cJSON *object,
146                                            const char *string,cJSON *item);
147
148 /* Remove/Detach items from Arrays/Objects. */
149 extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which);
150 extern void   cJSON_DeleteItemFromArray(cJSON *array,int which);
151 extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string);
152 extern void   cJSON_DeleteItemFromObject(cJSON *object,const char *string);
153
154 /* Update array items. */
155 extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
156 extern void cJSON_ReplaceItemInObject(cJSON *object,
157                                       const char *string, cJSON *newitem);
158
159 /* Duplicate a cJSON item */
160 extern cJSON *cJSON_Duplicate(cJSON *item,int recurse);
161
162 /* Duplicate will create a new, identical cJSON item to the one you
163    pass, in new memory that will need to be released. With recurse!=0,
164    it will duplicate any children connected to the item.  The
165    item->next and ->prev pointers are always zero on return from
166    Duplicate. */
167
168 /* ParseWithOpts allows you to require (and check) that the JSON is
169    null terminated, and to retrieve the pointer to the final byte
170    parsed. */
171 extern cJSON *cJSON_ParseWithOpts(const char *value,
172                                   const char **return_parse_end,
173                                   int require_null_terminated,
174                                   size_t *r_erroff);
175
176 extern void cJSON_Minify(char *json);
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 */