9 struct json_object *json_create_object(void)
11 return calloc(1, sizeof(struct json_object));
14 struct json_array *json_create_array(void)
16 return calloc(1, sizeof(struct json_array));
19 static struct json_pair *json_create_pair(const char *name, struct json_value *value)
21 struct json_pair *pair = malloc(sizeof(struct json_pair));
23 pair->name = strdup(name);
26 value->parent_type = JSON_PARENT_TYPE_PAIR;
27 value->parent_pair = pair;
32 static struct json_value *json_create_value_int(long long number)
34 struct json_value *value = malloc(sizeof(struct json_value));
37 value->type = JSON_TYPE_INTEGER;
38 value->integer_number = number;
43 static struct json_value *json_create_value_float(float number)
45 struct json_value *value = malloc(sizeof(struct json_value));
48 value->type = JSON_TYPE_FLOAT;
49 value->float_number = number;
54 static char *strdup_escape(const char *str)
56 const char *input = str;
64 while ((input = strpbrk(input, "\\\"")) != NULL) {
69 p = ret = malloc(strlen(str) + escapes + 1);
71 if (*str == '\\' || *str == '\"')
81 * Valid JSON strings must escape '"' and '/' with a preceding '/'
83 static struct json_value *json_create_value_string(const char *str)
85 struct json_value *value = malloc(sizeof(struct json_value));
88 value->type = JSON_TYPE_STRING;
89 value->string = strdup_escape(str);
98 static struct json_value *json_create_value_object(struct json_object *obj)
100 struct json_value *value = malloc(sizeof(struct json_value));
103 value->type = JSON_TYPE_OBJECT;
110 static struct json_value *json_create_value_array(struct json_array *array)
112 struct json_value *value = malloc(sizeof(struct json_value));
115 value->type = JSON_TYPE_ARRAY;
116 value->array = array;
117 array->parent = value;
122 static void json_free_pair(struct json_pair *pair);
123 static void json_free_value(struct json_value *value);
125 void json_free_object(struct json_object *obj)
129 for (i = 0; i < obj->pair_cnt; i++)
130 json_free_pair(obj->pairs[i]);
135 static void json_free_array(struct json_array *array)
139 for (i = 0; i < array->value_cnt; i++)
140 json_free_value(array->values[i]);
145 static void json_free_pair(struct json_pair *pair)
147 json_free_value(pair->value);
152 static void json_free_value(struct json_value *value)
154 switch (value->type) {
155 case JSON_TYPE_STRING:
158 case JSON_TYPE_OBJECT:
159 json_free_object(value->object);
161 case JSON_TYPE_ARRAY:
162 json_free_array(value->array);
168 static int json_array_add_value(struct json_array *array, struct json_value *value)
170 struct json_value **values = realloc(array->values,
171 sizeof(struct json_value *) * (array->value_cnt + 1));
175 values[array->value_cnt] = value;
177 array->values = values;
179 value->parent_type = JSON_PARENT_TYPE_ARRAY;
180 value->parent_array = array;
184 static int json_object_add_pair(struct json_object *obj, struct json_pair *pair)
186 struct json_pair **pairs = realloc(obj->pairs,
187 sizeof(struct json_pair *) * (obj->pair_cnt + 1));
190 pairs[obj->pair_cnt] = pair;
198 int json_object_add_value_type(struct json_object *obj, const char *name, int type, ...)
200 struct json_value *value;
201 struct json_pair *pair;
205 va_start(args, type);
206 if (type == JSON_TYPE_STRING)
207 value = json_create_value_string(va_arg(args, char *));
208 else if (type == JSON_TYPE_INTEGER)
209 value = json_create_value_int(va_arg(args, long long));
210 else if (type == JSON_TYPE_FLOAT)
211 value = json_create_value_float(va_arg(args, double));
212 else if (type == JSON_TYPE_OBJECT)
213 value = json_create_value_object(va_arg(args, struct json_object *));
215 value = json_create_value_array(va_arg(args, struct json_array *));
221 pair = json_create_pair(name, value);
223 json_free_value(value);
226 ret = json_object_add_pair(obj, pair);
228 json_free_pair(pair);
234 static void json_print_array(struct json_array *array, struct buf_output *);
235 int json_array_add_value_type(struct json_array *array, int type, ...)
237 struct json_value *value;
241 va_start(args, type);
242 if (type == JSON_TYPE_STRING)
243 value = json_create_value_string(va_arg(args, char *));
244 else if (type == JSON_TYPE_INTEGER)
245 value = json_create_value_int(va_arg(args, long long));
246 else if (type == JSON_TYPE_FLOAT)
247 value = json_create_value_float(va_arg(args, double));
248 else if (type == JSON_TYPE_OBJECT)
249 value = json_create_value_object(va_arg(args, struct json_object *));
251 value = json_create_value_array(va_arg(args, struct json_array *));
257 ret = json_array_add_value(array, value);
259 json_free_value(value);
265 static int json_value_level(struct json_value *value);
266 static int json_pair_level(struct json_pair *pair);
267 static int json_array_level(struct json_array *array);
268 static int json_object_level(struct json_object *object)
270 if (object->parent == NULL)
272 return json_value_level(object->parent);
275 static int json_pair_level(struct json_pair *pair)
277 return json_object_level(pair->parent) + 1;
280 static int json_array_level(struct json_array *array)
282 return json_value_level(array->parent);
285 static int json_value_level(struct json_value *value)
287 if (value->parent_type == JSON_PARENT_TYPE_PAIR)
288 return json_pair_level(value->parent_pair);
290 return json_array_level(value->parent_array) + 1;
293 static void json_print_level(int level, struct buf_output *out)
299 static void json_print_pair(struct json_pair *pair, struct buf_output *);
300 static void json_print_array(struct json_array *array, struct buf_output *);
301 static void json_print_value(struct json_value *value, struct buf_output *);
302 void json_print_object(struct json_object *obj, struct buf_output *out)
307 for (i = 0; i < obj->pair_cnt; i++) {
310 json_print_pair(obj->pairs[i], out);
313 json_print_level(json_object_level(obj), out);
317 static void json_print_pair(struct json_pair *pair, struct buf_output *out)
319 json_print_level(json_pair_level(pair), out);
320 log_buf(out, "\"%s\" : ", pair->name);
321 json_print_value(pair->value, out);
324 static void json_print_array(struct json_array *array, struct buf_output *out)
329 for (i = 0; i < array->value_cnt; i++) {
332 json_print_level(json_value_level(array->values[i]), out);
333 json_print_value(array->values[i], out);
336 json_print_level(json_array_level(array), out);
340 static void json_print_value(struct json_value *value, struct buf_output *out)
342 switch (value->type) {
343 case JSON_TYPE_STRING:
344 log_buf(out, "\"%s\"", value->string);
346 case JSON_TYPE_INTEGER:
347 log_buf(out, "%lld", value->integer_number);
349 case JSON_TYPE_FLOAT:
350 log_buf(out, "%f", value->float_number);
352 case JSON_TYPE_OBJECT:
353 json_print_object(value->object, out);
355 case JSON_TYPE_ARRAY:
356 json_print_array(value->array, out);