add struct command_invocation for COMMAND_HANDLER
authorZachary T Welch <zw@superlucidity.net>
Sun, 15 Nov 2009 12:21:17 +0000 (04:21 -0800)
committerZachary T Welch <zw@superlucidity.net>
Tue, 17 Nov 2009 19:40:21 +0000 (11:40 -0800)
Adds the command_invocation structure to encapsulate parameters for
all COMMAND_HANDLER routines.  Rather than passing several arguments
to each successive subroutine, a single pointer may be passed around.

Changes the CMD_* macros to reference the new fields.

Updates run_command to create an instance and pass it to the handler.

src/helper/command.c
src/helper/command.h

index fdb59f0..96d23ab 100644 (file)
@@ -447,9 +447,12 @@ static int run_command(struct command_context *context,
                return ERROR_FAIL;
        }
 
-       unsigned argc = num_words - start_word - 1;
-       const char **args = words + start_word + 1;
-       int retval = c->handler(context, args, argc);
+       struct command_invocation cmd = {
+                       .ctx = context,
+                       .argc = num_words - start_word - 1,
+                       .argv = words + start_word + 1,
+               };
+       int retval = c->handler(&cmd);
        if (retval == ERROR_COMMAND_SYNTAX_ERROR)
        {
                /* Print help for command */
index 7484964..b8ea3a4 100644 (file)
@@ -80,6 +80,16 @@ struct command_context
        void *output_handler_priv;
 };
 
+/**
+ * When run_command is called, a new instance will be created on the
+ * stack, filled with the proper values, and passed by reference to the
+ * required COMMAND_HANDLER routine.
+ */
+struct command_invocation {
+       struct command_context *ctx;
+       unsigned argc;
+       const char **argv;
+};
 
 /**
  * Command handlers may be defined with more parameters than the base
@@ -87,8 +97,7 @@ struct command_context
  * defining all such derivative types using this macro.
  */
 #define __COMMAND_HANDLER(name, extra...) \
-               int name(struct command_context *cmd_ctx, \
-                               const char *args[], unsigned argc, ##extra)
+               int name(struct command_invocation *cmd, ##extra)
 
 /**
  * Use this to macro to call a command helper (or a nested handler).
@@ -104,7 +113,7 @@ struct command_context
  * variables in intervening scope(s) by accident.
  */
 #define CALL_COMMAND_HANDLER(name, extra...) \
-               name(cmd_ctx, args, argc, ##extra)
+               name(cmd, ##extra)
 
 /**
  * Always use this macro to define new command handler functions.
@@ -125,17 +134,17 @@ struct command_context
  * Use this macro to access the context of the command being handled,
  * rather than accessing the variable directly.  It may be moved.
  */
-#define CMD_CTX cmd_ctx
+#define CMD_CTX cmd->ctx
 /**
  * Use this macro to access the number of arguments for the command being
  * handled, rather than accessing the variable directly.  It may be moved.
  */
-#define CMD_ARGC argc
+#define CMD_ARGC cmd->argc
 /**
  * Use this macro to access the arguments for the command being handled,
  * rather than accessing the variable directly.  It may be moved.
  */
-#define CMD_ARGV args
+#define CMD_ARGV cmd->argv
 /**
  * Use this macro to access the name of the command being handled,
  * rather than accessing the variable directly.  It may be moved.