summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-09-10 19:28:11 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-09-11 11:42:38 +0200
commitac86f4ccba49a671034a7607a7e14bc4b5e86ac6 (patch)
treeaedc4999bbab5b93b2d92f7cd258828aeaf7f748
parent8c21659d2a81912c2d591d3889893040d1aa9028 (diff)
downloadopenocd+libswd-ac86f4ccba49a671034a7607a7e14bc4b5e86ac6.tar.gz
openocd+libswd-ac86f4ccba49a671034a7607a7e14bc4b5e86ac6.tar.bz2
openocd+libswd-ac86f4ccba49a671034a7607a7e14bc4b5e86ac6.tar.xz
openocd+libswd-ac86f4ccba49a671034a7607a7e14bc4b5e86ac6.zip
command: capture command now handles both types commands
Commands that output progress output and no return value will have the progress output captured. Commands that do not output progress output(tcl commands) will return the tcl return value instead. The advantage here is that it is no longer necessary to consider which command one is capturing, it works for either. Example #1: capture progress output: set foo [capture help] Example #2: capture tcl return value set foo [capture {set abc def}] Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
-rw-r--r--src/helper/command.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index ea768b2d..086b03d3 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -84,14 +84,36 @@ static struct log_capture_state *command_log_capture_start(Jim_Interp *interp)
return state;
}
-static void command_log_capture_finish(struct log_capture_state *state)
+/* Classic openocd commands provide progress output which we
+ * will capture and return as a Tcl return value.
+ *
+ * However, if a non-openocd command has been invoked, then it
+ * makes sense to return the tcl return value from that command.
+ *
+ * The tcl return value is empty for openocd commands that provide
+ * progress output.
+ *
+ * Therefore we set the tcl return value only if we actually
+ * captured output.
+ */
+static void command_log_capture_finish(struct log_capture_state *state)
{
if (NULL == state)
return;
log_remove_callback(tcl_output, state);
- Jim_SetResult(state->interp, state->output);
+ int length;
+ Jim_GetString(state->output, &length);
+
+ if (length > 0)
+ {
+ Jim_SetResult(state->interp, state->output);
+ } else
+ {
+ /* No output captured, use tcl return value (which could
+ * be empty too). */
+ }
Jim_DecrRefCount(state->interp, state->output);
free(state);