From a463670c312befd86224e74a79aa804ee5fbae03 Mon Sep 17 00:00:00 2001 From: David Brownell Date: Sat, 24 Jul 2010 14:38:46 -0400 Subject: "transport select" returns Jim value Make it scriptable, so code can be conditionalized based on what transport is in use for the session. Signed-off-by: David Brownell --- src/jtag/transport.c | 71 ++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 41 deletions(-) (limited to 'src/jtag/transport.c') diff --git a/src/jtag/transport.c b/src/jtag/transport.c index d290bd2c..503b57b6 100644 --- a/src/jtag/transport.c +++ b/src/jtag/transport.c @@ -46,6 +46,9 @@ #include "transport.h" +extern struct command_context *global_cmd_ctx; + + /*-----------------------------------------------------------------------*/ /* @@ -272,39 +275,26 @@ COMMAND_HANDLER(handle_transport_list) /** * Implements the Tcl "transport select" command, choosing the * transport to be used in this debug session from among the - * set supported by the debug adapter being used. + * set supported by the debug adapter being used. Return value + * is scriptable (allowing "if swd then..." etc). */ -COMMAND_HANDLER(handle_transport_select) +static int jim_transport_select(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - int retval = ERROR_OK;; - - switch (CMD_ARGC) { - case 0: /* "select" */ - if (session) { - goto show; - } - LOG_ERROR("session's transport is not selected."); - return ERROR_FAIL; - - case 1: /* "select FOO" */ - if ((session!= NULL) && strcmp(session->name, CMD_ARGV[0]) == 0) { - /* NOP */ - LOG_DEBUG("transport '%s' is already selected", - CMD_ARGV[0]); - return ERROR_OK; + switch (argc) { + case 1: /* return/display */ + if (!session) { + LOG_ERROR("session's transport is not selected."); + return JIM_ERR; } else { - /* we can't change this session's transport after-the-fact */ - if (session) { - LOG_ERROR("session's transport is already selected."); - return ERROR_FAIL; - } + Jim_SetResultString(interp, session->name, -1); + return JIM_OK; } break; - - default: /* select FOO BAR */ - /* we only select *one* transport per session */ - LOG_ERROR("may only select one transport!"); - return ERROR_COMMAND_SYNTAX_ERROR; + case 2: /* assign */ + if (session) { + /* can't change session's transport after-the-fact */ + LOG_ERROR("session's transport is already selected."); + return JIM_ERR; } /* Is this transport supported by our debug adapter? @@ -315,24 +305,23 @@ COMMAND_HANDLER(handle_transport_select) */ if (!allowed_transports) { LOG_ERROR("Debug adapter doesn't support any transports?"); - return ERROR_FAIL; + return JIM_ERR; } for (unsigned i = 0; allowed_transports[i]; i++) { - if (strcmp(allowed_transports[i], CMD_ARGV[0]) == 0) - return transport_select(CMD_CTX, CMD_ARGV[0]); + if (strcmp(allowed_transports[i], argv[0]->bytes) == 0) + return transport_select(global_cmd_ctx, argv[0]->bytes); } - LOG_ERROR("Debug adapter doesn't support '%s' " - "transport?", CMD_ARGV[0]); - return ERROR_FAIL; - - -show: - /* report the current transport selection */ - command_print(CMD_CTX, "%s", session->name); - return retval; + LOG_ERROR("Debug adapter doesn't support '%s' " + "transport", argv[0]->bytes); + return JIM_ERR; + break; + default: + Jim_WrongNumArgs(interp, 1, argv, "[too many parameters]"); + return JIM_ERR; + } } static const struct command_registration transport_commands[] = { @@ -354,7 +343,7 @@ static const struct command_registration transport_commands[] = { }, { .name = "select", - .handler = handle_transport_select, + .jim_handler = jim_transport_select, .mode = COMMAND_ANY, .help = "Select this session's transport", .usage = "[transport_name]", -- cgit v1.2.3