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;
60 while ((input = strpbrk(input, "\\\"")) != NULL) {
65 p = ret = malloc(strlen(str) + escapes + 1);
67 if (*str == '\\' || *str == '\"')
77 * Valid JSON strings must escape '"' and '/' with a preceding '/'
79 static struct json_value *json_create_value_string(const char *str)
81 struct json_value *value = malloc(sizeof(struct json_value));
84 value->type = JSON_TYPE_STRING;
85 value->string = strdup_escape(str);
94 static struct json_value *json_create_value_object(struct json_object *obj)
96 struct json_value *value = malloc(sizeof(struct json_value));
99 value->type = JSON_TYPE_OBJECT;
106 static struct json_value *json_create_value_array(struct json_array *array)
108 struct json_value *value = malloc(sizeof(struct json_value));
111 value->type = JSON_TYPE_ARRAY;
112 value->array = array;
113 array->parent = value;
118 static void json_free_pair(struct json_pair *pair);
119 static void json_free_value(struct json_value *value);
121 void json_free_object(struct json_object *obj)
125 for (i = 0; i < obj->pair_cnt; i++)
126 json_free_pair(obj->pairs[i]);
131 static void json_free_array(struct json_array *array)
135 for (i = 0; i < array->value_cnt; i++)
136 json_free_value(array->values[i]);
141 static void json_free_pair(struct json_pair *pair)
143 json_free_value(pair->value);
148 static void json_free_value(struct json_value *value)
150 switch (value->type) {
151 case JSON_TYPE_STRING:
154 case JSON_TYPE_OBJECT:
155 json_free_object(value->object);
157 case JSON_TYPE_ARRAY:
158 json_free_array(value->array);
164 static int json_array_add_value(struct json_array *array, struct json_value *value)
166 struct json_value **values = realloc(array->values,
167 sizeof(struct json_value *) * (array->value_cnt + 1));
171 values[array->value_cnt] = value;
173 array->values = values;
175 value->parent_type = JSON_PARENT_TYPE_ARRAY;
176 value->parent_array = array;
180 static int json_object_add_pair(struct json_object *obj, struct json_pair *pair)
182 struct json_pair **pairs = realloc(obj->pairs,
183 sizeof(struct json_pair *) * (obj->pair_cnt + 1));
186 pairs[obj->pair_cnt] = pair;
194 int json_object_add_value_type(struct json_object *obj, const char *name,
195 const struct json_value *arg)
197 struct json_value *value;
198 struct json_pair *pair;
202 case JSON_TYPE_STRING:
203 value = json_create_value_string(arg->string);
205 case JSON_TYPE_INTEGER:
206 value = json_create_value_int(arg->integer_number);
208 case JSON_TYPE_FLOAT:
209 value = json_create_value_float(arg->float_number);
211 case JSON_TYPE_OBJECT:
212 value = json_create_value_object(arg->object);
215 case JSON_TYPE_ARRAY:
216 value = json_create_value_array(arg->array);
223 pair = json_create_pair(name, value);
225 json_free_value(value);
228 ret = json_object_add_pair(obj, pair);
230 json_free_pair(pair);
236 int json_array_add_value_type(struct json_array *array,
237 const struct json_value *arg)
239 struct json_value *value;
243 case JSON_TYPE_STRING:
244 value = json_create_value_string(arg->string);
246 case JSON_TYPE_INTEGER:
247 value = json_create_value_int(arg->integer_number);
249 case JSON_TYPE_FLOAT:
250 value = json_create_value_float(arg->float_number);
252 case JSON_TYPE_OBJECT:
253 value = json_create_value_object(arg->object);
256 case JSON_TYPE_ARRAY:
257 value = json_create_value_array(arg->array);
264 ret = json_array_add_value(array, value);
266 json_free_value(value);
272 static int json_value_level(struct json_value *value);
273 static int json_pair_level(struct json_pair *pair);
274 static int json_array_level(struct json_array *array);
275 static int json_object_level(struct json_object *object)
277 if (object->parent == NULL)
279 return json_value_level(object->parent);
282 static int json_pair_level(struct json_pair *pair)
284 return json_object_level(pair->parent) + 1;
287 static int json_array_level(struct json_array *array)
289 return json_value_level(array->parent);
292 static int json_value_level(struct json_value *value)
294 if (value->parent_type == JSON_PARENT_TYPE_PAIR)
295 return json_pair_level(value->parent_pair);
297 return json_array_level(value->parent_array) + 1;
300 static void json_print_level(int level, struct buf_output *out)
306 static void json_print_pair(struct json_pair *pair, struct buf_output *);
307 static void json_print_value(struct json_value *value, struct buf_output *);
309 void json_print_object(struct json_object *obj, struct buf_output *out)
314 for (i = 0; i < obj->pair_cnt; i++) {
317 json_print_pair(obj->pairs[i], out);
320 json_print_level(json_object_level(obj), out);
324 static void json_print_pair(struct json_pair *pair, struct buf_output *out)
326 json_print_level(json_pair_level(pair), out);
327 log_buf(out, "\"%s\" : ", pair->name);
328 json_print_value(pair->value, out);
331 static void json_print_array(struct json_array *array, struct buf_output *out)
336 for (i = 0; i < array->value_cnt; i++) {
339 json_print_level(json_value_level(array->values[i]), out);
340 json_print_value(array->values[i], out);
343 json_print_level(json_array_level(array), out);
347 static void json_print_value(struct json_value *value, struct buf_output *out)
349 switch (value->type) {
350 case JSON_TYPE_STRING:
351 log_buf(out, "\"%s\"", value->string);
353 case JSON_TYPE_INTEGER:
354 log_buf(out, "%lld", value->integer_number);
356 case JSON_TYPE_FLOAT:
357 log_buf(out, "%f", value->float_number);
359 case JSON_TYPE_OBJECT:
360 json_print_object(value->object, out);
362 case JSON_TYPE_ARRAY:
363 json_print_array(value->array, out);