9 struct json_object *json_create_object(void)
11 struct json_object *obj = malloc(sizeof(struct json_object));
13 memset(obj, 0, sizeof(struct json_object));
17 struct json_array *json_create_array(void)
19 struct json_array *array = malloc(sizeof(struct json_array));
21 memset(array, 0, sizeof(struct json_array));
25 static struct json_pair *json_create_pair(const char *name, struct json_value *value)
27 struct json_pair *pair = malloc(sizeof(struct json_pair));
29 pair->name = strdup(name);
32 value->parent_type = JSON_PARENT_TYPE_PAIR;
33 value->parent_pair = pair;
38 static struct json_value *json_create_value_int(long number)
40 struct json_value *value = malloc(sizeof(struct json_value));
43 value->type = JSON_TYPE_INTEGER;
44 value->integer_number = number;
49 static struct json_value *json_create_value_float(float number)
51 struct json_value *value = malloc(sizeof(struct json_value));
54 value->type = JSON_TYPE_FLOAT;
55 value->float_number = number;
60 static char *strdup_escape(const char *str)
62 const char *input = str;
70 while ((input = strpbrk(input, "\\\"")) != NULL) {
75 p = ret = malloc(strlen(str) + escapes + 1);
77 if (*str == '\\' || *str == '\"')
87 * Valid JSON strings must escape '"' and '/' with a preceding '/'
89 static struct json_value *json_create_value_string(const char *str)
91 struct json_value *value = malloc(sizeof(struct json_value));
94 value->type = JSON_TYPE_STRING;
95 value->string = strdup_escape(str);
104 static struct json_value *json_create_value_object(struct json_object *obj)
106 struct json_value *value = malloc(sizeof(struct json_value));
109 value->type = JSON_TYPE_OBJECT;
116 static struct json_value *json_create_value_array(struct json_array *array)
118 struct json_value *value = malloc(sizeof(struct json_value));
121 value->type = JSON_TYPE_ARRAY;
122 value->array = array;
123 array->parent = value;
128 static void json_free_pair(struct json_pair *pair);
129 static void json_free_value(struct json_value *value);
131 void json_free_object(struct json_object *obj)
135 for (i = 0; i < obj->pair_cnt; i++)
136 json_free_pair(obj->pairs[i]);
141 static void json_free_array(struct json_array *array)
145 for (i = 0; i < array->value_cnt; i++)
146 json_free_value(array->values[i]);
151 static void json_free_pair(struct json_pair *pair)
153 json_free_value(pair->value);
158 static void json_free_value(struct json_value *value)
160 switch (value->type) {
161 case JSON_TYPE_STRING:
164 case JSON_TYPE_OBJECT:
165 json_free_object(value->object);
167 case JSON_TYPE_ARRAY:
168 json_free_array(value->array);
174 static int json_array_add_value(struct json_array *array, struct json_value *value)
176 struct json_value **values = realloc(array->values,
177 sizeof(struct json_value *) * (array->value_cnt + 1));
181 values[array->value_cnt] = value;
183 array->values = values;
185 value->parent_type = JSON_PARENT_TYPE_ARRAY;
186 value->parent_array = array;
190 static int json_object_add_pair(struct json_object *obj, struct json_pair *pair)
192 struct json_pair **pairs = realloc(obj->pairs,
193 sizeof(struct json_pair *) * (obj->pair_cnt + 1));
196 pairs[obj->pair_cnt] = pair;
204 int json_object_add_value_type(struct json_object *obj, const char *name, int type, ...)
206 struct json_value *value;
207 struct json_pair *pair;
211 va_start(args, type);
212 if (type == JSON_TYPE_STRING)
213 value = json_create_value_string(va_arg(args, char *));
214 else if (type == JSON_TYPE_INTEGER)
215 value = json_create_value_int(va_arg(args, long));
216 else if (type == JSON_TYPE_FLOAT)
217 value = json_create_value_float(va_arg(args, double));
218 else if (type == JSON_TYPE_OBJECT)
219 value = json_create_value_object(va_arg(args, struct json_object *));
221 value = json_create_value_array(va_arg(args, struct json_array *));
227 pair = json_create_pair(name, value);
229 json_free_value(value);
232 ret = json_object_add_pair(obj, pair);
234 json_free_pair(pair);
240 static void json_print_array(struct json_array *array);
241 int json_array_add_value_type(struct json_array *array, int type, ...)
243 struct json_value *value;
247 va_start(args, type);
248 if (type == JSON_TYPE_STRING)
249 value = json_create_value_string(va_arg(args, char *));
250 else if (type == JSON_TYPE_INTEGER)
251 value = json_create_value_int(va_arg(args, long));
252 else if (type == JSON_TYPE_FLOAT)
253 value = json_create_value_float(va_arg(args, double));
254 else if (type == JSON_TYPE_OBJECT)
255 value = json_create_value_object(va_arg(args, struct json_object *));
257 value = json_create_value_array(va_arg(args, struct json_array *));
263 ret = json_array_add_value(array, value);
265 json_free_value(value);
271 static int json_value_level(struct json_value *value);
272 static int json_pair_level(struct json_pair *pair);
273 static int json_array_level(struct json_array *array);
274 static int json_object_level(struct json_object *object)
276 if (object->parent == NULL)
278 return json_value_level(object->parent);
281 static int json_pair_level(struct json_pair *pair)
283 return json_object_level(pair->parent) + 1;
286 static int json_array_level(struct json_array *array)
288 return json_value_level(array->parent);
291 static int json_value_level(struct json_value *value)
293 if (value->parent_type == JSON_PARENT_TYPE_PAIR)
294 return json_pair_level(value->parent_pair);
296 return json_array_level(value->parent_array) + 1;
299 static void json_print_level(int level)
305 static void json_print_pair(struct json_pair *pair);
306 static void json_print_array(struct json_array *array);
307 static void json_print_value(struct json_value *value);
308 void json_print_object(struct json_object *obj)
313 for (i = 0; i < obj->pair_cnt; i++) {
316 json_print_pair(obj->pairs[i]);
319 json_print_level(json_object_level(obj));
323 static void json_print_pair(struct json_pair *pair)
325 json_print_level(json_pair_level(pair));
326 log_info("\"%s\" : ", pair->name);
327 json_print_value(pair->value);
330 static void json_print_array(struct json_array *array)
335 for (i = 0; i < array->value_cnt; i++) {
338 json_print_level(json_value_level(array->values[i]));
339 json_print_value(array->values[i]);
342 json_print_level(json_array_level(array));
346 static void json_print_value(struct json_value *value)
348 switch (value->type) {
349 case JSON_TYPE_STRING:
350 log_info("\"%s\"", value->string);
352 case JSON_TYPE_INTEGER:
353 log_info("%ld", value->integer_number);
355 case JSON_TYPE_FLOAT:
356 log_info("%.2f", value->float_number);
358 case JSON_TYPE_OBJECT:
359 json_print_object(value->object);
361 case JSON_TYPE_ARRAY:
362 json_print_array(value->array);