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:
parent
2861877b32
commit
be084414ba
|
@ -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 */
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue