]>
Commit | Line | Data |
---|---|---|
1ab84bf3 QY |
1 | /* |
2 | * Input matching routines for CLI backend. | |
3 | * | |
4 | * -- | |
5 | * Copyright (C) 2016 Cumulus Networks, Inc. | |
6 | * | |
7 | * This file is part of GNU Zebra. | |
8 | * | |
9 | * GNU Zebra is free software; you can redistribute it and/or modify it | |
10 | * under the terms of the GNU General Public License as published by the | |
11 | * Free Software Foundation; either version 2, or (at your option) any | |
12 | * later version. | |
13 | * | |
14 | * GNU Zebra is distributed in the hope that it will be useful, but | |
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 | * General Public License for more details. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License | |
20 | * along with GNU Zebra; see the file COPYING. If not, write to the Free | |
21 | * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
22 | * 02111-1307, USA. | |
23 | */ | |
24 | ||
25 | #ifndef _ZEBRA_COMMAND_MATCH_H | |
26 | #define _ZEBRA_COMMAND_MATCH_H | |
9d0662e0 | 27 | |
1eb5e8dc | 28 | #include "graph.h" |
18be0e59 | 29 | #include "linklist.h" |
1eb5e8dc | 30 | #include "command.h" |
eceb1066 | 31 | |
1ab84bf3 QY |
32 | /* These definitions exist in command.c in the current engine but should be |
33 | * relocated here in the new engine | |
34 | */ | |
ac4d0be5 | 35 | enum filter_type { FILTER_RELAXED, FILTER_STRICT }; |
9d0662e0 | 36 | |
1ab84bf3 | 37 | /* matcher result value */ |
ac4d0be5 | 38 | enum matcher_rv { |
39 | MATCHER_NO_MATCH, | |
40 | MATCHER_INCOMPLETE, | |
41 | MATCHER_AMBIGUOUS, | |
42 | MATCHER_OK, | |
9d0662e0 QY |
43 | }; |
44 | ||
1ab84bf3 | 45 | /* completion match types */ |
ac4d0be5 | 46 | enum match_type { |
47 | trivial_match, // the input is null | |
48 | no_match, // the input does not match | |
49 | partly_match, // the input matches but is incomplete | |
50 | exact_match // the input matches and is complete | |
9d0662e0 | 51 | }; |
eceb1066 | 52 | |
1ab84bf3 QY |
53 | /* Defines which matcher_rv values constitute an error. Should be used with |
54 | * matcher_rv return values to do basic error checking. | |
9d0662e0 | 55 | */ |
ac4d0be5 | 56 | #define MATCHER_ERROR(matcher_rv) \ |
57 | ((matcher_rv) == MATCHER_INCOMPLETE \ | |
58 | || (matcher_rv) == MATCHER_NO_MATCH \ | |
59 | || (matcher_rv) == MATCHER_AMBIGUOUS) | |
9d0662e0 | 60 | |
eceb1066 QY |
61 | /** |
62 | * Attempt to find an exact command match for a line of user input. | |
63 | * | |
1eb5e8dc | 64 | * @param[in] cmdgraph command graph to match against |
1ab84bf3 | 65 | * @param[in] vline vectorized input string |
17aca20b QY |
66 | * @param[out] argv pointer to argument list if successful match, NULL |
67 | * otherwise. The elements of this list are pointers to struct cmd_token | |
68 | * and represent the sequence of tokens matched by the inpu. The ->arg | |
69 | * field of each token points to a copy of the input matched on it. These | |
70 | * may be safely deleted or modified. | |
71 | * @param[out] element pointer to matched cmd_element if successful match, | |
72 | * or NULL when MATCHER_ERROR(rv) is true. The cmd_element may *not* be | |
73 | * safely deleted or modified; it is the instance initialized on startup. | |
1ab84bf3 | 74 | * @return matcher status |
eceb1066 | 75 | */ |
ac4d0be5 | 76 | enum matcher_rv command_match(struct graph *cmdgraph, vector vline, |
77 | struct list **argv, | |
78 | const struct cmd_element **element); | |
eceb1066 QY |
79 | |
80 | /** | |
1ab84bf3 | 81 | * Compiles possible completions for a given line of user input. |
eceb1066 QY |
82 | * |
83 | * @param[in] start the start node of the DFA to match against | |
1ab84bf3 | 84 | * @param[in] vline vectorized input string |
17aca20b QY |
85 | * @param[out] completions pointer to list of cmd_token representing |
86 | * acceptable next inputs, or NULL when MATCHER_ERROR(rv) is true. | |
87 | * The elements of this list are pointers to struct cmd_token and take on a | |
88 | * variety of forms depending on the passed vline. If the last element in vline | |
89 | * is NULL, all previous elements are considered to be complete words (the case | |
90 | * when a space is the last token of the line) and completions are generated | |
91 | * based on what could follow that input. If the last element in vline is not | |
92 | * NULL and each sequential element matches the corresponding tokens of one or | |
93 | * more commands exactly (e.g. 'encapv4' and not 'en') the same result is | |
94 | * generated. If the last element is not NULL and the best possible match is a | |
95 | * partial match, then the result generated will be all possible continuations | |
96 | * of that element (e.g. 'encapv4', 'encapv6', etc for input 'en'). | |
97 | * @return matcher status | |
eceb1066 | 98 | */ |
ac4d0be5 | 99 | enum matcher_rv command_complete(struct graph *cmdgraph, vector vline, |
100 | struct list **completions); | |
eceb1066 | 101 | |
1ab84bf3 | 102 | #endif /* _ZEBRA_COMMAND_MATCH_H */ |