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
358 #define LYSP_RESTR_PATTERN_ACK 0x06
359 #define LYSP_RESTR_PATTERN_NACK 0x15
468 #define LYS_DEV_NOT_SUPPORTED 1
469 #define LYS_DEV_ADD 2
470 #define LYS_DEV_DELETE 3
471 #define LYS_DEV_REPLACE 4
477 struct lysp_deviate {
649 #define LYS_CONFIG_W 0x01
650 #define LYS_CONFIG_R 0x02
651 #define LYS_CONFIG_MASK 0x03
652 #define LYS_STATUS_CURR 0x04
653 #define LYS_STATUS_DEPRC 0x08
654 #define LYS_STATUS_OBSLT 0x10
655 #define LYS_STATUS_MASK 0x1C
656 #define LYS_MAND_TRUE 0x20
661 #define LYS_MAND_FALSE 0x40
664 #define LYS_MAND_MASK 0x60
665 #define LYS_PRESENCE 0x80
668 #define LYS_UNIQUE 0x80
669 #define LYS_KEY 0x0100
670 #define LYS_KEYLESS 0x0200
671 #define LYS_DISABLED 0x0100
672 #define LYS_FENABLED 0x20
673 #define LYS_ORDBY_SYSTEM 0x80
675 #define LYS_ORDBY_USER 0x40
678 #define LYS_ORDBY_MASK 0xC0
679 #define LYS_YINELEM_TRUE 0x80
680 #define LYS_YINELEM_FALSE 0x0100
681 #define LYS_YINELEM_MASK 0x0180
682 #define LYS_USED_GRP 0x0400
684 #define LYS_SET_VALUE 0x0200
685 #define LYS_SET_MIN 0x0200
686 #define LYS_SET_MAX 0x0400
688 #define LYS_SET_BASE 0x0001
689 #define LYS_SET_BIT 0x0002
690 #define LYS_SET_ENUM 0x0004
691 #define LYS_SET_FRDIGITS 0x0008
692 #define LYS_SET_LENGTH 0x0010
693 #define LYS_SET_PATH 0x0020
694 #define LYS_SET_PATTERN 0x0040
695 #define LYS_SET_RANGE 0x0080
696 #define LYS_SET_TYPE 0x0100
697 #define LYS_SET_REQINST 0x0200
698 #define LYS_SET_DFLT 0x0200
703 #define LYS_SET_UNITS 0x0400
704 #define LYS_SET_CONFIG 0x0800
706 #define LYS_SINGLEQUOTED 0x0100
708 #define LYS_DOUBLEQUOTED 0x0200
711 #define LYS_YIN_ATTR 0x0400
712 #define LYS_YIN_ARGUMENT 0x0800
714 #define LYS_INTERNAL 0x1000
716 #define LYS_IS_ENUM 0x0200
718 #define LYS_IS_INPUT 0x1000
720 #define LYS_IS_OUTPUT 0x2000
722 #define LYS_IS_NOTIF 0x4000
724 #define LYS_FLAGS_COMPILED_MASK 0xff
1164 #define LYSP_MODULE_NAME(PMOD) (PMOD->is_submod ? ((struct lysp_submodule *)PMOD)->name : ((struct lysp_module *)PMOD)->mod->name)
1195 struct lyxp_expr *
cond;
1225 #define LYS_IFF_NOT 0x00
1226 #define LYS_IFF_AND 0x01
1227 #define LYS_IFF_OR 0x02
1228 #define LYS_IFF_F 0x03
1234 struct lysc_revision {
1240 struct lysc_range_part {
1411 #define LYS_NODE_HASH_COUNT 4
1768 #define lysc_is_userordered(lysc_node) \
1769 ((!lysc_node || !(lysc_node->nodetype & (LYS_LEAFLIST | LYS_LIST)) || !(lysc_node->flags & LYS_ORDBY_USER)) ? 0 : 1)
1777 #define lysc_is_key(lysc_node) \
1778 ((!lysc_node || (lysc_node->nodetype != LYS_LEAF) || !(lysc_node->flags & LYS_KEY)) ? 0 : 1)
1786 #define lysc_is_np_cont(lysc_node) \
1787 ((!lysc_node || (lysc_node->nodetype != LYS_CONTAINER) || (lysc_node->flags & LYS_PRESENCE)) ? 0 : 1)
1795 #define lysc_is_dup_inst_list(lysc_node) \
1796 ((lysc_node && (((lysc_node->nodetype == LYS_LIST) && (lysc_node->flags & LYS_KEYLESS)) || \
1797 ((lysc_node->nodetype == LYS_LEAFLIST) && !(lysc_node->flags & LYS_CONFIG_W)))) ? 1 : 0)
1828 #define lysc_data_parent(SCHEMA) lysc_data_node((SCHEMA) ? (SCHEMA)->parent : NULL)
2052 #define LYS_FIND_XP_SCHEMA 0x08
2053 #define LYS_FIND_XP_OUTPUT 0x10
2054 #define LYS_FIND_NO_MATCH_ERROR 0x40
2056 #define LYS_FIND_SCHEMAMOUNT 0x0200
2071 LIBYANG_API_DECL LY_ERR lys_find_xpath_atoms(const struct ly_ctx *ctx, const struct lysc_node *ctx_node, const char *xpath,
2087 const struct lyxp_expr *expr,
const struct lysc_prefix *prefixes, uint32_t options,
struct ly_set **set);
2101 uint32_t options,
struct ly_set **set);
2136 const char *path,
ly_bool output);
2209 #define LYS_MOD_LATEST_REV 0x01
2210 #define LYS_MOD_LATEST_SEARCHDIRS 0x02
2211 #define LYS_MOD_IMPORTED_REV 0x04
2214 #define LYS_MOD_LATEST_IMPCLB 0x08
2229 LIBYANG_API_DECL LY_ERR lys_feature_value(const struct lys_module *module, const char *feature);
2275 #define LYS_GETNEXT_WITHCHOICE 0x01
2276 #define LYS_GETNEXT_NOCHOICE 0x02
2277 #define LYS_GETNEXT_WITHCASE 0x04
2278 #define LYS_GETNEXT_INTONPCONT 0x08
2279 #define LYS_GETNEXT_OUTPUT 0x10
2281 #define LYS_GETNEXT_WITHSCHEMAMOUNT 0x20
2284 #define LYS_GETNEXT_EXT_XPATH 0x40
2300 LIBYANG_API_DECL const struct lysc_node *lys_find_child(const struct lysc_node *parent, const struct lys_module *module,
2334 LIBYANG_API_DECL
const char *
lyxp_get_expr(
const struct lyxp_expr *path);
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 lysc_ext * extensions
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 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
LIBYANG_API_DECL LY_ERR lysc_node_lref_backlinks(const struct ly_ctx *ctx, const struct lysc_node *node, ly_bool match_ancestors, struct ly_set **set)
Get all the leafref (or union with leafrefs) nodes that target a specific node.
struct lysc_ext_instance * exts
LY_ERR
libyang's error codes returned by the libyang functions.
struct lysp_include * includes
LIBYANG_API_DECL struct lyplg_type * lysc_get_type_plugin(uintptr_t plugin_ref)
Get a type plugin.
uint8_t ly_bool
Type to indicate boolean value.
Compiled YANG extension-stmt.
struct lysp_ext_instance * exts
struct lysc_ext_instance * exts
struct lysc_ext_instance * exts
struct lysp_restr * musts
struct lys_module * module
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
LIBYANG_API_DECL struct lyplg_ext * lysc_get_ext_plugin(uintptr_t plugin_ref)
Get an extension plugin.
struct lysp_qname * dflts
libyang generic macros and functions to work with YANG schema or data trees.
struct lysp_node_action * rpcs
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
Compiled YANG submodule with only some basic metadata required for generating ietf-yang-library data...
struct lysp_node_action * actions
struct lysc_ext_instance * exts
struct lysc_ext_instance * exts
LIBYANG_API_DECL LY_ERR lysc_node_lref_targets(const struct lysc_node *node, struct ly_set **set)
Get the target node(s) of a leafref node or union node with leafrefs.
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
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 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 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 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 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 lysc_prefix * prefixes
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
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 lysc_value * dflts
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. Function lysc_node_lref_targets() should be used instead to ge...
struct lysp_feature ** features
Logger manipulation routines and error definitions.
struct lysc_submodule * submodules
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
struct lysc_type * realtype
struct lysp_node_notif * notifs
struct lysp_node_action * actions
struct lysc_ext_instance * exts
struct lysp_restr * musts
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.