libyang  0.16.105
YANG data modeling language library
tree_data.h
Go to the documentation of this file.
1 
15 #ifndef LY_TREE_DATA_H_
16 #define LY_TREE_DATA_H_
17 
18 #include <stddef.h>
19 #include <stdint.h>
20 
21 #include "libyang.h"
22 #include "tree_schema.h"
23 #include "xml.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
40 typedef enum {
45 } LYD_FORMAT;
46 
50 typedef enum {
74  LYD_ANYDATA_XML = 0x08,
82  LYD_ANYDATA_LYB = 0x20,
90 
94 typedef union lyd_value_u {
95  const char *binary;
96  struct lys_type_bit **bit;
98  int8_t bln;
99  int64_t dec64;
100  struct lys_type_enum *enm;
101  struct lys_ident *ident;
102  struct lyd_node *instance;
105  int8_t int8;
106  int16_t int16;
107  int32_t int32;
108  int64_t int64;
109  struct lyd_node *leafref;
110  const char *string;
111  uint8_t uint8;
112  uint16_t uint16;
113  uint32_t uint32;
114  uint64_t uint64;
115  void *ptr;
116 } lyd_val;
117 
128 struct lyd_attr {
129  struct lyd_node *parent;
130  struct lyd_attr *next;
132  const char *name;
133  const char *value_str;
136  uint8_t value_flags;
137 };
138 
147 #define LYD_VAL_OK 0x00
148 #define LYD_VAL_DUP 0x01
150 #define LYD_VAL_UNIQUE 0x02
151 #define LYD_VAL_MAND 0x04
157 #define LYD_VAL_LEAFREF 0x08
159 #define LYD_VAL_INUSE 0x80
178 struct lyd_node {
179  struct lys_node *schema;
180  uint8_t validity;
181  uint8_t dflt:1;
182  uint8_t when_status:3;
185  struct lyd_attr *attr;
186  struct lyd_node *next;
187  struct lyd_node *prev;
191  struct lyd_node *parent;
193 #ifdef LY_ENABLED_LYD_PRIV
194  void *priv;
195 #endif
196 
197 #ifdef LY_ENABLED_CACHE
198  uint32_t hash;
199  struct hash_table *ht;
200 #endif
201 
202  struct lyd_node *child;
207 };
208 
219 struct lyd_node_leaf_list {
220  struct lys_node *schema;
222  uint8_t validity;
223  uint8_t dflt:1;
224  uint8_t when_status:3;
227  struct lyd_attr *attr;
228  struct lyd_node *next;
229  struct lyd_node *prev;
233  struct lyd_node *parent;
235 #ifdef LY_ENABLED_LYD_PRIV
236  void *priv;
237 #endif
238 
239 #ifdef LY_ENABLED_CACHE
240  uint32_t hash;
241 #endif
242 
243  /* struct lyd_node *child; should be here, but is not */
244 
245  /* leaflist's specific members */
246  const char *value_str;
247  lyd_val value;
249  uint8_t value_flags;
250 };
251 
255 #define LY_VALUE_UNRES 0x01
258 #define LY_VALUE_USER 0x02
259 /* 0x80 is reserved for internal use */
260 
269 struct lyd_node_anydata {
270  struct lys_node *schema;
272  uint8_t validity;
273  uint8_t dflt:1;
274  uint8_t when_status:3;
277  struct lyd_attr *attr;
278  struct lyd_node *next;
279  struct lyd_node *prev;
283  struct lyd_node *parent;
285 #ifdef LY_ENABLED_LYD_PRIV
286  void *priv;
287 #endif
289 #ifdef LY_ENABLED_CACHE
290  uint32_t hash;
291 #endif
292 
293  /* struct lyd_node *child; should be here, but is not */
294 
295  /* anyxml's specific members */
297  union {
298  const char *str;
299  char *mem;
300  struct lyxml_elem *xml;
301  struct lyd_node *tree;
303  } value;
304 };
305 
309 typedef enum {
310  LYD_DIFF_END = 0,
345 } LYD_DIFFTYPE;
346 
350 struct lyd_difflist {
351  LYD_DIFFTYPE *type;
352  struct lyd_node **first;
354  struct lyd_node **second;
356 };
357 
363 void lyd_free_diff(struct lyd_difflist *diff);
410 struct lyd_difflist *lyd_diff(struct lyd_node *first, struct lyd_node *second, int options);
411 
418 /* LYD_DIFFOPT_NOSIBLINGS value is the same as LYD_OPT_NOSIBLINGS due to backward compatibility. The LYD_OPT_NOSIBLINGS
419  * was used previously as an option for lyd_diff(). */
420 #define LYD_DIFFOPT_NOSIBLINGS 0x0800
422 #define LYD_DIFFOPT_WITHDEFAULTS 0x0001
440 char *lyd_path(const struct lyd_node *node);
441 
473 #define LYD_OPT_DATA 0x00
476 #define LYD_OPT_CONFIG 0x01
479 #define LYD_OPT_GET 0x02
485 #define LYD_OPT_GETCONFIG 0x04
492 #define LYD_OPT_EDIT 0x08
498 #define LYD_OPT_RPC 0x10
499 #define LYD_OPT_RPCREPLY 0x20
500 #define LYD_OPT_NOTIF 0x40
501 #define LYD_OPT_NOTIF_FILTER 0x80
504 #define LYD_OPT_TYPEMASK 0x10000ff
507 /* 0x100 reserved, used internally */
508 #define LYD_OPT_STRICT 0x0200
509 #define LYD_OPT_DESTRUCT 0x0400
512 #define LYD_OPT_OBSOLETE 0x0800
513 #define LYD_OPT_NOSIBLINGS 0x1000
515 #define LYD_OPT_TRUSTED 0x2000
519 #define LYD_OPT_WHENAUTODEL 0x4000
522 #define LYD_OPT_NOEXTDEPS 0x8000
524 #define LYD_OPT_DATA_NO_YANGLIB 0x10000
525 #define LYD_OPT_DATA_ADD_YANGLIB 0x20000
528 #define LYD_OPT_VAL_DIFF 0x40000
530 #define LYD_OPT_DATA_TEMPLATE 0x1000000
568 struct lyd_node *lyd_parse_mem(struct ly_ctx *ctx, const char *data, LYD_FORMAT format, int options, ...);
569 
606 struct lyd_node *lyd_parse_fd(struct ly_ctx *ctx, int fd, LYD_FORMAT format, int options, ...);
607 
642 struct lyd_node *lyd_parse_path(struct ly_ctx *ctx, const char *path, LYD_FORMAT format, int options, ...);
643 
688 struct lyd_node *lyd_parse_xml(struct ly_ctx *ctx, struct lyxml_elem **root, int options,...);
689 
701 struct lyd_node *lyd_new(struct lyd_node *parent, const struct lys_module *module, const char *name);
702 
716 struct lyd_node *lyd_new_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name,
717  const char *val_str);
718 
734 int lyd_change_leaf(struct lyd_node_leaf_list *leaf, const char *val_str);
735 
752 struct lyd_node *lyd_new_anydata(struct lyd_node *parent, const struct lys_module *module, const char *name,
753  void *value, LYD_ANYDATA_VALUETYPE value_type);
754 
766 struct lyd_node *lyd_new_output(struct lyd_node *parent, const struct lys_module *module, const char *name);
767 
781 struct lyd_node *lyd_new_output_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name,
782  const char *val_str);
783 
801 struct lyd_node *lyd_new_output_anydata(struct lyd_node *parent, const struct lys_module *module, const char *name,
802  void *value, LYD_ANYDATA_VALUETYPE value_type);
803 
814 struct lyd_node *lyd_new_yangdata(const struct lys_module *module, const char *name_template, const char *name);
815 
829 #define LYD_PATH_OPT_UPDATE 0x01
832 #define LYD_PATH_OPT_NOPARENT 0x02
834 #define LYD_PATH_OPT_OUTPUT 0x04
835 #define LYD_PATH_OPT_DFLT 0x08
840 #define LYD_PATH_OPT_NOPARENTRET 0x10
842 #define LYD_PATH_OPT_EDIT 0x20
875 struct lyd_node *lyd_new_path(struct lyd_node *data_tree, struct ly_ctx *ctx, const char *path, void *value,
876  LYD_ANYDATA_VALUETYPE value_type, int options);
877 
885 unsigned int lyd_list_pos(const struct lyd_node *node);
886 
899 #define LYD_DUP_OPT_RECURSIVE 0x01
900 #define LYD_DUP_OPT_NO_ATTR 0x02
901 #define LYD_DUP_OPT_WITH_PARENTS 0x04
917 struct lyd_node *lyd_dup(const struct lyd_node *node, int options);
918 
929 struct lyd_node *lyd_dup_withsiblings(const struct lyd_node *node, int options);
930 
943 struct lyd_node *lyd_dup_to_ctx(const struct lyd_node *node, int options, struct ly_ctx *ctx);
944 
970 int lyd_merge(struct lyd_node *target, const struct lyd_node *source, int options);
971 
992 int lyd_merge_to_ctx(struct lyd_node **trg, const struct lyd_node *src, int options, struct ly_ctx *ctx);
993 
994 #define LYD_OPT_EXPLICIT 0x0100
995 
1024 int lyd_insert(struct lyd_node *parent, struct lyd_node *node);
1025 
1055 int lyd_insert_sibling(struct lyd_node **sibling, struct lyd_node *node);
1056 
1074 int lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node);
1075 
1094 int lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node);
1095 
1108 int lyd_schema_sort(struct lyd_node *sibling, int recursive);
1109 
1120 struct ly_set *lyd_find_path(const struct lyd_node *ctx_node, const char *path);
1121 
1132 struct ly_set *lyd_find_instance(const struct lyd_node *data, const struct lys_node *schema);
1133 
1140 struct lyd_node *lyd_first_sibling(struct lyd_node *node);
1141 
1174 int lyd_validate(struct lyd_node **node, int options, void *var_arg, ...);
1175 
1198 int lyd_validate_modules(struct lyd_node **node, const struct lys_module **modules, int mod_count, int options, ...);
1199 
1205 void lyd_free_val_diff(struct lyd_difflist *diff);
1206 
1221 int lyd_validate_value(struct lys_node *node, const char *value);
1222 
1230 int lyd_wd_default(struct lyd_node_leaf_list *node);
1231 
1244 int lyd_unlink(struct lyd_node *node);
1245 
1254 void lyd_free(struct lyd_node *node);
1255 
1266 void lyd_free_withsiblings(struct lyd_node *node);
1267 
1284 struct lyd_attr *lyd_insert_attr(struct lyd_node *parent, const struct lys_module *mod, const char *name,
1285  const char *value);
1286 
1299 void lyd_free_attr(struct ly_ctx *ctx, struct lyd_node *parent, struct lyd_attr *attr, int recursive);
1300 
1310 struct lys_module *lyd_node_module(const struct lyd_node *node);
1311 
1321 const struct lys_type *lyd_leaf_type(const struct lyd_node_leaf_list *leaf);
1322 
1333 int lyd_print_mem(char **strp, const struct lyd_node *root, LYD_FORMAT format, int options);
1334 
1345 int lyd_print_fd(int fd, const struct lyd_node *root, LYD_FORMAT format, int options);
1346 
1357 int lyd_print_file(FILE *f, const struct lyd_node *root, LYD_FORMAT format, int options);
1358 
1369 int lyd_print_path(const char *path, const struct lyd_node *root, LYD_FORMAT format, int options);
1370 
1382 int lyd_print_clb(ssize_t (*writeclb)(void *arg, const void *buf, size_t count), void *arg,
1383  const struct lyd_node *root, LYD_FORMAT format, int options);
1384 
1394 double lyd_dec64_to_double(const struct lyd_node *node);
1395 
1402 int lyd_lyb_data_length(const char *data);
1403 
1404 #ifdef LY_ENABLED_LYD_PRIV
1405 
1415 void *lyd_set_private(const struct lyd_node *node, void *priv);
1416 
1417 #endif
1418 
1421 #ifdef __cplusplus
1422 }
1423 #endif
1424 
1425 #endif /* LY_TREE_DATA_H_ */
struct lyd_node * lyd_parse_fd(struct ly_ctx *ctx, int fd, LYD_FORMAT format, int options,...)
Read (and validate) data from the given file descriptor.
uint32_t uint32
Definition: tree_data.h:113
const char * name
Definition: tree_data.h:132
void * ptr
Definition: tree_data.h:115
Common structure representing single YANG data statement describing.
Definition: tree_schema.h:1229
int lyd_print_clb(ssize_t(*writeclb)(void *arg, const void *buf, size_t count), void *arg, const struct lyd_node *root, LYD_FORMAT format, int options)
Print data tree in the specified format.
union lyd_node_anydata::@0 value
struct lyd_node * lyd_new_anydata(struct lyd_node *parent, const struct lys_module *module, const char *name, void *value, LYD_ANYDATA_VALUETYPE value_type)
Create a new anydata or anyxml node in a data tree.
struct lyd_node * next
Definition: tree_data.h:194
int lyd_validate_modules(struct lyd_node **node, const struct lys_module **modules, int mod_count, int options,...)
Validate node data tree but only subtrees that belong to the schema found in modules. All other schemas are effectively disabled for the validation.
struct lyd_node * lyd_dup_to_ctx(const struct lyd_node *node, int options, struct ly_ctx *ctx)
Create a copy of the specified data tree node in the different context. All the schema references and...
const char * value_str
Definition: tree_data.h:133
int8_t bln
Definition: tree_data.h:98
struct lys_node * schema
Definition: tree_data.h:228
int lyd_validate(struct lyd_node **node, int options, void *var_arg,...)
Validate node data subtree.
uint8_t when_status
Definition: tree_data.h:232
struct lyd_attr * lyd_insert_attr(struct lyd_node *parent, const struct lys_module *mod, const char *name, const char *value)
Insert attribute into the data node.
void lyd_free_attr(struct ly_ctx *ctx, struct lyd_node *parent, struct lyd_attr *attr, int recursive)
Destroy data attribute.
int64_t dec64
Definition: tree_data.h:99
struct lyd_attr * attr
Definition: tree_data.h:235
struct lys_ext_instance_complex * annotation
Definition: tree_data.h:131
struct lys_module * lyd_node_module(const struct lyd_node *node)
Return main module of the data tree node.
uint16_t uint16
Definition: tree_data.h:112
struct lyd_node * lyd_dup_withsiblings(const struct lyd_node *node, int options)
Create a copy of the specified data tree and all its siblings (preceding as well as following)...
node&#39;s value representation
Definition: tree_data.h:94
int lyd_print_fd(int fd, const struct lyd_node *root, LYD_FORMAT format, int options)
Print data tree in the specified format.
struct lyd_node * parent
Definition: tree_data.h:129
libyang representation of data model trees.
int lyd_wd_default(struct lyd_node_leaf_list *node)
Get know if the node contain (despite implicit or explicit) default value.
uint64_t uint64
Definition: tree_data.h:114
int lyd_insert(struct lyd_node *parent, struct lyd_node *node)
Insert the node element as child to the parent element. The node is inserted as a last child of the p...
void lyd_free(struct lyd_node *node)
Free (and unlink) the specified data subtree. Use carefully, since libyang silently creates default n...
LY_DATA_TYPE _PACKED value_type
Definition: tree_data.h:135
struct lyd_node * lyd_parse_xml(struct ly_ctx *ctx, struct lyxml_elem **root, int options,...)
Parse (and validate) XML tree.
Single enumeration value specification for lys_type_info_enums.
Definition: tree_schema.h:868
int64_t int64
Definition: tree_data.h:108
struct lyd_node * lyd_new_output(struct lyd_node *parent, const struct lys_module *module, const char *name)
Create a new container node in a data tree. Ignore RPC/action input nodes and instead use RPC/action ...
const char * string
Definition: tree_data.h:110
uint8_t uint8
Definition: tree_data.h:111
void lyd_free_diff(struct lyd_difflist *diff)
Free the result of lyd_diff(). It frees the structure of the lyd_diff() result, not the referenced no...
The main libyang public header.
LYD_FORMAT
Data input/output formats supported by libyang parser and printer functions.
Definition: tree_data.h:40
int8_t int8
Definition: tree_data.h:105
struct lys_type_bit ** bit
Definition: tree_data.h:96
Structure to hold a set of (not necessary somehow connected) lyd_node or lys_node objects...
Definition: libyang.h:1716
int16_t int16
Definition: tree_data.h:106
struct lyd_node * lyd_parse_path(struct ly_ctx *ctx, const char *path, LYD_FORMAT format, int options,...)
Read (and validate) data from the given file path.
struct lyd_difflist * lyd_diff(struct lyd_node *first, struct lyd_node *second, int options)
Compare two data trees and provide list of differences.
unsigned int lyd_list_pos(const struct lyd_node *node)
Learn the relative instance position of a list or leaf-list within other instances of the same schema...
int lyd_schema_sort(struct lyd_node *sibling, int recursive)
Order siblings according to the schema node ordering.
Public API of libyang XML parser.
int lyd_insert_after(struct lyd_node *sibling, struct lyd_node *node)
Insert the node element after the sibling element. If node and siblings are already siblings (just mo...
struct lyd_node * lyd_new_output_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name, const char *val_str)
Create a new leaf or leaflist node in a data tree with a string value that is converted to the actual...
Structure describing an element in an XML tree.
Definition: xml.h:91
Structure for data nodes defined as LYS_LEAF or LYS_LEAFLIST.
Definition: tree_data.h:227
struct lyd_node * leafref
Definition: tree_data.h:109
Attribute structure.
Definition: tree_data.h:128
int lyd_insert_sibling(struct lyd_node **sibling, struct lyd_node *node)
Insert the node element as a last sibling of the specified sibling element.
struct lyd_node * lyd_new_leaf(struct lyd_node *parent, const struct lys_module *module, const char *name, const char *val_str)
Create a new leaf or leaflist node in a data tree with a string value that is converted to the actual...
double lyd_dec64_to_double(const struct lyd_node *node)
Get the double value of a decimal64 leaf/leaf-list.
struct lyd_node * child
Definition: tree_data.h:210
struct lyd_node ** second
Definition: tree_data.h:364
struct lys_ident * ident
Definition: tree_data.h:101
int lyd_insert_before(struct lyd_node *sibling, struct lyd_node *node)
Insert the node element after the sibling element. If node and siblings are already siblings (just mo...
Structure for the result of lyd_diff(), describing differences between two data trees.
Definition: tree_data.h:360
Main schema node structure representing YANG module.
Definition: tree_schema.h:674
int lyd_print_mem(char **strp, const struct lyd_node *root, LYD_FORMAT format, int options)
Print data tree in the specified format.
lyd_val value
Definition: tree_data.h:134
Complex extension instance structure.
Definition: tree_schema.h:506
struct ly_set * lyd_find_instance(const struct lyd_node *data, const struct lys_node *schema)
Search in the given data for instances of the provided schema node.
struct lyd_node * lyd_first_sibling(struct lyd_node *node)
Get the first sibling of the given node.
LYD_DIFFTYPE
list of possible types of differences in lyd_difflist
Definition: tree_data.h:319
struct lyd_node * lyd_new_yangdata(const struct lys_module *module, const char *name_template, const char *name)
Create a new yang-data template in a data tree. It creates container, which name is in third paramete...
LY_DATA_TYPE
YANG built-in types.
Definition: tree_schema.h:792
void lyd_free_val_diff(struct lyd_difflist *diff)
Free special diff that was returned by lyd_validate() or lyd_validate_modules().
struct lyd_node * instance
Definition: tree_data.h:102
YANG type structure providing information from the schema.
Definition: tree_schema.h:981
int32_t int32
Definition: tree_data.h:107
struct lyd_node ** first
Definition: tree_data.h:362
struct ly_set * lyd_find_path(const struct lyd_node *ctx_node, const char *path)
Search in the given data for instances of nodes matching the provided path.
Structure to hold information about identity, see RFC 6020 sec. 7.16
Definition: tree_schema.h:2102
const struct lys_type * lyd_leaf_type(const struct lyd_node_leaf_list *leaf)
Get the type structure of a leaf.
struct lyd_node * lyd_new_output_anydata(struct lyd_node *parent, const struct lys_module *module, const char *name, void *value, LYD_ANYDATA_VALUETYPE value_type)
Create a new anydata or anyxml node in a data tree. Ignore RPC/action input nodes and instead use RPC...
struct lyd_node * lyd_new(struct lyd_node *parent, const struct lys_module *module, const char *name)
Create a new container node in a data tree.
int lyd_validate_value(struct lys_node *node, const char *value)
Check restrictions applicable to the particular leaf/leaf-list on the given string value...
union lyd_value_u lyd_val
node&#39;s value representation
Generic structure for a data node, directly applicable to the data nodes defined as LYS_CONTAINER...
Definition: tree_data.h:186
struct lyd_attr * next
Definition: tree_data.h:130
int lyd_print_path(const char *path, const struct lyd_node *root, LYD_FORMAT format, int options)
Print data tree in the specified format.
const char * binary
Definition: tree_data.h:95
LYD_ANYDATA_VALUETYPE
List of possible value types stored in lyd_node_anydata.
Definition: tree_data.h:50
LYD_ANYDATA_VALUETYPE value_type
Definition: tree_data.h:306
int lyd_unlink(struct lyd_node *node)
Unlink the specified data subtree. All referenced namespaces are copied.
#define _PACKED
Compiler flag for packed data types.
Definition: libyang.h:38
int lyd_change_leaf(struct lyd_node_leaf_list *leaf, const char *val_str)
Change value of a leaf node.
void lyd_free_withsiblings(struct lyd_node *node)
Free (and unlink) the specified data tree and all its siblings (preceding as well as following)...
int lyd_print_file(FILE *f, const struct lyd_node *root, LYD_FORMAT format, int options)
Print data tree in the specified format.
int lyd_merge(struct lyd_node *target, const struct lyd_node *source, int options)
Merge a (sub)tree into a data tree.
struct lyd_node * prev
Definition: tree_data.h:195
uint8_t value_flags
Definition: tree_data.h:136
Structure for data nodes defined as LYS_ANYDATA or LYS_ANYXML.
Definition: tree_data.h:279
Single bit value specification for lys_type_info_bits.
Definition: tree_schema.h:828
int lyd_merge_to_ctx(struct lyd_node **trg, const struct lyd_node *src, int options, struct ly_ctx *ctx)
Same as lyd_merge(), but moves the resulting data into the specified context.
LYD_DIFFTYPE * type
Definition: tree_data.h:361
libyang context handler.
int lyd_lyb_data_length(const char *data)
Get the length of a printed LYB data tree.
struct lys_type_enum * enm
Definition: tree_data.h:100