]>
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_DUPLICATE "{ \"result\" : \"duplicate\" }"
74 #define VTOY_JSON_BUSY_RET "{ \"result\" : \"busy\" }"
75 #define VTOY_JSON_INUSE_RET "{ \"result\" : \"inuse\" }"
76 #define VTOY_JSON_NOTFOUND_RET "{ \"result\" : \"notfound\" }"
77 #define VTOY_JSON_NOTRUNNING_RET "{ \"result\" : \"notrunning\" }"
78 #define VTOY_JSON_NOT_READY_RET "{ \"result\" : \"notready\" }"
79 #define VTOY_JSON_NOT_SUPPORT_RET "{ \"result\" : \"notsupport\" }"
80 #define VTOY_JSON_MBR_2TB_RET "{ \"result\" : \"mbr2tb\" }"
81 #define VTOY_JSON_INVALID_RSV_RET "{ \"result\" : \"reserve_invalid\" }"
82 #define VTOY_JSON_FILE_NOT_FOUND_RET "{ \"result\" : \"file_not_found\" }"
84 typedef enum tagJSON_TYPE
95 typedef struct tagVTOY_JSON
97 struct tagVTOY_JSON
*pstPrev
;
98 struct tagVTOY_JSON
*pstNext
;
99 struct tagVTOY_JSON
*pstChild
;
101 JSON_TYPE enDataType
;
112 #define VTOY_JSON_FMT_BEGIN(uiCurPos, pcBuf, uiBufLen) \
114 uint32_t __uiCurPos = (uiCurPos);\
115 uint32_t __uiBufLen = (uiBufLen);\
116 char *__pcBuf = (pcBuf);
118 #define VTOY_JSON_FMT_END(uiCurPos) \
119 (uiCurPos) = __uiCurPos;\
122 #define VTOY_JSON_FMT_OBJ_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{")
123 #define VTOY_JSON_FMT_OBJ_BEGIN_L(P) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{", P)
124 #define VTOY_JSON_FMT_OBJ_BEGIN_N() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{\n")
125 #define VTOY_JSON_FMT_OBJ_BEGIN_LN(P) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{\n", P)
127 #define VTOY_JSON_FMT_OBJ_END() \
129 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
133 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\
136 #define VTOY_JSON_FMT_OBJ_ENDEX() \
138 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
142 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "},");\
147 #define VTOY_JSON_FMT_KEY(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":", (Key))
148 #define VTOY_JSON_FMT_KEY_L(P, Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\":", P, (Key))
151 #define VTOY_JSON_FMT_ITEM(Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\",", (Item))
152 #define VTOY_JSON_FMT_ITEM_L(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",", P, (Item))
153 #define VTOY_JSON_FMT_ITEM_LN(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",\n", P, (Item))
154 #define VTOY_JSON_FMT_ITEM_PATH_LN(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",\n", P, ventoy_real_path(Item))
156 #define VTOY_JSON_FMT_ITEM_INT(Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%d,", (Item))
159 #define VTOY_JSON_FMT_COMA() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",")
160 #define VTOY_JSON_FMT_COMA_N(cnt) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",\n")
161 #define VTOY_JSON_FMT_COMA_N_CNT(cnt) if ((cnt) > 0) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",\n")
164 #define VTOY_JSON_FMT_APPEND_BEGIN() \
166 if ('}' == *(__pcBuf + (__uiCurPos - 1)))\
170 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",");\
173 #define VTOY_JSON_FMT_APPEND_END() \
175 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\
178 #define VTOY_JSON_FMT_ARY_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[")
179 #define VTOY_JSON_FMT_ARY_BEGIN_N() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[\n")
181 #define VTOY_JSON_FMT_ARY_END() \
183 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
187 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "]");\
189 #define VTOY_JSON_FMT_ARY_ENDEX() \
191 if (',' == *(__pcBuf + (__uiCurPos - 1)))\
195 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "],");\
200 #define VTOY_JSON_FMT_OBJ_END_L(P) \
202 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
204 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
207 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s}%s", P);\
209 #define VTOY_JSON_FMT_OBJ_ENDEX_L(P) \
211 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
213 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
216 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s},%s", P);\
219 #define VTOY_JSON_FMT_OBJ_END_LN(P) \
221 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
223 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
226 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s}\n", P);\
228 #define VTOY_JSON_FMT_OBJ_ENDEX_LN(P) \
230 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
232 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
235 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s},\n", P);\
241 #define VTOY_JSON_FMT_ARY_END_L(P) \
243 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
245 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
248 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s]", P);\
251 #define VTOY_JSON_FMT_ARY_END_LN(P) \
253 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
255 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
258 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s]\n", P);\
261 #define VTOY_JSON_FMT_ARY_ENDEX_L(P) \
263 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
265 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
268 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s],", P);\
272 #define VTOY_JSON_FMT_ARY_ENDEX_LN(P) \
274 if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\
276 *(__pcBuf + (__uiCurPos - 2)) = '\n';\
279 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s],\n", P);\
285 #define VTOY_JSON_FMT_UINT64(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %llu,", Key, (_ull)Val)
287 #define VTOY_JSON_FMT_ULONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %lu,", Key, Val)
288 #define VTOY_JSON_FMT_LONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %ld,", Key, Val)
290 #define VTOY_JSON_FMT_UINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %u,", Key, Val)
291 #define VTOY_JSON_FMT_UINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %u,\n", Key, Val)
292 #define VTOY_JSON_FMT_UINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %u,", P, Key, Val)
293 #define VTOY_JSON_FMT_UINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %u,\n", P, Key, Val)
296 #define VTOY_JSON_FMT_STRUINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%u\",", Key, Val)
297 #define VTOY_JSON_FMT_STRUINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%u\",\n", Key, Val)
298 #define VTOY_JSON_FMT_STRUINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%u\",", P, Key, Val)
299 #define VTOY_JSON_FMT_STRUINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%u\",\n", P, Key, Val)
301 #define VTOY_JSON_FMT_STRSINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%d\",", Key, Val)
302 #define VTOY_JSON_FMT_STRSINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%d\",\n", Key, Val)
303 #define VTOY_JSON_FMT_STRSINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%d\",", P, Key, Val)
304 #define VTOY_JSON_FMT_STRSINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%d\",\n", P, Key, Val)
306 #define VTOY_JSON_FMT_CTRL_INT(Prefix, Key, Field) \
307 if (def->Field != data->Field) \
308 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%d\" },\n", Prefix, Key, data->Field)
310 #define VTOY_JSON_FMT_CTRL_STRN(P, Key, Field) \
311 if (strcmp(def->Field, data->Field)) \
312 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, data->Field)
314 #define VTOY_JSON_FMT_CTRL_STRN_STR(P, Key, ptr) \
315 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, ptr)
317 #define VTOY_JSON_FMT_CTRL_PUB_STRN(P, Key, Field) \
318 if (strcmp(def->Field, g_pub_path)) \
319 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, g_pub_path)
322 #define VTOY_JSON_FMT_DIFF_STRN(P, Key, Field) \
323 if (strcmp(def->Field, data->Field)) \
324 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, data->Field)
327 #define VTOY_JSON_FMT_STRINT64(Key, Val) \
328 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%llu\",", Key, Val)
330 #define VTOY_JSON_FMT_SINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %d,", Key, Val)
331 #define VTOY_JSON_FMT_SINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %d,\n", Key, Val)
332 #define VTOY_JSON_FMT_SINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %d,", P, Key, Val)
333 #define VTOY_JSON_FMT_SINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %d,\n", P, Key, Val)
335 #define VTOY_JSON_FMT_DUBL(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %.1lf,", Key, Val)
336 #define VTOY_JSON_FMT_DUBL2(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %10.02lf,", Key, Val)
338 #define VTOY_JSON_FMT_STRN(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%s\",", Key, Val)
339 #define VTOY_JSON_FMT_STRN_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%s\",\n", Key, Val)
340 #define VTOY_JSON_FMT_STRN_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",", P, Key, Val)
341 #define VTOY_JSON_FMT_STRN_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, Val)
342 #define VTOY_JSON_FMT_STRN_PATH_LN(P, Key, Val) \
343 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, ventoy_real_path(Val))
345 int vtoy_json_escape_string(char *buf
, int buflen
, const char *str
, int newline
);
347 #define VTOY_JSON_FMT_STRN_EX_LN(P, Key, Val) \
349 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": ", P, Key);\
350 __uiCurPos += vtoy_json_escape_string(__pcBuf + __uiCurPos, __uiBufLen - __uiCurPos, Val, 1);\
354 #define VTOY_JSON_FMT_NULL(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": null,", Key)
356 #define VTOY_JSON_FMT_TRUE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": true,", (Key))
357 #define VTOY_JSON_FMT_FALSE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": false,", (Key))
359 #define VTOY_JSON_FMT_BOOL(Key, Val) \
363 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": false,", (Key));\
367 ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": true,", (Key));\
371 typedef struct tagVTOY_JSON_PARSE
378 #define JSON_SUCCESS 0
379 #define JSON_FAILED 1
380 #define JSON_NOT_FOUND 2
382 int vtoy_json_parse_value
390 VTOY_JSON
* vtoy_json_create(void);
391 int vtoy_json_parse(VTOY_JSON
*pstJson
, const char *szJsonData
);
392 int vtoy_json_parse_ex(VTOY_JSON
*pstJson
, const char *szJsonData
, int szLen
);
393 int vtoy_json_destroy(VTOY_JSON
*pstJson
);
394 VTOY_JSON
*vtoy_json_find_item
397 JSON_TYPE enDataType
,
400 int vtoy_json_scan_parse
402 const VTOY_JSON
*pstJson
,
404 VTOY_JSON_PARSE_S
*pstJsonParse
406 int vtoy_json_get_int
412 int vtoy_json_get_uint
418 int vtoy_json_get_uint64
424 int vtoy_json_get_bool
430 int vtoy_json_get_string
437 const char * vtoy_json_get_string_ex(VTOY_JSON
*pstJson
, const char *szKey
);
439 #endif /* __VENTOY_JSON_H__ */