API const struct lys_node * ly_ctx_get_node(const struct ly_ctx *ctx, const char *nodeid) { const struct lys_node *ret; const struct lys_module *module; char *mod_name; int parsed; if (!ctx || !nodeid) { ly_errno = LY_EINVAL; return NULL; } if ((nodeid[0] != '/') || ((parsed = parse_identifier(nodeid + 1)) < 1)) { ly_errno = LY_EINVAL; return NULL; } /* get the correct module */ mod_name = strndup(nodeid + 1, parsed); if (!mod_name) { LOGMEM; return NULL; } module = ly_ctx_get_module(ctx, mod_name, NULL); free(mod_name); if (!module) { ly_errno = LY_EINVAL; return NULL; } /* now we can parse the whole schema */ if (resolve_schema_nodeid(nodeid, NULL, module, LYS_AUGMENT, &ret)) { ly_errno = LY_EINVAL; return NULL; } return ret; }
int info_print_model(FILE *f, struct ly_module *module, const char *target_node) { int i; struct ly_mnode *target; if (!target_node) { if (f == stdout) { fprintf(f, "\n"); } if (module->type == 0) { info_print_module(f, module); } else { info_print_submodule(f, (struct ly_submodule *)module); } } else { if ((target_node[0] == '/') || !strncmp(target_node, "type/", 5)) { target = resolve_schema_nodeid((target_node[0] == '/' ? target_node : target_node+4), module->data, module, LY_NODE_AUGMENT); if (!target) { fprintf(f, "Target %s could not be resolved.\n", (target_node[0] == '/' ? target_node : target_node+4)); return EXIT_FAILURE; } } else if (!strncmp(target_node, "typedef/", 8)) { target_node += 8; for (i = 0; i < module->tpdf_size; ++i) { if (!strcmp(module->tpdf[i].name, target_node)) { break; } } if (i == module->tpdf_size) { fprintf(f, "Typedef %s not found.\n", target_node); return EXIT_FAILURE; } if (f == stdout) { fprintf(f, "\n"); } info_print_typedef_detail(f, &module->tpdf[i]); return EXIT_SUCCESS; } else if (!strncmp(target_node, "identity/", 9)) { target_node += 9; for (i = 0; i < (signed)module->ident_size; ++i) { if (!strcmp(module->ident[i].name, target_node)) { break; } } if (i == (signed)module->ident_size) { fprintf(f, "Identity %s not found.\n", target_node); return EXIT_FAILURE; } if (f == stdout) { fprintf(f, "\n"); } info_print_ident_detail(f, &module->ident[i]); return EXIT_SUCCESS; } else if (!strncmp(target_node, "feature/", 8)) { target_node += 8; for (i = 0; i < module->features_size; ++i) { if (!strcmp(module->features[i].name, target_node)) { break; } } if (i == module->features_size) { fprintf(f, "Feature %s not found.\n", target_node); return EXIT_FAILURE; } if (f == stdout) { fprintf(f, "\n"); } info_print_feature_detail(f, &module->features[i]); return EXIT_SUCCESS; } else { fprintf(f, "Target could not be resolved.\n"); return EXIT_FAILURE; } if (target_node[0] != '/') { if (!(target->nodetype & (LY_NODE_LEAF | LY_NODE_LEAFLIST))) { fprintf(f, "Target is not a leaf or a leaf-list.\n"); return EXIT_FAILURE; } if (f == stdout) { fprintf(f, "\n"); } info_print_type_detail(f, &((struct ly_mnode_leaf *)target)->type); return EXIT_SUCCESS; } switch (target->nodetype) { case LY_NODE_CONTAINER: if (f == stdout) { fprintf(f, "\n"); } info_print_container(f, target); break; case LY_NODE_CHOICE: if (f == stdout) { fprintf(f, "\n"); } info_print_choice(f, target); break; case LY_NODE_LEAF: if (f == stdout) { fprintf(f, "\n"); } info_print_leaf(f, target); break; case LY_NODE_LEAFLIST: if (f == stdout) { fprintf(f, "\n"); } info_print_leaflist(f, target); break; case LY_NODE_LIST: if (f == stdout) { fprintf(f, "\n"); } info_print_list(f, target); break; case LY_NODE_ANYXML: if (f == stdout) { fprintf(f, "\n"); } info_print_anyxml(f, target); break; case LY_NODE_GROUPING: if (f == stdout) { fprintf(f, "\n"); } info_print_grouping(f, target); break; case LY_NODE_CASE: if (f == stdout) { fprintf(f, "\n"); } info_print_case(f, target); break; case LY_NODE_NOTIF: if (f == stdout) { fprintf(f, "\n"); } info_print_notif(f, target); break; case LY_NODE_RPC: if (f == stdout) { fprintf(f, "\n"); } info_print_rpc(f, target); break; case LY_NODE_INPUT: if (f == stdout) { fprintf(f, "\n"); } info_print_input(f, target); break; case LY_NODE_OUTPUT: if (f == stdout) { fprintf(f, "\n"); } info_print_output(f, target); break; default: fprintf(f, "Nodetype %s not supported.\n", strnodetype(target->nodetype)); break; } } return EXIT_SUCCESS; }