-
Notifications
You must be signed in to change notification settings - Fork 0
/
vty_keyfunction.cc
130 lines (100 loc) · 2.87 KB
/
vty_keyfunction.cc
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
#include <vty_keyfunction.h>
#include <vty_cmd.h>
#include <vty_client.h>
#include <slankdev/string.h>
#include <algorithm>
static inline bool endisspace(std::string str)
{
const char* istr = str.c_str();
return (istr[strlen(istr)-1] == ' ');
}
void KF_help::function(vty_client* sh)
{
const std::vector<vty_cmd*>& commands = *sh->commands;
std::vector<std::string> list = slankdev::split(sh->ibuf.to_string().c_str(), ' ');
if (endisspace(sh->ibuf.to_string().c_str()) || list.empty()) list.push_back("");
sh->Printf("\r\n");
std::vector<std::string> match;
for (vty_cmd* cmd : commands) {
for (size_t i=0; i<list.size(); i++) {
if (i == cmd->match.nodes.size()) {
if (list[i] == "") {
sh->Printf(" <CR>\r\n");
} else {
sh->Printf(" %% There is no matched command.\r\n");
}
return ;
} else {
if (!cmd->match.nodes[i]->match_prefix(list[i])) {
break;
} else {
if (i+1==list.size()) {
std::string s = slankdev::fs("%-10s: %-20s",
cmd->match.nodes[i]->to_string().c_str(),
cmd->match.nodes[i]->msg().c_str()
);
match.push_back(s);
} else {
;
}
}
}
}
}
std::sort(match.begin(), match.end());
match.erase(std::unique(match.begin(), match.end()), match.end());
for (std::string& s : match) {
sh->Printf(" %s \r\n", s.c_str());
}
}
void KF_completion::function(vty_client* sh)
{
const std::vector<vty_cmd*>& commands = *sh->commands;
std::vector<std::string> list = slankdev::split(sh->ibuf.to_string().c_str(), ' ');
if (endisspace(sh->ibuf.to_string().c_str()) || list.empty()) list.push_back("");
sh->Printf("\r\n");
std::vector<std::string> match;
for (vty_cmd* cmd : commands) {
for (size_t i=0; i<list.size(); i++) {
if (i == cmd->match.nodes.size()) {
if (list[i] == "") {
sh->Printf(" <CR>\r\n");
} else {
sh->Printf(" %% There is no matched command.\r\n");
}
return ;
} else {
if (!cmd->match.nodes[i]->match_prefix(list[i])) {
break;
} else {
if (i+1==list.size()) {
std::string s = cmd->match.nodes[i]->to_string();
match.push_back(s);
} else {
;
}
}
}
}
}
std::sort(match.begin(), match.end());
match.erase(std::unique(match.begin(), match.end()), match.end());
if (match.size() == 1) {
std::string s;
for (size_t i=0; i<list.size(); i++) {
if (i == list.size()-1) {
s += match[0];
} else {
s += list[i];
}
s += " ";
}
sh->ibuf.clear();
sh->ibuf.input_str(s);
} else {
for (std::string& s : match) {
sh->Printf(" %s ", s.c_str());
}
sh->Printf("\r\n");
}
}