blob: 798095f095abf27c925619a5c2812d9fbefd92ee [file] [log] [blame]
Radek Krejcie9f13b12020-11-09 17:42:04 +01001/**
2 * @file cmd_clear.c
3 * @author Michal Vasko <mvasko@cesnet.cz>
4 * @author Radek Krejci <rkrejci@cesnet.cz>
5 * @brief 'clear' command of the libyang's yanglint tool.
6 *
7 * Copyright (c) 2015-2020 CESNET, z.s.p.o.
8 *
9 * This source code is licensed under BSD 3-Clause License (the "License").
10 * You may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * https://opensource.org/licenses/BSD-3-Clause
14 */
15
16#define _GNU_SOURCE
17
18#include "cmd.h"
19
20#include <getopt.h>
21#include <stdint.h>
22#include <stdio.h>
23
24#include "libyang.h"
25
26#include "common.h"
27
28void
29cmd_clear_help(void)
30{
Michal Vasko8b280602021-10-05 13:23:48 +020031 printf("Usage: clear [-i] [-y]\n"
Radek Krejcie9f13b12020-11-09 17:42:04 +010032 " Replace the current context with an empty one, searchpaths\n"
Michal Vasko8b280602021-10-05 13:23:48 +020033 " are not kept.\n\n"
34 " -i, --makeimplemented\n"
35 " Make the imported modules \"referenced\" from any loaded\n"
36 " module also implemented. If specified a second time, all the\n"
37 " modules are set implemented.\n"
Michal Vaskoc431a0a2021-01-25 14:31:58 +010038 " -y, --yang-library\n"
39 " Load and implement internal \"ietf-yang-library\" YANG module.\n"
40 " Note that this module includes definitions of mandatory state\n"
41 " data that can result in unexpected data validation errors.\n");
42#if 0
Radek Krejci00a3e8a2021-01-27 08:24:49 +010043 " If <yang-library-data> path specified, load the modules\n"
44 " according to the provided yang library data.\n"
Michal Vaskoc431a0a2021-01-25 14:31:58 +010045#endif
Radek Krejcie9f13b12020-11-09 17:42:04 +010046}
47
48void
49cmd_clear(struct ly_ctx **ctx, const char *cmdline)
50{
51 int argc = 0;
52 char **argv = NULL;
53 int opt, opt_index;
54 struct option options[] = {
Michal Vasko8b280602021-10-05 13:23:48 +020055 {"makeimplemented", no_argument, NULL, 'i'},
Michal Vaskoc431a0a2021-01-25 14:31:58 +010056 {"yang-library", no_argument, NULL, 'y'},
57 {"help", no_argument, NULL, 'h'},
Radek Krejcie9f13b12020-11-09 17:42:04 +010058 {NULL, 0, NULL, 0}
59 };
Michal Vaskoc431a0a2021-01-25 14:31:58 +010060 uint16_t options_ctx = LY_CTX_NO_YANGLIBRARY;
Radek Krejcie9f13b12020-11-09 17:42:04 +010061 struct ly_ctx *ctx_new;
62
63 if (parse_cmdline(cmdline, &argc, &argv)) {
64 goto cleanup;
65 }
66
Michal Vasko8b280602021-10-05 13:23:48 +020067 while ((opt = getopt_long(argc, argv, "iyh", options, &opt_index)) != -1) {
Radek Krejcie9f13b12020-11-09 17:42:04 +010068 switch (opt) {
Michal Vasko8b280602021-10-05 13:23:48 +020069 case 'i':
70 if (options_ctx & LY_CTX_REF_IMPLEMENTED) {
71 options_ctx &= ~LY_CTX_REF_IMPLEMENTED;
72 options_ctx |= LY_CTX_ALL_IMPLEMENTED;
73 } else {
74 options_ctx |= LY_CTX_REF_IMPLEMENTED;
75 }
76 break;
Michal Vaskoc431a0a2021-01-25 14:31:58 +010077 case 'y':
78 options_ctx &= ~LY_CTX_NO_YANGLIBRARY;
Radek Krejcie9f13b12020-11-09 17:42:04 +010079 break;
80 case 'h':
81 cmd_clear_help();
82 goto cleanup;
83 default:
84 YLMSG_E("Unknown option.\n");
85 goto cleanup;
86 }
87 }
88
Radek Krejcie9f13b12020-11-09 17:42:04 +010089 if (ly_ctx_new(NULL, options_ctx, &ctx_new)) {
90 YLMSG_W("Failed to create context.\n");
91 goto cleanup;
92 }
93
Radek Krejci90ed21e2021-04-12 14:47:46 +020094 ly_ctx_destroy(*ctx);
Radek Krejcie9f13b12020-11-09 17:42:04 +010095 *ctx = ctx_new;
96
97cleanup:
98 free_cmdline(argv);
99}