| 1 | /* | 
|---|
| 2 | * Copyright (c) 2009-2012 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 <stdio.h> | 
|---|
| 12 | #include <stdlib.h>  /* for size_t */ | 
|---|
| 13 | #include <stdarg.h> | 
|---|
| 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  4 | 
|---|
| 25 | #define JANSSON_MICRO_VERSION  99 | 
|---|
| 26 |  | 
|---|
| 27 | /* Micro version is omitted if it's 0 */ | 
|---|
| 28 | #define JANSSON_VERSION  "2.5-dev" | 
|---|
| 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  ((JANSSON_MAJOR_VERSION << 16) |   \ | 
|---|
| 33 | (JANSSON_MINOR_VERSION << 8)  |   \ | 
|---|
| 34 | (JANSSON_MICRO_VERSION << 0)) | 
|---|
| 35 |  | 
|---|
| 36 |  | 
|---|
| 37 | /* types */ | 
|---|
| 38 |  | 
|---|
| 39 | typedef enum { | 
|---|
| 40 | JSON_OBJECT, | 
|---|
| 41 | JSON_ARRAY, | 
|---|
| 42 | JSON_STRING, | 
|---|
| 43 | JSON_INTEGER, | 
|---|
| 44 | JSON_REAL, | 
|---|
| 45 | JSON_TRUE, | 
|---|
| 46 | JSON_FALSE, | 
|---|
| 47 | JSON_NULL | 
|---|
| 48 | } json_type; | 
|---|
| 49 |  | 
|---|
| 50 | typedef struct json_t { | 
|---|
| 51 | json_type type; | 
|---|
| 52 | size_t refcount; | 
|---|
| 53 | } json_t; | 
|---|
| 54 |  | 
|---|
| 55 | #ifndef JANSSON_USING_CMAKE /* disabled if using cmake */ | 
|---|
| 56 | #if JSON_INTEGER_IS_LONG_LONG | 
|---|
| 57 | #ifdef _WIN32 | 
|---|
| 58 | #define JSON_INTEGER_FORMAT "I64d" | 
|---|
| 59 | #else | 
|---|
| 60 | #define JSON_INTEGER_FORMAT "lld" | 
|---|
| 61 | #endif | 
|---|
| 62 | typedef long long json_int_t; | 
|---|
| 63 | #else | 
|---|
| 64 | #define JSON_INTEGER_FORMAT "ld" | 
|---|
| 65 | typedef long json_int_t; | 
|---|
| 66 | #endif /* JSON_INTEGER_IS_LONG_LONG */ | 
|---|
| 67 | #endif | 
|---|
| 68 |  | 
|---|
| 69 | #define json_typeof(json)      ((json)->type) | 
|---|
| 70 | #define json_is_object(json)   (json && json_typeof(json) == JSON_OBJECT) | 
|---|
| 71 | #define json_is_array(json)    (json && json_typeof(json) == JSON_ARRAY) | 
|---|
| 72 | #define json_is_string(json)   (json && json_typeof(json) == JSON_STRING) | 
|---|
| 73 | #define json_is_integer(json)  (json && json_typeof(json) == JSON_INTEGER) | 
|---|
| 74 | #define json_is_real(json)     (json && json_typeof(json) == JSON_REAL) | 
|---|
| 75 | #define json_is_number(json)   (json_is_integer(json) || json_is_real(json)) | 
|---|
| 76 | #define json_is_true(json)     (json && json_typeof(json) == JSON_TRUE) | 
|---|
| 77 | #define json_is_false(json)    (json && json_typeof(json) == JSON_FALSE) | 
|---|
| 78 | #define json_is_boolean(json)  (json_is_true(json) || json_is_false(json)) | 
|---|
| 79 | #define json_is_null(json)     (json && json_typeof(json) == JSON_NULL) | 
|---|
| 80 |  | 
|---|
| 81 | /* construction, destruction, reference counting */ | 
|---|
| 82 |  | 
|---|
| 83 | json_t *json_object(void); | 
|---|
| 84 | json_t *json_array(void); | 
|---|
| 85 | json_t *json_string(const char *value); | 
|---|
| 86 | json_t *json_string_nocheck(const char *value); | 
|---|
| 87 | json_t *json_integer(json_int_t value); | 
|---|
| 88 | json_t *json_real(double value); | 
|---|
| 89 | json_t *json_true(void); | 
|---|
| 90 | json_t *json_false(void); | 
|---|
| 91 | #define json_boolean(val)      ((val) ? json_true() : json_false()) | 
|---|
| 92 | json_t *json_null(void); | 
|---|
| 93 |  | 
|---|
| 94 | static JSON_INLINE | 
|---|
| 95 | json_t *json_incref(json_t *json) | 
|---|
| 96 | { | 
|---|
| 97 | if(json && json->refcount != (size_t)-1) | 
|---|
| 98 | ++json->refcount; | 
|---|
| 99 | return json; | 
|---|
| 100 | } | 
|---|
| 101 |  | 
|---|
| 102 | /* do not call json_delete directly */ | 
|---|
| 103 | void json_delete(json_t *json); | 
|---|
| 104 |  | 
|---|
| 105 | static JSON_INLINE | 
|---|
| 106 | void json_decref(json_t *json) | 
|---|
| 107 | { | 
|---|
| 108 | if(json && json->refcount != (size_t)-1 && --json->refcount == 0) | 
|---|
| 109 | json_delete(json); | 
|---|
| 110 | } | 
|---|
| 111 |  | 
|---|
| 112 |  | 
|---|
| 113 | /* error reporting */ | 
|---|
| 114 |  | 
|---|
| 115 | #define JSON_ERROR_TEXT_LENGTH    160 | 
|---|
| 116 | #define JSON_ERROR_SOURCE_LENGTH   80 | 
|---|
| 117 |  | 
|---|
| 118 | typedef struct { | 
|---|
| 119 | int line; | 
|---|
| 120 | int column; | 
|---|
| 121 | int position; | 
|---|
| 122 | char source[JSON_ERROR_SOURCE_LENGTH]; | 
|---|
| 123 | char text[JSON_ERROR_TEXT_LENGTH]; | 
|---|
| 124 | } json_error_t; | 
|---|
| 125 |  | 
|---|
| 126 |  | 
|---|
| 127 | /* getters, setters, manipulation */ | 
|---|
| 128 |  | 
|---|
| 129 | size_t json_object_size(const json_t *object); | 
|---|
| 130 | json_t *json_object_get(const json_t *object, const char *key); | 
|---|
| 131 | int json_object_set_new(json_t *object, const char *key, json_t *value); | 
|---|
| 132 | int json_object_set_new_nocheck(json_t *object, const char *key, json_t *value); | 
|---|
| 133 | int json_object_del(json_t *object, const char *key); | 
|---|
| 134 | int json_object_clear(json_t *object); | 
|---|
| 135 | int json_object_update(json_t *object, json_t *other); | 
|---|
| 136 | int json_object_update_existing(json_t *object, json_t *other); | 
|---|
| 137 | int json_object_update_missing(json_t *object, json_t *other); | 
|---|
| 138 | void *json_object_iter(json_t *object); | 
|---|
| 139 | void *json_object_iter_at(json_t *object, const char *key); | 
|---|
| 140 | void *json_object_key_to_iter(const char *key); | 
|---|
| 141 | void *json_object_iter_next(json_t *object, void *iter); | 
|---|
| 142 | const char *json_object_iter_key(void *iter); | 
|---|
| 143 | json_t *json_object_iter_value(void *iter); | 
|---|
| 144 | int json_object_iter_set_new(json_t *object, void *iter, json_t *value); | 
|---|
| 145 |  | 
|---|
| 146 | #define json_object_foreach(object, key, value) \ | 
|---|
| 147 | for(key = json_object_iter_key(json_object_iter(object)); \ | 
|---|
| 148 | key && (value = json_object_iter_value(json_object_key_to_iter(key))); \ | 
|---|
| 149 | key = json_object_iter_key(json_object_iter_next(object, json_object_key_to_iter(key)))) | 
|---|
| 150 |  | 
|---|
| 151 | #define json_array_foreach(array, index, value) \ | 
|---|
| 152 | for(index = 0; \ | 
|---|
| 153 | index < json_array_size(array) && (value = json_array_get(array, index)); \ | 
|---|
| 154 | index++) | 
|---|
| 155 |  | 
|---|
| 156 | static JSON_INLINE | 
|---|
| 157 | int json_object_set(json_t *object, const char *key, json_t *value) | 
|---|
| 158 | { | 
|---|
| 159 | return json_object_set_new(object, key, json_incref(value)); | 
|---|
| 160 | } | 
|---|
| 161 |  | 
|---|
| 162 | static JSON_INLINE | 
|---|
| 163 | int json_object_set_nocheck(json_t *object, const char *key, json_t *value) | 
|---|
| 164 | { | 
|---|
| 165 | return json_object_set_new_nocheck(object, key, json_incref(value)); | 
|---|
| 166 | } | 
|---|
| 167 |  | 
|---|
| 168 | static JSON_INLINE | 
|---|
| 169 | int json_object_iter_set(json_t *object, void *iter, json_t *value) | 
|---|
| 170 | { | 
|---|
| 171 | return json_object_iter_set_new(object, iter, json_incref(value)); | 
|---|
| 172 | } | 
|---|
| 173 |  | 
|---|
| 174 | size_t json_array_size(const json_t *array); | 
|---|
| 175 | json_t *json_array_get(const json_t *array, size_t index); | 
|---|
| 176 | int json_array_set_new(json_t *array, size_t index, json_t *value); | 
|---|
| 177 | int json_array_append_new(json_t *array, json_t *value); | 
|---|
| 178 | int json_array_insert_new(json_t *array, size_t index, json_t *value); | 
|---|
| 179 | int json_array_remove(json_t *array, size_t index); | 
|---|
| 180 | int json_array_clear(json_t *array); | 
|---|
| 181 | int json_array_extend(json_t *array, json_t *other); | 
|---|
| 182 |  | 
|---|
| 183 | static JSON_INLINE | 
|---|
| 184 | int json_array_set(json_t *array, size_t ind, json_t *value) | 
|---|
| 185 | { | 
|---|
| 186 | return json_array_set_new(array, ind, json_incref(value)); | 
|---|
| 187 | } | 
|---|
| 188 |  | 
|---|
| 189 | static JSON_INLINE | 
|---|
| 190 | int json_array_append(json_t *array, json_t *value) | 
|---|
| 191 | { | 
|---|
| 192 | return json_array_append_new(array, json_incref(value)); | 
|---|
| 193 | } | 
|---|
| 194 |  | 
|---|
| 195 | static JSON_INLINE | 
|---|
| 196 | int json_array_insert(json_t *array, size_t ind, json_t *value) | 
|---|
| 197 | { | 
|---|
| 198 | return json_array_insert_new(array, ind, json_incref(value)); | 
|---|
| 199 | } | 
|---|
| 200 |  | 
|---|
| 201 | const char *json_string_value(const json_t *string); | 
|---|
| 202 | json_int_t json_integer_value(const json_t *integer); | 
|---|
| 203 | double json_real_value(const json_t *real); | 
|---|
| 204 | double json_number_value(const json_t *json); | 
|---|
| 205 |  | 
|---|
| 206 | int json_string_set(json_t *string, const char *value); | 
|---|
| 207 | int json_string_set_nocheck(json_t *string, const char *value); | 
|---|
| 208 | int json_integer_set(json_t *integer, json_int_t value); | 
|---|
| 209 | int json_real_set(json_t *real, double value); | 
|---|
| 210 |  | 
|---|
| 211 |  | 
|---|
| 212 | /* pack, unpack */ | 
|---|
| 213 |  | 
|---|
| 214 | json_t *json_pack(const char *fmt, ...); | 
|---|
| 215 | json_t *json_pack_ex(json_error_t *error, size_t flags, const char *fmt, ...); | 
|---|
| 216 | json_t *json_vpack_ex(json_error_t *error, size_t flags, const char *fmt, va_list ap); | 
|---|
| 217 |  | 
|---|
| 218 | #define JSON_VALIDATE_ONLY  0x1 | 
|---|
| 219 | #define JSON_STRICT         0x2 | 
|---|
| 220 |  | 
|---|
| 221 | int json_unpack(json_t *root, const char *fmt, ...); | 
|---|
| 222 | int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...); | 
|---|
| 223 | int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, va_list ap); | 
|---|
| 224 |  | 
|---|
| 225 |  | 
|---|
| 226 | /* equality */ | 
|---|
| 227 |  | 
|---|
| 228 | int json_equal(json_t *value1, json_t *value2); | 
|---|
| 229 |  | 
|---|
| 230 |  | 
|---|
| 231 | /* copying */ | 
|---|
| 232 |  | 
|---|
| 233 | json_t *json_copy(json_t *value); | 
|---|
| 234 | json_t *json_deep_copy(json_t *value); | 
|---|
| 235 |  | 
|---|
| 236 |  | 
|---|
| 237 | /* decoding */ | 
|---|
| 238 |  | 
|---|
| 239 | #define JSON_REJECT_DUPLICATES 0x1 | 
|---|
| 240 | #define JSON_DISABLE_EOF_CHECK 0x2 | 
|---|
| 241 | #define JSON_DECODE_ANY        0x4 | 
|---|
| 242 |  | 
|---|
| 243 | typedef size_t (*json_load_callback_t)(void *buffer, size_t buflen, void *data); | 
|---|
| 244 |  | 
|---|
| 245 | json_t *json_loads(const char *input, size_t flags, json_error_t *error); | 
|---|
| 246 | json_t *json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error); | 
|---|
| 247 | json_t *json_loadf(FILE *input, size_t flags, json_error_t *error); | 
|---|
| 248 | json_t *json_load_file(const char *path, size_t flags, json_error_t *error); | 
|---|
| 249 | json_t *json_load_callback(json_load_callback_t callback, void *data, size_t flags, json_error_t *error); | 
|---|
| 250 |  | 
|---|
| 251 |  | 
|---|
| 252 | /* encoding */ | 
|---|
| 253 |  | 
|---|
| 254 | #define JSON_INDENT(n)      (n & 0x1F) | 
|---|
| 255 | #define JSON_COMPACT        0x20 | 
|---|
| 256 | #define JSON_ENSURE_ASCII   0x40 | 
|---|
| 257 | #define JSON_SORT_KEYS      0x80 | 
|---|
| 258 | #define JSON_PRESERVE_ORDER 0x100 | 
|---|
| 259 | #define JSON_ENCODE_ANY     0x200 | 
|---|
| 260 | #define JSON_ESCAPE_SLASH   0x400 | 
|---|
| 261 |  | 
|---|
| 262 | typedef int (*json_dump_callback_t)(const char *buffer, size_t size, void *data); | 
|---|
| 263 |  | 
|---|
| 264 | char *json_dumps(const json_t *json, size_t flags); | 
|---|
| 265 | int json_dumpf(const json_t *json, FILE *output, size_t flags); | 
|---|
| 266 | int json_dump_file(const json_t *json, const char *path, size_t flags); | 
|---|
| 267 | int json_dump_callback(const json_t *json, json_dump_callback_t callback, void *data, size_t flags); | 
|---|
| 268 |  | 
|---|
| 269 | /* custom memory allocation */ | 
|---|
| 270 |  | 
|---|
| 271 | typedef void *(*json_malloc_t)(size_t); | 
|---|
| 272 | typedef void (*json_free_t)(void *); | 
|---|
| 273 |  | 
|---|
| 274 | void json_set_alloc_funcs(json_malloc_t malloc_fn, json_free_t free_fn); | 
|---|
| 275 |  | 
|---|
| 276 | #ifdef __cplusplus | 
|---|
| 277 | } | 
|---|
| 278 | #endif | 
|---|
| 279 |  | 
|---|
| 280 | #endif | 
|---|
| 281 |  | 
|---|