yang parser CHANGE move parse_finalize_reallocated() to tree_schema_helpers so it can be reused in yin parser
diff --git a/src/parser_yang.c b/src/parser_yang.c
index b169e86..cb5ae57 100644
--- a/src/parser_yang.c
+++ b/src/parser_yang.c
@@ -94,9 +94,6 @@
LY_ERR parse_list(struct lys_parser_ctx *ctx, const char **data, struct lysp_node *parent, struct lysp_node **siblings);
LY_ERR parse_grouping(struct lys_parser_ctx *ctx, const char **data, struct lysp_node *parent, struct lysp_grp **groupings);
-static LY_ERR parse_finalize_reallocated(struct lys_parser_ctx *ctx, struct lysp_grp *groupings, struct lysp_augment *augments,
- struct lysp_action *actions, struct lysp_notif *notifs);
-
/**
* @brief Add another character to dynamic buffer, a low-level function.
*
@@ -2672,7 +2669,7 @@
LY_CHECK_RET(ret);
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, inout_p->groupings, NULL, NULL, NULL));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, inout_p->groupings, NULL, NULL, NULL));
return ret;
}
@@ -2742,7 +2739,7 @@
LY_CHECK_RET(ret);
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, act->groupings, NULL, NULL, NULL));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, act->groupings, NULL, NULL, NULL));
return ret;
}
@@ -2834,7 +2831,7 @@
LY_CHECK_RET(ret);
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, notif->groupings, NULL, NULL, NULL));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, notif->groupings, NULL, NULL, NULL));
return ret;
}
@@ -3024,112 +3021,12 @@
LY_CHECK_RET(ret);
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, NULL, NULL, aug->actions, aug->notifs));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, NULL, NULL, aug->actions, aug->notifs));
return ret;
}
/**
- * @brief Finalize some of the structures in case they are stored in sized array,
- * which can be possibly reallocated and some other data may point to them.
- *
- * Update parent pointers in the nodes inside grouping/augment/RPC/Notification, which could be reallocated.
- *
- * @param[in] mod Parsed module to be updated.
- * @return LY_ERR value (currently only LY_SUCCESS, but it can change in future).
- */
-static LY_ERR
-parse_finalize_reallocated(struct lys_parser_ctx *ctx, struct lysp_grp *groupings, struct lysp_augment *augments,
- struct lysp_action *actions, struct lysp_notif *notifs)
-{
- unsigned int u, v;
- struct lysp_node *child;
-
- /* finalize parent pointers to the reallocated items */
-
- /* gropings */
- LY_ARRAY_FOR(groupings, u) {
- LY_LIST_FOR(groupings[u].data, child) {
- child->parent = (struct lysp_node*)&groupings[u];
- }
- LY_ARRAY_FOR(groupings[u].actions, v) {
- groupings[u].actions[v].parent = (struct lysp_node*)&groupings[u];
- }
- LY_ARRAY_FOR(groupings[u].notifs, v) {
- groupings[u].notifs[v].parent = (struct lysp_node*)&groupings[u];
- }
- LY_ARRAY_FOR(groupings[u].groupings, v) {
- groupings[u].groupings[v].parent = (struct lysp_node*)&groupings[u];
- }
- if (groupings[u].typedefs) {
- ly_set_add(&ctx->tpdfs_nodes, &groupings[u], 0);
- }
- }
-
- /* augments */
- LY_ARRAY_FOR(augments, u) {
- LY_LIST_FOR(augments[u].child, child) {
- child->parent = (struct lysp_node*)&augments[u];
- }
- LY_ARRAY_FOR(augments[u].actions, v) {
- augments[u].actions[v].parent = (struct lysp_node*)&augments[u];
- }
- LY_ARRAY_FOR(augments[u].notifs, v) {
- augments[u].notifs[v].parent = (struct lysp_node*)&augments[u];
- }
- }
-
- /* actions */
- LY_ARRAY_FOR(actions, u) {
- if (actions[u].input.parent) {
- actions[u].input.parent = (struct lysp_node*)&actions[u];
- LY_LIST_FOR(actions[u].input.data, child) {
- child->parent = (struct lysp_node*)&actions[u].input;
- }
- LY_ARRAY_FOR(actions[u].input.groupings, v) {
- actions[u].input.groupings[v].parent = (struct lysp_node*)&actions[u].input;
- }
- if (actions[u].input.typedefs) {
- ly_set_add(&ctx->tpdfs_nodes, &actions[u].input, 0);
- }
- }
- if (actions[u].output.parent) {
- actions[u].output.parent = (struct lysp_node*)&actions[u];
- LY_LIST_FOR(actions[u].output.data, child) {
- child->parent = (struct lysp_node*)&actions[u].output;
- }
- LY_ARRAY_FOR(actions[u].output.groupings, v) {
- actions[u].output.groupings[v].parent = (struct lysp_node*)&actions[u].output;
- }
- if (actions[u].output.typedefs) {
- ly_set_add(&ctx->tpdfs_nodes, &actions[u].output, 0);
- }
- }
- LY_ARRAY_FOR(actions[u].groupings, v) {
- actions[u].groupings[v].parent = (struct lysp_node*)&actions[u];
- }
- if (actions[u].typedefs) {
- ly_set_add(&ctx->tpdfs_nodes, &actions[u], 0);
- }
- }
-
- /* notifications */
- LY_ARRAY_FOR(notifs, u) {
- LY_LIST_FOR(notifs[u].data, child) {
- child->parent = (struct lysp_node*)¬ifs[u];
- }
- LY_ARRAY_FOR(notifs[u].groupings, v) {
- notifs[u].groupings[v].parent = (struct lysp_node*)¬ifs[u];
- }
- if (notifs[u].typedefs) {
- ly_set_add(&ctx->tpdfs_nodes, ¬ifs[u], 0);
- }
- }
-
- return LY_SUCCESS;
-}
-
-/**
* @brief Parse the uses statement.
*
* @param[in] ctx yang parser context for logging.
@@ -3201,7 +3098,7 @@
}
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, NULL, uses->augments, NULL, NULL));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, NULL, uses->augments, NULL, NULL));
return ret;
}
@@ -3518,7 +3415,7 @@
}
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, cont->groupings, NULL, cont->actions, cont->notifs));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, cont->groupings, NULL, cont->actions, cont->notifs));
return ret;
}
@@ -3649,7 +3546,7 @@
LY_CHECK_RET(ret);
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, list->groupings, NULL, list->actions, list->notifs));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, list->groupings, NULL, list->actions, list->notifs));
if (list->max && list->min > list->max) {
LOGVAL_PARSER(ctx, LYVE_SEMANTICS,
@@ -4367,7 +4264,7 @@
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, mod->groupings, mod->augments, mod->rpcs, mod->notifs));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, mod->groupings, mod->augments, mod->rpcs, mod->notifs));
/* mandatory substatements */
if (!mod->mod->ns) {
@@ -4573,7 +4470,7 @@
checks:
/* finalize parent pointers to the reallocated items */
- LY_CHECK_RET(parse_finalize_reallocated(ctx, submod->groupings, submod->augments, submod->rpcs, submod->notifs));
+ LY_CHECK_RET(lysp_parse_finalize_reallocated(ctx, submod->groupings, submod->augments, submod->rpcs, submod->notifs));
/* mandatory substatements */
if (!submod->belongsto) {
diff --git a/src/tree_schema_helpers.c b/src/tree_schema_helpers.c
index 75fd1ba..ed76616 100644
--- a/src/tree_schema_helpers.c
+++ b/src/tree_schema_helpers.c
@@ -535,6 +535,97 @@
}
LY_ERR
+lysp_parse_finalize_reallocated(struct lys_parser_ctx *ctx, struct lysp_grp *groupings, struct lysp_augment *augments,
+ struct lysp_action *actions, struct lysp_notif *notifs)
+{
+ unsigned int u, v;
+ struct lysp_node *child;
+
+ /* finalize parent pointers to the reallocated items */
+
+ /* gropings */
+ LY_ARRAY_FOR(groupings, u) {
+ LY_LIST_FOR(groupings[u].data, child) {
+ child->parent = (struct lysp_node*)&groupings[u];
+ }
+ LY_ARRAY_FOR(groupings[u].actions, v) {
+ groupings[u].actions[v].parent = (struct lysp_node*)&groupings[u];
+ }
+ LY_ARRAY_FOR(groupings[u].notifs, v) {
+ groupings[u].notifs[v].parent = (struct lysp_node*)&groupings[u];
+ }
+ LY_ARRAY_FOR(groupings[u].groupings, v) {
+ groupings[u].groupings[v].parent = (struct lysp_node*)&groupings[u];
+ }
+ if (groupings[u].typedefs) {
+ ly_set_add(&ctx->tpdfs_nodes, &groupings[u], 0);
+ }
+ }
+
+ /* augments */
+ LY_ARRAY_FOR(augments, u) {
+ LY_LIST_FOR(augments[u].child, child) {
+ child->parent = (struct lysp_node*)&augments[u];
+ }
+ LY_ARRAY_FOR(augments[u].actions, v) {
+ augments[u].actions[v].parent = (struct lysp_node*)&augments[u];
+ }
+ LY_ARRAY_FOR(augments[u].notifs, v) {
+ augments[u].notifs[v].parent = (struct lysp_node*)&augments[u];
+ }
+ }
+
+ /* actions */
+ LY_ARRAY_FOR(actions, u) {
+ if (actions[u].input.parent) {
+ actions[u].input.parent = (struct lysp_node*)&actions[u];
+ LY_LIST_FOR(actions[u].input.data, child) {
+ child->parent = (struct lysp_node*)&actions[u].input;
+ }
+ LY_ARRAY_FOR(actions[u].input.groupings, v) {
+ actions[u].input.groupings[v].parent = (struct lysp_node*)&actions[u].input;
+ }
+ if (actions[u].input.typedefs) {
+ ly_set_add(&ctx->tpdfs_nodes, &actions[u].input, 0);
+ }
+ }
+ if (actions[u].output.parent) {
+ actions[u].output.parent = (struct lysp_node*)&actions[u];
+ LY_LIST_FOR(actions[u].output.data, child) {
+ child->parent = (struct lysp_node*)&actions[u].output;
+ }
+ LY_ARRAY_FOR(actions[u].output.groupings, v) {
+ actions[u].output.groupings[v].parent = (struct lysp_node*)&actions[u].output;
+ }
+ if (actions[u].output.typedefs) {
+ ly_set_add(&ctx->tpdfs_nodes, &actions[u].output, 0);
+ }
+ }
+ LY_ARRAY_FOR(actions[u].groupings, v) {
+ actions[u].groupings[v].parent = (struct lysp_node*)&actions[u];
+ }
+ if (actions[u].typedefs) {
+ ly_set_add(&ctx->tpdfs_nodes, &actions[u], 0);
+ }
+ }
+
+ /* notifications */
+ LY_ARRAY_FOR(notifs, u) {
+ LY_LIST_FOR(notifs[u].data, child) {
+ child->parent = (struct lysp_node*)¬ifs[u];
+ }
+ LY_ARRAY_FOR(notifs[u].groupings, v) {
+ notifs[u].groupings[v].parent = (struct lysp_node*)¬ifs[u];
+ }
+ if (notifs[u].typedefs) {
+ ly_set_add(&ctx->tpdfs_nodes, ¬ifs[u], 0);
+ }
+ }
+
+ return LY_SUCCESS;
+}
+
+LY_ERR
lysp_check_typedefs(struct lys_parser_ctx *ctx, struct lysp_module *mod)
{
struct hash_table *ids_global;
diff --git a/src/tree_schema_internal.h b/src/tree_schema_internal.h
index e90f8cc..fbd0b6a 100644
--- a/src/tree_schema_internal.h
+++ b/src/tree_schema_internal.h
@@ -173,6 +173,19 @@
LY_ERR lysp_check_typedefs(struct lys_parser_ctx *ctx, struct lysp_module *mod);
/**
+ * @brief Finalize some of the structures in case they are stored in sized array,
+ * which can be possibly reallocated and some other data may point to them.
+ *
+ * Update parent pointers in the nodes inside grouping/augment/RPC/Notification, which could be reallocated.
+ *
+ * @param[in] mod Parsed module to be updated.
+ * @return LY_ERR value (currently only LY_SUCCESS, but it can change in future).
+ */
+LY_ERR
+lysp_parse_finalize_reallocated(struct lys_parser_ctx *ctx, struct lysp_grp *groupings, struct lysp_augment *augments,
+ struct lysp_action *actions, struct lysp_notif *notifs);
+
+/**
* @brief Just move the newest revision into the first position, does not sort the rest
* @param[in] revs Sized-array of the revisions in a printable schema tree.
*/