]>
glassweightruler.freedombox.rocks Git - Ventoy.git/blob - Plugson/src/Core/ventoy_json.h
1 /******************************************************************************
4 * Copyright (c) 2021, longpanda <admin@ventoy.net>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 3 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 #ifndef __VENTOY_JSON_H__
21 #define __VENTOY_JSON_H__
23 #define JSON_NEW_ITEM(pstJson, ret) \
25 (pstJson) = (VTOY_JSON *)zalloc(sizeof(VTOY_JSON)); \
26 if (NULL == (pstJson)) \
28 vdebug("Failed to alloc memory for json."); \
33 #if defined(_MSC_VER) || defined(WIN32)
34 #define ssprintf(curpos, buf, len, fmt, ...) \
35 curpos += scnprintf(buf + curpos, len - curpos, fmt, ##__VA_ARGS__)
37 #define VTOY_JSON_IS_SKIPABLE(c) (((c) <= 32) ? 1 : 0)
39 #define VTOY_JSON_PRINT_PREFIX(uiDepth, ...) \
41 uint32_t _uiLoop = 0; \
42 for (_uiLoop = 0; _uiLoop < (uiDepth); _uiLoop++) \
44 ssprintf(uiCurPos, pcBuf, uiBufLen, " "); \
46 ssprintf(uiCurPos, pcBuf, uiBufLen, ##__VA_ARGS__); \
50 #define ssprintf(curpos, buf, len, fmt, args...) \
51 curpos += scnprintf(buf + curpos, len - curpos, fmt, ##args)
53 #define VTOY_JSON_IS_SKIPABLE(c) (((c) <= 32) ? 1 : 0)
55 #define VTOY_JSON_PRINT_PREFIX(uiDepth, args...) \
57 uint32_t _uiLoop = 0; \
58 for (_uiLoop = 0; _uiLoop < (uiDepth); _uiLoop++) \
60 ssprintf(uiCurPos, pcBuf, uiBufLen, " "); \
62 ssprintf(uiCurPos, pcBuf, uiBufLen, ##args); \
67 #define VTOY_JSON_SUCCESS_RET "{ \"result\" : \"success\" }"
68 #define VTOY_JSON_FAILED_RET "{ \"result\" : \"failed\" }"
69 #define VTOY_JSON_INVALID_RET "{ \"result\" : \"invalidfmt\" }"
70 #define VTOY_JSON_TOKEN_ERR_RET "{ \"result\" : \"tokenerror\" }"
71 #define VTOY_JSON_EXIST_RET "{ \"result\" : \"exist\" }"
72 #define VTOY_JSON_TIMEOUT_RET "{ \"result\" : \"timeout\" }"
73 #define VTOY_JSON_BUSY_RET "{ \"result\" : \"busy\" }"
74 #define VTOY_JSON_INUSE_RET "{ \"result\" : \"inuse\" }"
75 #define VTOY_JSON_NOTFOUND_RET "{ \"result\" : \"notfound\" }"
76 #define VTOY_JSON_NOTRUNNING_RET "{ \"result\" : \"notrunning\" }"
77 #define VTOY_JSON_NOT_READY_RET "{ \"result\" : \"notready\" }"
78 #define VTOY_JSON_NOT_SUPPORT_RET "{ \"result\" : \"notsupport\" }"
79 #define VTOY_JSON_MBR_2TB_RET "{ \"result\" : \"mbr2tb\" }"
80 #define VTOY_JSON_INVALID_RSV_RET "{ \"result\" : \"reserve_invalid\" }"
81 #define VTOY_JSON_FILE_NOT_FOUND_RET "{ \"result\" : \"file_not_found\" }"
83 typedef enum tagJSON_TYPE
94 typedef struct tagVTOY_JSON
96 struct tagVTOY_JSON
*pstPrev
;
97 struct tagVTOY_JSON
*pstNext
;
98 struct tagVTOY_JSON
*pstChild
;
100 JSON_TYPE enDataType
;
111 #define VTOY_JSON_FMT_BEGIN(uiCurPos, pcBuf, uiBufLen) \
113 uint32_t __uiCurPos = (uiCurPos);\
114 uint32_t __uiBufLen = (uiBufLen);\
115 char *__pcBuf = (pcBuf);
117 #define VTOY_JSON_FMT_END(uiCurPos) \
118 (uiCurPos) = __uiCurPos;\
121 #define VTOY_JSON_FMT_OBJ_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{")
122 #define VTOY_JSON_FMT_OBJ_BEGIN_L(P) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{", P)
123 #define VTOY_JSON_FMT_OBJ_BEGIN_N() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{\n")
124 #define VTOY_JSON_FMT_OBJ_BEGIN_LN(P) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{\n", P)
126 #define VTOY_JSON_FMT_OBJ_END() \
128 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
132 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\
135 #define VTOY_JSON_FMT_OBJ_ENDEX() \
137 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
141 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "},");\
146 #define VTOY_JSON_FMT_KEY(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":", (Key))
147 #define VTOY_JSON_FMT_KEY_L(P, Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\":", P, (Key))
150 #define VTOY_JSON_FMT_ITEM(Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\",", (Item))
151 #define VTOY_JSON_FMT_ITEM_L(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",", P, (Item))
152 #define VTOY_JSON_FMT_ITEM_LN(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",\n", P, (Item))
153 #define VTOY_JSON_FMT_ITEM_PATH_LN(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",\n", P, ventoy_real_path(Item))
155 #define VTOY_JSON_FMT_ITEM_INT(Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%d,", (Item))
158 #define VTOY_JSON_FMT_COMA() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",")
159 #define VTOY_JSON_FMT_COMA_N(cnt) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",\n")
160 #define VTOY_JSON_FMT_COMA_N_CNT(cnt) if ((cnt) > 0) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",\n")
163 #define VTOY_JSON_FMT_APPEND_BEGIN() \
165 if ('}' == *(__pcBuf + (__uiCurPos - 1)))\
169 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",");\
172 #define VTOY_JSON_FMT_APPEND_END() \
174 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\
177 #define VTOY_JSON_FMT_ARY_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[")
178 #define VTOY_JSON_FMT_ARY_BEGIN_N() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[\n")
180 #define VTOY_JSON_FMT_ARY_END() \
182 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
186 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "]");\
188 #define VTOY_JSON_FMT_ARY_ENDEX() \
190 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
194 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "],");\
199 #define VTOY_JSON_FMT_OBJ_END_L(P) \
201 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
203 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
206 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s}%s", P);\
208 #define VTOY_JSON_FMT_OBJ_ENDEX_L(P) \
210 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
212 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
215 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s},%s", P);\
218 #define VTOY_JSON_FMT_OBJ_END_LN(P) \
220 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
222 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
225 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s}\n", P);\
227 #define VTOY_JSON_FMT_OBJ_ENDEX_LN(P) \
229 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
231 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
234 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s},\n", P);\
240 #define VTOY_JSON_FMT_ARY_END_L(P) \
242 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
244 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
247 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s]", P);\
250 #define VTOY_JSON_FMT_ARY_END_LN(P) \
252 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
254 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
257 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s]\n", P);\
260 #define VTOY_JSON_FMT_ARY_ENDEX_L(P) \
262 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
264 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
267 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s],", P);\
271 #define VTOY_JSON_FMT_ARY_ENDEX_LN(P) \
273 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
275 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
278 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s],\n", P);\
284 #define VTOY_JSON_FMT_UINT64(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %llu,", Key, (_ull)Val)
286 #define VTOY_JSON_FMT_ULONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %lu,", Key, Val)
287 #define VTOY_JSON_FMT_LONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %ld,", Key, Val)
289 #define VTOY_JSON_FMT_UINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %u,", Key, Val)
290 #define VTOY_JSON_FMT_UINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %u,\n", Key, Val)
291 #define VTOY_JSON_FMT_UINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %u,", P, Key, Val)
292 #define VTOY_JSON_FMT_UINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %u,\n", P, Key, Val)
295 #define VTOY_JSON_FMT_STRUINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%u\",", Key, Val)
296 #define VTOY_JSON_FMT_STRUINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%u\",\n", Key, Val)
297 #define VTOY_JSON_FMT_STRUINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%u\",", P, Key, Val)
298 #define VTOY_JSON_FMT_STRUINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%u\",\n", P, Key, Val)
300 #define VTOY_JSON_FMT_STRSINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%d\",", Key, Val)
301 #define VTOY_JSON_FMT_STRSINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%d\",\n", Key, Val)
302 #define VTOY_JSON_FMT_STRSINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%d\",", P, Key, Val)
303 #define VTOY_JSON_FMT_STRSINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%d\",\n", P, Key, Val)
305 #define VTOY_JSON_FMT_CTRL_INT(Prefix, Key, Field) \
306 if (def->Field != data->Field) \
307 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%d\" },\n", Prefix, Key, data->Field)
309 #define VTOY_JSON_FMT_CTRL_STRN(P, Key, Field) \
310 if (strcmp(def->Field, data->Field)) \
311 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, data->Field)
313 #define VTOY_JSON_FMT_CTRL_STRN_STR(P, Key, ptr) \
314 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, ptr)
316 #define VTOY_JSON_FMT_CTRL_PUB_STRN(P, Key, Field) \
317 if (strcmp(def->Field, g_pub_path)) \
318 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, g_pub_path)
321 #define VTOY_JSON_FMT_DIFF_STRN(P, Key, Field) \
322 if (strcmp(def->Field, data->Field)) \
323 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, data->Field)
326 #define VTOY_JSON_FMT_STRINT64(Key, Val) \
327 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%llu\",", Key, Val)
329 #define VTOY_JSON_FMT_SINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %d,", Key, Val)
330 #define VTOY_JSON_FMT_SINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %d,\n", Key, Val)
331 #define VTOY_JSON_FMT_SINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %d,", P, Key, Val)
332 #define VTOY_JSON_FMT_SINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %d,\n", P, Key, Val)
334 #define VTOY_JSON_FMT_DUBL(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %.1lf,", Key, Val)
335 #define VTOY_JSON_FMT_DUBL2(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %10.02lf,", Key, Val)
337 #define VTOY_JSON_FMT_STRN(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%s\",", Key, Val)
338 #define VTOY_JSON_FMT_STRN_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%s\",\n", Key, Val)
339 #define VTOY_JSON_FMT_STRN_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",", P, Key, Val)
340 #define VTOY_JSON_FMT_STRN_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, Val)
341 #define VTOY_JSON_FMT_STRN_PATH_LN(P, Key, Val) \
342 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, ventoy_real_path(Val))
344 int vtoy_json_escape_string(char *buf
, int buflen
, const char *str
, int newline
);
346 #define VTOY_JSON_FMT_STRN_EX_LN(P, Key, Val) \
348 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": ", P, Key);\
349 __uiCurPos += vtoy_json_escape_string(__pcBuf + __uiCurPos, __uiBufLen - __uiCurPos, Val, 1);\
353 #define VTOY_JSON_FMT_NULL(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": null,", Key)
355 #define VTOY_JSON_FMT_TRUE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": true,", (Key))
356 #define VTOY_JSON_FMT_FALSE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": false,", (Key))
358 #define VTOY_JSON_FMT_BOOL(Key, Val) \
362 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": false,", (Key));\
366 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": true,", (Key));\
370 typedef struct tagVTOY_JSON_PARSE
377 #define JSON_SUCCESS 0
378 #define JSON_FAILED 1
379 #define JSON_NOT_FOUND 2
381 int vtoy_json_parse_value
389 VTOY_JSON
* vtoy_json_create(void);
390 int vtoy_json_parse(VTOY_JSON
*pstJson
, const char *szJsonData
);
391 int vtoy_json_parse_ex(VTOY_JSON
*pstJson
, const char *szJsonData
, int szLen
);
392 int vtoy_json_destroy(VTOY_JSON
*pstJson
);
393 VTOY_JSON
*vtoy_json_find_item
396 JSON_TYPE enDataType
,
399 int vtoy_json_scan_parse
401 const VTOY_JSON
*pstJson
,
403 VTOY_JSON_PARSE_S
*pstJsonParse
405 int vtoy_json_get_int
411 int vtoy_json_get_uint
417 int vtoy_json_get_uint64
423 int vtoy_json_get_bool
429 int vtoy_json_get_string
436 const char * vtoy_json_get_string_ex(VTOY_JSON
*pstJson
, const char *szKey
);
438 #endif /* __VENTOY_JSON_H__ */