summaryrefslogtreecommitdiffstats
path: root/lib/command_graph.h
blob: a7a34a059831bff1fdc08268f4ed62d825d48928 (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
117
118
119
/*
 * CLI graph handling
 *
 * --
 * Copyright (C) 2016 Cumulus Networks, Inc.
 * Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
 * Copyright (C) 2013 by Open Source Routing.
 * Copyright (C) 2013 by Internet Systems Consortium, Inc. ("ISC")
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; see the file COPYING; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef _FRR_COMMAND_GRAPH_H
#define _FRR_COMMAND_GRAPH_H

#include <stdbool.h>
#include <stdint.h>

#include "memory.h"
#include "vector.h"
#include "graph.h"

DECLARE_MTYPE(CMD_ARG)

struct vty;

/**
 * Types for tokens.
 *
 * The type determines what kind of data the token can match (in the
 * matching use case) or hold (in the argv use case).
 */
enum cmd_token_type
{
  WORD_TKN,         // words
  VARIABLE_TKN,     // almost anything
  RANGE_TKN,        // integer range
  IPV4_TKN,         // IPV4 addresses
  IPV4_PREFIX_TKN,  // IPV4 network prefixes
  IPV6_TKN,         // IPV6 prefixes
  IPV6_PREFIX_TKN,  // IPV6 network prefixes

  /* plumbing types */
  FORK_TKN,         // marks subgraph beginning
  JOIN_TKN,         // marks subgraph end
  START_TKN,        // first token in line
  END_TKN,          // last token in line

  SPECIAL_TKN = FORK_TKN,
};

#define IS_VARYING_TOKEN(x) ((x) >= VARIABLE_TKN && (x) < FORK_TKN)

/* Command attributes */
enum
{
  CMD_ATTR_NORMAL,
  CMD_ATTR_DEPRECATED,
  CMD_ATTR_HIDDEN,
};

/* Comamand token struct. */
struct cmd_token
{
  enum cmd_token_type type;     // token type
  uint8_t attr;                 // token attributes
  bool allowrepeat;             // matcher allowed to match token repetively?
  uint32_t refcnt;

  char *text;                   // token text
  char *desc;                   // token description
  long long min, max;           // for ranges
  char *arg;                    // user input that matches this token
  char *varname;

  struct graph_node *forkjoin;  // paired FORK/JOIN for JOIN/FORK
};

/* Structure of command element. */
struct cmd_element
{
  const char *string;           /* Command specification by string. */
  const char *doc;              /* Documentation of this command. */
  int daemon;                   /* Daemon to which this command belong. */
  uint8_t attr;                 /* Command attributes */

  /* handler function for command */
  int (*func) (const struct cmd_element *, struct vty *, int, struct cmd_token *[]);

  const char *name;             /* symbol name for debugging */
};

/* text for <cr> command */
#define CMD_CR_TEXT "<cr>"

/* memory management for cmd_token */
extern struct cmd_token *cmd_token_new (enum cmd_token_type, uint8_t attr,
                                        const char *text, const char *desc);
extern struct cmd_token *cmd_token_dup (struct cmd_token *);
extern void cmd_token_del (struct cmd_token *);
extern void cmd_token_varname_set(struct cmd_token *token, const char *varname);

extern void cmd_graph_parse (struct graph *graph, struct cmd_element *cmd);
extern void cmd_graph_names (struct graph *graph);
extern void cmd_graph_merge (struct graph *old, struct graph *new, int direction);

#endif /* _FRR_COMMAND_GRAPH_H */