123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666 |
- #ifndef ZEPHYR_INCLUDE_DATA_JSON_H_
- #define ZEPHYR_INCLUDE_DATA_JSON_H_
- #include <sys/util.h>
- #include <stddef.h>
- #include <zephyr/types.h>
- #include <sys/types.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- enum json_tokens {
-
- JSON_TOK_NONE = '_',
- JSON_TOK_OBJECT_START = '{',
- JSON_TOK_OBJECT_END = '}',
- JSON_TOK_LIST_START = '[',
- JSON_TOK_LIST_END = ']',
- JSON_TOK_STRING = '"',
- JSON_TOK_COLON = ':',
- JSON_TOK_COMMA = ',',
- JSON_TOK_NUMBER = '0',
- JSON_TOK_TRUE = 't',
- JSON_TOK_FALSE = 'f',
- JSON_TOK_NULL = 'n',
- JSON_TOK_ERROR = '!',
- JSON_TOK_EOF = '\0',
- };
- struct json_obj_descr {
- const char *field_name;
-
- uint32_t align_shift : 2;
-
- uint32_t field_name_len : 7;
-
- uint32_t type : 7;
-
- uint32_t offset : 16;
- union {
- struct {
- const struct json_obj_descr *sub_descr;
- size_t sub_descr_len;
- } object;
- struct {
- const struct json_obj_descr *element_descr;
- size_t n_elements;
- } array;
- };
- };
- typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
- void *data);
- #define Z_ALIGN_SHIFT(type) (__alignof__(type) == 1 ? 0 : \
- __alignof__(type) == 2 ? 1 : \
- __alignof__(type) == 4 ? 2 : 3)
- #define JSON_OBJ_DESCR_PRIM(struct_, field_name_, type_) \
- { \
- .field_name = (#field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = sizeof(#field_name_) - 1, \
- .type = type_, \
- .offset = offsetof(struct_, field_name_), \
- }
- #define JSON_OBJ_DESCR_OBJECT(struct_, field_name_, sub_descr_) \
- { \
- .field_name = (#field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = (sizeof(#field_name_) - 1), \
- .type = JSON_TOK_OBJECT_START, \
- .offset = offsetof(struct_, field_name_), \
- { \
- .object = { \
- .sub_descr = sub_descr_, \
- .sub_descr_len = ARRAY_SIZE(sub_descr_), \
- }, \
- }, \
- }
- #define JSON_OBJ_DESCR_ARRAY(struct_, field_name_, max_len_, \
- len_field_, elem_type_) \
- { \
- .field_name = (#field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = sizeof(#field_name_) - 1, \
- .type = JSON_TOK_LIST_START, \
- .offset = offsetof(struct_, field_name_), \
- { \
- .array = { \
- .element_descr = (struct json_obj_descr[]) { { \
- .align_shift = \
- Z_ALIGN_SHIFT(struct_), \
- .type = elem_type_, \
- .offset = \
- offsetof(struct_, \
- len_field_), \
- } }, \
- .n_elements = (max_len_), \
- }, \
- }, \
- }
- #define JSON_OBJ_DESCR_OBJ_ARRAY(struct_, field_name_, max_len_, \
- len_field_, elem_descr_, elem_descr_len_) \
- { \
- .field_name = (#field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = sizeof(#field_name_) - 1, \
- .type = JSON_TOK_LIST_START, \
- .offset = offsetof(struct_, field_name_), \
- { \
- .array = { \
- .element_descr = (struct json_obj_descr[]) { { \
- .align_shift = \
- Z_ALIGN_SHIFT(struct_), \
- .type = JSON_TOK_OBJECT_START, \
- .offset = offsetof(struct_, \
- len_field_), \
- { \
- .object = { \
- .sub_descr = \
- elem_descr_, \
- .sub_descr_len = \
- elem_descr_len_, \
- }, \
- }, \
- } }, \
- .n_elements = (max_len_), \
- }, \
- }, \
- }
- #define JSON_OBJ_DESCR_ARRAY_ARRAY(struct_, field_name_, max_len_, len_field_, \
- elem_descr_, elem_descr_len_) \
- { \
- .field_name = (#field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = sizeof(#field_name_) - 1, \
- .type = JSON_TOK_LIST_START, \
- .offset = offsetof(struct_, field_name_), \
- { \
- .array = { \
- .element_descr = (struct json_obj_descr[]) { { \
- .align_shift = \
- Z_ALIGN_SHIFT(struct_), \
- .type = JSON_TOK_LIST_START, \
- .offset = offsetof(struct_, \
- len_field_), \
- { \
- .array = { \
- .element_descr = \
- elem_descr_, \
- .n_elements = \
- 1 + \
- ZERO_OR_COMPILE_ERROR( \
- elem_descr_len_ == 1 \
- ), \
- }, \
- }, \
- } }, \
- .n_elements = (max_len_), \
- }, \
- }, \
- }
- #define JSON_OBJ_DESCR_PRIM_NAMED(struct_, json_field_name_, \
- struct_field_name_, type_) \
- { \
- .field_name = (json_field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = sizeof(json_field_name_) - 1, \
- .type = type_, \
- .offset = offsetof(struct_, struct_field_name_), \
- }
- #define JSON_OBJ_DESCR_OBJECT_NAMED(struct_, json_field_name_, \
- struct_field_name_, sub_descr_) \
- { \
- .field_name = (json_field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = (sizeof(json_field_name_) - 1), \
- .type = JSON_TOK_OBJECT_START, \
- .offset = offsetof(struct_, struct_field_name_), \
- { \
- .object = { \
- .sub_descr = sub_descr_, \
- .sub_descr_len = ARRAY_SIZE(sub_descr_), \
- }, \
- }, \
- }
- #define JSON_OBJ_DESCR_ARRAY_NAMED(struct_, json_field_name_,\
- struct_field_name_, max_len_, len_field_, \
- elem_type_) \
- { \
- .field_name = (json_field_name_), \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = sizeof(json_field_name_) - 1, \
- .type = JSON_TOK_LIST_START, \
- .offset = offsetof(struct_, struct_field_name_), \
- { \
- .array = { \
- .element_descr = (struct json_obj_descr[]) { { \
- .align_shift = \
- Z_ALIGN_SHIFT(struct_), \
- .type = elem_type_, \
- .offset = offsetof(struct_, \
- len_field_), \
- } }, \
- .n_elements = (max_len_), \
- }, \
- }, \
- }
- #define JSON_OBJ_DESCR_OBJ_ARRAY_NAMED(struct_, json_field_name_, \
- struct_field_name_, max_len_, \
- len_field_, elem_descr_, \
- elem_descr_len_) \
- { \
- .field_name = json_field_name_, \
- .align_shift = Z_ALIGN_SHIFT(struct_), \
- .field_name_len = sizeof(json_field_name_) - 1, \
- .type = JSON_TOK_LIST_START, \
- .offset = offsetof(struct_, struct_field_name_), \
- { \
- .array = { \
- .element_descr = (struct json_obj_descr[]) { { \
- .align_shift = \
- Z_ALIGN_SHIFT(struct_), \
- .type = JSON_TOK_OBJECT_START, \
- .offset = offsetof(struct_, \
- len_field_), \
- { \
- .object = { \
- .sub_descr = \
- elem_descr_, \
- .sub_descr_len = \
- elem_descr_len_, \
- }, \
- }, \
- } }, \
- .n_elements = (max_len_), \
- }, \
- }, \
- }
- int json_obj_parse(char *json, size_t len,
- const struct json_obj_descr *descr, size_t descr_len,
- void *val);
- ssize_t json_escape(char *str, size_t *len, size_t buf_size);
- size_t json_calc_escaped_len(const char *str, size_t len);
- ssize_t json_calc_encoded_len(const struct json_obj_descr *descr,
- size_t descr_len, const void *val);
- int json_obj_encode_buf(const struct json_obj_descr *descr, size_t descr_len,
- const void *val, char *buffer, size_t buf_size);
- int json_arr_encode_buf(const struct json_obj_descr *descr, const void *val,
- char *buffer, size_t buf_size);
- int json_obj_encode(const struct json_obj_descr *descr, size_t descr_len,
- const void *val, json_append_bytes_t append_bytes,
- void *data);
- int json_arr_encode(const struct json_obj_descr *descr, const void *val,
- json_append_bytes_t append_bytes, void *data);
- #ifdef __cplusplus
- }
- #endif
- #endif
|