]> git.sur5r.net Git - openocd/commitdiff
add command private data setter/accessor
authorZachary T Welch <zw@superlucidity.net>
Sat, 28 Nov 2009 00:30:28 +0000 (16:30 -0800)
committerZachary T Welch <zw@superlucidity.net>
Sat, 28 Nov 2009 21:00:39 +0000 (13:00 -0800)
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.

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

index 61a791dc676a8df084b9d2d41cadf0f457878735..b2aa76b0b9e0ba00e0236f94913e975e29f35464 100644 (file)
@@ -439,6 +439,14 @@ int unregister_command(struct command_context *context,
        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)
 {
        if (context && context->output_handler && data) {
index 84bdb71e3d6d0123622d3afdee27dfd3631480d0..2d3348468f3ca541a4e57c868e80693bdebb3df7 100644 (file)
@@ -80,6 +80,8 @@ struct command_context
        void *output_handler_priv;
 };
 
+struct command;
+
 /**
  * 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
@@ -87,6 +89,7 @@ struct command_context
  */
 struct command_invocation {
        struct command_context *ctx;
+       struct command *current;
        const char *name;
        unsigned argc;
        const char **argv;
@@ -151,6 +154,16 @@ struct command_invocation {
  * rather than accessing the variable directly.  It may be moved.
  */
 #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.
@@ -290,6 +303,16 @@ struct command *command_find_in_context(struct command_context *cmd_ctx,
 struct command *command_find_in_parent(struct command *parent,
                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,
                command_output_handler_t output_handler, void *priv);