helper/command: do not replace new commands with ocd_ prefix
[openocd.git] / src / helper / command.c
index 1ff4e01a7d1a5d51c4cf1cd26ed8d394bec43eb8..4883984f1486eba49281ad8a7f1181943f08f63a 100644 (file)
@@ -190,7 +190,7 @@ struct command_context *current_command_context(Jim_Interp *interp)
 }
 
 static int script_command_run(Jim_Interp *interp,
-       int argc, Jim_Obj * const *argv, struct command *c, bool capture)
+       int argc, Jim_Obj * const *argv, struct command *c)
 {
        target_call_timer_callbacks_now();
        LOG_USER_N("%s", "");   /* Keep GDB connection alive*/
@@ -200,15 +200,9 @@ static int script_command_run(Jim_Interp *interp,
        if (NULL == words)
                return JIM_ERR;
 
-       struct log_capture_state *state = NULL;
-       if (capture)
-               state = command_log_capture_start(interp);
-
        struct command_context *cmd_ctx = current_command_context(interp);
        int retval = run_command(cmd_ctx, c, (const char **)words, nwords);
 
-       command_log_capture_finish(state);
-
        script_command_args_free(words, nwords);
        return command_retval_set(interp, retval);
 }
@@ -220,7 +214,7 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        struct command *c = interp->cmdPrivData;
        assert(c);
        script_debug(interp, c->name, argc, argv);
-       return script_command_run(interp, argc, argv, c, true);
+       return script_command_run(interp, argc, argv, c);
 }
 
 static struct command *command_root(struct command *c)
@@ -316,7 +310,7 @@ static struct command *command_new(struct command_context *cmd_ctx,
         * arguments.
        */
        if ((cr->jim_handler == NULL) && (cr->usage == NULL)) {
-               LOG_DEBUG("BUG: command '%s%s%s' does not have the "
+               LOG_ERROR("BUG: command '%s%s%s' does not have the "
                        "'.usage' field filled out",
                        parent && parent->name ? parent->name : "",
                        parent && parent->name ? " " : "",
@@ -357,27 +351,11 @@ static int register_command_handler(struct command_context *cmd_ctx,
        struct command *c)
 {
        Jim_Interp *interp = cmd_ctx->interp;
-       char *ocd_name = alloc_printf("ocd_%s", c->name);
-       if (NULL == ocd_name)
-               return JIM_ERR;
 
-       LOG_DEBUG("registering '%s'...", ocd_name);
+       LOG_DEBUG("registering '%s'...", c->name);
 
        Jim_CmdProc *func = c->handler ? &script_command : &command_unknown;
-       int retval = Jim_CreateCommand(interp, ocd_name, func, c, NULL);
-       free(ocd_name);
-       if (JIM_OK != retval)
-               return retval;
-
-       /* we now need to add an overrideable proc */
-       char *override_name = alloc_printf(
-                       "proc %s {args} {eval ocd_bouncer %s $args}",
-                       c->name, c->name);
-       if (NULL == override_name)
-               return JIM_ERR;
-
-       retval = Jim_Eval_Named(interp, override_name, 0, 0);
-       free(override_name);
+       int retval = Jim_CreateCommand(interp, c->name, func, c, NULL);
 
        return retval;
 }
@@ -502,7 +480,7 @@ void command_output_text(struct command_context *context, const char *data)
                context->output_handler(context, data);
 }
 
-void command_print_sameline(struct command_context *context, const char *format, ...)
+void command_print_sameline(struct command_invocation *cmd, const char *format, ...)
 {
        char *string;
 
@@ -510,13 +488,13 @@ void command_print_sameline(struct command_context *context, const char *format,
        va_start(ap, format);
 
        string = alloc_vprintf(format, ap);
-       if (string != NULL) {
+       if (string != NULL && cmd) {
                /* we want this collected in the log + we also want to pick it up as a tcl return
                 * value.
                 *
                 * The latter bit isn't precisely neat, but will do for now.
                 */
-               LOG_USER_N("%s", string);
+               Jim_AppendString(cmd->ctx->interp, cmd->output, string, -1);
                /* We already printed it above
                 * command_output_text(context, string); */
                free(string);
@@ -525,7 +503,7 @@ void command_print_sameline(struct command_context *context, const char *format,
        va_end(ap);
 }
 
-void command_print(struct command_context *context, const char *format, ...)
+void command_print(struct command_invocation *cmd, const char *format, ...)
 {
        char *string;
 
@@ -533,7 +511,7 @@ void command_print(struct command_context *context, const char *format, ...)
        va_start(ap, format);
 
        string = alloc_vprintf(format, ap);
-       if (string != NULL) {
+       if (string != NULL && cmd) {
                strcat(string, "\n");   /* alloc_vprintf guaranteed the buffer to be at least one
                                         *char longer */
                /* we want this collected in the log + we also want to pick it up as a tcl return
@@ -541,7 +519,7 @@ void command_print(struct command_context *context, const char *format, ...)
                 *
                 * The latter bit isn't precisely neat, but will do for now.
                 */
-               LOG_USER_N("%s", string);
+               Jim_AppendString(cmd->ctx->interp, cmd->output, string, -1);
                /* We already printed it above
                 * command_output_text(context, string); */
                free(string);
@@ -579,31 +557,35 @@ char *command_name(struct command *c, char delim)
 
 static bool command_can_run(struct command_context *cmd_ctx, struct command *c)
 {
-       return c->mode == COMMAND_ANY || c->mode == cmd_ctx->mode;
+       if (c->mode == COMMAND_ANY || c->mode == cmd_ctx->mode)
+               return true;
+
+       /* Many commands may be run only before/after 'init' */
+       const char *when;
+       switch (c->mode) {
+               case COMMAND_CONFIG:
+                       when = "before";
+                       break;
+               case COMMAND_EXEC:
+                       when = "after";
+                       break;
+               /* handle the impossible with humor; it guarantees a bug report! */
+               default:
+                       when = "if Cthulhu is summoned by";
+                       break;
+       }
+       char *full_name = command_name(c, ' ');
+       LOG_ERROR("The '%s' command must be used %s 'init'.",
+                       full_name ? full_name : c->name, when);
+       free(full_name);
+       return false;
 }
 
 static int run_command(struct command_context *context,
        struct command *c, const char *words[], unsigned num_words)
 {
-       if (!command_can_run(context, c)) {
-               /* Many commands may be run only before/after 'init' */
-               const char *when;
-               switch (c->mode) {
-                       case COMMAND_CONFIG:
-                               when = "before";
-                               break;
-                       case COMMAND_EXEC:
-                               when = "after";
-                               break;
-                       /* handle the impossible with humor; it guarantees a bug report! */
-                       default:
-                               when = "if Cthulhu is summoned by";
-                               break;
-               }
-               LOG_ERROR("The '%s' command must be used %s 'init'.",
-                       c->name, when);
+       if (!command_can_run(context, c))
                return ERROR_FAIL;
-       }
 
        struct command_invocation cmd = {
                .ctx = context,
@@ -624,6 +606,9 @@ static int run_command(struct command_context *context,
        if (c->jim_handler_data)
                context->current_target_override = c->jim_handler_data;
 
+       cmd.output = Jim_NewEmptyStringObj(context->interp);
+       Jim_IncrRefCount(cmd.output);
+
        int retval = c->handler(&cmd);
 
        if (c->jim_handler_data)
@@ -646,7 +631,11 @@ static int run_command(struct command_context *context,
                LOG_DEBUG("Command '%s' failed with error code %d",
                                        full_name ? full_name : c->name, retval);
                free(full_name);
+       } else {
+               /* Use the command output as the Tcl result */
+               Jim_SetResult(context->interp, cmd.output);
        }
+       Jim_DecrRefCount(context->interp, cmd.output);
 
        return retval;
 }
@@ -1013,7 +1002,6 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                return JIM_OK;
        }
 
-       bool found = true;
        Jim_Obj *const *start;
        unsigned count;
        if (c->handler || c->jim_handler) {
@@ -1028,15 +1016,17 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                }
                count = argc - remaining;
                start = argv;
-               found = false;
        }
        /* pass the command through to the intended handler */
        if (c->jim_handler) {
+               if (!command_can_run(cmd_ctx, c))
+                       return JIM_ERR;
+
                interp->cmdPrivData = c->jim_handler_data;
                return (*c->jim_handler)(interp, count, start);
        }
 
-       return script_command_run(interp, count, start, c, found);
+       return script_command_run(interp, count, start, c);
 }
 
 static int jim_command_mode(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
@@ -1112,7 +1102,7 @@ int help_add_command(struct command_context *cmd_ctx, struct command *parent,
                        .name = cmd_name,
                        .mode = COMMAND_ANY,
                        .help = help_text,
-                       .usage = usage,
+                       .usage = usage ? : "",
                };
                nc = register_command(cmd_ctx, parent, &cr);
                if (NULL == nc) {
@@ -1137,8 +1127,9 @@ int help_add_command(struct command_context *cmd_ctx, struct command *parent,
        if (usage) {
                bool replaced = false;
                if (nc->usage) {
+                       if (*nc->usage)
+                               replaced = true;
                        free(nc->usage);
-                       replaced = true;
                }
                nc->usage = strdup(usage);
                if (replaced)
@@ -1287,6 +1278,7 @@ static const struct command_registration command_builtin_handlers[] = {
                .mode = COMMAND_ANY,
                .help = "core command group (introspection)",
                .chain = command_subcommand_handlers,
+               .usage = "",
        },
        COMMAND_REGISTRATION_DONE
 };

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)