4 * (c) 2015 Martin Mares <mj@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
10 #ifndef _UCW_JSON_JSON_H
11 #define _UCW_JSON_JSON_H
13 #include <ucw/clists.h>
14 #include <ucw/slists.h>
15 #include <ucw/mempool.h>
16 #include <ucw/fastbuf.h>
18 #ifdef CONFIG_UCW_CLEAN_ABI
28 struct mempool_state init_state;
31 struct fastbuf *in_fb;
35 struct json_node *next_token;
36 struct json_node *trivial_token;
39 struct fastbuf *out_fb;
41 uint format_options; // Public
44 struct json_context *json_new(void);
45 void json_delete(struct json_context *js);
46 void json_reset(struct json_context *js);
56 // These are not real nodes, but raw tokens
67 enum json_node_type type;
72 struct json_node **elements; // Growing array
73 struct json_pair *pairs; // Growing array
79 struct json_node *value;
83 struct json_node *json_new_node(struct json_context *js, enum json_node_type type);
85 static inline struct json_node *json_new_null(struct json_context *js)
87 return json_new_node(js, JSON_NULL);
90 static inline struct json_node *json_new_bool(struct json_context *js, bool value)
92 struct json_node *n = json_new_node(js, JSON_BOOLEAN);
97 static inline struct json_node *json_new_number(struct json_context *js, double value)
99 struct json_node *n = json_new_node(js, JSON_NUMBER);
104 static inline struct json_node *json_new_string_ref(struct json_context *js, const char *value)
106 struct json_node *n = json_new_node(js, JSON_STRING);
111 static inline struct json_node *json_new_string(struct json_context *js, const char *value)
113 return json_new_string_ref(js, mp_strdup(js->pool, value));
116 struct json_node *json_new_array(struct json_context *js);
117 void json_array_append(struct json_node *array, struct json_node *elt);
119 struct json_node *json_new_object(struct json_context *js);
120 // FIXME: key must not be freed
121 void json_object_set(struct json_node *n, const char *key, struct json_node *value);
122 struct json_node *json_object_get(struct json_node *n, const char *key);
124 void json_set_input(struct json_context *js, struct fastbuf *in);
125 struct json_node *json_peek_token(struct json_context *js);
126 struct json_node *json_next_token(struct json_context *js);
128 struct json_node *json_next_value(struct json_context *js);
130 struct json_node *json_parse(struct json_context *js, struct fastbuf *fb);
132 void json_set_output(struct json_context *js, struct fastbuf *fb);
133 void json_write_value(struct json_context *js, struct json_node *n);
134 void json_write(struct json_context *js, struct fastbuf *fb, struct json_node *n);
136 enum json_format_option {
137 JSON_FORMAT_ESCAPE_NONASCII = 1,
138 JSON_FORMAT_INDENT = 2,