summaryrefslogtreecommitdiffstats
path: root/lib/vty_cli.c
diff options
context:
space:
mode:
authorChris Hall <chris.hall@highwayman.com>2011-03-31 00:37:47 +0100
committerChris Hall <chris.hall@highwayman.com>2011-03-31 00:37:47 +0100
commit9a9466f1fdad6fb6c94c5ef8ddb1a687a7bcd874 (patch)
treec4ae426872560a5e070f2054072607f2578e1f7d /lib/vty_cli.c
parentf3255d1e9f062e7783b05ab5b32ca70085170d79 (diff)
downloadquagga-9a9466f1fdad6fb6c94c5ef8ddb1a687a7bcd874.tar.bz2
quagga-9a9466f1fdad6fb6c94c5ef8ddb1a687a7bcd874.tar.xz
Small improvements to speed of reading of configuration file.
Tidy up signalling of "ready" to command loop, and checking of appropriate state to close written configuration file.
Diffstat (limited to 'lib/vty_cli.c')
-rw-r--r--lib/vty_cli.c70
1 files changed, 46 insertions, 24 deletions
diff --git a/lib/vty_cli.c b/lib/vty_cli.c
index 311d950c..cf85fb6c 100644
--- a/lib/vty_cli.c
+++ b/lib/vty_cli.c
@@ -2556,12 +2556,12 @@ uty_cli_hist_show(vty_cli cli)
*/
static uint uty_cli_help_parse(vty_cli cli) ;
-static void uty_cli_complete_keyword(vty_cli cli, const char* keyword) ;
+static void uty_cli_complete_keyword(vty_cli cli, elstring keyword) ;
static void uty_cli_complete_list(vty_cli cli, vector item_v) ;
static void uty_cli_describe_list(vty_cli cli, vector item_v) ;
static void uty_cli_describe_line(vty_cli cli, uint str_width, const char* str,
- const char* doc, uint len) ;
+ ulen str_len, const char* doc, ulen doc_len) ;
static uint uty_cli_width_to_use(vty_cli cli) ;
static void uty_cli_help_message(vty_cli cli, const char* msg) ;
@@ -2717,14 +2717,14 @@ uty_cli_help_parse(vty_cli cli)
* Can complete a keyword.
*/
static void
-uty_cli_complete_keyword(vty_cli cli, const char* keyword)
+uty_cli_complete_keyword(vty_cli cli, elstring keyword)
{
int pre, rep, ins, mov ;
cmd_complete_keyword(cli->parsed, &pre, &rep, &ins, &mov) ;
uty_cli_move(cli->cl, pre) ; /* move to start of token */
- uty_cli_replace(cli->cl, rep, keyword, strlen(keyword)) ;
+ uty_cli_replace(cli->cl, rep, els_body_nn(keyword), els_len_nn(keyword)) ;
assert(ins <= 2) ;
if (ins > 0)
@@ -2747,22 +2747,20 @@ uty_cli_complete_keyword(vty_cli cli, const char* keyword)
static void
uty_cli_complete_list(vty_cli cli, vector item_v)
{
- uint i, len, n ;
+ uint i, str_width, n ;
- len = 6 ;
+ str_width = 6 ;
for (i = 0 ; i < vector_length(item_v) ; ++i)
{
cmd_item item ;
- uint sl ;
item = vector_get_item(item_v, i) ;
- sl = strlen(item->str) ;
- if (len < sl)
- len = sl ;
+ if (str_width < els_len_nn(item->str))
+ str_width = els_len_nn(item->str) ;
} ;
- n = uty_cli_width_to_use(cli) / (len + 2) ;
+ n = uty_cli_width_to_use(cli) / (str_width + 2) ;
if (n == 0)
n = 1 ;
@@ -2770,12 +2768,20 @@ uty_cli_complete_list(vty_cli cli, vector item_v)
for (i = 0 ; i < vector_length(item_v) ; ++i)
{
cmd_item item ;
+ ulen str_len ;
+ ulen pad ;
+
item = vector_get_item(item_v, i) ;
if ((i % n) == 0)
uty_cli_out_newline(cli) ; /* clears cli_drawn */
- uty_cli_out(cli, "%-*s ", len, item->str) ;
+ str_len = els_len_nn(item->str) ;
+ uty_cli_write(cli, els_body_nn(item->str), str_len) ;
+
+ pad = (str_len < str_width) ? str_width - str_len : 0 ;
+
+ uty_cli_write_n(cli, telnet_spaces, pad + 2) ;
}
uty_cli_help_newline(cli) ;
} ;
@@ -2811,8 +2817,8 @@ uty_cli_describe_list(vty_cli cli, vector item_v)
item = vector_get_item(item_v, i) ;
- len = strlen(item->str) ;
- if (item->str[0] == '.')
+ len = els_len_nn(item->str) ;
+ if (*((char*)els_body_nn(item->str)) == '.')
len--;
if (len > str_width)
@@ -2844,10 +2850,18 @@ uty_cli_describe_list(vty_cli cli, vector item_v)
{
cmd_item item ;
const char* str, * dp, * ep ;
+ ulen str_len ;
item = vector_get_item(item_v, i) ;
- str = item->str[0] == '.' ? item->str + 1 : item->str;
+ str = els_body_nn(item->str) ;
+ str_len = els_len_nn(item->str) ;
+ if (*str == '.')
+ {
+ ++str ;
+ --str_len ;
+ } ;
+
dp = item->doc ;
ep = dp + strlen(dp) ;
@@ -2866,9 +2880,9 @@ uty_cli_describe_list(vty_cli cli, vector item_v)
if (np == dp) /* if no space... */
np = dp + doc_width ; /* ...force break */
- uty_cli_describe_line(cli, str_width, str, dp, np - dp) ;
+ uty_cli_describe_line(cli, str_width, str, str_len, dp, np - dp) ;
- str = ""; /* for 2nd and subsequent lines */
+ str_len = 0 ; /* for 2nd and subsequent lines */
dp = np ; /* step past what just wrote */
while (*dp == ' ')
@@ -2876,7 +2890,7 @@ uty_cli_describe_list(vty_cli cli, vector item_v)
} ;
} ;
- uty_cli_describe_line(cli, str_width, str, dp, ep - dp) ;
+ uty_cli_describe_line(cli, str_width, str, str_len, dp, ep - dp) ;
} ;
uty_cli_help_newline(cli) ;
@@ -2887,19 +2901,27 @@ uty_cli_describe_list(vty_cli cli, vector item_v)
*/
static void
uty_cli_describe_line(vty_cli cli, uint str_width, const char* str,
- const char* doc, uint len)
+ ulen str_len, const char* doc, ulen doc_len)
{
- if ((*str == '\0') && (len == 0))
+ if ((str_len == 0) && (doc_len == 0))
return ; /* quit if nothing to say */
uty_cli_help_newline(cli) ;
- if (len == 0)
- uty_cli_out(cli, " %s", str) ; /* left justify */
+ if (str_len > 0)
+ {
+ uty_cli_write(cli, " ", 2) ;
+ uty_cli_write(cli, str, str_len) ;
+ }
else
+ str_width += 2 ;
+
+ if (doc_len > 0)
{
- uty_cli_out(cli, " %-*s ", str_width, str) ;
- uty_cli_write(cli, doc, len) ;
+ ulen pad ;
+ pad = (str_len < str_width) ? str_width - str_len : 0 ;
+ uty_cli_write_n(cli, telnet_spaces, pad + 2) ;
+ uty_cli_write(cli, doc, doc_len) ;
} ;
} ;