forked from CESNET/libyang
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cmd_feature.c
131 lines (110 loc) · 3.15 KB
/
cmd_feature.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* @file cmd_feature.c
* @author Michal Vasko <[email protected]>
* @author Adam Piecek <[email protected]>
* @brief 'feature' command of the libyang's yanglint tool.
*
* Copyright (c) 2015-2023 CESNET, z.s.p.o.
*
* This source code is licensed under BSD 3-Clause License (the "License").
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*/
#define _GNU_SOURCE
#include "cmd.h"
#include <getopt.h>
#include <stdint.h>
#include <stdio.h>
#include "libyang.h"
#include "common.h"
#include "yl_opt.h"
#include "yl_schema_features.h"
void
cmd_feature_help(void)
{
printf("Usage: feature [-f] <module> [<module>]*\n"
" feature -a [-f]\n"
" Print features of all the modules with state of each one.\n\n"
" -f <module1, module2, ...>, --feature-param <module1, module2, ...>\n"
" Generate features parameter for the command \"add\" \n"
" in the form of -F <module-name>:<features>\n"
" -a, --all \n"
" Print features of all implemented modules.\n");
}
int
cmd_feature_opt(struct yl_opt *yo, const char *cmdline, char ***posv, int *posc)
{
int rc = 0, argc = 0;
int opt, opt_index;
struct option options[] = {
{"help", no_argument, NULL, 'h'},
{"all", no_argument, NULL, 'a'},
{"feature-param", no_argument, NULL, 'f'},
{NULL, 0, NULL, 0}
};
if ((rc = parse_cmdline(cmdline, &argc, &yo->argv))) {
return rc;
}
while ((opt = getopt_long(argc, yo->argv, commands[CMD_FEATURE].optstring, options, &opt_index)) != -1) {
switch (opt) {
case 'h':
cmd_feature_help();
return 1;
case 'a':
yo->feature_print_all = 1;
break;
case 'f':
yo->feature_param_format = 1;
break;
default:
YLMSG_E("Unknown option.\n");
return 1;
}
}
*posv = &yo->argv[optind];
*posc = argc - optind;
return 0;
}
int
cmd_feature_dep(struct yl_opt *yo, int posc)
{
if (ly_out_new_file(stdout, &yo->out)) {
YLMSG_E("Unable to print to the standard output.\n");
return 1;
}
yo->out_stdout = 1;
if (yo->interactive && !yo->feature_print_all && !posc) {
YLMSG_E("Missing modules to print.\n");
return 1;
}
return 0;
}
int
cmd_feature_exec(struct ly_ctx **ctx, struct yl_opt *yo, const char *posv)
{
const struct lys_module *mod;
if (yo->feature_print_all) {
print_all_features(yo->out, *ctx, yo->feature_param_format);
return 0;
}
mod = ly_ctx_get_module_latest(*ctx, posv);
if (!mod) {
YLMSG_E("Module \"%s\" not found.\n", posv);
return 1;
}
if (yo->feature_param_format) {
print_feature_param(yo->out, mod);
} else {
print_features(yo->out, mod);
}
return 0;
}
int
cmd_feature_fin(struct ly_ctx *ctx, struct yl_opt *yo)
{
(void) ctx;
ly_print(yo->out, "\n");
return 0;
}