aboutsummaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2024-03-05 19:04:10 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2024-03-05 19:04:10 +0100
commit1b064355f752b9bfe4644f775697bbd9b711f762 (patch)
tree8f3995f1b7450ddbc6309a18fc5e80bc25fdb31b /client
parent114be2af28e5c124bd479a487f89244ba99c272d (diff)
downloadbird-1b064355f752b9bfe4644f775697bbd9b711f762.tar.gz
Client: Add support for completion of command options
We can easily extend command completion to handle also keywords for command options. Help for command options is not yet supported.
Diffstat (limited to 'client')
-rw-r--r--client/commands.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/client/commands.c b/client/commands.c
index fdf2652a..318f0ecd 100644
--- a/client/commands.c
+++ b/client/commands.c
@@ -20,6 +20,7 @@ struct cmd_info {
char *args;
char *help;
int is_real_cmd;
+ int is_option;
};
static struct cmd_info command_table[] = {
@@ -30,7 +31,8 @@ struct cmd_node {
struct cmd_node *sibling, *son, **plastson;
struct cmd_info *cmd, *help;
int len;
- signed char prio;
+ u8 final;
+ s8 prio;
char token[1];
};
@@ -51,12 +53,13 @@ cmd_build_tree(void)
struct cmd_node *old, *new;
char *c = cmd->command;
- old = &cmd_root;
+ new = &cmd_root;
while (*c)
{
char *d = c;
while (*c && !isspace_(*c))
c++;
+ old = new;
for(new=old->son; new; new=new->sibling)
if (new->len == c-d && !memcmp(new->token, d, c-d))
break;
@@ -72,14 +75,17 @@ cmd_build_tree(void)
memcpy(new->token, d, c-d);
new->prio = (new->len == 3 && (!memcmp(new->token, "roa", 3) || !memcmp(new->token, "rip", 3))) ? 0 : 1; /* Hack */
}
- old = new;
while (isspace_(*c))
c++;
}
+
if (cmd->is_real_cmd)
- old->cmd = cmd;
+ new->cmd = cmd;
else
- old->help = cmd;
+ new->help = cmd;
+
+ if (cmd->is_option)
+ old->final = 1;
}
}
@@ -147,7 +153,7 @@ cmd_help(char *cmd, int len)
int ambig;
n = &cmd_root;
- while (cmd < end)
+ while (cmd < end && !n->final)
{
if (isspace_(*cmd))
{
@@ -168,6 +174,11 @@ cmd_help(char *cmd, int len)
n = m;
}
cmd_display_help(n->cmd, NULL);
+
+ /* Currently no help for options */
+ if (n->final)
+ return;
+
for (m=n->son; m; m=m->sibling)
cmd_display_help(m->help, m->cmd);
}
@@ -229,7 +240,7 @@ cmd_complete(char *cmd, int len, char *buf, int again)
/* Find the context */
n = &cmd_root;
- while (cmd < fin && n->son)
+ while (cmd < fin && n->son && !n->final)
{
if (isspace_(*cmd))
{
@@ -290,7 +301,7 @@ cmd_expand(char *cmd)
args = c = cmd;
n = &cmd_root;
- while (*c)
+ while (*c && !n->final)
{
if (isspace_(*c))
{