add command private data setter/accessor
Presently, commands registration taks a static handler data pointer. This patch adds support for commands that require a dynamic pointer, such as those registered in a dynamic context (e.g. subcommands for a user-created 'foo.cpu' command). The command_set_handler_data will update a command (group) to use a new context pointer, while the CMD_DATA macro allows command handlers to access the value. Jim handlers should find this value in interp->cmdPrivData.__archive__
parent
3b5751a4d4
commit
933b4579f0
|
@ -439,6 +439,14 @@ int unregister_command(struct command_context *context,
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void command_set_handler_data(struct command *c, void *p)
|
||||||
|
{
|
||||||
|
if (NULL != c->handler || NULL != c->jim_handler)
|
||||||
|
c->jim_handler_data = p;
|
||||||
|
for (struct command *cc = c->children; NULL != cc; cc = cc->next)
|
||||||
|
command_set_handler_data(cc, p);
|
||||||
|
}
|
||||||
|
|
||||||
void command_output_text(struct command_context *context, const char *data)
|
void command_output_text(struct command_context *context, const char *data)
|
||||||
{
|
{
|
||||||
if (context && context->output_handler && data) {
|
if (context && context->output_handler && data) {
|
||||||
|
|
|
@ -80,6 +80,8 @@ struct command_context
|
||||||
void *output_handler_priv;
|
void *output_handler_priv;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct command;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When run_command is called, a new instance will be created on the
|
* 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
|
* stack, filled with the proper values, and passed by reference to the
|
||||||
|
@ -87,6 +89,7 @@ struct command_context
|
||||||
*/
|
*/
|
||||||
struct command_invocation {
|
struct command_invocation {
|
||||||
struct command_context *ctx;
|
struct command_context *ctx;
|
||||||
|
struct command *current;
|
||||||
const char *name;
|
const char *name;
|
||||||
unsigned argc;
|
unsigned argc;
|
||||||
const char **argv;
|
const char **argv;
|
||||||
|
@ -151,6 +154,16 @@ struct command_invocation {
|
||||||
* rather than accessing the variable directly. It may be moved.
|
* rather than accessing the variable directly. It may be moved.
|
||||||
*/
|
*/
|
||||||
#define CMD_NAME cmd->name
|
#define CMD_NAME cmd->name
|
||||||
|
/**
|
||||||
|
* Use this macro to access the current command being handled,
|
||||||
|
* rather than accessing the variable directly. It may be moved.
|
||||||
|
*/
|
||||||
|
#define CMD_CURRENT cmd->current
|
||||||
|
/**
|
||||||
|
* Use this macro to access the invoked command handler's data pointer,
|
||||||
|
* rather than accessing the variable directly. It may be moved.
|
||||||
|
*/
|
||||||
|
#define CMD_DATA CMD_CURRENT->jim_handler_data
|
||||||
|
|
||||||
|
|
||||||
/// The type signature for commands' handler functions.
|
/// The type signature for commands' handler functions.
|
||||||
|
@ -290,6 +303,16 @@ struct command *command_find_in_context(struct command_context *cmd_ctx,
|
||||||
struct command *command_find_in_parent(struct command *parent,
|
struct command *command_find_in_parent(struct command *parent,
|
||||||
const char *name);
|
const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the private command data field for a command and all descendents.
|
||||||
|
* This is used when creating a new heirarchy of commands that depends
|
||||||
|
* on obtaining a dynamically created context. The value will be available
|
||||||
|
* in command handlers by using the CMD_DATA macro.
|
||||||
|
* @param c The command (group) whose data pointer(s) will be updated.
|
||||||
|
* @param p The new data pointer to use for the command or its descendents.
|
||||||
|
*/
|
||||||
|
void command_set_handler_data(struct command *c, void *p);
|
||||||
|
|
||||||
void command_set_output_handler(struct command_context* context,
|
void command_set_output_handler(struct command_context* context,
|
||||||
command_output_handler_t output_handler, void *priv);
|
command_output_handler_t output_handler, void *priv);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue