"Fossies" - the Fresh Open Source Software Archive 
Member "jansson-2.14/src/jansson.h" (9 Sep 2021, 16330 Bytes) of package /linux/www/jansson-2.14.tar.bz2:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "jansson.h" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
2.13.1_vs_2.14.
1 /*
2 * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>
3 *
4 * Jansson is free software; you can redistribute it and/or modify
5 * it under the terms of the MIT license. See LICENSE for details.
6 */
7
8 #ifndef JANSSON_H
9 #define JANSSON_H
10
11 #include <stdarg.h>
12 #include <stdio.h>
13 #include <stdlib.h> /* for size_t */
14
15 #include "jansson_config.h"
16
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20
21 /* version */
22
23 #define JANSSON_MAJOR_VERSION 2
24 #define JANSSON_MINOR_VERSION 14
25 #define JANSSON_MICRO_VERSION 0
26
27 /* Micro version is omitted if it's 0 */
28 #define JANSSON_VERSION "2.14"
29
30 /* Version as a 3-byte hex number, e.g. 0x010201 == 1.2.1. Use this
31 for numeric comparisons, e.g. #if JANSSON_VERSION_HEX >= ... */
32 #define JANSSON_VERSION_HEX \
33 ((JANSSON_MAJOR_VERSION << 16) | (JANSSON_MINOR_VERSION << 8) | \
34 (JANSSON_MICRO_VERSION << 0))
35
36 /* If __atomic or __sync builtins are available the library is thread
37 * safe for all read-only functions plus reference counting. */
38 #if JSON_HAVE_ATOMIC_BUILTINS || JSON_HAVE_SYNC_BUILTINS
39 #define JANSSON_THREAD_SAFE_REFCOUNT 1
40 #endif
41
42 #if defined(__GNUC__) || defined(__clang__)
43 #define JANSSON_ATTRS(x) __attribute__(x)
44 #else
45 #define JANSSON_ATTRS(x)
46 #endif
47
48 /* types */
49
50 typedef enum {
51 JSON_OBJECT,
52 JSON_ARRAY,
53 JSON_STRING,
54 JSON_INTEGER,
55 JSON_REAL,
56 JSON_TRUE,
57 JSON_FALSE,
58 JSON_NULL
59 } json_type;
60
61 typedef struct json_t {
62 json_type type;
63 volatile size_t refcount;
64 } json_t;
65
66 #ifndef JANSSON_USING_CMAKE /* disabled if using cmake */
67 #if JSON_INTEGER_IS_LONG_LONG
68 #ifdef _WIN32
69 #define JSON_INTEGER_FORMAT "I64d"
70 #else
71 #define JSON_INTEGER_FORMAT "lld"
72 #endif
73 typedef long long json_int_t;
74 #else
75 #define JSON_INTEGER_FORMAT "ld"
76 typedef long json_int_t;
77 #endif /* JSON_INTEGER_IS_LONG_LONG */
78 #endif
79
80 #define json_typeof(json) ((json)->type)
81 #define json_is_object(json) ((json) && json_typeof(json) == JSON_OBJECT)
82 #define json_is_array(json) ((json) && json_typeof(json) == JSON_ARRAY)
83 #define json_is_string(json) ((json) && json_typeof(json) == JSON_STRING)
84 #define json_is_integer(json) ((json) && json_typeof(json) == JSON_INTEGER)
85 #define json_is_real(json) ((json) && json_typeof(json) == JSON_REAL)
86 #define json_is_number(json) (json_is_integer(json) || json_is_real(json))
87 #define json_is_true(json) ((json) && json_typeof(json) == JSON_TRUE)
88 #define json_is_false(json) ((json) && json_typeof(json) == JSON_FALSE)
89 #define json_boolean_value json_is_true
90 #define json_is_boolean(json) (json_is_true(json) || json_is_false(json))
91 #define json_is_null(json) ((json) && json_typeof(json) == JSON_NULL)
92
93 /* construction, destruction, reference counting */
94
95 json_t *json_object(void);
96 json_t *json_array(void);
97 json_t *json_string(const char *value);
98 json_t *json_stringn(const char *value, size_t len);
99 json_t *json_string_nocheck(const char *value);
100 json_t *json_stringn_nocheck(const char *value, size_t len);
101 json_t *json_integer(json_int_t value);
102 json_t *json_real(double value);
103 json_t *json_true(void);
104 json_t *json_false(void);
105 #define json_boolean(val) ((val) ? json_true() : json_false())
106 json_t *json_null(void);
107
108 /* do not call JSON_INTERNAL_INCREF or JSON_INTERNAL_DECREF directly */
109 #if JSON_HAVE_ATOMIC_BUILTINS
110 #define JSON_INTERNAL_INCREF(json) \
111 __atomic_add_fetch(&json->refcount, 1, __ATOMIC_ACQUIRE)
112 #define JSON_INTERNAL_DECREF(json) \
113 __atomic_sub_fetch(&json->refcount, 1, __ATOMIC_RELEASE)
114 #elif JSON_HAVE_SYNC_BUILTINS
115 #define JSON_INTERNAL_INCREF(json) __sync_add_and_fetch(&json->refcount, 1)
116 #define JSON_INTERNAL_DECREF(json) __sync_sub_and_fetch(&json->refcount, 1)
117 #else
118 #define JSON_INTERNAL_INCREF(json) (++json->refcount)
119 #define JSON_INTERNAL_DECREF(json) (--json->refcount)
120 #endif
121
122 static JSON_INLINE json_t *json_incref(json_t *json) {
123 if (json && json->refcount != (size_t)-1)
124 JSON_INTERNAL_INCREF(json);
125 return json;
126 }
127
128 /* do not call json_delete directly */
129 void json_delete(json_t *json);
130
131 static JSON_INLINE void json_decref(json_t *json) {
132 if (json && json->refcount != (size_t)-1 && JSON_INTERNAL_DECREF(json) == 0)
133 json_delete(json);
134 }
135
136 #if defined(__GNUC__) || defined(__clang__)
137 static JSON_INLINE void json_decrefp(json_t **json) {
138 if (json) {
139 json_decref(*json);
140 *json = NULL;
141 }
142 }
143
144 #define json_auto_t json_t __attribute__((cleanup(json_decrefp)))
145 #endif
146
147 /* error reporting */
148
149 #define JSON_ERROR_TEXT_LENGTH 160
150 #define JSON_ERROR_SOURCE_LENGTH 80
151
152 typedef struct json_error_t {
153 int line;
154 int column;
155 int position;
156 char source[JSON_ERROR_SOURCE_LENGTH];
157 char text[JSON_ERROR_TEXT_LENGTH];
158 } json_error_t;
159
160 enum json_error_code {
161 json_error_unknown,
162 json_error_out_of_memory,
163 json_error_stack_overflow,
164 json_error_cannot_open_file,
165 json_error_invalid_argument,
166 json_error_invalid_utf8,
167 json_error_premature_end_of_input,
168 json_error_end_of_input_expected,
169 json_error_invalid_syntax,
170 json_error_invalid_format,
171 json_error_wrong_type,
172 json_error_null_character,
173 json_error_null_value,
174 json_error_null_byte_in_key,
175 json_error_duplicate_key,
176 json_error_numeric_overflow,
177 json_error_item_not_found,
178 json_error_index_out_of_range
179 };
180
181 static JSON_INLINE enum json_error_code json_error_code(const json_error_t *e) {
182 return (enum json_error_code)e->text[JSON_ERROR_TEXT_LENGTH - 1];
183 }
184
185 /* getters, setters, manipulation */
186
187 void json_object_seed(size_t seed);
188 size_t json_object_size(const json_t *object);
189 json_t *json_object_get(const json_t *object, const char *key)
190 JANSSON_ATTRS((warn_unused_result));
191 json_t *json_object_getn(const json_t *object, const char *key, size_t key_len)
192 JANSSON_ATTRS((warn_unused_result));
193 int json_object_set_new(json_t *object, const char *key, json_t *value);
194 int json_object_setn_new(json_t *object, const char *key, size_t key_len, json_t *value);
195 int json_object_set_new_nocheck(json_t *object, const char *key, json_t *value);
196 int json_object_setn_new_nocheck(json_t *object, const char *key, size_t key_len,
197 json_t *value);
198 int json_object_del(json_t *object, const char *key);
199 int json_object_deln(json_t *object, const char *key, size_t key_len);
200 int json_object_clear(json_t *object);
201 int json_object_update(json_t *object, json_t *other);
202 int json_object_update_existing(json_t *object, json_t *other);
203 int json_object_update_missing(json_t *object, json_t *other);
204 int json_object_update_recursive(json_t *object, json_t *other);
205 void *json_object_iter(json_t *object);
206 void *json_object_iter_at(json_t *object, const char *key);
207 void *json_object_key_to_iter(const char *key);
208 void *json_object_iter_next(json_t *object, void *iter);
209 const char *json_object_iter_key(void *iter);
210 size_t json_object_iter_key_len(void *iter);
211 json_t *json_object_iter_value(void *iter);
212 int json_object_iter_set_new(json_t *object, void *iter, json_t *value);
213
214 #define json_object_foreach(object, key, value) \
215 for (key = json_object_iter_key(json_object_iter(object)); \
216 key && (value = json_object_iter_value(json_object_key_to_iter(key))); \
217 key = json_object_iter_key( \
218 json_object_iter_next(object, json_object_key_to_iter(key))))
219
220 #define json_object_keylen_foreach(object, key, key_len, value) \
221 for (key = json_object_iter_key(json_object_iter(object)), \
222 key_len = json_object_iter_key_len(json_object_key_to_iter(key)); \
223 key && (value = json_object_iter_value(json_object_key_to_iter(key))); \
224 key = json_object_iter_key( \
225 json_object_iter_next(object, json_object_key_to_iter(key))), \
226 key_len = json_object_iter_key_len(json_object_key_to_iter(key)))
227
228 #define json_object_foreach_safe(object, n, key, value) \
229 for (key = json_object_iter_key(json_object_iter(object)), \
230 n = json_object_iter_next(object, json_object_key_to_iter(key)); \
231 key && (value = json_object_iter_value(json_object_key_to_iter(key))); \
232 key = json_object_iter_key(n), \
233 n = json_object_iter_next(object, json_object_key_to_iter(key)))
234
235 #define json_object_keylen_foreach_safe(object, n, key, key_len, value) \
236 for (key = json_object_iter_key(json_object_iter(object)), \
237 n = json_object_iter_next(object, json_object_key_to_iter(key)), \
238 key_len = json_object_iter_key_len(json_object_key_to_iter(key)); \
239 key && (value = json_object_iter_value(json_object_key_to_iter(key))); \
240 key = json_object_iter_key(n), key_len = json_object_iter_key_len(n), \
241 n = json_object_iter_next(object, json_object_key_to_iter(key)))
242
243 #define json_array_foreach(array, index, value) \
244 for (index = 0; \
245 index < json_array_size(array) && (value = json_array_get(array, index)); \
246 index++)
247
248 static JSON_INLINE int json_object_set(json_t *object, const char *key, json_t *value) {
249 return json_object_set_new(object, key, json_incref(value));
250 }
251
252 static JSON_INLINE int json_object_setn(json_t *object, const char *key, size_t key_len,
253 json_t *value) {
254 return json_object_setn_new(object, key, key_len, json_incref(value));
255 }
256
257 static JSON_INLINE int json_object_set_nocheck(json_t *object, const char *key,
258 json_t *value) {
259 return json_object_set_new_nocheck(object, key, json_incref(value));
260 }
261
262 static JSON_INLINE int json_object_setn_nocheck(json_t *object, const char *key,
263 size_t key_len, json_t *value) {
264 return json_object_setn_new_nocheck(object, key, key_len, json_incref(value));
265 }
266
267 static JSON_INLINE int json_object_iter_set(json_t *object, void *iter, json_t *value) {
268 return json_object_iter_set_new(object, iter, json_incref(value));
269 }
270
271 static JSON_INLINE int json_object_update_new(json_t *object, json_t *other) {
272 int ret = json_object_update(object, other);
273 json_decref(other);
274 return ret;
275 }
276
277 static JSON_INLINE int json_object_update_existing_new(json_t *object, json_t *other) {
278 int ret = json_object_update_existing(object, other);
279 json_decref(other);
280 return ret;
281 }
282
283 static JSON_INLINE int json_object_update_missing_new(json_t *object, json_t *other) {
284 int ret = json_object_update_missing(object, other);
285 json_decref(other);
286 return ret;
287 }
288
289 size_t json_array_size(const json_t *array);
290 json_t *json_array_get(const json_t *array, size_t index)
291 JANSSON_ATTRS((warn_unused_result));
292 int json_array_set_new(json_t *array, size_t index, json_t *value);
293 int json_array_append_new(json_t *array, json_t *value);
294 int json_array_insert_new(json_t *array, size_t index, json_t *value);
295 int json_array_remove(json_t *array, size_t index);
296 int json_array_clear(json_t *array);
297 int json_array_extend(json_t *array, json_t *other);
298
299 static JSON_INLINE int json_array_set(json_t *array, size_t ind, json_t *value) {
300 return json_array_set_new(array, ind, json_incref(value));
301 }
302
303 static JSON_INLINE int json_array_append(json_t *array, json_t *value) {
304 return json_array_append_new(array, json_incref(value));
305 }
306
307 static JSON_INLINE int json_array_insert(json_t *array, size_t ind, json_t *value) {
308 return json_array_insert_new(array, ind, json_incref(value));
309 }
310
311 const char *json_string_value(const json_t *string);
312 size_t json_string_length(const json_t *string);
313 json_int_t json_integer_value(const json_t *integer);
314 double json_real_value(const json_t *real);
315 double json_number_value(const json_t *json);
316
317 int json_string_set(json_t *string, const char *value);
318 int json_string_setn(json_t *string, const char *value, size_t len);
319 int json_string_set_nocheck(json_t *string, const char *value);
320 int json_string_setn_nocheck(json_t *string, const char *value, size_t len);
321 int json_integer_set(json_t *integer, json_int_t value);
322 int json_real_set(json_t *real, double value);
323
324 /* pack, unpack */
325
326 json_t *json_pack(const char *fmt, ...) JANSSON_ATTRS((warn_unused_result));
327 json_t *json_pack_ex(json_error_t *error, size_t flags, const char *fmt, ...)
328 JANSSON_ATTRS((warn_unused_result));
329 json_t *json_vpack_ex(json_error_t *error, size_t flags, const char *fmt, va_list ap)
330 JANSSON_ATTRS((warn_unused_result));
331
332 #define JSON_VALIDATE_ONLY 0x1
333 #define JSON_STRICT 0x2
334
335 int json_unpack(json_t *root, const char *fmt, ...);
336 int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...);
337 int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt,
338 va_list ap);
339
340 /* sprintf */
341
342 json_t *json_sprintf(const char *fmt, ...)
343 JANSSON_ATTRS((warn_unused_result, format(printf, 1, 2)));
344 json_t *json_vsprintf(const char *fmt, va_list ap)
345 JANSSON_ATTRS((warn_unused_result, format(printf, 1, 0)));
346
347 /* equality */
348
349 int json_equal(const json_t *value1, const json_t *value2);
350
351 /* copying */
352
353 json_t *json_copy(json_t *value) JANSSON_ATTRS((warn_unused_result));
354 json_t *json_deep_copy(const json_t *value) JANSSON_ATTRS((warn_unused_result));
355
356 /* decoding */
357
358 #define JSON_REJECT_DUPLICATES 0x1
359 #define JSON_DISABLE_EOF_CHECK 0x2
360 #define JSON_DECODE_ANY 0x4
361 #define JSON_DECODE_INT_AS_REAL 0x8
362 #define JSON_ALLOW_NUL 0x10
363
364 typedef size_t (*json_load_callback_t)(void *buffer, size_t buflen, void *data);
365
366 json_t *json_loads(const char *input, size_t flags, json_error_t *error)
367 JANSSON_ATTRS((warn_unused_result));
368 json_t *json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error)
369 JANSSON_ATTRS((warn_unused_result));
370 json_t *json_loadf(FILE *input, size_t flags, json_error_t *error)
371 JANSSON_ATTRS((warn_unused_result));
372 json_t *json_loadfd(int input, size_t flags, json_error_t *error)
373 JANSSON_ATTRS((warn_unused_result));
374 json_t *json_load_file(const char *path, size_t flags, json_error_t *error)
375 JANSSON_ATTRS((warn_unused_result));
376 json_t *json_load_callback(json_load_callback_t callback, void *data, size_t flags,
377 json_error_t *error) JANSSON_ATTRS((warn_unused_result));
378
379 /* encoding */
380
381 #define JSON_MAX_INDENT 0x1F
382 #define JSON_INDENT(n) ((n)&JSON_MAX_INDENT)
383 #define JSON_COMPACT 0x20
384 #define JSON_ENSURE_ASCII 0x40
385 #define JSON_SORT_KEYS 0x80
386 #define JSON_PRESERVE_ORDER 0x100
387 #define JSON_ENCODE_ANY 0x200
388 #define JSON_ESCAPE_SLASH 0x400
389 #define JSON_REAL_PRECISION(n) (((n)&0x1F) << 11)
390 #define JSON_EMBED 0x10000
391
392 typedef int (*json_dump_callback_t)(const char *buffer, size_t size, void *data);
393
394 char *json_dumps(const json_t *json, size_t flags) JANSSON_ATTRS((warn_unused_result));
395 size_t json_dumpb(const json_t *json, char *buffer, size_t size, size_t flags);
396 int json_dumpf(const json_t *json, FILE *output, size_t flags);
397 int json_dumpfd(const json_t *json, int output, size_t flags);
398 int json_dump_file(const json_t *json, const char *path, size_t flags);
399 int json_dump_callback(const json_t *json, json_dump_callback_t callback, void *data,
400 size_t flags);
401
402 /* custom memory allocation */
403
404 typedef void *(*json_malloc_t)(size_t);
405 typedef void (*json_free_t)(void *);
406
407 void json_set_alloc_funcs(json_malloc_t malloc_fn, json_free_t free_fn);
408 void json_get_alloc_funcs(json_malloc_t *malloc_fn, json_free_t *free_fn);
409
410 /* runtime version checking */
411
412 const char *jansson_version_str(void);
413 int jansson_version_cmp(int major, int minor, int micro);
414
415 #ifdef __cplusplus
416 }
417 #endif
418
419 #endif