16 #ifndef LY_TREE_DATA_H_
17 #define LY_TREE_DATA_H_
19 #include <arpa/inet.h>
20 #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__)
21 #include <netinet/in.h>
22 #include <sys/socket.h>
421 #define LYD_TREE_DFS_BEGIN(START, ELEM) \
422 { ly_bool LYD_TREE_DFS_continue = 0; struct lyd_node *LYD_TREE_DFS_next; \
423 for ((ELEM) = (LYD_TREE_DFS_next) = (struct lyd_node *)(START); \
425 (ELEM) = (LYD_TREE_DFS_next), LYD_TREE_DFS_continue = 0)
441 #define LYD_TREE_DFS_END(START, ELEM) \
443 if (LYD_TREE_DFS_continue) { \
444 (LYD_TREE_DFS_next) = NULL; \
446 (LYD_TREE_DFS_next) = lyd_child(ELEM); \
448 if (!(LYD_TREE_DFS_next)) { \
450 if ((ELEM) == (struct lyd_node *)(START)) { \
455 (LYD_TREE_DFS_next) = (ELEM)->next; \
457 while (!(LYD_TREE_DFS_next)) { \
459 (ELEM) = (struct lyd_node *)(ELEM)->parent; \
461 if ((ELEM)->parent == (START)->parent) { \
465 (LYD_TREE_DFS_next) = (ELEM)->next; \
475 #define LYD_LIST_FOR_INST(START, SCHEMA, ELEM) \
476 for (lyd_find_sibling_val(START, SCHEMA, NULL, 0, &(ELEM)); \
477 (ELEM) && ((ELEM)->schema == (SCHEMA)); \
478 (ELEM) = (ELEM)->next)
488 #define LYD_LIST_FOR_INST_SAFE(START, SCHEMA, NEXT, ELEM) \
489 for (lyd_find_sibling_val(START, SCHEMA, NULL, 0, &(ELEM)); \
490 (ELEM) && ((ELEM)->schema == (SCHEMA)) ? ((NEXT) = (ELEM)->next, 1) : 0; \
498 #define LYD_CTX(node) ((node)->schema ? (node)->schema->module->ctx : ((struct lyd_node_opaq *)(node))->ctx)
556 struct ly_path *target;
560 uint8_t fixed_mem[LYD_VALUE_FIXED_MEM_SIZE];
573 #define LYD_VALUE_GET(value, type_val) \
574 ((sizeof *(type_val) > LYD_VALUE_FIXED_MEM_SIZE) \
575 ? ((type_val) = (((value)->dyn_mem))) \
576 : ((type_val) = ((void *)((value)->fixed_mem))))
644 struct in6_addr
addr;
651 struct in6_addr
addr;
659 struct in6_addr
addr;
700 const char *module_ns;
701 const char *module_name;
718 #define LYD_NODE_INNER (LYS_CONTAINER|LYS_LIST|LYS_RPC|LYS_ACTION|LYS_NOTIF)
719 #define LYD_NODE_TERM (LYS_LEAF|LYS_LEAFLIST)
720 #define LYD_NODE_ANY (LYS_ANYDATA)
745 #define LYD_DEFAULT 0x01
746 #define LYD_WHEN_TRUE 0x02
798 #define LYD_HT_MIN_ITEMS 4
876 #define LYD_NAME(node) ((node)->schema ? (node)->schema->name : ((struct lyd_node_opaq *)node)->name.name)
887 #define LYD_VALHINT_STRING 0x0001
888 #define LYD_VALHINT_DECNUM 0x0002
889 #define LYD_VALHINT_OCTNUM 0x0004
890 #define LYD_VALHINT_HEXNUM 0x0008
891 #define LYD_VALHINT_NUM64 0x0010
892 #define LYD_VALHINT_BOOLEAN 0x0020
893 #define LYD_VALHINT_EMPTY 0x0040
907 #define LYD_NODEHINT_LIST 0x0080
908 #define LYD_NODEHINT_LEAFLIST 0x0100
923 #define LYD_HINT_DATA 0x01F3
927 #define LYD_HINT_SCHEMA 0x01FF
976 lyd_parent(
const struct lyd_node *node)
982 return &node->
parent->node;
996 lyd_child(
const struct lyd_node *node)
1093 static inline const char *
1094 lyd_get_value(
const struct lyd_node *node)
1116 static inline const char *
1117 lyd_get_meta_value(
const struct lyd_meta *meta)
1373 const char *prefix,
const char *module_name,
struct lyd_node **node);
1388 const char *prefix,
const char *module_ns,
struct lyd_node **node);
1429 #define LYD_NEW_PATH_UPDATE 0x01
1433 #define LYD_NEW_PATH_OUTPUT 0x02
1435 #define LYD_NEW_PATH_OPAQ 0x04
1438 #define LYD_NEW_PATH_BIN_VALUE 0x08
1440 #define LYD_NEW_PATH_CANON_VALUE 0x10
1471 uint32_t options,
struct lyd_node **node);
1516 uint32_t options,
struct lyd_node **node);
1531 #define LYD_IMPLICIT_NO_STATE 0x01
1532 #define LYD_IMPLICIT_NO_CONFIG 0x02
1533 #define LYD_IMPLICIT_OUTPUT 0x04
1534 #define LYD_IMPLICIT_NO_DEFAULTS 0x08
1786 #define LYD_COMPARE_FULL_RECURSION 0x01
1790 #define LYD_COMPARE_DEFAULTS 0x02
1839 #define LYD_DUP_RECURSIVE 0x01
1841 #define LYD_DUP_NO_META 0x02
1842 #define LYD_DUP_WITH_PARENTS 0x04
1844 #define LYD_DUP_WITH_FLAGS 0x08
1900 #define LYD_MERGE_DESTRUCT 0x01
1901 #define LYD_MERGE_DEFAULTS 0x02
1977 lyd_merge_cb merge_cb,
void *cb_data, uint16_t options);
1990 #define LYD_DIFF_DEFAULTS 0x01
2089 #define LYD_DIFF_MERGE_DEFAULTS 0x01
2118 lyd_diff_cb diff_cb,
void *cb_data, uint16_t options);
2137 lyd_diff_cb diff_cb,
void *cb_data, uint16_t options);
2245 size_t val_len,
struct lyd_node **match);
LYD_ANYDATA_VALUETYPE
List of possible value types stored in lyd_node_any.
LYD_FORMAT
Data input/output formats supported by libyang parser and printer functions.
#define LYD_CTX(node)
Macro to get context from a data tree node.
LY_ERR
libyang's error codes returned by the libyang functions.
Structure to hold a set of (not necessary somehow connected) objects. Usually used for lyd_node,...
struct lys_module * module
Available YANG schema tree structures representing YANG module.
LY_VALUE_FORMAT
All kinds of supported value formats and prefix mappings to modules.
Logger manipulation routines and error definitions.
uint8_t ly_bool
Type to indicate boolean value.
libyang generic macros and functions to work with YANG schema or data trees.
LY_ERR lyd_new_attr(struct lyd_node *parent, const char *module_name, const char *name, const char *value, struct lyd_attr **attr)
Create new JSON attribute for an opaque data node. To create an XML attribute, use lyd_new_attr2().
LY_ERR lyd_new_ext_path(struct lyd_node *parent, const struct lysc_ext_instance *ext, const char *path, const void *value, uint32_t options, struct lyd_node **node)
Create a new node defined in the given extension instance. In case of anyxml/anydata nodes,...
LY_ERR lyd_any_value_str(const struct lyd_node *any, char **value_str)
Get anydata string value.
struct lyd_node * lyd_first_sibling(const struct lyd_node *node)
Get the first sibling of the given node.
LY_ERR ly_time_ts2str(const struct timespec *ts, char **str)
Convert timespec into date-and-time string value.
LY_ERR lyd_diff_siblings(const struct lyd_node *first, const struct lyd_node *second, uint16_t options, struct lyd_node **diff)
Learn the differences between 2 data trees including all the following siblings.
LY_ERR lyd_new_inner(struct lyd_node *parent, const struct lys_module *module, const char *name, ly_bool output, struct lyd_node **node)
Create a new inner node in the data tree.
LY_ERR lyd_new_ext_inner(const struct lysc_ext_instance *ext, const char *name, struct lyd_node **node)
Create a new top-level inner node defined in the given extension instance.
uint32_t lyd_list_pos(const struct lyd_node *instance)
Learn the relative position of a list or leaf-list instance within other instances of the same schema...
LYD_PATH_TYPE
Types of the different data paths.
@ LYD_PATH_STD_NO_LAST_PRED
LY_ERR lyd_new_term_canon(struct lyd_node *parent, const struct lys_module *module, const char *name, const char *val_str, ly_bool output, struct lyd_node **node)
Create a new term node in the data tree.
const struct lysc_type * realtype
LY_ERR lyd_new_implicit_module(struct lyd_node **tree, const struct lys_module *module, uint32_t implicit_options, struct lyd_node **diff)
Add any missing implicit nodes of one module. Default nodes with a false "when" are not added.
LY_ERR lyd_new_path2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path, const void *value, size_t value_len, LYD_ANYDATA_VALUETYPE value_type, uint32_t options, struct lyd_node **new_parent, struct lyd_node **new_node)
Create a new node in the data tree based on a path. All node types can be created.
LYD_ANYDATA_VALUETYPE value_type
LY_ERR lyd_find_sibling_val(const struct lyd_node *siblings, const struct lysc_node *schema, const char *key_or_value, size_t val_len, struct lyd_node **match)
Search in the given siblings for the first schema instance. Uses hashes - should be used whenever pos...
LY_ERR lyd_new_implicit_tree(struct lyd_node *tree, uint32_t implicit_options, struct lyd_node **diff)
Add any missing implicit nodes into a data subtree. Default nodes with a false "when" are not added.
void lyd_unlink_tree(struct lyd_node *node)
Unlink the specified data subtree.
LY_ERR lyd_new_term(struct lyd_node *parent, const struct lys_module *module, const char *name, const char *val_str, ly_bool output, struct lyd_node **node)
Create a new term node in the data tree.
LY_ERR lyd_new_meta(const struct ly_ctx *ctx, struct lyd_node *parent, const struct lys_module *module, const char *name, const char *val_str, ly_bool clear_dflt, struct lyd_meta **meta)
Create new metadata.
LY_ERR lyd_diff_tree(const struct lyd_node *first, const struct lyd_node *second, uint16_t options, struct lyd_node **diff)
Learn the differences between 2 data trees.
LY_ERR(* lyd_diff_cb)(const struct lyd_node *diff_node, struct lyd_node *data_node, void *cb_data)
Callback for diff nodes.
LY_ERR lyd_value_validate(const struct ly_ctx *ctx, const struct lysc_node *schema, const char *value, size_t value_len, const struct lyd_node *ctx_node, const struct lysc_type **realtype, const char **canonical)
Check type restrictions applicable to the particular leaf/leaf-list with the given string value.
LY_ERR lyd_find_xpath(const struct lyd_node *ctx_node, const char *xpath, struct ly_set **set)
Search in the given data for instances of nodes matching the provided XPath.
struct lysc_type_bitenum_item ** items
const struct ly_ctx * ctx
LY_ERR lyd_find_path(const struct lyd_node *ctx_node, const char *path, ly_bool output, struct lyd_node **match)
Search in given data for a node uniquely identified by a path.
void lyd_free_meta_siblings(struct lyd_meta *meta)
Free the metadata instance with any following instances.
LY_ERR lyd_compare_siblings(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options)
Compare 2 lists of siblings if they are equivalent.
LY_ERR lyd_dup_meta_single(const struct lyd_meta *meta, struct lyd_node *parent, struct lyd_meta **dup)
Create a copy of the metadata.
LY_ERR lyd_compare_meta(const struct lyd_meta *meta1, const struct lyd_meta *meta2)
Compare 2 metadata.
int lyd_lyb_data_length(const char *data)
Learn the length of LYB data.
LY_ERR lyd_new_list2(struct lyd_node *parent, const struct lys_module *module, const char *name, const char *keys, ly_bool output, struct lyd_node **node)
Create a new list node in the data tree.
LY_ERR lyd_find_sibling_first(const struct lyd_node *siblings, const struct lyd_node *target, struct lyd_node **match)
Search in the given siblings (NOT recursively) for the first target instance with the same value....
LY_ERR(* lyd_merge_cb)(struct lyd_node *trg_node, const struct lyd_node *src_node, void *cb_data)
Callback for matching merge nodes.
LY_ERR lyd_new_term_bin(struct lyd_node *parent, const struct lys_module *module, const char *name, const void *value, size_t value_len, ly_bool output, struct lyd_node **node)
Create a new term node in the data tree.
LY_ERR lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node)
Insert a node before another node, can be used only for user-ordered nodes. If inserting several sibl...
struct lyd_meta * lyd_find_meta(const struct lyd_meta *first, const struct lys_module *module, const char *name)
Find a specific metadata.
LY_ERR lyd_diff_merge_module(struct lyd_node **diff, const struct lyd_node *src_diff, const struct lys_module *mod, lyd_diff_cb diff_cb, void *cb_data, uint16_t options)
Merge 2 diffs into each other but restrict the operation to one module.
const struct lys_module * lyd_owner_module(const struct lyd_node *node)
Get the owner module of the data node. It is the module of the top-level schema node....
LY_ERR lyd_find_sibling_opaq_next(const struct lyd_node *first, const char *name, struct lyd_node **match)
Search the given siblings for an opaque node with a specific name.
const struct lysc_node * schema
LY_ERR lyd_merge_siblings(struct lyd_node **target, const struct lyd_node *source, uint16_t options)
Merge the source data tree with any following siblings into the target data tree. Merge may not be co...
LY_ERR lyd_merge_module(struct lyd_node **target, const struct lyd_node *source, const struct lys_module *mod, lyd_merge_cb merge_cb, void *cb_data, uint16_t options)
Merge all the nodes of a module from source data tree into the target data tree. Merge may not be com...
void lyd_free_siblings(struct lyd_node *node)
Free all the sibling nodes (preceding as well as succeeding).
LY_ERR lyd_any_copy_value(struct lyd_node *trg, const union lyd_any_value *value, LYD_ANYDATA_VALUETYPE value_type)
Copy anydata value from one node to another. Target value is freed first.
void lyd_free_all(struct lyd_node *node)
Free all the nodes (even parents of the node) in the data tree.
ly_bool lyd_is_default(const struct lyd_node *node)
Check whether a node value equals to its default one.
void lyd_free_attr_siblings(const struct ly_ctx *ctx, struct lyd_attr *attr)
Free the attribute with any following attributes.
const struct lyd_node_term * lyd_target(const struct ly_path *path, const struct lyd_node *tree)
Find the target in data of a compiled instance-identifier path (the target member in lyd_value).
LY_ERR lyd_change_meta(struct lyd_meta *meta, const char *val_str)
Change the value of a metadata instance.
LY_ERR lyd_diff_merge_tree(struct lyd_node **diff_first, struct lyd_node *diff_parent, const struct lyd_node *src_sibling, lyd_diff_cb diff_cb, void *cb_data, uint16_t options)
Merge 2 diff trees into each other.
LY_ERR lyd_dup_single(const struct lyd_node *node, struct lyd_node_inner *parent, uint32_t options, struct lyd_node **dup)
Create a copy of the specified data tree node. Schema references are kept the same.
struct lysc_ext_instance * annotation
void lyd_free_attr_single(const struct ly_ctx *ctx, struct lyd_attr *attr)
Free a single attribute.
LY_ERR ly_time_str2ts(const char *value, struct timespec *ts)
Convert date-and-time from string to timespec.
struct hash_table * children_ht
LY_ERR ly_time_str2time(const char *value, time_t *time, char **fractions_s)
Convert date-and-time from string to UNIX timestamp and fractions of a second.
LY_ERR lyd_diff_apply_module(struct lyd_node **data, const struct lyd_node *diff, const struct lys_module *mod, lyd_diff_cb diff_cb, void *cb_data)
Apply the whole diff on a data tree but restrict the operation to one module.
LY_ERR lyd_diff_apply_all(struct lyd_node **data, const struct lyd_node *diff)
Apply the whole diff tree on a data tree.
LY_ERR lyd_change_term_canon(struct lyd_node *term, const char *val_str)
Change the value of a term (leaf or leaf-list) node to a canonical string value.
LY_ERR lyd_new_ext_any(const struct lysc_ext_instance *ext, const char *name, const void *value, ly_bool use_value, LYD_ANYDATA_VALUETYPE value_type, struct lyd_node **node)
Create a new top-level any node defined in the given extension instance.
LY_ERR lyd_new_attr2(struct lyd_node *parent, const char *module_ns, const char *name, const char *value, struct lyd_attr **attr)
Create new XML attribute for an opaque data node. To create a JSON attribute, use lyd_new_attr().
LY_ERR lyd_compare_single(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options)
Compare 2 data nodes if they are equivalent.
void lyd_free_tree(struct lyd_node *node)
Free (and unlink) the specified data (sub)tree.
LY_ERR lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node)
Insert a node after another node, can be used only for user-ordered nodes. If inserting several sibli...
LY_ERR ly_time_time2str(time_t time, const char *fractions_s, char **str)
Convert UNIX timestamp and fractions of a second into canonical date-and-time string value.
LY_ERR lyd_new_ext_term(const struct lysc_ext_instance *ext, const char *name, const char *val_str, struct lyd_node **node)
Create a new top-level term node defined in the given extension instance.
LY_ERR lyd_value_compare(const struct lyd_node_term *node, const char *value, size_t value_len)
Compare the node's value with the given string value. The string value is first validated according t...
LY_ERR lyd_new_ext_list(const struct lysc_ext_instance *ext, const char *name, struct lyd_node **node,...)
Create a new top-level list node defined in the given extension instance.
LY_ERR lyd_new_implicit_all(struct lyd_node **tree, const struct ly_ctx *ctx, uint32_t implicit_options, struct lyd_node **diff)
Add any missing implicit nodes. Default nodes with a false "when" are not added.
char * lyd_path(const struct lyd_node *node, LYD_PATH_TYPE pathtype, char *buffer, size_t buflen)
Generate path of the given node in the requested format.
LY_ERR lyd_new_opaq2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *name, const char *value, const char *prefix, const char *module_ns, struct lyd_node **node)
Create a new XML opaque node in the data tree. To create a JSON opaque node, use lyd_new_opaq().
void lyd_free_meta_single(struct lyd_meta *meta)
Free a single metadata instance.
LY_ERR lyd_diff_merge_all(struct lyd_node **diff, const struct lyd_node *src_diff, uint16_t options)
Merge 2 diffs into each other.
LY_ERR lyd_new_meta2(const struct ly_ctx *ctx, struct lyd_node *parent, ly_bool clear_dflt, const struct lyd_attr *attr, struct lyd_meta **meta)
Create new metadata from an opaque node attribute if possible.
LY_ERR lyd_diff_reverse_all(const struct lyd_node *src_diff, struct lyd_node **diff)
Reverse a diff and make the opposite changes. Meaning change create to delete, delete to create,...
union lyd_any_value value
LY_ERR lyd_find_sibling_dup_inst_set(const struct lyd_node *siblings, const struct lyd_node *target, struct ly_set **set)
Search the given siblings for all the exact same instances of a specific node instance....
LY_ERR lyd_insert_child(struct lyd_node *parent, struct lyd_node *node)
Insert a child into a parent.
LY_ERR lyd_new_opaq(struct lyd_node *parent, const struct ly_ctx *ctx, const char *name, const char *value, const char *prefix, const char *module_name, struct lyd_node **node)
Create a new JSON opaque node in the data tree. To create an XML opaque node, use lyd_new_opaq2().
const char * lyd_value_get_canonical(const struct ly_ctx *ctx, const struct lyd_value *value)
Get the (canonical) value of a lyd_value.
LY_ERR lyd_dup_siblings(const struct lyd_node *node, struct lyd_node_inner *parent, uint32_t options, struct lyd_node **dup)
Create a copy of the specified data tree node with any following siblings. Schema references are kept...
LY_ERR lyd_merge_tree(struct lyd_node **target, const struct lyd_node *source, uint16_t options)
Merge the source data subtree into the target data tree. Merge may not be complete until validation i...
LY_ERR lyd_change_term(struct lyd_node *term, const char *val_str)
Change the value of a term (leaf or leaf-list) node to a string value.
struct lyd_node_opaq * parent
LY_ERR lyd_change_term_bin(struct lyd_node *term, const void *value, size_t value_len)
Change the value of a term (leaf or leaf-list) node to a binary value.
struct lyd_node_inner * parent
LY_ERR lyd_new_list(struct lyd_node *parent, const struct lys_module *module, const char *name, ly_bool output, struct lyd_node **node,...)
Create a new list node in the data tree.
LY_ERR lyd_new_any(struct lyd_node *parent, const struct lys_module *module, const char *name, const void *value, ly_bool use_value, LYD_ANYDATA_VALUETYPE value_type, ly_bool output, struct lyd_node **node)
Create a new any node in the data tree.
LY_ERR lyd_new_path(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path, const char *value, uint32_t options, struct lyd_node **node)
Create a new node in the data tree based on a path. If creating anyxml/anydata nodes,...
LY_ERR lyd_insert_sibling(struct lyd_node *sibling, struct lyd_node *node, struct lyd_node **first)
Insert a node into siblings.
struct lyd_node * lyd_child_no_keys(const struct lyd_node *node)
Get the child pointer of a generic data node but skip its keys in case it is LYS_LIST.
const struct lysc_node * ctx_node
Generic prefix and namespace mapping, meaning depends on the format.
Generic attribute structure.
Generic structure for a data node.
Data node structure for the anydata data tree nodes - anydata or anyxml.
Data node structure for the inner data tree nodes - containers, lists, RPCs, actions and Notification...
Data node structure for unparsed (opaque) nodes.
Data node structure for the terminal data tree nodes - leaves and leaf-lists.
YANG data representation.
Special lyd_value structure for built-in binary values.
Special lyd_value structure for built-in bits values.
Special lyd_value structure for ietf-yang-types date-and-time values.
Special lyd_value structure for ietf-inet-types ipv4-address values.
Special lyd_value structure for ietf-inet-types ipv4-address-no-zone values.
Special lyd_value structure for ietf-inet-types ipv4-prefix values.
Special lyd_value structure for ietf-inet-types ipv6-address values.
Special lyd_value structure for ietf-inet-types ipv6-address-no-zone values.
Special lyd_value structure for ietf-inet-types ipv6-prefix values.
Special lyd_value structure for built-in union values.
union for anydata/anyxml value representation.
libyang representation of YANG schema trees.