1cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#ifndef __JSON__H
2cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define __JSON__H
3cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_object;
4cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_array;
5cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_pair;
6cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
7cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define JSON_TYPE_STRING 0
8cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define JSON_TYPE_INTEGER 1
9cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define JSON_TYPE_FLOAT 2
10cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define JSON_TYPE_OBJECT 3
11cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define JSON_TYPE_ARRAY 4
12cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define JSON_PARENT_TYPE_PAIR 0
13cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define JSON_PARENT_TYPE_ARRAY 1
14cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_value {
15cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	int type;
16cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	union {
17ee2e5717d1df0c37279eb94876777ee43d403e58Bruce Cran		long long integer_number;
18cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li		double float_number;
19cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li		char *string;
20cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li		struct json_object *object;
21cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li		struct json_array *array;
22cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	};
23cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	int parent_type;
24cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	union {
25cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li		struct json_pair *parent_pair;
26cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li		struct json_array *parent_array;
27cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	};
28cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li};
29cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
30cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_array {
31cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	struct json_value **values;
32cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	int value_cnt;
33cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	struct json_value *parent;
34cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li};
35cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
36cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_object {
37cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	struct json_pair **pairs;
38cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	int pair_cnt;
39cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	struct json_value *parent;
40cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li};
41cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
42cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_pair {
43cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	char *name;
44cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	struct json_value *value;
45cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	struct json_object *parent;
46cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li};
47cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
48cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_object *json_create_object(void);
49cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Listruct json_array *json_create_array(void);
50cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
51cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Livoid json_free_object(struct json_object *obj);
52cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
53cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Liint json_object_add_value_type(struct json_object *obj, const char *name, int type, ...);
54cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_object_add_value_int(obj, name, val) \
55834bbdb7632b37c4957ec112650afa399b9a4c2dPuthikorn Voravootivat	json_object_add_value_type((obj), name, JSON_TYPE_INTEGER, (long long) (val))
56cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_object_add_value_float(obj, name, val) \
57cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_object_add_value_type((obj), name, JSON_TYPE_FLOAT, (val))
58cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_object_add_value_string(obj, name, val) \
59cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_object_add_value_type((obj), name, JSON_TYPE_STRING, (val))
60cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_object_add_value_object(obj, name, val) \
61cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_object_add_value_type((obj), name, JSON_TYPE_OBJECT, (val))
62cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_object_add_value_array(obj, name, val) \
63cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_object_add_value_type((obj), name, JSON_TYPE_ARRAY, (val))
64cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Liint json_array_add_value_type(struct json_array *array, int type, ...);
65cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_array_add_value_int(obj, val) \
66cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_array_add_value_type((obj), JSON_TYPE_INTEGER, (val))
67cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_array_add_value_float(obj, val) \
68cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_array_add_value_type((obj), JSON_TYPE_FLOAT, (val))
69cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_array_add_value_string(obj, val) \
70cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_array_add_value_type((obj), JSON_TYPE_STRING, (val))
71cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_array_add_value_object(obj, val) \
72cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_array_add_value_type((obj), JSON_TYPE_OBJECT, (val))
73cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define json_array_add_value_array(obj, val) \
74cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li	json_array_add_value_type((obj), JSON_TYPE_ARRAY, (val))
75cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li
76952b05e00103bf45576e1860cde0626bd42ed52aCastor Fu#define json_array_last_value_object(obj) \
77952b05e00103bf45576e1860cde0626bd42ed52aCastor Fu	(obj->values[obj->value_cnt - 1]->object)
78952b05e00103bf45576e1860cde0626bd42ed52aCastor Fu
79cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Livoid json_print_object(struct json_object *obj);
80cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#endif
81