16 #ifndef LY_TREE_SCHEMA_H_
17 #define LY_TREE_SCHEMA_H_
19 #define PCRE2_CODE_UNIT_WIDTH 8
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
360 #define LYSP_RESTR_PATTERN_ACK 0x06
361 #define LYSP_RESTR_PATTERN_NACK 0x15
470 #define LYS_DEV_NOT_SUPPORTED 1
471 #define LYS_DEV_ADD 2
472 #define LYS_DEV_DELETE 3
473 #define LYS_DEV_REPLACE 4
479 struct lysp_deviate {
651 #define LYS_CONFIG_W 0x01
652 #define LYS_CONFIG_R 0x02
653 #define LYS_CONFIG_MASK 0x03
654 #define LYS_STATUS_CURR 0x04
655 #define LYS_STATUS_DEPRC 0x08
656 #define LYS_STATUS_OBSLT 0x10
657 #define LYS_STATUS_MASK 0x1C
658 #define LYS_MAND_TRUE 0x20
663 #define LYS_MAND_FALSE 0x40
666 #define LYS_MAND_MASK 0x60
667 #define LYS_PRESENCE 0x80
670 #define LYS_UNIQUE 0x80
671 #define LYS_KEY 0x0100
672 #define LYS_KEYLESS 0x0200
673 #define LYS_DISABLED 0x0100
674 #define LYS_FENABLED 0x20
675 #define LYS_ORDBY_SYSTEM 0x80
677 #define LYS_ORDBY_USER 0x40
680 #define LYS_ORDBY_MASK 0x60
681 #define LYS_YINELEM_TRUE 0x80
682 #define LYS_YINELEM_FALSE 0x0100
683 #define LYS_YINELEM_MASK 0x0180
684 #define LYS_USED_GRP 0x0400
686 #define LYS_SET_VALUE 0x0200
687 #define LYS_SET_MIN 0x0200
688 #define LYS_SET_MAX 0x0400
690 #define LYS_SET_BASE 0x0001
691 #define LYS_SET_BIT 0x0002
692 #define LYS_SET_ENUM 0x0004
693 #define LYS_SET_FRDIGITS 0x0008
694 #define LYS_SET_LENGTH 0x0010
695 #define LYS_SET_PATH 0x0020
696 #define LYS_SET_PATTERN 0x0040
697 #define LYS_SET_RANGE 0x0080
698 #define LYS_SET_TYPE 0x0100
699 #define LYS_SET_REQINST 0x0200
700 #define LYS_SET_DFLT 0x0200
705 #define LYS_SET_UNITS 0x0400
706 #define LYS_SET_CONFIG 0x0800
708 #define LYS_SINGLEQUOTED 0x0100
709 #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)
1196 struct lyxp_expr *
cond;
1226 #define LYS_IFF_NOT 0x00
1227 #define LYS_IFF_AND 0x01
1228 #define LYS_IFF_OR 0x02
1229 #define LYS_IFF_F 0x03
1235 struct lysc_revision {
1241 struct lysc_range_part {
1350 struct lyxp_expr *
path;
1393 #define LYS_NODE_HASH_COUNT 4
1738 #define lysc_is_userordered(lysc_node) \
1739 ((!lysc_node || !(lysc_node->nodetype & (LYS_LEAFLIST | LYS_LIST)) || !(lysc_node->flags & LYS_ORDBY_USER)) ? 0 : 1)
1747 #define lysc_is_key(lysc_node) \
1748 ((!lysc_node || (lysc_node->nodetype != LYS_LEAF) || !(lysc_node->flags & LYS_KEY)) ? 0 : 1)
1756 #define lysc_is_np_cont(lysc_node) \
1757 ((!lysc_node || (lysc_node->nodetype != LYS_CONTAINER) || (lysc_node->flags & LYS_PRESENCE)) ? 0 : 1)
1765 #define lysc_is_dup_inst_list(lysc_node) \
1766 ((lysc_node && (((lysc_node->nodetype == LYS_LIST) && (lysc_node->flags & LYS_KEYLESS)) || \
1767 ((lysc_node->nodetype == LYS_LEAFLIST) && !(lysc_node->flags & LYS_CONFIG_W)))) ? 1 : 0)
1780 #define lysc_data_parent(SCHEMA) lysc_data_node((SCHEMA) ? (SCHEMA)->parent : NULL)
1970 #define LYS_FIND_XP_SCHEMA 0x08
1971 #define LYS_FIND_XP_OUTPUT 0x10
1972 #define LYS_FIND_NO_MATCH_ERROR 0x40
1974 #define LYS_FIND_SCHEMAMOUNT 0x0200
1989 LIBYANG_API_DECL LY_ERR lys_find_xpath_atoms(const struct ly_ctx *ctx, const struct lysc_node *ctx_node, const char *xpath,
1990 uint32_t options,
struct ly_set **set);
2005 const struct lyxp_expr *expr,
const struct lysc_prefix *prefixes, uint32_t options,
struct ly_set **set);
2019 uint32_t options,
struct ly_set **set);
2054 const char *path,
ly_bool output);
2122 #define LYS_MOD_LATEST_REV 0x01
2123 #define LYS_MOD_LATEST_SEARCHDIRS 0x02
2124 #define LYS_MOD_IMPORTED_REV 0x04
2127 #define LYS_MOD_LATEST_IMPCLB 0x08
2142 LIBYANG_API_DECL LY_ERR lys_feature_value(const struct lys_module *module, const char *feature);
2188 #define LYS_GETNEXT_WITHCHOICE 0x01
2189 #define LYS_GETNEXT_NOCHOICE 0x02
2190 #define LYS_GETNEXT_WITHCASE 0x04
2191 #define LYS_GETNEXT_INTONPCONT 0x08
2192 #define LYS_GETNEXT_OUTPUT 0x10
2194 #define LYS_GETNEXT_WITHSCHEMAMOUNT 0x20
2211 LIBYANG_API_DECL const struct lysc_node *lys_find_child(const struct lysc_node *parent, const struct lys_module *module,
2245 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 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 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 lysp_ext_instance * exts
struct lysp_qname * dflts
struct lysc_ext_instance * exts
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 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
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 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_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
LY_ERR
libyang's error codes returned by the libyang functions.
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
struct lys_module * cur_mod
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
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.