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 struct json_value *json_create_value_string(const char *str)
62 struct json_value *value = malloc(sizeof(struct json_value));
65 value->type = JSON_TYPE_STRING;
66 value->string = strdup(str);
75 static struct json_value *json_create_value_object(struct json_object *obj)
77 struct json_value *value = malloc(sizeof(struct json_value));
80 value->type = JSON_TYPE_OBJECT;
87 static struct json_value *json_create_value_array(struct json_array *array)
89 struct json_value *value = malloc(sizeof(struct json_value));
92 value->type = JSON_TYPE_ARRAY;
94 array->parent = value;
99 static void json_free_pair(struct json_pair *pair);
100 static void json_free_value(struct json_value *value);
102 void json_free_object(struct json_object *obj)
106 for (i = 0; i < obj->pair_cnt; i++)
107 json_free_pair(obj->pairs[i]);
112 static void json_free_array(struct json_array *array)
116 for (i = 0; i < array->value_cnt; i++)
117 json_free_value(array->values[i]);
122 static void json_free_pair(struct json_pair *pair)
124 json_free_value(pair->value);
129 static void json_free_value(struct json_value *value)
131 switch (value->type) {
132 case JSON_TYPE_STRING:
135 case JSON_TYPE_OBJECT:
136 json_free_object(value->object);
138 case JSON_TYPE_ARRAY:
139 json_free_array(value->array);
145 static int json_array_add_value(struct json_array *array, struct json_value *value)
147 struct json_value **values = realloc(array->values,
148 sizeof(struct json_value *) * (array->value_cnt + 1));
152 values[array->value_cnt] = value;
154 array->values = values;
156 value->parent_type = JSON_PARENT_TYPE_ARRAY;
157 value->parent_array = array;
161 static int json_object_add_pair(struct json_object *obj, struct json_pair *pair)
163 struct json_pair **pairs = realloc(obj->pairs,
164 sizeof(struct json_pair *) * (obj->pair_cnt + 1));
167 pairs[obj->pair_cnt] = pair;
175 int json_object_add_value_type(struct json_object *obj, const char *name, int type, ...)
177 struct json_value *value;
178 struct json_pair *pair;
182 va_start(args, type);
183 if (type == JSON_TYPE_STRING)
184 value = json_create_value_string(va_arg(args, char *));
185 else if (type == JSON_TYPE_INTEGER)
186 value = json_create_value_int(va_arg(args, long));
187 else if (type == JSON_TYPE_FLOAT)
188 value = json_create_value_float(va_arg(args, double));
189 else if (type == JSON_TYPE_OBJECT)
190 value = json_create_value_object(va_arg(args, struct json_object *));
192 value = json_create_value_array(va_arg(args, struct json_array *));
198 pair = json_create_pair(name, value);
200 json_free_value(value);
203 ret = json_object_add_pair(obj, pair);
205 json_free_pair(pair);
211 static void json_print_array(struct json_array *array);
212 int json_array_add_value_type(struct json_array *array, int type, ...)
214 struct json_value *value;
218 va_start(args, type);
219 if (type == JSON_TYPE_STRING)
220 value = json_create_value_string(va_arg(args, char *));
221 else if (type == JSON_TYPE_INTEGER)
222 value = json_create_value_int(va_arg(args, long));
223 else if (type == JSON_TYPE_FLOAT)
224 value = json_create_value_float(va_arg(args, double));
225 else if (type == JSON_TYPE_OBJECT)
226 value = json_create_value_object(va_arg(args, struct json_object *));
228 value = json_create_value_array(va_arg(args, struct json_array *));
234 ret = json_array_add_value(array, value);
236 json_free_value(value);
242 static int json_value_level(struct json_value *value);
243 static int json_pair_level(struct json_pair *pair);
244 static int json_array_level(struct json_array *array);
245 static int json_object_level(struct json_object *object)
247 if (object->parent == NULL)
249 return json_value_level(object->parent);
252 static int json_pair_level(struct json_pair *pair)
254 return json_object_level(pair->parent) + 1;
257 static int json_array_level(struct json_array *array)
259 return json_value_level(array->parent);
262 static int json_value_level(struct json_value *value)
264 if (value->parent_type == JSON_PARENT_TYPE_PAIR)
265 return json_pair_level(value->parent_pair);
267 return json_array_level(value->parent_array) + 1;
270 static void json_print_level(int level)
276 static void json_print_pair(struct json_pair *pair);
277 static void json_print_array(struct json_array *array);
278 static void json_print_value(struct json_value *value);
279 void json_print_object(struct json_object *obj)
284 for (i = 0; i < obj->pair_cnt; i++) {
287 json_print_pair(obj->pairs[i]);
290 json_print_level(json_object_level(obj));
294 static void json_print_pair(struct json_pair *pair)
296 json_print_level(json_pair_level(pair));
297 log_info("\"%s\" : ", pair->name);
298 json_print_value(pair->value);
301 static void json_print_array(struct json_array *array)
306 for (i = 0; i < array->value_cnt; i++) {
309 json_print_level(json_value_level(array->values[i]));
310 json_print_value(array->values[i]);
313 json_print_level(json_array_level(array));
317 static void json_print_value(struct json_value *value)
319 switch (value->type) {
320 case JSON_TYPE_STRING:
321 log_info("\"%s\"", value->string);
323 case JSON_TYPE_INTEGER:
324 log_info("%ld", value->integer_number);
326 case JSON_TYPE_FLOAT:
327 log_info("%.2f", value->float_number);
329 case JSON_TYPE_OBJECT:
330 json_print_object(value->object);
332 case JSON_TYPE_ARRAY:
333 json_print_array(value->array);