8 struct json_object *json_create_object(void)
10 return calloc(1, sizeof(struct json_object));
13 struct json_array *json_create_array(void)
15 return calloc(1, sizeof(struct json_array));
18 static struct json_pair *json_create_pair(const char *name, struct json_value *value)
20 struct json_pair *pair = malloc(sizeof(struct json_pair));
22 pair->name = strdup(name);
25 value->parent_type = JSON_PARENT_TYPE_PAIR;
26 value->parent_pair = pair;
31 static struct json_value *json_create_value_int(long long number)
33 struct json_value *value = malloc(sizeof(struct json_value));
36 value->type = JSON_TYPE_INTEGER;
37 value->integer_number = number;
42 static struct json_value *json_create_value_float(double number)
44 struct json_value *value = malloc(sizeof(struct json_value));
47 value->type = JSON_TYPE_FLOAT;
48 value->float_number = number;
53 static char *strdup_escape(const char *str)
55 const char *input = str;
63 while ((input = strpbrk(input, "\\\"")) != NULL) {
68 p = ret = malloc(strlen(str) + escapes + 1);
70 if (*str == '\\' || *str == '\"')
80 * Valid JSON strings must escape '"' and '/' with a preceding '/'
82 static struct json_value *json_create_value_string(const char *str)
84 struct json_value *value = malloc(sizeof(struct json_value));
87 value->type = JSON_TYPE_STRING;
88 value->string = strdup_escape(str);
97 static struct json_value *json_create_value_object(struct json_object *obj)
99 struct json_value *value = malloc(sizeof(struct json_value));
102 value->type = JSON_TYPE_OBJECT;
109 static struct json_value *json_create_value_array(struct json_array *array)
111 struct json_value *value = malloc(sizeof(struct json_value));
114 value->type = JSON_TYPE_ARRAY;
115 value->array = array;
116 array->parent = value;
121 static void json_free_pair(struct json_pair *pair);
122 static void json_free_value(struct json_value *value);
124 void json_free_object(struct json_object *obj)
128 for (i = 0; i < obj->pair_cnt; i++)
129 json_free_pair(obj->pairs[i]);
134 static void json_free_array(struct json_array *array)
138 for (i = 0; i < array->value_cnt; i++)
139 json_free_value(array->values[i]);
144 static void json_free_pair(struct json_pair *pair)
146 json_free_value(pair->value);
151 static void json_free_value(struct json_value *value)
153 switch (value->type) {
154 case JSON_TYPE_STRING:
157 case JSON_TYPE_OBJECT:
158 json_free_object(value->object);
160 case JSON_TYPE_ARRAY:
161 json_free_array(value->array);
167 static int json_array_add_value(struct json_array *array, struct json_value *value)
169 struct json_value **values = realloc(array->values,
170 sizeof(struct json_value *) * (array->value_cnt + 1));
174 values[array->value_cnt] = value;
176 array->values = values;
178 value->parent_type = JSON_PARENT_TYPE_ARRAY;
179 value->parent_array = array;
183 static int json_object_add_pair(struct json_object *obj, struct json_pair *pair)
185 struct json_pair **pairs = realloc(obj->pairs,
186 sizeof(struct json_pair *) * (obj->pair_cnt + 1));
189 pairs[obj->pair_cnt] = pair;
197 int json_object_add_value_type(struct json_object *obj, const char *name,
198 const struct json_value *arg)
200 struct json_value *value;
201 struct json_pair *pair;
205 case JSON_TYPE_STRING:
206 value = json_create_value_string(arg->string);
208 case JSON_TYPE_INTEGER:
209 value = json_create_value_int(arg->integer_number);
211 case JSON_TYPE_FLOAT:
212 value = json_create_value_float(arg->float_number);
214 case JSON_TYPE_OBJECT:
215 value = json_create_value_object(arg->object);
218 case JSON_TYPE_ARRAY:
219 value = json_create_value_array(arg->array);
226 pair = json_create_pair(name, value);
228 json_free_value(value);
231 ret = json_object_add_pair(obj, pair);
233 json_free_pair(pair);
239 int json_array_add_value_type(struct json_array *array,
240 const struct json_value *arg)
242 struct json_value *value;
246 case JSON_TYPE_STRING:
247 value = json_create_value_string(arg->string);
249 case JSON_TYPE_INTEGER:
250 value = json_create_value_int(arg->integer_number);
252 case JSON_TYPE_FLOAT:
253 value = json_create_value_float(arg->float_number);
255 case JSON_TYPE_OBJECT:
256 value = json_create_value_object(arg->object);
259 case JSON_TYPE_ARRAY:
260 value = json_create_value_array(arg->array);
267 ret = json_array_add_value(array, value);
269 json_free_value(value);
275 static int json_value_level(struct json_value *value);
276 static int json_pair_level(struct json_pair *pair);
277 static int json_array_level(struct json_array *array);
278 static int json_object_level(struct json_object *object)
280 if (object->parent == NULL)
282 return json_value_level(object->parent);
285 static int json_pair_level(struct json_pair *pair)
287 return json_object_level(pair->parent) + 1;
290 static int json_array_level(struct json_array *array)
292 return json_value_level(array->parent);
295 static int json_value_level(struct json_value *value)
297 if (value->parent_type == JSON_PARENT_TYPE_PAIR)
298 return json_pair_level(value->parent_pair);
300 return json_array_level(value->parent_array) + 1;
303 static void json_print_level(int level, struct buf_output *out)
309 static void json_print_pair(struct json_pair *pair, struct buf_output *);
310 static void json_print_value(struct json_value *value, struct buf_output *);
312 void json_print_object(struct json_object *obj, struct buf_output *out)
317 for (i = 0; i < obj->pair_cnt; i++) {
320 json_print_pair(obj->pairs[i], out);
323 json_print_level(json_object_level(obj), out);
327 static void json_print_pair(struct json_pair *pair, struct buf_output *out)
329 json_print_level(json_pair_level(pair), out);
330 log_buf(out, "\"%s\" : ", pair->name);
331 json_print_value(pair->value, out);
334 static void json_print_array(struct json_array *array, struct buf_output *out)
339 for (i = 0; i < array->value_cnt; i++) {
342 json_print_level(json_value_level(array->values[i]), out);
343 json_print_value(array->values[i], out);
346 json_print_level(json_array_level(array), out);
350 static void json_print_value(struct json_value *value, struct buf_output *out)
352 switch (value->type) {
353 case JSON_TYPE_STRING:
354 log_buf(out, "\"%s\"", value->string);
356 case JSON_TYPE_INTEGER:
357 log_buf(out, "%lld", value->integer_number);
359 case JSON_TYPE_FLOAT:
360 log_buf(out, "%f", value->float_number);
362 case JSON_TYPE_OBJECT:
363 json_print_object(value->object, out);
365 case JSON_TYPE_ARRAY:
366 json_print_array(value->array, out);