add struct command_invocation for COMMAND_HANDLER

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.
This commit is contained in:
Zachary T Welch 2009-11-15 04:21:17 -08:00
parent 2861877b32
commit be084414ba
2 changed files with 21 additions and 9 deletions

View File

@ -447,9 +447,12 @@ static int run_command(struct command_context *context,
return ERROR_FAIL; return ERROR_FAIL;
} }
unsigned argc = num_words - start_word - 1; struct command_invocation cmd = {
const char **args = words + start_word + 1; .ctx = context,
int retval = c->handler(context, args, argc); .argc = num_words - start_word - 1,
.argv = words + start_word + 1,
};
int retval = c->handler(&cmd);
if (retval == ERROR_COMMAND_SYNTAX_ERROR) if (retval == ERROR_COMMAND_SYNTAX_ERROR)
{ {
/* Print help for command */ /* Print help for command */

View File

@ -80,6 +80,16 @@ struct command_context
void *output_handler_priv; 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 * 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. * defining all such derivative types using this macro.
*/ */
#define __COMMAND_HANDLER(name, extra...) \ #define __COMMAND_HANDLER(name, extra...) \
int name(struct command_context *cmd_ctx, \ int name(struct command_invocation *cmd, ##extra)
const char *args[], unsigned argc, ##extra)
/** /**
* Use this to macro to call a command helper (or a nested handler). * 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. * variables in intervening scope(s) by accident.
*/ */
#define CALL_COMMAND_HANDLER(name, extra...) \ #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. * 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, * Use this macro to access the context of the command being handled,
* rather than accessing the variable directly. It may be moved. * 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 * Use this macro to access the number of arguments for the command being
* handled, rather than accessing the variable directly. It may be moved. * 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, * Use this macro to access the arguments for the command being handled,
* rather than accessing the variable directly. It may be moved. * 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, * Use this macro to access the name of the command being handled,
* rather than accessing the variable directly. It may be moved. * rather than accessing the variable directly. It may be moved.