LCOV - code coverage report
Current view: top level - usr/include - jansson.h (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 10 10 100.0 %
Date: 2024-04-21 15:09:00 Functions: 3 3 100.0 %

          Line data    Source code
       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 13
      25             : #define JANSSON_MICRO_VERSION 1
      26             : 
      27             : /* Micro version is omitted if it's 0 */
      28             : #define JANSSON_VERSION "2.13.1"
      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        1776 : static JSON_INLINE json_t *json_incref(json_t *json) {
     123        1776 :     if (json && json->refcount != (size_t)-1)
     124        1776 :         JSON_INTERNAL_INCREF(json);
     125        1776 :     return json;
     126             : }
     127             : 
     128             : /* do not call json_delete directly */
     129             : void json_delete(json_t *json);
     130             : 
     131      725489 : static JSON_INLINE void json_decref(json_t *json) {
     132      725489 :     if (json && json->refcount != (size_t)-1 && JSON_INTERNAL_DECREF(json) == 0)
     133      725489 :         json_delete(json);
     134      725489 : }
     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             : int json_object_set_new(json_t *object, const char *key, json_t *value);
     192             : int json_object_set_new_nocheck(json_t *object, const char *key, json_t *value);
     193             : int json_object_del(json_t *object, const char *key);
     194             : int json_object_clear(json_t *object);
     195             : int json_object_update(json_t *object, json_t *other);
     196             : int json_object_update_existing(json_t *object, json_t *other);
     197             : int json_object_update_missing(json_t *object, json_t *other);
     198             : int json_object_update_recursive(json_t *object, json_t *other);
     199             : void *json_object_iter(json_t *object);
     200             : void *json_object_iter_at(json_t *object, const char *key);
     201             : void *json_object_key_to_iter(const char *key);
     202             : void *json_object_iter_next(json_t *object, void *iter);
     203             : const char *json_object_iter_key(void *iter);
     204             : json_t *json_object_iter_value(void *iter);
     205             : int json_object_iter_set_new(json_t *object, void *iter, json_t *value);
     206             : 
     207             : #define json_object_foreach(object, key, value)                                          \
     208             :     for (key = json_object_iter_key(json_object_iter(object));                           \
     209             :          key && (value = json_object_iter_value(json_object_key_to_iter(key)));          \
     210             :          key = json_object_iter_key(                                                     \
     211             :              json_object_iter_next(object, json_object_key_to_iter(key))))
     212             : 
     213             : #define json_object_foreach_safe(object, n, key, value)                                  \
     214             :     for (key = json_object_iter_key(json_object_iter(object)),                           \
     215             :         n = json_object_iter_next(object, json_object_key_to_iter(key));                 \
     216             :          key && (value = json_object_iter_value(json_object_key_to_iter(key)));          \
     217             :          key = json_object_iter_key(n),                                                  \
     218             :         n = json_object_iter_next(object, json_object_key_to_iter(key)))
     219             : 
     220             : #define json_array_foreach(array, index, value)                                          \
     221             :     for (index = 0;                                                                      \
     222             :          index < json_array_size(array) && (value = json_array_get(array, index));       \
     223             :          index++)
     224             : 
     225        1776 : static JSON_INLINE int json_object_set(json_t *object, const char *key, json_t *value) {
     226        1776 :     return json_object_set_new(object, key, json_incref(value));
     227             : }
     228             : 
     229             : static JSON_INLINE int json_object_set_nocheck(json_t *object, const char *key,
     230             :                                                json_t *value) {
     231             :     return json_object_set_new_nocheck(object, key, json_incref(value));
     232             : }
     233             : 
     234             : static JSON_INLINE int json_object_iter_set(json_t *object, void *iter, json_t *value) {
     235             :     return json_object_iter_set_new(object, iter, json_incref(value));
     236             : }
     237             : 
     238             : static JSON_INLINE int json_object_update_new(json_t *object, json_t *other) {
     239             :     int ret = json_object_update(object, other);
     240             :     json_decref(other);
     241             :     return ret;
     242             : }
     243             : 
     244             : static JSON_INLINE int json_object_update_existing_new(json_t *object, json_t *other) {
     245             :     int ret = json_object_update_existing(object, other);
     246             :     json_decref(other);
     247             :     return ret;
     248             : }
     249             : 
     250             : static JSON_INLINE int json_object_update_missing_new(json_t *object, json_t *other) {
     251             :     int ret = json_object_update_missing(object, other);
     252             :     json_decref(other);
     253             :     return ret;
     254             : }
     255             : 
     256             : size_t json_array_size(const json_t *array);
     257             : json_t *json_array_get(const json_t *array, size_t index)
     258             :     JANSSON_ATTRS((warn_unused_result));
     259             : int json_array_set_new(json_t *array, size_t index, json_t *value);
     260             : int json_array_append_new(json_t *array, json_t *value);
     261             : int json_array_insert_new(json_t *array, size_t index, json_t *value);
     262             : int json_array_remove(json_t *array, size_t index);
     263             : int json_array_clear(json_t *array);
     264             : int json_array_extend(json_t *array, json_t *other);
     265             : 
     266             : static JSON_INLINE int json_array_set(json_t *array, size_t ind, json_t *value) {
     267             :     return json_array_set_new(array, ind, json_incref(value));
     268             : }
     269             : 
     270             : static JSON_INLINE int json_array_append(json_t *array, json_t *value) {
     271             :     return json_array_append_new(array, json_incref(value));
     272             : }
     273             : 
     274             : static JSON_INLINE int json_array_insert(json_t *array, size_t ind, json_t *value) {
     275             :     return json_array_insert_new(array, ind, json_incref(value));
     276             : }
     277             : 
     278             : const char *json_string_value(const json_t *string);
     279             : size_t json_string_length(const json_t *string);
     280             : json_int_t json_integer_value(const json_t *integer);
     281             : double json_real_value(const json_t *real);
     282             : double json_number_value(const json_t *json);
     283             : 
     284             : int json_string_set(json_t *string, const char *value);
     285             : int json_string_setn(json_t *string, const char *value, size_t len);
     286             : int json_string_set_nocheck(json_t *string, const char *value);
     287             : int json_string_setn_nocheck(json_t *string, const char *value, size_t len);
     288             : int json_integer_set(json_t *integer, json_int_t value);
     289             : int json_real_set(json_t *real, double value);
     290             : 
     291             : /* pack, unpack */
     292             : 
     293             : json_t *json_pack(const char *fmt, ...) JANSSON_ATTRS((warn_unused_result));
     294             : json_t *json_pack_ex(json_error_t *error, size_t flags, const char *fmt, ...)
     295             :     JANSSON_ATTRS((warn_unused_result));
     296             : json_t *json_vpack_ex(json_error_t *error, size_t flags, const char *fmt, va_list ap)
     297             :     JANSSON_ATTRS((warn_unused_result));
     298             : 
     299             : #define JSON_VALIDATE_ONLY 0x1
     300             : #define JSON_STRICT        0x2
     301             : 
     302             : int json_unpack(json_t *root, const char *fmt, ...);
     303             : int json_unpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt, ...);
     304             : int json_vunpack_ex(json_t *root, json_error_t *error, size_t flags, const char *fmt,
     305             :                     va_list ap);
     306             : 
     307             : /* sprintf */
     308             : 
     309             : json_t *json_sprintf(const char *fmt, ...)
     310             :     JANSSON_ATTRS((warn_unused_result, format(printf, 1, 2)));
     311             : json_t *json_vsprintf(const char *fmt, va_list ap)
     312             :     JANSSON_ATTRS((warn_unused_result, format(printf, 1, 0)));
     313             : 
     314             : /* equality */
     315             : 
     316             : int json_equal(const json_t *value1, const json_t *value2);
     317             : 
     318             : /* copying */
     319             : 
     320             : json_t *json_copy(json_t *value) JANSSON_ATTRS((warn_unused_result));
     321             : json_t *json_deep_copy(const json_t *value) JANSSON_ATTRS((warn_unused_result));
     322             : 
     323             : /* decoding */
     324             : 
     325             : #define JSON_REJECT_DUPLICATES  0x1
     326             : #define JSON_DISABLE_EOF_CHECK  0x2
     327             : #define JSON_DECODE_ANY         0x4
     328             : #define JSON_DECODE_INT_AS_REAL 0x8
     329             : #define JSON_ALLOW_NUL          0x10
     330             : 
     331             : typedef size_t (*json_load_callback_t)(void *buffer, size_t buflen, void *data);
     332             : 
     333             : json_t *json_loads(const char *input, size_t flags, json_error_t *error)
     334             :     JANSSON_ATTRS((warn_unused_result));
     335             : json_t *json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error)
     336             :     JANSSON_ATTRS((warn_unused_result));
     337             : json_t *json_loadf(FILE *input, size_t flags, json_error_t *error)
     338             :     JANSSON_ATTRS((warn_unused_result));
     339             : json_t *json_loadfd(int input, size_t flags, json_error_t *error)
     340             :     JANSSON_ATTRS((warn_unused_result));
     341             : json_t *json_load_file(const char *path, size_t flags, json_error_t *error)
     342             :     JANSSON_ATTRS((warn_unused_result));
     343             : json_t *json_load_callback(json_load_callback_t callback, void *data, size_t flags,
     344             :                            json_error_t *error) JANSSON_ATTRS((warn_unused_result));
     345             : 
     346             : /* encoding */
     347             : 
     348             : #define JSON_MAX_INDENT        0x1F
     349             : #define JSON_INDENT(n)         ((n)&JSON_MAX_INDENT)
     350             : #define JSON_COMPACT           0x20
     351             : #define JSON_ENSURE_ASCII      0x40
     352             : #define JSON_SORT_KEYS         0x80
     353             : #define JSON_PRESERVE_ORDER    0x100
     354             : #define JSON_ENCODE_ANY        0x200
     355             : #define JSON_ESCAPE_SLASH      0x400
     356             : #define JSON_REAL_PRECISION(n) (((n)&0x1F) << 11)
     357             : #define JSON_EMBED             0x10000
     358             : 
     359             : typedef int (*json_dump_callback_t)(const char *buffer, size_t size, void *data);
     360             : 
     361             : char *json_dumps(const json_t *json, size_t flags) JANSSON_ATTRS((warn_unused_result));
     362             : size_t json_dumpb(const json_t *json, char *buffer, size_t size, size_t flags);
     363             : int json_dumpf(const json_t *json, FILE *output, size_t flags);
     364             : int json_dumpfd(const json_t *json, int output, size_t flags);
     365             : int json_dump_file(const json_t *json, const char *path, size_t flags);
     366             : int json_dump_callback(const json_t *json, json_dump_callback_t callback, void *data,
     367             :                        size_t flags);
     368             : 
     369             : /* custom memory allocation */
     370             : 
     371             : typedef void *(*json_malloc_t)(size_t);
     372             : typedef void (*json_free_t)(void *);
     373             : 
     374             : void json_set_alloc_funcs(json_malloc_t malloc_fn, json_free_t free_fn);
     375             : void json_get_alloc_funcs(json_malloc_t *malloc_fn, json_free_t *free_fn);
     376             : 
     377             : /* runtime version checking */
     378             : 
     379             : const char *jansson_version_str(void);
     380             : int jansson_version_cmp(int major, int minor, int micro);
     381             : 
     382             : #ifdef __cplusplus
     383             : }
     384             : #endif
     385             : 
     386             : #endif

Generated by: LCOV version 1.14