}
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*/
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);
}
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)
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;
}
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);
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
*
* 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);
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)
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;
}
if (0 == CMD_ARGC)
return ERROR_COMMAND_SYNTAX_ERROR;
*out = command_find(head, CMD_ARGV[0]);
- if (NULL == *out && strncmp(CMD_ARGV[0], "ocd_", 4) == 0)
- *out = command_find(head, CMD_ARGV[0] + 4);
if (NULL == *out)
return ERROR_COMMAND_SYNTAX_ERROR;
if (--CMD_ARGC == 0)
}
static int command_unknown_find(unsigned argc, Jim_Obj *const *argv,
- struct command *head, struct command **out, bool top_level)
+ struct command *head, struct command **out)
{
if (0 == argc)
return argc;
const char *cmd_name = Jim_GetString(argv[0], NULL);
struct command *c = command_find(head, cmd_name);
- if (NULL == c && top_level && strncmp(cmd_name, "ocd_", 4) == 0)
- c = command_find(head, cmd_name + 4);
if (NULL == c)
return argc;
*out = c;
- return command_unknown_find(--argc, ++argv, (*out)->children, out, false);
+ return command_unknown_find(--argc, ++argv, (*out)->children, out);
}
static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
struct command_context *cmd_ctx = current_command_context(interp);
struct command *c = cmd_ctx->commands;
- int remaining = command_unknown_find(argc, argv, c, &c, true);
+ int remaining = command_unknown_find(argc, argv, c, &c);
/* if nothing could be consumed, then it's really an unknown command */
if (remaining == argc) {
const char *cmd = Jim_GetString(argv[0], NULL);
return JIM_OK;
}
- bool found = true;
Jim_Obj *const *start;
unsigned count;
if (c->handler || c->jim_handler) {
}
count = argc - remaining;
start = argv;
- found = false;
}
/* pass the command through to the intended handler */
if (c->jim_handler) {
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)
if (argc > 1) {
struct command *c = cmd_ctx->commands;
- int remaining = command_unknown_find(argc - 1, argv + 1, c, &c, true);
+ int remaining = command_unknown_find(argc - 1, argv + 1, c, &c);
/* if nothing could be consumed, then it's an unknown command */
if (remaining == argc - 1) {
Jim_SetResultString(interp, "unknown", -1);
return JIM_OK;
}
-static int jim_command_type(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
- if (1 == argc)
- return JIM_ERR;
-
- struct command_context *cmd_ctx = current_command_context(interp);
- struct command *c = cmd_ctx->commands;
- int remaining = command_unknown_find(argc - 1, argv + 1, c, &c, true);
- /* if nothing could be consumed, then it's an unknown command */
- if (remaining == argc - 1) {
- Jim_SetResultString(interp, "unknown", -1);
- return JIM_OK;
- }
-
- if (c->jim_handler)
- Jim_SetResultString(interp, "native", -1);
- else if (c->handler)
- Jim_SetResultString(interp, "simple", -1);
- else if (remaining == 0)
- Jim_SetResultString(interp, "group", -1);
- else
- Jim_SetResultString(interp, "unknown", -1);
-
- return JIM_OK;
-}
-
int help_add_command(struct command_context *cmd_ctx, struct command *parent,
const char *cmd_name, const char *help_text, const char *usage)
{
"Returns 'unknown' if an unknown command is given. "
"Command can be multiple tokens.",
},
- {
- .name = "type",
- .mode = COMMAND_ANY,
- .jim_handler = jim_command_type,
- .usage = "command_name [...]",
- .help = "Returns the type of built-in command:"
- "'native', 'simple', 'group', or 'unknown'. "
- "Command can be multiple tokens.",
- },
COMMAND_REGISTRATION_DONE
};