blob: 7c4e6a5f4732dce4009bbd2984487ec629375c51 [file] [log] [blame]
Radek Krejci70853c52018-10-15 14:46:16 +02001/**
2 * @file tree_schema_internal.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief internal functions for YANG schema trees.
5 *
Michal Vasko87cfdba2022-02-22 14:13:45 +01006 * Copyright (c) 2015 - 2022 CESNET, z.s.p.o.
Radek Krejci70853c52018-10-15 14:46:16 +02007 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
15#ifndef LY_TREE_SCHEMA_INTERNAL_H_
16#define LY_TREE_SCHEMA_INTERNAL_H_
17
Radek Krejci2d7a47b2019-05-16 13:34:10 +020018#include <stdint.h>
19
Radek Krejci535ea9f2020-05-29 16:01:05 +020020#include "common.h"
Radek Krejci2d7a47b2019-05-16 13:34:10 +020021#include "set.h"
22#include "tree_schema.h"
23
Michal Vasko1a7a7bd2020-10-16 14:39:15 +020024struct lysc_ctx;
Michal Vasko405cc9e2020-12-01 12:01:27 +010025struct lys_glob_unres;
Michal Vasko1a7a7bd2020-10-16 14:39:15 +020026
Radek Krejcif13b87b2020-12-01 22:02:17 +010027#define LY_YANG_SUFFIX ".yang"
28#define LY_YANG_SUFFIX_LEN 5
29#define LY_YIN_SUFFIX ".yin"
30#define LY_YIN_SUFFIX_LEN 4
31
FredGand944bdc2019-11-05 21:57:07 +080032#define YIN_NS_URI "urn:ietf:params:xml:ns:yang:yin:1"
33
Radek Krejcif13b87b2020-12-01 22:02:17 +010034#define LY_PCRE2_MSG_LIMIT 256
35
Radek Krejci335332a2019-09-05 13:03:35 +020036/**
aPiecek93582ed2021-05-25 14:49:06 +020037 * @brief The maximum depth at which the last nested block is located.
38 * Designed to protect against corrupted input that causes a stack-overflow error.
39 * For yang language and json format, the block is bounded by "{ }".
40 * For the xml format, the opening and closing element tag is considered as the block.
41 */
42#define LY_MAX_BLOCK_DEPTH 500
43
44/**
Radek Krejcieccf6602021-02-05 19:42:54 +010045 * @brief Informational structure for YANG statements
46 */
47struct stmt_info_s {
48 const char *name; /**< name of the statement */
49 const char *arg; /**< name of YIN's attribute to present the statement */
50 uint8_t flags; /**< various flags to clarify printing of the statement */
Michal Vasko26bbb272022-08-02 14:54:33 +020051
Radek Krejcieccf6602021-02-05 19:42:54 +010052#define STMT_FLAG_YIN 0x1 /**< has YIN element */
53#define STMT_FLAG_ID 0x2 /**< the value is identifier -> no quotes */
54};
55
56/* statements informations filled in tree_schema.c */
57extern struct stmt_info_s stmt_attr_info[];
58
Radek Krejcieccf6602021-02-05 19:42:54 +010059/* list of the deviate modifications strings */
60extern const char * const ly_devmod_list[];
61#define ly_devmod2str(TYPE) ly_devmod_list[TYPE]
62
63/**
Radek Krejci335332a2019-09-05 13:03:35 +020064 * @brief Check module version is at least 2 (YANG 1.1) because of the keyword presence.
65 * Logs error message and returns LY_EVALID in case of module in YANG version 1.0.
66 * @param[in] CTX yang parser context to get current module and for logging.
67 * @param[in] KW keyword allowed only in YANG version 1.1 (or later) - for logging.
68 * @param[in] PARENT parent statement where the KW is present - for logging.
69 */
70#define PARSER_CHECK_STMTVER2_RET(CTX, KW, PARENT) \
Michal Vasko8a67eff2021-12-07 14:04:47 +010071 if (PARSER_CUR_PMOD(CTX)->version < LYS_VERSION_1_1) {LOGVAL_PARSER((CTX), LY_VCODE_INCHILDSTMT2, KW, PARENT); return LY_EVALID;}
Radek Krejcid33273d2018-10-25 14:55:52 +020072
Radek Krejcia9026eb2018-12-12 16:04:47 +010073/* These 2 macros checks YANG's identifier grammar rule */
74#define is_yangidentstartchar(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
75#define is_yangidentchar(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || \
David Sedlákebd3acf2019-07-26 15:04:32 +020076 c == '_' || c == '-' || c == '.')
Radek Krejcia9026eb2018-12-12 16:04:47 +010077
David Sedlák4a650532019-07-10 11:55:18 +020078/* Macro to check YANG's yang-char grammar rule */
David Sedlák2c0d5ef2019-08-14 11:40:44 +020079#define is_yangutf8char(c) ((c >= 0x20 && c <= 0xd7ff) || c == 0x09 || c == 0x0a || c == 0x0d || \
David Sedlák4a650532019-07-10 11:55:18 +020080 (c >= 0xe000 && c <= 0xfdcf) || (c >= 0xfdf0 && c <= 0xfffd) || \
81 (c >= 0x10000 && c <= 0x1fffd) || (c >= 0x20000 && c <= 0x2fffd) || \
82 (c >= 0x30000 && c <= 0x3fffd) || (c >= 0x40000 && c <= 0x2fffd) || \
83 (c >= 0x50000 && c <= 0x5fffd) || (c >= 0x60000 && c <= 0x6fffd) || \
84 (c >= 0x70000 && c <= 0x7fffd) || (c >= 0x80000 && c <= 0x8fffd) || \
85 (c >= 0x90000 && c <= 0x9fffd) || (c >= 0xa0000 && c <= 0xafffd) || \
86 (c >= 0xb0000 && c <= 0xbfffd) || (c >= 0xc0000 && c <= 0xcfffd) || \
87 (c >= 0xd0000 && c <= 0xdfffd) || (c >= 0xe0000 && c <= 0xefffd) || \
88 (c >= 0xf0000 && c <= 0xffffd) || (c >= 0x100000 && c <= 0x10fffd))
89
Radek Krejci70853c52018-10-15 14:46:16 +020090/**
David Sedlákca36c422019-07-12 12:47:55 +020091 * @brief Try to find object with MEMBER string matching the IDENT in the given ARRAY.
92 * Macro logs an error message and returns LY_EVALID in case of existence of a matching object.
93 *
94 * @param[in] CTX yang parser context for logging.
95 * @param[in] ARRAY [sized array](@ref sizedarrays) of a generic objects with member named MEMBER to search.
96 * @param[in] MEMBER Name of the member of the objects in the ARRAY to compare.
97 * @param[in] STMT Name of the compared YANG statements for logging.
98 * @param[in] IDENT String trying to find in the ARRAY's objects inside the MEMBER member.
99 */
100#define CHECK_UNIQUENESS(CTX, ARRAY, MEMBER, STMT, IDENT) \
101 if (ARRAY) { \
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200102 for (LY_ARRAY_COUNT_TYPE u_ = 0; u_ < LY_ARRAY_COUNT(ARRAY) - 1; ++u_) { \
Radek Krejci7eb54ba2020-05-18 16:30:04 +0200103 if (!strcmp((ARRAY)[u_].MEMBER, IDENT)) { \
David Sedlákca36c422019-07-12 12:47:55 +0200104 LOGVAL_PARSER(CTX, LY_VCODE_DUPIDENT, IDENT, STMT); \
105 return LY_EVALID; \
106 } \
107 } \
108 }
109
Michal Vaskob36053d2020-03-26 15:49:30 +0100110#define CHECK_NONEMPTY(CTX, VALUE_LEN, STMT) \
David Sedlák129a09c2019-07-12 14:08:34 +0200111 if (!VALUE_LEN) { \
Michal Vaskob36053d2020-03-26 15:49:30 +0100112 LOGWRN(PARSER_CTX(CTX), "Empty argument of %s statement does not make sense.", STMT); \
David Sedlák129a09c2019-07-12 14:08:34 +0200113 }
Radek Krejci70853c52018-10-15 14:46:16 +0200114
Radek Krejcif13b87b2020-12-01 22:02:17 +0100115/*
116 * Additional YANG constants
117 */
118#define Y_TAB_SPACES 8 /**< number of spaces instead of tab character */
119#define LY_TYPE_DEC64_FD_MAX 18 /**< Maximal value of decimal64's fraction-digits */
120
Radek Krejci70853c52018-10-15 14:46:16 +0200121/**
Radek Krejcie3846472018-10-15 15:24:51 +0200122 * @brief List of YANG statement groups - the (sub)module's substatements
123 */
124enum yang_module_stmt {
125 Y_MOD_MODULE_HEADER,
126 Y_MOD_LINKAGE,
127 Y_MOD_META,
128 Y_MOD_REVISION,
129 Y_MOD_BODY
130};
131
132/**
133 * @brief Types of arguments of YANG statements
134 */
135enum yang_arg {
136 Y_IDENTIF_ARG, /**< YANG "identifier-arg-str" rule */
Radek Krejcia9026eb2018-12-12 16:04:47 +0100137 Y_PREF_IDENTIF_ARG, /**< YANG "identifier-ref-arg-str" or node-identifier rule */
Radek Krejcie3846472018-10-15 15:24:51 +0200138 Y_STR_ARG, /**< YANG "string" rule */
139 Y_MAYBE_STR_ARG /**< optional YANG "string" rule */
140};
141
Michal Vasko8a67eff2021-12-07 14:04:47 +0100142#define PARSER_CUR_PMOD(CTX) ((struct lysp_module *)(CTX)->parsed_mods->objs[(CTX)->parsed_mods->count - 1])
143#define PARSER_CTX(CTX) (PARSER_CUR_PMOD(CTX)->mod->ctx)
Radek Krejci2efc45b2020-12-22 16:25:44 +0100144#define LOGVAL_PARSER(CTX, ...) LOGVAL((CTX) ? PARSER_CTX(CTX) : NULL, __VA_ARGS__)
Michal Vaskob36053d2020-03-26 15:49:30 +0100145
146struct lys_parser_ctx {
aPiecek8d4e75d2021-06-24 14:47:06 +0200147 LYS_INFORMAT format; /**< parser format */
148 struct ly_set tpdfs_nodes; /**< Set of nodes that contain typedef(s). Invalid in case of
149 submodule, use ::lys_parser_ctx.main_ctx instead. */
150 struct ly_set grps_nodes; /**< Set of nodes that contain grouping(s). Invalid in case of
aPiecek63e080d2021-06-29 13:53:28 +0200151 submodule, use ::lys_parser_ctx.main_ctx instead. */
Michal Vasko8a67eff2021-12-07 14:04:47 +0100152 struct ly_set *parsed_mods; /**< (sub)modules being parsed, the last one is the current */
aPiecek8d4e75d2021-06-24 14:47:06 +0200153 struct lys_parser_ctx *main_ctx; /**< This pointer must not be NULL. If this context deals with the submodule,
154 then should be set to the context of the module to which it belongs,
155 otherwise it points to the beginning of this structure. */
Michal Vaskob36053d2020-03-26 15:49:30 +0100156};
157
Radek Krejcie3846472018-10-15 15:24:51 +0200158/**
David Sedlákebd3acf2019-07-26 15:04:32 +0200159 * @brief Internal context for yang schema parser.
Radek Krejci70853c52018-10-15 14:46:16 +0200160 */
Michal Vaskob36053d2020-03-26 15:49:30 +0100161struct lys_yang_parser_ctx {
aPiecek8d4e75d2021-06-24 14:47:06 +0200162 LYS_INFORMAT format; /**< parser format */
163 struct ly_set tpdfs_nodes; /**< Set of nodes that contain typedef(s). Invalid in case of
164 submodule, use ::lys_parser_ctx.main_ctx instead. */
165 struct ly_set grps_nodes; /**< Set of nodes that contain grouping(s). Invalid in case of
aPiecek63e080d2021-06-29 13:53:28 +0200166 submodule, use ::lys_parser_ctx.main_ctx instead. */
Michal Vasko8a67eff2021-12-07 14:04:47 +0100167 struct ly_set *parsed_mods; /**< (sub)modules being parsed, the last one is the current */
aPiecek8d4e75d2021-06-24 14:47:06 +0200168 struct lys_parser_ctx *main_ctx; /**< This pointer must not be NULL. If this context deals with the submodule,
169 then should be set to the context of the module to which it belongs,
170 otherwise it points to the beginning of this structure. */
171 struct ly_in *in; /**< input handler for the parser */
172 uint64_t indent; /**< current position on the line for YANG indentation */
173 uint32_t depth; /**< current number of nested blocks, see ::LY_MAX_BLOCK_DEPTH */
Radek Krejci70853c52018-10-15 14:46:16 +0200174};
175
David Sedlákebd3acf2019-07-26 15:04:32 +0200176/**
177 * @brief free lys parser context.
178 */
Michal Vaskob36053d2020-03-26 15:49:30 +0100179void yang_parser_ctx_free(struct lys_yang_parser_ctx *ctx);
David Sedlákebd3acf2019-07-26 15:04:32 +0200180
181/**
182 * @brief Internal context for yin schema parser.
183 */
Michal Vaskob36053d2020-03-26 15:49:30 +0100184struct lys_yin_parser_ctx {
aPiecek8d4e75d2021-06-24 14:47:06 +0200185 LYS_INFORMAT format; /**< parser format */
186 struct ly_set tpdfs_nodes; /**< Set of nodes that contain typedef(s). Invalid in case of
187 submodule, use ::lys_parser_ctx.main_ctx instead. */
188 struct ly_set grps_nodes; /**< Set of nodes that contain grouping(s). Invalid in case of
aPiecek63e080d2021-06-29 13:53:28 +0200189 submodule, use ::lys_parser_ctx.main_ctx instead. */
Michal Vasko8a67eff2021-12-07 14:04:47 +0100190 struct ly_set *parsed_mods; /**< (sub)modules being parsed, the last one is the current */
aPiecek8d4e75d2021-06-24 14:47:06 +0200191 struct lys_parser_ctx *main_ctx; /**< This pointer must not be NULL. If this context deals with the submodule,
192 then should be set to the context of the module to which it belongs,
193 otherwise it points to the beginning of this structure. */
194 struct lyxml_ctx *xmlctx; /**< context for xml parser */
David Sedlákebd3acf2019-07-26 15:04:32 +0200195};
196
197/**
198 * @brief free yin parser context
199 *
200 * @param[in] ctx Context to free.
201 */
Michal Vaskob36053d2020-03-26 15:49:30 +0100202void yin_parser_ctx_free(struct lys_yin_parser_ctx *ctx);
David Sedlákebd3acf2019-07-26 15:04:32 +0200203
Michal Vasko7f45cf22020-10-01 12:49:44 +0200204/**
David Sedlák4a650532019-07-10 11:55:18 +0200205 * @brief Check that \p c is valid UTF8 code point for YANG string.
206 *
Michal Vaskob36053d2020-03-26 15:49:30 +0100207 * @param[in] ctx parser context for logging.
David Sedlák4a650532019-07-10 11:55:18 +0200208 * @param[in] c UTF8 code point of a character to check.
209 * @return LY_ERR values.
210 */
Radek Krejci1deb5be2020-08-26 16:43:36 +0200211LY_ERR lysp_check_stringchar(struct lys_parser_ctx *ctx, uint32_t c);
David Sedlák4a650532019-07-10 11:55:18 +0200212
213/**
214 * @brief Check that \p c is valid UTF8 code point for YANG identifier.
215 *
Michal Vaskob36053d2020-03-26 15:49:30 +0100216 * @param[in] ctx parser context for logging.
David Sedlák4a650532019-07-10 11:55:18 +0200217 * @param[in] c UTF8 code point of a character to check.
218 * @param[in] first Flag to check the first character of an identifier, which is more restricted.
219 * @param[in,out] prefix Storage for internally used flag in case of possible prefixed identifiers:
220 * 0 - colon not yet found (no prefix)
221 * 1 - \p c is the colon character
222 * 2 - prefix already processed, now processing the identifier
223 *
224 * If the identifier cannot be prefixed, NULL is expected.
225 * @return LY_ERR values.
226 */
Radek Krejci857189e2020-09-01 13:26:36 +0200227LY_ERR lysp_check_identifierchar(struct lys_parser_ctx *ctx, uint32_t c, ly_bool first, uint8_t *prefix);
David Sedlák4a650532019-07-10 11:55:18 +0200228
229/**
Radek Krejci70853c52018-10-15 14:46:16 +0200230 * @brief Check the currently present prefixes in the module for collision with the new one.
231 *
Radek Krejcibbe09a92018-11-08 09:36:54 +0100232 * @param[in] ctx Context for logging.
Radek Krejci0bcdaed2019-01-10 10:21:34 +0100233 * @param[in] imports List of current imports of the module to check prefix collision.
234 * @param[in] module_prefix Prefix of the module to check collision.
Radek Krejci70853c52018-10-15 14:46:16 +0200235 * @param[in] value Newly added prefix value (including its location to distinguish collision with itself).
236 * @return LY_EEXIST when prefix is already used in the module, LY_SUCCESS otherwise
237 */
Radek Krejcie7b95092019-05-15 11:03:07 +0200238LY_ERR lysp_check_prefix(struct lys_parser_ctx *ctx, struct lysp_import *imports, const char *module_prefix, const char **value);
Radek Krejci70853c52018-10-15 14:46:16 +0200239
Radek Krejci86d106e2018-10-18 09:53:19 +0200240/**
241 * @brief Check date string (4DIGIT "-" 2DIGIT "-" 2DIGIT)
242 *
Radek Krejcibbe09a92018-11-08 09:36:54 +0100243 * @param[in] ctx Optional context for logging.
Radek Krejci86d106e2018-10-18 09:53:19 +0200244 * @param[in] date Date string to check (non-necessarily terminated by \0)
245 * @param[in] date_len Length of the date string, 10 expected.
246 * @param[in] stmt Statement name for error message.
247 * @return LY_ERR value.
248 */
Juraj Vijtiuk74dad9e2021-05-26 12:42:14 +0200249LY_ERR lysp_check_date(struct lys_parser_ctx *ctx, const char *date, size_t date_len, const char *stmt);
Radek Krejcibbe09a92018-11-08 09:36:54 +0100250
251/**
252 * @brief Check names of typedefs in the parsed module to detect collisions.
253 *
Radek Krejci0bcdaed2019-01-10 10:21:34 +0100254 * @param[in] ctx Parser context for logging and to maintain tpdfs_nodes
255 * @param[in] mod Module where the type is being defined.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100256 * @return LY_ERR value.
257 */
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100258LY_ERR lysp_check_dup_typedefs(struct lys_parser_ctx *ctx, struct lysp_module *mod);
259
260/**
aPiecek63e080d2021-06-29 13:53:28 +0200261 * @brief Check names of groupings in the parsed module to detect collisions.
262 *
263 * @param[in] ctx Parser context for logging and to maintain grps_nodes.
264 * @param[in] mod Module where the type is being defined.
265 * @return LY_ERR value.
266 */
267LY_ERR lysp_check_dup_groupings(struct lys_parser_ctx *ctx, struct lysp_module *mod);
268
269/**
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100270 * @brief Check names of features in the parsed module and submodules to detect collisions.
271 *
272 * @param[in] ctx Parser context.
273 * @param[in] mod Module where the type is being defined.
274 * @return LY_ERR value.
275 */
276LY_ERR lysp_check_dup_features(struct lys_parser_ctx *ctx, struct lysp_module *mod);
277
278/**
279 * @brief Check names of identities in the parsed module and submodules to detect collisions.
280 *
281 * @param[in] ctx Parser context.
282 * @param[in] mod Module where the type is being defined.
283 * @return LY_ERR value.
284 */
285LY_ERR lysp_check_dup_identities(struct lys_parser_ctx *ctx, struct lysp_module *mod);
Radek Krejci86d106e2018-10-18 09:53:19 +0200286
287/**
288 * @brief Just move the newest revision into the first position, does not sort the rest
289 * @param[in] revs Sized-array of the revisions in a printable schema tree.
290 */
291void lysp_sort_revisions(struct lysp_revision *revs);
292
293/**
David Sedlák6544c182019-07-12 13:17:33 +0200294 * @brief Find type specified type definition.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100295 *
296 * @param[in] id Name of the type including possible prefix. Module where the prefix is being searched is start_module.
297 * @param[in] start_node Context node where the type is being instantiated to be able to search typedefs in parents.
298 * @param[in] start_module Module where the type is being instantiated for search for typedefs.
Radek Krejci4f28eda2018-11-12 11:46:16 +0100299 * @param[out] type Built-in type identifier of the id. If #LY_TYPE_UNKNOWN, tpdf is expected to contain found YANG schema typedef statement.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100300 * @param[out] tpdf Found type definition.
301 * @param[out] node Node where the found typedef is defined, NULL in case of a top-level typedef.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100302 */
Michal Vaskoa99b3572021-02-01 11:54:58 +0100303LY_ERR lysp_type_find(const char *id, struct lysp_node *start_node, const struct lysp_module *start_module,
304 LY_DATA_TYPE *type, const struct lysp_tpdf **tpdf, struct lysp_node **node);
Radek Krejcibbe09a92018-11-08 09:36:54 +0100305
306/**
David Sedlák6544c182019-07-12 13:17:33 +0200307 * @brief Validate enum name.
308 *
309 * @param[in] ctx yang parser context for logging.
310 * @param[in] name String to check.
311 * @param[in] name_len Length of name.
312 *
313 * @return LY_ERR values
314 */
David Sedlák07869a52019-07-12 14:28:19 +0200315LY_ERR lysp_check_enum_name(struct lys_parser_ctx *ctx, const char *name, size_t name_len);
David Sedlák6544c182019-07-12 13:17:33 +0200316
317/**
Michal Vasko4e205e82021-06-08 14:01:47 +0200318 * @brief Find source data for a specific module, parse it, and add into the context.
Radek Krejci086c7132018-10-26 15:29:04 +0200319 *
320 * @param[in] ctx libyang context.
321 * @param[in] name Name of the module to load.
Radek Krejci84d7fd72021-07-14 18:32:21 +0200322 * @param[in] revision Optional revision of the module to load. If NULL, the newest revision is loaded.
Michal Vaskodd992582021-06-10 14:34:57 +0200323 * @param[in,out] new_mods Set of all the new mods added to the context. Includes this module and all of its imports.
Michal Vasko18a86e52021-04-16 11:50:13 +0200324 * @param[out] mod Created module structure.
Michal Vasko4e205e82021-06-08 14:01:47 +0200325 * @return LY_SUCCESS on success.
326 * @return LY_ERR on error.
Radek Krejci086c7132018-10-26 15:29:04 +0200327 */
Michal Vaskodd992582021-06-10 14:34:57 +0200328LY_ERR lys_parse_load(struct ly_ctx *ctx, const char *name, const char *revision, struct ly_set *new_mods,
Michal Vasko4e205e82021-06-08 14:01:47 +0200329 struct lys_module **mod);
Radek Krejci086c7132018-10-26 15:29:04 +0200330
331/**
Radek Krejci771928a2021-01-19 13:42:36 +0100332 * @brief Parse included submodules into the simply parsed YANG module.
333 *
334 * YANG 1.0 does not require the main module to include all the submodules. Therefore, parsing submodules can cause
335 * reallocating and extending the includes array in the main module by the submodules included only in submodules.
Radek Krejcid33273d2018-10-25 14:55:52 +0200336 *
Michal Vasko7c8439f2020-08-05 13:25:19 +0200337 * @param[in] pctx main parser context
Radek Krejci771928a2021-01-19 13:42:36 +0100338 * @param[in] pmod Parsed module with the includes array to be processed.
aPiecekc3e26142021-06-22 14:25:49 +0200339 * @param[in,out] new_mods Set of all the new mods added to the context. Includes this module and all of its imports.
Radek Krejcid33273d2018-10-25 14:55:52 +0200340 * @return LY_ERR value.
341 */
aPiecekc3e26142021-06-22 14:25:49 +0200342LY_ERR lysp_load_submodules(struct lys_parser_ctx *pctx, struct lysp_module *pmod, struct ly_set *new_mods);
Radek Krejcid33273d2018-10-25 14:55:52 +0200343
344/**
Michal Vasko7f45cf22020-10-01 12:49:44 +0200345 * @brief Free a parsed restriction.
346 *
347 * @param[in] ctx libyang context.
348 * @param[in] restr Restriction to free.
349 */
350void lysp_restr_free(struct ly_ctx *ctx, struct lysp_restr *restr);
351
352/**
353 * @brief Free a parsed qualified name.
354 *
355 * @param[in] ctx libyang context.
356 * @param[in] qname Qualified name to free.
357 */
358void lysp_qname_free(struct ly_ctx *ctx, struct lysp_qname *qname);
359
360/**
361 * @brief Free a parsed node.
362 *
363 * @param[in] ctx libyang context.
364 * @param[in] node Node to free.
365 */
366void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
367
368/**
Radek Krejcibbe09a92018-11-08 09:36:54 +0100369 * @brief Get address of a node's actions list if any.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100370 * Decides the node's type and in case it has an actions list, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100371 *
Radek Krejcibbe09a92018-11-08 09:36:54 +0100372 * @param[in] node Node to check.
373 * @return Address of the node's actions member if any, NULL otherwise.
374 */
Radek Krejci2a9fc652021-01-22 17:44:34 +0100375struct lysp_node_action **lysp_node_actions_p(struct lysp_node *node);
Radek Krejcibbe09a92018-11-08 09:36:54 +0100376
377/**
378 * @brief Get address of a node's notifications list if any.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100379 * Decides the node's type and in case it has a notifications list, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100380 *
Radek Krejcibbe09a92018-11-08 09:36:54 +0100381 * @param[in] node Node to check.
382 * @return Address of the node's notifs member if any, NULL otherwise.
383 */
Radek Krejci2a9fc652021-01-22 17:44:34 +0100384struct lysp_node_notif **lysp_node_notifs_p(struct lysp_node *node);
Radek Krejcibbe09a92018-11-08 09:36:54 +0100385
386/**
387 * @brief Get address of a node's child pointer if any.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100388 * Decides the node's type and in case it has a children list, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100389 *
Radek Krejcibbe09a92018-11-08 09:36:54 +0100390 * @param[in] node Node to check.
391 * @return Address of the node's child member if any, NULL otherwise.
392 */
Michal Vasko544e58a2021-01-28 14:33:41 +0100393struct lysp_node **lysp_node_child_p(struct lysp_node *node);
Radek Krejcibbe09a92018-11-08 09:36:54 +0100394
395/**
Radek Krejci9a3823e2021-01-27 20:26:46 +0100396 * @brief Get the address of the node's musts member, if any.
397 * Decides the node's type and in case it has a musts member, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100398 *
Radek Krejci9a3823e2021-01-27 20:26:46 +0100399 * @param[in] node Node to examine.
400 * @return The address of the node's musts member if any, NULL otherwise.
401 */
402struct lysp_restr **lysp_node_musts_p(const struct lysp_node *node);
403
404/**
405 * @brief Get the node's musts member, if any.
406 * Decides the node's type and in case it has a musts member, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100407 *
Radek Krejci9a3823e2021-01-27 20:26:46 +0100408 * @param[in] node Node to examine.
409 * @return The node's musts member if any, NULL otherwise.
410 */
411struct lysp_restr *lysp_node_musts(const struct lysp_node *node);
412
413/**
414 * @brief Get the address of the node's when member, if any.
415 * Decides the node's type and in case it has a when, returns it.
Michal Vasko544e58a2021-01-28 14:33:41 +0100416 *
Radek Krejci9a3823e2021-01-27 20:26:46 +0100417 * @param[in] node Node to examine.
418 * @return The address of the node's when member if any, NULL otherwise.
419 */
420struct lysp_when **lysp_node_when_p(const struct lysp_node *node);
421
422/**
423 * @brief Get the node's when member, if any.
424 * Decides the node's type and in case it has a when, returns it.
Michal Vasko544e58a2021-01-28 14:33:41 +0100425 *
Radek Krejci9a3823e2021-01-27 20:26:46 +0100426 * @param[in] node Node to examine.
427 * @return The node's when member if any, NULL otherwise.
428 */
429struct lysp_when *lysp_node_when(const struct lysp_node *node);
430
431/**
Radek Krejcibbe09a92018-11-08 09:36:54 +0100432 * @brief Get address of a node's child pointer if any.
Radek Krejcibbe09a92018-11-08 09:36:54 +0100433 * Decides the node's type and in case it has a children list, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100434 *
435 * Do not use for RPC and action nodes.
436 *
Radek Krejcibbe09a92018-11-08 09:36:54 +0100437 * @param[in] node Node to check.
438 * @return Address of the node's child member if any, NULL otherwise.
439 */
Michal Vasko544e58a2021-01-28 14:33:41 +0100440struct lysc_node **lysc_node_child_p(const struct lysc_node *node);
Radek Krejcibbe09a92018-11-08 09:36:54 +0100441
442/**
Radek Krejcifc11bd72019-04-11 16:00:05 +0200443 * @brief Get address of a node's notifs pointer if any.
Radek Krejcifc11bd72019-04-11 16:00:05 +0200444 * Decides the node's type and in case it has a notifs array, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100445 *
Radek Krejcifc11bd72019-04-11 16:00:05 +0200446 * @param[in] node Node to check.
447 * @return Address of the node's notifs member if any, NULL otherwise.
448 */
Radek Krejci2a9fc652021-01-22 17:44:34 +0100449struct lysc_node_notif **lysc_node_notifs_p(struct lysc_node *node);
Radek Krejcifc11bd72019-04-11 16:00:05 +0200450
451/**
452 * @brief Get address of a node's actions pointer if any.
Radek Krejcifc11bd72019-04-11 16:00:05 +0200453 * Decides the node's type and in case it has a actions array, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100454 *
Radek Krejcifc11bd72019-04-11 16:00:05 +0200455 * @param[in] node Node to check.
456 * @return Address of the node's actions member if any, NULL otherwise.
457 */
Radek Krejci2a9fc652021-01-22 17:44:34 +0100458struct lysc_node_action **lysc_node_actions_p(struct lysc_node *node);
Radek Krejcifc11bd72019-04-11 16:00:05 +0200459
460/**
Radek Krejci9a3823e2021-01-27 20:26:46 +0100461 * @brief Get address of a node's when member if any.
Radek Krejci9a3823e2021-01-27 20:26:46 +0100462 * Decides the node's type and in case it has a when member, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100463 *
Radek Krejci9a3823e2021-01-27 20:26:46 +0100464 * @param[in] node Node to check.
465 * @return Address of the node's when member if any, NULL otherwise.
466 */
467struct lysc_when ***lysc_node_when_p(const struct lysc_node *node);
468
469/**
470 * @brief Get address of a node's musts member if any.
Radek Krejci9a3823e2021-01-27 20:26:46 +0100471 * Decides the node's type and in case it has a musts member, returns its address.
Michal Vasko544e58a2021-01-28 14:33:41 +0100472 *
Radek Krejci9a3823e2021-01-27 20:26:46 +0100473 * @param[in] node Node to check.
474 * @return Address of the node's musts member if any, NULL otherwise.
475 */
476struct lysc_must **lysc_node_musts_p(const struct lysc_node *node);
477
478/**
Radek Krejci85ac8312021-03-03 20:21:33 +0100479 * @brief Find parsed extension definition for the given extension instance.
480 *
481 * @param[in] ctx libyang context.
482 * @param[in] ext Extension instance for which the definition will be searched.
483 * @param[in, out] ext_mod Pointer to the module where the extension definition of the @p ext to correctly resolve prefixes.
484 * @param[out] ext_def Pointer to return found extension definition.
485 * @return LY_SUCCESS when the definition was found.
486 * @return LY_EVALID when the extension instance is invalid and/or the definition not found.
487 */
488LY_ERR lysp_ext_find_definition(const struct ly_ctx *ctx, const struct lysp_ext_instance *ext, const struct lys_module **ext_mod,
489 struct lysp_ext **ext_def);
490
491/**
Radek Krejciba05eab2021-03-10 13:19:29 +0100492 * @brief Get schema node in extension instance according to the given parameters.
493 *
494 * Wraps ::lys_getnext_ext() and match according to the given arguments.
495 *
496 * @param[in] ext Extension instance which top-level schema node is being searched.
497 * @param[in] module Optional parameter to match the extension instance's (and its data) module.
498 * @param[in] name Name of the schema node to find, if the string is not NULL-terminated, the @p name_len must be set.
499 * @param[in] name_len Length of the @p name string, use in case the @p name is not NULL-terminated string.
500 * @param[in] nodetype Allowed [type of the node](@ref schemanodetypes).
501 * @param[in] options ORed [lys_getnext options](@ref sgetnextflags).
502 * @return Found schema node if there is some satisfy the provided requirements.
503 */
504const struct lysc_node *lysc_ext_find_node(const struct lysc_ext_instance *ext, const struct lys_module *module,
505 const char *name, size_t name_len, uint16_t nodetype, uint32_t options);
506
507/**
Radek Krejci85ac8312021-03-03 20:21:33 +0100508 * @brief When the module comes from YIN format, the argument name is unknown because of missing extension definition
509 * (it might come from import modules which is not yet parsed at that time). Therefore, all the attributes are stored
510 * as substatements and resolving argument is postponed.
511 *
512 * There are 3 places which need the argument, so they resolve it when missing - YIN and YANG printers and extension instance
513 * compiler.
514 *
515 * @param[in] ctx libyang context
516 * @param[in] ext_p Parsed extension to be updated.
517 * @param[in] ext_def Extension definition, found with ::lysp_ext_find_definition().
518 * @return LY_ERR value.
519 */
520LY_ERR lysp_ext_instance_resolve_argument(struct ly_ctx *ctx, struct lysp_ext_instance *ext_p, struct lysp_ext *ext_def);
521
522/**
Radek Krejcid3ca0632019-04-16 16:54:54 +0200523 * @brief Iterate over the specified type of the extension instances
524 *
525 * @param[in] ext ([Sized array](@ref sizedarrays)) of extensions to explore
526 * @param[in] index Index in the \p ext array where to start searching (first call with 0, the consequent calls with
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200527 * the returned index increased by 1 (until the iteration is not terminated by returning LY_ARRAY_COUNT(ext).
Radek Krejcifc596f92021-02-26 22:40:26 +0100528 * @param[in] substmt The statement the extension is supposed to belong to.
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200529 * @result index in the ext array, LY_ARRAY_COUNT(ext) value if not present.
Radek Krejcid3ca0632019-04-16 16:54:54 +0200530 */
Radek Krejcifc596f92021-02-26 22:40:26 +0100531LY_ARRAY_COUNT_TYPE lysp_ext_instance_iter(struct lysp_ext_instance *ext, LY_ARRAY_COUNT_TYPE index, enum ly_stmt substmt);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200532
533/**
Radek Krejci96a0bfd2018-11-22 15:25:06 +0100534 * @brief Get the covering schema module structure for the given parsed module structure.
Michal Vasko544e58a2021-01-28 14:33:41 +0100535 *
Radek Krejci96a0bfd2018-11-22 15:25:06 +0100536 * @param[in] ctx libyang context to search.
537 * @param[in] mod Parsed schema structure.
538 * @return Corresponding lys_module structure for the given parsed schema structure.
539 */
540struct lys_module *lysp_find_module(struct ly_ctx *ctx, const struct lysp_module *mod);
541
542/**
Radek Krejci693262f2019-04-29 15:23:20 +0200543 * @brief Stringify YANG built-in type.
Michal Vasko1bf09392020-03-27 12:38:10 +0100544 * @param[in] basetype Built-in type ID to stringify.
Radek Krejci693262f2019-04-29 15:23:20 +0200545 * @return Constant string with the name of the built-in type.
546 */
547const char *lys_datatype2str(LY_DATA_TYPE basetype);
548
Michal Vasko405cc9e2020-12-01 12:01:27 +0100549/**
Michal Vasko65333882021-06-10 14:12:16 +0200550 * @brief Implement a module and resolve all global unres.
Michal Vasko405cc9e2020-12-01 12:01:27 +0100551 *
552 * @param[in] mod Module to implement.
Michal Vasko4e205e82021-06-08 14:01:47 +0200553 * @param[in] features Features to set, see ::lys_set_features().
Michal Vasko65333882021-06-10 14:12:16 +0200554 * @param[in] unres Global unres with all the created modules.
555 * @return LY_SUCCESS on success.
Michal Vasko4e205e82021-06-08 14:01:47 +0200556 * @return LY_ERR on error.
Michal Vasko405cc9e2020-12-01 12:01:27 +0100557 */
Michal Vasko65333882021-06-10 14:12:16 +0200558LY_ERR _lys_set_implemented(struct lys_module *mod, const char **features, struct lys_glob_unres *unres);
Michal Vasko405cc9e2020-12-01 12:01:27 +0100559
Michal Vaskof4258e12021-06-15 12:11:42 +0200560/**
561 * @brief Create dependency sets for all modules in a context.
Michal Vasko50bc09a2021-06-17 17:31:56 +0200562 * Also sets to_compile flags for all the modules that should be (re)compiled.
Michal Vaskof4258e12021-06-15 12:11:42 +0200563 *
564 * @param[in] ctx Context to use.
565 * @param[in,out] main_set Set of dependency module sets.
566 * @param[in] mod Optional only module whose dependency set is needed, otherwise all sets are created.
567 * @return LY_ERR value.
568 */
Michal Vasko50bc09a2021-06-17 17:31:56 +0200569LY_ERR lys_unres_dep_sets_create(struct ly_ctx *ctx, struct ly_set *main_set, struct lys_module *mod);
Michal Vaskof4258e12021-06-15 12:11:42 +0200570
571/**
572 * @brief Revert changes stored in global compile context after a failed compilation.
573 *
574 * @param[in] ctx libyang context.
575 * @param[in] unres Global unres to use.
576 */
577void lys_unres_glob_revert(struct ly_ctx *ctx, struct lys_glob_unres *unres);
578
579/**
580 * @brief Erase the global compile context.
581 *
582 * @param[in] unres Global unres to erase.
583 */
584void lys_unres_glob_erase(struct lys_glob_unres *unres);
585
Michal Vasko3a41dff2020-07-15 14:30:28 +0200586typedef LY_ERR (*lys_custom_check)(const struct ly_ctx *ctx, struct lysp_module *mod, struct lysp_submodule *submod,
Radek Krejci0f969882020-08-21 16:56:47 +0200587 void *check_data);
Michal Vaskob36053d2020-03-26 15:49:30 +0100588
Radek Krejci693262f2019-04-29 15:23:20 +0200589/**
Michal Vasko4e205e82021-06-08 14:01:47 +0200590 * @brief Parse a module and add it into the context.
Radek Krejcid33273d2018-10-25 14:55:52 +0200591 *
592 * @param[in] ctx libyang context where to process the data model.
Michal Vasko63f3d842020-07-08 10:10:14 +0200593 * @param[in] in Input structure.
Radek Krejcid33273d2018-10-25 14:55:52 +0200594 * @param[in] format Format of the input data (YANG or YIN).
Radek Krejci9ed7a192018-10-31 16:23:51 +0100595 * @param[in] custom_check Callback to check the parsed schema before it is accepted.
596 * @param[in] check_data Caller's data to pass to the custom_check callback.
Michal Vaskodd992582021-06-10 14:34:57 +0200597 * @param[in,out] new_mods Set of all the new mods added to the context. Includes this module and all of its imports.
Michal Vasko7a0b0762020-09-02 16:37:01 +0200598 * @param[out] module Created module.
Michal Vaskodd992582021-06-10 14:34:57 +0200599 * @return LY_SUCCESS on success.
600 * @return LY_ERR on error, @p new_mods may be modified.
Radek Krejcid33273d2018-10-25 14:55:52 +0200601 */
Michal Vasko4e205e82021-06-08 14:01:47 +0200602LY_ERR lys_parse_in(struct ly_ctx *ctx, struct ly_in *in, LYS_INFORMAT format, lys_custom_check custom_check,
Michal Vaskodd992582021-06-10 14:34:57 +0200603 void *check_data, struct ly_set *new_mods, struct lys_module **module);
Radek Krejcid33273d2018-10-25 14:55:52 +0200604
605/**
Michal Vasko7a0b0762020-09-02 16:37:01 +0200606 * @brief Parse submodule.
Radek Krejcid33273d2018-10-25 14:55:52 +0200607 *
Radek Krejci0bcdaed2019-01-10 10:21:34 +0100608 * The latest_revision flag of submodule is updated.
609 *
610 * @param[in] ctx libyang context where to process the data model.
Michal Vasko63f3d842020-07-08 10:10:14 +0200611 * @param[in] in Input structure.
Radek Krejci0bcdaed2019-01-10 10:21:34 +0100612 * @param[in] format Format of the input data (YANG or YIN).
613 * @param[in] main_ctx Parser context of the main module.
614 * @param[in] custom_check Callback to check the parsed schema before it is accepted.
615 * @param[in] check_data Caller's data to pass to the custom_check callback.
aPiecekc3e26142021-06-22 14:25:49 +0200616 * @param[in] new_mods Set of all the new mods added to the context. Includes this module and all of its imports.
Michal Vasko3a41dff2020-07-15 14:30:28 +0200617 * @param[out] submodule Parsed submodule.
618 * @return LY_ERR value.
Radek Krejci0bcdaed2019-01-10 10:21:34 +0100619 */
Michal Vasko87f1cf02021-06-08 14:02:47 +0200620LY_ERR lys_parse_submodule(struct ly_ctx *ctx, struct ly_in *in, LYS_INFORMAT format, struct lys_parser_ctx *main_ctx,
aPiecekc3e26142021-06-22 14:25:49 +0200621 lys_custom_check custom_check, void *check_data, struct ly_set *new_mods, struct lysp_submodule **submodule);
Radek Krejci0bcdaed2019-01-10 10:21:34 +0100622
623/**
Radek Krejcif0e1ba52020-05-22 15:14:35 +0200624 * @brief Fill filepath value if available in input handler @p in
Radek Krejci0bcdaed2019-01-10 10:21:34 +0100625 *
Radek Krejcif0e1ba52020-05-22 15:14:35 +0200626 * @param[in] ctx Context with dictionary where the filepath value will be stored.
627 * @param[in] in Input handler to examine (filepath is not available for all the input types).
628 * @param[out] filepath Address of the variable where the filepath is stored.
Radek Krejcid33273d2018-10-25 14:55:52 +0200629 */
Radek Krejcif0e1ba52020-05-22 15:14:35 +0200630void lys_parser_fill_filepath(struct ly_ctx *ctx, struct ly_in *in, const char **filepath);
Radek Krejcid33273d2018-10-25 14:55:52 +0200631
632/**
Radek Krejci693262f2019-04-29 15:23:20 +0200633 * @brief Get the @ref ifftokens from the given position in the 2bits array
634 * (libyang format of the if-feature expression).
635 * @param[in] list The 2bits array with the compiled if-feature expression.
636 * @param[in] pos Position (0-based) to specify from which position get the operator.
637 */
Radek Krejci1deb5be2020-08-26 16:43:36 +0200638uint8_t lysc_iff_getop(uint8_t *list, size_t pos);
Radek Krejci0af46292019-01-11 16:02:31 +0100639
640/**
Radek Krejcifc11bd72019-04-11 16:00:05 +0200641 * @brief Macro to free [sized array](@ref sizedarrays) of items using the provided free function. The ARRAY itself is also freed,
642 * but the memory is not sanitized.
643 */
Radek Krejci0a03a342021-01-19 13:39:28 +0100644#define FREE_ARRAY(CTX, ARRAY, FUNC) {LY_ARRAY_COUNT_TYPE c__; LY_ARRAY_FOR(ARRAY, c__){(FUNC)(CTX, &(ARRAY)[c__]);}LY_ARRAY_FREE(ARRAY);}
Radek Krejcifc11bd72019-04-11 16:00:05 +0200645
646/**
647 * @brief Macro to free the specified MEMBER of a structure using the provided free function. The memory is not sanitized.
648 */
Radek Krejci0a03a342021-01-19 13:39:28 +0100649#define FREE_MEMBER(CTX, MEMBER, FUNC) if (MEMBER) {(FUNC)(CTX, MEMBER);free(MEMBER);}
Radek Krejcifc11bd72019-04-11 16:00:05 +0200650
651/**
652 * @brief Macro to free [sized array](@ref sizedarrays) of strings stored in the context's dictionary. The ARRAY itself is also freed,
653 * but the memory is not sanitized.
654 */
Michal Vaskoe180ed02021-02-05 16:31:20 +0100655#define FREE_STRINGS(CTX, ARRAY) {LY_ARRAY_COUNT_TYPE c__; LY_ARRAY_FOR(ARRAY, c__){lydict_remove(CTX, ARRAY[c__]);}LY_ARRAY_FREE(ARRAY);}
Radek Krejcifc11bd72019-04-11 16:00:05 +0200656
657/**
Radek Krejci15f10ab2020-11-03 14:14:14 +0100658 * @brief Free the printable YANG schema tree structure. Works for both modules and submodules.
659 *
660 * @param[in] module Printable YANG schema tree structure to free.
661 */
662void lysp_module_free(struct lysp_module *module);
663
664/**
Radek Krejci38d85362019-09-05 16:26:38 +0200665 * @brief Free the parsed type structure.
666 * @param[in] ctx libyang context where the string data resides in a dictionary.
Michal Vasko8d544252020-03-02 10:19:52 +0100667 * @param[in] type Parsed schema type structure to free. Note that the type itself is not freed.
Radek Krejci38d85362019-09-05 16:26:38 +0200668 */
669void lysp_type_free(struct ly_ctx *ctx, struct lysp_type *type);
Radek Krejci335332a2019-09-05 13:03:35 +0200670
Radek Krejciad5963b2019-09-06 16:03:05 +0200671/**
Michal Vasko8d544252020-03-02 10:19:52 +0100672 * @brief Free the parsed extension instance structure.
673 * @param[in] ctx libyang context where the string data resides in a dictionary.
Radek Krejci84d7fd72021-07-14 18:32:21 +0200674 * @param[in] ext Parsed extension instance structure to free. Note that the instance itself is not freed.
Michal Vasko8d544252020-03-02 10:19:52 +0100675 */
676void lysp_ext_instance_free(struct ly_ctx *ctx, struct lysp_ext_instance *ext);
677
678/**
Radek Krejci84d7fd72021-07-14 18:32:21 +0200679 * @brief Parse generic statement structure into a specific parsed-schema structure.
680 *
681 * @param[in] ctx The compilation context of the @p stmt being processed
682 * @param[in] stmt Generic statement structure to process.
683 * @param[out] result Specific parsed-schema structure for the given statement. For the specific type for the particular statement, check the function code.
Radek Krejciad5963b2019-09-06 16:03:05 +0200684 * @param[in,out] exts [sized array](@ref sizedarrays) For extension instances in case of statements that do not store extension instances in their own list.
Radek Krejci84d7fd72021-07-14 18:32:21 +0200685 * @return LY_ERR value.
Radek Krejciad5963b2019-09-06 16:03:05 +0200686 */
Radek Krejci76c8c4e2021-02-17 10:16:48 +0100687LY_ERR lysp_stmt_parse(struct lysc_ctx *ctx, const struct lysp_stmt *stmt, void **result, struct lysp_ext_instance **exts);
Radek Krejci335332a2019-09-05 13:03:35 +0200688
Radek Krejcid33273d2018-10-25 14:55:52 +0200689/**
Michal Vasko20424b42020-08-31 12:29:38 +0200690 * @brief Free a parsed node.
691 *
692 * @param[in] ctx libyang context.
693 * @param[in] node Node to free.
694 */
695void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
696
697/**
Michal Vasko51de7b72022-04-29 09:50:22 +0200698 * @brief Free a compiled pattern.
699 *
700 * @param[in] ctx libyang context.
701 * @param[in] pattern Pointer to the pattern to free.
702 */
703void lysc_pattern_free(struct ly_ctx *ctx, struct lysc_pattern **pattern);
704
705/**
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100706 * @brief Free a bit/enum item.
707 *
708 * @param[in] ctx libyang context.
709 * @param[in] item Bit/enum item to free.
710 */
711void lysc_enum_item_free(struct ly_ctx *ctx, struct lysc_type_bitenum_item *item);
712
713/**
Radek Krejcicdfecd92018-11-26 11:27:32 +0100714 * @brief Free the compiled type structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100715 *
Radek Krejcicdfecd92018-11-26 11:27:32 +0100716 * @param[in] ctx libyang context where the string data resides in a dictionary.
717 * @param[in,out] type Compiled type structure to be freed. The structure has refcount, so it is freed only in case the value is decreased to 0.
718 */
719void lysc_type_free(struct ly_ctx *ctx, struct lysc_type *type);
720
721/**
Radek Krejci0af46292019-01-11 16:02:31 +0100722 * @brief Free the compiled if-feature structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100723 *
Radek Krejci0af46292019-01-11 16:02:31 +0100724 * @param[in] ctx libyang context where the string data resides in a dictionary.
725 * @param[in,out] iff Compiled if-feature structure to be cleaned.
726 * Since the structure is typically part of the sized array, the structure itself is not freed.
727 */
728void lysc_iffeature_free(struct ly_ctx *ctx, struct lysc_iffeature *iff);
729
730/**
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100731 * @brief Free the compiled identity structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100732 *
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100733 * @param[in] ctx libyang context where the string data resides in a dictionary.
734 * @param[in,out] ident Compiled identity structure to be cleaned.
735 * Since the structure is typically part of the sized array, the structure itself is not freed.
736 */
737void lysc_ident_free(struct ly_ctx *ctx, struct lysc_ident *ident);
738
739/**
Radek Krejciccd20f12019-02-15 14:12:27 +0100740 * @brief Free the compiled must structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100741 *
Radek Krejciccd20f12019-02-15 14:12:27 +0100742 * @param[in] ctx libyang context where the string data resides in a dictionary.
743 * @param[in,out] must Compiled must structure to be cleaned.
744 * Since the structure is typically part of the sized array, the structure itself is not freed.
745 */
746void lysc_must_free(struct ly_ctx *ctx, struct lysc_must *must);
747
748/**
Radek Krejcif538ce52019-03-05 10:46:14 +0100749 * @brief Free the data inside compiled input/output structure.
750 * @param[in] ctx libyang context where the string data resides in a dictionary.
751 * @param[in,out] inout Compiled inout structure to be cleaned.
752 * Since the structure is part of the RPC/action structure, it is not freed itself.
753 */
Radek Krejci2a9fc652021-01-22 17:44:34 +0100754void lysc_node_action_inout_free(struct ly_ctx *ctx, struct lysc_node_action_inout *inout);
Radek Krejcif538ce52019-03-05 10:46:14 +0100755
756/**
757 * @brief Free the data inside compiled RPC/action structure.
758 * @param[in] ctx libyang context where the string data resides in a dictionary.
759 * @param[in,out] action Compiled action structure to be cleaned.
760 * Since the structure is typically part of the sized array, the structure itself is not freed.
761 */
Radek Krejci2a9fc652021-01-22 17:44:34 +0100762void lysc_node_action_free(struct ly_ctx *ctx, struct lysc_node_action *action);
Radek Krejcif538ce52019-03-05 10:46:14 +0100763
764/**
Radek Krejcifc11bd72019-04-11 16:00:05 +0200765 * @brief Free the items inside the compiled Notification structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100766 *
Radek Krejcifc11bd72019-04-11 16:00:05 +0200767 * @param[in] ctx libyang context where the string data resides in a dictionary.
Radek Krejci720d2612021-03-03 19:44:22 +0100768 * @param[in,out] notif Compiled Notification structure to be cleaned.
Radek Krejcifc11bd72019-04-11 16:00:05 +0200769 * Since the structure is typically part of the sized array, the structure itself is not freed.
770 */
Radek Krejci2a9fc652021-01-22 17:44:34 +0100771void lysc_node_notif_free(struct ly_ctx *ctx, struct lysc_node_notif *notif);
Radek Krejcifc11bd72019-04-11 16:00:05 +0200772
773/**
Radek Krejci720d2612021-03-03 19:44:22 +0100774 * @brief Free the compiled extension definition and NULL the provided pointer.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100775 *
Radek Krejci720d2612021-03-03 19:44:22 +0100776 * @param[in] ctx libyang context where the string data resides in a dictionary.
aPiecekb0445f22021-06-24 11:34:07 +0200777 * @param[in,out] ext Compiled extension definition to be freed.
Radek Krejci720d2612021-03-03 19:44:22 +0100778 */
779void lysc_extension_free(struct ly_ctx *ctx, struct lysc_ext **ext);
780
781/**
Radek Krejci0af46292019-01-11 16:02:31 +0100782 * @brief Free the compiled extension instance structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100783 *
Radek Krejci0af46292019-01-11 16:02:31 +0100784 * @param[in] ctx libyang context where the string data resides in a dictionary.
785 * @param[in,out] ext Compiled extension instance structure to be cleaned.
786 * Since the structure is typically part of the sized array, the structure itself is not freed.
787 */
788void lysc_ext_instance_free(struct ly_ctx *ctx, struct lysc_ext_instance *ext);
789
790/**
Radek Krejci19a96102018-11-15 13:38:09 +0100791 * @brief Free the compiled node structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100792 *
Radek Krejci19a96102018-11-15 13:38:09 +0100793 * @param[in] ctx libyang context where the string data resides in a dictionary.
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100794 * @param[in] node Compiled node structure to be freed.
795 * @param[in] unlink Whether to first unlink the node before freeing.
Radek Krejci19a96102018-11-15 13:38:09 +0100796 */
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100797void lysc_node_free(struct ly_ctx *ctx, struct lysc_node *node, ly_bool unlink);
Radek Krejci19a96102018-11-15 13:38:09 +0100798
799/**
Radek Krejcif2de0ed2019-05-02 14:13:18 +0200800 * @brief Free the compiled container node structure.
801 *
802 * Only the container-specific members are freed, for generic node free function,
Radek Krejci8678fa42020-08-18 16:07:28 +0200803 * use ::lysc_node_free().
Radek Krejcif2de0ed2019-05-02 14:13:18 +0200804 *
805 * @param[in] ctx libyang context where the string data resides in a dictionary.
806 * @param[in,out] node Compiled container node structure to be freed.
807 */
808void lysc_node_container_free(struct ly_ctx *ctx, struct lysc_node_container *node);
809
810/**
Radek Krejci19a96102018-11-15 13:38:09 +0100811 * @brief Free the compiled schema structure.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100812 *
Radek Krejci19a96102018-11-15 13:38:09 +0100813 * @param[in,out] module Compiled schema module structure to free.
Radek Krejci19a96102018-11-15 13:38:09 +0100814 */
Radek Krejci90ed21e2021-04-12 14:47:46 +0200815void lysc_module_free(struct lysc_module *module);
Radek Krejci19a96102018-11-15 13:38:09 +0100816
817/**
Radek Krejci86d106e2018-10-18 09:53:19 +0200818 * @brief Free the schema structure. It just frees, it does not remove the schema from its context.
Michal Vaskof4fa90d2021-11-11 15:05:19 +0100819 *
Radek Krejci86d106e2018-10-18 09:53:19 +0200820 * @param[in,out] module Schema module structure to free.
Michal Vasko4f9da5e2022-03-14 13:11:26 +0100821 * @param[in] remove_links Whether to remove links in other modules to structures in this module. Not needed if
822 * the whole context is being freed.
Radek Krejci86d106e2018-10-18 09:53:19 +0200823 */
Michal Vasko4f9da5e2022-03-14 13:11:26 +0100824void lys_module_free(struct lys_module *module, ly_bool remove_links);
Radek Krejci86d106e2018-10-18 09:53:19 +0200825
826/**
David Sedlák18e494b2018-12-17 03:58:39 +0100827 * @brief match yang keyword
David Sedlák1bccdfa2019-06-17 15:55:27 +0200828 *
Michal Vasko63f3d842020-07-08 10:10:14 +0200829 * @param[in,out] in Input structure, is updated.
Radek Krejcid54412f2020-12-17 20:25:35 +0100830 * @param[in,out] indent Pointer to the counter of current position on the line for YANG indentation (optional).
Michal Vasko14654712020-02-06 08:35:21 +0100831 * @return yang_keyword values.
David Sedlák18e494b2018-12-17 03:58:39 +0100832 */
Radek Krejcid54412f2020-12-17 20:25:35 +0100833enum ly_stmt lysp_match_kw(struct ly_in *in, uint64_t *indent);
David Sedlák1bccdfa2019-06-17 15:55:27 +0200834
Michal Vasko14654712020-02-06 08:35:21 +0100835/**
836 * @brief Generate path of the given node in the requested format.
837 *
838 * @param[in] node Schema path of this node will be generated.
839 * @param[in] parent Build relative path only until this parent is found. If NULL, the full absolute path is printed.
840 * @param[in] pathtype Format of the path to generate.
841 * @param[in,out] buffer Prepared buffer of the @p buflen length to store the generated path.
842 * If NULL, memory for the complete path is allocated.
843 * @param[in] buflen Size of the provided @p buffer.
844 * @return NULL in case of memory allocation error, path of the node otherwise.
845 * In case the @p buffer is NULL, the returned string is dynamically allocated and caller is responsible to free it.
846 */
847char *lysc_path_until(const struct lysc_node *node, const struct lysc_node *parent, LYSC_PATH_TYPE pathtype, char *buffer,
Radek Krejci0f969882020-08-21 16:56:47 +0200848 size_t buflen);
Michal Vasko14654712020-02-06 08:35:21 +0100849
Michal Vasko62ed12d2020-05-21 10:08:25 +0200850/**
Radek Krejci239c38a2020-10-19 10:58:25 +0200851 * @brief Get format-specific prefix for a module.
852 *
Radek Krejci84d7fd72021-07-14 18:32:21 +0200853 * This function is available for type plugins via ::lyplg_type_get_prefix() API function.
Radek Krejci239c38a2020-10-19 10:58:25 +0200854 *
855 * @param[in] mod Module whose prefix to get.
856 * @param[in] format Format of the prefix.
Radek Krejci8df109d2021-04-23 12:19:08 +0200857 * @param[in] prefix_data Format-specific data based on @p format:
Radek Krejci224d4b42021-04-23 13:54:59 +0200858 * LY_VALUE_CANON - NULL
Radek Krejci84d7fd72021-07-14 18:32:21 +0200859 * LY_VALUE_SCHEMA - const struct ::lysp_module* (module used for resolving imports to prefixes)
860 * LY_VALUE_SCHEMA_RESOLVED - struct ::lysc_prefix* (sized array of pairs: prefix - module)
861 * LY_VALUE_XML - struct ::ly_set* (set of all returned modules as struct ::lys_module)
Radek Krejci8df109d2021-04-23 12:19:08 +0200862 * LY_VALUE_JSON - NULL
Radek Krejcif9943642021-04-26 10:18:21 +0200863 * LY_VALUE_LYB - NULL
Radek Krejci239c38a2020-10-19 10:58:25 +0200864 * @return Module prefix to print.
865 * @return NULL on error.
866 */
Radek Krejci8df109d2021-04-23 12:19:08 +0200867const char *ly_get_prefix(const struct lys_module *mod, LY_VALUE_FORMAT format, void *prefix_data);
Radek Krejci239c38a2020-10-19 10:58:25 +0200868
869/**
870 * @brief Resolve format-specific prefixes to modules.
871 *
Radek Krejci239c38a2020-10-19 10:58:25 +0200872 * @param[in] ctx libyang context.
873 * @param[in] prefix Prefix to resolve.
874 * @param[in] prefix_len Length of @p prefix.
875 * @param[in] format Format of the prefix.
Radek Krejcif9943642021-04-26 10:18:21 +0200876 * @param[in] prefix_data Format-specific data based on @p format:
877 * LY_VALUE_CANON - NULL
878 * LY_VALUE_SCHEMA - const struct lysp_module * (module used for resolving prefixes from imports)
879 * LY_VALUE_SCHEMA_RESOLVED - struct lyd_value_prefix * (sized array of pairs: prefix - module)
880 * LY_VALUE_XML - const struct ly_set * (set with defined namespaces stored as ::lyxml_ns)
881 * LY_VALUE_JSON - NULL
882 * LY_VALUE_LYB - NULL
Radek Krejci239c38a2020-10-19 10:58:25 +0200883 * @return Resolved prefix module,
884 * @return NULL otherwise.
885 */
Radek Krejcif9943642021-04-26 10:18:21 +0200886const struct lys_module *ly_resolve_prefix(const struct ly_ctx *ctx, const void *prefix, size_t prefix_len,
Radek Krejci8df109d2021-04-23 12:19:08 +0200887 LY_VALUE_FORMAT format, const void *prefix_data);
Radek Krejci239c38a2020-10-19 10:58:25 +0200888
Michal Vaskof4258e12021-06-15 12:11:42 +0200889/**
890 * @brief Learn whether @p PMOD needs to be recompiled if it is implemented.
891 *
892 * @param[in] PMOD Parsed module or submodule.
893 * @return Whether it has statements that are recompiled or not.
894 */
895#define LYSP_HAS_RECOMPILED(PMOD) \
896 (PMOD->data || PMOD->rpcs || PMOD->notifs || PMOD->exts)
897
898/**
899 * @brief Learn whether the module has statements that need to be recompiled or not.
900 *
901 * @param[in] mod Module to examine.
902 * @return Whether it has statements that are recompiled or not.
903 */
904ly_bool lys_has_recompiled(const struct lys_module *mod);
905
906/**
907 * @brief Learn whether @p PMOD needs to be compiled if it is implemented.
908 *
909 * @param[in] PMOD Parsed module or submodule.
910 * @return Whether it needs (has) a compiled module or not.
911 */
912#define LYSP_HAS_COMPILED(PMOD) \
aPiecek6b3d5422021-07-30 15:55:43 +0200913 (LYSP_HAS_RECOMPILED(PMOD) || PMOD->augments || PMOD->deviations)
Michal Vaskof4258e12021-06-15 12:11:42 +0200914
915/**
916 * @brief Learn whether the module has statements that need to be compiled or not.
917 *
918 * @param[in] mod Module to examine.
919 * @return Whether it needs compiled module or not.
920 */
921ly_bool lys_has_compiled(const struct lys_module *mod);
922
Michal Vasko7ee5be22021-06-16 17:03:34 +0200923/**
924 * @brief Learn whether the module has any grouping statements or not.
925 *
926 * @param[in] mod Module to examine.
927 * @return Whether it has groupings or not.
928 */
Michal Vasko87cfdba2022-02-22 14:13:45 +0100929ly_bool lys_has_dep_mods(const struct lys_module *mod);
Michal Vasko7ee5be22021-06-16 17:03:34 +0200930
Michal Vasko0bccbf12021-11-22 09:59:57 +0100931/**
932 * @brief Learn whether the module qualifies for a single dep set with only this module or not.
933 *
934 * @param[in] mod Module to examine.
935 * @return Whether it qualifies as a single dep set or not.
936 */
937#define LYS_IS_SINGLE_DEP_SET(mod) \
938 (!(mod)->parsed->features && (!lys_has_compiled(mod) || ((mod)->compiled && !lys_has_recompiled(mod))))
939
Radek Krejci70853c52018-10-15 14:46:16 +0200940#endif /* LY_TREE_SCHEMA_INTERNAL_H_ */