16 #ifndef LY_TREE_SCHEMA_H_
17 #define LY_TREE_SCHEMA_H_
19 #define PCRE2_CODE_UNIT_WIDTH 8
27 #include "ly_config.h"
184 #define LYSC_TREE_DFS_BEGIN(START, ELEM) \
185 { ly_bool LYSC_TREE_DFS_continue = 0; struct lysc_node *LYSC_TREE_DFS_next; \
186 for ((ELEM) = (LYSC_TREE_DFS_next) = (struct lysc_node *)(START); \
188 (ELEM) = (LYSC_TREE_DFS_next), LYSC_TREE_DFS_continue = 0)
203 #define LYSC_TREE_DFS_END(START, ELEM) \
205 if (LYSC_TREE_DFS_continue) { \
206 (LYSC_TREE_DFS_next) = NULL; \
208 (LYSC_TREE_DFS_next) = (struct lysc_node *)lysc_node_child(ELEM); \
210 if (!(LYSC_TREE_DFS_next)) { \
212 _LYSC_TREE_DFS_NEXT(START, ELEM, LYSC_TREE_DFS_next); \
214 while (!(LYSC_TREE_DFS_next)) { \
216 (ELEM) = (ELEM)->parent; \
217 _LYSC_TREE_DFS_NEXT(START, ELEM, LYSC_TREE_DFS_next); \
223 #define _LYSC_TREE_DFS_NEXT(START, ELEM, NEXT) \
224 if ((ELEM) == (struct lysc_node *)(START)) { \
228 (NEXT) = (ELEM)->next;
232 #define LY_REV_SIZE 11
239 #define LYS_UNKNOWN 0x0000
240 #define LYS_CONTAINER 0x0001
241 #define LYS_CHOICE 0x0002
242 #define LYS_LEAF 0x0004
243 #define LYS_LEAFLIST 0x0008
244 #define LYS_LIST 0x0010
245 #define LYS_ANYXML 0x0020
246 #define LYS_ANYDATA 0x0060
247 #define LYS_CASE 0x0080
249 #define LYS_RPC 0x0100
250 #define LYS_ACTION 0x0200
251 #define LYS_NOTIF 0x0400
253 #define LYS_USES 0x0800
254 #define LYS_INPUT 0x1000
255 #define LYS_OUTPUT 0x2000
256 #define LYS_GROUPING 0x4000
257 #define LYS_AUGMENT 0x8000
259 #define LYS_NODETYPE_MASK 0xffff
362 #define LYSP_RESTR_PATTERN_ACK 0x06
363 #define LYSP_RESTR_PATTERN_NACK 0x15
472 #define LYS_DEV_NOT_SUPPORTED 1
473 #define LYS_DEV_ADD 2
474 #define LYS_DEV_DELETE 3
475 #define LYS_DEV_REPLACE 4
481 struct lysp_deviate {
653 #define LYS_CONFIG_W 0x01
654 #define LYS_CONFIG_R 0x02
655 #define LYS_CONFIG_MASK 0x03
656 #define LYS_STATUS_CURR 0x04
657 #define LYS_STATUS_DEPRC 0x08
658 #define LYS_STATUS_OBSLT 0x10
659 #define LYS_STATUS_MASK 0x1C
660 #define LYS_MAND_TRUE 0x20
665 #define LYS_MAND_FALSE 0x40
668 #define LYS_MAND_MASK 0x60
669 #define LYS_PRESENCE 0x80
672 #define LYS_UNIQUE 0x80
673 #define LYS_KEY 0x0100
674 #define LYS_KEYLESS 0x0200
675 #define LYS_DISABLED 0x0100
676 #define LYS_FENABLED 0x20
677 #define LYS_ORDBY_SYSTEM 0x80
679 #define LYS_ORDBY_USER 0x40
682 #define LYS_ORDBY_MASK 0xC0
683 #define LYS_YINELEM_TRUE 0x80
684 #define LYS_YINELEM_FALSE 0x0100
685 #define LYS_YINELEM_MASK 0x0180
686 #define LYS_USED_GRP 0x0400
688 #define LYS_SET_VALUE 0x0200
689 #define LYS_SET_MIN 0x0200
690 #define LYS_SET_MAX 0x0400
692 #define LYS_SET_BASE 0x0001
693 #define LYS_SET_BIT 0x0002
694 #define LYS_SET_ENUM 0x0004
695 #define LYS_SET_FRDIGITS 0x0008
696 #define LYS_SET_LENGTH 0x0010
697 #define LYS_SET_PATH 0x0020
698 #define LYS_SET_PATTERN 0x0040
699 #define LYS_SET_RANGE 0x0080
700 #define LYS_SET_TYPE 0x0100
701 #define LYS_SET_REQINST 0x0200
702 #define LYS_SET_DFLT 0x0200
707 #define LYS_SET_UNITS 0x0400
708 #define LYS_SET_CONFIG 0x0800
710 #define LYS_SINGLEQUOTED 0x0100
712 #define LYS_DOUBLEQUOTED 0x0200
715 #define LYS_YIN_ATTR 0x0400
716 #define LYS_YIN_ARGUMENT 0x0800
718 #define LYS_INTERNAL 0x1000
720 #define LYS_IS_ENUM 0x0200
722 #define LYS_IS_INPUT 0x1000
724 #define LYS_IS_OUTPUT 0x2000
726 #define LYS_IS_NOTIF 0x4000
728 #define LYS_FLAGS_COMPILED_MASK 0xff
1168 #define LYSP_MODULE_NAME(PMOD) (PMOD->is_submod ? ((struct lysp_submodule *)PMOD)->name : ((struct lysp_module *)PMOD)->mod->name)
1199 struct lyxp_expr *
cond;
1229 #define LYS_IFF_NOT 0x00
1230 #define LYS_IFF_AND 0x01
1231 #define LYS_IFF_OR 0x02
1232 #define LYS_IFF_F 0x03
1238 struct lysc_revision {
1244 struct lysc_range_part {
1416 #define LYS_NODE_HASH_COUNT 4
1759 #define lysc_is_userordered(lysc_node) \
1760 ((!lysc_node || !(lysc_node->nodetype & (LYS_LEAFLIST | LYS_LIST)) || !(lysc_node->flags & LYS_ORDBY_USER)) ? 0 : 1)
1768 #define lysc_is_key(lysc_node) \
1769 ((!lysc_node || (lysc_node->nodetype != LYS_LEAF) || !(lysc_node->flags & LYS_KEY)) ? 0 : 1)
1777 #define lysc_is_np_cont(lysc_node) \
1778 ((!lysc_node || (lysc_node->nodetype != LYS_CONTAINER) || (lysc_node->flags & LYS_PRESENCE)) ? 0 : 1)
1786 #define lysc_is_dup_inst_list(lysc_node) \
1787 ((lysc_node && (((lysc_node->nodetype == LYS_LIST) && (lysc_node->flags & LYS_KEYLESS)) || \
1788 ((lysc_node->nodetype == LYS_LEAFLIST) && !(lysc_node->flags & LYS_CONFIG_W)))) ? 1 : 0)
1801 #define lysc_data_parent(SCHEMA) lysc_data_node((SCHEMA) ? (SCHEMA)->parent : NULL)
1999 #define LYS_FIND_XP_SCHEMA 0x08
2000 #define LYS_FIND_XP_OUTPUT 0x10
2001 #define LYS_FIND_NO_MATCH_ERROR 0x40
2003 #define LYS_FIND_SCHEMAMOUNT 0x0200
2018 LIBYANG_API_DECL LY_ERR lys_find_xpath_atoms(const struct ly_ctx *ctx, const struct lysc_node *ctx_node, const char *xpath,
2034 const struct lyxp_expr *expr,
const struct lysc_prefix *prefixes, uint32_t options,
struct ly_set **set);
2048 uint32_t options,
struct ly_set **set);
2083 const char *path,
ly_bool output);
2151 #define LYS_MOD_LATEST_REV 0x01
2152 #define LYS_MOD_LATEST_SEARCHDIRS 0x02
2153 #define LYS_MOD_IMPORTED_REV 0x04
2156 #define LYS_MOD_LATEST_IMPCLB 0x08
2171 LIBYANG_API_DECL LY_ERR lys_feature_value(const struct lys_module *module, const char *feature);
2217 #define LYS_GETNEXT_WITHCHOICE 0x01
2218 #define LYS_GETNEXT_NOCHOICE 0x02
2219 #define LYS_GETNEXT_WITHCASE 0x04
2220 #define LYS_GETNEXT_INTONPCONT 0x08
2221 #define LYS_GETNEXT_OUTPUT 0x10
2223 #define LYS_GETNEXT_WITHSCHEMAMOUNT 0x20
2240 LIBYANG_API_DECL const struct lysc_node *lys_find_child(const struct lysc_node *parent, const struct lys_module *module,
2274 LIBYANG_API_DECL
const char *
lyxp_get_expr(
const struct lyxp_expr *path);
struct lyplg_type * plugin
struct lysp_node_action * actions
Compiled prefix data pair mapping of prefixes to modules. In case the format is LY_VALUE_SCHEMA_RESOL...
struct lysp_node_grp * groupings
struct lyd_value ** dflts
struct lysc_ext_instance * exts
struct lysp_feature ** depfeatures
struct lysp_tpdf * typedefs
struct lysp_qname * dflts
struct lysp_tpdf * typedefs
Qualified name (optional prefix followed by an identifier).
struct lysc_ident ** derived
struct lysc_node_case * dflt
struct lysp_restr * musts
struct lysc_type_bitenum_item * bits
struct lysp_ext_instance * exts
struct lysp_module * parsed
struct lysc_node * context
Compiled YANG if-feature-stmt.
struct lysp_node_action * actions
struct lyplg_type * plugin
struct lysc_ext_instance * exts
struct lysp_tpdf * typedefs
Hold type-specific functions for various operations with the data values.
Extension plugin implementing various aspects of a YANG extension.
Covers restrictions: range, length, pattern, must.
struct lysp_tpdf * typedefs
struct lysp_import * imports
struct lysc_ext_instance * exts
struct lysp_node_augment * augments
struct lysc_prefix * prefixes
YANG extension compiled instance.
struct lysc_range::lysc_range_part * parts
struct lysc_ext_instance * exts
struct lysp_include * includes
uint8_t ly_bool
Type to indicate boolean value.
Compiled YANG extension-stmt.
struct lysp_ext_instance * exts
struct lysc_ext_instance * exts
struct lyplg_type * plugin
struct lysc_ext_instance * exts
struct lysp_restr * musts
struct lys_module * module
struct lyplg_type * plugin
struct lysp_qname * iffeatures
struct lysc_ident * identities
struct lysp_ext * extensions
LY_DATA_TYPE
YANG built-in types.
struct lysp_ext_instance * exts
struct lysc_node * parent
struct lysp_qname * dflts
libyang generic macros and functions to work with YANG schema or data trees.
struct lysp_node_action * rpcs
struct lyplg_type * plugin
struct lysp_ext_instance * exts
struct lysp_qname * dflts
struct lysc_ext_instance * exts
struct lysc_ext_instance * exts
struct lys_module * module
struct lysc_ext_instance * exts
struct lysc_iffeature * iffeatures_c
LIBYANG_API_DECL struct lysp_node_grp * lysp_node_groupings(const struct lysp_node *node)
Get the groupings linked list of the given (parsed) schema node. Decides the node's type and in case ...
struct lysp_node_grp * groupings
struct lysp_tpdf * typedefs
LIBYANG_API_DECL struct lysc_node * lys_getnext_ext(const struct lysc_node *last, const struct lysc_node *parent, const struct lysc_ext_instance *ext, uint32_t options)
Get next schema (sibling) node element in the schema order of an extension that can be instantiated i...
struct lysp_ident * identities
struct lysp_node_action * actions
struct lysc_ext_instance * exts
struct lysc_ext_instance * exts
Extension structure of the lysp_node for YANG container.
struct lys_module * module
LIBYANG_API_DECL LY_ERR lys_find_expr_atoms(const struct lysc_node *ctx_node, const struct lys_module *cur_mod, const struct lyxp_expr *expr, const struct lysc_prefix *prefixes, uint32_t options, struct ly_set **set)
Get all the schema nodes that are required for expr to be evaluated (atoms).
struct lysp_restr * length
struct lysp_ext_instance * exts
struct lysc_node_case * cases
Enumeration/Bit value definition.
struct lysc_type * compiled
LIBYANG_API_DECL struct lysc_node_notif * lysc_node_notifs(const struct lysc_node *node)
Get the Notifications linked list of the given (compiled) schema node. Decides the node's type and in...
Compiled YANG schema tree structure representing YANG module.
struct lysp_restr * musts
struct lysp_ext_instance * exts
struct lysp_ext_instance * exts
struct lysp_qname * iffeatures
struct lysp_deviate * next
struct lysp_ext_instance * exts
struct lysp_deviate * next
struct lysc_range * range
struct lysp_ext_instance * exts
struct lysc_node_action * rpcs
struct lysp_type_enum * enums
struct lysc_node_leaf *** uniques
struct lysc_type ** types
struct lysp_ext_instance * exts
LIBYANG_API_DECL struct lysc_node * lys_getnext(const struct lysc_node *last, const struct lysc_node *parent, const struct lysc_module *module, uint32_t options)
Get next schema (sibling) node element in the schema order that can be instantiated in a data tree...
LY_ERR(* lysc_dfs_clb)(struct lysc_node *node, void *data, ly_bool *dfs_continue)
Callback to be called for every schema node in a DFS traversal.
LIBYANG_API_DECL LY_ERR lys_find_xpath(const struct ly_ctx *ctx, const struct lysc_node *ctx_node, const char *xpath, uint32_t options, struct ly_set **set)
Evaluate an xpath expression on schema nodes.
struct lysc_range * length
struct lysp_submodule * submodule
struct lysc_pattern ** patterns
LIBYANG_API_DECL const char * lys_nodetype2str(uint16_t nodetype)
Stringify schema nodetype.
struct lysp_restr * musts
struct lysc_range * length
YANG data representation.
LIBYANG_API_DECL LY_ERR lys_find_path_atoms(const struct ly_ctx *ctx, const struct lysc_node *ctx_node, const char *path, ly_bool output, struct ly_set **set)
Get all the schema nodes that are required for path to be evaluated (atoms).
struct lysc_node_notif * notifs
struct lyplg_type * plugin
struct lysp_qname * uniques
struct lysc_ext_instance * exts
struct lysp_ext_instance * exts
struct lysp_deviation * deviations
Generic deviate structure to get type and cast to lysp_deviate_* structure.
struct lyplg_type * plugin
struct lysc_node_action_inout input
struct lysp_include * includes
LIBYANG_API_DECL struct lysc_node * lysc_node_child(const struct lysc_node *node)
Get the children linked list of the given (compiled) schema node.
struct lysc_ext_instance * exts
struct lysp_node_grp * groupings
struct lysp_node_notif * notifs
LIBYANG_API_DECL LY_ERR lysc_iffeature_value(const struct lysc_iffeature *iff)
Get how the if-feature statement currently evaluates.
struct lyplg_type * plugin
struct lysp_revision * revs
struct lysp_node_notif * notifs
struct lysp_restr * musts
struct lysp_ext_instance * exts
struct lysp_ext_instance * exts
LIBYANG_API_DECL LY_ERR lys_find_lypath_atoms(const struct ly_path *path, struct ly_set **set)
Get all the schema nodes that are required for path to be evaluated (atoms).
LIBYANG_API_DECL struct lysc_node_action * lysc_node_actions(const struct lysc_node *node)
Get the actions/RPCs linked list of the given (compiled) schema node. Decides the node's type and in ...
struct lysp_tpdf * typedefs
struct lysp_node_grp * groupings
YANG uses-augment-stmt and augment-stmt (compatible with struct lysp_node )
struct lysc_ext_instance * exts
struct lysp_ident * identities
struct lysp_node_notif * notifs
struct lysp_module * pmod
Structure to hold a set of (not necessary somehow connected) objects. Usually used for lyd_node...
LIBYANG_API_DECL struct lysc_node * lys_find_path(const struct ly_ctx *ctx, const struct lysc_node *ctx_node, const char *path, ly_bool output)
Get a schema node based on the given data path (JSON format, see XPath Addressing).
LIBYANG_API_DECL LY_ERR lys_identity_iffeature_value(const struct lysc_ident *ident)
Get how the if-feature statement is evaluated for certain identity.
LIBYANG_API_DECL struct lysc_when ** lysc_node_when(const struct lysc_node *node)
Get the when statements list if present in the node.
struct lysc_node_action_inout output
struct lysp_ext_instance * exts
struct lysp_qname * uniques
struct lysc_node_action * actions
Printable YANG schema tree structure representing YANG module.
struct lysc_prefix * prefixes
YANG rpc-stmt and action-stmt.
Available YANG schema tree structures representing YANG module.
struct lysp_feature * features
LIBYANG_API_DECL LY_ERR lys_set_implemented(struct lys_module *mod, const char **features)
Make the specific module implemented.
struct lyplg_type * plugin
struct lysc_range * range
struct lysc_node_notif * notifs
struct lysc_ext_instance * exts
struct lysp_qname * uniques
struct lysp_ext_instance * exts
LIBYANG_API_DECL struct lysc_node * lysc_data_node(const struct lysc_node *schema)
Get nearest schema parent (including the node itself) that can be instantiated in data...
#define LYS_NODE_HASH_COUNT
Maximum number of hashes stored in a schema node.
struct lys_module ** deviated_by
struct lysp_node_grp * groupings
struct lysp_ext_instance * exts
struct lysc_ext_instance * exts
LIBYANG_API_DECL struct lysp_node_notif * lysp_node_notifs(const struct lysp_node *node)
Get the Notifications linked list of the given (parsed) schema node. Decides the node's type and in c...
struct lysp_restr * range
YANG input-stmt and output-stmt.
LYSC_PATH_TYPE
Types of the different schema paths.
struct lysp_node_grp * groupings
struct lyplg_type * plugin
struct lysp_deviate * next
struct lysp_node_notif * notifs
struct lysp_revision * revs
struct lysp_deviate * next
LYS_VERSION
supported YANG schema version values
struct lysp_tpdf * typedefs
struct lysp_ext_instance * exts
struct lys_module * module
LIBYANG_API_DECL struct lysp_node * lysp_node_child(const struct lysp_node *node)
Get the children linked list of the given (parsed) schema node. Decides the node's type and in case i...
struct lysc_ext_instance * exts
LIBYANG_API_DECL struct lysp_tpdf * lysp_node_typedefs(const struct lysp_node *node)
Get the typedefs sized array of the given (parsed) schema node. Decides the node's type and in case i...
struct lysp_restr * musts
LIBYANG_API_DECL LY_ERR lysc_tree_dfs_full(const struct lysc_node *root, lysc_dfs_clb dfs_clb, void *data)
DFS traversal of all the schema nodes in a (sub)tree including any actions and nested notifications...
struct lysp_qname * iffeatures
struct lysp_deviate * deviates
struct lysp_restr * patterns
struct lysp_restr * musts
LIBYANG_API_DECL struct lys_module * lysc_owner_module(const struct lysc_node *node)
Get the owner module of the schema node. It is the module of the top-level node. Generally, in case of augments it is the target module, recursively, otherwise it is the module where the node is defined.
LIBYANG_API_DECL const char * lyxp_get_expr(const struct lyxp_expr *path)
Getter for original XPath expression from a parsed expression.
struct lysp_ext_instance * exts
struct lysc_type_bitenum_item * enums
struct lysc_ext_instance * exts
struct lysp_ext_instance * exts
struct lysp_node_action_inout input
struct lysp_ext * extensions
struct lysp_qname * iffeatures
struct lysc_ident ** bases
struct lyplg_type * plugin
LIBYANG_API_DECL char * lysc_path(const struct lysc_node *node, LYSC_PATH_TYPE pathtype, char *buffer, size_t buflen)
Generate path of the given node in the requested format.
struct lysc_node_notif * notifs
struct lysp_node_augment * augments
struct lysc_ext_instance * exts
struct lysc_module * compiled
LIBYANG_API_DECL struct lysc_when * lysc_has_when(const struct lysc_node *node)
Check whether the schema node data instance existence depends on any when conditions. This node and any direct parent choice and case schema nodes are also examined for when conditions.
struct lysp_restr * musts
struct lysp_tpdf * typedefs
struct lysp_node_grp * groupings
struct lysp_node * parent
struct lysp_restr * musts
struct lys_module ** augmented_by
struct lysp_node_notif * notifs
LIBYANG_API_DECL struct lysp_node_action * lysp_node_actions(const struct lysp_node *node)
Get the actions/RPCs linked list of the given (parsed) schema node. Decides the node's type and in ca...
struct lysp_refine * refines
LIBYANG_API_DECL struct lysc_node * lysc_node_lref_target(const struct lysc_node *node)
Get the target node of a leafref node.
struct lysp_feature ** features
Logger manipulation routines and error definitions.
struct lysc_ext * compiled
struct lysp_qname * dflts
struct lysp_ext_instance * exts
struct lysp_node_augment * augments
struct lysp_feature * features
LIBYANG_API_DECL LY_ERR lysc_module_dfs_full(const struct lys_module *mod, lysc_dfs_clb dfs_clb, void *data)
DFS traversal of all the schema nodes in a module including RPCs and notifications.
struct lysp_deviation * deviations
struct lysp_type_enum * bits
LY_ERR
libyang's error codes returned by the libyang functions.
struct lysc_type * realtype
struct lysp_node_notif * notifs
struct lysp_node_action * actions
struct lysc_ext_instance * exts
struct lysp_restr * musts
struct lyplg_ext * plugin
LIBYANG_API_DECL struct lysc_must * lysc_node_musts(const struct lysc_node *node)
Get the must statements list if present in the node.
struct lysc_prefix * prefixes
struct lysp_node_action_inout output
LIBYANG_API_DECL struct lysp_feature * lysp_feature_next(const struct lysp_feature *last, const struct lysp_module *pmod, uint32_t *idx)
Get the next feature in the module or submodules.
struct lysc_ext_instance * exts
struct lysp_import * imports
struct lysp_node_grp * groupings
struct lysp_node_action * rpcs
struct lysc_node_action * actions
YANG extension parsed instance.