helper/command: get rid of the tree of struct command
[openocd.git] / src / helper / command.h
index 871c064d3b31fe1ca606a21d116119824533d864..1f2dc5b591f3a97d533f96cb649df066d07dd487 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdbool.h>
 #include <jim-nvp.h>
 
+#include <helper/list.h>
 #include <helper/types.h>
 
 /* To achieve C99 printf compatibility in MinGW, gnu_printf should be
@@ -41,6 +42,7 @@ enum command_mode {
        COMMAND_EXEC,
        COMMAND_CONFIG,
        COMMAND_ANY,
+       COMMAND_UNKNOWN = -1, /* error condition */
 };
 
 struct command_context;
@@ -52,7 +54,6 @@ typedef int (*command_output_handler_t)(struct command_context *context,
 struct command_context {
        Jim_Interp *interp;
        enum command_mode mode;
-       struct command *commands;
        struct target *current_target;
                /* The target set by 'targets xx' command or the latest created */
        struct target *current_target_override;
@@ -64,6 +65,7 @@ struct command_context {
                 */
        command_output_handler_t output_handler;
        void *output_handler_priv;
+       struct list_head *help_list;
 };
 
 struct command;
@@ -179,10 +181,6 @@ typedef __COMMAND_HANDLER((*command_handler_t));
 
 struct command {
        char *name;
-       char *help;
-       char *usage;
-       struct command *parent;
-       struct command *children;
        command_handler_t handler;
        Jim_CmdProc *jim_handler;
        void *jim_handler_data;
@@ -190,7 +188,6 @@ struct command {
        struct target *jim_override_target;
                /* Used only for target of target-prefixed cmd */
        enum command_mode mode;
-       struct command *next;
 };
 
 /*
@@ -240,7 +237,7 @@ struct command_registration {
 /** Use this as the last entry in an array of command_registration records. */
 #define COMMAND_REGISTRATION_DONE { .name = NULL, .chain = NULL }
 
-int __register_commands(struct command_context *cmd_ctx, struct command *parent,
+int __register_commands(struct command_context *cmd_ctx, const char *cmd_prefix,
                const struct command_registration *cmds, void *data,
                struct target *override_target);
 
@@ -252,17 +249,17 @@ int __register_commands(struct command_context *cmd_ctx, struct command *parent,
  * Otherwise, the chained commands are added as children of the command.
  *
  * @param cmd_ctx The command_context in which to register the command.
- * @param parent Register this command as a child of this, or NULL to
+ * @param cmd_prefix Register this command as a child of this, or NULL to
  * register a top-level command.
  * @param cmds Pointer to an array of command_registration records that
  * contains the desired command parameters.  The last record must have
  * NULL for all fields.
  * @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
  */
-static inline int register_commands(struct command_context *cmd_ctx, struct command *parent,
+static inline int register_commands(struct command_context *cmd_ctx, const char *cmd_prefix,
                const struct command_registration *cmds)
 {
-       return __register_commands(cmd_ctx, parent, cmds, NULL, NULL);
+       return __register_commands(cmd_ctx, cmd_prefix, cmds, NULL, NULL);
 }
 
 /**
@@ -270,7 +267,7 @@ static inline int register_commands(struct command_context *cmd_ctx, struct comm
  * that command should override the current target
  *
  * @param cmd_ctx The command_context in which to register the command.
- * @param parent Register this command as a child of this, or NULL to
+ * @param cmd_prefix Register this command as a child of this, or NULL to
  * register a top-level command.
  * @param cmds Pointer to an array of command_registration records that
  * contains the desired command parameters.  The last record must have
@@ -279,10 +276,10 @@ static inline int register_commands(struct command_context *cmd_ctx, struct comm
  * @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
  */
 static inline int register_commands_override_target(struct command_context *cmd_ctx,
-               struct command *parent, const struct command_registration *cmds,
+               const char *cmd_prefix, const struct command_registration *cmds,
                struct target *target)
 {
-       return __register_commands(cmd_ctx, parent, cmds, NULL, target);
+       return __register_commands(cmd_ctx, cmd_prefix, cmds, NULL, target);
 }
 
 /**
@@ -292,7 +289,7 @@ static inline int register_commands_override_target(struct command_context *cmd_
  * is unregistered.
  *
  * @param cmd_ctx The command_context in which to register the command.
- * @param parent Register this command as a child of this, or NULL to
+ * @param cmd_prefix Register this command as a child of this, or NULL to
  * register a top-level command.
  * @param cmds Pointer to an array of command_registration records that
  * contains the desired command parameters.  The last record must have
@@ -301,23 +298,28 @@ static inline int register_commands_override_target(struct command_context *cmd_
  * @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
  */
 static inline int register_commands_with_data(struct command_context *cmd_ctx,
-               struct command *parent, const struct command_registration *cmds,
+               const char *cmd_prefix, const struct command_registration *cmds,
                void *data)
 {
-       return __register_commands(cmd_ctx, parent, cmds, data, NULL);
+       return __register_commands(cmd_ctx, cmd_prefix, cmds, data, NULL);
 }
 
 /**
  * Unregisters all commands from the specified context.
  * @param cmd_ctx The context that will be cleared of registered commands.
- * @param parent If given, only clear commands from under this one command.
+ * @param cmd_prefix If given, only clear commands from under this one command.
  * @returns ERROR_OK on success, or an error code.
  */
 int unregister_all_commands(struct command_context *cmd_ctx,
-               struct command *parent);
+               const char *cmd_prefix);
 
-struct command *command_find_in_context(struct command_context *cmd_ctx,
-               const char *name);
+/**
+ * Unregisters the help for all commands. Used at exit to remove the help
+ * added through the commands 'add_help_text' and 'add_usage_text'.
+ * @param cmd_ctx The context that will be cleared of registered helps.
+ * @returns ERROR_OK on success, or an error code.
+ */
+int help_del_all_commands(struct command_context *cmd_ctx);
 
 void command_set_output_handler(struct command_context *context,
                command_output_handler_t output_handler, void *priv);

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)