+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
+ * required COMMAND_HANDLER routine.
+ */
+struct command_invocation {
+ struct command_context *ctx;
+ struct command *current;
+ const char *name;
+ unsigned argc;
+ const char **argv;
+ Jim_Obj *output;
+};
+
+/**
+ * Return true if the command @c cmd is registered by OpenOCD.
+ */
+bool jimcmd_is_oocd_command(Jim_Cmd *cmd);
+
+/**
+ * Return the pointer to the command's private data specified during the
+ * registration of command @a cmd .
+ */
+void *jimcmd_privdata(Jim_Cmd *cmd);
+
+/**
+ * Command handlers may be defined with more parameters than the base
+ * set provided by command.c. This macro uses C99 magic to allow
+ * defining all such derivative types using this macro.
+ */
+#define __COMMAND_HANDLER(name, extra ...) \
+ int name(struct command_invocation *cmd, ## extra)
+
+/**
+ * Use this to macro to call a command helper (or a nested handler).
+ * It provides command handler authors protection against reordering or
+ * removal of unused parameters.
+ *
+ * @b Note: This macro uses lexical capture to provide some arguments.
+ * As a result, this macro should be used @b only within functions
+ * defined by the COMMAND_HANDLER or COMMAND_HELPER macros. Those
+ * macros provide the expected lexical context captured by this macro.
+ * Furthermore, it should be used only from the top-level of handler or
+ * helper function, or care must be taken to avoid redefining the same
+ * variables in intervening scope(s) by accident.
+ */
+#define CALL_COMMAND_HANDLER(name, extra ...) \
+ name(cmd, ## extra)
+
+/**
+ * Always use this macro to define new command handler functions.
+ * It ensures the parameters are ordered, typed, and named properly, so
+ * they be can be used by other macros (e.g. COMMAND_PARSE_NUMBER).
+ * All command handler functions must be defined as static in scope.
+ */
+#define COMMAND_HANDLER(name) \
+ static __COMMAND_HANDLER(name)
+
+/**
+ * Similar to COMMAND_HANDLER, except some parameters are expected.
+ * A helper is globally-scoped because it may be shared between several
+ * source files (e.g. the s3c24xx device command helper).
+ */
+#define COMMAND_HELPER(name, extra ...) __COMMAND_HANDLER(name, extra)
+
+/**
+ * Use this macro to access the command being handled,
+ * rather than accessing the variable directly. It may be moved.
+ */
+#define CMD (cmd)
+/**
+ * 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)
+/**
+ * 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 (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 (cmd->argv)
+/**
+ * Use this macro to access the name of the command being handled,
+ * 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 command handling functions. They are
+ * usually registered as part of command_registration, providing
+ * a high-level means for executing a command.
+ *
+ * If the command fails, it *MUST* return a value != ERROR_OK
+ * (many commands break this rule, patches welcome!)
+ *
+ * This is *especially* important for commands such as writing
+ * to flash or verifying memory. The reason is that those commands
+ * can be used by programs to determine if the operation succeeded
+ * or not. If the operation failed, then a program can try
+ * an alternative approach.
+ *
+ * Returning ERROR_COMMAND_SYNTAX_ERROR will have the effect of
+ * printing out the syntax of the command.
+ */
+typedef __COMMAND_HANDLER((*command_handler_t));
+
+struct command {