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;
67 while ((input = strpbrk(input, "\\\"")) != NULL) {
72 p = ret = malloc(strlen(str) + escapes);
74 if (*str == '\\' || *str == '\"')
83 * Valid JSON strings must escape '"' and '/' with a preceeding '/'
85 static struct json_value *json_create_value_string(const char *str)
87 struct json_value *value = malloc(sizeof(struct json_value));
90 value->type = JSON_TYPE_STRING;
91 value->string = strdup_escape(str);
100 static struct json_value *json_create_value_object(struct json_object *obj)
102 struct json_value *value = malloc(sizeof(struct json_value));
105 value->type = JSON_TYPE_OBJECT;
112 static struct json_value *json_create_value_array(struct json_array *array)
114 struct json_value *value = malloc(sizeof(struct json_value));
117 value->type = JSON_TYPE_ARRAY;
118 value->array = array;
119 array->parent = value;
124 static void json_free_pair(struct json_pair *pair);
125 static void json_free_value(struct json_value *value);
127 void json_free_object(struct json_object *obj)
131 for (i = 0; i < obj->pair_cnt; i++)
132 json_free_pair(obj->pairs[i]);
137 static void json_free_array(struct json_array *array)
141 for (i = 0; i < array->value_cnt; i++)
142 json_free_value(array->values[i]);
147 static void json_free_pair(struct json_pair *pair)
149 json_free_value(pair->value);
154 static void json_free_value(struct json_value *value)
156 switch (value->type) {
157 case JSON_TYPE_STRING:
160 case JSON_TYPE_OBJECT:
161 json_free_object(value->object);
163 case JSON_TYPE_ARRAY:
164 json_free_array(value->array);
170 static int json_array_add_value(struct json_array *array, struct json_value *value)
172 struct json_value **values = realloc(array->values,
173 sizeof(struct json_value *) * (array->value_cnt + 1));
177 values[array->value_cnt] = value;
179 array->values = values;
181 value->parent_type = JSON_PARENT_TYPE_ARRAY;
182 value->parent_array = array;
186 static int json_object_add_pair(struct json_object *obj, struct json_pair *pair)
188 struct json_pair **pairs = realloc(obj->pairs,
189 sizeof(struct json_pair *) * (obj->pair_cnt + 1));
192 pairs[obj->pair_cnt] = pair;
200 int json_object_add_value_type(struct json_object *obj, const char *name, int type, ...)
202 struct json_value *value;
203 struct json_pair *pair;
207 va_start(args, type);
208 if (type == JSON_TYPE_STRING)
209 value = json_create_value_string(va_arg(args, char *));
210 else if (type == JSON_TYPE_INTEGER)
211 value = json_create_value_int(va_arg(args, long));
212 else if (type == JSON_TYPE_FLOAT)
213 value = json_create_value_float(va_arg(args, double));
214 else if (type == JSON_TYPE_OBJECT)
215 value = json_create_value_object(va_arg(args, struct json_object *));
217 value = json_create_value_array(va_arg(args, struct json_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 static void json_print_array(struct json_array *array);
237 int json_array_add_value_type(struct json_array *array, int type, ...)
239 struct json_value *value;
243 va_start(args, type);
244 if (type == JSON_TYPE_STRING)
245 value = json_create_value_string(va_arg(args, char *));
246 else if (type == JSON_TYPE_INTEGER)
247 value = json_create_value_int(va_arg(args, long));
248 else if (type == JSON_TYPE_FLOAT)
249 value = json_create_value_float(va_arg(args, double));
250 else if (type == JSON_TYPE_OBJECT)
251 value = json_create_value_object(va_arg(args, struct json_object *));
253 value = json_create_value_array(va_arg(args, struct json_array *));
259 ret = json_array_add_value(array, value);
261 json_free_value(value);
267 static int json_value_level(struct json_value *value);
268 static int json_pair_level(struct json_pair *pair);
269 static int json_array_level(struct json_array *array);
270 static int json_object_level(struct json_object *object)
272 if (object->parent == NULL)
274 return json_value_level(object->parent);
277 static int json_pair_level(struct json_pair *pair)
279 return json_object_level(pair->parent) + 1;
282 static int json_array_level(struct json_array *array)
284 return json_value_level(array->parent);
287 static int json_value_level(struct json_value *value)
289 if (value->parent_type == JSON_PARENT_TYPE_PAIR)
290 return json_pair_level(value->parent_pair);
292 return json_array_level(value->parent_array) + 1;
295 static void json_print_level(int level)
301 static void json_print_pair(struct json_pair *pair);
302 static void json_print_array(struct json_array *array);
303 static void json_print_value(struct json_value *value);
304 void json_print_object(struct json_object *obj)
309 for (i = 0; i < obj->pair_cnt; i++) {
312 json_print_pair(obj->pairs[i]);
315 json_print_level(json_object_level(obj));
319 static void json_print_pair(struct json_pair *pair)
321 json_print_level(json_pair_level(pair));
322 log_info("\"%s\" : ", pair->name);
323 json_print_value(pair->value);
326 static void json_print_array(struct json_array *array)
331 for (i = 0; i < array->value_cnt; i++) {
334 json_print_level(json_value_level(array->values[i]));
335 json_print_value(array->values[i]);
338 json_print_level(json_array_level(array));
342 static void json_print_value(struct json_value *value)
344 switch (value->type) {
345 case JSON_TYPE_STRING:
346 log_info("\"%s\"", value->string);
348 case JSON_TYPE_INTEGER:
349 log_info("%ld", value->integer_number);
351 case JSON_TYPE_FLOAT:
352 log_info("%.2f", value->float_number);
354 case JSON_TYPE_OBJECT:
355 json_print_object(value->object);
357 case JSON_TYPE_ARRAY:
358 json_print_array(value->array);