Example #1
0
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;
}
Example #2
0
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;
}