libyang  3.10.1
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 #ifdef _WIN32
20 # include <winsock2.h>
21 # include <ws2tcpip.h>
22 #else
23 # include <arpa/inet.h>
24 # if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__)
25 # include <netinet/in.h>
26 # include <sys/socket.h>
27 # endif
28 #endif
29 
30 #define PCRE2_CODE_UNIT_WIDTH 8
31 
32 #include <pcre2.h>
33 #include <stddef.h>
34 #include <stdint.h>
35 #include <time.h>
36 
37 #include "log.h"
38 #include "ly_config.h"
39 #include "tree.h"
40 #include "tree_schema.h"
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 struct ly_ctx;
47 struct ly_path;
48 struct ly_set;
49 struct lyd_node;
50 struct lyd_node_opaq;
51 struct lyd_node_term;
52 struct timespec;
53 struct lyxp_var;
54 struct rb_node;
55 
427 /* *INDENT-OFF* */
428 
454 #define LYD_TREE_DFS_BEGIN(START, ELEM) \
455  { ly_bool LYD_TREE_DFS_continue = 0; struct lyd_node *LYD_TREE_DFS_next; \
456  for ((ELEM) = (LYD_TREE_DFS_next) = (struct lyd_node *)(START); \
457  (ELEM); \
458  (ELEM) = (LYD_TREE_DFS_next), LYD_TREE_DFS_continue = 0)
459 
474 #define LYD_TREE_DFS_END(START, ELEM) \
475  /* select element for the next run - children first */ \
476  if (LYD_TREE_DFS_continue) { \
477  (LYD_TREE_DFS_next) = NULL; \
478  } else { \
479  (LYD_TREE_DFS_next) = lyd_child(ELEM); \
480  }\
481  if (!(LYD_TREE_DFS_next)) { \
482  /* no children */ \
483  if ((ELEM) == (struct lyd_node *)(START)) { \
484  /* we are done, (START) has no children */ \
485  break; \
486  } \
487  /* try siblings */ \
488  (LYD_TREE_DFS_next) = (ELEM)->next; \
489  } \
490  while (!(LYD_TREE_DFS_next)) { \
491  /* parent is already processed, go to its sibling */ \
492  (ELEM) = (struct lyd_node *)(ELEM)->parent; \
493  /* no siblings, go back through parents */ \
494  if ((ELEM)->parent == (START)->parent) { \
495  /* we are done, no next element to process */ \
496  break; \
497  } \
498  (LYD_TREE_DFS_next) = (ELEM)->next; \
499  } }
500 
508 #define LYD_LIST_FOR_INST(START, SCHEMA, ELEM) \
509  for (lyd_find_sibling_val(START, SCHEMA, NULL, 0, &(ELEM)); \
510  (ELEM) && ((ELEM)->schema == (SCHEMA)); \
511  (ELEM) = (ELEM)->next)
512 
521 #define LYD_LIST_FOR_INST_SAFE(START, SCHEMA, NEXT, ELEM) \
522  for ((NEXT) = (ELEM) = NULL, lyd_find_sibling_val(START, SCHEMA, NULL, 0, &(ELEM)); \
523  (ELEM) && ((ELEM)->schema == (SCHEMA)) ? ((NEXT) = (ELEM)->next, 1) : 0; \
524  (ELEM) = (NEXT))
525 
526 /* *INDENT-ON* */
527 
531 #define LYD_CTX(node) ((node)->schema ? (node)->schema->module->ctx : ((const struct lyd_node_opaq *)(node))->ctx)
532 
540 #define LYD_NODE_IS_ALONE(NODE) \
541  (((NODE)->prev == NODE) || \
542  (((NODE)->prev->schema != (NODE)->schema) && (!(NODE)->next || ((NODE)->schema != (NODE)->next->schema))))
543 
548 typedef enum {
553 } LYD_FORMAT;
554 
558 typedef enum {
570 
576 struct lyd_value {
577  const char *_canonical;
580  const struct lysc_type *realtype;
588  union {
589  int8_t boolean;
590  int64_t dec64;
591  int8_t int8;
592  int16_t int16;
593  int32_t int32;
594  int64_t int64;
595  uint8_t uint8;
596  uint16_t uint16;
597  uint32_t uint32;
598  uint64_t uint64;
599  struct lysc_type_bitenum_item *enum_item;
600  struct lysc_ident *ident;
601  struct ly_path *target;
603  struct lyd_value_union *subvalue;
605  void *dyn_mem;
606  uint8_t fixed_mem[LYD_VALUE_FIXED_MEM_SIZE];
607  };
609 };
610 
619 #define LYD_VALUE_GET(value, type_val) \
620  ((sizeof *(type_val) > LYD_VALUE_FIXED_MEM_SIZE) \
621  ? ((type_val) = (((value)->dyn_mem))) \
622  : ((type_val) = ((void *)((value)->fixed_mem))))
623 
632  struct lyd_value value;
634  void *original;
635  size_t orig_len;
636  uint32_t hints;
640  void *prefix_data;
641  const struct lysc_node *ctx_node;
642 };
643 
648  char *bitmap;
653 };
654 
659  void *data;
660  size_t size;
661 };
662 
667  struct in_addr addr;
668 };
669 
674  struct in_addr addr;
675  const char *zone;
676 };
677 
682  struct in_addr addr;
683  uint8_t prefix;
684 };
685 
690  struct in6_addr addr;
691 };
692 
697  struct in6_addr addr;
698  const char *zone;
699 };
700 
705  struct in6_addr addr;
706  uint8_t prefix;
707 };
708 
713  time_t time;
714  char *fractions_s;
716 };
717 
722  struct lyxp_expr *exp;
723  const struct ly_ctx *ctx;
724  void *prefix_data;
726 };
727 
732  struct rb_node *rbt;
733 };
734 
742 struct ly_opaq_name {
743  const char *name;
744  const char *prefix;
746  union {
747  const char *module_ns;
748  const char *module_name;
749  };
750 };
751 
755 struct lyd_attr {
757  struct lyd_attr *next;
759  const char *value;
760  uint32_t hints;
763 };
764 
765 #define LYD_NODE_INNER (LYS_CONTAINER|LYS_LIST|LYS_RPC|LYS_ACTION|LYS_NOTIF)
766 #define LYD_NODE_TERM (LYS_LEAF|LYS_LEAFLIST)
767 #define LYD_NODE_ANY (LYS_ANYDATA)
794 #define LYD_DEFAULT 0x01
795 #define LYD_WHEN_TRUE 0x02
796 #define LYD_NEW 0x04
797 #define LYD_EXT 0x08
804 struct lyd_node {
805  uint32_t hash;
809  uint32_t flags;
810  const struct lysc_node *schema;
812  struct lyd_node *next;
813  struct lyd_node *prev;
817  struct lyd_meta *meta;
818  void *priv;
819 };
820 
825  union {
826  struct lyd_node node;
828  struct {
829  uint32_t hash;
834  uint32_t flags;
835  const struct lysc_node *schema;
836  struct lyd_node_inner *parent;
837  struct lyd_node *next;
838  struct lyd_node *prev;
842  struct lyd_meta *meta;
843  void *priv;
844  };
845  };
847  struct lyd_node *child;
848  struct ly_ht *children_ht;
850 #define LYD_HT_MIN_ITEMS 4
851 };
852 
857  union {
858  struct lyd_node node;
860  struct {
861  uint32_t hash;
866  uint32_t flags;
867  const struct lysc_node *schema;
868  struct lyd_node_inner *parent;
869  struct lyd_node *next;
870  struct lyd_node *prev;
874  struct lyd_meta *meta;
875  void *priv;
876  };
877  };
879  struct lyd_value value;
880 };
881 
886  struct lyd_node *tree;
887  const char *str;
888  const char *xml;
889  const char *json;
890  char *mem;
891 };
892 
897 struct lyd_node_any {
898  union {
899  struct lyd_node node;
901  struct {
902  uint32_t hash;
907  uint32_t flags;
908  const struct lysc_node *schema;
909  struct lyd_node_inner *parent;
910  struct lyd_node *next;
911  struct lyd_node *prev;
915  struct lyd_meta *meta;
916  void *priv;
917  };
918  };
920  union lyd_any_value value;
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 0x0080
963 #define LYD_NODEHINT_LEAFLIST 0x0100
964 #define LYD_NODEHINT_CONTAINER 0x0200
979 #define LYD_HINT_DATA 0x03F3
983 #define LYD_HINT_SCHEMA 0x03FF
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_inner *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 };
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 static inline struct lyd_node *
1049 lyd_parent(const struct lyd_node *node)
1050 {
1051  return (node && node->parent) ? &node->parent->node : NULL;
1052 }
1053 
1064 static inline struct lyd_node *
1065 lyd_child(const struct lyd_node *node)
1066 {
1067  if (!node) {
1068  return NULL;
1069  }
1070 
1071  if (!node->schema) {
1072  /* opaq node */
1073  return ((const struct lyd_node_opaq *)node)->child;
1074  }
1075 
1077  return ((const struct lyd_node_inner *)node)->child;
1078  }
1079 
1080  return NULL;
1081 }
1082 
1093 LIBYANG_API_DECL struct lyd_node *lyd_child_no_keys(const struct lyd_node *node);
1094 
1104 LIBYANG_API_DECL const struct lys_module *lyd_owner_module(const struct lyd_node *node);
1105 
1112 LIBYANG_API_DECL const struct lys_module *lyd_node_module(const struct lyd_node *node);
1113 
1120 LIBYANG_API_DECL ly_bool lyd_is_default(const struct lyd_node *node);
1121 
1129 LIBYANG_API_DECL uint32_t lyd_list_pos(const struct lyd_node *instance);
1130 
1137 LIBYANG_API_DECL struct lyd_node *lyd_first_sibling(const struct lyd_node *node);
1138 
1146 LIBYANG_API_DECL int lyd_lyb_data_length(const char *data);
1147 
1157 LIBYANG_API_DECL LY_ERR lyd_parse_opaq_error(const struct lyd_node *node);
1158 
1168 LIBYANG_API_DECL const char *lyd_value_get_canonical(const struct ly_ctx *ctx, const struct lyd_value *value);
1169 
1176 static inline const char *
1177 lyd_get_value(const struct lyd_node *node)
1178 {
1179  if (!node) {
1180  return NULL;
1181  }
1182 
1183  if (!node->schema) {
1184  return ((const struct lyd_node_opaq *)node)->value;
1185  } else if (node->schema->nodetype & LYD_NODE_TERM) {
1186  const struct lyd_value *value = &((const struct lyd_node_term *)node)->value;
1187 
1188  return value->_canonical ? value->_canonical : lyd_value_get_canonical(LYD_CTX(node), value);
1189  }
1190 
1191  return NULL;
1192 }
1193 
1201 LIBYANG_API_DECL LY_ERR lyd_any_value_str(const struct lyd_node *any, char **value_str);
1202 
1211 LIBYANG_API_DECL LY_ERR lyd_any_copy_value(struct lyd_node *trg, const union lyd_any_value *value,
1212  LYD_ANYDATA_VALUETYPE value_type);
1213 
1220 LIBYANG_API_DECL const struct lysc_node *lyd_node_schema(const struct lyd_node *node);
1221 
1229 LIBYANG_API_DECL ly_bool lyd_meta_is_internal(const struct lyd_meta *meta);
1230 
1246 LIBYANG_API_DECL LY_ERR lyd_new_inner(struct lyd_node *parent, const struct lys_module *module, const char *name,
1247  ly_bool output, struct lyd_node **node);
1248 
1262 LIBYANG_API_DECL LY_ERR lyd_new_ext_inner(const struct lysc_ext_instance *ext, const char *name, struct lyd_node **node);
1263 
1285 #define LYD_NEW_VAL_OUTPUT 0x01
1287 #define LYD_NEW_VAL_STORE_ONLY 0x02
1288 #define LYD_NEW_VAL_BIN 0x04
1290 #define LYD_NEW_VAL_CANON 0x08
1293 #define LYD_NEW_META_CLEAR_DFLT 0x10
1294 #define LYD_NEW_PATH_UPDATE 0x20
1298 #define LYD_NEW_PATH_OPAQ 0x40
1302 #define LYD_NEW_PATH_WITH_OPAQ 0x80
1303 #define LYD_NEW_ANY_USE_VALUE 0x100
1320 LIBYANG_API_DECL LY_ERR lyd_new_list(struct lyd_node *parent, const struct lys_module *module, const char *name,
1321  uint32_t options, struct lyd_node **node, ...);
1322 
1338 LIBYANG_API_DECL LY_ERR lyd_new_ext_list(const struct lysc_ext_instance *ext, const char *name, uint32_t options,
1339  struct lyd_node **node, ...);
1340 
1354 LIBYANG_API_DECL LY_ERR lyd_new_list2(struct lyd_node *parent, const struct lys_module *module, const char *name,
1355  const char *keys, uint32_t options, struct lyd_node **node);
1356 
1369 LIBYANG_API_DECL LY_ERR lyd_new_list3(struct lyd_node *parent, const struct lys_module *module, const char *name,
1370  const char **key_values, uint32_t *value_lengths, uint32_t options, struct lyd_node **node);
1371 
1386 LIBYANG_API_DECL LY_ERR lyd_new_term(struct lyd_node *parent, const struct lys_module *module, const char *name,
1387  const char *value, uint32_t options, struct lyd_node **node);
1388 
1401 LIBYANG_API_DECL LY_ERR lyd_new_term_bin(struct lyd_node *parent, const struct lys_module *module, const char *name,
1402  const void *value, size_t value_len, uint32_t options, struct lyd_node **node);
1403 
1418 LIBYANG_API_DECL LY_ERR lyd_new_ext_term(const struct lysc_ext_instance *ext, const char *name, const void *value,
1419  size_t value_len, uint32_t options, struct lyd_node **node);
1420 
1435 LIBYANG_API_DECL LY_ERR lyd_new_any(struct lyd_node *parent, const struct lys_module *module, const char *name,
1436  const void *value, LYD_ANYDATA_VALUETYPE value_type, uint32_t options, struct lyd_node **node);
1437 
1452 LIBYANG_API_DECL LY_ERR lyd_new_ext_any(const struct lysc_ext_instance *ext, const char *name, const void *value,
1453  LYD_ANYDATA_VALUETYPE value_type, uint32_t options, struct lyd_node **node);
1454 
1469 LIBYANG_API_DECL LY_ERR lyd_new_meta(const struct ly_ctx *ctx, struct lyd_node *parent, const struct lys_module *module,
1470  const char *name, const char *val_str, uint32_t options, struct lyd_meta **meta);
1471 
1484 LIBYANG_API_DECL LY_ERR lyd_new_meta2(const struct ly_ctx *ctx, struct lyd_node *parent, uint32_t options,
1485  const struct lyd_attr *attr, struct lyd_meta **meta);
1486 
1499 LIBYANG_API_DECL LY_ERR lyd_new_opaq(struct lyd_node *parent, const struct ly_ctx *ctx, const char *name, const char *value,
1500  const char *prefix, const char *module_name, struct lyd_node **node);
1501 
1514 LIBYANG_API_DECL LY_ERR lyd_new_opaq2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *name, const char *value,
1515  const char *prefix, const char *module_ns, struct lyd_node **node);
1516 
1530 LIBYANG_API_DECL LY_ERR lyd_new_attr(struct lyd_node *parent, const char *module_name, const char *name, const char *value,
1531  struct lyd_attr **attr);
1532 
1545 LIBYANG_API_DECL LY_ERR lyd_new_attr2(struct lyd_node *parent, const char *module_ns, const char *name, const char *value,
1546  struct lyd_attr **attr);
1547 
1576 LIBYANG_API_DECL LY_ERR lyd_new_path(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path, const char *value,
1577  uint32_t options, struct lyd_node **node);
1578 
1603 LIBYANG_API_DECL LY_ERR lyd_new_path2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path, const void *value,
1604  size_t value_len, LYD_ANYDATA_VALUETYPE value_type, uint32_t options, struct lyd_node **new_parent,
1605  struct lyd_node **new_node);
1606 
1629 LIBYANG_API_DECL LY_ERR lyd_new_ext_path(struct lyd_node *parent, const struct lysc_ext_instance *ext, const char *path,
1630  const void *value, uint32_t options, struct lyd_node **node);
1631 
1645 #define LYD_IMPLICIT_NO_STATE 0x01
1646 #define LYD_IMPLICIT_NO_CONFIG 0x02
1647 #define LYD_IMPLICIT_OUTPUT 0x04
1648 #define LYD_IMPLICIT_NO_DEFAULTS 0x08
1661 LIBYANG_API_DECL LY_ERR lyd_new_implicit_tree(struct lyd_node *tree, uint32_t implicit_options, struct lyd_node **diff);
1674 LIBYANG_API_DECL LY_ERR lyd_new_implicit_all(struct lyd_node **tree, const struct ly_ctx *ctx, uint32_t implicit_options,
1675  struct lyd_node **diff);
1676 
1688 LIBYANG_API_DECL LY_ERR lyd_new_implicit_module(struct lyd_node **tree, const struct lys_module *module,
1689  uint32_t implicit_options, struct lyd_node **diff);
1690 
1704 LIBYANG_API_DECL LY_ERR lyd_change_term(struct lyd_node *term, const char *val_str);
1705 
1720 LIBYANG_API_DECL LY_ERR lyd_change_term_bin(struct lyd_node *term, const void *value, size_t value_len);
1721 
1736 LIBYANG_API_DECL LY_ERR lyd_change_term_canon(struct lyd_node *term, const char *val_str);
1737 
1747 LIBYANG_API_DECL LY_ERR lyd_change_meta(struct lyd_meta *meta, const char *val_str);
1748 
1760 LIBYANG_API_DECL LY_ERR lyd_insert_child(struct lyd_node *parent, struct lyd_node *node);
1761 
1774 LIBYANG_API_DECL LY_ERR lyd_insert_sibling(struct lyd_node *sibling, struct lyd_node *node, struct lyd_node **first);
1775 
1787 LIBYANG_API_DECL LY_ERR lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node);
1788 
1800 LIBYANG_API_DECL LY_ERR lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node);
1801 
1809 LIBYANG_API_DECL LY_ERR lyd_unlink_siblings(struct lyd_node *node);
1810 
1818 LIBYANG_API_DECL LY_ERR lyd_unlink_tree(struct lyd_node *node);
1819 
1825 LIBYANG_API_DECL void lyd_free_all(struct lyd_node *node);
1826 
1832 LIBYANG_API_DECL void lyd_free_siblings(struct lyd_node *node);
1833 
1839 LIBYANG_API_DECL void lyd_free_tree(struct lyd_node *node);
1840 
1846 LIBYANG_API_DECL void lyd_free_meta_single(struct lyd_meta *meta);
1847 
1853 LIBYANG_API_DECL void lyd_free_meta_siblings(struct lyd_meta *meta);
1854 
1861 LIBYANG_API_DECL void lyd_free_attr_single(const struct ly_ctx *ctx, struct lyd_attr *attr);
1862 
1869 LIBYANG_API_DECL void lyd_free_attr_siblings(const struct ly_ctx *ctx, struct lyd_attr *attr);
1870 
1889 LIBYANG_API_DECL LY_ERR lyd_value_validate(const struct ly_ctx *ctx, const struct lysc_node *schema, const char *value,
1890  size_t value_len, const struct lyd_node *ctx_node, const struct lysc_type **realtype, const char **canonical);
1891 
1904 LIBYANG_API_DECL LY_ERR lyd_value_compare(const struct lyd_node_term *node, const char *value, size_t value_len);
1905 
1912 #define LYD_COMPARE_FULL_RECURSION 0x01 /* Lists and containers are the same only in case all they children
1913  (subtree, so direct as well as indirect children) are the same. By default,
1914  containers are the same in case of the same schema node and lists are the same
1915  in case of equal keys (keyless lists do the full recursion comparison all the time). */
1916 #define LYD_COMPARE_DEFAULTS 0x02 /* By default, implicit and explicit default nodes are considered to be equal. This flag
1917  changes this behavior and implicit (automatically created default node) and explicit
1918  (explicitly created node with the default value) default nodes are considered different. */
1919 #define LYD_COMPARE_OPAQ 0x04 /* Opaque nodes can normally be never equal to data nodes. Using this flag even
1920  opaque nodes members are compared to data node schema and value and can result
1921  in a match. */
1922 
1935 LIBYANG_API_DECL LY_ERR lyd_compare_single(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options);
1948 LIBYANG_API_DECL LY_ERR lyd_compare_siblings(const struct lyd_node *node1, const struct lyd_node *node2, uint32_t options);
1949 
1960 LIBYANG_API_DECL LY_ERR lyd_compare_meta(const struct lyd_meta *meta1, const struct lyd_meta *meta2);
1961 
1974 #define LYD_DUP_RECURSIVE 0x01
1976 #define LYD_DUP_NO_META 0x02
1978 #define LYD_DUP_WITH_PARENTS 0x04
1980 #define LYD_DUP_WITH_FLAGS 0x08
1982 #define LYD_DUP_NO_EXT 0x10
1983 #define LYD_DUP_WITH_PRIV 0x20
1985 #define LYD_DUP_NO_LYDS 0x40
2003 LIBYANG_API_DECL LY_ERR lyd_dup_single(const struct lyd_node *node, struct lyd_node_inner *parent, uint32_t options,
2004  struct lyd_node **dup);
2005 
2018 LIBYANG_API_DECL LY_ERR lyd_dup_single_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx,
2019  struct lyd_node_inner *parent, uint32_t options, struct lyd_node **dup);
2020 
2032 LIBYANG_API_DECL LY_ERR lyd_dup_siblings(const struct lyd_node *node, struct lyd_node_inner *parent, uint32_t options,
2033  struct lyd_node **dup);
2034 
2048 LIBYANG_API_DECL LY_ERR lyd_dup_siblings_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx,
2049  struct lyd_node_inner *parent, uint32_t options, struct lyd_node **dup);
2050 
2059 LIBYANG_API_DECL LY_ERR lyd_dup_meta_single(const struct lyd_meta *meta, struct lyd_node *parent, struct lyd_meta **dup);
2060 
2075 #define LYD_MERGE_DESTRUCT 0x01
2076 #define LYD_MERGE_DEFAULTS 0x02
2077 #define LYD_MERGE_WITH_FLAGS 0x04
2101 LIBYANG_API_DECL LY_ERR lyd_merge_tree(struct lyd_node **target, const struct lyd_node *source, uint16_t options);
2124 LIBYANG_API_DECL LY_ERR lyd_merge_siblings(struct lyd_node **target, const struct lyd_node *source, uint16_t options);
2125 
2135 typedef LY_ERR (*lyd_merge_cb)(struct lyd_node *trg_node, const struct lyd_node *src_node, void *cb_data);
2136 
2152 LIBYANG_API_DECL LY_ERR lyd_merge_module(struct lyd_node **target, const struct lyd_node *source, const struct lys_module *mod,
2153  lyd_merge_cb merge_cb, void *cb_data, uint16_t options);
2154 
2169 #define LYD_DIFF_DEFAULTS 0x01
2172 #define LYD_DIFF_META 0x02
2203 LIBYANG_API_DECL LY_ERR lyd_diff_tree(const struct lyd_node *first, const struct lyd_node *second, uint16_t options,
2204  struct lyd_node **diff);
2205 
2218 LIBYANG_API_DECL LY_ERR lyd_diff_siblings(const struct lyd_node *first, const struct lyd_node *second, uint16_t options,
2219  struct lyd_node **diff);
2220 
2229 typedef LY_ERR (*lyd_diff_cb)(const struct lyd_node *diff_node, struct lyd_node *data_node, void *cb_data);
2230 
2247 LIBYANG_API_DECL LY_ERR lyd_diff_apply_module(struct lyd_node **data, const struct lyd_node *diff,
2248  const struct lys_module *mod, lyd_diff_cb diff_cb, void *cb_data);
2249 
2260 LIBYANG_API_DECL LY_ERR lyd_diff_apply_all(struct lyd_node **data, const struct lyd_node *diff);
2261 
2273 #define LYD_DIFF_MERGE_DEFAULTS 0x01
2301 LIBYANG_API_DECL LY_ERR lyd_diff_merge_module(struct lyd_node **diff, const struct lyd_node *src_diff,
2302  const struct lys_module *mod, lyd_diff_cb diff_cb, void *cb_data, uint16_t options);
2303 
2320 LIBYANG_API_DECL LY_ERR lyd_diff_merge_tree(struct lyd_node **diff_first, struct lyd_node *diff_parent,
2321  const struct lyd_node *src_sibling, lyd_diff_cb diff_cb, void *cb_data, uint16_t options);
2322 
2334 LIBYANG_API_DECL LY_ERR lyd_diff_merge_all(struct lyd_node **diff, const struct lyd_node *src_diff, uint16_t options);
2335 
2345 LIBYANG_API_DECL LY_ERR lyd_diff_reverse_all(const struct lyd_node *src_diff, struct lyd_node **diff);
2346 
2350 typedef enum {
2351  LYD_PATH_STD,
2355 } LYD_PATH_TYPE;
2356 
2372 LIBYANG_API_DECL char *lyd_path(const struct lyd_node *node, LYD_PATH_TYPE pathtype, char *buffer, size_t buflen);
2373 
2383 LIBYANG_API_DECL struct lyd_meta *lyd_find_meta(const struct lyd_meta *first, const struct lys_module *module,
2384  const char *name);
2385 
2397 LIBYANG_API_DECL LY_ERR lyd_find_sibling_first(const struct lyd_node *siblings, const struct lyd_node *target,
2398  struct lyd_node **match);
2399 
2424 LIBYANG_API_DECL LY_ERR lyd_find_sibling_val(const struct lyd_node *siblings, const struct lysc_node *schema,
2425  const char *key_or_value, size_t val_len, struct lyd_node **match);
2426 
2438 LIBYANG_API_DECL LY_ERR lyd_find_sibling_dup_inst_set(const struct lyd_node *siblings, const struct lyd_node *target,
2439  struct ly_set **set);
2440 
2451 LIBYANG_API_DECL LY_ERR lyd_find_sibling_opaq_next(const struct lyd_node *first, const char *name, struct lyd_node **match);
2452 
2464 LIBYANG_API_DECL LY_ERR lyxp_vars_set(struct lyxp_var **vars, const char *name, const char *value);
2465 
2471 LIBYANG_API_DECL void lyxp_vars_free(struct lyxp_var *vars);
2472 
2490 LIBYANG_API_DECL LY_ERR lyd_find_xpath(const struct lyd_node *ctx_node, const char *xpath, struct ly_set **set);
2491 
2505 LIBYANG_API_DECL LY_ERR lyd_find_xpath2(const struct lyd_node *ctx_node, const char *xpath, const struct lyxp_var *vars,
2506  struct ly_set **set);
2507 
2525 LIBYANG_API_DECL LY_ERR lyd_find_xpath3(const struct lyd_node *ctx_node, const struct lyd_node *tree, const char *xpath,
2526  LY_VALUE_FORMAT format, void *prefix_data, const struct lyxp_var *vars, struct ly_set **set);
2527 
2539 LIBYANG_API_DECL LY_ERR lyd_eval_xpath(const struct lyd_node *ctx_node, const char *xpath, ly_bool *result);
2540 
2553 LIBYANG_API_DECL LY_ERR lyd_eval_xpath2(const struct lyd_node *ctx_node, const char *xpath,
2554  const struct lyxp_var *vars, ly_bool *result);
2555 
2571 LIBYANG_API_DECL LY_ERR lyd_eval_xpath3(const struct lyd_node *ctx_node, const struct lys_module *cur_mod,
2572  const char *xpath, LY_VALUE_FORMAT format, void *prefix_data, const struct lyxp_var *vars, ly_bool *result);
2573 
2577 typedef enum {
2579  LY_XPATH_STRING,
2580  LY_XPATH_NUMBER,
2582 } LY_XPATH_TYPE;
2583 
2606 LIBYANG_API_DECL LY_ERR lyd_eval_xpath4(const struct lyd_node *ctx_node, const struct lyd_node *tree,
2607  const struct lys_module *cur_mod, const char *xpath, LY_VALUE_FORMAT format, void *prefix_data,
2608  const struct lyxp_var *vars, LY_XPATH_TYPE *ret_type, struct ly_set **node_set, char **string,
2609  long double *number, ly_bool *boolean);
2620 LIBYANG_API_DEF LY_ERR lyd_trim_xpath(struct lyd_node **tree, const char *xpath, const struct lyxp_var *vars);
2621 
2639 LIBYANG_API_DECL LY_ERR lyd_find_path(const struct lyd_node *ctx_node, const char *path, ly_bool output,
2640  struct lyd_node **match);
2641 
2652 LIBYANG_API_DECL LY_ERR lyd_find_target(const struct ly_path *path, const struct lyd_node *tree, struct lyd_node **match);
2653 
2659 LIBYANG_API_DECL int ly_time_tz_offset(void);
2660 
2667 LIBYANG_API_DECL int ly_time_tz_offset_at(time_t time);
2668 
2677 LIBYANG_API_DECL LY_ERR ly_time_str2time(const char *value, time_t *time, char **fractions_s);
2678 
2687 LIBYANG_API_DECL LY_ERR ly_time_time2str(time_t time, const char *fractions_s, char **str);
2688 
2696 LIBYANG_API_DECL LY_ERR ly_time_str2ts(const char *value, struct timespec *ts);
2697 
2705 LIBYANG_API_DECL LY_ERR ly_time_ts2str(const struct timespec *ts, char **str);
2706 
2717 LIBYANG_API_DECL LY_ERR lyd_leafref_get_links(const struct lyd_node_term *node, const struct lyd_leafref_links_rec **record);
2718 
2728 LIBYANG_API_DECL LY_ERR lyd_leafref_link_node_tree(const struct lyd_node *tree);
2729 
2743 LIBYANG_API_DECL LY_ERR ly_pattern_match(const struct ly_ctx *ctx, const char *pattern, const char *string,
2744  uint32_t str_len, pcre2_code **pcode);
2745 
2755 LIBYANG_API_DECL LY_ERR ly_pattern_compile(const struct ly_ctx *ctx, const char *pattern, pcre2_code **pcode);
2756 
2757 #ifdef __cplusplus
2758 }
2759 #endif
2760 
2761 #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...
struct in_addr addr
Definition: tree_data.h:682
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_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:580
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:1439
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:2160
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...
union for anydata/anyxml value representation.
Definition: tree_data.h:885
#define LYS_CONTAINER
Definition: tree_schema.h:240
Generic prefix and namespace mapping, meaning depends on the format.
Definition: tree_data.h:742
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...
const char * zone
Definition: tree_data.h:698
LIBYANG_API_DECL void lyxp_vars_free(struct lyxp_var *vars)
Free the XPath variables.
const char * str
Definition: tree_data.h:887
const char * prefix
Definition: tree_data.h:744
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:674
Generic structure for a data node.
Definition: tree_data.h:804
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.
YANG extension compiled instance.
Definition: plugins_exts.h:437
LIBYANG_API_DECL LY_ERR lyd_compare_meta(const struct lyd_meta *meta1, const struct lyd_meta *meta2)
Compare 2 metadata.
uint32_t hash
Definition: tree_data.h:805
const char * xml
Definition: tree_data.h:888
const char * zone
Definition: tree_data.h:675
struct lyd_node_opaq * parent
Definition: tree_data.h:756
const char * name
Definition: metadata.h:40
void * priv
Definition: tree_data.h:818
uint8_t ly_bool
Type to indicate boolean value.
Definition: log.h:28
LYD_PATH_TYPE
Types of the different data paths.
Definition: tree_data.h:2379
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.
const char * name
Definition: tree_schema.h:1450
void * original
Definition: tree_data.h:634
YANG identity-stmt.
Definition: tree_schema.h:1230
struct lysc_node * parent
Definition: tree_schema.h:1444
libyang representation of YANG schema trees.
Special lyd_value structure for ietf-inet-types ipv4-address values.
Definition: tree_data.h:673
struct rb_node * rbt
Definition: tree_data.h:732
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:689
Special lyd_value structure for ietf-inet-types ipv4-address-no-zone values.
Definition: tree_data.h:666
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.
size_t orig_len
Definition: tree_data.h:635
Data node structure for the inner data tree nodes - containers, lists, RPCs, actions and Notification...
Definition: tree_data.h:824
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:847
LIBYANG_API_DECL LY_ERR lyd_insert_child(struct lyd_node *parent, struct lyd_node *node)
Insert a child into a parent.
dup realtype
Definition: lyds_tree.c:89
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:705
void * prefix_data
Definition: tree_data.h:724
Special lyd_value structure for ietf-yang-types date-and-time values.
Definition: tree_data.h:712
LIBYANG_API_DECL LY_ERR lyd_new_ext_term(const struct lysc_ext_instance *ext, const char *name, const void *value, size_t value_len, uint32_t options, struct lyd_node **node)
Create a new top-level term node defined in the given extension instance.
uint16_t nodetype
Definition: tree_schema.h:1440
struct lyd_meta * meta
Definition: tree_data.h:817
Data node structure for the terminal data tree nodes - leaves and leaf-lists.
Definition: tree_data.h:856
struct lyd_node_inner * parent
Definition: tree_data.h:811
LIBYANG_API_DECL LY_ERR lyd_find_sibling_val(const struct lyd_node *siblings, const struct lysc_node *schema, const char *key_or_value, size_t val_len, struct lyd_node **match)
Search in the given siblings for the first schema instance. Uses hashes - should be used whenever pos...
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.
LIBYANG_API_DECL LY_ERR lyd_dup_siblings_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx, struct lyd_node_inner *parent, uint32_t options, struct lyd_node **dup)
Create a copy of the specified data tree node with any following siblings. Schema references are assi...
struct lysc_node * schema
Definition: tree_data.h:810
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:641
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:758
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:760
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_list3(struct lyd_node *parent, const struct lys_module *module, const char *name, const char **key_values, uint32_t *value_lengths, uint32_t options, struct lyd_node **node)
Create a new list node in the data 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.
struct lysc_type_bitenum_item ** items
Definition: tree_data.h:651
libyang hash table.
Special lyd_value structure for ietf-inet-types ipv6-address values.
Definition: tree_data.h:696
LYD_FORMAT
Data input/output formats supported by libyang parser and printer functions.
Definition: tree_data.h:548
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:576
const char * _canonical
Definition: tree_data.h:577
LY_XPATH_TYPE
XPath result type.
Definition: tree_data.h:2606
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, pcre2_code **pcode)
Check a string matches an XML Schema regex used in YANG.
Metadata structure.
Definition: metadata.h:36
LIBYANG_API_DECL LY_ERR lyd_new_ext_any(const struct lysc_ext_instance *ext, const char *name, const void *value, LYD_ANYDATA_VALUETYPE value_type, uint32_t options, struct lyd_node **node)
Create a new top-level any node defined in the given extension instance.
struct ly_ctx * ctx
Definition: tree_data.h:723
LIBYANG_API_DECL LY_ERR lyd_new_ext_inner(const struct lysc_ext_instance *ext, const char *name, struct lyd_node **node)
Create a new top-level inner node defined in the given extension instance.
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_single_to_ctx(const struct lyd_node *node, const struct ly_ctx *trg_ctx, struct lyd_node_inner *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_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:743
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:636
#define LYS_ACTION
Definition: tree_schema.h:250
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_value_validate(const struct ly_ctx *ctx, const struct lysc_node *schema, const char *value, size_t value_len, const struct lyd_node *ctx_node, const struct lysc_type **realtype, const char **canonical)
Check type restrictions applicable to the particular leaf/leaf-list with the given string value...
LIBYANG_API_DECL LY_ERR lyd_new_term_bin(struct lyd_node *parent, const struct lys_module *module, const char *name, const void *value, size_t value_len, uint32_t options, struct lyd_node **node)
Create a new term node in the data tree based on binary value.
Special lyd_value structure for ietf-inet-types ipv4-prefix values.
Definition: tree_data.h:681
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 int lyd_lyb_data_length(const char *data)
Learn the length of LYB data.
void * val_prefix_data
Definition: tree_data.h:762
struct lyd_node_term ** target_nodes
Definition: tree_data.h:1042
uint32_t flags
Definition: tree_data.h:809
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:640
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:2157
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:697
char * mem
Definition: tree_data.h:890
Special lyd_value structure for lyds tree value.
Definition: tree_data.h:731
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:2258
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 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.
const char * json
Definition: tree_data.h:889
LIBYANG_API_DECL LY_ERR lyd_unlink_siblings(struct lyd_node *node)
Unlink the specified node with all the following siblings.
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:759
Special lyd_value structure for ietf-inet-types ipv6-prefix values.
Definition: tree_data.h:704
Generic attribute structure.
Definition: tree_data.h:755
struct lys_module * module
Definition: tree_schema.h:1443
Special lyd_value structure for ietf-yang-types xpath1.0 values.
Definition: tree_data.h:721
#define LYD_CTX(node)
Macro to get context from a data tree node.
Definition: tree_data.h:531
struct lyd_attr * next
Definition: tree_data.h:757
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:725
LY_VALUE_FORMAT format
Definition: tree_data.h:761
LIBYANG_API_DECL LY_ERR lyd_any_copy_value(struct lyd_node *trg, const union lyd_any_value *value, LYD_ANYDATA_VALUETYPE value_type)
Copy anydata value from one node to another. Target value is freed first.
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:1035
LY_VALUE_FORMAT
All kinds of supported value formats and prefix mappings to modules.
Definition: tree.h:234
#define LYS_NOTIF
Definition: tree_schema.h:251
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.
LIBYANG_API_DECL LY_ERR lyd_value_compare(const struct lyd_node_term *node, const char *value, size_t value_len)
Compare the node&#39;s value with the given string value. The string value is first validated according t...
#define LYD_NODE_TERM
Definition: tree_data.h:766
#define LYS_RPC
Definition: tree_schema.h:249
char * bitmap
Definition: tree_data.h:648
struct lyd_value value
Definition: tree_data.h:879
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_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.
LYD_ANYDATA_VALUETYPE value_type
Definition: tree_data.h:921
LYD_ANYDATA_VALUETYPE
List of possible value types stored in lyd_node_any.
Definition: tree_data.h:558
LIBYANG_API_DECL LY_ERR lyd_any_value_str(const struct lyd_node *any, char **value_str)
Get anydata string value.
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 ly_pattern_compile(const struct ly_ctx *ctx, const char *pattern, pcre2_code **pcode)
Compile an XML Schema regex pattern prior to matching.
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 lyd_new_any(struct lyd_node *parent, const struct lys_module *module, const char *name, const void *value, LYD_ANYDATA_VALUETYPE value_type, uint32_t options, struct lyd_node **node)
Create a new any node in the data tree.
Data node structure for unparsed (opaque) nodes.
Definition: tree_data.h:1000
struct lyxp_expr * exp
Definition: tree_data.h:722
LIBYANG_API_DECL LY_ERR lyd_new_ext_list(const struct lysc_ext_instance *ext, const char *name, uint32_t options, struct lyd_node **node,...)
Create a new top-level list node defined in the given extension instance.
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:897
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:1036
Special lyd_value structure for built-in bits values.
Definition: tree_data.h:647
Special lyd_value structure for built-in union values.
Definition: tree_data.h:631
struct lyd_node * prev
Definition: tree_data.h:813
LY_VALUE_FORMAT format
Definition: tree_data.h:637
LIBYANG_API_DECL LY_ERR lyd_unlink_tree(struct lyd_node *node)
Unlink the specified data subtree.
LIBYANG_API_DECL LY_ERR lyd_new_path2(struct lyd_node *parent, const struct ly_ctx *ctx, const char *path, const void *value, size_t value_len, LYD_ANYDATA_VALUETYPE value_type, uint32_t options, struct lyd_node **new_parent, struct lyd_node **new_node)
Create a new node in the data tree based on a path. All node types can be created.
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.
#define LYS_LIST
Definition: tree_schema.h:244
LY_ERR
libyang&#39;s error codes returned by the libyang functions.
Definition: log.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:848
struct lyd_node * tree
Definition: tree_data.h:886
Special lyd_value structure for built-in binary values.
Definition: tree_data.h:658
LIBYANG_API_DECL LY_ERR lyd_dup_siblings(const struct lyd_node *node, struct lyd_node_inner *parent, uint32_t options, struct lyd_node **dup)
Create a copy of the specified data tree node with any following siblings. Schema references are kept...
struct lyd_value value
Definition: tree_data.h:632
LIBYANG_API_DECL LY_ERR lyd_change_term_bin(struct lyd_node *term, const void *value, size_t value_len)
Change the value of a term (leaf or leaf-list) node to a binary value.
LIBYANG_API_DECL LY_ERR lyd_new_ext_path(struct lyd_node *parent, const struct lysc_ext_instance *ext, const char *path, const void *value, uint32_t options, struct lyd_node **node)
Create a new node defined in the given extension instance. In case of anyxml/anydata nodes...
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:812
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.