9 #define container_of(ptr_, type_, member_) \
10 ((type_ *)((char *)ptr_ - (size_t)&((type_ *)0)->member_))
14 hashtable_t hashtable;
34 #define json_to_object(json_) container_of(json_, json_object_t, json)
35 #define json_to_array(json_) container_of(json_, json_array_t, json)
36 #define json_to_string(json_) container_of(json_, json_string_t, json)
37 #define json_to_number(json_) container_of(json_, json_number_t, json)
39 static inline void json_init(json_t *json, json_type type)
48 static unsigned int hash_string(const void *key)
50 const char *str = (const char *)key;
51 unsigned int hash = 5381;
54 while((c = (unsigned int)*str))
56 hash = ((hash << 5) + hash) + c;
63 static int string_equal(const void *key1, const void *key2)
65 return strcmp((const char *)key1, (const char *)key2) == 0;
68 static void value_decref(void *value)
70 json_decref((json_t *)value);
73 json_t *json_object(void)
75 json_object_t *object = malloc(sizeof(json_object_t));
78 json_init(&object->json, JSON_OBJECT);
80 if(hashtable_init(&object->hashtable, hash_string, string_equal,
89 static void json_delete_object(json_object_t *object)
91 hashtable_close(&object->hashtable);
95 json_t *json_object_get(const json_t *json, const char *key)
97 json_object_t *object;
99 if(!json_is_object(json))
102 object = json_to_object(json);
103 return hashtable_get(&object->hashtable, key);
106 int json_object_set(json_t *json, const char *key, json_t *value)
108 json_object_t *object;
110 if(!json_is_object(json))
113 object = json_to_object(json);
114 return hashtable_set(&object->hashtable, strdup(key), json_incref(value));
117 int json_object_del(json_t *json, const char *key)
119 json_object_t *object;
121 if(!json_is_object(json))
124 object = json_to_object(json);
125 return hashtable_del(&object->hashtable, key);
128 void *json_object_iter(json_t *json)
130 json_object_t *object;
132 if(!json_is_object(json))
135 object = json_to_object(json);
136 return hashtable_iter(&object->hashtable);
139 void *json_object_iter_next(json_t *json, void *iter)
141 json_object_t *object;
143 if(!json_is_object(json) || iter == NULL)
146 object = json_to_object(json);
147 return hashtable_iter_next(&object->hashtable, iter);
150 const char *json_object_iter_key(void *iter)
155 return (const char *)hashtable_iter_key(iter);
158 json_t *json_object_iter_value(void *iter)
163 return (json_t *)hashtable_iter_value(iter);
169 json_t *json_array(void)
171 json_array_t *array = malloc(sizeof(json_array_t));
174 json_init(&array->json, JSON_ARRAY);
183 static void json_delete_array(json_array_t *array)
187 for(i = 0; i < array->entries; i++)
188 json_decref(array->table[i]);
194 unsigned int json_array_size(const json_t *json)
196 if(!json_is_array(json))
199 return json_to_array(json)->entries;
202 json_t *json_array_get(const json_t *json, unsigned int index)
205 if(!json_is_array(json))
207 array = json_to_array(json);
209 if(index >= array->size)
212 return array->table[index];
215 int json_array_set(json_t *json, unsigned int index, json_t *value)
218 if(!json_is_array(json))
220 array = json_to_array(json);
222 if(index >= array->size)
225 array->table[index] = json_incref(value);
229 int json_array_append(json_t *json, json_t *value)
232 if(!json_is_array(json))
234 array = json_to_array(json);
236 if(array->entries == array->size) {
237 array->size = max(8, array->size * 2);
238 array->table = realloc(array->table, array->size * sizeof(json_t *));
243 array->table[array->entries] = json_incref(value);
252 json_t *json_string(const char *value)
254 json_string_t *string = malloc(sizeof(json_string_t));
257 json_init(&string->json, JSON_STRING);
259 string->value = strdup(value);
260 return &string->json;
263 const char *json_string_value(const json_t *json)
265 if(!json_is_string(json))
268 return json_to_string(json)->value;
271 static void json_delete_string(json_string_t *string)
277 json_t *json_number(double value)
279 json_number_t *number = malloc(sizeof(json_number_t));
282 json_init(&number->json, JSON_NUMBER);
284 number->value = value;
285 return &number->json;
291 double json_number_value(const json_t *json)
293 if(!json_is_number(json))
296 return json_to_number(json)->value;
299 static void json_delete_number(json_number_t *number)
305 /*** simple values ***/
307 json_t *json_true(void)
309 static json_t the_true = {
313 return json_incref(&the_true);
317 json_t *json_false(void)
319 static json_t the_false = {
323 return json_incref(&the_false);
327 json_t *json_null(void)
329 static json_t the_null = {
333 return json_incref(&the_null);
339 void json_delete(json_t *json)
341 if(json_is_object(json))
342 json_delete_object(json_to_object(json));
344 else if(json_is_array(json))
345 json_delete_array(json_to_array(json));
347 else if(json_is_string(json))
348 json_delete_string(json_to_string(json));
350 else if(json_is_number(json))
351 json_delete_number(json_to_number(json));
353 /* json_delete is not called for true, false or null */