]>
git.ipfire.org Git - thirdparty/bird.git/blob - client/commands.c
2 * BIRD Client -- Command Handling
4 * (c) 1999--2000 Martin Mares <mj@ucw.cz>
6 * Can be freely distributed and used under the terms of the GNU GPL.
13 #include "nest/bird.h"
14 #include "lib/resource.h"
15 #include "client/client.h"
24 static struct cmd_info command_table
[] = {
25 #include "conf/commands.h"
28 /* FIXME: There should exist some system of aliases, so that `show' can be abbreviated as `s' etc. */
31 struct cmd_node
*sibling
, *son
, **plastson
;
32 struct cmd_info
*cmd
, *help
;
37 static struct cmd_node cmd_root
;
44 cmd_root
.plastson
= &cmd_root
.son
;
46 for(i
=0; i
<sizeof(command_table
) / sizeof(struct cmd_info
); i
++)
48 struct cmd_info
*cmd
= &command_table
[i
];
49 struct cmd_node
*old
, *new;
50 char *c
= cmd
->command
;
56 while (*c
&& *c
!= ' ')
58 for(new=old
->son
; new; new=new->sibling
)
59 if (new->len
== c
-d
&& !memcmp(new->token
, d
, c
-d
))
63 int size
= sizeof(struct cmd_node
) + c
-d
;
67 old
->plastson
= &new->sibling
;
68 new->plastson
= &new->son
;
70 memcpy(new->token
, d
, c
-d
);
84 cmd_do_display_help(struct cmd_info
*c
)
86 char buf
[strlen(c
->command
) + strlen(c
->args
) + 4];
88 sprintf(buf
, "%s %s", c
->command
, c
->args
);
89 printf("%-45s %s\n", buf
, c
->help
);
93 cmd_display_help(struct cmd_info
*c1
, struct cmd_info
*c2
)
96 cmd_do_display_help(c1
);
98 cmd_do_display_help(c2
);
101 static struct cmd_node
*
102 cmd_find_abbrev(struct cmd_node
*root
, char *cmd
, int len
, int *pambiguous
)
104 struct cmd_node
*m
, *best
= NULL
, *best2
= NULL
;
107 for(m
=root
->son
; m
; m
=m
->sibling
)
109 if (m
->len
== len
&& !memcmp(m
->token
, cmd
, len
))
111 if (m
->len
> len
&& !memcmp(m
->token
, cmd
, len
))
126 cmd_list_ambiguous(struct cmd_node
*root
, char *cmd
, int len
)
130 for(m
=root
->son
; m
; m
=m
->sibling
)
131 if (m
->len
> len
&& !memcmp(m
->token
, cmd
, len
))
132 cmd_display_help(m
->help
, m
->cmd
);
136 cmd_help(char *cmd
, int len
)
138 char *end
= cmd
+ len
;
139 struct cmd_node
*n
, *m
;
146 if (*cmd
== ' ' || *cmd
== '\t')
152 while (cmd
< end
&& *cmd
!= ' ' && *cmd
!= '\t')
154 m
= cmd_find_abbrev(n
, z
, cmd
-z
, &ambig
);
157 cmd_list_ambiguous(n
, z
, cmd
-z
);
164 cmd_display_help(n
->cmd
, NULL
);
165 for (m
=n
->son
; m
; m
=m
->sibling
)
166 cmd_display_help(m
->help
, m
->cmd
);
170 cmd_find_common_match(struct cmd_node
*root
, char *cmd
, int len
, int *pcount
, char *buf
)
177 for(m
=root
->son
; m
; m
=m
->sibling
)
179 if (m
->len
< len
|| memcmp(m
->token
, cmd
, len
))
184 strcpy(buf
, m
->token
+ len
);
190 while (i
< best
&& i
< m
->len
- len
&& buf
[i
] == m
->token
[len
+i
])
199 cmd_complete(char *cmd
, int len
, char *buf
, int again
)
202 char *end
= cmd
+ len
;
204 struct cmd_node
*n
, *m
;
206 int ambig
, cnt
= 0, common
;
208 /* Find the last word we want to complete */
209 for(fin
=end
; fin
> start
&& !isspace(fin
[-1]); fin
--)
212 /* Find the context */
214 while (cmd
< fin
&& n
->son
)
216 if (*cmd
== ' ' || *cmd
== '\t')
222 while (cmd
< fin
&& !isspace(*cmd
))
224 m
= cmd_find_abbrev(n
, z
, cmd
-z
, &ambig
);
230 cmd_list_ambiguous(n
, z
, cmd
-z
);
239 /* Completion of parameters is not yet supported */
243 /* We know the context, let's try to complete */
244 common
= cmd_find_common_match(n
, fin
, end
-fin
, &cnt
, buf
);
261 cmd_list_ambiguous(n
, fin
, end
-fin
);