libyang 6.1.4
libyang is YANG data modelling language parser and toolkit written (and providing API) in C.
Loading...
Searching...
No Matches
tree_data.h
Go to the documentation of this file.
1
15
16#ifndef LY_TREE_DATA_H_
17#define LY_TREE_DATA_H_
18
19/* socket/ip includes in ly_config.h */
20
21#include <stddef.h>
22#include <stdint.h>
23#include <time.h>
24
25#include "log.h"
26#include "ly_config.h"
27#include "tree.h"
28#include "tree_schema.h"
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34struct ly_ctx;
35struct ly_path;
36struct ly_set;
37struct lyd_node;
38struct lyd_node_opaq;
39struct lyd_node_term;
40struct timespec;
41struct lyxp_var;
42struct rb_node;
43
199
315
368
380
388
389/* *INDENT-OFF* */
390
416#define LYD_TREE_DFS_BEGIN(START, ELEM) \
417 { ly_bool LYD_TREE_DFS_continue = 0; struct lyd_node *LYD_TREE_DFS_next; \
418 for ((ELEM) = (LYD_TREE_DFS_next) = (struct lyd_node *)(START); \
419 (ELEM); \
420 (ELEM) = (LYD_TREE_DFS_next), LYD_TREE_DFS_continue = 0)
421
425#define _LYD_TREE_DFS_END(START, ELEM, FUNC) \
426 /* select element for the next run - children first */ \
427 if (LYD_TREE_DFS_continue) { \
428 (LYD_TREE_DFS_next) = NULL; \
429 } else { \
430 (LYD_TREE_DFS_next) = FUNC(ELEM); \
431 }\
432 if (!(LYD_TREE_DFS_next)) { \
433 /* no children */ \
434 if ((ELEM) == (struct lyd_node *)(START)) { \
435 /* we are done, (START) has no children */ \
436 break; \
437 } \
438 /* try siblings */ \
439 (LYD_TREE_DFS_next) = (ELEM)->next; \
440 } \
441 while (!(LYD_TREE_DFS_next)) { \
442 /* parent is already processed, go to its sibling */ \
443 (ELEM) = (struct lyd_node *)(ELEM)->parent; \
444 /* no siblings, go back through parents */ \
445 if ((ELEM)->parent == (START)->parent) { \
446 /* we are done, no next element to process */ \
447 break; \
448 } \
449 (LYD_TREE_DFS_next) = (ELEM)->next; \
450 } }
451
467#define LYD_TREE_DFS_END(START, ELEM) \
468 _LYD_TREE_DFS_END(START, ELEM, lyd_child)
469
485#define LYD_TREE_ANY_DFS_END(START, ELEM) \
486 _LYD_TREE_DFS_END(START, ELEM, lyd_child_any)
487
495#define LYD_LIST_FOR_INST(START, SCHEMA, ELEM) \
496 for (lyd_find_sibling_val(START, SCHEMA, NULL, 0, &(ELEM)); \
497 (ELEM) && ((ELEM)->schema == (SCHEMA)); \
498 (ELEM) = (ELEM)->next)
499
508#define LYD_LIST_FOR_INST_SAFE(START, SCHEMA, NEXT, ELEM) \
509 for ((NEXT) = (ELEM) = NULL, lyd_find_sibling_val(START, SCHEMA, NULL, 0, &(ELEM)); \
510 (ELEM) && ((ELEM)->schema == (SCHEMA)) ? ((NEXT) = (ELEM)->next, 1) : 0; \
511 (ELEM) = (NEXT))
512
513/* *INDENT-ON* */
514
518#define LYD_CTX(node) ((node)->schema ? (node)->schema->module->ctx : ((const struct lyd_node_opaq *)(node))->ctx)
519
527#define LYD_NODE_IS_ALONE(NODE) \
528 (((NODE)->prev == NODE) || \
529 (((NODE)->prev->schema != (NODE)->schema) && (!(NODE)->next || ((NODE)->schema != (NODE)->next->schema))))
530
542
544
548struct lyd_value {
549 const char *_canonical;
552 const struct lysc_type *realtype;
559
560 union {
561 int8_t boolean;
562 int64_t dec64;
563 int8_t int8;
564 int16_t int16;
565 int32_t int32;
566 int64_t int64;
567 uint8_t uint8;
568 uint16_t uint16;
569 uint32_t uint32;
570 uint64_t uint64;
572 struct lysc_ident *ident;
573 struct ly_path *target;
575 struct lyd_value_union *subvalue;
576
577 void *dyn_mem;
578 uint8_t fixed_mem[LYD_VALUE_FIXED_MEM_SIZE];
579 };
580
581};
582
591#define LYD_VALUE_GET(value, type_val) \
592 ((sizeof *(type_val) > LYD_VALUE_FIXED_MEM_SIZE) \
593 ? ((type_val) = (((value)->dyn_mem))) \
594 : ((type_val) = ((void *)((value)->fixed_mem))))
595
615
626
631 void *data;
632 uint32_t size;
633};
634
639 struct in_addr addr;
640};
641
646 struct in_addr addr;
647 const char *zone;
648};
649
654 struct in_addr addr;
655 uint8_t prefix;
656};
657
662 struct in6_addr addr;
663};
664
669 struct in6_addr addr;
670 const char *zone;
671};
672
677 struct in6_addr addr;
678 uint8_t prefix;
679};
680
689
697
702 time_t time;
703};
704
713
718 uint32_t seconds;
720};
721
726 struct lyxp_expr *exp;
727 const struct ly_ctx *ctx;
730};
731
736 struct rb_node *rbt;
737};
738
747 const char *name;
748 const char *prefix;
749
750 union {
751 const char *module_ns;
752 const char *module_name;
753 };
754};
755
768
769#define LYD_NODE_INNER (LYS_CONTAINER|LYS_LIST|LYS_RPC|LYS_ACTION|LYS_NOTIF)
770#define LYD_NODE_TERM (LYS_LEAF|LYS_LEAFLIST)
771#define LYD_NODE_ANY (LYS_ANYDATA)
772
799
800#define LYD_DEFAULT 0x01
801#define LYD_WHEN_TRUE 0x02
802#define LYD_NEW 0x04
803#define LYD_EXT 0x08
804#define LYD_WHEN_FALSE 0x10
807
809
813struct lyd_node {
814 uint32_t hash;
818 uint32_t flags;
819 const struct lysc_node *schema;
820 struct lyd_node *parent;
821 struct lyd_node *next;
822 struct lyd_node *prev;
826 struct lyd_meta *meta;
827 void *priv;
828};
829
834 union {
835 struct lyd_node node;
836
837 struct {
838 uint32_t hash;
843 uint32_t flags;
844 const struct lysc_node *schema;
845 struct lyd_node *parent;
846 struct lyd_node *next;
847 struct lyd_node *prev;
851 struct lyd_meta *meta;
852 void *priv;
853 };
854 };
855
856 struct lyd_node *child;
858
859#define LYD_HT_MIN_ITEMS 4
860};
861
866 union {
867 struct lyd_node node;
868
869 struct {
870 uint32_t hash;
875 uint32_t flags;
876 const struct lysc_node *schema;
877 struct lyd_node *parent;
878 struct lyd_node *next;
879 struct lyd_node *prev;
883 struct lyd_meta *meta;
884 void *priv;
885 };
886 };
887
889};
890
895 union {
896 struct lyd_node node;
897
898 struct {
899 uint32_t hash;
904 uint32_t flags;
905 const struct lysc_node *schema;
906 struct lyd_node *parent;
907 struct lyd_node *next;
908 struct lyd_node *prev;
912 struct lyd_meta *meta;
913 void *priv;
914 };
915 };
916
917 struct lyd_node *child;
919 const char *value;
920 uint32_t hints;
922};
923
930#define LYD_NAME(node) ((node)->schema ? (node)->schema->name : ((struct lyd_node_opaq *)node)->name.name)
931
941#define LYD_VALHINT_STRING 0x0001
942#define LYD_VALHINT_DECNUM 0x0002
943#define LYD_VALHINT_OCTNUM 0x0004
944#define LYD_VALHINT_HEXNUM 0x0008
945#define LYD_VALHINT_NUM64 0x0010
946#define LYD_VALHINT_BOOLEAN 0x0020
947#define LYD_VALHINT_EMPTY 0x0040
948#define LYD_VALHINT_STRING_DATATYPES 0x0080
952
962#define LYD_NODEHINT_LIST 0x1000
963#define LYD_NODEHINT_LEAFLIST 0x2000
964#define LYD_NODEHINT_CONTAINER 0x4000
968
979#define LYD_HINT_DATA 0xFFF3
983#define LYD_HINT_SCHEMA 0xFFFF
990
995 union {
996 struct lyd_node node;
997
998 struct {
999 uint32_t hash;
1000 uint32_t flags;
1001 const struct lysc_node *schema;
1002 struct lyd_node *parent;
1003 struct lyd_node *next;
1004 struct lyd_node *prev;
1008 struct lyd_meta *meta;
1009 void *priv;
1010 };
1011 };
1012
1013 struct lyd_node *child;
1014
1016 const char *value;
1017 uint32_t hints;
1020
1021 struct lyd_attr *attr;
1022 const struct ly_ctx *ctx;
1023};
1024
1040
1048#define lyd_parent(node) ((node) ? (node)->parent : NULL)
1049
1061static inline struct lyd_node *
1062lyd_child(const struct lyd_node *node)
1063{
1064 if (!node) {
1065 return NULL;
1066 }
1067
1068 if (!node->schema) {
1069 /* opaq node */
1070 return ((const struct lyd_node_opaq *)node)->child;
1071 }
1072
1074 return ((const struct lyd_node_inner *)node)->child;
1075 }
1076
1077 return NULL;
1078}
1079
1091static inline struct lyd_node *
1092lyd_child_any(const struct lyd_node *node)
1093{
1094 if (!node) {
1095 return NULL;
1096 }
1097
1098 if (!node->schema) {
1099 /* opaq node */
1100 return ((const struct lyd_node_opaq *)node)->child;
1101 }
1102
1104 return ((const struct lyd_node_inner *)node)->child;
1105 }
1106
1107 return NULL;
1108}
1109
1118LIBYANG_API_DECL struct lyd_node *lyd_child_no_keys(const struct lyd_node *node);
1119
1129LIBYANG_API_DECL const struct lys_module *lyd_owner_module(const struct lyd_node *node);
1130
1137LIBYANG_API_DECL const struct lys_module *lyd_node_module(const struct lyd_node *node);
1138
1145LIBYANG_API_DECL ly_bool lyd_is_default(const struct lyd_node *node);
1146
1154LIBYANG_API_DECL uint32_t lyd_list_pos(const struct lyd_node *instance);
1155
1162LIBYANG_API_DECL struct lyd_node *lyd_first_sibling(const struct lyd_node *node);
1163
1173LIBYANG_API_DECL LY_ERR lyd_parse_opaq_error(const struct lyd_node *node);
1174
1184LIBYANG_API_DECL const char *lyd_value_get_canonical(const struct ly_ctx *ctx, const struct lyd_value *value);
1185
1192static inline const char *
1193lyd_get_value(const struct lyd_node *node)
1194{
1195 if (!node) {
1196 return NULL;
1197 }
1198
1199 if (!node->schema) {
1200 return ((const struct lyd_node_opaq *)node)->value;
1201 } else if (node->schema->nodetype & LYD_NODE_TERM) {
1202 const struct lyd_value *value = &((const struct lyd_node_term *)node)->value;
1203
1205 }
1206
1207 return NULL;
1208}
1209
1218LIBYANG_API_DECL LY_ERR lyd_any_value_str(const struct lyd_node *any, LYD_FORMAT format, char **value_str);
1219
1231LIBYANG_API_DECL LY_ERR lyd_any_copy_value(struct lyd_node *trg, const struct lyd_node *child, const char *value,
1232 uint32_t hints);
1233
1240LIBYANG_API_DECL const struct lysc_node *lyd_node_schema(const struct lyd_node *node);
1241
1249LIBYANG_API_DECL ly_bool lyd_meta_is_internal(const struct lyd_meta *meta);
1250
1264LIBYANG_API_DECL LY_ERR lyd_new_inner(struct lyd_node *parent, const struct lys_module *module, const char *name,
1265 ly_bool output, struct lyd_node **node);
1266
1287
1288#define LYD_NEW_VAL_OUTPUT 0x01
1290#define LYD_NEW_VAL_STORE_ONLY 0x02
1291#define LYD_NEW_VAL_CANON 0x04
1294#define LYD_NEW_META_CLEAR_DFLT 0x08
1295#define LYD_NEW_PATH_UPDATE 0x10
1299#define LYD_NEW_PATH_OPAQ 0x20
1303#define LYD_NEW_PATH_WITH_OPAQ 0x40
1304#define LYD_NEW_PATH_ANY_DATATREE 0x80
1305#define LYD_NEW_ANY_USE_VALUE 0x0100
1306
1308
1321LIBYANG_API_DECL LY_ERR lyd_new_list(struct lyd_node *parent, const struct lys_module *module, const char *name,
1322 uint32_t options, struct lyd_node **node, ...);
1323
1337LIBYANG_API_DECL LY_ERR lyd_new_list2(struct lyd_node *parent, const struct lys_module *module, const char *name,
1338 const char *keys, uint32_t options, struct lyd_node **node);
1339
1353LIBYANG_API_DECL LY_ERR lyd_new_list3(struct lyd_node *parent, const struct lys_module *module, const char *name,
1354 const void **key_values, uint32_t *value_sizes_bits, uint32_t options, struct lyd_node **node);
1355
1367LIBYANG_API_DECL LY_ERR lyd_new_term(struct lyd_node *parent, const struct lys_module *module, const char *name,
1368 const char *value, uint32_t options, struct lyd_node **node);
1369
1391LIBYANG_API_DECL LY_ERR lyd_new_term_raw(struct lyd_node *parent, const struct lys_module *module, const char *name,
1392 const void *value_ptr, uint32_t value_size, uint32_t options, struct lyd_node **node);
1393
1407LIBYANG_API_DECL LY_ERR lyd_new_any(struct lyd_node *parent, const struct lys_module *module, const char *name,
1408 const struct lyd_node *child, const char *value, uint32_t hints, uint32_t options, struct lyd_node **node);
1409
1424LIBYANG_API_DECL LY_ERR lyd_new_meta(const struct ly_ctx *ctx, struct lyd_node *parent, const struct lys_module *module,
1425 const char *name, const char *val_str, uint32_t options, struct lyd_meta **meta);
1426
1439LIBYANG_API_DECL LY_ERR lyd_new_meta2(const struct ly_ctx *ctx, struct lyd_node *parent, uint32_t options,
1440 const struct lyd_attr *attr, struct lyd_meta **meta);
1441
1454LIBYANG_API_DECL LY_ERR lyd_new_opaq(struct lyd_node *parent, const struct ly_ctx *ctx, const char *name, const char *value,
1455 const char *prefix, const char *module_name, struct lyd_node **node);
1456
1469LIBYANG_API_DECL LY_ERR lyd_new_opaq2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *name, const char *value,
1470 const char *prefix, const char *module_ns, struct lyd_node **node);
1471
1485LIBYANG_API_DECL LY_ERR lyd_new_attr(struct lyd_node *parent, const char *module_name, const char *name, const char *value,
1486 struct lyd_attr **attr);
1487
1500LIBYANG_API_DECL LY_ERR lyd_new_attr2(struct lyd_node *parent, const char *module_ns, const char *name, const char *value,
1501 struct lyd_attr **attr);
1502
1531LIBYANG_API_DECL LY_ERR lyd_new_path(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path, const char *value,
1532 uint32_t options, struct lyd_node **node);
1533
1559LIBYANG_API_DECL LY_ERR lyd_new_path2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path,
1560 const void *value, uint64_t value_size_bits, uint32_t any_hints, uint32_t options, struct lyd_node **new_parent,
1561 struct lyd_node **new_node);
1562
1575
1576#define LYD_IMPLICIT_NO_STATE 0x01
1577#define LYD_IMPLICIT_NO_CONFIG 0x02
1578#define LYD_IMPLICIT_OUTPUT 0x04
1579#define LYD_IMPLICIT_NO_DEFAULTS 0x08
1581
1583
1592LIBYANG_API_DECL LY_ERR lyd_new_implicit_tree(struct lyd_node *tree, uint32_t implicit_options, struct lyd_node **diff);
1593
1605LIBYANG_API_DECL LY_ERR lyd_new_implicit_all(struct lyd_node **tree, const struct ly_ctx *ctx, uint32_t implicit_options,
1606 struct lyd_node **diff);
1607
1619LIBYANG_API_DECL LY_ERR lyd_new_implicit_module(struct lyd_node **tree, const struct lys_module *module,
1620 uint32_t implicit_options, struct lyd_node **diff);
1621
1635LIBYANG_API_DECL LY_ERR lyd_change_term(struct lyd_node *term, const char *val_str);
1636
1651LIBYANG_API_DECL LY_ERR lyd_change_term_canon(struct lyd_node *term, const char *val_str);
1652
1662LIBYANG_API_DECL LY_ERR lyd_change_meta(struct lyd_meta *meta, const char *val_str);
1663
1675LIBYANG_API_DECL LY_ERR lyd_insert_child(struct lyd_node *parent, struct lyd_node *node);
1676
1689LIBYANG_API_DECL LY_ERR lyd_insert_sibling(struct lyd_node *sibling, struct lyd_node *node, struct lyd_node **first);
1690
1702LIBYANG_API_DECL LY_ERR lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node);
1703
1715LIBYANG_API_DECL LY_ERR lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node);
1716
1724LIBYANG_API_DECL LY_ERR lyd_unlink_siblings(struct lyd_node *node);
1725
1733LIBYANG_API_DECL LY_ERR lyd_unlink_tree(struct lyd_node *node);
1734
1740LIBYANG_API_DECL void lyd_free_all(struct lyd_node *node);
1741
1747LIBYANG_API_DECL void lyd_free_siblings(struct lyd_node *node);
1748
1754LIBYANG_API_DECL void lyd_free_tree(struct lyd_node *node);
1755
1761LIBYANG_API_DECL void lyd_free_meta_single(struct lyd_meta *meta);
1762
1768LIBYANG_API_DECL void lyd_free_meta_siblings(struct lyd_meta *meta);
1769
1776LIBYANG_API_DECL void lyd_free_attr_single(const struct ly_ctx *ctx, struct lyd_attr *attr);
1777
1784LIBYANG_API_DECL void lyd_free_attr_siblings(const struct ly_ctx *ctx, struct lyd_attr *attr);
1785
1803LIBYANG_API_DECL LY_ERR lyd_value_validate(const struct lysc_node *schema, const char *value, uint32_t value_len,
1804 const struct lyd_node *ctx_node, const struct lysc_type **realtype, const char **canonical);
1805
1823LIBYANG_API_DECL LY_ERR lyd_value_validate_dflt(const struct lysc_node *schema, const char *value,
1824 struct lysc_prefix *prefixes, const struct lyd_node *ctx_node, const struct lysc_type **realtype,
1825 const char **canonical);
1826
1839LIBYANG_API_DECL LY_ERR lyd_value_compare(const struct lyd_node_term *node, const char *value, uint32_t value_len);
1840
1847#define LYD_COMPARE_FULL_RECURSION 0x01 /* Lists and containers are the same only in case all they children
1848 (subtree, so direct as well as indirect children) are the same. By default,
1849 containers are the same in case of the same schema node and lists are the same
1850 in case of equal keys (keyless lists do the full recursion comparison all the time). */
1851#define LYD_COMPARE_DEFAULTS 0x02 /* By default, implicit and explicit default nodes are considered to be equal. This flag
1852 changes this behavior and implicit (automatically created default node) and explicit
1853 (explicitly created node with the default value) default nodes are considered different. */
1854#define LYD_COMPARE_OPAQ 0x04 /* Opaque nodes can normally be never equal to data nodes. Using this flag even
1855 opaque nodes members are compared to data node schema and value and can result
1856 in a match. */
1858
1870LIBYANG_API_DECL LY_ERR lyd_compare_single(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options);
1871
1883LIBYANG_API_DECL LY_ERR lyd_compare_siblings(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options);
1884
1895LIBYANG_API_DECL LY_ERR lyd_compare_meta(const struct lyd_meta *meta1, const struct lyd_meta *meta2);
1896
1909#define LYD_DUP_RECURSIVE 0x01
1911#define LYD_DUP_NO_META 0x02
1913#define LYD_DUP_WITH_PARENTS 0x04
1915#define LYD_DUP_WITH_FLAGS 0x08
1917#define LYD_DUP_NO_EXT 0x10
1918#define LYD_DUP_WITH_PRIV 0x20
1920#define LYD_DUP_NO_LYDS 0x40
1924
1926
1938LIBYANG_API_DECL LY_ERR lyd_dup_single(const struct lyd_node *node, struct lyd_node *parent, uint32_t options,
1939 struct lyd_node **dup);
1940
1954LIBYANG_API_DECL LY_ERR lyd_dup_single_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx,
1955 struct lyd_node *parent, uint32_t options, struct lyd_node **dup);
1956
1968LIBYANG_API_DECL LY_ERR lyd_dup_siblings(const struct lyd_node *node, struct lyd_node *parent, uint32_t options,
1969 struct lyd_node **dup);
1970
1985LIBYANG_API_DECL LY_ERR lyd_dup_siblings_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx,
1986 struct lyd_node *parent, uint32_t options, struct lyd_node **dup);
1987
1996LIBYANG_API_DECL LY_ERR lyd_dup_meta_single(const struct lyd_meta *meta, struct lyd_node *parent, struct lyd_meta **dup);
1997
2011
2012#define LYD_MERGE_DESTRUCT 0x01
2013#define LYD_MERGE_DEFAULTS 0x02
2014#define LYD_MERGE_WITH_FLAGS 0x04
2015
2017
2038LIBYANG_API_DECL LY_ERR lyd_merge_tree(struct lyd_node **target, const struct lyd_node *source, uint16_t options);
2039
2061LIBYANG_API_DECL LY_ERR lyd_merge_siblings(struct lyd_node **target, const struct lyd_node *source, uint16_t options);
2062
2072typedef LY_ERR (*lyd_merge_cb)(struct lyd_node *trg_node, const struct lyd_node *src_node, void *cb_data);
2073
2089LIBYANG_API_DECL LY_ERR lyd_merge_module(struct lyd_node **target, const struct lyd_node *source, const struct lys_module *mod,
2090 lyd_merge_cb merge_cb, void *cb_data, uint16_t options);
2091
2105
2106#define LYD_DIFF_DEFAULTS 0x01
2109#define LYD_DIFF_META 0x02
2112
2114
2140LIBYANG_API_DECL LY_ERR lyd_diff_tree(const struct lyd_node *first, const struct lyd_node *second, uint16_t options,
2141 struct lyd_node **diff);
2142
2155LIBYANG_API_DECL LY_ERR lyd_diff_siblings(const struct lyd_node *first, const struct lyd_node *second, uint16_t options,
2156 struct lyd_node **diff);
2157
2166typedef LY_ERR (*lyd_diff_cb)(const struct lyd_node *diff_node, struct lyd_node *data_node, void *cb_data);
2167
2184LIBYANG_API_DECL LY_ERR lyd_diff_apply_module(struct lyd_node **data, const struct lyd_node *diff,
2185 const struct lys_module *mod, lyd_diff_cb diff_cb, void *cb_data);
2186
2197LIBYANG_API_DECL LY_ERR lyd_diff_apply_all(struct lyd_node **data, const struct lyd_node *diff);
2198
2209
2210#define LYD_DIFF_MERGE_DEFAULTS 0x01
2211
2213
2238LIBYANG_API_DECL LY_ERR lyd_diff_merge_module(struct lyd_node **diff, const struct lyd_node *src_diff,
2239 const struct lys_module *mod, lyd_diff_cb diff_cb, void *cb_data, uint16_t options);
2240
2257LIBYANG_API_DECL LY_ERR lyd_diff_merge_tree(struct lyd_node **diff_first, struct lyd_node *diff_parent,
2258 const struct lyd_node *src_sibling, lyd_diff_cb diff_cb, void *cb_data, uint16_t options);
2259
2271LIBYANG_API_DECL LY_ERR lyd_diff_merge_all(struct lyd_node **diff, const struct lyd_node *src_diff, uint16_t options);
2272
2280 * @return LY_ERR on error.
2282LIBYANG_API_DECL LY_ERR lyd_diff_reverse_all(const struct lyd_node *src_diff, struct lyd_node **diff);
2286
2287typedef enum {
2288 LYD_PATH_STD,
2293
2309LIBYANG_API_DECL char *lyd_path(const struct lyd_node *node, LYD_PATH_TYPE pathtype, char *buffer, size_t buflen);
2310
2320LIBYANG_API_DECL struct lyd_meta *lyd_find_meta(const struct lyd_meta *first, const struct lys_module *module,
2321 const char *name);
2322
2334LIBYANG_API_DECL LY_ERR lyd_find_sibling_first(const struct lyd_node *siblings, const struct lyd_node *target,
2335 struct lyd_node **match);
2336
2361LIBYANG_API_DECL LY_ERR lyd_find_sibling_val(const struct lyd_node *siblings, const struct lysc_node *schema,
2362 const char *key_or_value, uint32_t val_len, struct lyd_node **match);
2363
2375LIBYANG_API_DECL LY_ERR lyd_find_sibling_dup_inst_set(const struct lyd_node *siblings, const struct lyd_node *target,
2376 struct ly_set **set);
2377
2388LIBYANG_API_DECL LY_ERR lyd_find_sibling_opaq_next(const struct lyd_node *first, const char *name, struct lyd_node **match);
2389
2401LIBYANG_API_DECL LY_ERR lyxp_vars_set(struct lyxp_var **vars, const char *name, const char *value);
2402
2408LIBYANG_API_DECL void lyxp_vars_free(struct lyxp_var *vars);
2409
2429LIBYANG_API_DECL LY_ERR lyd_find_xpath(const struct lyd_node *ctx_node, const char *xpath, struct ly_set **set);
2430
2444LIBYANG_API_DECL LY_ERR lyd_find_xpath2(const struct lyd_node *ctx_node, const char *xpath, const struct lyxp_var *vars,
2445 struct ly_set **set);
2446
2464LIBYANG_API_DECL LY_ERR lyd_find_xpath3(const struct lyd_node *ctx_node, const struct lyd_node *tree, const char *xpath,
2465 LY_VALUE_FORMAT format, void *prefix_data, const struct lyxp_var *vars, struct ly_set **set);
2466
2478LIBYANG_API_DECL LY_ERR lyd_eval_xpath(const struct lyd_node *ctx_node, const char *xpath, ly_bool *result);
2479
2492LIBYANG_API_DECL LY_ERR lyd_eval_xpath2(const struct lyd_node *ctx_node, const char *xpath,
2493 const struct lyxp_var *vars, ly_bool *result);
2494
2510LIBYANG_API_DECL LY_ERR lyd_eval_xpath3(const struct lyd_node *ctx_node, const struct lys_module *cur_mod,
2511 const char *xpath, LY_VALUE_FORMAT format, void *prefix_data, const struct lyxp_var *vars, ly_bool *result);
2515
2516typedef enum {
2522
2545LIBYANG_API_DECL LY_ERR lyd_eval_xpath4(const struct lyd_node *ctx_node, const struct lyd_node *tree,
2546 const struct lys_module *cur_mod, const char *xpath, LY_VALUE_FORMAT format, void *prefix_data,
2547 const struct lyxp_var *vars, LY_XPATH_TYPE *ret_type, struct ly_set **node_set, char **string,
2548 long double *number, ly_bool *boolean);
2549
2559LIBYANG_API_DEF LY_ERR lyd_trim_xpath(struct lyd_node **tree, const char *xpath, const struct lyxp_var *vars);
2560
2578LIBYANG_API_DECL LY_ERR lyd_find_path(const struct lyd_node *ctx_node, const char *path, ly_bool output,
2579 struct lyd_node **match);
2580
2591LIBYANG_API_DECL LY_ERR lyd_find_target(const struct ly_path *path, const struct lyd_node *tree, struct lyd_node **match);
2592
2598LIBYANG_API_DECL int ly_time_tz_offset(void);
2606LIBYANG_API_DECL int ly_time_tz_offset_at(time_t time);
2607
2616LIBYANG_API_DECL LY_ERR ly_time_str2time(const char *value, time_t *time, char **fractions_s);
2617
2626LIBYANG_API_DECL LY_ERR ly_time_time2str(time_t time, const char *fractions_s, char **str);
2627
2635LIBYANG_API_DECL LY_ERR ly_time_str2ts(const char *value, struct timespec *ts);
2636
2644LIBYANG_API_DECL LY_ERR ly_time_ts2str(const struct timespec *ts, char **str);
2645
2656LIBYANG_API_DECL LY_ERR lyd_leafref_get_links(const struct lyd_node_term *node, const struct lyd_leafref_links_rec **record);
2657
2667LIBYANG_API_DECL LY_ERR lyd_leafref_link_node_tree(const struct lyd_node *tree);
2668
2682LIBYANG_API_DECL LY_ERR ly_pattern_match(const struct ly_ctx *ctx, const char *pattern, const char *string,
2683 uint32_t str_len, void **pat_comp);
2684
2694LIBYANG_API_DECL LY_ERR ly_pattern_compile(const struct ly_ctx *ctx, const char *pattern, void **pat_comp);
2695
2701LIBYANG_API_DECL void ly_pattern_free(void *pat_comp);
2702
2703#ifdef __cplusplus
2704}
2705#endif
2706
2707#endif /* LY_TREE_DATA_H_ */
libyang context handler.
LYD_FORMAT
Data input/output formats supported by libyang parser and printer functions.
Definition tree_data.h:535
#define LYD_CTX(node)
Macro to get context from a data tree node.
Definition tree_data.h:518
@ LYD_CBOR
Definition tree_data.h:540
@ LYD_LYB
Definition tree_data.h:539
@ LYD_XML
Definition tree_data.h:537
@ LYD_UNKNOWN
Definition tree_data.h:536
@ LYD_JSON
Definition tree_data.h:538
LY_ERR
libyang's error codes returned by the libyang functions.
Definition log.h:252
Structure to hold a set of (not necessary somehow connected) objects. Usually used for lyd_node,...
Definition set.h:47
#define LYS_NOTIF
#define LYS_ANYDATA
#define LYS_RPC
#define LYS_CONTAINER
#define LYS_ACTION
#define LYS_LIST
uint16_t nodetype
struct lys_module * module
struct lysc_node * parent
const char * name
Available YANG schema tree structures representing YANG module.
YANG identity-stmt.
Compiled YANG data node.
Compiled prefix data pair mapping of prefixes to modules. In case the format is LY_VALUE_SCHEMA_RESOL...
LY_VALUE_FORMAT
All kinds of supported value formats and prefix mappings to modules.
Definition tree.h:234
Logger manipulation routines and error definitions.
uint8_t ly_bool
Type to indicate boolean value.
Definition log.h:36
const char * name
Definition metadata.h:40
struct lyd_value value
Definition metadata.h:41
Metadata structure.
Definition metadata.h:36
libyang hash table.
libyang generic macros and functions to work with YANG schema or data trees.
LIBYANG_API_DECL void lyxp_vars_free(struct lyxp_var *vars)
Free the XPath variables.
LY_VALUE_FORMAT format
Definition tree_data.h:765
uint64_t orig_size_bits
Definition tree_data.h:607
struct lyd_node * next
Definition tree_data.h:821
LIBYANG_API_DECL void lyd_free_all(struct lyd_node *node)
Free all the nodes (even parents of the node) in the data tree.
uint32_t hints
Definition tree_data.h:920
LIBYANG_API_DECL 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.
void * val_prefix_data
Definition tree_data.h:1019
LIBYANG_API_DECL LY_ERR lyd_dup_siblings_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx, struct lyd_node *parent, uint32_t options, struct lyd_node **dup)
Create a copy of the specified data tree node with any following siblings. Schema references are assi...
LIBYANG_API_DECL 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...
LIBYANG_API_DECL LY_ERR lyd_any_copy_value(struct lyd_node *trg, const struct lyd_node *child, const char *value, uint32_t hints)
Copy anydata value from one node to another. Target value is freed first.
LIBYANG_API_DECL void lyd_free_meta_siblings(struct lyd_meta *meta)
Free the metadata instance with any following instances.
LIBYANG_API_DECL 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.
const char * prefix
Definition tree_data.h:748
struct rb_node * rbt
Definition tree_data.h:736
LIBYANG_API_DECL LY_ERR ly_time_ts2str(const struct timespec *ts, char **str)
Convert timespec into date-and-time string value.
struct in_addr addr
Definition tree_data.h:646
LIBYANG_API_DECL 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.
LIBYANG_API_DECL 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,...
LIBYANG_API_DECL const char * lyd_value_get_canonical(const struct ly_ctx *ctx, const struct lyd_value *value)
Get the (canonical) value of a lyd_value.
LIBYANG_API_DECL 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.
LIBYANG_API_DECL LY_ERR lyd_find_target(const struct ly_path *path, const struct lyd_node *tree, struct lyd_node **match)
Find the target node of a compiled path (lyd_value instance-identifier).
LYD_PATH_TYPE
Types of the different data paths.
Definition tree_data.h:2280
@ LYD_PATH_STD_NO_LAST_PRED
Definition tree_data.h:2283
@ LYD_PATH_STD
Definition tree_data.h:2281
LIBYANG_API_DECL 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.
struct lyd_value value
Definition tree_data.h:888
LIBYANG_API_DECL int ly_time_tz_offset(void)
Get current timezone (including DST setting) UTC (GMT) time offset in seconds.
LIBYANG_API_DECL 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.
const struct lysc_type * realtype
Definition tree_data.h:552
LIBYANG_API_DECL LY_ERR lyd_change_meta(struct lyd_meta *meta, const char *val_str)
Change the value of a metadata instance.
LIBYANG_API_DECL LY_ERR ly_time_str2ts(const char *value, struct timespec *ts)
Convert date-and-time from string to timespec.
uint32_t hints
Definition tree_data.h:764
LIBYANG_API_DECL 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().
LIBYANG_API_DECL 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.
ly_bool unknown_tz
Definition tree_data.h:695
LIBYANG_API_DECL 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().
LIBYANG_API_DECL LY_ERR lyd_insert_child(struct lyd_node *parent, struct lyd_node *node)
Insert a child into a parent.
LIBYANG_API_DECL struct lyd_node * lyd_first_sibling(const struct lyd_node *node)
Get the first sibling of the given node.
const struct lyd_node_term ** leafref_nodes
Definition tree_data.h:1030
struct lyd_attr * attr
Definition tree_data.h:1021
LIBYANG_API_DECL LY_ERR lyd_new_list(struct lyd_node *parent, const struct lys_module *module, const char *name, uint32_t options, struct lyd_node **node,...)
Create a new list node in the data tree.
LIBYANG_API_DECL 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.
LIBYANG_API_DECL LY_ERR lyd_value_validate(const struct lysc_node *schema, const char *value, uint32_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.
LIBYANG_API_DECL LY_ERR lyd_value_validate_dflt(const struct lysc_node *schema, const char *value, struct lysc_prefix *prefixes, 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_diff_cb)(const struct lyd_node *diff_node, struct lyd_node *data_node, void *cb_data)
Callback for diff nodes.
Definition tree_data.h:2159
LIBYANG_API_DECL const struct lys_module * lyd_node_module(const struct lyd_node *node)
Get the module of a node. Useful mainly for opaque nodes.
struct lyd_node * child
Definition tree_data.h:1013
LIBYANG_API_DECL LY_ERR lyd_compare_meta(const struct lyd_meta *meta1, const struct lyd_meta *meta2)
Compare 2 metadata.
LIBYANG_API_DECL void lyd_free_tree(struct lyd_node *node)
Free (and unlink) the specified data (sub)tree.
LIBYANG_API_DECL 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, uint32_t options, struct lyd_meta **meta)
Create a new metadata.
LIBYANG_API_DECL 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.
LIBYANG_API_DECL 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.
LIBYANG_API_DECL 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....
struct ly_path * target
LIBYANG_API_DECL LY_ERR lyd_eval_xpath4(const struct lyd_node *ctx_node, const struct lyd_node *tree, const struct lys_module *cur_mod, const char *xpath, LY_VALUE_FORMAT format, void *prefix_data, const struct lyxp_var *vars, LY_XPATH_TYPE *ret_type, struct ly_set **node_set, char **string, long double *number, ly_bool *boolean)
Evaluate an XPath on data and return the result or convert it first to an expected result type.
LIBYANG_API_DECL LY_ERR lyd_leafref_link_node_tree(const struct lyd_node *tree)
Traverse through data tree including root node siblings and adds leafrefs links to the given nodes.
LIBYANG_API_DECL LY_ERR lyd_new_path2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path, const void *value, uint64_t value_size_bits, uint32_t any_hints, 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.
struct lysc_type_bitenum_item ** items
Definition tree_data.h:623
const struct ly_ctx * ctx
Definition tree_data.h:1022
char * fractions_s
Definition tree_data.h:710
LIBYANG_API_DECL 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....
LIBYANG_API_DECL LY_ERR lyd_eval_xpath(const struct lyd_node *ctx_node, const char *xpath, ly_bool *result)
Evaluate an XPath on data and return the result converted to boolean.
uint8_t fixed_mem[LYD_VALUE_FIXED_MEM_SIZE]
LIBYANG_API_DECL const struct lysc_node * lyd_node_schema(const struct lyd_node *node)
Get schema node of a data node. Useful especially for opaque nodes.
LIBYANG_API_DECL LY_ERR lyd_new_term(struct lyd_node *parent, const struct lys_module *module, const char *name, const char *value, uint32_t options, struct lyd_node **node)
Create a new term node in the data tree.
LY_ERR(* lyd_merge_cb)(struct lyd_node *trg_node, const struct lyd_node *src_node, void *cb_data)
Callback for matching merge nodes.
Definition tree_data.h:2065
struct lyd_meta * meta
Definition tree_data.h:826
LIBYANG_API_DECL 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.
LIBYANG_API_DECL LY_ERR lyd_any_value_str(const struct lyd_node *any, LYD_FORMAT format, char **value_str)
Get anydata string value.
const struct lyd_node_term ** target_nodes
Definition tree_data.h:1036
uint32_t flags
Definition tree_data.h:818
struct lysc_ident * ident
LIBYANG_API_DECL ly_bool lyd_meta_is_internal(const struct lyd_meta *meta)
Check whether metadata are not an instance of internal metadata.
LIBYANG_API_DECL void ly_pattern_free(void *pat_comp)
Free a compiled XML Schema regex pattern.
LY_XPATH_TYPE
XPath result type.
Definition tree_data.h:2509
@ LY_XPATH_NODE_SET
Definition tree_data.h:2510
@ LY_XPATH_NUMBER
Definition tree_data.h:2512
@ LY_XPATH_STRING
Definition tree_data.h:2511
@ LY_XPATH_BOOLEAN
Definition tree_data.h:2513
const struct lysc_node * schema
Definition tree_data.h:819
uint32_t seconds
Definition tree_data.h:709
LIBYANG_API_DECL LY_ERR lyd_new_term_raw(struct lyd_node *parent, const struct lys_module *module, const char *name, const void *value_ptr, uint32_t value_size, uint32_t options, struct lyd_node **node)
Create a new term node in the data tree and set its value directly in its internal raw representation...
struct in6_addr addr
Definition tree_data.h:669
const char * value
Definition tree_data.h:919
LIBYANG_API_DECL LY_ERR lyd_unlink_siblings(struct lyd_node *node)
Unlink the specified node with all the following siblings.
LIBYANG_API_DECL void lyd_free_siblings(struct lyd_node *node)
Free all the sibling nodes (preceding as well as succeeding).
struct lyxp_expr * exp
Definition tree_data.h:726
LIBYANG_API_DECL 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.
const char * value
Definition tree_data.h:1016
LIBYANG_API_DECL LY_ERR lyxp_vars_set(struct lyxp_var **vars, const char *name, const char *value)
Set a new XPath variable to vars.
LIBYANG_API_DECL 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.
LIBYANG_API_DECL 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...
LIBYANG_API_DECL LY_ERR lyd_new_list3(struct lyd_node *parent, const struct lys_module *module, const char *name, const void **key_values, uint32_t *value_sizes_bits, uint32_t options, struct lyd_node **node)
Create a new list node in the data tree.
LIBYANG_API_DECL LY_ERR lyd_new_meta2(const struct ly_ctx *ctx, struct lyd_node *parent, uint32_t options, const struct lyd_attr *attr, struct lyd_meta **meta)
Create new metadata from an opaque node attribute if possible.
LIBYANG_API_DECL 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.
struct lyd_node * parent
Definition tree_data.h:820
LIBYANG_API_DECL LY_ERR lyd_leafref_get_links(const struct lyd_node_term *node, const struct lyd_leafref_links_rec **record)
Gets the leafref links record for given node.
const char * name
Definition tree_data.h:747
LIBYANG_API_DECL int ly_time_tz_offset_at(time_t time)
Get UTC (GMT) timezone offset in seconds at a specific timestamp (including DST setting).
void * prefix_data
Definition tree_data.h:612
LIBYANG_API_DECL 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.
LIBYANG_API_DECL 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.
LIBYANG_API_DEF LY_ERR lyd_trim_xpath(struct lyd_node **tree, const char *xpath, const struct lyxp_var *vars)
Evaluate an XPath on data and free all the nodes except the subtrees selected by the expression.
const struct lyd_node_term * node
Definition tree_data.h:1029
#define LYD_NODE_TERM
Definition tree_data.h:770
uint32_t hints
Definition tree_data.h:1017
LIBYANG_API_DECL LY_ERR lyd_dup_single(const struct lyd_node *node, struct lyd_node *parent, uint32_t options, struct lyd_node **dup)
Create a copy of the specified data tree node. Schema references are kept the same.
LIBYANG_API_DECL 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...
LIBYANG_API_DECL 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...
LIBYANG_API_DECL 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,...
LIBYANG_API_DECL LY_ERR lyd_find_xpath3(const struct lyd_node *ctx_node, const struct lyd_node *tree, const char *xpath, LY_VALUE_FORMAT format, void *prefix_data, const struct lyxp_var *vars, struct ly_set **set)
Search in the given data for instances of nodes matching the provided XPath.
struct ly_opaq_name name
Definition tree_data.h:762
LIBYANG_API_DECL 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.
LIBYANG_API_DECL struct lyd_meta * lyd_find_meta(const struct lyd_meta *first, const struct lys_module *module, const char *name)
Find a specific metadata.
LIBYANG_API_DECL 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...
LIBYANG_API_DECL 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().
uint32_t hash
Definition tree_data.h:814
void * val_prefix_data
Definition tree_data.h:766
struct in_addr addr
Definition tree_data.h:654
struct lyd_node * prev
Definition tree_data.h:822
ly_bool unknown_tz
Definition tree_data.h:711
LIBYANG_API_DECL LY_ERR lyd_find_xpath2(const struct lyd_node *ctx_node, const char *xpath, const struct lyxp_var *vars, struct ly_set **set)
Search in the given data for instances of nodes matching the provided XPath.
LIBYANG_API_DECL LY_ERR lyd_new_list2(struct lyd_node *parent, const struct lys_module *module, const char *name, const char *keys, uint32_t options, struct lyd_node **node)
Create a new list node in the data tree.
LIBYANG_API_DECL LY_ERR lyd_dup_siblings(const struct lyd_node *node, struct lyd_node *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...
LIBYANG_API_DECL 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....
struct lyd_node * child
Definition tree_data.h:856
struct ly_ht * children_ht
Definition tree_data.h:918
LIBYANG_API_DECL void lyd_free_attr_siblings(const struct ly_ctx *ctx, struct lyd_attr *attr)
Free the attribute with any following attributes.
LIBYANG_API_DECL LY_ERR lyd_parse_opaq_error(const struct lyd_node *node)
Check node parsed into an opaque node for the reason (error) why it could not be parsed as data node.
LY_VALUE_FORMAT format
Definition tree_data.h:729
void * priv
Definition tree_data.h:827
LIBYANG_API_DECL ly_bool lyd_is_default(const struct lyd_node *node)
Check whether a node value equals to its default one.
LIBYANG_API_DECL 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.
LIBYANG_API_DECL 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.
struct lyd_value_union * subvalue
struct ly_ht * children_ht
Definition tree_data.h:857
LY_VALUE_FORMAT format
Definition tree_data.h:1018
LIBYANG_API_DECL void lyd_free_attr_single(const struct ly_ctx *ctx, struct lyd_attr *attr)
Free a single attribute.
struct lysc_type_bitenum_item * enum_item
struct lyd_node * child
Definition tree_data.h:917
LIBYANG_API_DECL 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.
const char * value
Definition tree_data.h:763
LIBYANG_API_DECL LY_ERR lyd_find_sibling_val(const struct lyd_node *siblings, const struct lysc_node *schema, const char *key_or_value, uint32_t val_len, struct lyd_node **match)
Search in the given siblings for the first schema instance. Uses hashes - should be used whenever pos...
LIBYANG_API_DECL LY_ERR lyd_value_compare(const struct lyd_node_term *node, const char *value, uint32_t value_len)
Compare the node's value with the given string value. The string value is first validated according t...
LIBYANG_API_DECL 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.
const struct ly_ctx * ctx
Definition tree_data.h:727
LIBYANG_API_DECL LY_ERR lyd_unlink_tree(struct lyd_node *node)
Unlink the specified data subtree.
struct lyd_attr * next
Definition tree_data.h:761
LIBYANG_API_DECL LY_ERR lyd_diff_apply_all(struct lyd_node **data, const struct lyd_node *diff)
Apply the whole diff tree on a data tree.
uint32_t hints
Definition tree_data.h:608
LIBYANG_API_DECL LY_ERR lyd_dup_single_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx, struct lyd_node *parent, uint32_t options, struct lyd_node **dup)
Create a copy of the specified data tree node. Schema references are assigned from trg_ctx.
LIBYANG_API_DECL LY_ERR lyd_eval_xpath2(const struct lyd_node *ctx_node, const char *xpath, const struct lyxp_var *vars, ly_bool *result)
Evaluate an XPath on data and return the result converted to boolean.
struct in6_addr addr
Definition tree_data.h:677
struct lyd_value value
Definition tree_data.h:604
const char * _canonical
Definition tree_data.h:549
struct lyd_node_opaq * parent
Definition tree_data.h:760
LY_VALUE_FORMAT format
Definition tree_data.h:609
LIBYANG_API_DECL 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...
LIBYANG_API_DECL LY_ERR ly_pattern_match(const struct ly_ctx *ctx, const char *pattern, const char *string, uint32_t str_len, void **pat_comp)
Check a string matches an XML Schema regex used in YANG.
struct ly_opaq_name name
Definition tree_data.h:1015
LIBYANG_API_DECL LY_ERR ly_pattern_compile(const struct ly_ctx *ctx, const char *pattern, void **pat_comp)
Compile an XML Schema regex pattern prior to matching.
LIBYANG_API_DECL void lyd_free_meta_single(struct lyd_meta *meta)
Free a single metadata instance.
LIBYANG_API_DECL LY_ERR lyd_new_any(struct lyd_node *parent, const struct lys_module *module, const char *name, const struct lyd_node *child, const char *value, uint32_t hints, uint32_t options, struct lyd_node **node)
Create a new any node in the data tree.
LIBYANG_API_DECL 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.
LIBYANG_API_DECL LY_ERR lyd_eval_xpath3(const struct lyd_node *ctx_node, const struct lys_module *cur_mod, const char *xpath, LY_VALUE_FORMAT format, void *prefix_data, const struct lyxp_var *vars, ly_bool *result)
Evaluate an XPath on data and return the result converted to boolean.
LIBYANG_API_DECL LY_ERR lyd_insert_sibling(struct lyd_node *sibling, struct lyd_node *node, struct lyd_node **first)
Insert a node into siblings.
const struct lysc_node * ctx_node
Definition tree_data.h:613
LIBYANG_API_DECL 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().
Generic prefix and namespace mapping, meaning depends on the format.
Definition tree_data.h:746
Generic attribute structure.
Definition tree_data.h:759
Generic structure for a data node.
Definition tree_data.h:813
Data node structure for the anydata data tree nodes - anydata or anyxml.
Definition tree_data.h:894
Data node structure for the inner data tree nodes - containers, lists, RPCs, actions and Notification...
Definition tree_data.h:833
Data node structure for unparsed (opaque) nodes.
Definition tree_data.h:994
Data node structure for the terminal data tree nodes - leaves and leaf-lists.
Definition tree_data.h:865
YANG data representation.
Definition tree_data.h:548
Special lyd_value structure for built-in binary values.
Definition tree_data.h:630
Special lyd_value structure for built-in bits values.
Definition tree_data.h:619
Special lyd_value structure for ietf-yang-types date values.
Definition tree_data.h:693
Special lyd_value structure for ietf-yang-types date-and-time values.
Definition tree_data.h:684
Special lyd_value structure for ietf-yang-types date-no-zone values.
Definition tree_data.h:701
Special lyd_value structure for ietf-inet-types ipv4-address values.
Definition tree_data.h:645
Special lyd_value structure for ietf-inet-types ipv4-address-no-zone values.
Definition tree_data.h:638
Special lyd_value structure for ietf-inet-types ipv4-prefix values.
Definition tree_data.h:653
Special lyd_value structure for ietf-inet-types ipv6-address values.
Definition tree_data.h:668
Special lyd_value structure for ietf-inet-types ipv6-address-no-zone values.
Definition tree_data.h:661
Special lyd_value structure for ietf-inet-types ipv6-prefix values.
Definition tree_data.h:676
Special lyd_value structure for lyds tree value.
Definition tree_data.h:735
Special lyd_value structure for ietf-yang-types time values.
Definition tree_data.h:708
Special lyd_value structure for ietf-yang-types time-no-zone values.
Definition tree_data.h:717
Special lyd_value structure for built-in union values.
Definition tree_data.h:603
Special lyd_value structure for ietf-yang-types xpath1.0 values.
Definition tree_data.h:725
libyang representation of YANG schema trees.