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
|
#ifndef HICNLIGHT_PARSE_CMD
#define HICNLIGHT_PARSE_CMD
#include <hicn/ctrl/api.h>
#include "command.h"
/* Update sscanf accordingly in parse_cmd.c */
#define MAX_PARAMETERS 10
#define MAX_SCANF_PARAM_LEN 100
typedef int (*parser_hook_t)(void* arg);
#if 0
typedef struct {
const char* name;
const char* help;
parser_type_t type;
size_t offset;
/*
* quick hack to let the functions update two or more parameters, like for
* IP_ADDRESS or IP_PREFIX types
*/
size_t offset2;
size_t offset3;
} command_parameter_t;
typedef struct {
hc_action_t action;
hc_object_type_t object;
unsigned nparams;
command_parameter_t parameters[MAX_PARAMETERS];
parser_hook_t post_hook;
} command_parser_t;
#define TYPE_STRN(N) \
(parser_type_t) { \
.name = TYPENAME_STR, \
.str = { \
.max_size = N, \
}, \
}
#define TYPE_FMT_STRN(N) "%s"
#define TYPE_INT(MIN, MAX) \
(parser_type_t) { \
.name = TYPENAME_INT, \
.sint = { \
.min = (MIN), \
.max = (MAX), \
}, \
}
#define TYPE_FMT_INT "%d"
#define TYPE_UINT(min, max) \
(parser_type_t) { \
.name = TYPENAME_UINT, \
.uint = { \
.min = min, \
.max = max, \
}, \
}
#define TYPE_FMT_UINT "%u"
#define TYPE_SYMBOLIC_OR_ID TYPE_STRN(SYMBOLIC_NAME_LEN)
#define TYPE_FMT_SYMBOLIC_OR_ID "%s"
#define TYPE_INTERFACE_NAME TYPE_STRN(INTERFACE_LEN)
#define TYPE_FMT_INTERFACE_NAME "%s"
#define TYPE_IP_ADDRESS \
(parser_type_t) { .name = TYPENAME_IP_ADDRESS, }
#define TYPE_FMT_IP_ADDRESS "%s"
#define TYPE_IP_PREFIX \
(parser_type_t) { .name = TYPENAME_IP_PREFIX, }
#define TYPE_FMT_IP_PREFIX "%s"
#define TYPE_ON_OFF \
(parser_type_t) { .name = TYPENAME_ON_OFF, }
#define TYPE_FMT_ON_OFF "%s"
#define TYPE_ENUM(x) \
(parser_type_t) { \
.name = TYPENAME_ENUM, \
.enum_ = { \
.from_str = (int (*)(const char*))x##_from_str, \
}, \
}
/* We need to allocate room for the intermediate string */
#define TYPE_FMT_ENUM "%s"
#define TYPE_POLICY_STATE(TAG) \
(parser_type_t) { \
.name = TYPENAME_POLICY_STATE, \
.policy_state = { \
.tag = TAG, \
}, \
}
/* We need to allocate room for the intermediate string */
#define TYPE_FMT_POLICY_STATE "%s"
#endif
int parse_getopt_args(const command_parser_t* parser, int argc, char* argv[],
hc_command_t* command);
int parse(const char* cmd, hc_command_t* command);
int help(const char* cmd);
/**
* @brief Convert the action enum to the action name used in the commands (e.g.
* from ACTION_CREATE to "add").
*/
const char* action_to_cmd_action(hc_action_t action);
#endif /* HICNLIGHT_PARSE_CMD */
|