"Fossies" - the Fresh Open Source Software Archive

Member "jansson-2.14/src/value.c" (19 Nov 2020, 25626 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 "value.c" 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 _GNU_SOURCE
    9 #define _GNU_SOURCE
   10 #endif
   11 
   12 #ifdef HAVE_CONFIG_H
   13 #include <jansson_private_config.h>
   14 #endif
   15 
   16 #include <math.h>
   17 #include <stddef.h>
   18 #include <stdlib.h>
   19 #include <string.h>
   20 
   21 #ifdef HAVE_STDINT_H
   22 #include <stdint.h>
   23 #endif
   24 
   25 #include "hashtable.h"
   26 #include "jansson.h"
   27 #include "jansson_private.h"
   28 #include "utf.h"
   29 
   30 /* Work around nonstandard isnan() and isinf() implementations */
   31 #ifndef isnan
   32 #ifndef __sun
   33 static JSON_INLINE int isnan(double x) { return x != x; }
   34 #endif
   35 #endif
   36 #ifndef isinf
   37 static JSON_INLINE int isinf(double x) { return !isnan(x) && isnan(x - x); }
   38 #endif
   39 
   40 json_t *do_deep_copy(const json_t *json, hashtable_t *parents);
   41 
   42 static JSON_INLINE void json_init(json_t *json, json_type type) {
   43     json->type = type;
   44     json->refcount = 1;
   45 }
   46 
   47 int jsonp_loop_check(hashtable_t *parents, const json_t *json, char *key, size_t key_size,
   48                      size_t *key_len_out) {
   49     size_t key_len = snprintf(key, key_size, "%p", json);
   50 
   51     if (key_len_out)
   52         *key_len_out = key_len;
   53 
   54     if (hashtable_get(parents, key, key_len))
   55         return -1;
   56 
   57     return hashtable_set(parents, key, key_len, json_null());
   58 }
   59 
   60 /*** object ***/
   61 
   62 extern volatile uint32_t hashtable_seed;
   63 
   64 json_t *json_object(void) {
   65     json_object_t *object = jsonp_malloc(sizeof(json_object_t));
   66     if (!object)
   67         return NULL;
   68 
   69     if (!hashtable_seed) {
   70         /* Autoseed */
   71         json_object_seed(0);
   72     }
   73 
   74     json_init(&object->json, JSON_OBJECT);
   75 
   76     if (hashtable_init(&object->hashtable)) {
   77         jsonp_free(object);
   78         return NULL;
   79     }
   80 
   81     return &object->json;
   82 }
   83 
   84 static void json_delete_object(json_object_t *object) {
   85     hashtable_close(&object->hashtable);
   86     jsonp_free(object);
   87 }
   88 
   89 size_t json_object_size(const json_t *json) {
   90     json_object_t *object;
   91 
   92     if (!json_is_object(json))
   93         return 0;
   94 
   95     object = json_to_object(json);
   96     return object->hashtable.size;
   97 }
   98 
   99 json_t *json_object_get(const json_t *json, const char *key) {
  100     if (!key)
  101         return NULL;
  102 
  103     return json_object_getn(json, key, strlen(key));
  104 }
  105 
  106 json_t *json_object_getn(const json_t *json, const char *key, size_t key_len) {
  107     json_object_t *object;
  108 
  109     if (!key || !json_is_object(json))
  110         return NULL;
  111 
  112     object = json_to_object(json);
  113     return hashtable_get(&object->hashtable, key, key_len);
  114 }
  115 
  116 int json_object_set_new_nocheck(json_t *json, const char *key, json_t *value) {
  117     if (!key) {
  118         json_decref(value);
  119         return -1;
  120     }
  121     return json_object_setn_new_nocheck(json, key, strlen(key), value);
  122 }
  123 
  124 int json_object_setn_new_nocheck(json_t *json, const char *key, size_t key_len,
  125                                  json_t *value) {
  126     json_object_t *object;
  127 
  128     if (!value)
  129         return -1;
  130 
  131     if (!key || !json_is_object(json) || json == value) {
  132         json_decref(value);
  133         return -1;
  134     }
  135     object = json_to_object(json);
  136 
  137     if (hashtable_set(&object->hashtable, key, key_len, value)) {
  138         json_decref(value);
  139         return -1;
  140     }
  141 
  142     return 0;
  143 }
  144 
  145 int json_object_set_new(json_t *json, const char *key, json_t *value) {
  146     if (!key) {
  147         json_decref(value);
  148         return -1;
  149     }
  150 
  151     return json_object_setn_new(json, key, strlen(key), value);
  152 }
  153 
  154 int json_object_setn_new(json_t *json, const char *key, size_t key_len, json_t *value) {
  155     if (!key || !utf8_check_string(key, key_len)) {
  156         json_decref(value);
  157         return -1;
  158     }
  159 
  160     return json_object_setn_new_nocheck(json, key, key_len, value);
  161 }
  162 
  163 int json_object_del(json_t *json, const char *key) {
  164     if (!key)
  165         return -1;
  166 
  167     return json_object_deln(json, key, strlen(key));
  168 }
  169 
  170 int json_object_deln(json_t *json, const char *key, size_t key_len) {
  171     json_object_t *object;
  172 
  173     if (!key || !json_is_object(json))
  174         return -1;
  175 
  176     object = json_to_object(json);
  177     return hashtable_del(&object->hashtable, key, key_len);
  178 }
  179 
  180 int json_object_clear(json_t *json) {
  181     json_object_t *object;
  182 
  183     if (!json_is_object(json))
  184         return -1;
  185 
  186     object = json_to_object(json);
  187     hashtable_clear(&object->hashtable);
  188 
  189     return 0;
  190 }
  191 
  192 int json_object_update(json_t *object, json_t *other) {
  193     const char *key;
  194     json_t *value;
  195 
  196     if (!json_is_object(object) || !json_is_object(other))
  197         return -1;
  198 
  199     json_object_foreach(other, key, value) {
  200         if (json_object_set_nocheck(object, key, value))
  201             return -1;
  202     }
  203 
  204     return 0;
  205 }
  206 
  207 int json_object_update_existing(json_t *object, json_t *other) {
  208     const char *key;
  209     size_t key_len;
  210     json_t *value;
  211 
  212     if (!json_is_object(object) || !json_is_object(other))
  213         return -1;
  214 
  215     json_object_keylen_foreach(other, key, key_len, value) {
  216         if (json_object_getn(object, key, key_len))
  217             json_object_setn_nocheck(object, key, key_len, value);
  218     }
  219 
  220     return 0;
  221 }
  222 
  223 int json_object_update_missing(json_t *object, json_t *other) {
  224     const char *key;
  225     json_t *value;
  226 
  227     if (!json_is_object(object) || !json_is_object(other))
  228         return -1;
  229 
  230     json_object_foreach(other, key, value) {
  231         if (!json_object_get(object, key))
  232             json_object_set_nocheck(object, key, value);
  233     }
  234 
  235     return 0;
  236 }
  237 
  238 int do_object_update_recursive(json_t *object, json_t *other, hashtable_t *parents) {
  239     const char *key;
  240     size_t key_len;
  241     json_t *value;
  242     char loop_key[LOOP_KEY_LEN];
  243     int res = 0;
  244     size_t loop_key_len;
  245 
  246     if (!json_is_object(object) || !json_is_object(other))
  247         return -1;
  248 
  249     if (jsonp_loop_check(parents, other, loop_key, sizeof(loop_key), &loop_key_len))
  250         return -1;
  251 
  252     json_object_keylen_foreach(other, key, key_len, value) {
  253         json_t *v = json_object_get(object, key);
  254 
  255         if (json_is_object(v) && json_is_object(value)) {
  256             if (do_object_update_recursive(v, value, parents)) {
  257                 res = -1;
  258                 break;
  259             }
  260         } else {
  261             if (json_object_setn_nocheck(object, key, key_len, value)) {
  262                 res = -1;
  263                 break;
  264             }
  265         }
  266     }
  267 
  268     hashtable_del(parents, loop_key, loop_key_len);
  269 
  270     return res;
  271 }
  272 
  273 int json_object_update_recursive(json_t *object, json_t *other) {
  274     int res;
  275     hashtable_t parents_set;
  276 
  277     if (hashtable_init(&parents_set))
  278         return -1;
  279     res = do_object_update_recursive(object, other, &parents_set);
  280     hashtable_close(&parents_set);
  281 
  282     return res;
  283 }
  284 
  285 void *json_object_iter(json_t *json) {
  286     json_object_t *object;
  287 
  288     if (!json_is_object(json))
  289         return NULL;
  290 
  291     object = json_to_object(json);
  292     return hashtable_iter(&object->hashtable);
  293 }
  294 
  295 void *json_object_iter_at(json_t *json, const char *key) {
  296     json_object_t *object;
  297 
  298     if (!key || !json_is_object(json))
  299         return NULL;
  300 
  301     object = json_to_object(json);
  302     return hashtable_iter_at(&object->hashtable, key, strlen(key));
  303 }
  304 
  305 void *json_object_iter_next(json_t *json, void *iter) {
  306     json_object_t *object;
  307 
  308     if (!json_is_object(json) || iter == NULL)
  309         return NULL;
  310 
  311     object = json_to_object(json);
  312     return hashtable_iter_next(&object->hashtable, iter);
  313 }
  314 
  315 const char *json_object_iter_key(void *iter) {
  316     if (!iter)
  317         return NULL;
  318 
  319     return hashtable_iter_key(iter);
  320 }
  321 
  322 size_t json_object_iter_key_len(void *iter) {
  323     if (!iter)
  324         return 0;
  325 
  326     return hashtable_iter_key_len(iter);
  327 }
  328 
  329 json_t *json_object_iter_value(void *iter) {
  330     if (!iter)
  331         return NULL;
  332 
  333     return (json_t *)hashtable_iter_value(iter);
  334 }
  335 
  336 int json_object_iter_set_new(json_t *json, void *iter, json_t *value) {
  337     if (!json_is_object(json) || !iter || !value) {
  338         json_decref(value);
  339         return -1;
  340     }
  341 
  342     hashtable_iter_set(iter, value);
  343     return 0;
  344 }
  345 
  346 void *json_object_key_to_iter(const char *key) {
  347     if (!key)
  348         return NULL;
  349 
  350     return hashtable_key_to_iter(key);
  351 }
  352 
  353 static int json_object_equal(const json_t *object1, const json_t *object2) {
  354     const char *key;
  355     const json_t *value1, *value2;
  356 
  357     if (json_object_size(object1) != json_object_size(object2))
  358         return 0;
  359 
  360     json_object_foreach((json_t *)object1, key, value1) {
  361         value2 = json_object_get(object2, key);
  362 
  363         if (!json_equal(value1, value2))
  364             return 0;
  365     }
  366 
  367     return 1;
  368 }
  369 
  370 static json_t *json_object_copy(json_t *object) {
  371     json_t *result;
  372 
  373     const char *key;
  374     json_t *value;
  375 
  376     result = json_object();
  377     if (!result)
  378         return NULL;
  379 
  380     json_object_foreach(object, key, value) json_object_set_nocheck(result, key, value);
  381 
  382     return result;
  383 }
  384 
  385 static json_t *json_object_deep_copy(const json_t *object, hashtable_t *parents) {
  386     json_t *result;
  387     void *iter;
  388     char loop_key[LOOP_KEY_LEN];
  389     size_t loop_key_len;
  390 
  391     if (jsonp_loop_check(parents, object, loop_key, sizeof(loop_key), &loop_key_len))
  392         return NULL;
  393 
  394     result = json_object();
  395     if (!result)
  396         goto out;
  397 
  398     /* Cannot use json_object_foreach because object has to be cast
  399        non-const */
  400     iter = json_object_iter((json_t *)object);
  401     while (iter) {
  402         const char *key;
  403         const json_t *value;
  404         key = json_object_iter_key(iter);
  405         value = json_object_iter_value(iter);
  406 
  407         if (json_object_set_new_nocheck(result, key, do_deep_copy(value, parents))) {
  408             json_decref(result);
  409             result = NULL;
  410             break;
  411         }
  412         iter = json_object_iter_next((json_t *)object, iter);
  413     }
  414 
  415 out:
  416     hashtable_del(parents, loop_key, loop_key_len);
  417 
  418     return result;
  419 }
  420 
  421 /*** array ***/
  422 
  423 json_t *json_array(void) {
  424     json_array_t *array = jsonp_malloc(sizeof(json_array_t));
  425     if (!array)
  426         return NULL;
  427     json_init(&array->json, JSON_ARRAY);
  428 
  429     array->entries = 0;
  430     array->size = 8;
  431 
  432     array->table = jsonp_malloc(array->size * sizeof(json_t *));
  433     if (!array->table) {
  434         jsonp_free(array);
  435         return NULL;
  436     }
  437 
  438     return &array->json;
  439 }
  440 
  441 static void json_delete_array(json_array_t *array) {
  442     size_t i;
  443 
  444     for (i = 0; i < array->entries; i++)
  445         json_decref(array->table[i]);
  446 
  447     jsonp_free(array->table);
  448     jsonp_free(array);
  449 }
  450 
  451 size_t json_array_size(const json_t *json) {
  452     if (!json_is_array(json))
  453         return 0;
  454 
  455     return json_to_array(json)->entries;
  456 }
  457 
  458 json_t *json_array_get(const json_t *json, size_t index) {
  459     json_array_t *array;
  460     if (!json_is_array(json))
  461         return NULL;
  462     array = json_to_array(json);
  463 
  464     if (index >= array->entries)
  465         return NULL;
  466 
  467     return array->table[index];
  468 }
  469 
  470 int json_array_set_new(json_t *json, size_t index, json_t *value) {
  471     json_array_t *array;
  472 
  473     if (!value)
  474         return -1;
  475 
  476     if (!json_is_array(json) || json == value) {
  477         json_decref(value);
  478         return -1;
  479     }
  480     array = json_to_array(json);
  481 
  482     if (index >= array->entries) {
  483         json_decref(value);
  484         return -1;
  485     }
  486 
  487     json_decref(array->table[index]);
  488     array->table[index] = value;
  489 
  490     return 0;
  491 }
  492 
  493 static void array_move(json_array_t *array, size_t dest, size_t src, size_t count) {
  494     memmove(&array->table[dest], &array->table[src], count * sizeof(json_t *));
  495 }
  496 
  497 static void array_copy(json_t **dest, size_t dpos, json_t **src, size_t spos,
  498                        size_t count) {
  499     memcpy(&dest[dpos], &src[spos], count * sizeof(json_t *));
  500 }
  501 
  502 static json_t **json_array_grow(json_array_t *array, size_t amount, int copy) {
  503     size_t new_size;
  504     json_t **old_table, **new_table;
  505 
  506     if (array->entries + amount <= array->size)
  507         return array->table;
  508 
  509     old_table = array->table;
  510 
  511     new_size = max(array->size + amount, array->size * 2);
  512     new_table = jsonp_malloc(new_size * sizeof(json_t *));
  513     if (!new_table)
  514         return NULL;
  515 
  516     array->size = new_size;
  517     array->table = new_table;
  518 
  519     if (copy) {
  520         array_copy(array->table, 0, old_table, 0, array->entries);
  521         jsonp_free(old_table);
  522         return array->table;
  523     }
  524 
  525     return old_table;
  526 }
  527 
  528 int json_array_append_new(json_t *json, json_t *value) {
  529     json_array_t *array;
  530 
  531     if (!value)
  532         return -1;
  533 
  534     if (!json_is_array(json) || json == value) {
  535         json_decref(value);
  536         return -1;
  537     }
  538     array = json_to_array(json);
  539 
  540     if (!json_array_grow(array, 1, 1)) {
  541         json_decref(value);
  542         return -1;
  543     }
  544 
  545     array->table[array->entries] = value;
  546     array->entries++;
  547 
  548     return 0;
  549 }
  550 
  551 int json_array_insert_new(json_t *json, size_t index, json_t *value) {
  552     json_array_t *array;
  553     json_t **old_table;
  554 
  555     if (!value)
  556         return -1;
  557 
  558     if (!json_is_array(json) || json == value) {
  559         json_decref(value);
  560         return -1;
  561     }
  562     array = json_to_array(json);
  563 
  564     if (index > array->entries) {
  565         json_decref(value);
  566         return -1;
  567     }
  568 
  569     old_table = json_array_grow(array, 1, 0);
  570     if (!old_table) {
  571         json_decref(value);
  572         return -1;
  573     }
  574 
  575     if (old_table != array->table) {
  576         array_copy(array->table, 0, old_table, 0, index);
  577         array_copy(array->table, index + 1, old_table, index, array->entries - index);
  578         jsonp_free(old_table);
  579     } else
  580         array_move(array, index + 1, index, array->entries - index);
  581 
  582     array->table[index] = value;
  583     array->entries++;
  584 
  585     return 0;
  586 }
  587 
  588 int json_array_remove(json_t *json, size_t index) {
  589     json_array_t *array;
  590 
  591     if (!json_is_array(json))
  592         return -1;
  593     array = json_to_array(json);
  594 
  595     if (index >= array->entries)
  596         return -1;
  597 
  598     json_decref(array->table[index]);
  599 
  600     /* If we're removing the last element, nothing has to be moved */
  601     if (index < array->entries - 1)
  602         array_move(array, index, index + 1, array->entries - index - 1);
  603 
  604     array->entries--;
  605 
  606     return 0;
  607 }
  608 
  609 int json_array_clear(json_t *json) {
  610     json_array_t *array;
  611     size_t i;
  612 
  613     if (!json_is_array(json))
  614         return -1;
  615     array = json_to_array(json);
  616 
  617     for (i = 0; i < array->entries; i++)
  618         json_decref(array->table[i]);
  619 
  620     array->entries = 0;
  621     return 0;
  622 }
  623 
  624 int json_array_extend(json_t *json, json_t *other_json) {
  625     json_array_t *array, *other;
  626     size_t i;
  627 
  628     if (!json_is_array(json) || !json_is_array(other_json))
  629         return -1;
  630     array = json_to_array(json);
  631     other = json_to_array(other_json);
  632 
  633     if (!json_array_grow(array, other->entries, 1))
  634         return -1;
  635 
  636     for (i = 0; i < other->entries; i++)
  637         json_incref(other->table[i]);
  638 
  639     array_copy(array->table, array->entries, other->table, 0, other->entries);
  640 
  641     array->entries += other->entries;
  642     return 0;
  643 }
  644 
  645 static int json_array_equal(const json_t *array1, const json_t *array2) {
  646     size_t i, size;
  647 
  648     size = json_array_size(array1);
  649     if (size != json_array_size(array2))
  650         return 0;
  651 
  652     for (i = 0; i < size; i++) {
  653         json_t *value1, *value2;
  654 
  655         value1 = json_array_get(array1, i);
  656         value2 = json_array_get(array2, i);
  657 
  658         if (!json_equal(value1, value2))
  659             return 0;
  660     }
  661 
  662     return 1;
  663 }
  664 
  665 static json_t *json_array_copy(json_t *array) {
  666     json_t *result;
  667     size_t i;
  668 
  669     result = json_array();
  670     if (!result)
  671         return NULL;
  672 
  673     for (i = 0; i < json_array_size(array); i++)
  674         json_array_append(result, json_array_get(array, i));
  675 
  676     return result;
  677 }
  678 
  679 static json_t *json_array_deep_copy(const json_t *array, hashtable_t *parents) {
  680     json_t *result;
  681     size_t i;
  682     char loop_key[LOOP_KEY_LEN];
  683     size_t loop_key_len;
  684 
  685     if (jsonp_loop_check(parents, array, loop_key, sizeof(loop_key), &loop_key_len))
  686         return NULL;
  687 
  688     result = json_array();
  689     if (!result)
  690         goto out;
  691 
  692     for (i = 0; i < json_array_size(array); i++) {
  693         if (json_array_append_new(result,
  694                                   do_deep_copy(json_array_get(array, i), parents))) {
  695             json_decref(result);
  696             result = NULL;
  697             break;
  698         }
  699     }
  700 
  701 out:
  702     hashtable_del(parents, loop_key, loop_key_len);
  703 
  704     return result;
  705 }
  706 
  707 /*** string ***/
  708 
  709 static json_t *string_create(const char *value, size_t len, int own) {
  710     char *v;
  711     json_string_t *string;
  712 
  713     if (!value)
  714         return NULL;
  715 
  716     if (own)
  717         v = (char *)value;
  718     else {
  719         v = jsonp_strndup(value, len);
  720         if (!v)
  721             return NULL;
  722     }
  723 
  724     string = jsonp_malloc(sizeof(json_string_t));
  725     if (!string) {
  726         jsonp_free(v);
  727         return NULL;
  728     }
  729     json_init(&string->json, JSON_STRING);
  730     string->value = v;
  731     string->length = len;
  732 
  733     return &string->json;
  734 }
  735 
  736 json_t *json_string_nocheck(const char *value) {
  737     if (!value)
  738         return NULL;
  739 
  740     return string_create(value, strlen(value), 0);
  741 }
  742 
  743 json_t *json_stringn_nocheck(const char *value, size_t len) {
  744     return string_create(value, len, 0);
  745 }
  746 
  747 /* this is private; "steal" is not a public API concept */
  748 json_t *jsonp_stringn_nocheck_own(const char *value, size_t len) {
  749     return string_create(value, len, 1);
  750 }
  751 
  752 json_t *json_string(const char *value) {
  753     if (!value)
  754         return NULL;
  755 
  756     return json_stringn(value, strlen(value));
  757 }
  758 
  759 json_t *json_stringn(const char *value, size_t len) {
  760     if (!value || !utf8_check_string(value, len))
  761         return NULL;
  762 
  763     return json_stringn_nocheck(value, len);
  764 }
  765 
  766 const char *json_string_value(const json_t *json) {
  767     if (!json_is_string(json))
  768         return NULL;
  769 
  770     return json_to_string(json)->value;
  771 }
  772 
  773 size_t json_string_length(const json_t *json) {
  774     if (!json_is_string(json))
  775         return 0;
  776 
  777     return json_to_string(json)->length;
  778 }
  779 
  780 int json_string_set_nocheck(json_t *json, const char *value) {
  781     if (!value)
  782         return -1;
  783 
  784     return json_string_setn_nocheck(json, value, strlen(value));
  785 }
  786 
  787 int json_string_setn_nocheck(json_t *json, const char *value, size_t len) {
  788     char *dup;
  789     json_string_t *string;
  790 
  791     if (!json_is_string(json) || !value)
  792         return -1;
  793 
  794     dup = jsonp_strndup(value, len);
  795     if (!dup)
  796         return -1;
  797 
  798     string = json_to_string(json);
  799     jsonp_free(string->value);
  800     string->value = dup;
  801     string->length = len;
  802 
  803     return 0;
  804 }
  805 
  806 int json_string_set(json_t *json, const char *value) {
  807     if (!value)
  808         return -1;
  809 
  810     return json_string_setn(json, value, strlen(value));
  811 }
  812 
  813 int json_string_setn(json_t *json, const char *value, size_t len) {
  814     if (!value || !utf8_check_string(value, len))
  815         return -1;
  816 
  817     return json_string_setn_nocheck(json, value, len);
  818 }
  819 
  820 static void json_delete_string(json_string_t *string) {
  821     jsonp_free(string->value);
  822     jsonp_free(string);
  823 }
  824 
  825 static int json_string_equal(const json_t *string1, const json_t *string2) {
  826     json_string_t *s1, *s2;
  827 
  828     s1 = json_to_string(string1);
  829     s2 = json_to_string(string2);
  830     return s1->length == s2->length && !memcmp(s1->value, s2->value, s1->length);
  831 }
  832 
  833 static json_t *json_string_copy(const json_t *string) {
  834     json_string_t *s;
  835 
  836     s = json_to_string(string);
  837     return json_stringn_nocheck(s->value, s->length);
  838 }
  839 
  840 json_t *json_vsprintf(const char *fmt, va_list ap) {
  841     json_t *json = NULL;
  842     int length;
  843     char *buf;
  844     va_list aq;
  845     va_copy(aq, ap);
  846 
  847     length = vsnprintf(NULL, 0, fmt, ap);
  848     if (length < 0)
  849         goto out;
  850     if (length == 0) {
  851         json = json_string("");
  852         goto out;
  853     }
  854 
  855     buf = jsonp_malloc((size_t)length + 1);
  856     if (!buf)
  857         goto out;
  858 
  859     vsnprintf(buf, (size_t)length + 1, fmt, aq);
  860     if (!utf8_check_string(buf, length)) {
  861         jsonp_free(buf);
  862         goto out;
  863     }
  864 
  865     json = jsonp_stringn_nocheck_own(buf, length);
  866 
  867 out:
  868     va_end(aq);
  869     return json;
  870 }
  871 
  872 json_t *json_sprintf(const char *fmt, ...) {
  873     json_t *result;
  874     va_list ap;
  875 
  876     va_start(ap, fmt);
  877     result = json_vsprintf(fmt, ap);
  878     va_end(ap);
  879 
  880     return result;
  881 }
  882 
  883 /*** integer ***/
  884 
  885 json_t *json_integer(json_int_t value) {
  886     json_integer_t *integer = jsonp_malloc(sizeof(json_integer_t));
  887     if (!integer)
  888         return NULL;
  889     json_init(&integer->json, JSON_INTEGER);
  890 
  891     integer->value = value;
  892     return &integer->json;
  893 }
  894 
  895 json_int_t json_integer_value(const json_t *json) {
  896     if (!json_is_integer(json))
  897         return 0;
  898 
  899     return json_to_integer(json)->value;
  900 }
  901 
  902 int json_integer_set(json_t *json, json_int_t value) {
  903     if (!json_is_integer(json))
  904         return -1;
  905 
  906     json_to_integer(json)->value = value;
  907 
  908     return 0;
  909 }
  910 
  911 static void json_delete_integer(json_integer_t *integer) { jsonp_free(integer); }
  912 
  913 static int json_integer_equal(const json_t *integer1, const json_t *integer2) {
  914     return json_integer_value(integer1) == json_integer_value(integer2);
  915 }
  916 
  917 static json_t *json_integer_copy(const json_t *integer) {
  918     return json_integer(json_integer_value(integer));
  919 }
  920 
  921 /*** real ***/
  922 
  923 json_t *json_real(double value) {
  924     json_real_t *real;
  925 
  926     if (isnan(value) || isinf(value))
  927         return NULL;
  928 
  929     real = jsonp_malloc(sizeof(json_real_t));
  930     if (!real)
  931         return NULL;
  932     json_init(&real->json, JSON_REAL);
  933 
  934     real->value = value;
  935     return &real->json;
  936 }
  937 
  938 double json_real_value(const json_t *json) {
  939     if (!json_is_real(json))
  940         return 0;
  941 
  942     return json_to_real(json)->value;
  943 }
  944 
  945 int json_real_set(json_t *json, double value) {
  946     if (!json_is_real(json) || isnan(value) || isinf(value))
  947         return -1;
  948 
  949     json_to_real(json)->value = value;
  950 
  951     return 0;
  952 }
  953 
  954 static void json_delete_real(json_real_t *real) { jsonp_free(real); }
  955 
  956 static int json_real_equal(const json_t *real1, const json_t *real2) {
  957     return json_real_value(real1) == json_real_value(real2);
  958 }
  959 
  960 static json_t *json_real_copy(const json_t *real) {
  961     return json_real(json_real_value(real));
  962 }
  963 
  964 /*** number ***/
  965 
  966 double json_number_value(const json_t *json) {
  967     if (json_is_integer(json))
  968         return (double)json_integer_value(json);
  969     else if (json_is_real(json))
  970         return json_real_value(json);
  971     else
  972         return 0.0;
  973 }
  974 
  975 /*** simple values ***/
  976 
  977 json_t *json_true(void) {
  978     static json_t the_true = {JSON_TRUE, (size_t)-1};
  979     return &the_true;
  980 }
  981 
  982 json_t *json_false(void) {
  983     static json_t the_false = {JSON_FALSE, (size_t)-1};
  984     return &the_false;
  985 }
  986 
  987 json_t *json_null(void) {
  988     static json_t the_null = {JSON_NULL, (size_t)-1};
  989     return &the_null;
  990 }
  991 
  992 /*** deletion ***/
  993 
  994 void json_delete(json_t *json) {
  995     if (!json)
  996         return;
  997 
  998     switch (json_typeof(json)) {
  999         case JSON_OBJECT:
 1000             json_delete_object(json_to_object(json));
 1001             break;
 1002         case JSON_ARRAY:
 1003             json_delete_array(json_to_array(json));
 1004             break;
 1005         case JSON_STRING:
 1006             json_delete_string(json_to_string(json));
 1007             break;
 1008         case JSON_INTEGER:
 1009             json_delete_integer(json_to_integer(json));
 1010             break;
 1011         case JSON_REAL:
 1012             json_delete_real(json_to_real(json));
 1013             break;
 1014         default:
 1015             return;
 1016     }
 1017 
 1018     /* json_delete is not called for true, false or null */
 1019 }
 1020 
 1021 /*** equality ***/
 1022 
 1023 int json_equal(const json_t *json1, const json_t *json2) {
 1024     if (!json1 || !json2)
 1025         return 0;
 1026 
 1027     if (json_typeof(json1) != json_typeof(json2))
 1028         return 0;
 1029 
 1030     /* this covers true, false and null as they are singletons */
 1031     if (json1 == json2)
 1032         return 1;
 1033 
 1034     switch (json_typeof(json1)) {
 1035         case JSON_OBJECT:
 1036             return json_object_equal(json1, json2);
 1037         case JSON_ARRAY:
 1038             return json_array_equal(json1, json2);
 1039         case JSON_STRING:
 1040             return json_string_equal(json1, json2);
 1041         case JSON_INTEGER:
 1042             return json_integer_equal(json1, json2);
 1043         case JSON_REAL:
 1044             return json_real_equal(json1, json2);
 1045         default:
 1046             return 0;
 1047     }
 1048 }
 1049 
 1050 /*** copying ***/
 1051 
 1052 json_t *json_copy(json_t *json) {
 1053     if (!json)
 1054         return NULL;
 1055 
 1056     switch (json_typeof(json)) {
 1057         case JSON_OBJECT:
 1058             return json_object_copy(json);
 1059         case JSON_ARRAY:
 1060             return json_array_copy(json);
 1061         case JSON_STRING:
 1062             return json_string_copy(json);
 1063         case JSON_INTEGER:
 1064             return json_integer_copy(json);
 1065         case JSON_REAL:
 1066             return json_real_copy(json);
 1067         case JSON_TRUE:
 1068         case JSON_FALSE:
 1069         case JSON_NULL:
 1070             return json;
 1071         default:
 1072             return NULL;
 1073     }
 1074 }
 1075 
 1076 json_t *json_deep_copy(const json_t *json) {
 1077     json_t *res;
 1078     hashtable_t parents_set;
 1079 
 1080     if (hashtable_init(&parents_set))
 1081         return NULL;
 1082     res = do_deep_copy(json, &parents_set);
 1083     hashtable_close(&parents_set);
 1084 
 1085     return res;
 1086 }
 1087 
 1088 json_t *do_deep_copy(const json_t *json, hashtable_t *parents) {
 1089     if (!json)
 1090         return NULL;
 1091 
 1092     switch (json_typeof(json)) {
 1093         case JSON_OBJECT:
 1094             return json_object_deep_copy(json, parents);
 1095         case JSON_ARRAY:
 1096             return json_array_deep_copy(json, parents);
 1097             /* for the rest of the types, deep copying doesn't differ from
 1098                shallow copying */
 1099         case JSON_STRING:
 1100             return json_string_copy(json);
 1101         case JSON_INTEGER:
 1102             return json_integer_copy(json);
 1103         case JSON_REAL:
 1104             return json_real_copy(json);
 1105         case JSON_TRUE:
 1106         case JSON_FALSE:
 1107         case JSON_NULL:
 1108             return (json_t *)json;
 1109         default:
 1110             return NULL;
 1111     }
 1112 }