9 #define container_of(ptr_, type_, member_) \
10 ((type_ *)((char *)ptr_ - (size_t)&((type_ *)0)->member_))
14 hashtable_t hashtable;
39 #define json_to_object(json_) container_of(json_, json_object_t, json)
40 #define json_to_array(json_) container_of(json_, json_array_t, json)
41 #define json_to_string(json_) container_of(json_, json_string_t, json)
42 #define json_to_real(json_) container_of(json_, json_real_t, json)
43 #define json_to_integer(json_) container_of(json_, json_integer_t, json)
45 static inline void json_init(json_t *json, json_type type)
54 static unsigned int hash_string(const void *key)
56 const char *str = (const char *)key;
57 unsigned int hash = 5381;
60 while((c = (unsigned int)*str))
62 hash = ((hash << 5) + hash) + c;
69 static int string_equal(const void *key1, const void *key2)
71 return strcmp((const char *)key1, (const char *)key2) == 0;
74 static void value_decref(void *value)
76 json_decref((json_t *)value);
79 json_t *json_object(void)
81 json_object_t *object = malloc(sizeof(json_object_t));
84 json_init(&object->json, JSON_OBJECT);
86 if(hashtable_init(&object->hashtable, hash_string, string_equal,
95 static void json_delete_object(json_object_t *object)
97 hashtable_close(&object->hashtable);
101 json_t *json_object_get(const json_t *json, const char *key)
103 json_object_t *object;
105 if(!json_is_object(json))
108 object = json_to_object(json);
109 return hashtable_get(&object->hashtable, key);
112 int json_object_set(json_t *json, const char *key, json_t *value)
114 json_object_t *object;
116 if(!json_is_object(json))
119 object = json_to_object(json);
120 return hashtable_set(&object->hashtable, strdup(key), json_incref(value));
123 int json_object_del(json_t *json, const char *key)
125 json_object_t *object;
127 if(!json_is_object(json))
130 object = json_to_object(json);
131 return hashtable_del(&object->hashtable, key);
134 void *json_object_iter(json_t *json)
136 json_object_t *object;
138 if(!json_is_object(json))
141 object = json_to_object(json);
142 return hashtable_iter(&object->hashtable);
145 void *json_object_iter_next(json_t *json, void *iter)
147 json_object_t *object;
149 if(!json_is_object(json) || iter == NULL)
152 object = json_to_object(json);
153 return hashtable_iter_next(&object->hashtable, iter);
156 const char *json_object_iter_key(void *iter)
161 return (const char *)hashtable_iter_key(iter);
164 json_t *json_object_iter_value(void *iter)
169 return (json_t *)hashtable_iter_value(iter);
175 json_t *json_array(void)
177 json_array_t *array = malloc(sizeof(json_array_t));
180 json_init(&array->json, JSON_ARRAY);
189 static void json_delete_array(json_array_t *array)
193 for(i = 0; i < array->entries; i++)
194 json_decref(array->table[i]);
200 unsigned int json_array_size(const json_t *json)
202 if(!json_is_array(json))
205 return json_to_array(json)->entries;
208 json_t *json_array_get(const json_t *json, unsigned int index)
211 if(!json_is_array(json))
213 array = json_to_array(json);
215 if(index >= array->size)
218 return array->table[index];
221 int json_array_set(json_t *json, unsigned int index, json_t *value)
224 if(!json_is_array(json))
226 array = json_to_array(json);
228 if(index >= array->size)
231 array->table[index] = json_incref(value);
235 int json_array_append(json_t *json, json_t *value)
238 if(!json_is_array(json))
240 array = json_to_array(json);
242 if(array->entries == array->size) {
243 array->size = max(8, array->size * 2);
244 array->table = realloc(array->table, array->size * sizeof(json_t *));
249 array->table[array->entries] = json_incref(value);
258 json_t *json_string(const char *value)
260 json_string_t *string = malloc(sizeof(json_string_t));
263 json_init(&string->json, JSON_STRING);
265 string->value = strdup(value);
266 return &string->json;
269 const char *json_string_value(const json_t *json)
271 if(!json_is_string(json))
274 return json_to_string(json)->value;
277 static void json_delete_string(json_string_t *string)
286 json_t *json_integer(int value)
288 json_integer_t *integer = malloc(sizeof(json_integer_t));
291 json_init(&integer->json, JSON_INTEGER);
293 integer->value = value;
294 return &integer->json;
297 int json_integer_value(const json_t *json)
299 if(!json_is_integer(json))
302 return json_to_integer(json)->value;
305 static void json_delete_integer(json_integer_t *integer)
313 json_t *json_real(double value)
315 json_real_t *real = malloc(sizeof(json_real_t));
318 json_init(&real->json, JSON_REAL);
324 double json_real_value(const json_t *json)
326 if(!json_is_real(json))
329 return json_to_real(json)->value;
332 static void json_delete_real (json_real_t *real)
340 double json_number_value(const json_t *json)
342 if(json_is_integer(json))
343 return json_integer_value(json);
344 else if(json_is_real(json))
345 return json_real_value(json);
351 /*** simple values ***/
353 json_t *json_true(void)
355 static json_t the_true = {
359 return json_incref(&the_true);
363 json_t *json_false(void)
365 static json_t the_false = {
369 return json_incref(&the_false);
373 json_t *json_null(void)
375 static json_t the_null = {
379 return json_incref(&the_null);
385 void json_delete(json_t *json)
387 if(json_is_object(json))
388 json_delete_object(json_to_object(json));
390 else if(json_is_array(json))
391 json_delete_array(json_to_array(json));
393 else if(json_is_string(json))
394 json_delete_string(json_to_string(json));
396 else if(json_is_integer(json))
397 json_delete_integer(json_to_integer(json));
399 else if(json_is_real(json))
400 json_delete_real(json_to_real(json));
402 /* json_delete is not called for true, false or null */