acl  3.5.3.0
acl_json.h
浏览该文件的文档.
1 #ifndef ACL_JSON_INCLUDE_H
2 #define ACL_JSON_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "../stdlib/acl_define.h"
9 #include "../stdlib/acl_dbuf_pool.h"
10 #include "../stdlib/acl_iterator.h"
11 #include "../stdlib/acl_vstring.h"
12 #include "../stdlib/acl_ring.h"
13 #include "../stdlib/acl_array.h"
14 
15 typedef struct ACL_JSON ACL_JSON;
17 
18 struct ACL_JSON_NODE {
19  ACL_VSTRING *ltag; /**< 标签名 */
20  ACL_VSTRING *text; /**< 当节点为叶节点时该文本内容非空 */
21  ACL_JSON_NODE *tag_node; /**< 当标签值为 json 节点时此项非空 */
22  ACL_JSON_NODE *parent; /**< 父节点 */
23  ACL_RING children; /**< 子节点集合 */
24  unsigned short type; /**< 节点类型 */
25 #define ACL_JSON_T_A_STRING (1 << 0)
26 #define ACL_JSON_T_A_NUMBER (1 << 1)
27 #define ACL_JSON_T_A_BOOL (1 << 2)
28 #define ACL_JSON_T_A_NULL (1 << 3)
29 #define ACL_JSON_T_A_DOUBLE (1 << 4)
30 
31 #define ACL_JSON_T_STRING (1 << 5)
32 #define ACL_JSON_T_NUMBER (1 << 6)
33 #define ACL_JSON_T_BOOL (1 << 7)
34 #define ACL_JSON_T_NULL (1 << 8)
35 #define ACL_JSON_T_DOUBLE (1 << 9)
36 
37 #define ACL_JSON_T_ARRAY (1 << 10)
38 #define ACL_JSON_T_OBJ (1 << 11)
39 #define ACL_JSON_T_LEAF (1 << 12)
40 #define ACL_JSON_T_MEMBER (1 << 13)
41 #define ACL_JSON_T_PAIR (1 << 14)
42 #define ACL_JSON_T_ELEMENT (1 << 15)
43 
44  unsigned short depth; /**< 当前节点的深度 */
45 
46  /* private */
47  unsigned char quote; /**< 非 0 表示 ' 或 " */
48  unsigned char left_ch; /**< 本节点的第一个字符: { or [ */
49  unsigned char right_ch; /**< 本节点的最后一个字符: } or ] */
50  unsigned backslash:1; /**< 转义字符 \ */
51  unsigned part_word:1; /**< 半个汉字的情况处理标志位 */
52  ACL_JSON *json; /**< json 对象 */
53  ACL_RING node; /**< 当前节点 */
54 
55  /* public: for acl_iterator, 通过 acl_foreach 列出该节点的一级子节点 */
56 
57  /* 取迭代器头函数 */
59  /* 取迭代器下一个函数 */
61  /* 取迭代器尾函数 */
63  /* 取迭代器上一个函数 */
65 };
66 
67 enum {
68  ACL_JSON_S_ROOT, /**< 根节点 */
69  ACL_JSON_S_OBJ, /**< 标签对象值 */
71  ACL_JSON_S_ARRAY, /**< json 节点 array */
73  ACL_JSON_S_PAIR, /**< name:value pair */
74  ACL_JSON_S_NEXT, /**< 下一个节点 */
75  ACL_JSON_S_TAG, /**< 对象标签名 */
76  ACL_JSON_S_VALUE, /**< 节点值处理过程 */
77  ACL_JSON_S_COLON, /**< 冒号 : */
80 };
81 
82 struct ACL_JSON {
83  int depth; /**< 最大深度 */
84  int node_cnt; /**< 节点总数, 包括 root 节点 */
85  ACL_JSON_NODE *root; /**< json 根节点 */
86  int finish; /**< 是否分析结束 */
87  unsigned flag; /**< 标志位 */
88 #define ACL_JSON_FLAG_PART_WORD (1 << 0) /**< 是否兼容半个汉字 */
89 #define ACL_JSON_FLAG_ADD_SPACE (1 << 1) /**< 创建 json 时是否添空格 */
90 
91  /* public: for acl_iterator, 通过 acl_foreach 可以列出所有子节点 */
92 
93  /* 取迭代器头函数 */
94  ACL_JSON_NODE *(*iter_head)(ACL_ITER*, ACL_JSON*);
95  /* 取迭代器下一个函数 */
96  ACL_JSON_NODE *(*iter_next)(ACL_ITER*, ACL_JSON*);
97  /* 取迭代器尾函数 */
98  ACL_JSON_NODE *(*iter_tail)(ACL_ITER*, ACL_JSON*);
99  /* 取迭代器上一个函数 */
100  ACL_JSON_NODE *(*iter_prev)(ACL_ITER*, ACL_JSON*);
101 
102  /* private */
103 
104  int status; /**< 状态机当前解析状态 */
105 
106  ACL_JSON_NODE *curr_node; /**< 当前正在处理的 json 节点 */
107  ACL_DBUF_POOL *dbuf; /**< 会话内存池对象 */
108  ACL_DBUF_POOL *dbuf_inner; /**< 会话内存池对象 */
109  size_t dbuf_keep;
110 };
111 
112 /*----------------------------- in acl_json.c -----------------------------*/
113 
114 /**
115  * 创建一个 json 节点
116  * @param json {ACL_JSON*} json 对象
117  * @return {ACL_JSON_NODE*} json 节点对象
118  */
120 
121 /**
122  * 将某个 json 节点及其子节点从 json 对象中删除, 并释放该节点及其子节点
123  * 所占空间函数来释放该 json 节点所占内存
124  * @param node {ACL_JSON_NODE*} json 节点
125  * @return {int} 返回删除的节点个数
126  */
127 ACL_API int acl_json_node_delete(ACL_JSON_NODE *node);
128 
129 /**
130  * 向某个 json 节点添加兄弟节点(该兄弟节点必须是独立的 json 节点)
131  * @param node1 {ACL_JSON_NODE*} 向本节点添加 json 节点
132  * @param node2 {ACL_JSON_NODE*} 新添加的兄弟 json 节点
133  */
134 ACL_API void acl_json_node_append(ACL_JSON_NODE *node1, ACL_JSON_NODE *node2);
135 
136 /**
137  * 将某个 json 节点作为子节点加入某父 json 节点中
138  * @param parent {ACL_JSON_NODE*} 父节点
139  * @param child {ACL_JSON_NODE*} 子节点
140  */
141 ACL_API void acl_json_node_add_child(
142  ACL_JSON_NODE *parent, ACL_JSON_NODE *child);
143 
144 /**
145  * 将一个 JSON 对象的 JSON 节点复制至 JSON 对象中的一个 JSON 节点中,并返回
146  * 目标新创建的 JSON 节点
147  * @param json {ACL_JSON*} 目标 JSON 对象
148  * @param from {ACL_JSON_NODE*} 源 JSON 对象的一个 JSON 节点
149  * @return {ACL_JSON_NODE*} 返回非空对象指针
150  */
152  ACL_JSON *json, ACL_JSON_NODE *from);
153 
154 /**
155  * 获得某个 json 节点的父节点
156  * @param node {ACL_JSON_NODE*} json 节点
157  * @return {ACL_JSON_NODE*} 父节点, 如果为 NULL 则表示其父节点不存在
158  */
160 
161 /**
162  * 获得某个 json 节点的后一个兄弟节点
163  * @param node {ACL_JSON_NODE*} json 节点
164  * @return {ACL_JSON_NODE*} 给定 json 节点的后一个兄弟节点, 若为NULL则表示不存在
165  */
167 
168 /**
169  * 获得某个 json 节点的前一个兄弟节点
170  * @param node {ACL_JSON_NODE*} json 节点
171  * @return {ACL_JSON_NODE*} 给定 json 节点的前一个兄弟节点, 若为NULL则表示不存在
172  */
174 
175 /**
176  * 创建一个 json 对象
177  * @return {ACL_JSON*} 新创建的 json 对象
178  */
179 ACL_API ACL_JSON *acl_json_alloc(void);
180 
181 /**
182  * 创建一个 json 对象
183  * @param dbuf {ACL_DBUF_POOL*} 内存池对象,当该针对非 NULL 时,则 json 对象
184  * 及所属节点内存在其基础上进行分配,否则,内部自动创建隶属于 json 的内存池
185  * @return {ACL_JSON*} 新创建的 json 对象
186  */
188 
189 /**
190  * 根据一个 JSON 对象的一个 JSON 节点创建一个新的 JSON 对象
191  * @param node {ACL_JSON_NODE*} 源 JSON 对象的一个 JSON 节点
192  * @return {ACL_JSON*} 新创建的 JSON 对象
193  */
194 ACL_API ACL_JSON *acl_json_create(ACL_JSON_NODE *node);
195 
196 /**
197  * 根据一个 JSON 对象的一个 JSON 节点创建一个新的 JSON 对象
198  * @param dbuf {ACL_DBUF_POOL*} 内存池对象,当该针对非 NULL 时,则 json 对象
199  * 及所属节点内存在其基础上进行分配,否则,内部自动创建隶属于 json 的内存池
200  * @param node {ACL_JSON_NODE*} 源 JSON 对象的一个 JSON 节点
201  * @return {ACL_JSON*} 新创建的 JSON 对象
202  */
204 
205 /**
206  * 将某一个 ACL_JSON_NODE 节点作为一个 json 对象的根节点,
207  * 从而可以方便地遍历出该节点的各级子节点(在遍历过程中的所有
208  * 节点不含本节点自身),该遍历方式有别于单独
209  * 遍历某一个 ACL_JSON_NODE 节点时仅能遍历其一级子节点的情形
210  * @param json {ACL_JSON*} json 对象
211  * @param node {ACL_JSON_NODE*} ACL_JSON_NODE 节点
212  */
213 ACL_API void acl_json_foreach_init(ACL_JSON *json, ACL_JSON_NODE *node);
214 
215 /**
216  * 释放一个 json 对象, 同时释放该对象里容纳的所有 json 节点
217  * @param json {ACL_JSON*} json 对象
218  */
219 ACL_API void acl_json_free(ACL_JSON *json);
220 
221 /**
222  * 重置 json 解析器对象
223  * @param json {ACL_JSON*} json 对象
224  */
225 ACL_API void acl_json_reset(ACL_JSON *json);
226 
227 /*------------------------- in acl_json_parse.c ---------------------------*/
228 
229 /**
230  * 解析 json 数据, 并持续地自动生成 json 节点树
231  * @param json {ACL_JSON*} json 对象
232  * @param data {const char*} 以 '\0' 结尾的数据字符串, 可以是完整的 json 数据;
233  * 也可以是不完整的 json 数据, 允许循环调用此函数, 将不完整数据持续地输入; 该参数
234  * 若为 NULL,则直接返回空串地址,因此禁止为 NULL
235  * @return {const char*} 当解析结束后,该返回值表示剩余数据的指针地址
236  */
237 ACL_API const char* acl_json_update(ACL_JSON *json, const char *data);
238 
239 /**
240  * 判断 JSON 解析是否完成
241  * @param json {ACL_JSON*} json 对象
242  * @return {int} 返回非 0 值表示解析完成,否则表示未完成
243  */
244 ACL_API int acl_json_finish(ACL_JSON *json);
245 
246 /*------------------------- in acl_json_util.c ----------------------------*/
247 
248 /**
249  * 从 json 对象中获得第一个与所给标签名相同的 json 节点
250  * @param json {ACL_JSON*} json 对象
251  * @param tag {const char*} 标签名称
252  * @return {ACL_JSON_NODE*} 符合条件的 json 节点, 若返回 NULL 则
253  * 表示没有符合条件的 json 节点
254  */
256  ACL_JSON *json, const char *tag);
257 
258 /**
259  * 释放由 acl_json_getElementsByTagName, acl_json_getElementsByName,
260  * 等函数返回的动态数组对象, 因为该动态数组中的
261  * 元素都是 ACL_JSON 对象中元素的引用, 所以释放掉该动态数组后, 只要 ACL_JSON
262  * 对象不释放, 则原来存于该数组中的元素依然可以使用.
263  * 但并不释放里面的 xml 节点元素
264  * @param a {ACL_ARRAY*} 动态数组对象
265  */
266 ACL_API void acl_json_free_array(ACL_ARRAY *a);
267 
268 /**
269  * 从 json 对象中获得所有的与所给标签名相同的 json 节点的集合
270  * @param json {ACL_JSON*} json 对象
271  * @param tag {const char*} 标签名称
272  * @return {ACL_ARRAY*} 符合条件的 json 节点集合, 存于 动态数组中, 若返回 NULL 则
273  * 表示没有符合条件的 json 节点, 非空值需要调用 acl_json_free_array 释放
274  */
276  ACL_JSON *json, const char *tag);
277 
278 /**
279  * 从 json 对象中获得所有的与给定多级标签名相同的 json 节点的集合
280  * @param json {ACL_JSON*} json 对象
281  * @param tags {const char*} 多级标签名,由 '/' 分隔各级标签名,如针对 json 数据:
282  * { 'root': [
283  * 'first': { 'second': { 'third': 'test1' } },
284  * 'first': { 'second': { 'third': 'test2' } },
285  * 'first': { 'second': { 'third': 'test3' } }
286  * ]
287  * }
288  * 可以通过多级标签名:root/first/second/third 一次性查出所有符合条件的节点
289  * @return {ACL_ARRAY*} 符合条件的 json 节点集合, 存于 动态数组中, 若返回 NULL 则
290  * 表示没有符合条件的 json 节点, 非空值需要调用 acl_json_free_array 释放
291  */
293  ACL_JSON *json, const char *tags);
294 
295 /**
296  * 构建 json 对象时创建 json 叶节点
297  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
298  * @param name {const char*} 标签名,非空
299  * @param value {const char*} 标签值,非空
300  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
301  * 一起被释放,所以不需要单独释放
302  */
304  const char *name, const char *value);
305 #define acl_json_create_leaf acl_json_create_text
306 
307 /**
308  * 构建 json 对象时创建 json 布尔类型的叶节点
309  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
310  * @param name {const char*} 标签名,非空
311  * @param value {int} 布尔类型值
312  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
313  * 一起被释放,所以不需要单独释放
314  */
316  const char *name, int value);
317 
318 /**
319  * 构造 json 对象时创建 json null 类型的叶节点
320  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
321  * @param name {const char*} 标签名,非空
322  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
323  * 一起被释放,所以不需要单独释放
324  */
325 ACL_API ACL_JSON_NODE *acl_json_create_null(ACL_JSON *json, const char *name);
326 
327 /**
328  * 构建 json 对象时创建 json int 类型的叶节点
329  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
330  * @param name {const char*} 标签名,非空
331  * @param value {acl_int64} 有符号整形值
332  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
333  * 一起被释放,所以不需要单独释放
334  */
336  const char *name, acl_int64 value);
337 
338 /**
339  * 构建 json 对象时创建 json double 类型的叶节点
340  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
341  * @param name {const char*} 标签名,非空
342  * @param value {double} 有符号整形值
343  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
344  * 一起被释放,所以不需要单独释放
345  */
347  const char *name, double value);
348 
349 /**
350  * 构建 json 对象的字符串节点,按 json 规范,该节点只能加入至数组对象中
351  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
352  * @param text {const char*}
353  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
354  * 一起被释放,所以不需要单独释放
355  */
357  const char *text);
358 
359 /**
360  * 构建 json 对象的数值节点,按 json 规范,该节点只能加入至数组对象中
361  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
362  * @param value {acl_int64}
363  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
364  * 一起被释放,所以不需要单独释放
365  */
367  acl_int64 value);
368 /**
369  * 构建 json 对象的数值节点,按 json 规范,该节点只能加入至数组对象中
370  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
371  * @param value {double}
372  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
373  * 一起被释放,所以不需要单独释放
374  */
376  double value);
377 
378 /**
379  * 构建 json 对象的布尔节点,按 json 规范,该节点只能加入至数组对象中
380  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
381  * @param value {int} 非 0 表示 true,否则表示 false
382  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
383  * 一起被释放,所以不需要单独释放
384  */
385 ACL_API ACL_JSON_NODE *acl_json_create_array_bool(ACL_JSON *json, int value);
386 
387 /**
388  * 构建 json 对象的 null 节点,按 json 规范,该节点只能加入至数组对象中
389  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
390  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
391  * 一起被释放,所以不需要单独释放
392  */
394 
395 /**
396  * 构建 json 对象时创建 json 对象(即仅包含 {} 的对象)
397  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
398  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
399  * 一起被释放,所以不需要单独释放
400  */
402 
403 /**
404  * 构建 json 对象时创建 json 数组对象(即仅包含 [] 的对象)
405  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
406  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
407  * 一起被释放,所以不需要单独释放
408  */
410 
411 /**
412  * 构建 json 对象时创建 json 节点对象(即 tagname: ACL_JSON_NODE)
413  * @param json {ACL_JSON*} 由 acl_json_alloc / acl_json_alloc1 创建
414  * @param name {const char*} json 节点的标签名
415  * @param value {ACL_JSON_NODE*} json 节点对象作为标签值
416  * @return {ACL_JSON_NODE*} 新创建的节点对象,在释放 ACL_JSON 对象时
417  * 一起被释放,所以不需要单独释放
418  */
420  const char *name, ACL_JSON_NODE *value);
421 
422 /**
423  * 构建 json 对象时,向一个由 acl_json_create_obj 或 acl_json_create_array
424  * 创建的 json 节点添加子节点,该子节点可以是由如下接口创建的节点:
425  * acl_json_create_leaf, acl_json_create_obj, acl_json_create_array
426  */
427 ACL_API void acl_json_node_append_child(ACL_JSON_NODE *parent,
428  ACL_JSON_NODE *child);
429 
430 /**
431  * 将 json 对象的一个 JSON 节点转成字符串内容
432  * @param node {ACL_JSON_NODE*} json 节点对象
433  * @param buf {ACL_VSTRING*} 存储结果集的缓冲区,当该参数为空时则函数内部会
434  * 自动分配一段缓冲区,应用用完后需要释放掉;非空函数内部会直接将结果存储其中
435  * @return {ACL_VSTRING*} json 节点对象转换成字符串后的存储缓冲区,
436  * 该返回值永远非空,使用者可以通过 ACL_VSTRING_LEN(x) 宏来判断内容是否为空,
437  * 返回的 ACL_VSTRING 指针如果为该函数内部创建的,则用户名必须用
438  * acl_vstring_free 进行释放
439  */
441 
442 /**
443  * 将 json 对象转成字符串内容
444  * @param json {ACL_JSON*} json 对象
445  * @param buf {ACL_VSTRING*} 存储结果集的缓冲区,当该参数为空时则函数内部会
446  * 自动分配一段缓冲区,应用用完后需要释放掉;非空函数内部会直接将结果存储其中
447  * @return {ACL_VSTRING*} json 对象转换成字符串后的存储缓冲区,该返回值永远非空,
448  * 使用者可以通过 ACL_VSTRING_LEN(x) 宏来判断内容是否为空,返回的 ACL_VSTRING
449  * 指针如果为该函数内部创建的,则用户名必须用 acl_vstring_free 进行释放
450  */
451 ACL_API ACL_VSTRING *acl_json_build(ACL_JSON *json, ACL_VSTRING *buf);
452 
453 /**
454  * 流式 JSON 对象转字符串处理过程,即该函数在将 JSON 对象转为字符串的过程中,
455  * 一边转换一边将数据通过回调函数输出给调用者,调用者可以限定长度限定调用回
456  * 调函数的时机;该处理过程适应于当JSON对象转成的字符串非常长时(如超过100 MB),
457  * 因为采用流式转换方式,所以并不需要分配一个大内存
458  * @param json {ACL_JSON*} json 对象
459  * @param length {size_t} 在转换为字符串的过程中如果缓冲区长度超过该长度则回调
460  * 用户设定的回调函数
461  * @param callback {int (*)(ACL_JSON*, ACL_VSTRING*, void*)} 用户设定的回调
462  * 函数,当回调函数给的第二个参数为 NULL 时表示处理完毕;如果用户在该回调
463  * 的某次被调用后返回值 < 0 则停止处理过程
464  * @param ctx {void*} callback 函数的最后一个参数
465  */
466 ACL_API void acl_json_building(ACL_JSON *json, size_t length,
467  int (*callback)(ACL_JSON *, ACL_VSTRING *, void *), void *ctx);
468 
469 #ifdef __cplusplus
470 }
471 #endif
472 
473 #endif
ACL_API ACL_JSON_NODE * acl_json_create_array_text(ACL_JSON *json, const char *text)
int node_cnt
Definition: acl_json.h:84
int status
Definition: acl_json.h:104
ACL_API int acl_json_node_delete(ACL_JSON_NODE *node)
ACL_API ACL_JSON_NODE * acl_json_create_array_null(ACL_JSON *json)
HTTP_API void const char * name
Definition: lib_http.h:620
ACL_API ACL_JSON_NODE * acl_json_node_duplicate(ACL_JSON *json, ACL_JSON_NODE *from)
unsigned char quote
Definition: acl_json.h:47
ACL_API ACL_JSON_NODE * acl_json_node_next(ACL_JSON_NODE *node)
ACL_API void acl_json_building(ACL_JSON *json, size_t length, int(*callback)(ACL_JSON *, ACL_VSTRING *, void *), void *ctx)
ACL_JSON_NODE * curr_node
Definition: acl_json.h:106
int finish
Definition: acl_json.h:86
ACL_RING node
Definition: acl_json.h:53
ACL_API ACL_JSON_NODE * acl_json_create_int64(ACL_JSON *json, const char *name, acl_int64 value)
ACL_API ACL_JSON * acl_json_dbuf_alloc(ACL_DBUF_POOL *dbuf)
ACL_API ACL_VSTRING * acl_json_build(ACL_JSON *json, ACL_VSTRING *buf)
unsigned char right_ch
Definition: acl_json.h:49
unsigned short type
Definition: acl_json.h:24
ACL_API ACL_JSON * acl_json_create(ACL_JSON_NODE *node)
ACL_API ACL_JSON_NODE * acl_json_create_obj(ACL_JSON *json)
ACL_API void acl_json_foreach_init(ACL_JSON *json, ACL_JSON_NODE *node)
unsigned char left_ch
Definition: acl_json.h:48
ACL_API int acl_json_finish(ACL_JSON *json)
ACL_API ACL_JSON * acl_json_alloc(void)
ACL_API void acl_json_node_add_child(ACL_JSON_NODE *parent, ACL_JSON_NODE *child)
unsigned part_word
Definition: acl_json.h:51
ACL_VSTRING * text
Definition: acl_json.h:20
ACL_DBUF_POOL * dbuf
Definition: acl_json.h:107
size_t dbuf_keep
Definition: acl_json.h:109
ACL_API const char * acl_json_update(ACL_JSON *json, const char *data)
unsigned flag
Definition: acl_json.h:87
ACL_API ACL_JSON_NODE * acl_json_create_bool(ACL_JSON *json, const char *name, int value)
int depth
Definition: acl_json.h:83
ACL_API ACL_JSON_NODE * acl_json_getFirstElementByTagName(ACL_JSON *json, const char *tag)
ACL_API ACL_JSON_NODE * acl_json_create_null(ACL_JSON *json, const char *name)
ACL_JSON_NODE * parent
Definition: acl_json.h:22
ACL_API ACL_JSON_NODE * acl_json_node_prev(ACL_JSON_NODE *node)
struct ACL_DBUF_POOL ACL_DBUF_POOL
Definition: acl_dbuf_pool.h:8
ACL_API ACL_JSON_NODE * acl_json_create_array(ACL_JSON *json)
ACL_API ACL_ARRAY * acl_json_getElementsByTagName(ACL_JSON *json, const char *tag)
ACL_API void acl_json_node_append(ACL_JSON_NODE *node1, ACL_JSON_NODE *node2)
ACL_VSTRING * ltag
Definition: acl_json.h:19
ACL_API void acl_json_free_array(ACL_ARRAY *a)
ACL_API ACL_JSON_NODE * acl_json_node_alloc(ACL_JSON *json)
ACL_API void acl_json_node_append_child(ACL_JSON_NODE *parent, ACL_JSON_NODE *child)
ACL_API ACL_JSON_NODE * acl_json_create_array_double(ACL_JSON *json, double value)
ACL_API ACL_ARRAY * acl_json_getElementsByTags(ACL_JSON *json, const char *tags)
ACL_API void acl_json_free(ACL_JSON *json)
ACL_API ACL_JSON_NODE * acl_json_create_text(ACL_JSON *json, const char *name, const char *value)
ACL_API ACL_JSON_NODE * acl_json_node_parent(ACL_JSON_NODE *node)
ACL_API ACL_VSTRING * acl_json_node_build(ACL_JSON_NODE *node, ACL_VSTRING *buf)
unsigned short depth
Definition: acl_json.h:44
ACL_API ACL_JSON * acl_json_dbuf_create(ACL_DBUF_POOL *dbuf, ACL_JSON_NODE *node)
ACL_DBUF_POOL * dbuf_inner
Definition: acl_json.h:108
unsigned backslash
Definition: acl_json.h:50
ACL_API ACL_JSON_NODE * acl_json_create_double(ACL_JSON *json, const char *name, double value)
ACL_API void acl_json_reset(ACL_JSON *json)
ACL_JSON * json
Definition: acl_json.h:52
ACL_API ACL_JSON_NODE * acl_json_create_array_bool(ACL_JSON *json, int value)
ACL_JSON_NODE * root
Definition: acl_json.h:85
ACL_API ACL_JSON_NODE * acl_json_create_array_int64(ACL_JSON *json, acl_int64 value)
ACL_API ACL_JSON_NODE * acl_json_create_node(ACL_JSON *json, const char *name, ACL_JSON_NODE *value)
ACL_RING children
Definition: acl_json.h:23
ACL_JSON_NODE * tag_node
Definition: acl_json.h:21