schema printer BUGFIX extension instances
Fixes #1898
diff --git a/src/printer_yang.c b/src/printer_yang.c
index c9f0f21..2089983 100644
--- a/src/printer_yang.c
+++ b/src/printer_yang.c
@@ -3,7 +3,7 @@
* @author Radek Krejci <rkrejci@cesnet.cz>
* @brief YANG printer
*
- * Copyright (c) 2015 - 2019 CESNET, z.s.p.o.
+ * Copyright (c) 2015 - 2022 CESNET, z.s.p.o.
*
* This source code is licensed under BSD 3-Clause License (the "License").
* You may not use this file except in compliance with the License.
@@ -239,76 +239,102 @@
}
}
-/**
- * @param[in] count Number of extensions to print, 0 to print them all.
- */
static void
-yprp_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
- struct lysp_ext_instance *ext, ly_bool *flag, LY_ARRAY_COUNT_TYPE count)
+yprp_extension_instance(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
+ struct lysp_ext_instance *ext, ly_bool *flag)
{
- LY_ARRAY_COUNT_TYPE u;
struct lysp_stmt *stmt;
ly_bool child_presence;
+ struct lysp_ext *ext_def;
- if (!count && ext) {
- count = LY_ARRAY_COUNT(ext);
+ if ((ext->flags & LYS_INTERNAL) || (ext->parent_stmt != substmt) || (ext->parent_stmt_index != substmt_index)) {
+ return;
}
- LY_ARRAY_FOR(ext, u) {
- struct lysp_ext *ext_def = NULL;
- if (!count) {
- break;
- }
+ lysp_ext_find_definition(pctx->module->ctx, ext, NULL, &ext_def);
+ if (!ext_def) {
+ return;
+ }
- count--;
- if ((ext->flags & LYS_INTERNAL) || (ext->parent_stmt != substmt) || (ext->parent_stmt_index != substmt_index)) {
+ ypr_open(pctx->out, flag);
+
+ if (ext_def->argname) {
+ ly_print_(pctx->out, "%*s%s \"", INDENT, ext->name);
+ lysp_ext_instance_resolve_argument(pctx->module->ctx, ext, ext_def);
+ ypr_encode(pctx->out, ext->argument, -1);
+ ly_print_(pctx->out, "\"");
+ } else {
+ ly_print_(pctx->out, "%*s%s", INDENT, ext->name);
+ }
+
+ child_presence = 0;
+ LEVEL++;
+ LY_LIST_FOR(ext->child, stmt) {
+ if (stmt->flags & (LYS_YIN_ATTR | LYS_YIN_ARGUMENT)) {
continue;
}
-
- lysp_ext_find_definition(pctx->module->ctx, &ext[u], NULL, &ext_def);
- if (!ext_def) {
- continue;
+ if (!child_presence) {
+ ly_print_(pctx->out, " {\n");
+ child_presence = 1;
}
-
- ypr_open(pctx->out, flag);
-
- if (ext_def->argname) {
- ly_print_(pctx->out, "%*s%s \"", INDENT, ext[u].name);
- lysp_ext_instance_resolve_argument(pctx->module->ctx, &ext[u], ext_def);
- ypr_encode(pctx->out, ext[u].argument, -1);
- ly_print_(pctx->out, "\"");
- } else {
- ly_print_(pctx->out, "%*s%s", INDENT, ext[u].name);
- }
-
- child_presence = 0;
- LEVEL++;
- LY_LIST_FOR(ext[u].child, stmt) {
- if (stmt->flags & (LYS_YIN_ATTR | LYS_YIN_ARGUMENT)) {
- continue;
- }
- if (!child_presence) {
- ly_print_(pctx->out, " {\n");
- child_presence = 1;
- }
- yprp_stmt(pctx, stmt);
- }
- LEVEL--;
- if (child_presence) {
- ly_print_(pctx->out, "%*s}\n", INDENT);
- } else {
- ly_print_(pctx->out, ";\n");
- }
+ yprp_stmt(pctx, stmt);
+ }
+ LEVEL--;
+ if (child_presence) {
+ ly_print_(pctx->out, "%*s}\n", INDENT);
+ } else {
+ ly_print_(pctx->out, ";\n");
}
}
-static void yprc_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
- struct lysc_ext_instance *ext, ly_bool *flag, LY_ARRAY_COUNT_TYPE count);
-
static void
-ypr_substmt(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index, const char *text, void *ext)
+yprp_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
+ struct lysp_ext_instance *exts, ly_bool *flag)
{
LY_ARRAY_COUNT_TYPE u;
+
+ LY_ARRAY_FOR(exts, u) {
+ yprp_extension_instance(pctx, substmt, substmt_index, &exts[u], flag);
+ }
+}
+
+static void
+yprc_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
+ struct lysc_ext_instance *exts, ly_bool *flag)
+{
+ LY_ARRAY_COUNT_TYPE u;
+ ly_bool inner_flag;
+
+ LY_ARRAY_FOR(exts, u) {
+ if ((exts[u].parent_stmt != substmt) || (exts[u].parent_stmt_index != substmt_index)) {
+ return;
+ }
+
+ ypr_open(pctx->out, flag);
+ if (exts[u].argument) {
+ ly_print_(pctx->out, "%*s%s:%s \"", INDENT, exts[u].def->module->name, exts[u].def->name);
+ ypr_encode(pctx->out, exts[u].argument, -1);
+ ly_print_(pctx->out, "\"");
+ } else {
+ ly_print_(pctx->out, "%*s%s:%s", INDENT, exts[u].def->module->name, exts[u].def->name);
+ }
+
+ LEVEL++;
+ inner_flag = 0;
+ yprc_extension_instances(pctx, LY_STMT_EXTENSION_INSTANCE, 0, exts[u].exts, &inner_flag);
+
+ if (exts[u].def->plugin && exts[u].def->plugin->sprinter) {
+ exts[u].def->plugin->sprinter(&pctx->printer_ctx, &exts[u], &inner_flag);
+ }
+
+ LEVEL--;
+ ypr_close(pctx, inner_flag);
+ }
+}
+
+static void
+ypr_substmt(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index, const char *text, void *exts)
+{
ly_bool extflag = 0;
if (!text) {
@@ -324,15 +350,10 @@
}
LEVEL++;
- LY_ARRAY_FOR(ext, u) {
- if ((((struct lysp_ext_instance *)ext)[u].parent_stmt != substmt) || (((struct lysp_ext_instance *)ext)[u].parent_stmt_index != substmt_index)) {
- continue;
- }
- if (pctx->schema == LYS_YPR_PARSED) {
- yprp_extension_instances(pctx, substmt, substmt_index, &((struct lysp_ext_instance *)ext)[u], &extflag, 1);
- } else {
- yprc_extension_instances(pctx, substmt, substmt_index, &((struct lysc_ext_instance *)ext)[u], &extflag, 1);
- }
+ if (pctx->schema == LYS_YPR_PARSED) {
+ yprp_extension_instances(pctx, substmt, substmt_index, exts, &extflag);
+ } else {
+ yprc_extension_instances(pctx, substmt, substmt_index, exts, &extflag);
}
LEVEL--;
ypr_close(pctx, extflag);
@@ -374,7 +395,7 @@
if (rev->dsc || rev->ref || rev->exts) {
ly_print_(pctx->out, "%*srevision %s {\n", INDENT, rev->date);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_REVISION, 0, rev->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_REVISION, 0, rev->exts, NULL);
ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, rev->dsc, rev->exts);
ypr_substmt(pctx, LY_STMT_REFERENCE, 0, rev->ref, rev->exts);
LEVEL--;
@@ -442,7 +463,7 @@
static void
yprp_iffeatures(struct lys_ypr_ctx *pctx, struct lysp_qname *iffs, struct lysp_ext_instance *exts, ly_bool *flag)
{
- LY_ARRAY_COUNT_TYPE u, v;
+ LY_ARRAY_COUNT_TYPE u;
ly_bool extflag;
LY_ARRAY_FOR(iffs, u) {
@@ -453,9 +474,7 @@
/* extensions */
LEVEL++;
- LY_ARRAY_FOR(exts, v) {
- yprp_extension_instances(pctx, LY_STMT_IF_FEATURE, u, &exts[v], &extflag, 1);
- }
+ yprp_extension_instances(pctx, LY_STMT_IF_FEATURE, u, exts, &extflag);
LEVEL--;
ypr_close(pctx, extflag);
}
@@ -470,9 +489,7 @@
ly_print_(pctx->out, "%*sextension %s", INDENT, ext->name);
LEVEL++;
- if (ext->exts) {
- yprp_extension_instances(pctx, LY_STMT_EXTENSION, 0, ext->exts, &flag, 0);
- }
+ yprp_extension_instances(pctx, LY_STMT_EXTENSION, 0, ext->exts, &flag);
if (ext->argname) {
ypr_open(pctx->out, &flag);
@@ -481,7 +498,7 @@
if (ext->exts) {
u = -1;
while ((u = lysp_ext_instance_iter(ext->exts, u + 1, LY_STMT_ARGUMENT)) != LY_ARRAY_COUNT(ext->exts)) {
- yprp_extension_instances(pctx, LY_STMT_ARGUMENT, 0, &ext->exts[u], &flag2, 1);
+ yprp_extension_instance(pctx, LY_STMT_ARGUMENT, 0, &ext->exts[u], &flag2);
}
}
if ((ext->flags & LYS_YINELEM_MASK) ||
@@ -508,7 +525,7 @@
ly_print_(pctx->out, "%*sfeature %s", INDENT, feat->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_FEATURE, 0, feat->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_FEATURE, 0, feat->exts, &flag);
yprp_iffeatures(pctx, feat->iffeatures, feat->exts, &flag);
ypr_status(pctx, feat->flags, feat->exts, &flag);
ypr_description(pctx, feat->dsc, feat->exts, &flag);
@@ -526,7 +543,7 @@
ly_print_(pctx->out, "%*sidentity %s", INDENT, ident->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag);
yprp_iffeatures(pctx, ident->iffeatures, ident->exts, &flag);
LY_ARRAY_FOR(ident->bases, u) {
@@ -551,7 +568,7 @@
ly_print_(pctx->out, "%*sidentity %s", INDENT, ident->name);
LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag);
ypr_open(pctx->out, &flag);
if (lys_identity_iffeature_value(ident) == LY_ENOT) {
@@ -591,7 +608,7 @@
ypr_text(pctx, ly_stmt2str(stmt), text, singleline, 0);
LEVEL++;
- yprp_extension_instances(pctx, stmt, 0, restr->exts, &inner_flag, 0);
+ yprp_extension_instances(pctx, stmt, 0, restr->exts, &inner_flag);
if (restr->arg.str[0] == LYSP_RESTR_PATTERN_NACK) {
/* special byte value in pattern's expression: 0x15 - invert-match, 0x06 - match */
ypr_open(pctx->out, &inner_flag);
@@ -623,7 +640,7 @@
ly_print_(pctx->out, "\"");
LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_MUST, 0, must->exts, &inner_flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_MUST, 0, must->exts, &inner_flag);
if (must->emsg) {
ypr_open(pctx->out, &inner_flag);
ypr_substmt(pctx, LY_STMT_ERROR_MESSAGE, 0, must->emsg, must->exts);
@@ -672,7 +689,7 @@
ly_print_(pctx->out, "\"");
LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_RANGE, 0, range->exts, &inner_flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_RANGE, 0, range->exts, &inner_flag);
if (range->emsg) {
ypr_open(pctx->out, &inner_flag);
ypr_substmt(pctx, LY_STMT_ERROR_MESSAGE, 0, range->emsg, range->exts);
@@ -699,7 +716,7 @@
ly_print_(pctx->out, "\"");
LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_PATTERN, 0, pattern->exts, &inner_flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_PATTERN, 0, pattern->exts, &inner_flag);
if (pattern->inverted) {
/* special byte value in pattern's expression: 0x15 - invert-match, 0x06 - match */
ypr_open(pctx->out, &inner_flag);
@@ -735,7 +752,7 @@
ly_print_(pctx->out, "\"");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag);
ypr_description(pctx, when->dsc, when->exts, &inner_flag);
ypr_reference(pctx, when->ref, when->exts, &inner_flag);
LEVEL--;
@@ -757,7 +774,7 @@
ly_print_(pctx->out, "\"");
LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag);
ypr_description(pctx, when->dsc, when->exts, &inner_flag);
ypr_reference(pctx, when->ref, when->exts, &inner_flag);
LEVEL--;
@@ -781,7 +798,7 @@
}
inner_flag = 0;
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_ENUM, 0, items[u].exts, &inner_flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_ENUM, 0, items[u].exts, &inner_flag);
yprp_iffeatures(pctx, items[u].iffeatures, items[u].exts, &inner_flag);
if (items[u].flags & LYS_SET_VALUE) {
if (type == LY_TYPE_BITS) {
@@ -807,7 +824,7 @@
ly_print_(pctx->out, "%*stype %s", INDENT, type->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag);
yprp_restr(pctx, type->range, LY_STMT_RANGE, &flag);
yprp_restr(pctx, type->length, LY_STMT_LENGTH, &flag);
@@ -864,7 +881,7 @@
ly_print_(pctx->out, "%*stype %s", INDENT, lys_datatype2str(type->basetype));
LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag);
switch (type->basetype) {
case LY_TYPE_BINARY: {
@@ -910,10 +927,10 @@
ly_print_(pctx->out, "\"");
LEVEL++;
if (type->basetype == LY_TYPE_BITS) {
- yprc_extension_instances(pctx, LY_STMT_BIT, 0, item->exts, &inner_flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_BIT, 0, item->exts, &inner_flag);
ypr_unsigned(pctx, LY_STMT_POSITION, 0, item->exts, item->position, &inner_flag);
} else { /* LY_TYPE_ENUM */
- yprc_extension_instances(pctx, LY_STMT_ENUM, 0, item->exts, &inner_flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_ENUM, 0, item->exts, &inner_flag);
ypr_signed(pctx, LY_STMT_VALUE, 0, item->exts, item->value, &inner_flag);
}
ypr_status(pctx, item->flags, item->exts, &inner_flag);
@@ -984,7 +1001,7 @@
ly_print_(pctx->out, "%*stypedef %s {\n", INDENT, tpdf->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_TYPEDEF, 0, tpdf->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_TYPEDEF, 0, tpdf->exts, NULL);
yprp_type(pctx, &tpdf->type);
@@ -1021,7 +1038,7 @@
ly_print_(pctx->out, "%*sgrouping %s", INDENT, grp->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_GROUPING, 0, grp->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_GROUPING, 0, grp->exts, &flag);
ypr_status(pctx, grp->flags, grp->exts, &flag);
ypr_description(pctx, grp->dsc, grp->exts, &flag);
ypr_reference(pctx, grp->ref, grp->exts, &flag);
@@ -1072,7 +1089,7 @@
ly_print_(pctx->out, "%*s%s {\n", INDENT, inout->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_MUST, 0, inout->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_MUST, 0, inout->exts, NULL);
LY_ARRAY_FOR(inout->musts, u) {
yprp_restr(pctx, &inout->musts[u], LY_STMT_MUST, NULL);
}
@@ -1106,7 +1123,7 @@
ly_print_(pctx->out, "\n%*s%s {\n", INDENT, inout->name);
LEVEL++;
- yprc_extension_instances(pctx, lys_nodetype2stmt(inout->nodetype), 0, inout->exts, NULL, 0);
+ yprc_extension_instances(pctx, lys_nodetype2stmt(inout->nodetype), 0, inout->exts, NULL);
LY_ARRAY_FOR(inout->musts, u) {
yprc_must(pctx, &inout->musts[u], NULL);
}
@@ -1132,7 +1149,7 @@
ly_print_(pctx->out, "%*snotification %s", INDENT, notif->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag);
yprp_iffeatures(pctx, notif->iffeatures, notif->exts, &flag);
LY_ARRAY_FOR(notif->musts, u) {
@@ -1171,7 +1188,7 @@
ly_print_(pctx->out, "%*snotification %s", INDENT, notif->name);
LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag, 0);
+ yprc_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag);
LY_ARRAY_FOR(notif->musts, u) {
yprc_must(pctx, ¬if->musts[u], &flag);
@@ -1201,7 +1218,7 @@
ly_print_(pctx->out, "%*s%s %s", INDENT, action->parent ? "action" : "rpc", action->name);
LEVEL++;
- yprp_extension_instances(pctx, lys_nodetype2stmt(action->nodetype), 0, action->exts, &flag, 0);
+ yprp_extension_instances(pctx, lys_nodetype2stmt(action->nodetype), 0, action->exts, &flag);
yprp_iffeatures(pctx, action->iffeatures, action->exts, &flag);
ypr_status(pctx, action->flags, action->exts, &flag);
ypr_description(pctx, action->dsc, action->exts, &flag);
@@ -1240,7 +1257,7 @@
ly_print_(pctx->out, "%*s%s %s", INDENT, action->parent ? "action" : "rpc", action->name);
LEVEL++;
- yprc_extension_instances(pctx, lys_nodetype2stmt(action->nodetype), 0, action->exts, &flag, 0);
+ yprc_extension_instances(pctx, lys_nodetype2stmt(action->nodetype), 0, action->exts, &flag);
ypr_status(pctx, action->flags, action->exts, &flag);
ypr_description(pctx, action->dsc, action->exts, &flag);
ypr_reference(pctx, action->ref, action->exts, &flag);
@@ -1258,7 +1275,7 @@
ly_print_(pctx->out, "%*s%s %s%s", INDENT, lys_nodetype2str(node->nodetype), node->name, flag ? "" : " {\n");
LEVEL++;
- yprp_extension_instances(pctx, lys_nodetype2stmt(node->nodetype), 0, node->exts, flag, 0);
+ yprp_extension_instances(pctx, lys_nodetype2stmt(node->nodetype), 0, node->exts, flag);
yprp_when(pctx, lysp_node_when(node), flag);
yprp_iffeatures(pctx, node->iffeatures, node->exts, flag);
}
@@ -1272,7 +1289,7 @@
ly_print_(pctx->out, "%*s%s %s%s", INDENT, lys_nodetype2str(node->nodetype), node->name, flag ? "" : " {\n");
LEVEL++;
- yprc_extension_instances(pctx, lys_nodetype2stmt(node->nodetype), 0, node->exts, flag, 0);
+ yprc_extension_instances(pctx, lys_nodetype2stmt(node->nodetype), 0, node->exts, flag);
when = lysc_node_when(node);
LY_ARRAY_FOR(when, u) {
@@ -1280,7 +1297,7 @@
}
}
-/* macr oto unify the code */
+/* macro to unify the code */
#define YPR_NODE_COMMON2 \
ypr_config(pctx, node->flags, node->exts, flag); \
if (node->nodetype & (LYS_CHOICE | LYS_LEAF | LYS_ANYDATA)) { \
@@ -1760,7 +1777,7 @@
ly_print_(pctx->out, "%*srefine \"%s\"", INDENT, refine->nodeid);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_REFINE, 0, refine->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_REFINE, 0, refine->exts, &flag);
yprp_iffeatures(pctx, refine->iffeatures, refine->exts, &flag);
LY_ARRAY_FOR(refine->musts, u) {
@@ -1811,7 +1828,7 @@
ly_print_(pctx->out, "%*saugment \"%s\" {\n", INDENT, aug->nodeid);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_AUGMENT, 0, aug->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_AUGMENT, 0, aug->exts, NULL);
yprp_when(pctx, aug->when, NULL);
yprp_iffeatures(pctx, aug->iffeatures, aug->exts, NULL);
ypr_status(pctx, aug->flags, aug->exts, NULL);
@@ -1973,7 +1990,7 @@
ly_print_(pctx->out, "%*sdeviation \"%s\" {\n", INDENT, deviation->nodeid);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATION, 0, deviation->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATION, 0, deviation->exts, NULL);
ypr_description(pctx, deviation->dsc, deviation->exts, NULL);
ypr_reference(pctx, deviation->ref, deviation->exts, NULL);
@@ -1984,7 +2001,7 @@
ly_print_(pctx->out, "not-supported {\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, elem->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, elem->exts, NULL);
} else {
ly_print_(pctx->out, "not-supported;\n");
continue;
@@ -1994,7 +2011,7 @@
ly_print_(pctx->out, "add {\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, add->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, add->exts, NULL);
ypr_substmt(pctx, LY_STMT_UNITS, 0, add->units, add->exts);
LY_ARRAY_FOR(add->musts, u) {
yprp_restr(pctx, &add->musts[u], LY_STMT_MUST, NULL);
@@ -2022,7 +2039,7 @@
ly_print_(pctx->out, "replace {\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, rpl->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, rpl->exts, NULL);
if (rpl->type) {
yprp_type(pctx, rpl->type);
}
@@ -2045,7 +2062,7 @@
ly_print_(pctx->out, "delete {\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, del->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, del->exts, NULL);
ypr_substmt(pctx, LY_STMT_UNITS, 0, del->units, del->exts);
LY_ARRAY_FOR(del->musts, u) {
yprp_restr(pctx, &del->musts[u], LY_STMT_MUST, NULL);
@@ -2079,7 +2096,7 @@
YPR_EXTRA_LINE_PRINT(pctx);
ly_print_(pctx->out, "%*simport %s {\n", INDENT, modp->imports[u].name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_IMPORT, 0, modp->imports[u].exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_IMPORT, 0, modp->imports[u].exts, NULL);
ypr_substmt(pctx, LY_STMT_PREFIX, 0, modp->imports[u].prefix, modp->imports[u].exts);
if (modp->imports[u].rev[0]) {
ypr_substmt(pctx, LY_STMT_REVISION_DATE, 0, modp->imports[u].rev, modp->imports[u].exts);
@@ -2100,7 +2117,7 @@
if (modp->includes[u].rev[0] || modp->includes[u].dsc || modp->includes[u].ref || modp->includes[u].exts) {
ly_print_(pctx->out, "%*sinclude %s {\n", INDENT, modp->includes[u].name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_INCLUDE, 0, modp->includes[u].exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_INCLUDE, 0, modp->includes[u].exts, NULL);
if (modp->includes[u].rev[0]) {
ypr_substmt(pctx, LY_STMT_REVISION_DATE, 0, modp->includes[u].rev, modp->includes[u].exts);
}
@@ -2134,7 +2151,7 @@
if (modp->exts) {
YPR_EXTRA_LINE_PRINT(pctx);
- yprp_extension_instances(pctx, LY_STMT_MODULE, 0, modp->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_MODULE, 0, modp->exts, NULL);
}
YPR_EXTRA_LINE(modp->exts, pctx);
@@ -2269,7 +2286,7 @@
{
ly_print_(pctx->out, "%*sbelongs-to %s {\n", INDENT, submodp->mod->name);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_BELONGS_TO, 0, submodp->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_BELONGS_TO, 0, submodp->exts, NULL);
ypr_substmt(pctx, LY_STMT_PREFIX, 0, submodp->prefix, submodp->exts);
LEVEL--;
ly_print_(pctx->out, "%*s}\n", INDENT);
@@ -2393,7 +2410,7 @@
/* body-stmts */
if (modc->exts) {
YPR_EXTRA_LINE_PRINT(pctx);
- yprc_extension_instances(pctx, LY_STMT_MODULE, 0, module->compiled->exts, NULL, 0);
+ yprc_extension_instances(pctx, LY_STMT_MODULE, 0, module->compiled->exts, NULL);
YPR_EXTRA_LINE(1, pctx);
}
@@ -2437,51 +2454,6 @@
return LY_SUCCESS;
}
-/**
- * @param[in] count Number of extensions to print, 0 to print them all.
- */
-static void
-yprc_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
- struct lysc_ext_instance *ext, ly_bool *flag, LY_ARRAY_COUNT_TYPE count)
-{
- LY_ARRAY_COUNT_TYPE u;
-
- if (!count && ext) {
- count = LY_ARRAY_COUNT(ext);
- }
- LY_ARRAY_FOR(ext, u) {
- ly_bool inner_flag = 0;
-
- if (!count) {
- break;
- }
-
- count--;
- if ((ext->parent_stmt != substmt) || (ext->parent_stmt_index != substmt_index)) {
- continue;
- }
-
- ypr_open(pctx->out, flag);
- if (ext[u].argument) {
- ly_print_(pctx->out, "%*s%s:%s \"", INDENT, ext[u].def->module->name, ext[u].def->name);
- ypr_encode(pctx->out, ext[u].argument, -1);
- ly_print_(pctx->out, "\"");
- } else {
- ly_print_(pctx->out, "%*s%s:%s", INDENT, ext[u].def->module->name, ext[u].def->name);
- }
-
- LEVEL++;
- yprc_extension_instances(pctx, LY_STMT_EXTENSION_INSTANCE, 0, ext[u].exts, &inner_flag, 0);
-
- if (ext[u].def->plugin && ext[u].def->plugin->sprinter) {
- ext[u].def->plugin->sprinter(&pctx->printer_ctx, &ext[u], &inner_flag);
- }
-
- LEVEL--;
- ypr_close(pctx, inner_flag);
- }
-}
-
void
lysc_print_extension_instance(struct lyspr_ctx *ctx_generic, const struct lysc_ext_instance *ext, ly_bool *flag)
{
diff --git a/src/printer_yin.c b/src/printer_yin.c
index 0c4bc22..c66c371 100644
--- a/src/printer_yin.c
+++ b/src/printer_yin.c
@@ -1,9 +1,10 @@
/**
* @file printer_yin.c
* @author Fred Gan <ganshaolong@vip.qq.com>
+ * @author Michal Vasko <mvasko@cesnet.cz>
* @brief YIN printer
*
- * Copyright (c) 2015 - 2019 CESNET, z.s.p.o.
+ * Copyright (c) 2015 - 2022 CESNET, z.s.p.o.
*
* This source code is licensed under BSD 3-Clause License (the "License").
* You may not use this file except in compliance with the License.
@@ -47,9 +48,6 @@
/* YIN printer specific members */
};
-static void yprp_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
- struct lysp_ext_instance *ext, int8_t *flag, LY_ARRAY_COUNT_TYPE count);
-
static void
ypr_open(struct lys_ypr_ctx *pctx, const char *elem_name, const char *attr_name, const char *attr_value, int8_t flag)
{
@@ -97,9 +95,99 @@
}
static void
-ypr_substmt(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index, const char *text, void *ext)
+yprp_stmt(struct lys_ypr_ctx *pctx, struct lysp_stmt *stmt)
+{
+ struct lysp_stmt *childstmt;
+ int8_t flag = stmt->child ? 1 : -1;
+
+ /* TODO:
+ the extension instance substatements in extension instances (LY_STMT_EXTENSION_INSTANCE)
+ cannot find the compiled information, so it is needed to be done,
+ currently it is ignored */
+ if (stmt_attr_info[stmt->kw].name) {
+ if (stmt_attr_info[stmt->kw].flags & STMT_FLAG_YIN) {
+ ypr_open(pctx, stmt->stmt, NULL, NULL, flag);
+ ypr_yin_arg(pctx, stmt_attr_info[stmt->kw].arg, stmt->arg);
+ } else {
+ ypr_open(pctx, stmt->stmt, stmt_attr_info[stmt->kw].arg, stmt->arg, flag);
+ }
+ }
+
+ if (stmt->child) {
+ LEVEL++;
+ LY_LIST_FOR(stmt->child, childstmt) {
+ yprp_stmt(pctx, childstmt);
+ }
+ LEVEL--;
+ ypr_close(pctx, stmt->stmt, flag);
+ }
+}
+
+static void
+yprp_extension_instance(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
+ struct lysp_ext_instance *ext, int8_t *flag)
+{
+ struct lysp_stmt *stmt;
+ int8_t inner_flag;
+ struct lysp_ext *ext_def;
+
+ if ((ext->flags & LYS_INTERNAL) || (ext->parent_stmt != substmt) || (ext->parent_stmt_index != substmt_index)) {
+ return;
+ }
+
+ lysp_ext_find_definition(pctx->module->ctx, ext, NULL, &ext_def);
+ if (!ext_def) {
+ return;
+ }
+
+ ypr_close_parent(pctx, flag);
+ inner_flag = 0;
+
+ if (ext_def->argname) {
+ lysp_ext_instance_resolve_argument(pctx->module->ctx, ext, ext_def);
+ }
+
+ ypr_open(pctx, ext->name, (ext_def->flags & LYS_YINELEM_TRUE) ? NULL : ext_def->argname, ext->argument, inner_flag);
+ LEVEL++;
+ if (ext_def->flags & LYS_YINELEM_TRUE) {
+ const char *prefix, *name, *id;
+ size_t prefix_len, name_len;
+
+ ypr_close_parent(pctx, &inner_flag);
+
+ /* we need to use the same namespace as for the extension instance element */
+ id = ext->name;
+ ly_parse_nodeid(&id, &prefix, &prefix_len, &name, &name_len);
+ ly_print_(pctx->out, "%*s<%.*s:%s>", INDENT, (int)prefix_len, prefix, ext_def->argname);
+ lyxml_dump_text(pctx->out, ext->argument, 0);
+ ly_print_(pctx->out, "</%.*s:%s>\n", (int)prefix_len, prefix, ext_def->argname);
+ }
+ LY_LIST_FOR(ext->child, stmt) {
+ if (stmt->flags & (LYS_YIN_ATTR | LYS_YIN_ARGUMENT)) {
+ continue;
+ }
+
+ ypr_close_parent(pctx, &inner_flag);
+ yprp_stmt(pctx, stmt);
+ }
+ LEVEL--;
+ ypr_close(pctx, ext->name, inner_flag);
+}
+
+static void
+yprp_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
+ struct lysp_ext_instance *exts, int8_t *flag)
{
LY_ARRAY_COUNT_TYPE u;
+
+ LY_ARRAY_FOR(exts, u) {
+ yprp_extension_instance(pctx, substmt, substmt_index, &exts[u], flag);
+ }
+}
+
+static void
+ypr_substmt(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index, const char *text, void *exts)
+{
int8_t extflag = 0;
if (!text) {
@@ -115,12 +203,7 @@
}
LEVEL++;
- LY_ARRAY_FOR(ext, u) {
- if ((((struct lysp_ext_instance *)ext)[u].parent_stmt != substmt) || (((struct lysp_ext_instance *)ext)[u].parent_stmt_index != substmt_index)) {
- continue;
- }
- yprp_extension_instances(pctx, substmt, substmt_index, &((struct lysp_ext_instance *)ext)[u], &extflag, 1);
- }
+ yprp_extension_instances(pctx, substmt, substmt_index, exts, &extflag);
/* argument as yin-element */
if (stmt_attr_info[substmt].flags & STMT_FLAG_YIN) {
@@ -163,7 +246,7 @@
if (rev->dsc || rev->ref || rev->exts) {
ypr_open(pctx, "revision", "date", rev->date, 1);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_REVISION, 0, rev->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_REVISION, 0, rev->exts, NULL);
ypr_substmt(pctx, LY_STMT_DESCRIPTION, 0, rev->dsc, rev->exts);
ypr_substmt(pctx, LY_STMT_REFERENCE, 0, rev->ref, rev->exts);
LEVEL--;
@@ -231,7 +314,7 @@
static void
yprp_iffeatures(struct lys_ypr_ctx *pctx, struct lysp_qname *iffs, struct lysp_ext_instance *exts, int8_t *flag)
{
- LY_ARRAY_COUNT_TYPE u, v;
+ LY_ARRAY_COUNT_TYPE u;
int8_t extflag;
LY_ARRAY_FOR(iffs, u) {
@@ -242,9 +325,7 @@
/* extensions */
LEVEL++;
- LY_ARRAY_FOR(exts, v) {
- yprp_extension_instances(pctx, LY_STMT_IF_FEATURE, u, &exts[v], &extflag, 1);
- }
+ yprp_extension_instances(pctx, LY_STMT_IF_FEATURE, u, exts, &extflag);
LEVEL--;
ly_print_(pctx->out, "\"/>\n");
}
@@ -261,7 +342,7 @@
if (ext->exts) {
ypr_close_parent(pctx, &flag);
- yprp_extension_instances(pctx, LY_STMT_EXTENSION, 0, ext->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_EXTENSION, 0, ext->exts, &flag);
}
if (ext->argname) {
@@ -273,7 +354,7 @@
u = -1;
while ((u = lysp_ext_instance_iter(ext->exts, u + 1, LY_STMT_ARGUMENT)) != LY_ARRAY_COUNT(ext->exts)) {
ypr_close_parent(pctx, &flag2);
- yprp_extension_instances(pctx, LY_STMT_ARGUMENT, 0, &ext->exts[u], &flag2, 1);
+ yprp_extension_instance(pctx, LY_STMT_ARGUMENT, 0, &ext->exts[u], &flag2);
}
}
if ((ext->flags & LYS_YINELEM_MASK) ||
@@ -300,7 +381,7 @@
ypr_open(pctx, "feature", "name", feat->name, flag);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_FEATURE, 0, feat->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_FEATURE, 0, feat->exts, &flag);
yprp_iffeatures(pctx, feat->iffeatures, feat->exts, &flag);
ypr_status(pctx, feat->flags, feat->exts, &flag);
ypr_description(pctx, feat->dsc, feat->exts, &flag);
@@ -318,7 +399,7 @@
ypr_open(pctx, "identity", "name", ident->name, flag);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_IDENTITY, 0, ident->exts, &flag);
yprp_iffeatures(pctx, ident->iffeatures, ident->exts, &flag);
LY_ARRAY_FOR(ident->bases, u) {
@@ -351,7 +432,7 @@
ly_print_(pctx->out, "\"");
LEVEL++;
- yprp_extension_instances(pctx, stmt, 0, restr->exts, &inner_flag, 0);
+ yprp_extension_instances(pctx, stmt, 0, restr->exts, &inner_flag);
if (restr->arg.str[0] == LYSP_RESTR_PATTERN_NACK) {
ypr_close_parent(pctx, &inner_flag);
/* special byte value in pattern's expression: 0x15 - invert-match, 0x06 - match */
@@ -387,7 +468,7 @@
ly_print_(pctx->out, "\"");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_WHEN, 0, when->exts, &inner_flag);
ypr_description(pctx, when->dsc, when->exts, &inner_flag);
ypr_reference(pctx, when->ref, when->exts, &inner_flag);
LEVEL--;
@@ -414,7 +495,7 @@
}
inner_flag = 0;
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_ENUM, 0, items[u].exts, &inner_flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_ENUM, 0, items[u].exts, &inner_flag);
yprp_iffeatures(pctx, items[u].iffeatures, items[u].exts, &inner_flag);
if (items[u].flags & LYS_SET_VALUE) {
if (type == LY_TYPE_BITS) {
@@ -446,7 +527,7 @@
ypr_open(pctx, "type", "name", type->name, flag);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_TYPE, 0, type->exts, &flag);
if (type->range || type->length || type->patterns || type->bits || type->enums) {
ypr_close_parent(pctx, &flag);
@@ -490,7 +571,7 @@
ypr_open(pctx, "typedef", "name", tpdf->name, 1);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_TYPEDEF, 0, tpdf->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_TYPEDEF, 0, tpdf->exts, NULL);
yprp_type(pctx, &tpdf->type);
@@ -526,7 +607,7 @@
ypr_open(pctx, "grouping", "name", grp->name, flag);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_GROUPING, 0, grp->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_GROUPING, 0, grp->exts, &flag);
ypr_status(pctx, grp->flags, grp->exts, &flag);
ypr_description(pctx, grp->dsc, grp->exts, &flag);
ypr_reference(pctx, grp->ref, grp->exts, &flag);
@@ -576,7 +657,7 @@
ypr_open(pctx, inout->name, NULL, NULL, *flag);
LEVEL++;
- yprp_extension_instances(pctx, lys_nodetype2stmt(inout->nodetype), 0, inout->exts, NULL, 0);
+ yprp_extension_instances(pctx, lys_nodetype2stmt(inout->nodetype), 0, inout->exts, NULL);
LY_ARRAY_FOR(inout->musts, u) {
yprp_restr(pctx, &inout->musts[u], LY_STMT_MUST, "condition", NULL);
}
@@ -606,7 +687,7 @@
ypr_open(pctx, "notification", "name", notif->name, flag);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_NOTIFICATION, 0, notif->exts, &flag);
yprp_iffeatures(pctx, notif->iffeatures, notif->exts, &flag);
LY_ARRAY_FOR(notif->musts, u) {
@@ -646,7 +727,7 @@
ypr_open(pctx, action->parent ? "action" : "rpc", "name", action->name, flag);
LEVEL++;
- yprp_extension_instances(pctx, lys_nodetype2stmt(action->nodetype), 0, action->exts, &flag, 0);
+ yprp_extension_instances(pctx, lys_nodetype2stmt(action->nodetype), 0, action->exts, &flag);
yprp_iffeatures(pctx, action->iffeatures, action->exts, &flag);
ypr_status(pctx, action->flags, action->exts, &flag);
ypr_description(pctx, action->dsc, action->exts, &flag);
@@ -675,7 +756,7 @@
ypr_open(pctx, lys_nodetype2str(node->nodetype), "name", node->name, *flag);
LEVEL++;
- yprp_extension_instances(pctx, lys_nodetype2stmt(node->nodetype), 0, node->exts, flag, 0);
+ yprp_extension_instances(pctx, lys_nodetype2stmt(node->nodetype), 0, node->exts, flag);
yprp_when(pctx, lysp_node_when(node), flag);
yprp_iffeatures(pctx, node->iffeatures, node->exts, flag);
}
@@ -941,7 +1022,7 @@
ypr_open(pctx, "refine", "target-node", refine->nodeid, flag);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_REFINE, 0, refine->exts, &flag, 0);
+ yprp_extension_instances(pctx, LY_STMT_REFINE, 0, refine->exts, &flag);
yprp_iffeatures(pctx, refine->iffeatures, refine->exts, &flag);
LY_ARRAY_FOR(refine->musts, u) {
@@ -992,7 +1073,7 @@
ypr_open(pctx, "augment", "target-node", aug->nodeid, 1);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_AUGMENT, 0, aug->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_AUGMENT, 0, aug->exts, NULL);
yprp_when(pctx, aug->when, NULL);
yprp_iffeatures(pctx, aug->iffeatures, aug->exts, NULL);
ypr_status(pctx, aug->flags, aug->exts, NULL);
@@ -1106,7 +1187,7 @@
ypr_open(pctx, "deviation", "target-node", deviation->nodeid, 1);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATION, 0, deviation->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATION, 0, deviation->exts, NULL);
ypr_description(pctx, deviation->dsc, deviation->exts, NULL);
ypr_reference(pctx, deviation->ref, deviation->exts, NULL);
@@ -1117,7 +1198,7 @@
ly_print_(pctx->out, "not-supported\"/>\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, elem->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, elem->exts, NULL);
} else {
ly_print_(pctx->out, "not-supported\"/>\n");
continue;
@@ -1127,7 +1208,7 @@
ly_print_(pctx->out, "add\">\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, add->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, add->exts, NULL);
ypr_substmt(pctx, LY_STMT_UNITS, 0, add->units, add->exts);
LY_ARRAY_FOR(add->musts, u) {
yprp_restr(pctx, &add->musts[u], LY_STMT_MUST, "condition", NULL);
@@ -1155,7 +1236,7 @@
ly_print_(pctx->out, "replace\">\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, rpl->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, rpl->exts, NULL);
if (rpl->type) {
yprp_type(pctx, rpl->type);
}
@@ -1178,7 +1259,7 @@
ly_print_(pctx->out, "delete\">\n");
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, del->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_DEVIATE, 0, del->exts, NULL);
ypr_substmt(pctx, LY_STMT_UNITS, 0, del->units, del->exts);
LY_ARRAY_FOR(del->musts, u) {
yprp_restr(pctx, &del->musts[u], LY_STMT_MUST, "condition", NULL);
@@ -1217,101 +1298,6 @@
}
static void
-yprp_stmt(struct lys_ypr_ctx *pctx, struct lysp_stmt *stmt)
-{
- struct lysp_stmt *childstmt;
- int8_t flag = stmt->child ? 1 : -1;
-
- /* TODO:
- the extension instance substatements in extension instances (LY_STMT_EXTENSION_INSTANCE)
- cannot find the compiled information, so it is needed to be done,
- currently it is ignored */
- if (stmt_attr_info[stmt->kw].name) {
- if (stmt_attr_info[stmt->kw].flags & STMT_FLAG_YIN) {
- ypr_open(pctx, stmt->stmt, NULL, NULL, flag);
- ypr_yin_arg(pctx, stmt_attr_info[stmt->kw].arg, stmt->arg);
- } else {
- ypr_open(pctx, stmt->stmt, stmt_attr_info[stmt->kw].arg, stmt->arg, flag);
- }
- }
-
- if (stmt->child) {
- LEVEL++;
- LY_LIST_FOR(stmt->child, childstmt) {
- yprp_stmt(pctx, childstmt);
- }
- LEVEL--;
- ypr_close(pctx, stmt->stmt, flag);
- }
-}
-
-/**
- * @param[in] count Number of extensions to print, 0 to print them all.
- */
-static void
-yprp_extension_instances(struct lys_ypr_ctx *pctx, enum ly_stmt substmt, uint8_t substmt_index,
- struct lysp_ext_instance *ext, int8_t *flag, LY_ARRAY_COUNT_TYPE count)
-{
- LY_ARRAY_COUNT_TYPE u;
- struct lysp_stmt *stmt;
- int8_t inner_flag = 0;
-
- if (!count && ext) {
- count = LY_ARRAY_COUNT(ext);
- }
- LY_ARRAY_FOR(ext, u) {
- struct lysp_ext *ext_def = NULL;
-
- if (!count) {
- break;
- }
-
- count--;
- if ((ext->flags & LYS_INTERNAL) || (ext->parent_stmt != substmt) || (ext->parent_stmt_index != substmt_index)) {
- continue;
- }
-
- lysp_ext_find_definition(pctx->module->ctx, &ext[u], NULL, &ext_def);
- if (!ext_def) {
- continue;
- }
-
- ypr_close_parent(pctx, flag);
- inner_flag = 0;
-
- if (ext_def->argname) {
- lysp_ext_instance_resolve_argument(pctx->module->ctx, &ext[u], ext_def);
- }
-
- ypr_open(pctx, ext[u].name, (ext_def->flags & LYS_YINELEM_TRUE) ? NULL : ext_def->argname, ext[u].argument, inner_flag);
- LEVEL++;
- if (ext_def->flags & LYS_YINELEM_TRUE) {
- const char *prefix, *name, *id;
- size_t prefix_len, name_len;
-
- ypr_close_parent(pctx, &inner_flag);
-
- /* we need to use the same namespace as for the extension instance element */
- id = ext[u].name;
- ly_parse_nodeid(&id, &prefix, &prefix_len, &name, &name_len);
- ly_print_(pctx->out, "%*s<%.*s:%s>", INDENT, (int)prefix_len, prefix, ext_def->argname);
- lyxml_dump_text(pctx->out, ext[u].argument, 0);
- ly_print_(pctx->out, "</%.*s:%s>\n", (int)prefix_len, prefix, ext_def->argname);
- }
- LY_LIST_FOR(ext[u].child, stmt) {
- if (stmt->flags & (LYS_YIN_ATTR | LYS_YIN_ARGUMENT)) {
- continue;
- }
-
- ypr_close_parent(pctx, &inner_flag);
- yprp_stmt(pctx, stmt);
- }
- LEVEL--;
- ypr_close(pctx, ext[u].name, inner_flag);
- }
-}
-
-static void
yin_print_parsed_linkage(struct lys_ypr_ctx *pctx, const struct lysp_module *modp)
{
LY_ARRAY_COUNT_TYPE u;
@@ -1323,7 +1309,7 @@
ypr_open(pctx, "import", "module", modp->imports[u].name, 1);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_IMPORT, 0, modp->imports[u].exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_IMPORT, 0, modp->imports[u].exts, NULL);
ypr_substmt(pctx, LY_STMT_PREFIX, 0, modp->imports[u].prefix, modp->imports[u].exts);
if (modp->imports[u].rev[0]) {
ypr_substmt(pctx, LY_STMT_REVISION_DATE, 0, modp->imports[u].rev, modp->imports[u].exts);
@@ -1341,7 +1327,7 @@
if (modp->includes[u].rev[0] || modp->includes[u].dsc || modp->includes[u].ref || modp->includes[u].exts) {
ypr_open(pctx, "include", "module", modp->includes[u].name, 1);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_INCLUDE, 0, modp->includes[u].exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_INCLUDE, 0, modp->includes[u].exts, NULL);
if (modp->includes[u].rev[0]) {
ypr_substmt(pctx, LY_STMT_REVISION_DATE, 0, modp->includes[u].rev, modp->includes[u].exts);
}
@@ -1371,7 +1357,7 @@
}
if (modp->exts) {
ly_print_(pctx->out, "\n");
- yprp_extension_instances(pctx, LY_STMT_MODULE, 0, modp->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_MODULE, 0, modp->exts, NULL);
}
LY_ARRAY_FOR(modp->features, u) {
@@ -1468,7 +1454,7 @@
{
ypr_open(pctx, "belongs-to", "module", submodp->mod->name, 1);
LEVEL++;
- yprp_extension_instances(pctx, LY_STMT_BELONGS_TO, 0, submodp->exts, NULL, 0);
+ yprp_extension_instances(pctx, LY_STMT_BELONGS_TO, 0, submodp->exts, NULL);
ypr_substmt(pctx, LY_STMT_PREFIX, 0, submodp->prefix, submodp->exts);
LEVEL--;
ypr_close(pctx, "belongs-to", 1);