aboutsummaryrefslogtreecommitdiffstats
path: root/ctrl/libhicnctrl/includes/hicn/ctrl/parse.h
blob: 8921d25ed5b42f6b773b78441409f3342f32659b (plain)
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 */