blob: 0172f6b5556903109ee33f155df9783e8930d452 [file] [log] [blame]
Radek Krejcid3ca0632019-04-16 16:54:54 +02001/**
2 * @file printer_yang.c
3 * @author Radek Krejci <rkrejci@cesnet.cz>
Michal Vaskoedb0fa52022-10-04 10:36:00 +02004 * @author Michal Vasko <mvasko@cesnet.cz>
Radek Krejcid3ca0632019-04-16 16:54:54 +02005 * @brief YANG printer
6 *
Michal Vaskob26d09d2022-08-22 09:52:19 +02007 * Copyright (c) 2015 - 2022 CESNET, z.s.p.o.
Radek Krejcid3ca0632019-04-16 16:54:54 +02008 *
9 * This source code is licensed under BSD 3-Clause License (the "License").
10 * You may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * https://opensource.org/licenses/BSD-3-Clause
14 */
15
Radek Krejci535ea9f2020-05-29 16:01:05 +020016#define _GNU_SOURCE
Radek Krejcid3ca0632019-04-16 16:54:54 +020017
Michal Vaskoa0ba01e2022-10-19 13:26:57 +020018#include <assert.h>
Radek Krejci693262f2019-04-29 15:23:20 +020019#include <inttypes.h>
Radek Krejcie7b95092019-05-15 11:03:07 +020020#include <stdint.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
Radek Krejci47fab892020-11-05 17:02:41 +010024#include <sys/types.h>
Radek Krejci693262f2019-04-29 15:23:20 +020025
Radek Krejci535ea9f2020-05-29 16:01:05 +020026#include "common.h"
Radek Krejciaa45bda2020-07-20 07:43:38 +020027#include "compat.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020028#include "log.h"
Radek Krejci47fab892020-11-05 17:02:41 +010029#include "out.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020030#include "out_internal.h"
Radek Krejci77114102021-03-10 15:21:57 +010031#include "plugins_exts.h"
Radek Krejci47fab892020-11-05 17:02:41 +010032#include "plugins_types.h"
Radek Krejcid3ca0632019-04-16 16:54:54 +020033#include "printer_internal.h"
Radek Krejci535ea9f2020-05-29 16:01:05 +020034#include "printer_schema.h"
Radek Krejcie7b95092019-05-15 11:03:07 +020035#include "tree.h"
Radek Krejci535ea9f2020-05-29 16:01:05 +020036#include "tree_data.h"
Radek Krejcid3ca0632019-04-16 16:54:54 +020037#include "tree_schema.h"
38#include "tree_schema_internal.h"
Radek Krejci693262f2019-04-29 15:23:20 +020039#include "xpath.h"
Radek Krejcid3ca0632019-04-16 16:54:54 +020040
Radek Krejcie7b95092019-05-15 11:03:07 +020041/**
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010042 * @brief Types of the YANG printers
43 */
44enum lys_ypr_schema_type {
45 LYS_YPR_PARSED, /**< YANG printer of the parsed schema */
46 LYS_YPR_COMPILED /**< YANG printer of the compiled schema */
47};
48
Radek Krejciaa14a0c2020-09-04 11:16:47 +020049#define YPR_CTX_FLAG_EXTRA_LINE 0x01 /**< Flag for ::ypr_ctx::flags to print extra line in schema */
50
Michal Vasko61ad1ff2022-02-10 15:48:39 +010051#define YPR_EXTRA_LINE(COND, PCTX) if (COND) { (PCTX)->flags |= YPR_CTX_FLAG_EXTRA_LINE; }
52#define YPR_EXTRA_LINE_PRINT(PCTX) \
53 if ((PCTX)->flags & YPR_CTX_FLAG_EXTRA_LINE) { \
54 (PCTX)->flags &= ~YPR_CTX_FLAG_EXTRA_LINE; \
Radek Krejciaa14a0c2020-09-04 11:16:47 +020055 if (DO_FORMAT) { \
Michal Vasko61ad1ff2022-02-10 15:48:39 +010056 ly_print_((PCTX)->out, "\n"); \
Radek Krejciaa14a0c2020-09-04 11:16:47 +020057 } \
58 }
59
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010060/**
61 * @brief Compiled YANG printer context
62 *
63 * Note that the YANG extensions API provides getter to the members for the extension plugins.
64 */
65struct lys_ypr_ctx {
66 union {
67 struct {
68 struct ly_out *out; /**< output specification */
69 uint16_t level; /**< current indentation level: 0 - no formatting, >= 1 indentation levels */
Radek Krejciaa14a0c2020-09-04 11:16:47 +020070 uint16_t flags; /**< internal flags for use by printer */
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010071 uint32_t options; /**< Schema output options (see @ref schemaprinterflags). */
72 const struct lys_module *module; /**< schema to print */
73 };
74 struct lyspr_ctx printer_ctx;
75 };
76
77 /* YANG printer specific members */
78 enum lys_ypr_schema_type schema; /**< type of the schema to print */
79};
80
81/**
Radek Krejcie7b95092019-05-15 11:03:07 +020082 * @brief Print the given text as content of a double quoted YANG string,
83 * including encoding characters that have special meanings. The quotation marks
84 * are not printed.
85 *
86 * Follows RFC 7950, section 6.1.3.
87 *
88 * @param[in] out Output specification.
89 * @param[in] text String to be printed.
Radek Krejcif56e2a42019-09-09 14:15:25 +020090 * @param[in] len Length of the string from @p text to be printed. In case of -1,
Radek Krejcie7b95092019-05-15 11:03:07 +020091 * the @p text is printed completely as a NULL-terminated string.
92 */
Radek Krejcid3ca0632019-04-16 16:54:54 +020093static void
Radek Krejci1deb5be2020-08-26 16:43:36 +020094ypr_encode(struct ly_out *out, const char *text, ssize_t len)
Radek Krejcid3ca0632019-04-16 16:54:54 +020095{
Radek Krejci1deb5be2020-08-26 16:43:36 +020096 size_t i, start_len;
Radek Krejcid3ca0632019-04-16 16:54:54 +020097 const char *start;
98 char special = 0;
99
100 if (!len) {
101 return;
102 }
103
104 if (len < 0) {
105 len = strlen(text);
106 }
107
108 start = text;
109 start_len = 0;
Radek Krejci1deb5be2020-08-26 16:43:36 +0200110 for (i = 0; i < (size_t)len; ++i) {
Radek Krejcid3ca0632019-04-16 16:54:54 +0200111 switch (text[i]) {
112 case '\n':
113 case '\t':
114 case '\"':
115 case '\\':
116 special = text[i];
117 break;
118 default:
119 ++start_len;
120 break;
121 }
122
123 if (special) {
Michal Vasko5233e962020-08-14 14:26:20 +0200124 ly_write_(out, start, start_len);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200125 switch (special) {
126 case '\n':
Michal Vasko5233e962020-08-14 14:26:20 +0200127 ly_write_(out, "\\n", 2);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200128 break;
129 case '\t':
Michal Vasko5233e962020-08-14 14:26:20 +0200130 ly_write_(out, "\\t", 2);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200131 break;
132 case '\"':
Michal Vasko5233e962020-08-14 14:26:20 +0200133 ly_write_(out, "\\\"", 2);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200134 break;
135 case '\\':
Michal Vasko5233e962020-08-14 14:26:20 +0200136 ly_write_(out, "\\\\", 2);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200137 break;
138 }
139
140 start += start_len + 1;
141 start_len = 0;
142
143 special = 0;
144 }
145 }
146
Michal Vasko5233e962020-08-14 14:26:20 +0200147 ly_write_(out, start, start_len);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200148}
149
150static void
Radek Krejci857189e2020-09-01 13:26:36 +0200151ypr_open(struct ly_out *out, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200152{
153 if (flag && !*flag) {
154 *flag = 1;
Michal Vasko5233e962020-08-14 14:26:20 +0200155 ly_print_(out, " {\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200156 }
157}
158
159static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100160ypr_close(struct lys_ypr_ctx *pctx, ly_bool flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200161{
162 if (flag) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100163 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200164 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100165 ly_print_(pctx->out, ";\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200166 }
167}
168
169static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100170ypr_text(struct lys_ypr_ctx *pctx, const char *name, const char *text, ly_bool singleline, ly_bool closed)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200171{
172 const char *s, *t;
173
174 if (singleline) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100175 ly_print_(pctx->out, "%*s%s \"", INDENT, name);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200176 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100177 ly_print_(pctx->out, "%*s%s\n", INDENT, name);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200178 LEVEL++;
179
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100180 ly_print_(pctx->out, "%*s\"", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200181 }
182 t = text;
183 while ((s = strchr(t, '\n'))) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100184 ypr_encode(pctx->out, t, s - t);
185 ly_print_(pctx->out, "\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200186 t = s + 1;
187 if (*t != '\n') {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100188 ly_print_(pctx->out, "%*s ", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200189 }
190 }
191
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100192 ypr_encode(pctx->out, t, strlen(t));
Radek Krejcid3ca0632019-04-16 16:54:54 +0200193 if (closed) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100194 ly_print_(pctx->out, "\";\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200195 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100196 ly_print_(pctx->out, "\"");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200197 }
198 if (!singleline) {
199 LEVEL--;
200 }
201}
202
203static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100204yprp_stmt(struct lys_ypr_ctx *pctx, struct lysp_stmt *stmt)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200205{
206 struct lysp_stmt *childstmt;
207 const char *s, *t;
208
209 if (stmt->arg) {
210 if (stmt->flags) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100211 ly_print_(pctx->out, "%*s%s\n", INDENT, stmt->stmt);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200212 LEVEL++;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100213 ly_print_(pctx->out, "%*s%c", INDENT, (stmt->flags & LYS_DOUBLEQUOTED) ? '\"' : '\'');
Radek Krejcid3ca0632019-04-16 16:54:54 +0200214 t = stmt->arg;
215 while ((s = strchr(t, '\n'))) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100216 ypr_encode(pctx->out, t, s - t);
217 ly_print_(pctx->out, "\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200218 t = s + 1;
219 if (*t != '\n') {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100220 ly_print_(pctx->out, "%*s ", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200221 }
222 }
223 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100224 ypr_encode(pctx->out, t, strlen(t));
225 ly_print_(pctx->out, "%c%s", (stmt->flags & LYS_DOUBLEQUOTED) ? '\"' : '\'', stmt->child ? " {\n" : ";\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200226 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100227 ly_print_(pctx->out, "%*s%s %s%s", INDENT, stmt->stmt, stmt->arg, stmt->child ? " {\n" : ";\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200228 }
229 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100230 ly_print_(pctx->out, "%*s%s%s", INDENT, stmt->stmt, stmt->child ? " {\n" : ";\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200231 }
232
233 if (stmt->child) {
234 LEVEL++;
235 LY_LIST_FOR(stmt->child, childstmt) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100236 yprp_stmt(pctx, childstmt);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200237 }
238 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100239 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200240 }
241}
242
Radek Krejcid3ca0632019-04-16 16:54:54 +0200243static void
Michal Vaskob26d09d2022-08-22 09:52:19 +0200244yprp_extension_instance(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
245 struct lysp_ext_instance *ext, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200246{
Radek Krejcid3ca0632019-04-16 16:54:54 +0200247 struct lysp_stmt *stmt;
Radek Krejci857189e2020-09-01 13:26:36 +0200248 ly_bool child_presence;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200249
Michal Vaskob26d09d2022-08-22 09:52:19 +0200250 if ((ext->flags & LYS_INTERNAL) || (ext->parent_stmt != substmt) || (ext->parent_stmt_index != substmt_index)) {
251 return;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200252 }
Radek Krejci85ac8312021-03-03 20:21:33 +0100253
Michal Vaskob26d09d2022-08-22 09:52:19 +0200254 ypr_open(pctx->out, flag);
255
Michal Vasko193dacd2022-10-13 08:43:05 +0200256 if (ext->def->argname) {
Michal Vaskob26d09d2022-08-22 09:52:19 +0200257 ly_print_(pctx->out, "%*s%s \"", INDENT, ext->name);
Michal Vaskob26d09d2022-08-22 09:52:19 +0200258 ypr_encode(pctx->out, ext->argument, -1);
259 ly_print_(pctx->out, "\"");
260 } else {
261 ly_print_(pctx->out, "%*s%s", INDENT, ext->name);
262 }
263
264 child_presence = 0;
265 LEVEL++;
266 LY_LIST_FOR(ext->child, stmt) {
267 if (stmt->flags & (LYS_YIN_ATTR | LYS_YIN_ARGUMENT)) {
Radek Krejcif56e2a42019-09-09 14:15:25 +0200268 continue;
269 }
Michal Vaskob26d09d2022-08-22 09:52:19 +0200270 if (!child_presence) {
271 ly_print_(pctx->out, " {\n");
272 child_presence = 1;
Radek Krejcif56e2a42019-09-09 14:15:25 +0200273 }
Michal Vaskob26d09d2022-08-22 09:52:19 +0200274 yprp_stmt(pctx, stmt);
275 }
276 LEVEL--;
277 if (child_presence) {
278 ly_print_(pctx->out, "%*s}\n", INDENT);
279 } else {
280 ly_print_(pctx->out, ";\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200281 }
282}
283
Radek Krejci693262f2019-04-29 15:23:20 +0200284static void
Michal Vaskob26d09d2022-08-22 09:52:19 +0200285yprp_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
286 struct lysp_ext_instance *exts, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200287{
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200288 LY_ARRAY_COUNT_TYPE u;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200289
290 LY_ARRAY_FOR(exts, u) {
291 yprp_extension_instance(pctx, substmt, substmt_index, &exts[u], flag);
292 }
293}
294
295static void
296yprc_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
297 struct lysc_ext_instance *exts, ly_bool *flag)
298{
299 LY_ARRAY_COUNT_TYPE u;
300 ly_bool inner_flag;
301
302 LY_ARRAY_FOR(exts, u) {
303 if ((exts[u].parent_stmt != substmt) || (exts[u].parent_stmt_index != substmt_index)) {
304 return;
305 }
306
307 ypr_open(pctx->out, flag);
308 if (exts[u].argument) {
309 ly_print_(pctx->out, "%*s%s:%s \"", INDENT, exts[u].def->module->name, exts[u].def->name);
310 ypr_encode(pctx->out, exts[u].argument, -1);
311 ly_print_(pctx->out, "\"");
312 } else {
313 ly_print_(pctx->out, "%*s%s:%s", INDENT, exts[u].def->module->name, exts[u].def->name);
314 }
315
316 LEVEL++;
317 inner_flag = 0;
318 yprc_extension_instances(pctx, LY_STMT_EXTENSION_INSTANCE, 0, exts[u].exts, &inner_flag);
319
Michal Vasko941e0562022-10-18 10:35:00 +0200320 if (exts[u].def->plugin && exts[u].def->plugin->printer_info) {
321 exts[u].def->plugin->printer_info(&pctx->printer_ctx, &exts[u], &inner_flag);
Michal Vaskob26d09d2022-08-22 09:52:19 +0200322 }
323
324 LEVEL--;
325 ypr_close(pctx, inner_flag);
326 }
327}
328
329static void
330ypr_substmt(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index, const char *text, void *exts)
331{
Radek Krejci857189e2020-09-01 13:26:36 +0200332 ly_bool extflag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200333
334 if (!text) {
335 /* nothing to print */
336 return;
337 }
338
Radek Krejcieccf6602021-02-05 19:42:54 +0100339 if (stmt_attr_info[substmt].flags & STMT_FLAG_ID) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100340 ly_print_(pctx->out, "%*s%s %s", INDENT, stmt_attr_info[substmt].name, text);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200341 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100342 ypr_text(pctx, stmt_attr_info[substmt].name, text,
Radek Krejcieccf6602021-02-05 19:42:54 +0100343 (stmt_attr_info[substmt].flags & STMT_FLAG_YIN) ? 0 : 1, 0);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200344 }
345
346 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200347 if (pctx->schema == LYS_YPR_PARSED) {
348 yprp_extension_instances(pctx, substmt, substmt_index, exts, &extflag);
349 } else {
350 yprc_extension_instances(pctx, substmt, substmt_index, exts, &extflag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200351 }
352 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100353 ypr_close(pctx, extflag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200354}
355
356static void
Michal Vasko9a9e4e72022-03-21 10:05:11 +0100357ypr_unsigned(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index, void *exts,
358 unsigned long int attr_value, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200359{
360 char *str;
361
Radek Krejci1deb5be2020-08-26 16:43:36 +0200362 if (asprintf(&str, "%lu", attr_value) == -1) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100363 LOGMEM(pctx->module->ctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200364 return;
365 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100366 ypr_open(pctx->out, flag);
367 ypr_substmt(pctx, substmt, substmt_index, str, exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200368 free(str);
369}
370
371static void
Michal Vasko9a9e4e72022-03-21 10:05:11 +0100372ypr_signed(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index, void *exts, signed long int attr_value,
373 ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200374{
375 char *str;
376
Radek Krejci1deb5be2020-08-26 16:43:36 +0200377 if (asprintf(&str, "%ld", attr_value) == -1) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100378 LOGMEM(pctx->module->ctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200379 return;
380 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100381 ypr_open(pctx->out, flag);
382 ypr_substmt(pctx, substmt, substmt_index, str, exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200383 free(str);
384}
385
386static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100387yprp_revision(struct lys_ypr_ctx *pctx, const struct lysp_revision *rev)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200388{
389 if (rev->dsc || rev->ref || rev->exts) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100390 ly_print_(pctx->out, "%*srevision %s {\n", INDENT, rev->date);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200391 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200392 yprp_extension_instances(pctx, LY_STMT_REVISION, 0, rev->exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100393 ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, rev->dsc, rev->exts);
394 ypr_substmt(pctx, LY_STMT_REFERENCE, 0, rev->ref, rev->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200395 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100396 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200397 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100398 ly_print_(pctx->out, "%*srevision %s;\n", INDENT, rev->date);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200399 }
400}
401
402static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100403ypr_mandatory(struct lys_ypr_ctx *pctx, uint16_t flags, void *exts, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200404{
405 if (flags & LYS_MAND_MASK) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100406 ypr_open(pctx->out, flag);
407 ypr_substmt(pctx, LY_STMT_MANDATORY, 0, (flags & LYS_MAND_TRUE) ? "true" : "false", exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200408 }
409}
410
411static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100412ypr_config(struct lys_ypr_ctx *pctx, uint16_t flags, void *exts, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200413{
414 if (flags & LYS_CONFIG_MASK) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100415 ypr_open(pctx->out, flag);
416 ypr_substmt(pctx, LY_STMT_CONFIG, 0, (flags & LYS_CONFIG_W) ? "true" : "false", exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200417 }
418}
419
420static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100421ypr_status(struct lys_ypr_ctx *pctx, uint16_t flags, void *exts, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200422{
423 const char *status = NULL;
424
425 if (flags & LYS_STATUS_CURR) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100426 ypr_open(pctx->out, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200427 status = "current";
428 } else if (flags & LYS_STATUS_DEPRC) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100429 ypr_open(pctx->out, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200430 status = "deprecated";
431 } else if (flags & LYS_STATUS_OBSLT) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100432 ypr_open(pctx->out, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200433 status = "obsolete";
434 }
Radek Krejci693262f2019-04-29 15:23:20 +0200435
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100436 ypr_substmt(pctx, LY_STMT_STATUS, 0, status, exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200437}
438
439static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100440ypr_description(struct lys_ypr_ctx *pctx, const char *dsc, void *exts, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200441{
442 if (dsc) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100443 ypr_open(pctx->out, flag);
444 ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, dsc, exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200445 }
446}
447
448static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100449ypr_reference(struct lys_ypr_ctx *pctx, const char *ref, void *exts, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200450{
451 if (ref) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100452 ypr_open(pctx->out, flag);
453 ypr_substmt(pctx, LY_STMT_REFERENCE, 0, ref, exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200454 }
455}
456
457static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100458yprp_iffeatures(struct lys_ypr_ctx *pctx, struct lysp_qname *iffs, struct lysp_ext_instance *exts, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200459{
Michal Vaskob26d09d2022-08-22 09:52:19 +0200460 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +0200461 ly_bool extflag;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200462
Michal Vasko7f45cf22020-10-01 12:49:44 +0200463 LY_ARRAY_FOR(iffs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100464 ypr_open(pctx->out, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200465 extflag = 0;
466
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100467 ly_print_(pctx->out, "%*sif-feature \"%s\"", INDENT, iffs[u].str);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200468
469 /* extensions */
470 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200471 yprp_extension_instances(pctx, LY_STMT_IF_FEATURE, u, exts, &extflag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200472 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100473 ypr_close(pctx, extflag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200474 }
475}
476
477static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100478yprp_extension(struct lys_ypr_ctx *pctx, const struct lysp_ext *ext)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200479{
Radek Krejci857189e2020-09-01 13:26:36 +0200480 ly_bool flag = 0, flag2 = 0;
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200481 LY_ARRAY_COUNT_TYPE u;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200482
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100483 ly_print_(pctx->out, "%*sextension %s", INDENT, ext->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200484 LEVEL++;
485
Michal Vaskob26d09d2022-08-22 09:52:19 +0200486 yprp_extension_instances(pctx, LY_STMT_EXTENSION, 0, ext->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200487
Radek Krejci9f87b0c2021-03-05 14:45:26 +0100488 if (ext->argname) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100489 ypr_open(pctx->out, &flag);
490 ly_print_(pctx->out, "%*sargument %s", INDENT, ext->argname);
Radek Krejci38d2e9f2019-09-09 10:31:51 +0200491 LEVEL++;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200492 if (ext->exts) {
Radek Krejci7eb54ba2020-05-18 16:30:04 +0200493 u = -1;
Radek Krejcifc596f92021-02-26 22:40:26 +0100494 while ((u = lysp_ext_instance_iter(ext->exts, u + 1, LY_STMT_ARGUMENT)) != LY_ARRAY_COUNT(ext->exts)) {
Michal Vaskob26d09d2022-08-22 09:52:19 +0200495 yprp_extension_instance(pctx, LY_STMT_ARGUMENT, 0, &ext->exts[u], &flag2);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200496 }
Radek Krejcid3ca0632019-04-16 16:54:54 +0200497 }
498 if ((ext->flags & LYS_YINELEM_MASK) ||
Radek Krejcifc596f92021-02-26 22:40:26 +0100499 (ext->exts && (lysp_ext_instance_iter(ext->exts, 0, LY_STMT_YIN_ELEMENT) != LY_ARRAY_COUNT(ext->exts)))) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100500 ypr_open(pctx->out, &flag2);
501 ypr_substmt(pctx, LY_STMT_YIN_ELEMENT, 0, (ext->flags & LYS_YINELEM_TRUE) ? "true" : "false", ext->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200502 }
Radek Krejci38d2e9f2019-09-09 10:31:51 +0200503 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100504 ypr_close(pctx, flag2);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200505 }
506
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100507 ypr_status(pctx, ext->flags, ext->exts, &flag);
508 ypr_description(pctx, ext->dsc, ext->exts, &flag);
509 ypr_reference(pctx, ext->ref, ext->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200510
511 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100512 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200513}
514
515static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100516yprp_feature(struct lys_ypr_ctx *pctx, const struct lysp_feature *feat)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200517{
Radek Krejci857189e2020-09-01 13:26:36 +0200518 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200519
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100520 ly_print_(pctx->out, "%*sfeature %s", INDENT, feat->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200521 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200522 yprp_extension_instances(pctx, LY_STMT_FEATURE, 0, feat->exts, &flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100523 yprp_iffeatures(pctx, feat->iffeatures, feat->exts, &flag);
524 ypr_status(pctx, feat->flags, feat->exts, &flag);
525 ypr_description(pctx, feat->dsc, feat->exts, &flag);
526 ypr_reference(pctx, feat->ref, feat->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200527 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100528 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200529}
530
531static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100532yprp_identity(struct lys_ypr_ctx *pctx, const struct lysp_ident *ident)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200533{
Radek Krejci857189e2020-09-01 13:26:36 +0200534 ly_bool flag = 0;
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200535 LY_ARRAY_COUNT_TYPE u;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200536
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100537 ly_print_(pctx->out, "%*sidentity %s", INDENT, ident->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200538 LEVEL++;
539
Michal Vaskob26d09d2022-08-22 09:52:19 +0200540 yprp_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100541 yprp_iffeatures(pctx, ident->iffeatures, ident->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200542
543 LY_ARRAY_FOR(ident->bases, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100544 ypr_open(pctx->out, &flag);
545 ypr_substmt(pctx, LY_STMT_BASE, u, ident->bases[u], ident->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200546 }
547
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100548 ypr_status(pctx, ident->flags, ident->exts, &flag);
549 ypr_description(pctx, ident->dsc, ident->exts, &flag);
550 ypr_reference(pctx, ident->ref, ident->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200551
552 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100553 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200554}
555
556static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100557yprc_identity(struct lys_ypr_ctx *pctx, const struct lysc_ident *ident)
Radek Krejci693262f2019-04-29 15:23:20 +0200558{
Radek Krejci857189e2020-09-01 13:26:36 +0200559 ly_bool flag = 0;
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200560 LY_ARRAY_COUNT_TYPE u;
Radek Krejci693262f2019-04-29 15:23:20 +0200561
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100562 ly_print_(pctx->out, "%*sidentity %s", INDENT, ident->name);
Radek Krejci693262f2019-04-29 15:23:20 +0200563 LEVEL++;
564
Michal Vaskob26d09d2022-08-22 09:52:19 +0200565 yprc_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200566
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100567 ypr_open(pctx->out, &flag);
aPiecekf4a0a192021-08-03 15:14:17 +0200568 if (lys_identity_iffeature_value(ident) == LY_ENOT) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100569 ly_print_(pctx->out, "%*s/* identity \"%s\" is disabled by if-feature(s) */\n", INDENT, ident->name);
aPiecekf4a0a192021-08-03 15:14:17 +0200570 }
571
Radek Krejci693262f2019-04-29 15:23:20 +0200572 LY_ARRAY_FOR(ident->derived, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100573 if (pctx->module != ident->derived[u]->module) {
574 ly_print_(pctx->out, "%*sderived %s:%s;\n", INDENT, ident->derived[u]->module->prefix, ident->derived[u]->name);
Radek Krejci693262f2019-04-29 15:23:20 +0200575 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100576 ly_print_(pctx->out, "%*sderived %s;\n", INDENT, ident->derived[u]->name);
Radek Krejci693262f2019-04-29 15:23:20 +0200577 }
578 }
579
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100580 ypr_status(pctx, ident->flags, ident->exts, &flag);
581 ypr_description(pctx, ident->dsc, ident->exts, &flag);
582 ypr_reference(pctx, ident->ref, ident->exts, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200583
584 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100585 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200586}
587
588static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100589yprp_restr(struct lys_ypr_ctx *pctx, const struct lysp_restr *restr, enum ly_stmt stmt, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200590{
Michal Vasko9a9e4e72022-03-21 10:05:11 +0100591 ly_bool inner_flag = 0, singleline;
592 const char *text;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200593
594 if (!restr) {
595 return;
596 }
597
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100598 ypr_open(pctx->out, flag);
Michal Vasko9a9e4e72022-03-21 10:05:11 +0100599 text = ((restr->arg.str[0] != LYSP_RESTR_PATTERN_NACK) && (restr->arg.str[0] != LYSP_RESTR_PATTERN_ACK)) ?
600 restr->arg.str : restr->arg.str + 1;
601 singleline = strchr(text, '\n') ? 0 : 1;
Michal Vasko193dacd2022-10-13 08:43:05 +0200602 ypr_text(pctx, lyplg_ext_stmt2str(stmt), text, singleline, 0);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200603
604 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200605 yprp_extension_instances(pctx, stmt, 0, restr->exts, &inner_flag);
Radek Krejcif13b87b2020-12-01 22:02:17 +0100606 if (restr->arg.str[0] == LYSP_RESTR_PATTERN_NACK) {
Radek Krejcid3ca0632019-04-16 16:54:54 +0200607 /* special byte value in pattern's expression: 0x15 - invert-match, 0x06 - match */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100608 ypr_open(pctx->out, &inner_flag);
609 ypr_substmt(pctx, LY_STMT_MODIFIER, 0, "invert-match", restr->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200610 }
611 if (restr->emsg) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100612 ypr_open(pctx->out, &inner_flag);
613 ypr_substmt(pctx, LY_STMT_ERROR_MESSAGE, 0, restr->emsg, restr->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200614 }
615 if (restr->eapptag) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100616 ypr_open(pctx->out, &inner_flag);
617 ypr_substmt(pctx, LY_STMT_ERROR_APP_TAG, 0, restr->eapptag, restr->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200618 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100619 ypr_description(pctx, restr->dsc, restr->exts, &inner_flag);
620 ypr_reference(pctx, restr->ref, restr->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200621
Radek Krejcid3ca0632019-04-16 16:54:54 +0200622 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100623 ypr_close(pctx, inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200624}
625
626static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100627yprc_must(struct lys_ypr_ctx *pctx, const struct lysc_must *must, ly_bool *flag)
Radek Krejci693262f2019-04-29 15:23:20 +0200628{
Radek Krejci857189e2020-09-01 13:26:36 +0200629 ly_bool inner_flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +0200630
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100631 ypr_open(pctx->out, flag);
632 ly_print_(pctx->out, "%*smust \"", INDENT);
633 ypr_encode(pctx->out, must->cond->expr, -1);
634 ly_print_(pctx->out, "\"");
Radek Krejci693262f2019-04-29 15:23:20 +0200635
636 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200637 yprc_extension_instances(pctx, LY_STMT_MUST, 0, must->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200638 if (must->emsg) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100639 ypr_open(pctx->out, &inner_flag);
640 ypr_substmt(pctx, LY_STMT_ERROR_MESSAGE, 0, must->emsg, must->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200641 }
642 if (must->eapptag) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100643 ypr_open(pctx->out, &inner_flag);
644 ypr_substmt(pctx, LY_STMT_ERROR_APP_TAG, 0, must->eapptag, must->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200645 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100646 ypr_description(pctx, must->dsc, must->exts, &inner_flag);
647 ypr_reference(pctx, must->ref, must->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200648
649 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100650 ypr_close(pctx, inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200651}
652
653static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100654yprc_range(struct lys_ypr_ctx *pctx, const struct lysc_range *range, LY_DATA_TYPE basetype, ly_bool *flag)
Radek Krejci693262f2019-04-29 15:23:20 +0200655{
Radek Krejci857189e2020-09-01 13:26:36 +0200656 ly_bool inner_flag = 0;
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200657 LY_ARRAY_COUNT_TYPE u;
Radek Krejci693262f2019-04-29 15:23:20 +0200658
Radek Krejci334ccc72019-06-12 13:49:29 +0200659 if (!range) {
660 return;
661 }
662
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100663 ypr_open(pctx->out, flag);
664 ly_print_(pctx->out, "%*s%s \"", INDENT, (basetype == LY_TYPE_STRING || basetype == LY_TYPE_BINARY) ? "length" : "range");
Radek Krejci693262f2019-04-29 15:23:20 +0200665 LY_ARRAY_FOR(range->parts, u) {
666 if (u > 0) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100667 ly_print_(pctx->out, " | ");
Radek Krejci693262f2019-04-29 15:23:20 +0200668 }
669 if (range->parts[u].max_64 == range->parts[u].min_64) {
670 if (basetype <= LY_TYPE_STRING) { /* unsigned values */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100671 ly_print_(pctx->out, "%" PRIu64, range->parts[u].max_u64);
Radek Krejci693262f2019-04-29 15:23:20 +0200672 } else { /* signed values */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100673 ly_print_(pctx->out, "%" PRId64, range->parts[u].max_64);
Radek Krejci693262f2019-04-29 15:23:20 +0200674 }
675 } else {
676 if (basetype <= LY_TYPE_STRING) { /* unsigned values */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100677 ly_print_(pctx->out, "%" PRIu64 "..%" PRIu64, range->parts[u].min_u64, range->parts[u].max_u64);
Radek Krejci693262f2019-04-29 15:23:20 +0200678 } else { /* signed values */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100679 ly_print_(pctx->out, "%" PRId64 "..%" PRId64, range->parts[u].min_64, range->parts[u].max_64);
Radek Krejci693262f2019-04-29 15:23:20 +0200680 }
681 }
682 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100683 ly_print_(pctx->out, "\"");
Radek Krejci693262f2019-04-29 15:23:20 +0200684
685 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200686 yprc_extension_instances(pctx, LY_STMT_RANGE, 0, range->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200687 if (range->emsg) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100688 ypr_open(pctx->out, &inner_flag);
689 ypr_substmt(pctx, LY_STMT_ERROR_MESSAGE, 0, range->emsg, range->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200690 }
691 if (range->eapptag) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100692 ypr_open(pctx->out, &inner_flag);
693 ypr_substmt(pctx, LY_STMT_ERROR_APP_TAG, 0, range->eapptag, range->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200694 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100695 ypr_description(pctx, range->dsc, range->exts, &inner_flag);
696 ypr_reference(pctx, range->ref, range->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200697
698 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100699 ypr_close(pctx, inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200700}
701
702static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100703yprc_pattern(struct lys_ypr_ctx *pctx, const struct lysc_pattern *pattern, ly_bool *flag)
Radek Krejci693262f2019-04-29 15:23:20 +0200704{
Radek Krejci857189e2020-09-01 13:26:36 +0200705 ly_bool inner_flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +0200706
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100707 ypr_open(pctx->out, flag);
708 ly_print_(pctx->out, "%*spattern \"", INDENT);
709 ypr_encode(pctx->out, pattern->expr, -1);
710 ly_print_(pctx->out, "\"");
Radek Krejci693262f2019-04-29 15:23:20 +0200711
712 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200713 yprc_extension_instances(pctx, LY_STMT_PATTERN, 0, pattern->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200714 if (pattern->inverted) {
715 /* special byte value in pattern's expression: 0x15 - invert-match, 0x06 - match */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100716 ypr_open(pctx->out, &inner_flag);
717 ypr_substmt(pctx, LY_STMT_MODIFIER, 0, "invert-match", pattern->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200718 }
719 if (pattern->emsg) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100720 ypr_open(pctx->out, &inner_flag);
721 ypr_substmt(pctx, LY_STMT_ERROR_MESSAGE, 0, pattern->emsg, pattern->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200722 }
723 if (pattern->eapptag) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100724 ypr_open(pctx->out, &inner_flag);
725 ypr_substmt(pctx, LY_STMT_ERROR_APP_TAG, 0, pattern->eapptag, pattern->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200726 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100727 ypr_description(pctx, pattern->dsc, pattern->exts, &inner_flag);
728 ypr_reference(pctx, pattern->ref, pattern->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200729
730 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100731 ypr_close(pctx, inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200732}
733
734static void
Michal Vaskoa0ba01e2022-10-19 13:26:57 +0200735yprc_bits_enum(struct lys_ypr_ctx *pctx, const struct lysc_type_bitenum_item *items, LY_DATA_TYPE basetype, ly_bool *flag)
736{
737 LY_ARRAY_COUNT_TYPE u;
738 const struct lysc_type_bitenum_item *item;
739 ly_bool inner_flag;
740
741 assert((basetype == LY_TYPE_BITS) || (basetype == LY_TYPE_ENUM));
742
743 LY_ARRAY_FOR(items, u) {
744 item = &items[u];
745 inner_flag = 0;
746
747 ypr_open(pctx->out, flag);
748 ly_print_(pctx->out, "%*s%s \"", INDENT, basetype == LY_TYPE_BITS ? "bit" : "enum");
749 ypr_encode(pctx->out, item->name, -1);
750 ly_print_(pctx->out, "\"");
751 LEVEL++;
752 if (basetype == LY_TYPE_BITS) {
753 yprc_extension_instances(pctx, LY_STMT_BIT, 0, item->exts, &inner_flag);
754 ypr_unsigned(pctx, LY_STMT_POSITION, 0, item->exts, item->position, &inner_flag);
755 } else { /* LY_TYPE_ENUM */
756 yprc_extension_instances(pctx, LY_STMT_ENUM, 0, item->exts, &inner_flag);
757 ypr_signed(pctx, LY_STMT_VALUE, 0, item->exts, item->value, &inner_flag);
758 }
759 ypr_status(pctx, item->flags, item->exts, &inner_flag);
760 ypr_description(pctx, item->dsc, item->exts, &inner_flag);
761 ypr_reference(pctx, item->ref, item->exts, &inner_flag);
762 LEVEL--;
763 ypr_close(pctx, inner_flag);
764 }
765}
766
767static void
768yprp_when(struct lys_ypr_ctx *pctx, const struct lysp_when *when, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200769{
Radek Krejci857189e2020-09-01 13:26:36 +0200770 ly_bool inner_flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200771
772 if (!when) {
773 return;
774 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100775 ypr_open(pctx->out, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200776
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100777 ly_print_(pctx->out, "%*swhen \"", INDENT);
778 ypr_encode(pctx->out, when->cond, -1);
779 ly_print_(pctx->out, "\"");
Radek Krejcid3ca0632019-04-16 16:54:54 +0200780
781 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200782 yprp_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100783 ypr_description(pctx, when->dsc, when->exts, &inner_flag);
784 ypr_reference(pctx, when->ref, when->exts, &inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200785 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100786 ypr_close(pctx, inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200787}
788
789static void
Michal Vaskoa0ba01e2022-10-19 13:26:57 +0200790yprc_when(struct lys_ypr_ctx *pctx, const struct lysc_when *when, ly_bool *flag)
Radek Krejci693262f2019-04-29 15:23:20 +0200791{
Radek Krejci857189e2020-09-01 13:26:36 +0200792 ly_bool inner_flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +0200793
794 if (!when) {
795 return;
796 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100797 ypr_open(pctx->out, flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200798
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100799 ly_print_(pctx->out, "%*swhen \"", INDENT);
800 ypr_encode(pctx->out, when->cond->expr, -1);
801 ly_print_(pctx->out, "\"");
Radek Krejci693262f2019-04-29 15:23:20 +0200802
803 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200804 yprc_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100805 ypr_description(pctx, when->dsc, when->exts, &inner_flag);
806 ypr_reference(pctx, when->ref, when->exts, &inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200807 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100808 ypr_close(pctx, inner_flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200809}
810
811static void
Michal Vaskoa0ba01e2022-10-19 13:26:57 +0200812yprp_bits_enum(struct lys_ypr_ctx *pctx, const struct lysp_type_enum *items, LY_DATA_TYPE type, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200813{
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200814 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +0200815 ly_bool inner_flag;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200816
817 LY_ARRAY_FOR(items, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100818 ypr_open(pctx->out, flag);
Radek Krejci7871ce52019-06-11 16:44:56 +0200819 if (type == LY_TYPE_BITS) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100820 ly_print_(pctx->out, "%*sbit %s", INDENT, items[u].name);
Radek Krejci7871ce52019-06-11 16:44:56 +0200821 } else { /* LY_TYPE_ENUM */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100822 ly_print_(pctx->out, "%*senum \"", INDENT);
823 ypr_encode(pctx->out, items[u].name, -1);
824 ly_print_(pctx->out, "\"");
Radek Krejci7871ce52019-06-11 16:44:56 +0200825 }
Radek Krejcid3ca0632019-04-16 16:54:54 +0200826 inner_flag = 0;
827 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +0200828 yprp_extension_instances(pctx, LY_STMT_ENUM, 0, items[u].exts, &inner_flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100829 yprp_iffeatures(pctx, items[u].iffeatures, items[u].exts, &inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200830 if (items[u].flags & LYS_SET_VALUE) {
831 if (type == LY_TYPE_BITS) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100832 ypr_unsigned(pctx, LY_STMT_POSITION, 0, items[u].exts, items[u].value, &inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200833 } else { /* LY_TYPE_ENUM */
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100834 ypr_signed(pctx, LY_STMT_VALUE, 0, items[u].exts, items[u].value, &inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200835 }
836 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100837 ypr_status(pctx, items[u].flags, items[u].exts, &inner_flag);
838 ypr_description(pctx, items[u].dsc, items[u].exts, &inner_flag);
839 ypr_reference(pctx, items[u].ref, items[u].exts, &inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200840 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100841 ypr_close(pctx, inner_flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200842 }
843}
844
845static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100846yprp_type(struct lys_ypr_ctx *pctx, const struct lysp_type *type)
Radek Krejcid3ca0632019-04-16 16:54:54 +0200847{
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200848 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +0200849 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +0200850
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100851 ly_print_(pctx->out, "%*stype %s", INDENT, type->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200852 LEVEL++;
853
Michal Vaskob26d09d2022-08-22 09:52:19 +0200854 yprp_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200855
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100856 yprp_restr(pctx, type->range, LY_STMT_RANGE, &flag);
857 yprp_restr(pctx, type->length, LY_STMT_LENGTH, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200858 LY_ARRAY_FOR(type->patterns, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100859 yprp_restr(pctx, &type->patterns[u], LY_STMT_PATTERN, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200860 }
Michal Vaskoa0ba01e2022-10-19 13:26:57 +0200861 yprp_bits_enum(pctx, type->bits, LY_TYPE_BITS, &flag);
862 yprp_bits_enum(pctx, type->enums, LY_TYPE_ENUM, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200863
864 if (type->path) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100865 ypr_open(pctx->out, &flag);
866 ypr_substmt(pctx, LY_STMT_PATH, 0, type->path->expr, type->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200867 }
868 if (type->flags & LYS_SET_REQINST) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100869 ypr_open(pctx->out, &flag);
870 ypr_substmt(pctx, LY_STMT_REQUIRE_INSTANCE, 0, type->require_instance ? "true" : "false", type->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200871 }
872 if (type->flags & LYS_SET_FRDIGITS) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100873 ypr_unsigned(pctx, LY_STMT_FRACTION_DIGITS, 0, type->exts, type->fraction_digits, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200874 }
875 LY_ARRAY_FOR(type->bases, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100876 ypr_open(pctx->out, &flag);
877 ypr_substmt(pctx, LY_STMT_BASE, u, type->bases[u], type->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200878 }
879 LY_ARRAY_FOR(type->types, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100880 ypr_open(pctx->out, &flag);
881 yprp_type(pctx, &type->types[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200882 }
883
884 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100885 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +0200886}
887
888static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100889yprc_dflt_value(struct lys_ypr_ctx *pctx, const struct ly_ctx *ly_pctx, const struct lyd_value *value,
Radek Krejci224d4b42021-04-23 13:54:59 +0200890 struct lysc_ext_instance *exts)
Radek Krejcia1911222019-07-22 17:24:50 +0200891{
Radek Krejci857189e2020-09-01 13:26:36 +0200892 ly_bool dynamic;
Radek Krejcia1911222019-07-22 17:24:50 +0200893 const char *str;
894
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100895 str = value->realtype->plugin->print(ly_pctx, value, LY_VALUE_JSON, NULL, &dynamic, NULL);
896 ypr_substmt(pctx, LY_STMT_DEFAULT, 0, str, exts);
Radek Krejcia1911222019-07-22 17:24:50 +0200897 if (dynamic) {
Michal Vasko22df3f02020-08-24 13:29:22 +0200898 free((void *)str);
Radek Krejcia1911222019-07-22 17:24:50 +0200899 }
900}
901
902static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100903yprc_type(struct lys_ypr_ctx *pctx, const struct lysc_type *type)
Radek Krejci693262f2019-04-29 15:23:20 +0200904{
Michal Vaskofd69e1d2020-07-03 11:57:17 +0200905 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +0200906 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +0200907
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100908 ly_print_(pctx->out, "%*stype %s", INDENT, lys_datatype2str(type->basetype));
Radek Krejci693262f2019-04-29 15:23:20 +0200909 LEVEL++;
910
Michal Vaskob26d09d2022-08-22 09:52:19 +0200911 yprc_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200912
Michal Vasko2bb55bc2020-08-05 13:27:04 +0200913 switch (type->basetype) {
Radek Krejci693262f2019-04-29 15:23:20 +0200914 case LY_TYPE_BINARY: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200915 struct lysc_type_bin *bin = (struct lysc_type_bin *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200916
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100917 yprc_range(pctx, bin->length, type->basetype, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200918 break;
919 }
920 case LY_TYPE_UINT8:
921 case LY_TYPE_UINT16:
922 case LY_TYPE_UINT32:
923 case LY_TYPE_UINT64:
924 case LY_TYPE_INT8:
925 case LY_TYPE_INT16:
926 case LY_TYPE_INT32:
927 case LY_TYPE_INT64: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200928 struct lysc_type_num *num = (struct lysc_type_num *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200929
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100930 yprc_range(pctx, num->range, type->basetype, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200931 break;
932 }
933 case LY_TYPE_STRING: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200934 struct lysc_type_str *str = (struct lysc_type_str *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200935
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100936 yprc_range(pctx, str->length, type->basetype, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200937 LY_ARRAY_FOR(str->patterns, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100938 yprc_pattern(pctx, str->patterns[u], &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200939 }
940 break;
941 }
942 case LY_TYPE_BITS:
943 case LY_TYPE_ENUM: {
944 /* bits and enums structures are compatible */
Michal Vasko22df3f02020-08-24 13:29:22 +0200945 struct lysc_type_bits *bits = (struct lysc_type_bits *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200946
Michal Vaskoa0ba01e2022-10-19 13:26:57 +0200947 yprc_bits_enum(pctx, bits->bits, type->basetype, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200948 break;
949 }
950 case LY_TYPE_BOOL:
951 case LY_TYPE_EMPTY:
952 /* nothing to do */
953 break;
954 case LY_TYPE_DEC64: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200955 struct lysc_type_dec *dec = (struct lysc_type_dec *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200956
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100957 ypr_open(pctx->out, &flag);
958 ypr_unsigned(pctx, LY_STMT_FRACTION_DIGITS, 0, type->exts, dec->fraction_digits, &flag);
959 yprc_range(pctx, dec->range, dec->basetype, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +0200960 break;
961 }
962 case LY_TYPE_IDENT: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200963 struct lysc_type_identityref *ident = (struct lysc_type_identityref *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200964
Radek Krejci693262f2019-04-29 15:23:20 +0200965 LY_ARRAY_FOR(ident->bases, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100966 ypr_open(pctx->out, &flag);
967 ypr_substmt(pctx, LY_STMT_BASE, u, ident->bases[u]->name, type->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200968 }
969 break;
970 }
971 case LY_TYPE_INST: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200972 struct lysc_type_instanceid *inst = (struct lysc_type_instanceid *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200973
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100974 ypr_open(pctx->out, &flag);
975 ypr_substmt(pctx, LY_STMT_REQUIRE_INSTANCE, 0, inst->require_instance ? "true" : "false", inst->exts);
Radek Krejci693262f2019-04-29 15:23:20 +0200976 break;
977 }
978 case LY_TYPE_LEAFREF: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200979 struct lysc_type_leafref *lr = (struct lysc_type_leafref *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200980
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100981 ypr_open(pctx->out, &flag);
982 ypr_substmt(pctx, LY_STMT_PATH, 0, lr->path->expr, lr->exts);
983 ypr_substmt(pctx, LY_STMT_REQUIRE_INSTANCE, 0, lr->require_instance ? "true" : "false", lr->exts);
984 yprc_type(pctx, lr->realtype);
Radek Krejci693262f2019-04-29 15:23:20 +0200985 break;
986 }
987 case LY_TYPE_UNION: {
Michal Vasko22df3f02020-08-24 13:29:22 +0200988 struct lysc_type_union *un = (struct lysc_type_union *)type;
Michal Vasko26bbb272022-08-02 14:54:33 +0200989
Radek Krejci693262f2019-04-29 15:23:20 +0200990 LY_ARRAY_FOR(un->types, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100991 ypr_open(pctx->out, &flag);
992 yprc_type(pctx, un->types[u]);
Radek Krejci693262f2019-04-29 15:23:20 +0200993 }
994 break;
995 }
996 default:
Michal Vasko61ad1ff2022-02-10 15:48:39 +0100997 LOGINT(pctx->module->ctx);
Radek Krejci693262f2019-04-29 15:23:20 +0200998 }
999
1000 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001001 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001002}
1003
1004static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001005yprp_typedef(struct lys_ypr_ctx *pctx, const struct lysp_tpdf *tpdf)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001006{
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001007 ly_print_(pctx->out, "%*stypedef %s {\n", INDENT, tpdf->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001008 LEVEL++;
1009
Michal Vaskob26d09d2022-08-22 09:52:19 +02001010 yprp_extension_instances(pctx, LY_STMT_TYPEDEF, 0, tpdf->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001011
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001012 yprp_type(pctx, &tpdf->type);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001013
1014 if (tpdf->units) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001015 ypr_substmt(pctx, LY_STMT_UNITS, 0, tpdf->units, tpdf->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001016 }
Michal Vasko7f45cf22020-10-01 12:49:44 +02001017 if (tpdf->dflt.str) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001018 ypr_substmt(pctx, LY_STMT_DEFAULT, 0, tpdf->dflt.str, tpdf->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001019 }
1020
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001021 ypr_status(pctx, tpdf->flags, tpdf->exts, NULL);
1022 ypr_description(pctx, tpdf->dsc, tpdf->exts, NULL);
1023 ypr_reference(pctx, tpdf->ref, tpdf->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001024
1025 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001026 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001027}
1028
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001029static void yprp_node(struct lys_ypr_ctx *pctx, const struct lysp_node *node);
1030static void yprc_node(struct lys_ypr_ctx *pctx, const struct lysc_node *node);
1031static void yprp_action(struct lys_ypr_ctx *pctx, const struct lysp_node_action *action);
1032static void yprp_notification(struct lys_ypr_ctx *pctx, const struct lysp_node_notif *notif);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001033
1034static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001035yprp_grouping(struct lys_ypr_ctx *pctx, const struct lysp_node_grp *grp)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001036{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001037 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001038 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001039 struct lysp_node *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001040 struct lysp_node_action *action;
1041 struct lysp_node_notif *notif;
1042 struct lysp_node_grp *subgrp;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001043
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001044 ly_print_(pctx->out, "%*sgrouping %s", INDENT, grp->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001045 LEVEL++;
1046
Michal Vaskob26d09d2022-08-22 09:52:19 +02001047 yprp_extension_instances(pctx, LY_STMT_GROUPING, 0, grp->exts, &flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001048 ypr_status(pctx, grp->flags, grp->exts, &flag);
1049 ypr_description(pctx, grp->dsc, grp->exts, &flag);
1050 ypr_reference(pctx, grp->ref, grp->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001051
1052 LY_ARRAY_FOR(grp->typedefs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001053 ypr_open(pctx->out, &flag);
1054 yprp_typedef(pctx, &grp->typedefs[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001055 }
1056
Radek Krejci2a9fc652021-01-22 17:44:34 +01001057 LY_LIST_FOR(grp->groupings, subgrp) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001058 ypr_open(pctx->out, &flag);
1059 yprp_grouping(pctx, subgrp);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001060 }
1061
Radek Krejci01180ac2021-01-27 08:48:22 +01001062 LY_LIST_FOR(grp->child, data) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001063 ypr_open(pctx->out, &flag);
1064 yprp_node(pctx, data);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001065 }
1066
Radek Krejci2a9fc652021-01-22 17:44:34 +01001067 LY_LIST_FOR(grp->actions, action) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001068 ypr_open(pctx->out, &flag);
1069 yprp_action(pctx, action);
Radek Krejci2a9fc652021-01-22 17:44:34 +01001070 }
1071
1072 LY_LIST_FOR(grp->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001073 ypr_open(pctx->out, &flag);
1074 yprp_notification(pctx, notif);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001075 }
1076
1077 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001078 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001079}
1080
1081static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001082yprp_inout(struct lys_ypr_ctx *pctx, const struct lysp_node_action_inout *inout, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001083{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001084 LY_ARRAY_COUNT_TYPE u;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001085 struct lysp_node *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001086 struct lysp_node_grp *grp;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001087
Radek Krejci01180ac2021-01-27 08:48:22 +01001088 if (!inout->child) {
Michal Vasko7f45cf22020-10-01 12:49:44 +02001089 /* no children */
Radek Krejcid3ca0632019-04-16 16:54:54 +02001090 return;
1091 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001092 ypr_open(pctx->out, flag);
1093 YPR_EXTRA_LINE_PRINT(pctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001094
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001095 ly_print_(pctx->out, "%*s%s {\n", INDENT, inout->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001096 LEVEL++;
1097
Michal Vaskob26d09d2022-08-22 09:52:19 +02001098 yprp_extension_instances(pctx, LY_STMT_MUST, 0, inout->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001099 LY_ARRAY_FOR(inout->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001100 yprp_restr(pctx, &inout->musts[u], LY_STMT_MUST, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001101 }
1102 LY_ARRAY_FOR(inout->typedefs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001103 yprp_typedef(pctx, &inout->typedefs[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001104 }
Radek Krejci2a9fc652021-01-22 17:44:34 +01001105 LY_LIST_FOR(inout->groupings, grp) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001106 yprp_grouping(pctx, grp);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001107 }
1108
Radek Krejci01180ac2021-01-27 08:48:22 +01001109 LY_LIST_FOR(inout->child, data) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001110 yprp_node(pctx, data);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001111 }
1112
1113 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001114 ypr_close(pctx, 1);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001115}
1116
1117static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001118yprc_inout(struct lys_ypr_ctx *pctx, const struct lysc_node_action_inout *inout, ly_bool *flag)
Radek Krejci693262f2019-04-29 15:23:20 +02001119{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001120 LY_ARRAY_COUNT_TYPE u;
Radek Krejci693262f2019-04-29 15:23:20 +02001121 struct lysc_node *data;
1122
Radek Krejci01180ac2021-01-27 08:48:22 +01001123 if (!inout->child) {
Radek Krejci693262f2019-04-29 15:23:20 +02001124 /* input/output is empty */
1125 return;
1126 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001127 ypr_open(pctx->out, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001128
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001129 ly_print_(pctx->out, "\n%*s%s {\n", INDENT, inout->name);
Radek Krejci693262f2019-04-29 15:23:20 +02001130 LEVEL++;
1131
Michal Vasko193dacd2022-10-13 08:43:05 +02001132 yprc_extension_instances(pctx, lyplg_ext_nodetype2stmt(inout->nodetype), 0, inout->exts, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001133 LY_ARRAY_FOR(inout->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001134 yprc_must(pctx, &inout->musts[u], NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001135 }
1136
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001137 if (!(pctx->options & LYS_PRINT_NO_SUBSTMT)) {
Radek Krejci01180ac2021-01-27 08:48:22 +01001138 LY_LIST_FOR(inout->child, data) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001139 yprc_node(pctx, data);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001140 }
Radek Krejci693262f2019-04-29 15:23:20 +02001141 }
1142
1143 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001144 ypr_close(pctx, 1);
Radek Krejci693262f2019-04-29 15:23:20 +02001145}
1146
1147static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001148yprp_notification(struct lys_ypr_ctx *pctx, const struct lysp_node_notif *notif)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001149{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001150 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001151 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001152 struct lysp_node *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001153 struct lysp_node_grp *grp;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001154
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001155 ly_print_(pctx->out, "%*snotification %s", INDENT, notif->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001156
1157 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +02001158 yprp_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001159 yprp_iffeatures(pctx, notif->iffeatures, notif->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001160
1161 LY_ARRAY_FOR(notif->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001162 yprp_restr(pctx, &notif->musts[u], LY_STMT_MUST, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001163 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001164 ypr_status(pctx, notif->flags, notif->exts, &flag);
1165 ypr_description(pctx, notif->dsc, notif->exts, &flag);
1166 ypr_reference(pctx, notif->ref, notif->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001167
1168 LY_ARRAY_FOR(notif->typedefs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001169 ypr_open(pctx->out, &flag);
1170 yprp_typedef(pctx, &notif->typedefs[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001171 }
1172
Radek Krejci2a9fc652021-01-22 17:44:34 +01001173 LY_LIST_FOR(notif->groupings, grp) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001174 ypr_open(pctx->out, &flag);
1175 yprp_grouping(pctx, grp);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001176 }
1177
Radek Krejci01180ac2021-01-27 08:48:22 +01001178 LY_LIST_FOR(notif->child, data) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001179 ypr_open(pctx->out, &flag);
1180 yprp_node(pctx, data);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001181 }
1182
1183 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001184 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001185}
1186
1187static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001188yprc_notification(struct lys_ypr_ctx *pctx, const struct lysc_node_notif *notif)
Radek Krejci693262f2019-04-29 15:23:20 +02001189{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001190 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001191 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +02001192 struct lysc_node *data;
1193
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001194 ly_print_(pctx->out, "%*snotification %s", INDENT, notif->name);
Radek Krejci693262f2019-04-29 15:23:20 +02001195
1196 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +02001197 yprc_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001198
1199 LY_ARRAY_FOR(notif->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001200 yprc_must(pctx, &notif->musts[u], &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001201 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001202 ypr_status(pctx, notif->flags, notif->exts, &flag);
1203 ypr_description(pctx, notif->dsc, notif->exts, &flag);
1204 ypr_reference(pctx, notif->ref, notif->exts, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001205
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001206 if (!(pctx->options & LYS_PRINT_NO_SUBSTMT)) {
Radek Krejci01180ac2021-01-27 08:48:22 +01001207 LY_LIST_FOR(notif->child, data) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001208 ypr_open(pctx->out, &flag);
1209 yprc_node(pctx, data);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001210 }
Radek Krejci693262f2019-04-29 15:23:20 +02001211 }
1212
1213 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001214 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001215}
1216
1217static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001218yprp_action(struct lys_ypr_ctx *pctx, const struct lysp_node_action *action)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001219{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001220 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001221 ly_bool flag = 0;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001222 struct lysp_node_grp *grp;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001223
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001224 ly_print_(pctx->out, "%*s%s %s", INDENT, action->parent ? "action" : "rpc", action->name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001225
1226 LEVEL++;
Michal Vasko193dacd2022-10-13 08:43:05 +02001227 yprp_extension_instances(pctx, lyplg_ext_nodetype2stmt(action->nodetype), 0, action->exts, &flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001228 yprp_iffeatures(pctx, action->iffeatures, action->exts, &flag);
1229 ypr_status(pctx, action->flags, action->exts, &flag);
1230 ypr_description(pctx, action->dsc, action->exts, &flag);
1231 ypr_reference(pctx, action->ref, action->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001232
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001233 YPR_EXTRA_LINE(flag, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02001234
Radek Krejcid3ca0632019-04-16 16:54:54 +02001235 LY_ARRAY_FOR(action->typedefs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001236 ypr_open(pctx->out, &flag);
1237 YPR_EXTRA_LINE_PRINT(pctx);
1238 yprp_typedef(pctx, &action->typedefs[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001239 }
1240
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001241 YPR_EXTRA_LINE(action->typedefs, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02001242
Radek Krejci2a9fc652021-01-22 17:44:34 +01001243 LY_LIST_FOR(action->groupings, grp) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001244 ypr_open(pctx->out, &flag);
1245 YPR_EXTRA_LINE_PRINT(pctx);
1246 yprp_grouping(pctx, grp);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001247 }
1248
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001249 YPR_EXTRA_LINE(action->groupings, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02001250
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001251 yprp_inout(pctx, &action->input, &flag);
1252 yprp_inout(pctx, &action->output, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001253
1254 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001255 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001256}
1257
1258static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001259yprc_action(struct lys_ypr_ctx *pctx, const struct lysc_node_action *action)
Radek Krejci693262f2019-04-29 15:23:20 +02001260{
Radek Krejci857189e2020-09-01 13:26:36 +02001261 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +02001262
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001263 ly_print_(pctx->out, "%*s%s %s", INDENT, action->parent ? "action" : "rpc", action->name);
Radek Krejci693262f2019-04-29 15:23:20 +02001264
1265 LEVEL++;
Michal Vasko193dacd2022-10-13 08:43:05 +02001266 yprc_extension_instances(pctx, lyplg_ext_nodetype2stmt(action->nodetype), 0, action->exts, &flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001267 ypr_status(pctx, action->flags, action->exts, &flag);
1268 ypr_description(pctx, action->dsc, action->exts, &flag);
1269 ypr_reference(pctx, action->ref, action->exts, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001270
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001271 yprc_inout(pctx, &action->input, &flag);
1272 yprc_inout(pctx, &action->output, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001273
1274 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001275 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001276}
1277
1278static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001279yprp_node_common1(struct lys_ypr_ctx *pctx, const struct lysp_node *node, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001280{
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001281 ly_print_(pctx->out, "%*s%s %s%s", INDENT, lys_nodetype2str(node->nodetype), node->name, flag ? "" : " {\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +02001282 LEVEL++;
1283
Michal Vasko193dacd2022-10-13 08:43:05 +02001284 yprp_extension_instances(pctx, lyplg_ext_nodetype2stmt(node->nodetype), 0, node->exts, flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001285 yprp_when(pctx, lysp_node_when(node), flag);
1286 yprp_iffeatures(pctx, node->iffeatures, node->exts, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001287}
1288
1289static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001290yprc_node_common1(struct lys_ypr_ctx *pctx, const struct lysc_node *node, ly_bool *flag)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001291{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001292 LY_ARRAY_COUNT_TYPE u;
Radek Krejci9a3823e2021-01-27 20:26:46 +01001293 struct lysc_when **when;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001294
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001295 ly_print_(pctx->out, "%*s%s %s%s", INDENT, lys_nodetype2str(node->nodetype), node->name, flag ? "" : " {\n");
Radek Krejci693262f2019-04-29 15:23:20 +02001296 LEVEL++;
1297
Michal Vasko193dacd2022-10-13 08:43:05 +02001298 yprc_extension_instances(pctx, lyplg_ext_nodetype2stmt(node->nodetype), 0, node->exts, flag);
Radek Krejci9a3823e2021-01-27 20:26:46 +01001299
1300 when = lysc_node_when(node);
1301 LY_ARRAY_FOR(when, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001302 yprc_when(pctx, when[u], flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001303 }
Radek Krejci693262f2019-04-29 15:23:20 +02001304}
1305
Michal Vaskob26d09d2022-08-22 09:52:19 +02001306/* macro to unify the code */
Radek Krejci693262f2019-04-29 15:23:20 +02001307#define YPR_NODE_COMMON2 \
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001308 ypr_config(pctx, node->flags, node->exts, flag); \
Radek Krejci693262f2019-04-29 15:23:20 +02001309 if (node->nodetype & (LYS_CHOICE | LYS_LEAF | LYS_ANYDATA)) { \
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001310 ypr_mandatory(pctx, node->flags, node->exts, flag); \
Radek Krejci693262f2019-04-29 15:23:20 +02001311 } \
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001312 ypr_status(pctx, node->flags, node->exts, flag); \
1313 ypr_description(pctx, node->dsc, node->exts, flag); \
1314 ypr_reference(pctx, node->ref, node->exts, flag)
Radek Krejci693262f2019-04-29 15:23:20 +02001315
1316static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001317yprp_node_common2(struct lys_ypr_ctx *pctx, const struct lysp_node *node, ly_bool *flag)
Radek Krejci693262f2019-04-29 15:23:20 +02001318{
1319 YPR_NODE_COMMON2;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001320}
1321
1322static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001323yprc_node_common2(struct lys_ypr_ctx *pctx, const struct lysc_node *node, ly_bool *flag)
Radek Krejci693262f2019-04-29 15:23:20 +02001324{
1325 YPR_NODE_COMMON2;
1326}
1327
1328#undef YPR_NODE_COMMON2
1329
1330static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001331yprp_container(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001332{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001333 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001334 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001335 struct lysp_node *child;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001336 struct lysp_node_action *action;
1337 struct lysp_node_notif *notif;
1338 struct lysp_node_grp *grp;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001339 struct lysp_node_container *cont = (struct lysp_node_container *)node;
1340
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001341 yprp_node_common1(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001342
1343 LY_ARRAY_FOR(cont->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001344 yprp_restr(pctx, &cont->musts[u], LY_STMT_MUST, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001345 }
1346 if (cont->presence) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001347 ypr_open(pctx->out, &flag);
1348 ypr_substmt(pctx, LY_STMT_PRESENCE, 0, cont->presence, cont->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001349 }
1350
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001351 yprp_node_common2(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001352
1353 LY_ARRAY_FOR(cont->typedefs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001354 ypr_open(pctx->out, &flag);
1355 yprp_typedef(pctx, &cont->typedefs[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001356 }
1357
Radek Krejci2a9fc652021-01-22 17:44:34 +01001358 LY_LIST_FOR(cont->groupings, grp) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001359 ypr_open(pctx->out, &flag);
1360 yprp_grouping(pctx, grp);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001361 }
1362
1363 LY_LIST_FOR(cont->child, child) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001364 ypr_open(pctx->out, &flag);
1365 yprp_node(pctx, child);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001366 }
1367
Radek Krejci2a9fc652021-01-22 17:44:34 +01001368 LY_LIST_FOR(cont->actions, action) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001369 ypr_open(pctx->out, &flag);
1370 yprp_action(pctx, action);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001371 }
1372
Radek Krejci2a9fc652021-01-22 17:44:34 +01001373 LY_LIST_FOR(cont->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001374 ypr_open(pctx->out, &flag);
1375 yprp_notification(pctx, notif);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001376 }
1377
1378 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001379 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001380}
1381
1382static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001383yprc_container(struct lys_ypr_ctx *pctx, const struct lysc_node *node)
Radek Krejci693262f2019-04-29 15:23:20 +02001384{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001385 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001386 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +02001387 struct lysc_node *child;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001388 struct lysc_node_action *action;
1389 struct lysc_node_notif *notif;
Radek Krejci693262f2019-04-29 15:23:20 +02001390 struct lysc_node_container *cont = (struct lysc_node_container *)node;
1391
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001392 yprc_node_common1(pctx, node, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001393
1394 LY_ARRAY_FOR(cont->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001395 yprc_must(pctx, &cont->musts[u], &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001396 }
1397 if (cont->flags & LYS_PRESENCE) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001398 ypr_open(pctx->out, &flag);
1399 ypr_substmt(pctx, LY_STMT_PRESENCE, 0, "true", cont->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001400 }
1401
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001402 yprc_node_common2(pctx, node, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001403
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001404 if (!(pctx->options & LYS_PRINT_NO_SUBSTMT)) {
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001405 LY_LIST_FOR(cont->child, child) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001406 ypr_open(pctx->out, &flag);
1407 yprc_node(pctx, child);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001408 }
Radek Krejci693262f2019-04-29 15:23:20 +02001409
Radek Krejci2a9fc652021-01-22 17:44:34 +01001410 LY_LIST_FOR(cont->actions, action) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001411 ypr_open(pctx->out, &flag);
1412 yprc_action(pctx, action);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001413 }
Radek Krejci693262f2019-04-29 15:23:20 +02001414
Radek Krejci2a9fc652021-01-22 17:44:34 +01001415 LY_LIST_FOR(cont->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001416 ypr_open(pctx->out, &flag);
1417 yprc_notification(pctx, notif);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001418 }
Radek Krejci693262f2019-04-29 15:23:20 +02001419 }
1420
1421 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001422 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001423}
1424
1425static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001426yprp_case(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejci693262f2019-04-29 15:23:20 +02001427{
Radek Krejci857189e2020-09-01 13:26:36 +02001428 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +02001429 struct lysp_node *child;
1430 struct lysp_node_case *cas = (struct lysp_node_case *)node;
1431
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001432 yprp_node_common1(pctx, node, &flag);
1433 yprp_node_common2(pctx, node, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001434
1435 LY_LIST_FOR(cas->child, child) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001436 ypr_open(pctx->out, &flag);
1437 yprp_node(pctx, child);
Radek Krejci693262f2019-04-29 15:23:20 +02001438 }
1439
1440 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001441 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001442}
1443
1444static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001445yprc_case(struct lys_ypr_ctx *pctx, const struct lysc_node_case *cs)
Radek Krejci693262f2019-04-29 15:23:20 +02001446{
Radek Krejci857189e2020-09-01 13:26:36 +02001447 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +02001448 struct lysc_node *child;
1449
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001450 yprc_node_common1(pctx, &cs->node, &flag);
1451 yprc_node_common2(pctx, &cs->node, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001452
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001453 if (!(pctx->options & LYS_PRINT_NO_SUBSTMT)) {
Michal Vasko22df3f02020-08-24 13:29:22 +02001454 for (child = cs->child; child && child->parent == (struct lysc_node *)cs; child = child->next) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001455 ypr_open(pctx->out, &flag);
1456 yprc_node(pctx, child);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001457 }
Radek Krejci693262f2019-04-29 15:23:20 +02001458 }
1459
1460 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001461 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001462}
1463
1464static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001465yprp_choice(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001466{
Radek Krejci857189e2020-09-01 13:26:36 +02001467 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001468 struct lysp_node *child;
1469 struct lysp_node_choice *choice = (struct lysp_node_choice *)node;
1470
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001471 yprp_node_common1(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001472
Michal Vasko7f45cf22020-10-01 12:49:44 +02001473 if (choice->dflt.str) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001474 ypr_open(pctx->out, &flag);
1475 ypr_substmt(pctx, LY_STMT_DEFAULT, 0, choice->dflt.str, choice->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001476 }
1477
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001478 yprp_node_common2(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001479
1480 LY_LIST_FOR(choice->child, child) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001481 ypr_open(pctx->out, &flag);
1482 yprp_node(pctx, child);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001483 }
1484
1485 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001486 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001487}
1488
1489static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001490yprc_choice(struct lys_ypr_ctx *pctx, const struct lysc_node *node)
Radek Krejci693262f2019-04-29 15:23:20 +02001491{
Radek Krejci857189e2020-09-01 13:26:36 +02001492 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +02001493 struct lysc_node_case *cs;
1494 struct lysc_node_choice *choice = (struct lysc_node_choice *)node;
1495
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001496 yprc_node_common1(pctx, node, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001497
1498 if (choice->dflt) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001499 ypr_open(pctx->out, &flag);
1500 ypr_substmt(pctx, LY_STMT_DEFAULT, 0, choice->dflt->name, choice->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001501 }
1502
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001503 yprc_node_common2(pctx, node, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001504
Michal Vasko22df3f02020-08-24 13:29:22 +02001505 for (cs = choice->cases; cs; cs = (struct lysc_node_case *)cs->next) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001506 ypr_open(pctx->out, &flag);
1507 yprc_case(pctx, cs);
Radek Krejci693262f2019-04-29 15:23:20 +02001508 }
1509
1510 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001511 ypr_close(pctx, flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001512}
1513
1514static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001515yprp_leaf(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001516{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001517 LY_ARRAY_COUNT_TYPE u;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001518 struct lysp_node_leaf *leaf = (struct lysp_node_leaf *)node;
1519
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001520 yprp_node_common1(pctx, node, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001521
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001522 yprp_type(pctx, &leaf->type);
1523 ypr_substmt(pctx, LY_STMT_UNITS, 0, leaf->units, leaf->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001524 LY_ARRAY_FOR(leaf->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001525 yprp_restr(pctx, &leaf->musts[u], LY_STMT_MUST, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001526 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001527 ypr_substmt(pctx, LY_STMT_DEFAULT, 0, leaf->dflt.str, leaf->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001528
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001529 yprp_node_common2(pctx, node, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001530
1531 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001532 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001533}
1534
1535static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001536yprc_leaf(struct lys_ypr_ctx *pctx, const struct lysc_node *node)
Radek Krejci693262f2019-04-29 15:23:20 +02001537{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001538 LY_ARRAY_COUNT_TYPE u;
Radek Krejci693262f2019-04-29 15:23:20 +02001539 struct lysc_node_leaf *leaf = (struct lysc_node_leaf *)node;
1540
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001541 yprc_node_common1(pctx, node, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001542
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001543 yprc_type(pctx, leaf->type);
1544 ypr_substmt(pctx, LY_STMT_UNITS, 0, leaf->units, leaf->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001545 LY_ARRAY_FOR(leaf->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001546 yprc_must(pctx, &leaf->musts[u], NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001547 }
Radek Krejcia1911222019-07-22 17:24:50 +02001548
1549 if (leaf->dflt) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001550 yprc_dflt_value(pctx, node->module->ctx, leaf->dflt, leaf->exts);
Radek Krejcia1911222019-07-22 17:24:50 +02001551 }
Radek Krejci693262f2019-04-29 15:23:20 +02001552
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001553 yprc_node_common2(pctx, node, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001554
1555 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001556 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejci693262f2019-04-29 15:23:20 +02001557}
1558
1559static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001560yprp_leaflist(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001561{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001562 LY_ARRAY_COUNT_TYPE u;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001563 struct lysp_node_leaflist *llist = (struct lysp_node_leaflist *)node;
1564
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001565 yprp_node_common1(pctx, node, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001566
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001567 yprp_type(pctx, &llist->type);
1568 ypr_substmt(pctx, LY_STMT_UNITS, 0, llist->units, llist->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001569 LY_ARRAY_FOR(llist->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001570 yprp_restr(pctx, &llist->musts[u], LY_STMT_MUST, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001571 }
1572 LY_ARRAY_FOR(llist->dflts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001573 ypr_substmt(pctx, LY_STMT_DEFAULT, u, llist->dflts[u].str, llist->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001574 }
1575
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001576 ypr_config(pctx, node->flags, node->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001577
1578 if (llist->flags & LYS_SET_MIN) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001579 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, llist->exts, llist->min, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001580 }
1581 if (llist->flags & LYS_SET_MAX) {
1582 if (llist->max) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001583 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, llist->exts, llist->max, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001584 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001585 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", llist->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001586 }
1587 }
1588
1589 if (llist->flags & LYS_ORDBY_MASK) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001590 ypr_substmt(pctx, LY_STMT_ORDERED_BY, 0, (llist->flags & LYS_ORDBY_USER) ? "user" : "system", llist->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001591 }
1592
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001593 ypr_status(pctx, node->flags, node->exts, NULL);
1594 ypr_description(pctx, node->dsc, node->exts, NULL);
1595 ypr_reference(pctx, node->ref, node->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001596
1597 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001598 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001599}
1600
1601static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001602yprc_leaflist(struct lys_ypr_ctx *pctx, const struct lysc_node *node)
Radek Krejci693262f2019-04-29 15:23:20 +02001603{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001604 LY_ARRAY_COUNT_TYPE u;
Radek Krejci693262f2019-04-29 15:23:20 +02001605 struct lysc_node_leaflist *llist = (struct lysc_node_leaflist *)node;
1606
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001607 yprc_node_common1(pctx, node, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001608
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001609 yprc_type(pctx, llist->type);
1610 ypr_substmt(pctx, LY_STMT_UNITS, 0, llist->units, llist->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001611 LY_ARRAY_FOR(llist->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001612 yprc_must(pctx, &llist->musts[u], NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001613 }
1614 LY_ARRAY_FOR(llist->dflts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001615 yprc_dflt_value(pctx, node->module->ctx, llist->dflts[u], llist->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001616 }
1617
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001618 ypr_config(pctx, node->flags, node->exts, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001619
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001620 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, llist->exts, llist->min, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001621 if (llist->max) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001622 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, llist->exts, llist->max, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001623 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001624 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", llist->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001625 }
1626
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001627 ypr_substmt(pctx, LY_STMT_ORDERED_BY, 0, (llist->flags & LYS_ORDBY_USER) ? "user" : "system", llist->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001628
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001629 ypr_status(pctx, node->flags, node->exts, NULL);
1630 ypr_description(pctx, node->dsc, node->exts, NULL);
1631 ypr_reference(pctx, node->ref, node->exts, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001632
1633 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001634 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejci693262f2019-04-29 15:23:20 +02001635}
1636
1637static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001638yprp_list(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001639{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001640 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001641 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001642 struct lysp_node *child;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001643 struct lysp_node_action *action;
1644 struct lysp_node_notif *notif;
1645 struct lysp_node_grp *grp;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001646 struct lysp_node_list *list = (struct lysp_node_list *)node;
1647
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001648 yprp_node_common1(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001649
1650 LY_ARRAY_FOR(list->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001651 yprp_restr(pctx, &list->musts[u], LY_STMT_MUST, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001652 }
1653 if (list->key) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001654 ypr_open(pctx->out, &flag);
1655 ypr_substmt(pctx, LY_STMT_KEY, 0, list->key, list->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001656 }
1657 LY_ARRAY_FOR(list->uniques, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001658 ypr_open(pctx->out, &flag);
1659 ypr_substmt(pctx, LY_STMT_UNIQUE, u, list->uniques[u].str, list->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001660 }
1661
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001662 ypr_config(pctx, node->flags, node->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001663
1664 if (list->flags & LYS_SET_MIN) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001665 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, list->exts, list->min, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001666 }
1667 if (list->flags & LYS_SET_MAX) {
1668 if (list->max) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001669 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, list->exts, list->max, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001670 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001671 ypr_open(pctx->out, &flag);
1672 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", list->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001673 }
1674 }
1675
1676 if (list->flags & LYS_ORDBY_MASK) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001677 ypr_open(pctx->out, &flag);
1678 ypr_substmt(pctx, LY_STMT_ORDERED_BY, 0, (list->flags & LYS_ORDBY_USER) ? "user" : "system", list->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001679 }
1680
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001681 ypr_status(pctx, node->flags, node->exts, &flag);
1682 ypr_description(pctx, node->dsc, node->exts, &flag);
1683 ypr_reference(pctx, node->ref, node->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001684
1685 LY_ARRAY_FOR(list->typedefs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001686 ypr_open(pctx->out, &flag);
1687 yprp_typedef(pctx, &list->typedefs[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001688 }
1689
Radek Krejci2a9fc652021-01-22 17:44:34 +01001690 LY_LIST_FOR(list->groupings, grp) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001691 ypr_open(pctx->out, &flag);
1692 yprp_grouping(pctx, grp);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001693 }
1694
1695 LY_LIST_FOR(list->child, child) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001696 ypr_open(pctx->out, &flag);
1697 yprp_node(pctx, child);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001698 }
1699
Radek Krejci2a9fc652021-01-22 17:44:34 +01001700 LY_LIST_FOR(list->actions, action) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001701 ypr_open(pctx->out, &flag);
1702 yprp_action(pctx, action);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001703 }
1704
Radek Krejci2a9fc652021-01-22 17:44:34 +01001705 LY_LIST_FOR(list->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001706 ypr_open(pctx->out, &flag);
1707 yprp_notification(pctx, notif);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001708 }
1709
1710 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001711 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001712}
1713
1714static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001715yprc_list(struct lys_ypr_ctx *pctx, const struct lysc_node *node)
Radek Krejci693262f2019-04-29 15:23:20 +02001716{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001717 LY_ARRAY_COUNT_TYPE u, v;
Radek Krejci693262f2019-04-29 15:23:20 +02001718 struct lysc_node_list *list = (struct lysc_node_list *)node;
1719
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001720 yprc_node_common1(pctx, node, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001721
1722 LY_ARRAY_FOR(list->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001723 yprc_must(pctx, &list->musts[u], NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001724 }
Radek Krejci0fe9b512019-07-26 17:51:05 +02001725 if (!(list->flags & LYS_KEYLESS)) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001726 ly_print_(pctx->out, "%*skey \"", INDENT);
Radek Krejci0fe9b512019-07-26 17:51:05 +02001727 for (struct lysc_node *key = list->child; key && key->nodetype == LYS_LEAF && (key->flags & LYS_KEY); key = key->next) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001728 ly_print_(pctx->out, "%s%s", u > 0 ? ", " : "", key->name);
Radek Krejci693262f2019-04-29 15:23:20 +02001729 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001730 ly_print_(pctx->out, "\";\n");
Radek Krejci693262f2019-04-29 15:23:20 +02001731 }
1732 LY_ARRAY_FOR(list->uniques, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001733 ly_print_(pctx->out, "%*sunique \"", INDENT);
Radek Krejci693262f2019-04-29 15:23:20 +02001734 LY_ARRAY_FOR(list->uniques[u], v) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001735 ly_print_(pctx->out, "%s%s", v > 0 ? ", " : "", list->uniques[u][v]->name);
Radek Krejci693262f2019-04-29 15:23:20 +02001736 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001737 ypr_close(pctx, 0);
Radek Krejci693262f2019-04-29 15:23:20 +02001738 }
1739
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001740 ypr_config(pctx, node->flags, node->exts, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001741
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001742 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, list->exts, list->min, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001743 if (list->max) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001744 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, list->exts, list->max, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001745 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001746 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", list->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001747 }
1748
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001749 ypr_substmt(pctx, LY_STMT_ORDERED_BY, 0, (list->flags & LYS_ORDBY_USER) ? "user" : "system", list->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02001750
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001751 ypr_status(pctx, node->flags, node->exts, NULL);
1752 ypr_description(pctx, node->dsc, node->exts, NULL);
1753 ypr_reference(pctx, node->ref, node->exts, NULL);
Radek Krejci693262f2019-04-29 15:23:20 +02001754
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001755 if (!(pctx->options & LYS_PRINT_NO_SUBSTMT)) {
Radek Krejci2a9fc652021-01-22 17:44:34 +01001756 struct lysc_node *child;
1757 struct lysc_node_action *action;
1758 struct lysc_node_notif *notif;
1759
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001760 LY_LIST_FOR(list->child, child) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001761 yprc_node(pctx, child);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001762 }
Radek Krejci693262f2019-04-29 15:23:20 +02001763
Radek Krejci2a9fc652021-01-22 17:44:34 +01001764 LY_LIST_FOR(list->actions, action) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001765 yprc_action(pctx, action);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001766 }
Radek Krejci693262f2019-04-29 15:23:20 +02001767
Radek Krejci2a9fc652021-01-22 17:44:34 +01001768 LY_LIST_FOR(list->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001769 yprc_notification(pctx, notif);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08001770 }
Radek Krejci693262f2019-04-29 15:23:20 +02001771 }
1772
1773 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001774 ypr_close(pctx, 1);
Radek Krejci693262f2019-04-29 15:23:20 +02001775}
1776
1777static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001778yprp_refine(struct lys_ypr_ctx *pctx, struct lysp_refine *refine)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001779{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001780 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001781 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001782
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001783 ly_print_(pctx->out, "%*srefine \"%s\"", INDENT, refine->nodeid);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001784 LEVEL++;
1785
Michal Vaskob26d09d2022-08-22 09:52:19 +02001786 yprp_extension_instances(pctx, LY_STMT_REFINE, 0, refine->exts, &flag);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001787 yprp_iffeatures(pctx, refine->iffeatures, refine->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001788
1789 LY_ARRAY_FOR(refine->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001790 ypr_open(pctx->out, &flag);
1791 yprp_restr(pctx, &refine->musts[u], LY_STMT_MUST, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001792 }
1793
1794 if (refine->presence) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001795 ypr_open(pctx->out, &flag);
1796 ypr_substmt(pctx, LY_STMT_PRESENCE, 0, refine->presence, refine->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001797 }
1798
1799 LY_ARRAY_FOR(refine->dflts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001800 ypr_open(pctx->out, &flag);
1801 ypr_substmt(pctx, LY_STMT_DEFAULT, u, refine->dflts[u].str, refine->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001802 }
1803
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001804 ypr_config(pctx, refine->flags, refine->exts, &flag);
1805 ypr_mandatory(pctx, refine->flags, refine->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001806
1807 if (refine->flags & LYS_SET_MIN) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001808 ypr_open(pctx->out, &flag);
1809 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, refine->exts, refine->min, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001810 }
1811 if (refine->flags & LYS_SET_MAX) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001812 ypr_open(pctx->out, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001813 if (refine->max) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001814 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, refine->exts, refine->max, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001815 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001816 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", refine->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001817 }
1818 }
1819
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001820 ypr_description(pctx, refine->dsc, refine->exts, &flag);
1821 ypr_reference(pctx, refine->ref, refine->exts, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001822
1823 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001824 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001825}
1826
1827static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001828yprp_augment(struct lys_ypr_ctx *pctx, const struct lysp_node_augment *aug)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001829{
Radek Krejcid3ca0632019-04-16 16:54:54 +02001830 struct lysp_node *child;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001831 struct lysp_node_action *action;
1832 struct lysp_node_notif *notif;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001833
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001834 ly_print_(pctx->out, "%*saugment \"%s\" {\n", INDENT, aug->nodeid);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001835 LEVEL++;
1836
Michal Vaskob26d09d2022-08-22 09:52:19 +02001837 yprp_extension_instances(pctx, LY_STMT_AUGMENT, 0, aug->exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001838 yprp_when(pctx, aug->when, NULL);
1839 yprp_iffeatures(pctx, aug->iffeatures, aug->exts, NULL);
1840 ypr_status(pctx, aug->flags, aug->exts, NULL);
1841 ypr_description(pctx, aug->dsc, aug->exts, NULL);
1842 ypr_reference(pctx, aug->ref, aug->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001843
1844 LY_LIST_FOR(aug->child, child) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001845 yprp_node(pctx, child);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001846 }
1847
Radek Krejci2a9fc652021-01-22 17:44:34 +01001848 LY_LIST_FOR(aug->actions, action) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001849 yprp_action(pctx, action);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001850 }
1851
Radek Krejci2a9fc652021-01-22 17:44:34 +01001852 LY_LIST_FOR(aug->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001853 yprp_notification(pctx, notif);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001854 }
1855
1856 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001857 ypr_close(pctx, 1);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001858}
1859
Radek Krejcid3ca0632019-04-16 16:54:54 +02001860static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001861yprp_uses(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001862{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001863 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001864 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001865 struct lysp_node_uses *uses = (struct lysp_node_uses *)node;
Radek Krejci2a9fc652021-01-22 17:44:34 +01001866 struct lysp_node_augment *aug;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001867
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001868 yprp_node_common1(pctx, node, &flag);
1869 yprp_node_common2(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001870
1871 LY_ARRAY_FOR(uses->refines, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001872 ypr_open(pctx->out, &flag);
1873 yprp_refine(pctx, &uses->refines[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001874 }
1875
Radek Krejci2a9fc652021-01-22 17:44:34 +01001876 LY_LIST_FOR(uses->augments, aug) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001877 ypr_open(pctx->out, &flag);
1878 yprp_augment(pctx, aug);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001879 }
1880
1881 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001882 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001883}
1884
1885static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001886yprp_anydata(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001887{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001888 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001889 ly_bool flag = 0;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001890 struct lysp_node_anydata *any = (struct lysp_node_anydata *)node;
1891
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001892 yprp_node_common1(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001893
1894 LY_ARRAY_FOR(any->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001895 ypr_open(pctx->out, &flag);
1896 yprp_restr(pctx, &any->musts[u], LY_STMT_MUST, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001897 }
1898
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001899 yprp_node_common2(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001900
1901 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001902 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001903}
1904
1905static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001906yprc_anydata(struct lys_ypr_ctx *pctx, const struct lysc_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001907{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001908 LY_ARRAY_COUNT_TYPE u;
Radek Krejci857189e2020-09-01 13:26:36 +02001909 ly_bool flag = 0;
Radek Krejci693262f2019-04-29 15:23:20 +02001910 struct lysc_node_anydata *any = (struct lysc_node_anydata *)node;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001911
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001912 yprc_node_common1(pctx, node, &flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001913
Radek Krejci693262f2019-04-29 15:23:20 +02001914 LY_ARRAY_FOR(any->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001915 ypr_open(pctx->out, &flag);
1916 yprc_must(pctx, &any->musts[u], NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001917 }
1918
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001919 yprc_node_common2(pctx, node, &flag);
Radek Krejci693262f2019-04-29 15:23:20 +02001920
Radek Krejcid3ca0632019-04-16 16:54:54 +02001921 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001922 ypr_close(pctx, flag);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001923}
1924
1925static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001926yprp_node(struct lys_ypr_ctx *pctx, const struct lysp_node *node)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001927{
1928 switch (node->nodetype) {
1929 case LYS_CONTAINER:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001930 yprp_container(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001931 break;
1932 case LYS_CHOICE:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001933 yprp_choice(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001934 break;
1935 case LYS_LEAF:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001936 yprp_leaf(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001937 break;
1938 case LYS_LEAFLIST:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001939 yprp_leaflist(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001940 break;
1941 case LYS_LIST:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001942 yprp_list(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001943 break;
1944 case LYS_USES:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001945 yprp_uses(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001946 break;
1947 case LYS_ANYXML:
1948 case LYS_ANYDATA:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001949 yprp_anydata(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001950 break;
1951 case LYS_CASE:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001952 yprp_case(pctx, node);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001953 break;
1954 default:
1955 break;
1956 }
1957}
1958
1959static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001960yprc_node(struct lys_ypr_ctx *pctx, const struct lysc_node *node)
Radek Krejci693262f2019-04-29 15:23:20 +02001961{
1962 switch (node->nodetype) {
1963 case LYS_CONTAINER:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001964 yprc_container(pctx, node);
Radek Krejci693262f2019-04-29 15:23:20 +02001965 break;
1966 case LYS_CHOICE:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001967 yprc_choice(pctx, node);
Radek Krejci693262f2019-04-29 15:23:20 +02001968 break;
1969 case LYS_LEAF:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001970 yprc_leaf(pctx, node);
Radek Krejci693262f2019-04-29 15:23:20 +02001971 break;
1972 case LYS_LEAFLIST:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001973 yprc_leaflist(pctx, node);
Radek Krejci693262f2019-04-29 15:23:20 +02001974 break;
1975 case LYS_LIST:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001976 yprc_list(pctx, node);
Radek Krejci693262f2019-04-29 15:23:20 +02001977 break;
1978 case LYS_ANYXML:
1979 case LYS_ANYDATA:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001980 yprc_anydata(pctx, node);
Radek Krejci693262f2019-04-29 15:23:20 +02001981 break;
1982 default:
1983 break;
1984 }
1985}
1986
1987static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001988yprp_deviation(struct lys_ypr_ctx *pctx, const struct lysp_deviation *deviation)
Radek Krejcid3ca0632019-04-16 16:54:54 +02001989{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02001990 LY_ARRAY_COUNT_TYPE u;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001991 struct lysp_deviate_add *add;
1992 struct lysp_deviate_rpl *rpl;
1993 struct lysp_deviate_del *del;
fredgan2b11ddb2019-10-21 11:03:39 +08001994 struct lysp_deviate *elem;
Radek Krejcid3ca0632019-04-16 16:54:54 +02001995
Michal Vasko61ad1ff2022-02-10 15:48:39 +01001996 ly_print_(pctx->out, "%*sdeviation \"%s\" {\n", INDENT, deviation->nodeid);
Radek Krejcid3ca0632019-04-16 16:54:54 +02001997 LEVEL++;
1998
Michal Vaskob26d09d2022-08-22 09:52:19 +02001999 yprp_extension_instances(pctx, LY_STMT_DEVIATION, 0, deviation->exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002000 ypr_description(pctx, deviation->dsc, deviation->exts, NULL);
2001 ypr_reference(pctx, deviation->ref, deviation->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002002
fredgan2b11ddb2019-10-21 11:03:39 +08002003 LY_LIST_FOR(deviation->deviates, elem) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002004 ly_print_(pctx->out, "%*sdeviate ", INDENT);
fredgan2b11ddb2019-10-21 11:03:39 +08002005 if (elem->mod == LYS_DEV_NOT_SUPPORTED) {
2006 if (elem->exts) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002007 ly_print_(pctx->out, "not-supported {\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +02002008 LEVEL++;
2009
Michal Vaskob26d09d2022-08-22 09:52:19 +02002010 yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, elem->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002011 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002012 ly_print_(pctx->out, "not-supported;\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +02002013 continue;
2014 }
fredgan2b11ddb2019-10-21 11:03:39 +08002015 } else if (elem->mod == LYS_DEV_ADD) {
Michal Vasko22df3f02020-08-24 13:29:22 +02002016 add = (struct lysp_deviate_add *)elem;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002017 ly_print_(pctx->out, "add {\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +02002018 LEVEL++;
2019
Michal Vaskob26d09d2022-08-22 09:52:19 +02002020 yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, add->exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002021 ypr_substmt(pctx, LY_STMT_UNITS, 0, add->units, add->exts);
Radek Krejci7eb54ba2020-05-18 16:30:04 +02002022 LY_ARRAY_FOR(add->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002023 yprp_restr(pctx, &add->musts[u], LY_STMT_MUST, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002024 }
Radek Krejci7eb54ba2020-05-18 16:30:04 +02002025 LY_ARRAY_FOR(add->uniques, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002026 ypr_substmt(pctx, LY_STMT_UNIQUE, u, add->uniques[u].str, add->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002027 }
Radek Krejci7eb54ba2020-05-18 16:30:04 +02002028 LY_ARRAY_FOR(add->dflts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002029 ypr_substmt(pctx, LY_STMT_DEFAULT, u, add->dflts[u].str, add->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002030 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002031 ypr_config(pctx, add->flags, add->exts, NULL);
2032 ypr_mandatory(pctx, add->flags, add->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002033 if (add->flags & LYS_SET_MIN) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002034 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, add->exts, add->min, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002035 }
2036 if (add->flags & LYS_SET_MAX) {
2037 if (add->max) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002038 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, add->exts, add->max, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002039 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002040 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", add->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002041 }
2042 }
fredgan2b11ddb2019-10-21 11:03:39 +08002043 } else if (elem->mod == LYS_DEV_REPLACE) {
Michal Vasko22df3f02020-08-24 13:29:22 +02002044 rpl = (struct lysp_deviate_rpl *)elem;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002045 ly_print_(pctx->out, "replace {\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +02002046 LEVEL++;
2047
Michal Vaskob26d09d2022-08-22 09:52:19 +02002048 yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, rpl->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002049 if (rpl->type) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002050 yprp_type(pctx, rpl->type);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002051 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002052 ypr_substmt(pctx, LY_STMT_UNITS, 0, rpl->units, rpl->exts);
2053 ypr_substmt(pctx, LY_STMT_DEFAULT, 0, rpl->dflt.str, rpl->exts);
2054 ypr_config(pctx, rpl->flags, rpl->exts, NULL);
2055 ypr_mandatory(pctx, rpl->flags, rpl->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002056 if (rpl->flags & LYS_SET_MIN) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002057 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, rpl->exts, rpl->min, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002058 }
2059 if (rpl->flags & LYS_SET_MAX) {
2060 if (rpl->max) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002061 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, rpl->exts, rpl->max, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002062 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002063 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", rpl->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002064 }
2065 }
fredgan2b11ddb2019-10-21 11:03:39 +08002066 } else if (elem->mod == LYS_DEV_DELETE) {
Michal Vasko22df3f02020-08-24 13:29:22 +02002067 del = (struct lysp_deviate_del *)elem;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002068 ly_print_(pctx->out, "delete {\n");
Radek Krejcid3ca0632019-04-16 16:54:54 +02002069 LEVEL++;
2070
Michal Vaskob26d09d2022-08-22 09:52:19 +02002071 yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, del->exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002072 ypr_substmt(pctx, LY_STMT_UNITS, 0, del->units, del->exts);
Radek Krejci7eb54ba2020-05-18 16:30:04 +02002073 LY_ARRAY_FOR(del->musts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002074 yprp_restr(pctx, &del->musts[u], LY_STMT_MUST, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002075 }
Radek Krejci7eb54ba2020-05-18 16:30:04 +02002076 LY_ARRAY_FOR(del->uniques, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002077 ypr_substmt(pctx, LY_STMT_UNIQUE, u, del->uniques[u].str, del->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002078 }
Radek Krejci7eb54ba2020-05-18 16:30:04 +02002079 LY_ARRAY_FOR(del->dflts, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002080 ypr_substmt(pctx, LY_STMT_DEFAULT, u, del->dflts[u].str, del->exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002081 }
2082 }
2083
2084 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002085 ypr_close(pctx, 1);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002086 }
2087
2088 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002089 ypr_close(pctx, 1);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002090}
2091
Michal Vasko7c8439f2020-08-05 13:25:19 +02002092static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002093yang_print_parsed_linkage(struct lys_ypr_ctx *pctx, const struct lysp_module *modp)
Radek Krejcid3ca0632019-04-16 16:54:54 +02002094{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02002095 LY_ARRAY_COUNT_TYPE u;
Radek Krejcid3ca0632019-04-16 16:54:54 +02002096
Radek Krejcid3ca0632019-04-16 16:54:54 +02002097 LY_ARRAY_FOR(modp->imports, u) {
Michal Vasko3e9bc2f2020-11-04 17:13:56 +01002098 if (modp->imports[u].flags & LYS_INTERNAL) {
2099 continue;
2100 }
2101
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002102 YPR_EXTRA_LINE_PRINT(pctx);
2103 ly_print_(pctx->out, "%*simport %s {\n", INDENT, modp->imports[u].name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002104 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +02002105 yprp_extension_instances(pctx, LY_STMT_IMPORT, 0, modp->imports[u].exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002106 ypr_substmt(pctx, LY_STMT_PREFIX, 0, modp->imports[u].prefix, modp->imports[u].exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002107 if (modp->imports[u].rev[0]) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002108 ypr_substmt(pctx, LY_STMT_REVISION_DATE, 0, modp->imports[u].rev, modp->imports[u].exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002109 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002110 ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, modp->imports[u].dsc, modp->imports[u].exts);
2111 ypr_substmt(pctx, LY_STMT_REFERENCE, 0, modp->imports[u].ref, modp->imports[u].exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002112 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002113 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002114 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002115 YPR_EXTRA_LINE(modp->imports, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002116
Radek Krejcid3ca0632019-04-16 16:54:54 +02002117 LY_ARRAY_FOR(modp->includes, u) {
Radek Krejci771928a2021-01-19 13:42:36 +01002118 if (modp->includes[u].injected) {
2119 /* do not print the includes injected from submodules */
2120 continue;
2121 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002122 YPR_EXTRA_LINE_PRINT(pctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002123 if (modp->includes[u].rev[0] || modp->includes[u].dsc || modp->includes[u].ref || modp->includes[u].exts) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002124 ly_print_(pctx->out, "%*sinclude %s {\n", INDENT, modp->includes[u].name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002125 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +02002126 yprp_extension_instances(pctx, LY_STMT_INCLUDE, 0, modp->includes[u].exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002127 if (modp->includes[u].rev[0]) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002128 ypr_substmt(pctx, LY_STMT_REVISION_DATE, 0, modp->includes[u].rev, modp->includes[u].exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002129 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002130 ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, modp->includes[u].dsc, modp->includes[u].exts);
2131 ypr_substmt(pctx, LY_STMT_REFERENCE, 0, modp->includes[u].ref, modp->includes[u].exts);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002132 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002133 ly_print_(pctx->out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002134 } else {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002135 ly_print_(pctx->out, "\n%*sinclude \"%s\";\n", INDENT, modp->includes[u].name);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002136 }
2137 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002138 YPR_EXTRA_LINE(modp->includes, pctx);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002139}
Radek Krejcid3ca0632019-04-16 16:54:54 +02002140
Michal Vasko7c8439f2020-08-05 13:25:19 +02002141static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002142yang_print_parsed_body(struct lys_ypr_ctx *pctx, const struct lysp_module *modp)
Michal Vasko7c8439f2020-08-05 13:25:19 +02002143{
2144 LY_ARRAY_COUNT_TYPE u;
2145 struct lysp_node *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01002146 struct lysp_node_action *action;
2147 struct lysp_node_notif *notif;
2148 struct lysp_node_grp *grp;
2149 struct lysp_node_augment *aug;
Radek Krejcid3ca0632019-04-16 16:54:54 +02002150
Radek Krejcid3ca0632019-04-16 16:54:54 +02002151 LY_ARRAY_FOR(modp->extensions, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002152 YPR_EXTRA_LINE_PRINT(pctx);
2153 yprp_extension(pctx, &modp->extensions[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002154 }
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002155
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002156 YPR_EXTRA_LINE(modp->extensions, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002157
Radek Krejcid3ca0632019-04-16 16:54:54 +02002158 if (modp->exts) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002159 YPR_EXTRA_LINE_PRINT(pctx);
Michal Vaskob26d09d2022-08-22 09:52:19 +02002160 yprp_extension_instances(pctx, LY_STMT_MODULE, 0, modp->exts, NULL);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002161 }
2162
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002163 YPR_EXTRA_LINE(modp->exts, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002164
Radek Krejcid3ca0632019-04-16 16:54:54 +02002165 LY_ARRAY_FOR(modp->features, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002166 YPR_EXTRA_LINE_PRINT(pctx);
2167 yprp_feature(pctx, &modp->features[u]);
2168 YPR_EXTRA_LINE(1, pctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002169 }
2170
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002171 YPR_EXTRA_LINE(modp->features, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002172
Radek Krejcid3ca0632019-04-16 16:54:54 +02002173 LY_ARRAY_FOR(modp->identities, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002174 YPR_EXTRA_LINE_PRINT(pctx);
2175 yprp_identity(pctx, &modp->identities[u]);
2176 YPR_EXTRA_LINE(1, pctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002177 }
2178
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002179 YPR_EXTRA_LINE(modp->identities, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002180
Radek Krejcid3ca0632019-04-16 16:54:54 +02002181 LY_ARRAY_FOR(modp->typedefs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002182 YPR_EXTRA_LINE_PRINT(pctx);
2183 yprp_typedef(pctx, &modp->typedefs[u]);
2184 YPR_EXTRA_LINE(1, pctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002185 }
2186
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002187 YPR_EXTRA_LINE(modp->typedefs, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002188
Radek Krejci2a9fc652021-01-22 17:44:34 +01002189 LY_LIST_FOR(modp->groupings, grp) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002190 YPR_EXTRA_LINE_PRINT(pctx);
2191 yprp_grouping(pctx, grp);
2192 YPR_EXTRA_LINE(1, pctx);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002193 }
2194
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002195 YPR_EXTRA_LINE(modp->groupings, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002196
Radek Krejcid3ca0632019-04-16 16:54:54 +02002197 LY_LIST_FOR(modp->data, data) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002198 YPR_EXTRA_LINE_PRINT(pctx);
2199 yprp_node(pctx, data);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002200 }
2201
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002202 YPR_EXTRA_LINE(modp->data, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002203
Radek Krejci2a9fc652021-01-22 17:44:34 +01002204 LY_LIST_FOR(modp->augments, aug) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002205 YPR_EXTRA_LINE_PRINT(pctx);
2206 yprp_augment(pctx, aug);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002207 }
2208
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002209 YPR_EXTRA_LINE(modp->augments, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002210
Radek Krejci2a9fc652021-01-22 17:44:34 +01002211 LY_LIST_FOR(modp->rpcs, action) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002212 YPR_EXTRA_LINE_PRINT(pctx);
2213 yprp_action(pctx, action);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002214 }
2215
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002216 YPR_EXTRA_LINE(modp->rpcs, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002217
Radek Krejci2a9fc652021-01-22 17:44:34 +01002218 LY_LIST_FOR(modp->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002219 YPR_EXTRA_LINE_PRINT(pctx);
2220 yprp_notification(pctx, notif);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002221 }
2222
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002223 YPR_EXTRA_LINE(modp->notifs, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002224
Radek Krejcid3ca0632019-04-16 16:54:54 +02002225 LY_ARRAY_FOR(modp->deviations, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002226 YPR_EXTRA_LINE_PRINT(pctx);
2227 yprp_deviation(pctx, &modp->deviations[u]);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002228 }
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002229
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002230 YPR_EXTRA_LINE(modp->deviations, pctx);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002231}
2232
2233LY_ERR
Michal Vasko7997d5a2021-02-22 10:55:56 +01002234yang_print_parsed_module(struct ly_out *out, const struct lysp_module *modp, uint32_t options)
Michal Vasko7c8439f2020-08-05 13:25:19 +02002235{
2236 LY_ARRAY_COUNT_TYPE u;
Michal Vasko7997d5a2021-02-22 10:55:56 +01002237 const struct lys_module *module = modp->mod;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002238 struct lys_ypr_ctx pctx_ = {
2239 .out = out,
2240 .level = 0,
Michal Vasko331303f2022-08-22 09:51:57 +02002241 .options = options,
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002242 .module = module,
Michal Vasko331303f2022-08-22 09:51:57 +02002243 .schema = LYS_YPR_PARSED
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002244 }, *pctx = &pctx_;
Michal Vasko7c8439f2020-08-05 13:25:19 +02002245
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002246 ly_print_(pctx->out, "%*smodule %s {\n", INDENT, module->name);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002247 LEVEL++;
2248
2249 /* module-header-stmts */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02002250 if (modp->version) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002251 ypr_substmt(pctx, LY_STMT_YANG_VERSION, 0, modp->version == LYS_VERSION_1_1 ? "1.1" : "1", modp->exts);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002252 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002253 ypr_substmt(pctx, LY_STMT_NAMESPACE, 0, module->ns, modp->exts);
2254 ypr_substmt(pctx, LY_STMT_PREFIX, 0, module->prefix, modp->exts);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002255
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002256 YPR_EXTRA_LINE(1, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002257
Michal Vasko7c8439f2020-08-05 13:25:19 +02002258 /* linkage-stmts (import/include) */
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002259 yang_print_parsed_linkage(pctx, modp);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002260
2261 /* meta-stmts */
2262 if (module->org || module->contact || module->dsc || module->ref) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002263 YPR_EXTRA_LINE_PRINT(pctx);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002264 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002265 ypr_substmt(pctx, LY_STMT_ORGANIZATION, 0, module->org, modp->exts);
2266 ypr_substmt(pctx, LY_STMT_CONTACT, 0, module->contact, modp->exts);
2267 ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, module->dsc, modp->exts);
2268 ypr_substmt(pctx, LY_STMT_REFERENCE, 0, module->ref, modp->exts);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002269
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002270 YPR_EXTRA_LINE(module->org || module->contact || module->dsc || module->ref, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002271
Michal Vasko7c8439f2020-08-05 13:25:19 +02002272 /* revision-stmts */
Michal Vasko7c8439f2020-08-05 13:25:19 +02002273 LY_ARRAY_FOR(modp->revs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002274 YPR_EXTRA_LINE_PRINT(pctx);
2275 yprp_revision(pctx, &modp->revs[u]);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002276 }
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002277
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002278 YPR_EXTRA_LINE(modp->revs, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002279
Michal Vasko7c8439f2020-08-05 13:25:19 +02002280 /* body-stmts */
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002281 yang_print_parsed_body(pctx, modp);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002282
2283 LEVEL--;
Michal Vasko5233e962020-08-14 14:26:20 +02002284 ly_print_(out, "%*s}\n", INDENT);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002285 ly_print_flush(out);
2286
2287 return LY_SUCCESS;
2288}
2289
2290static void
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002291yprp_belongsto(struct lys_ypr_ctx *pctx, const struct lysp_submodule *submodp)
Michal Vasko7c8439f2020-08-05 13:25:19 +02002292{
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002293 ly_print_(pctx->out, "%*sbelongs-to %s {\n", INDENT, submodp->mod->name);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002294 LEVEL++;
Michal Vaskob26d09d2022-08-22 09:52:19 +02002295 yprp_extension_instances(pctx, LY_STMT_BELONGS_TO, 0, submodp->exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002296 ypr_substmt(pctx, LY_STMT_PREFIX, 0, submodp->prefix, submodp->exts);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002297 LEVEL--;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002298 ly_print_(pctx->out, "%*s}\n", INDENT);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002299}
2300
2301LY_ERR
Michal Vasko7997d5a2021-02-22 10:55:56 +01002302yang_print_parsed_submodule(struct ly_out *out, const struct lysp_submodule *submodp, uint32_t options)
Michal Vasko7c8439f2020-08-05 13:25:19 +02002303{
2304 LY_ARRAY_COUNT_TYPE u;
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002305 struct lys_ypr_ctx pctx_ = {
Michal Vasko331303f2022-08-22 09:51:57 +02002306 .out = out,
2307 .level = 0,
2308 .options = options,
2309 .module = submodp->mod,
2310 .schema = LYS_YPR_PARSED
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002311 }, *pctx = &pctx_;
Michal Vasko7c8439f2020-08-05 13:25:19 +02002312
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002313 ly_print_(pctx->out, "%*ssubmodule %s {\n", INDENT, submodp->name);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002314 LEVEL++;
2315
2316 /* submodule-header-stmts */
2317 if (submodp->version) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002318 ypr_substmt(pctx, LY_STMT_YANG_VERSION, 0, submodp->version == LYS_VERSION_1_1 ? "1.1" : "1", submodp->exts);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002319 }
2320
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002321 yprp_belongsto(pctx, submodp);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002322
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002323 YPR_EXTRA_LINE(1, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002324
Michal Vasko7c8439f2020-08-05 13:25:19 +02002325 /* linkage-stmts (import/include) */
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002326 yang_print_parsed_linkage(pctx, (struct lysp_module *)submodp);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002327
2328 /* meta-stmts */
2329 if (submodp->org || submodp->contact || submodp->dsc || submodp->ref) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002330 YPR_EXTRA_LINE_PRINT(pctx);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002331 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002332 ypr_substmt(pctx, LY_STMT_ORGANIZATION, 0, submodp->org, submodp->exts);
2333 ypr_substmt(pctx, LY_STMT_CONTACT, 0, submodp->contact, submodp->exts);
2334 ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, submodp->dsc, submodp->exts);
2335 ypr_substmt(pctx, LY_STMT_REFERENCE, 0, submodp->ref, submodp->exts);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002336
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002337 YPR_EXTRA_LINE(submodp->org || submodp->contact || submodp->dsc || submodp->ref, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002338
Michal Vasko7c8439f2020-08-05 13:25:19 +02002339 /* revision-stmts */
Michal Vasko7c8439f2020-08-05 13:25:19 +02002340 LY_ARRAY_FOR(submodp->revs, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002341 YPR_EXTRA_LINE_PRINT(pctx);
2342 yprp_revision(pctx, &submodp->revs[u]);
Michal Vasko7c8439f2020-08-05 13:25:19 +02002343 }
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002344
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002345 YPR_EXTRA_LINE(submodp->revs, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002346
Michal Vasko7c8439f2020-08-05 13:25:19 +02002347 /* body-stmts */
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002348 yang_print_parsed_body(pctx, (struct lysp_module *)submodp);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002349
2350 LEVEL--;
Michal Vasko5233e962020-08-14 14:26:20 +02002351 ly_print_(out, "%*s}\n", INDENT);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002352 ly_print_flush(out);
2353
2354 return LY_SUCCESS;
2355}
2356
2357LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +02002358yang_print_compiled_node(struct ly_out *out, const struct lysc_node *node, uint32_t options)
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08002359{
Michal Vasko331303f2022-08-22 09:51:57 +02002360 struct lys_ypr_ctx pctx_ = {
2361 .out = out,
2362 .level = 0,
2363 .options = options,
2364 .module = node->module,
2365 .schema = LYS_YPR_COMPILED
2366 }, *pctx = &pctx_;
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08002367
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002368 yprc_node(pctx, node);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08002369
2370 ly_print_flush(out);
2371 return LY_SUCCESS;
2372}
2373
2374LY_ERR
Radek Krejci1deb5be2020-08-26 16:43:36 +02002375yang_print_compiled(struct ly_out *out, const struct lys_module *module, uint32_t options)
Radek Krejcid3ca0632019-04-16 16:54:54 +02002376{
Michal Vaskofd69e1d2020-07-03 11:57:17 +02002377 LY_ARRAY_COUNT_TYPE u;
Radek Krejci693262f2019-04-29 15:23:20 +02002378 struct lysc_module *modc = module->compiled;
Michal Vasko331303f2022-08-22 09:51:57 +02002379 struct lys_ypr_ctx pctx_ = {
2380 .out = out,
2381 .level = 0,
2382 .options = options,
2383 .module = module,
2384 .schema = LYS_YPR_COMPILED
2385 }, *pctx = &pctx_;
Radek Krejci693262f2019-04-29 15:23:20 +02002386
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002387 ly_print_(pctx->out, "%*smodule %s {\n", INDENT, module->name);
Radek Krejci693262f2019-04-29 15:23:20 +02002388 LEVEL++;
2389
Radek Krejci693262f2019-04-29 15:23:20 +02002390 /* module-header-stmts */
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002391 ypr_substmt(pctx, LY_STMT_NAMESPACE, 0, module->ns, modc->exts);
2392 ypr_substmt(pctx, LY_STMT_PREFIX, 0, module->prefix, modc->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02002393
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002394 YPR_EXTRA_LINE(1, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002395
Michal Vasko7c8439f2020-08-05 13:25:19 +02002396 /* no linkage-stmts */
Radek Krejci693262f2019-04-29 15:23:20 +02002397
2398 /* meta-stmts */
2399 if (module->org || module->contact || module->dsc || module->ref) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002400 YPR_EXTRA_LINE_PRINT(pctx);
Radek Krejci693262f2019-04-29 15:23:20 +02002401 }
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002402 ypr_substmt(pctx, LY_STMT_ORGANIZATION, 0, module->org, modc->exts);
2403 ypr_substmt(pctx, LY_STMT_CONTACT, 0, module->contact, modc->exts);
2404 ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, module->dsc, modc->exts);
2405 ypr_substmt(pctx, LY_STMT_REFERENCE, 0, module->ref, modc->exts);
Radek Krejci693262f2019-04-29 15:23:20 +02002406
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002407 YPR_EXTRA_LINE(module->org || module->contact || module->dsc || module->ref, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002408
Radek Krejci693262f2019-04-29 15:23:20 +02002409 /* revision-stmts */
2410 if (module->revision) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002411 YPR_EXTRA_LINE_PRINT(pctx);
2412 ly_print_(pctx->out, "%*srevision %s;\n", INDENT, module->revision);
2413 YPR_EXTRA_LINE(1, pctx);
Radek Krejci693262f2019-04-29 15:23:20 +02002414 }
2415
2416 /* body-stmts */
2417 if (modc->exts) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002418 YPR_EXTRA_LINE_PRINT(pctx);
Michal Vaskob26d09d2022-08-22 09:52:19 +02002419 yprc_extension_instances(pctx, LY_STMT_MODULE, 0, module->compiled->exts, NULL);
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002420 YPR_EXTRA_LINE(1, pctx);
Radek Krejci693262f2019-04-29 15:23:20 +02002421 }
2422
Radek Krejci80d281e2020-09-14 17:42:54 +02002423 LY_ARRAY_FOR(module->identities, u) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002424 YPR_EXTRA_LINE_PRINT(pctx);
2425 yprc_identity(pctx, &module->identities[u]);
2426 YPR_EXTRA_LINE(1, pctx);
Radek Krejci693262f2019-04-29 15:23:20 +02002427 }
2428
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002429 if (!(pctx->options & LYS_PRINT_NO_SUBSTMT)) {
Radek Krejci2a9fc652021-01-22 17:44:34 +01002430 struct lysc_node *data;
2431 struct lysc_node_action *rpc;
2432 struct lysc_node_notif *notif;
2433
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08002434 LY_LIST_FOR(modc->data, data) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002435 YPR_EXTRA_LINE_PRINT(pctx);
2436 yprc_node(pctx, data);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08002437 }
Radek Krejci693262f2019-04-29 15:23:20 +02002438
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002439 YPR_EXTRA_LINE(modc->data, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002440
Radek Krejci2a9fc652021-01-22 17:44:34 +01002441 LY_LIST_FOR(modc->rpcs, rpc) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002442 YPR_EXTRA_LINE_PRINT(pctx);
2443 yprc_action(pctx, rpc);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08002444 }
Radek Krejci693262f2019-04-29 15:23:20 +02002445
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002446 YPR_EXTRA_LINE(modc->rpcs, pctx);
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002447
Radek Krejci2a9fc652021-01-22 17:44:34 +01002448 LY_LIST_FOR(modc->notifs, notif) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002449 YPR_EXTRA_LINE_PRINT(pctx);
2450 yprc_notification(pctx, notif);
Radek Krejcid8c0f5e2019-11-17 12:18:34 +08002451 }
Radek Krejciaa14a0c2020-09-04 11:16:47 +02002452
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002453 YPR_EXTRA_LINE(modc->notifs, pctx);
Radek Krejci693262f2019-04-29 15:23:20 +02002454 }
2455
2456 LEVEL--;
Michal Vasko5233e962020-08-14 14:26:20 +02002457 ly_print_(out, "%*s}\n", INDENT);
Radek Krejci693262f2019-04-29 15:23:20 +02002458 ly_print_flush(out);
Radek Krejcid3ca0632019-04-16 16:54:54 +02002459
2460 return LY_SUCCESS;
2461}
Radek Krejciadcf63d2021-02-09 10:21:18 +01002462
Michal Vaskocc28b152022-08-23 14:44:54 +02002463LIBYANG_API_DEF void
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002464lyplg_ext_print_info_extension_instance(struct lyspr_ctx *ctx, const struct lysc_ext_instance *ext, ly_bool *flag)
Radek Krejciadcf63d2021-02-09 10:21:18 +01002465{
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002466 struct lys_ypr_ctx *pctx = (struct lys_ypr_ctx *)ctx;
Radek Krejciadcf63d2021-02-09 10:21:18 +01002467 LY_ARRAY_COUNT_TYPE u, v;
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002468 ly_bool data_printed = 0;
Radek Krejciadcf63d2021-02-09 10:21:18 +01002469
2470 LY_ARRAY_FOR(ext->substmts, u) {
2471 switch (ext->substmts[u].stmt) {
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002472 case LY_STMT_NOTIFICATION:
2473 case LY_STMT_INPUT:
2474 case LY_STMT_OUTPUT:
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002475 case LY_STMT_ACTION:
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002476 case LY_STMT_RPC:
2477 case LY_STMT_ANYDATA:
2478 case LY_STMT_ANYXML:
2479 case LY_STMT_CASE:
Radek Krejciadcf63d2021-02-09 10:21:18 +01002480 case LY_STMT_CHOICE:
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002481 case LY_STMT_CONTAINER:
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002482 case LY_STMT_LEAF:
2483 case LY_STMT_LEAF_LIST:
2484 case LY_STMT_LIST:
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002485 case LY_STMT_USES: {
Radek Krejciadcf63d2021-02-09 10:21:18 +01002486 const struct lysc_node *node;
2487
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002488 if (data_printed) {
2489 break;
2490 }
2491
Radek Krejciadcf63d2021-02-09 10:21:18 +01002492 LY_LIST_FOR(*(const struct lysc_node **)ext->substmts[u].storage, node) {
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002493 ypr_open(pctx->out, flag);
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002494 if (ext->substmts[u].stmt == LY_STMT_NOTIFICATION) {
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002495 yprc_notification(pctx, (struct lysc_node_notif *)node);
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002496 } else if (ext->substmts[u].stmt & (LY_STMT_INPUT | LY_STMT_OUTPUT)) {
2497 yprc_inout(pctx, (struct lysc_node_action_inout *)node, flag);
2498 } else if (ext->substmts[u].stmt & (LY_STMT_ACTION | LY_STMT_RPC)) {
2499 yprc_action(pctx, (struct lysc_node_action *)node);
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002500 } else {
2501 yprc_node(pctx, node);
2502 }
Radek Krejciadcf63d2021-02-09 10:21:18 +01002503 }
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002504
2505 /* all data nodes are stored in a linked list so all were printed */
2506 data_printed = 1;
Radek Krejciadcf63d2021-02-09 10:21:18 +01002507 break;
2508 }
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002509 case LY_STMT_ARGUMENT:
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002510 case LY_STMT_CONTACT:
Radek Krejciadcf63d2021-02-09 10:21:18 +01002511 case LY_STMT_DESCRIPTION:
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002512 case LY_STMT_ERROR_APP_TAG:
2513 case LY_STMT_ERROR_MESSAGE:
2514 case LY_STMT_KEY:
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002515 case LY_STMT_MODIFIER:
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002516 case LY_STMT_NAMESPACE:
2517 case LY_STMT_ORGANIZATION:
2518 case LY_STMT_PRESENCE:
Radek Krejciadcf63d2021-02-09 10:21:18 +01002519 case LY_STMT_REFERENCE:
2520 case LY_STMT_UNITS:
Michal Vasko9c3556a2022-10-06 16:08:47 +02002521 if (*(const char **)ext->substmts[u].storage) {
2522 ypr_open(pctx->out, flag);
2523 ypr_substmt(pctx, ext->substmts[u].stmt, 0, *(const char **)ext->substmts[u].storage, ext->exts);
Radek Krejciadcf63d2021-02-09 10:21:18 +01002524 }
2525 break;
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002526 case LY_STMT_BIT:
2527 case LY_STMT_ENUM: {
2528 const struct lysc_type_bitenum_item *items = *(struct lysc_type_bitenum_item **)ext->substmts[u].storage;
2529
2530 yprc_bits_enum(pctx, items, ext->substmts[u].stmt == LY_STMT_BIT ? LY_TYPE_BITS : LY_TYPE_ENUM, flag);
2531 break;
2532 }
2533 case LY_STMT_CONFIG:
2534 ypr_config(pctx, *(uint16_t *)ext->substmts[u].storage, ext->exts, flag);
2535 break;
2536 case LY_STMT_EXTENSION_INSTANCE:
2537 yprc_extension_instances(pctx, LY_STMT_EXTENSION_INSTANCE, 0,
2538 *(struct lysc_ext_instance **)ext->substmts[u].storage, flag);
2539 break;
2540 case LY_STMT_FRACTION_DIGITS:
2541 if (*(uint8_t *)ext->substmts[u].storage) {
2542 ypr_unsigned(pctx, LY_STMT_FRACTION_DIGITS, 0, ext->exts, *(uint8_t *)ext->substmts[u].storage, flag);
2543 }
2544 break;
2545 case LY_STMT_IDENTITY: {
2546 const struct lysc_ident *idents = *(struct lysc_ident **)ext->substmts[u].storage;
2547
2548 LY_ARRAY_FOR(idents, v) {
2549 yprc_identity(pctx, &idents[v]);
2550 }
2551 break;
2552 }
2553 case LY_STMT_LENGTH:
2554 if (*(struct lysc_range **)ext->substmts[u].storage) {
2555 yprc_range(pctx, *(struct lysc_range **)ext->substmts[u].storage, LY_TYPE_STRING, flag);
2556 }
2557 break;
2558 case LY_STMT_MANDATORY:
2559 ypr_mandatory(pctx, *(uint16_t *)ext->substmts[u].storage, ext->exts, flag);
2560 break;
2561 case LY_STMT_MAX_ELEMENTS: {
2562 uint32_t max = *(uint32_t *)ext->substmts[u].storage;
2563
2564 if (max) {
2565 ypr_unsigned(pctx, LY_STMT_MAX_ELEMENTS, 0, ext->exts, max, flag);
2566 } else {
2567 ypr_open(pctx->out, flag);
2568 ypr_substmt(pctx, LY_STMT_MAX_ELEMENTS, 0, "unbounded", ext->exts);
2569 }
2570 break;
2571 }
2572 case LY_STMT_MIN_ELEMENTS:
2573 ypr_unsigned(pctx, LY_STMT_MIN_ELEMENTS, 0, ext->exts, *(uint32_t *)ext->substmts[u].storage, flag);
2574 break;
2575 case LY_STMT_ORDERED_BY:
2576 ypr_open(pctx->out, flag);
2577 ypr_substmt(pctx, LY_STMT_ORDERED_BY, 0,
2578 (*(uint16_t *)ext->substmts[u].storage & LYS_ORDBY_USER) ? "user" : "system", ext->exts);
2579 break;
Michal Vaskoedb0fa52022-10-04 10:36:00 +02002580 case LY_STMT_MUST: {
2581 const struct lysc_must *musts = *(struct lysc_must **)ext->substmts[u].storage;
2582
2583 LY_ARRAY_FOR(musts, v) {
2584 yprc_must(pctx, &musts[v], flag);
2585 }
2586 break;
2587 }
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002588 case LY_STMT_PATTERN: {
2589 const struct lysc_pattern *patterns = *(struct lysc_pattern **)ext->substmts[u].storage;
2590
2591 LY_ARRAY_FOR(patterns, v) {
2592 yprc_pattern(pctx, &patterns[v], flag);
2593 }
2594 break;
2595 }
2596 case LY_STMT_POSITION:
2597 if (*(int64_t *)ext->substmts[u].storage) {
2598 ypr_unsigned(pctx, ext->substmts[u].stmt, 0, ext->exts, *(int64_t *)ext->substmts[u].storage, flag);
2599 }
2600 break;
2601 case LY_STMT_VALUE:
2602 if (*(int64_t *)ext->substmts[u].storage) {
2603 ypr_signed(pctx, ext->substmts[u].stmt, 0, ext->exts, *(int64_t *)ext->substmts[u].storage, flag);
2604 }
2605 break;
2606 case LY_STMT_RANGE:
2607 if (*(struct lysc_range **)ext->substmts[u].storage) {
2608 yprc_range(pctx, *(struct lysc_range **)ext->substmts[u].storage, LY_TYPE_UINT64, flag);
2609 }
2610 break;
2611 case LY_STMT_REQUIRE_INSTANCE:
2612 ypr_open(pctx->out, flag);
2613 ypr_substmt(pctx, LY_STMT_REQUIRE_INSTANCE, 0, *(uint8_t *)ext->substmts[u].storage ? "true" : "false",
2614 ext->exts);
Radek Krejciadcf63d2021-02-09 10:21:18 +01002615 break;
2616 case LY_STMT_STATUS:
Michal Vasko61ad1ff2022-02-10 15:48:39 +01002617 ypr_status(pctx, *(uint16_t *)ext->substmts[u].storage, ext->exts, flag);
Radek Krejciadcf63d2021-02-09 10:21:18 +01002618 break;
2619 case LY_STMT_TYPE:
Michal Vasko9c3556a2022-10-06 16:08:47 +02002620 if (*(const struct lysc_type **)ext->substmts[u].storage) {
2621 ypr_open(pctx->out, flag);
2622 yprc_type(pctx, *(const struct lysc_type **)ext->substmts[u].storage);
Radek Krejciadcf63d2021-02-09 10:21:18 +01002623 }
2624 break;
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002625 case LY_STMT_WHEN:
2626 yprc_when(pctx, *(struct lysc_when **)ext->substmts[u].storage, flag);
2627 break;
2628 case LY_STMT_AUGMENT:
2629 case LY_STMT_BASE:
2630 case LY_STMT_BELONGS_TO:
2631 case LY_STMT_DEFAULT:
2632 case LY_STMT_DEVIATE:
2633 case LY_STMT_DEVIATION:
2634 case LY_STMT_EXTENSION:
2635 case LY_STMT_FEATURE:
2636 case LY_STMT_GROUPING:
2637 case LY_STMT_IF_FEATURE:
2638 case LY_STMT_IMPORT:
2639 case LY_STMT_INCLUDE:
2640 case LY_STMT_MODULE:
2641 case LY_STMT_PATH:
2642 case LY_STMT_PREFIX:
2643 case LY_STMT_REFINE:
2644 case LY_STMT_REVISION:
2645 case LY_STMT_REVISION_DATE:
2646 case LY_STMT_SUBMODULE:
2647 case LY_STMT_TYPEDEF:
2648 case LY_STMT_UNIQUE:
2649 case LY_STMT_YANG_VERSION:
2650 case LY_STMT_YIN_ELEMENT:
2651 /* nothing to do */
2652 break;
Radek Krejciadcf63d2021-02-09 10:21:18 +01002653 default:
Michal Vaskoa0ba01e2022-10-19 13:26:57 +02002654 LOGINT(pctx->module->ctx);
Radek Krejciadcf63d2021-02-09 10:21:18 +01002655 break;
2656 }
2657 }
2658}