static int lyd_insert_sibling(struct lyd_node *sibling, struct lyd_node *node, int before) { struct lys_node *par1, *par2; struct lyd_node *iter, *last; if (sibling == node) { return EXIT_SUCCESS; } /* check placing the node to the appropriate place according to the schema */ for (par1 = lys_parent(sibling->schema); par1 && !(par1->nodetype & (LYS_CONTAINER | LYS_LIST | LYS_INPUT | LYS_OUTPUT | LYS_NOTIF)); par1 = lys_parent(par1)); for (par2 = lys_parent(node->schema); par2 && !(par2->nodetype & (LYS_CONTAINER | LYS_LIST | LYS_INPUT | LYS_OUTPUT | LYS_NOTIF)); par2 = lys_parent(par2)); if (par1 != par2) { ly_errno = LY_EINVAL; return EXIT_FAILURE; } if (node->parent || node->prev->next) { lyd_unlink(node); } LY_TREE_FOR(node, iter) { iter->parent = sibling->parent; last = iter; }
static void test_lys_set_private(void **state) { (void) state; /* unused */ LYS_INFORMAT yang_format = LYS_IN_YIN; const struct lys_node *node_parent; const struct lys_node *node_child; const struct lys_module *module; module = lys_parse_mem(ctx, lys_module_a, yang_format); if (!module) { fail(); } assert_string_equal("top", module->data->name); node_parent = module->data; node_child = module->data->child; assert_string_equal("bar-sub", node_child->name); node_parent = lys_parent(node_child); assert_string_equal("top", node_parent->name); }
API int lyd_insert(struct lyd_node *parent, struct lyd_node *node) { struct lys_node *sparent; struct lyd_node *iter; if (!node || !parent) { ly_errno = LY_EINVAL; return EXIT_FAILURE; } /* check placing the node to the appropriate place according to the schema (if LYS_OUTPUT is returned, * the parent's schema will never match and it fails as it should) */ for (sparent = lys_parent(node->schema); sparent && !(sparent->nodetype & (LYS_CONTAINER | LYS_LIST | LYS_RPC | LYS_OUTPUT | LYS_NOTIF)); sparent = lys_parent(sparent)); if (sparent != parent->schema) { return EXIT_FAILURE; } if (node->parent || node->prev->next) { lyd_unlink(node); } if (!parent->child) { /* add as the only child of the parent */ parent->child = node; } else { /* add as the last child of the parent */ parent->child->prev->next = node; node->prev = parent->child->prev; for (iter = node; iter->next; iter = iter->next); parent->child->prev = iter; } LY_TREE_FOR(node, iter) { iter->parent = parent; } return EXIT_SUCCESS; }