]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
command-parser: Allow commands to be aliased
authorCharlie Brej <cbrej@cs.man.ac.uk>
Tue, 7 Sep 2010 22:44:43 +0000 (23:44 +0100)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Tue, 7 Sep 2010 22:44:43 +0000 (23:44 +0100)
Adds aliases to commands which allow backward compatibility to old names.

src/libply/ply-command-parser.c
src/libply/ply-command-parser.h

index dce515fd835722f1b15b5230feaf36132bfedab1..6ab323bc594d3960be649861fb805c5161529b82 100644 (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,
index e37b5fccf05a148742b510fe3dc2c39c4ebbbfd0..8af005780468d4514ae603bbbb6d8dd13e82f6aa 100644 (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 */