Skip to content

Commit a422dc9

Browse files
Marmichalvasko
authored andcommitted
parser yin BUGFIX index of if-feature, unique and default exts
The YIN parser created the extension instances of an if-feature, unique or a default of a leaf-list, refine or deviate always with the index 0, so the printers and lysp_ext_instance_path() took them all for instances of the first item. The parent of those of a default was also the item instead of the array. Set the array as the parent and the index of the item, as the YANG parser does.
1 parent 5ccf4f3 commit a422dc9

2 files changed

Lines changed: 51 additions & 30 deletions

File tree

‎src/parser_yin.c‎

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,48 +1133,46 @@ yin_parse_qname(struct lysp_yin_ctx *ctx, enum ly_stmt parent_stmt, struct yin_s
11331133
struct lysp_ext_instance **exts)
11341134
{
11351135
struct lysp_qname *qname, **qnames;
1136+
enum yin_argument arg_type;
1137+
LYA_COUNT_T index;
1138+
struct yin_subelement subelems[] = {
1139+
{LY_STMT_EXTENSION_INSTANCE, &index, 0}
1140+
};
11361141

11371142
switch (parent_stmt) {
11381143
case LY_STMT_DEFAULT:
11391144
if (subinfo->flags & YIN_SUBELEM_UNIQUE) {
11401145
qname = (struct lysp_qname *)subinfo->dest;
1141-
} else {
1142-
qnames = (struct lysp_qname **)subinfo->dest;
1143-
LYA_ADD_ITEM(*qnames, qname, LOGMEM(ctx->xmlctx->ctx); return LY_EMEM);
1144-
1145-
/* revalidate the backward parent pointers from extensions */
1146-
LYSP_EXT_PARENTS_UPDATE(*exts, parent_stmt, *qnames);
1146+
qname->mod = PARSER_CUR_PMOD(ctx);
1147+
return yin_parse_simple_element(ctx, qname, parent_stmt, &qname->str, YIN_ARG_VALUE, Y_STR_ARG, exts);
11471148
}
1148-
qname->mod = PARSER_CUR_PMOD(ctx);
1149-
return yin_parse_simple_element(ctx, qname, parent_stmt, &qname->str, YIN_ARG_VALUE, Y_STR_ARG, exts);
1149+
arg_type = YIN_ARG_VALUE;
1150+
break;
11501151
case LY_STMT_UNIQUE:
1151-
assert(!(subinfo->flags & YIN_SUBELEM_UNIQUE));
1152-
1153-
qnames = (struct lysp_qname **)subinfo->dest;
1154-
LYA_ADD_ITEM(*qnames, qname, LOGMEM(ctx->xmlctx->ctx); return LY_EMEM);
1155-
1156-
/* revalidate the backward parent pointers from extensions */
1157-
LYSP_EXT_PARENTS_UPDATE(*exts, parent_stmt, *qnames);
1158-
1159-
qname->mod = PARSER_CUR_PMOD(ctx);
1160-
return yin_parse_simple_element(ctx, *qnames, parent_stmt, &qname->str, YIN_ARG_TAG, Y_STR_ARG, exts);
1152+
arg_type = YIN_ARG_TAG;
1153+
break;
11611154
case LY_STMT_IF_FEATURE:
1162-
assert(!(subinfo->flags & YIN_SUBELEM_UNIQUE));
1155+
arg_type = YIN_ARG_NAME;
1156+
break;
1157+
default:
1158+
LOGINT(ctx->xmlctx->ctx);
1159+
return LY_EINT;
1160+
}
1161+
assert(!(subinfo->flags & YIN_SUBELEM_UNIQUE));
11631162

1164-
qnames = (struct lysp_qname **)subinfo->dest;
1165-
LYA_ADD_ITEM(*qnames, qname, LOGMEM(ctx->xmlctx->ctx); return LY_EMEM);
1163+
qnames = (struct lysp_qname **)subinfo->dest;
1164+
index = LYA_COUNT(*qnames);
1165+
LYA_ADD_ITEM(*qnames, qname, LOGMEM(ctx->xmlctx->ctx); return LY_EMEM);
11661166

1167-
/* revalidate the backward parent pointers from extensions */
1168-
LYSP_EXT_PARENTS_UPDATE(*exts, parent_stmt, *qnames);
1167+
/* revalidate the backward parent pointers from extensions */
1168+
LYSP_EXT_PARENTS_UPDATE(*exts, parent_stmt, *qnames);
11691169

1170-
qname->mod = PARSER_CUR_PMOD(ctx);
1171-
return yin_parse_simple_element(ctx, *qnames, parent_stmt, &qname->str, YIN_ARG_NAME, Y_STR_ARG, exts);
1172-
default:
1173-
break;
1174-
}
1170+
qname->mod = PARSER_CUR_PMOD(ctx);
1171+
LY_CHECK_RET(lyxml_ctx_next(ctx->xmlctx));
1172+
LY_CHECK_RET(yin_parse_attribute(ctx, arg_type, &qname->str, Y_STR_ARG, parent_stmt));
11751173

1176-
LOGINT(ctx->xmlctx->ctx);
1177-
return LY_EINT;
1174+
/* extension instances of the item have the array as their parent with the item index, as in YANG */
1175+
return yin_parse_content(ctx, subelems, ly_sizeofarray(subelems), *qnames, parent_stmt, NULL, exts);
11781176
}
11791177

11801178
/**

‎tests/utests/schema/test_schema.c‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2238,6 +2238,7 @@ static void
22382238
check_ext_parents(const struct lysp_module *pmod)
22392239
{
22402240
const struct lysp_node_leaf *leaf;
2241+
const struct lysp_node_leaflist *llist;
22412242
const struct lysp_tpdf *tpdf;
22422243
const struct lysp_type_enum *en;
22432244
const struct lysp_restr *must;
@@ -2284,6 +2285,16 @@ check_ext_parents(const struct lysp_module *pmod)
22842285
LYA_FOR(leaf->exts, u) {
22852286
assert_int_equal(LY_STMT_IF_FEATURE, leaf->exts[u].parent_stmt);
22862287
assert_ptr_equal(leaf->iffeatures, leaf->exts[u].parent);
2288+
assert_int_equal(u, leaf->exts[u].parent_stmt_index);
2289+
}
2290+
2291+
llist = (const struct lysp_node_leaflist *)leaf->next;
2292+
assert_int_equal(3, LYA_COUNT(llist->dflts));
2293+
assert_int_equal(3, LYA_COUNT(llist->exts));
2294+
LYA_FOR(llist->exts, u) {
2295+
assert_int_equal(LY_STMT_DEFAULT, llist->exts[u].parent_stmt);
2296+
assert_ptr_equal(llist->dflts, llist->exts[u].parent);
2297+
assert_int_equal(u, llist->exts[u].parent_stmt_index);
22872298
}
22882299
}
22892300

@@ -2317,6 +2328,12 @@ test_ext_parent_array_realloc(void **state)
23172328
" enum c { status current { ep:e; } ep:e; }\n"
23182329
" }\n"
23192330
" }\n"
2331+
" leaf-list ll {\n"
2332+
" type string;\n"
2333+
" default a { ep:e; }\n"
2334+
" default b { ep:e; }\n"
2335+
" default c { ep:e; }\n"
2336+
" }\n"
23202337
"}\n";
23212338
UTEST_ADD_MODULE(yang, LYS_IN_YANG, NULL, &mod);
23222339
check_ext_parents(mod->parsed);
@@ -2345,6 +2362,12 @@ test_ext_parent_array_realloc(void **state)
23452362
" <enum name=\"c\"><status value=\"current\"><ep:e/></status><ep:e/></enum>\n"
23462363
" </type>\n"
23472364
" </leaf>\n"
2365+
" <leaf-list name=\"ll\">\n"
2366+
" <type name=\"string\"/>\n"
2367+
" <default value=\"a\"><ep:e/></default>\n"
2368+
" <default value=\"b\"><ep:e/></default>\n"
2369+
" <default value=\"c\"><ep:e/></default>\n"
2370+
" </leaf-list>\n"
23482371
"</module>\n";
23492372
UTEST_ADD_MODULE(yin, LYS_IN_YIN, NULL, &mod);
23502373
check_ext_parents(mod->parsed);

0 commit comments

Comments
 (0)