command-parser: Allow commands to be aliased

Adds aliases to commands which allow backward compatibility to old names.
This commit is contained in:
Charlie Brej 2010-09-07 23:44:43 +01:00
parent e50ece1f70
commit 74c461fffd
2 changed files with 38 additions and 1 deletions

View file

@ -52,6 +52,7 @@ typedef struct
typedef struct
{
char *name;
ply_list_t *aliases;
char *description;
ply_list_t *options;
@ -114,6 +115,7 @@ ply_command_new (const char *name,
command->options = ply_list_new ();
command->name = strdup (name);
command->aliases = ply_list_new ();
command->description = strdup (description);
command->handler = handler;
command->handler_data = data;
@ -125,10 +127,17 @@ static void
ply_command_free (ply_command_t *command)
{
ply_list_node_t *option_node;
ply_list_node_t *alias_node;
if (command == NULL)
return;
while ((alias_node = ply_list_get_first_node (command->aliases)) != NULL)
{
free (ply_list_node_get_data (alias_node));
ply_list_remove_node (command->aliases, alias_node);
}
option_node = ply_list_get_first_node (command->options);
while (option_node != NULL)
{
@ -463,7 +472,7 @@ ply_command_parser_set_arguments (ply_command_parser_t *parser,
static ply_command_t *
ply_command_parser_get_command (ply_command_parser_t *parser,
const char *command_name)
const char *command_name)
{
ply_command_t *command;
ply_list_node_t *node;
@ -473,12 +482,23 @@ ply_command_parser_get_command (ply_command_parser_t *parser,
while (node != NULL)
{
ply_list_node_t *next_node;
ply_list_node_t *alias_node;
char *alias_name;
command = (ply_command_t *) ply_list_node_get_data (node);
next_node = ply_list_get_next_node (parser->available_subcommands, node);
if (strcmp (command_name, command->name) == 0)
return command;
alias_node = ply_list_get_first_node (command->aliases);
while (alias_node)
{
alias_name = (char *) ply_list_node_get_data (alias_node);
if (strcmp (command_name, alias_name) == 0)
return command;
alias_node = ply_list_get_next_node (command->aliases, alias_node);
}
node = next_node;
}
@ -486,6 +506,20 @@ ply_command_parser_get_command (ply_command_parser_t *parser,
return NULL;
}
void ply_command_parser_add_command_alias (ply_command_parser_t *parser,
const char *name,
const char *alias)
{
ply_command_t *command;
assert (parser != NULL);
assert (name != NULL);
assert (alias != NULL);
command = ply_command_parser_get_command (parser, name);
ply_list_append_data (command->aliases, strdup(alias));
}
static void
ply_command_parser_get_option_for_command (ply_command_parser_t *parser,
ply_command_t *command,

View file

@ -55,6 +55,9 @@ void ply_command_parser_add_command (ply_command_parser_t *parser,
const char *option_description,
ply_option_argument_type_t option_type */
...);
void ply_command_parser_add_command_alias (ply_command_parser_t *parser,
const char *name,
const char *alias);
void ply_command_parser_get_options (ply_command_parser_t *parser,
const char *option_name, /*
void * option_result */