+/**
+ * Register one or more commands in the specified context, as children
+ * of @c parent (or top-level commends, if NULL). In a registration's
+ * record contains a non-NULL @c chain member and name is NULL, the
+ * commands on the chain will be registered in the same context.
+ * Otherwise, the chained commands are added as children of the command.
+ *
+ * @param cmd_ctx The command_context in which to register the command.
+ * @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, const char *cmd_prefix,
+ const struct command_registration *cmds)
+{
+ return __register_commands(cmd_ctx, cmd_prefix, cmds, NULL, NULL);
+}
+
+/**
+ * Register one or more commands, as register_commands(), plus specify
+ * that command should override the current target
+ *
+ * @param cmd_ctx The command_context in which to register the command.
+ * @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.
+ * @param target The target that has to override current target.
+ * @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
+ */
+static inline int register_commands_override_target(struct command_context *cmd_ctx,
+ const char *cmd_prefix, const struct command_registration *cmds,
+ struct target *target)
+{
+ return __register_commands(cmd_ctx, cmd_prefix, cmds, NULL, target);
+}
+
+/**
+ * Register one or more commands, as register_commands(), plus specify
+ * a pointer to command private data that would be accessible through
+ * the macro CMD_DATA. The private data will not be freed when command
+ * is unregistered.
+ *
+ * @param cmd_ctx The command_context in which to register the command.
+ * @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.
+ * @param data The command private data.
+ * @returns ERROR_OK on success; ERROR_FAIL if any registration fails.
+ */
+static inline int register_commands_with_data(struct command_context *cmd_ctx,
+ const char *cmd_prefix, const struct command_registration *cmds,
+ void *data)
+{
+ 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 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,
+ const char *cmd_prefix);
+
+/**
+ * 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);
+
+
+int command_context_mode(struct command_context *context, enum command_mode mode);
+
+/* Return the current command context associated with the Jim interpreter or
+ * alternatively the global default command interpreter
+ */
+struct command_context *current_command_context(Jim_Interp *interp);
+/**
+ * Creates a new command context using the startup TCL provided and
+ * the existing Jim interpreter, if any. If interp == NULL, then command_init
+ * creates a command interpreter.
+ */
+struct command_context *command_init(const char *startup_tcl, Jim_Interp *interp);
+/**
+ * Shutdown a command context.
+ *
+ * Free the command context and the associated Jim interpreter.
+ *
+ * @param context The command_context that will be destroyed.
+ */
+void command_exit(struct command_context *context);
+/**
+ * Creates a copy of an existing command context. This does not create
+ * a deep copy of the command list, so modifications in one context will
+ * affect all shared contexts. The caller must track reference counting
+ * and ensure the commands are freed before destroying the last instance.
+ * @param cmd_ctx The command_context that will be copied.
+ * @returns A new command_context with the same state as the original.
+ */
+struct command_context *copy_command_context(struct command_context *cmd_ctx);
+/**
+ * Frees the resources associated with a command context. The commands
+ * are not removed, so unregister_all_commands() must be called first.
+ * @param context The command_context that will be destroyed.
+ */
+void command_done(struct command_context *context);
+
+void command_print(struct command_invocation *cmd, const char *format, ...)
+__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3)));
+void command_print_sameline(struct command_invocation *cmd, const char *format, ...)
+__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3)));
+int command_run_line(struct command_context *context, char *line);
+int command_run_linef(struct command_context *context, const char *format, ...)
+__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3)));
+void command_output_text(struct command_context *context, const char *data);