libyang  6.0.3
libyang is YANG data modelling language parser and toolkit written (and providing API) in C.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
tree_data.h
Go to the documentation of this file.
1 
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
31 extern "C" {
32 #endif
33 
34 struct ly_ctx;
35 struct ly_path;
36 struct ly_set;
37 struct lyd_node;
38 struct lyd_node_opaq;
39 struct lyd_node_term;
40 struct timespec;
41 struct lyxp_var;
42 struct rb_node;
43 
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 
535 typedef enum {
541 } LYD_FORMAT;
542 
548 struct lyd_value {
549  const char *_canonical;
552  const struct lysc_type *realtype;
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;
571  struct lysc_type_bitenum_item *enum_item;
572  struct lysc_ident *ident;
573  struct ly_path *target;
575  struct lyd_value_union *subvalue;
577  void *dyn_mem;
578  uint8_t fixed_mem[LYD_VALUE_FIXED_MEM_SIZE];
579  };
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 
604  struct lyd_value value;
606  void *original;
607  uint64_t orig_size_bits;
608  uint32_t hints;
612  void *prefix_data;
613  const struct lysc_node *ctx_node;
614 };
615 
620  char *bitmap;
625 };
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 
685  time_t time;
686  char *fractions_s;
688 };
689 
694  time_t time;
696 };
697 
702  time_t time;
703 };
704 
709  uint32_t seconds;
710  char *fractions_s;
712 };
713 
718  uint32_t seconds;
719  char *fractions_s;
720 };
721 
726  struct lyxp_expr *exp;
727  const struct ly_ctx *ctx;
728  void *prefix_data;
730 };
731 
736  struct rb_node *rbt;
737 };
738 
746 struct ly_opaq_name {
747  const char *name;
748  const char *prefix;
750  union {
751  const char *module_ns;
752  const char *module_name;
753  };
754 };
755 
759 struct lyd_attr {
761  struct lyd_attr *next;
763  const char *value;
764  uint32_t hints;
767 };
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)
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
813 struct 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 };
833 struct lyd_node_inner {
834  union {
835  struct lyd_node node;
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  };
856  struct lyd_node *child;
857  struct ly_ht *children_ht;
859 #define LYD_HT_MIN_ITEMS 4
860 };
865 struct lyd_node_term {
866  union {
867  struct lyd_node node;
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  };
888  struct lyd_value value;
889 };
894 struct lyd_node_any {
895  union {
896  struct lyd_node node;
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  };
917  struct lyd_node *child;
918  struct ly_ht *children_ht;
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
962 #define LYD_NODEHINT_LIST 0x1000
963 #define LYD_NODEHINT_LEAFLIST 0x2000
964 #define LYD_NODEHINT_CONTAINER 0x4000
979 #define LYD_HINT_DATA 0xFFF3
983 #define LYD_HINT_SCHEMA 0xFFFF
994 struct lyd_node_opaq {
995  union {
996  struct lyd_node node;
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  };
1013  struct lyd_node *child;
1015  struct ly_opaq_name name;
1016  const char *value;
1017  uint32_t hints;
1018  LY_VALUE_FORMAT format;
1019  void *val_prefix_data;
1021  struct lyd_attr *attr;
1022  const struct ly_ctx *ctx;
1023 };
1028 struct lyd_leafref_links_rec {
1029  const struct lyd_node_term *node;
1030  const struct lyd_node_term **leafref_nodes;
1036  const struct lyd_node_term **target_nodes;
1039 };
1040 
1048 #define lyd_parent(node) ((node) ? (node)->parent : NULL)
1049 
1061 static inline struct lyd_node *
1062 lyd_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 
1091 static inline struct lyd_node *
1092 lyd_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 
1118 LIBYANG_API_DECL struct lyd_node *lyd_child_no_keys(const struct lyd_node *node);
1119 
1129 LIBYANG_API_DECL const struct lys_module *lyd_owner_module(const struct lyd_node *node);
1130 
1137 LIBYANG_API_DECL const struct lys_module *lyd_node_module(const struct lyd_node *node);
1138 
1145 LIBYANG_API_DECL ly_bool lyd_is_default(const struct lyd_node *node);
1146 
1154 LIBYANG_API_DECL uint32_t lyd_list_pos(const struct lyd_node *instance);
1155 
1162 LIBYANG_API_DECL struct lyd_node *lyd_first_sibling(const struct lyd_node *node);
1163 
1173 LIBYANG_API_DECL LY_ERR lyd_parse_opaq_error(const struct lyd_node *node);
1174 
1184 LIBYANG_API_DECL const char *lyd_value_get_canonical(const struct ly_ctx *ctx, const struct lyd_value *value);
1185 
1192 static inline const char *
1193 lyd_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 
1204  return value->_canonical ? value->_canonical : lyd_value_get_canonical(LYD_CTX(node), value);
1205  }
1206 
1207  return NULL;
1208 }
1209 
1218 LIBYANG_API_DECL LY_ERR lyd_any_value_str(const struct lyd_node *any, LYD_FORMAT format, char **value_str);
1219 
1231 LIBYANG_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 
1240 LIBYANG_API_DECL const struct lysc_node *lyd_node_schema(const struct lyd_node *node);
1241 
1249 LIBYANG_API_DECL ly_bool lyd_meta_is_internal(const struct lyd_meta *meta);
1250 
1264 LIBYANG_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 
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
1321 LIBYANG_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 
1337 LIBYANG_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 
1353 LIBYANG_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 
1367 LIBYANG_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 
1391 LIBYANG_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 
1407 LIBYANG_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 
1424 LIBYANG_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 
1439 LIBYANG_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 
1454 LIBYANG_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 
1469 LIBYANG_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 
1485 LIBYANG_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 
1500 LIBYANG_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 
1531 LIBYANG_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 
1559 LIBYANG_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 
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
1592 LIBYANG_API_DECL LY_ERR lyd_new_implicit_tree(struct lyd_node *tree, uint32_t implicit_options, struct lyd_node **diff);
1605 LIBYANG_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 
1619 LIBYANG_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 
1635 LIBYANG_API_DECL LY_ERR lyd_change_term(struct lyd_node *term, const char *val_str);
1636 
1651 LIBYANG_API_DECL LY_ERR lyd_change_term_canon(struct lyd_node *term, const char *val_str);
1652 
1662 LIBYANG_API_DECL LY_ERR lyd_change_meta(struct lyd_meta *meta, const char *val_str);
1663 
1675 LIBYANG_API_DECL LY_ERR lyd_insert_child(struct lyd_node *parent, struct lyd_node *node);
1676 
1689 LIBYANG_API_DECL LY_ERR lyd_insert_sibling(struct lyd_node *sibling, struct lyd_node *node, struct lyd_node **first);
1690 
1702 LIBYANG_API_DECL LY_ERR lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node);
1703 
1715 LIBYANG_API_DECL LY_ERR lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node);
1716 
1724 LIBYANG_API_DECL LY_ERR lyd_unlink_siblings(struct lyd_node *node);
1725 
1733 LIBYANG_API_DECL LY_ERR lyd_unlink_tree(struct lyd_node *node);
1734 
1740 LIBYANG_API_DECL void lyd_free_all(struct lyd_node *node);
1741 
1747 LIBYANG_API_DECL void lyd_free_siblings(struct lyd_node *node);
1748 
1754 LIBYANG_API_DECL void lyd_free_tree(struct lyd_node *node);
1755 
1761 LIBYANG_API_DECL void lyd_free_meta_single(struct lyd_meta *meta);
1762 
1768 LIBYANG_API_DECL void lyd_free_meta_siblings(struct lyd_meta *meta);
1769 
1776 LIBYANG_API_DECL void lyd_free_attr_single(const struct ly_ctx *ctx, struct lyd_attr *attr);
1777 
1784 LIBYANG_API_DECL void lyd_free_attr_siblings(const struct ly_ctx *ctx, struct lyd_attr *attr);
1785 
1803 LIBYANG_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 
1823 LIBYANG_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 
1839 LIBYANG_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. */
1857 
1870 LIBYANG_API_DECL LY_ERR lyd_compare_single(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options);
1871 
1883 LIBYANG_API_DECL LY_ERR lyd_compare_siblings(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options);
1884 
1895 LIBYANG_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
1938 LIBYANG_API_DECL LY_ERR lyd_dup_single(const struct lyd_node *node, struct lyd_node *parent, uint32_t options,
1939  struct lyd_node **dup);
1954 LIBYANG_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 
1968 LIBYANG_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 
1985 LIBYANG_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 
1996 LIBYANG_API_DECL LY_ERR lyd_dup_meta_single(const struct lyd_meta *meta, struct lyd_node *parent, struct lyd_meta **dup);
1997 
2012 #define LYD_MERGE_DESTRUCT 0x01
2013 #define LYD_MERGE_DEFAULTS 0x02
2014 #define LYD_MERGE_WITH_FLAGS 0x04
2038 LIBYANG_API_DECL LY_ERR lyd_merge_tree(struct lyd_node **target, const struct lyd_node *source, uint16_t options);
2061 LIBYANG_API_DECL LY_ERR lyd_merge_siblings(struct lyd_node **target, const struct lyd_node *source, uint16_t options);
2062 
2072 typedef LY_ERR (*lyd_merge_cb)(struct lyd_node *trg_node, const struct lyd_node *src_node, void *cb_data);
2073 
2089 LIBYANG_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 
2106 #define LYD_DIFF_DEFAULTS 0x01
2109 #define LYD_DIFF_META 0x02
2140 LIBYANG_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 
2155 LIBYANG_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 
2166 typedef LY_ERR (*lyd_diff_cb)(const struct lyd_node *diff_node, struct lyd_node *data_node, void *cb_data);
2167 
2184 LIBYANG_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 
2197 LIBYANG_API_DECL LY_ERR lyd_diff_apply_all(struct lyd_node **data, const struct lyd_node *diff);
2198 
2210 #define LYD_DIFF_MERGE_DEFAULTS 0x01
2238 LIBYANG_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);
2257 LIBYANG_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 
2271 LIBYANG_API_DECL LY_ERR lyd_diff_merge_all(struct lyd_node **diff, const struct lyd_node *src_diff, uint16_t options);
2272 
2282 LIBYANG_API_DECL LY_ERR lyd_diff_reverse_all(const struct lyd_node *src_diff, struct lyd_node **diff);
2283 
2287 typedef enum {
2288  LYD_PATH_STD,
2292 } LYD_PATH_TYPE;
2293 
2309 LIBYANG_API_DECL char *lyd_path(const struct lyd_node *node, LYD_PATH_TYPE pathtype, char *buffer, size_t buflen);
2310 
2320 LIBYANG_API_DECL struct lyd_meta *lyd_find_meta(const struct lyd_meta *first, const struct lys_module *module,
2321  const char *name);
2322 
2334 LIBYANG_API_DECL LY_ERR lyd_find_sibling_first(const struct lyd_node *siblings, const struct lyd_node *target,
2335  struct lyd_node **match);
2336 
2361 LIBYANG_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 
2375 LIBYANG_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 
2388 LIBYANG_API_DECL LY_ERR lyd_find_sibling_opaq_next(const struct lyd_node *first, const char *name, struct lyd_node **match);
2389 
2401 LIBYANG_API_DECL LY_ERR lyxp_vars_set(struct lyxp_var **vars, const char *name, const char *value);
2402 
2408 LIBYANG_API_DECL void lyxp_vars_free(struct lyxp_var *vars);
2409 
2429 LIBYANG_API_DECL LY_ERR lyd_find_xpath(const struct lyd_node *ctx_node, const char *xpath, struct ly_set **set);
2430 
2444 LIBYANG_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 
2464 LIBYANG_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 
2478 LIBYANG_API_DECL LY_ERR lyd_eval_xpath(const struct lyd_node *ctx_node, const char *xpath, ly_bool *result);
2479 
2492 LIBYANG_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 
2510 LIBYANG_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);
2512 
2516 typedef enum {
2518  LY_XPATH_STRING,
2519  LY_XPATH_NUMBER,
2521 } LY_XPATH_TYPE;
2522 
2545 LIBYANG_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);
2559 LIBYANG_API_DEF LY_ERR lyd_trim_xpath(struct lyd_node **tree, const char *xpath, const struct lyxp_var *vars);
2560 
2578 LIBYANG_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 
2591 LIBYANG_API_DECL LY_ERR lyd_find_target(const struct ly_path *path, const struct lyd_node *tree, struct lyd_node **match);
2592 
2598 LIBYANG_API_DECL int ly_time_tz_offset(void);
2599 
2606 LIBYANG_API_DECL int ly_time_tz_offset_at(time_t time);
2607 
2616 LIBYANG_API_DECL LY_ERR ly_time_str2time(const char *value, time_t *time, char **fractions_s);
2617 
2626 LIBYANG_API_DECL LY_ERR ly_time_time2str(time_t time, const char *fractions_s, char **str);
2627 
2635 LIBYANG_API_DECL LY_ERR ly_time_str2ts(const char *value, struct timespec *ts);
2636 
2644 LIBYANG_API_DECL LY_ERR ly_time_ts2str(const struct timespec *ts, char **str);
2645 
2656 LIBYANG_API_DECL LY_ERR lyd_leafref_get_links(const struct lyd_node_term *node, const struct lyd_leafref_links_rec **record);
2657 
2667 LIBYANG_API_DECL LY_ERR lyd_leafref_link_node_tree(const struct lyd_node *tree);
2668 
2682 LIBYANG_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 
2694 LIBYANG_API_DECL LY_ERR ly_pattern_compile(const struct ly_ctx *ctx, const char *pattern, void **pat_comp);
2695 
2701 LIBYANG_API_DECL void ly_pattern_free(void *pat_comp);
2702 
2703 #ifdef __cplusplus
2704 }
2705 #endif
2706 
2707 #endif /* LY_TREE_DATA_H_ */
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...
Special lyd_value structure for ietf-yang-types date-no-zone values.
Definition: tree_data.h:701
LIBYANG_API_DECL void ly_pattern_free(void *pat_comp)
Free a compiled XML Schema regex pattern.
struct in_addr addr
Definition: tree_data.h:654
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...
Compiled prefix data pair mapping of prefixes to modules. In case the format is LY_VALUE_SCHEMA_RESOL...
Definition: tree_schema.h:1183
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.
struct lysc_type * realtype
Definition: tree_data.h:552
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...
Compiled YANG data node.
Definition: tree_schema.h:1430
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...
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:2098
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, lyd_new_path2 should be used instead, this function expects the value as string.
LIBYANG_API_DECL LY_ERR ly_time_ts2str(const struct timespec *ts, char **str)
Convert timespec into date-and-time string value.
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...
#define LYS_CONTAINER
Definition: tree_schema.h:236
Generic prefix and namespace mapping, meaning depends on the format.
Definition: tree_data.h:746
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_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...
const char * zone
Definition: tree_data.h:670
LIBYANG_API_DECL void lyxp_vars_free(struct lyxp_var *vars)
Free the XPath variables.
const char * prefix
Definition: tree_data.h:748
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 in_addr addr
Definition: tree_data.h:646
Generic structure for a data node.
Definition: tree_data.h:815
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_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.
Special lyd_value structure for ietf-yang-types date values.
Definition: tree_data.h:693
LIBYANG_API_DECL LY_ERR lyd_compare_meta(const struct lyd_meta *meta1, const struct lyd_meta *meta2)
Compare 2 metadata.
uint32_t size
Definition: tree_data.h:632
const char * zone
Definition: tree_data.h:647
LY_ERR
libyang&#39;s error codes returned by the libyang functions.
Definition: log.h:255
struct lyd_node_opaq * parent
Definition: tree_data.h:760
const char * name
Definition: metadata.h:40
uint8_t ly_bool
Type to indicate boolean value.
Definition: log.h:29
LYD_PATH_TYPE
Types of the different data paths.
Definition: tree_data.h:2317
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 lyxp_vars_set(struct lyxp_var **vars, const char *name, const char *value)
Set a new XPath variable to vars.
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.
const char * name
Definition: tree_schema.h:1441
void * original
Definition: tree_data.h:606
YANG identity-stmt.
Definition: tree_schema.h:1221
struct lysc_node * parent
Definition: tree_schema.h:1435
libyang representation of YANG schema trees.
Special lyd_value structure for ietf-inet-types ipv4-address values.
Definition: tree_data.h:645
struct rb_node * rbt
Definition: tree_data.h:736
libyang generic macros and functions to work with YANG schema or data trees.
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...
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 ipv4-address-no-zone values.
Definition: tree_data.h:638
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_any_value_str(const struct lyd_node *any, LYD_FORMAT format, char **value_str)
Get anydata string value.
Data node structure for the inner data tree nodes - containers, lists, RPCs, actions and Notification...
Definition: tree_data.h:835
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.
struct lyd_value value
Definition: metadata.h:41
struct lyd_node * child
Definition: tree_data.h:858
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 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.
dup realtype
Definition: lyds_tree.c:98
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).
struct in6_addr addr
Definition: tree_data.h:677
void * prefix_data
Definition: tree_data.h:728
Special lyd_value structure for ietf-yang-types date-and-time values.
Definition: tree_data.h:684
ly_bool unknown_tz
Definition: tree_data.h:695
uint16_t nodetype
Definition: tree_schema.h:1431
struct lyd_meta * meta
Definition: tree_data.h:828
Data node structure for the terminal data tree nodes - leaves and leaf-lists.
Definition: tree_data.h:867
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_diff_merge_all(struct lyd_node **diff, const struct lyd_node *src_diff, uint16_t options)
Merge 2 diffs into each other.
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.
struct lysc_node * schema
Definition: tree_data.h:821
LIBYANG_API_DECL 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. Generally, in case of augments it is the target module, recursively, otherwise it is the module where the data node is defined.
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.
struct lysc_node * ctx_node
Definition: tree_data.h:613
LIBYANG_API_DECL LY_ERR ly_time_str2ts(const char *value, struct timespec *ts)
Convert date-and-time from string to timespec.
struct ly_opaq_name name
Definition: tree_data.h:762
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_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().
uint32_t hints
Definition: tree_data.h:764
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_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.
struct lysc_type_bitenum_item ** items
Definition: tree_data.h:623
libyang hash table.
Special lyd_value structure for ietf-inet-types ipv6-address values.
Definition: tree_data.h:668
LYD_FORMAT
Data input/output formats supported by libyang parser and printer functions.
Definition: tree_data.h:535
LIBYANG_API_DECL struct lysc_node * lyd_node_schema(const struct lyd_node *node)
Get schema node of a data node. Useful especially for opaque nodes.
YANG data representation.
Definition: tree_data.h:548
const char * _canonical
Definition: tree_data.h:549
LY_XPATH_TYPE
XPath result type.
Definition: tree_data.h:2546
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 int ly_time_tz_offset(void)
Get current timezone (including DST setting) UTC (GMT) time offset in seconds.
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 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.
Metadata structure.
Definition: metadata.h:36
#define LYS_ANYDATA
Definition: tree_schema.h:242
struct ly_ctx * ctx
Definition: tree_data.h:727
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.
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 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 lyd_change_meta(struct lyd_meta *meta, const char *val_str)
Change the value of a metadata instance.
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 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 struct lys_module * lyd_node_module(const struct lyd_node *node)
Get the module of a node. Useful mainly for opaque nodes.
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_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.
const char * name
Definition: tree_data.h:747
LIBYANG_API_DECL struct lyd_node * lyd_first_sibling(const struct lyd_node *node)
Get the first sibling of the given node.
uint32_t hints
Definition: tree_data.h:608
#define LYS_ACTION
Definition: tree_schema.h:246
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()...
Special lyd_value structure for ietf-inet-types ipv4-prefix values.
Definition: tree_data.h:653
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...
void * val_prefix_data
Definition: tree_data.h:766
struct lyd_node_term ** target_nodes
Definition: tree_data.h:1044
uint32_t seconds
Definition: tree_data.h:718
Structure to hold a set of (not necessary somehow connected) objects. Usually used for lyd_node...
Definition: set.h:47
void * prefix_data
Definition: tree_data.h:612
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.
LIBYANG_API_DECL void lyd_free_meta_single(struct lyd_meta *meta)
Free a single metadata instance.
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()...
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()...
Available YANG schema tree structures representing YANG module.
Definition: tree_schema.h:2264
Special lyd_value structure for ietf-yang-types time values.
Definition: tree_data.h:708
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.
struct in6_addr addr
Definition: tree_data.h:669
uint32_t seconds
Definition: tree_data.h:709
Special lyd_value structure for lyds tree value.
Definition: tree_data.h:735
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:2196
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 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_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 void lyd_free_all(struct lyd_node *node)
Free all the nodes (even parents of the node) in the data tree.
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.
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_unlink_siblings(struct lyd_node *node)
Unlink the specified node with all the following siblings.
char * fractions_s
Definition: tree_data.h:719
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_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...
const char * value
Definition: tree_data.h:763
Special lyd_value structure for ietf-inet-types ipv6-prefix values.
Definition: tree_data.h:676
Generic attribute structure.
Definition: tree_data.h:759
struct lys_module * module
Definition: tree_schema.h:1434
Special lyd_value structure for ietf-yang-types xpath1.0 values.
Definition: tree_data.h:725
#define LYD_CTX(node)
Macro to get context from a data tree node.
Definition: tree_data.h:518
struct lyd_attr * next
Definition: tree_data.h:761
Special lyd_value structure for ietf-yang-types time-no-zone values.
Definition: tree_data.h:717
LIBYANG_API_DECL void lyd_free_siblings(struct lyd_node *node)
Free all the sibling nodes (preceding as well as succeeding).
LY_VALUE_FORMAT format
Definition: tree_data.h:729
LY_VALUE_FORMAT format
Definition: tree_data.h:765
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. Uses hashes to whatever extent possible.
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).
struct lyd_node_term * node
Definition: tree_data.h:1037
LY_VALUE_FORMAT
All kinds of supported value formats and prefix mappings to modules.
Definition: tree.h:234
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...
#define LYS_NOTIF
Definition: tree_schema.h:247
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.
uint64_t orig_size_bits
Definition: tree_data.h:607
#define LYD_NODE_TERM
Definition: tree_data.h:770
#define LYS_RPC
Definition: tree_schema.h:245
char * bitmap
Definition: tree_data.h:620
struct lyd_value value
Definition: tree_data.h:890
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_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.
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.
LIBYANG_API_DECL LY_ERR lyd_value_compare(const struct lyd_node_term *node, const char *value, uint32_t value_len)
Compare the node&#39;s value with the given string value. The string value is first validated according t...
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 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 &quot;when&quot; are not added...
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...
Data node structure for unparsed (opaque) nodes.
Definition: tree_data.h:1002
struct lyxp_expr * exp
Definition: tree_data.h:726
LIBYANG_API_DECL void lyd_free_attr_single(const struct ly_ctx *ctx, struct lyd_attr *attr)
Free a single attribute.
Data node structure for the anydata data tree nodes - anydata or anyxml.
Definition: tree_data.h:896
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.
Logger manipulation routines and error definitions.
LIBYANG_API_DECL void lyd_free_meta_siblings(struct lyd_meta *meta)
Free the metadata instance with any following instances.
struct lyd_node_term ** leafref_nodes
Definition: tree_data.h:1038
Special lyd_value structure for built-in bits values.
Definition: tree_data.h:619
Special lyd_value structure for built-in union values.
Definition: tree_data.h:603
struct lyd_node * prev
Definition: tree_data.h:824
LY_VALUE_FORMAT format
Definition: tree_data.h:609
LIBYANG_API_DECL LY_ERR lyd_unlink_tree(struct lyd_node *node)
Unlink the specified data subtree.
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 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 &quot;when&quot; are not added.
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.
ly_bool unknown_tz
Definition: tree_data.h:711
#define LYS_LIST
Definition: tree_schema.h:240
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.
libyang context handler.
struct ly_ht * children_ht
Definition: tree_data.h:859
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...
Special lyd_value structure for built-in binary values.
Definition: tree_data.h:630
struct lyd_value value
Definition: tree_data.h:604
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 lyd_node * next
Definition: tree_data.h:823
struct lyd_node * parent
Definition: tree_data.h:822
char * fractions_s
Definition: tree_data.h:710
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.