2 * Copyright (c) 2009-2011 Petri Lehtinen <petri@digip.org>
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.
15 #include "hashtable.h"
16 #include "jansson_private.h"
20 static JSON_INLINE void json_init(json_t *json, json_type type)
29 json_t *json_object(void)
31 json_object_t *object = jsonp_malloc(sizeof(json_object_t));
34 json_init(&object->json, JSON_OBJECT);
36 if(hashtable_init(&object->hashtable))
48 static void json_delete_object(json_object_t *object)
50 hashtable_close(&object->hashtable);
54 size_t json_object_size(const json_t *json)
56 json_object_t *object;
58 if(!json_is_object(json))
61 object = json_to_object(json);
62 return object->hashtable.size;
65 json_t *json_object_get(const json_t *json, const char *key)
67 json_object_t *object;
69 if(!json_is_object(json))
72 object = json_to_object(json);
73 return hashtable_get(&object->hashtable, key);
76 int json_object_set_new_nocheck(json_t *json, const char *key, json_t *value)
78 json_object_t *object;
83 if(!key || !json_is_object(json) || json == value)
88 object = json_to_object(json);
90 if(hashtable_set(&object->hashtable, key, object->serial++, value))
99 int json_object_set_new(json_t *json, const char *key, json_t *value)
101 if(!key || !utf8_check_string(key, -1))
107 return json_object_set_new_nocheck(json, key, value);
110 int json_object_del(json_t *json, const char *key)
112 json_object_t *object;
114 if(!json_is_object(json))
117 object = json_to_object(json);
118 return hashtable_del(&object->hashtable, key);
121 int json_object_clear(json_t *json)
123 json_object_t *object;
125 if(!json_is_object(json))
128 object = json_to_object(json);
130 hashtable_clear(&object->hashtable);
136 int json_object_update(json_t *object, json_t *other)
141 if(!json_is_object(object) || !json_is_object(other))
144 json_object_foreach(other, key, value) {
145 if(json_object_set_nocheck(object, key, value))
152 void *json_object_iter(json_t *json)
154 json_object_t *object;
156 if(!json_is_object(json))
159 object = json_to_object(json);
160 return hashtable_iter(&object->hashtable);
163 void *json_object_iter_at(json_t *json, const char *key)
165 json_object_t *object;
167 if(!key || !json_is_object(json))
170 object = json_to_object(json);
171 return hashtable_iter_at(&object->hashtable, key);
174 void *json_object_iter_next(json_t *json, void *iter)
176 json_object_t *object;
178 if(!json_is_object(json) || iter == NULL)
181 object = json_to_object(json);
182 return hashtable_iter_next(&object->hashtable, iter);
185 const char *json_object_iter_key(void *iter)
190 return hashtable_iter_key(iter);
193 json_t *json_object_iter_value(void *iter)
198 return (json_t *)hashtable_iter_value(iter);
201 int json_object_iter_set_new(json_t *json, void *iter, json_t *value)
203 if(!json_is_object(json) || !iter || !value)
206 hashtable_iter_set(iter, value);
210 void *json_object_key_to_iter(const char *key)
215 return hashtable_key_to_iter(key);
218 static int json_object_equal(json_t *object1, json_t *object2)
221 json_t *value1, *value2;
223 if(json_object_size(object1) != json_object_size(object2))
226 json_object_foreach(object1, key, value1) {
227 value2 = json_object_get(object2, key);
229 if(!json_equal(value1, value2))
236 static json_t *json_object_copy(json_t *object)
243 result = json_object();
247 json_object_foreach(object, key, value)
248 json_object_set_nocheck(result, key, value);
253 static json_t *json_object_deep_copy(json_t *object)
260 result = json_object();
264 json_object_foreach(object, key, value)
265 json_object_set_new_nocheck(result, key, json_deep_copy(value));
273 json_t *json_array(void)
275 json_array_t *array = jsonp_malloc(sizeof(json_array_t));
278 json_init(&array->json, JSON_ARRAY);
283 array->table = jsonp_malloc(array->size * sizeof(json_t *));
294 static void json_delete_array(json_array_t *array)
298 for(i = 0; i < array->entries; i++)
299 json_decref(array->table[i]);
301 jsonp_free(array->table);
305 size_t json_array_size(const json_t *json)
307 if(!json_is_array(json))
310 return json_to_array(json)->entries;
313 json_t *json_array_get(const json_t *json, size_t index)
316 if(!json_is_array(json))
318 array = json_to_array(json);
320 if(index >= array->entries)
323 return array->table[index];
326 int json_array_set_new(json_t *json, size_t index, json_t *value)
333 if(!json_is_array(json) || json == value)
338 array = json_to_array(json);
340 if(index >= array->entries)
346 json_decref(array->table[index]);
347 array->table[index] = value;
352 static void array_move(json_array_t *array, size_t dest,
353 size_t src, size_t count)
355 memmove(&array->table[dest], &array->table[src], count * sizeof(json_t *));
358 static void array_copy(json_t **dest, size_t dpos,
359 json_t **src, size_t spos,
362 memcpy(&dest[dpos], &src[spos], count * sizeof(json_t *));
365 static json_t **json_array_grow(json_array_t *array,
370 json_t **old_table, **new_table;
372 if(array->entries + amount <= array->size)
375 old_table = array->table;
377 new_size = max(array->size + amount, array->size * 2);
378 new_table = jsonp_malloc(new_size * sizeof(json_t *));
382 array->size = new_size;
383 array->table = new_table;
386 array_copy(array->table, 0, old_table, 0, array->entries);
387 jsonp_free(old_table);
394 int json_array_append_new(json_t *json, json_t *value)
401 if(!json_is_array(json) || json == value)
406 array = json_to_array(json);
408 if(!json_array_grow(array, 1, 1)) {
413 array->table[array->entries] = value;
419 int json_array_insert_new(json_t *json, size_t index, json_t *value)
427 if(!json_is_array(json) || json == value) {
431 array = json_to_array(json);
433 if(index > array->entries) {
438 old_table = json_array_grow(array, 1, 0);
444 if(old_table != array->table) {
445 array_copy(array->table, 0, old_table, 0, index);
446 array_copy(array->table, index + 1, old_table, index,
447 array->entries - index);
448 jsonp_free(old_table);
451 array_move(array, index + 1, index, array->entries - index);
453 array->table[index] = value;
459 int json_array_remove(json_t *json, size_t index)
463 if(!json_is_array(json))
465 array = json_to_array(json);
467 if(index >= array->entries)
470 json_decref(array->table[index]);
472 array_move(array, index, index + 1, array->entries - index);
478 int json_array_clear(json_t *json)
483 if(!json_is_array(json))
485 array = json_to_array(json);
487 for(i = 0; i < array->entries; i++)
488 json_decref(array->table[i]);
494 int json_array_extend(json_t *json, json_t *other_json)
496 json_array_t *array, *other;
499 if(!json_is_array(json) || !json_is_array(other_json))
501 array = json_to_array(json);
502 other = json_to_array(other_json);
504 if(!json_array_grow(array, other->entries, 1))
507 for(i = 0; i < other->entries; i++)
508 json_incref(other->table[i]);
510 array_copy(array->table, array->entries, other->table, 0, other->entries);
512 array->entries += other->entries;
516 static int json_array_equal(json_t *array1, json_t *array2)
520 size = json_array_size(array1);
521 if(size != json_array_size(array2))
524 for(i = 0; i < size; i++)
526 json_t *value1, *value2;
528 value1 = json_array_get(array1, i);
529 value2 = json_array_get(array2, i);
531 if(!json_equal(value1, value2))
538 static json_t *json_array_copy(json_t *array)
543 result = json_array();
547 for(i = 0; i < json_array_size(array); i++)
548 json_array_append(result, json_array_get(array, i));
553 static json_t *json_array_deep_copy(json_t *array)
558 result = json_array();
562 for(i = 0; i < json_array_size(array); i++)
563 json_array_append_new(result, json_deep_copy(json_array_get(array, i)));
570 json_t *json_string_nocheck(const char *value)
572 json_string_t *string;
577 string = jsonp_malloc(sizeof(json_string_t));
580 json_init(&string->json, JSON_STRING);
582 string->value = jsonp_strdup(value);
588 return &string->json;
591 json_t *json_string(const char *value)
593 if(!value || !utf8_check_string(value, -1))
596 return json_string_nocheck(value);
599 const char *json_string_value(const json_t *json)
601 if(!json_is_string(json))
604 return json_to_string(json)->value;
607 int json_string_set_nocheck(json_t *json, const char *value)
610 json_string_t *string;
612 if(!json_is_string(json) || !value)
615 dup = jsonp_strdup(value);
619 string = json_to_string(json);
620 jsonp_free(string->value);
626 int json_string_set(json_t *json, const char *value)
628 if(!value || !utf8_check_string(value, -1))
631 return json_string_set_nocheck(json, value);
634 static void json_delete_string(json_string_t *string)
636 jsonp_free(string->value);
640 static int json_string_equal(json_t *string1, json_t *string2)
642 return strcmp(json_string_value(string1), json_string_value(string2)) == 0;
645 static json_t *json_string_copy(json_t *string)
647 return json_string_nocheck(json_string_value(string));
653 json_t *json_integer(json_int_t value)
655 json_integer_t *integer = jsonp_malloc(sizeof(json_integer_t));
658 json_init(&integer->json, JSON_INTEGER);
660 integer->value = value;
661 return &integer->json;
664 json_int_t json_integer_value(const json_t *json)
666 if(!json_is_integer(json))
669 return json_to_integer(json)->value;
672 int json_integer_set(json_t *json, json_int_t value)
674 if(!json_is_integer(json))
677 json_to_integer(json)->value = value;
682 static void json_delete_integer(json_integer_t *integer)
687 static int json_integer_equal(json_t *integer1, json_t *integer2)
689 return json_integer_value(integer1) == json_integer_value(integer2);
692 static json_t *json_integer_copy(json_t *integer)
694 return json_integer(json_integer_value(integer));
700 json_t *json_real(double value)
702 json_real_t *real = jsonp_malloc(sizeof(json_real_t));
705 json_init(&real->json, JSON_REAL);
711 double json_real_value(const json_t *json)
713 if(!json_is_real(json))
716 return json_to_real(json)->value;
719 int json_real_set(json_t *json, double value)
721 if(!json_is_real(json))
724 json_to_real(json)->value = value;
729 static void json_delete_real(json_real_t *real)
734 static int json_real_equal(json_t *real1, json_t *real2)
736 return json_real_value(real1) == json_real_value(real2);
739 static json_t *json_real_copy(json_t *real)
741 return json_real(json_real_value(real));
747 double json_number_value(const json_t *json)
749 if(json_is_integer(json))
750 return json_integer_value(json);
751 else if(json_is_real(json))
752 return json_real_value(json);
758 /*** simple values ***/
760 json_t *json_true(void)
762 static json_t the_true = {JSON_TRUE, (size_t)-1};
767 json_t *json_false(void)
769 static json_t the_false = {JSON_FALSE, (size_t)-1};
774 json_t *json_null(void)
776 static json_t the_null = {JSON_NULL, (size_t)-1};
783 void json_delete(json_t *json)
785 if(json_is_object(json))
786 json_delete_object(json_to_object(json));
788 else if(json_is_array(json))
789 json_delete_array(json_to_array(json));
791 else if(json_is_string(json))
792 json_delete_string(json_to_string(json));
794 else if(json_is_integer(json))
795 json_delete_integer(json_to_integer(json));
797 else if(json_is_real(json))
798 json_delete_real(json_to_real(json));
800 /* json_delete is not called for true, false or null */
806 int json_equal(json_t *json1, json_t *json2)
811 if(json_typeof(json1) != json_typeof(json2))
814 /* this covers true, false and null as they are singletons */
818 if(json_is_object(json1))
819 return json_object_equal(json1, json2);
821 if(json_is_array(json1))
822 return json_array_equal(json1, json2);
824 if(json_is_string(json1))
825 return json_string_equal(json1, json2);
827 if(json_is_integer(json1))
828 return json_integer_equal(json1, json2);
830 if(json_is_real(json1))
831 return json_real_equal(json1, json2);
839 json_t *json_copy(json_t *json)
844 if(json_is_object(json))
845 return json_object_copy(json);
847 if(json_is_array(json))
848 return json_array_copy(json);
850 if(json_is_string(json))
851 return json_string_copy(json);
853 if(json_is_integer(json))
854 return json_integer_copy(json);
856 if(json_is_real(json))
857 return json_real_copy(json);
859 if(json_is_true(json) || json_is_false(json) || json_is_null(json))
865 json_t *json_deep_copy(json_t *json)
870 if(json_is_object(json))
871 return json_object_deep_copy(json);
873 if(json_is_array(json))
874 return json_array_deep_copy(json);
876 /* for the rest of the types, deep copying doesn't differ from
879 if(json_is_string(json))
880 return json_string_copy(json);
882 if(json_is_integer(json))
883 return json_integer_copy(json);
885 if(json_is_real(json))
886 return json_real_copy(json);
888 if(json_is_true(json) || json_is_false(json) || json_is_null(json))