command: capture command now handles both types commands
[fw/openocd] / src / helper / command.c
index 3625508f26b584afc09177dd19e391623ccdff34..086b03d3e0b068ade1175f1e2346b700da88ec23 100644 (file)
@@ -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);
@@ -167,14 +189,18 @@ static const char **script_command_args_alloc(
        return words;
 }
 
-static struct command_context *current_command_context(Jim_Interp *interp)
+struct command_context *current_command_context(Jim_Interp *interp)
 {
        /* grab the command context from the associated data */
        struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context");
        if (NULL == cmd_ctx)
        {
                /* Tcl can invoke commands directly instead of via command_run_line(). This would
-                * happen when the Jim Tcl interpreter is provided by eCos.
+                * happen when the Jim Tcl interpreter is provided by eCos or if we are running
+                * commands in a startup script.
+                *
+                * A telnet or gdb server would provide a non-default command context to
+                * handle piping of error output, have a separate current target, etc.
                 */
                cmd_ctx = global_cmd_ctx;
        }
@@ -358,7 +384,7 @@ static int register_command_handler(struct command_context *cmd_ctx,
        if (NULL == override_name)
                return JIM_ERR;
 
-       retval = Jim_Eval_Named(interp, override_name, __THIS__FILE__ , __LINE__);
+       retval = Jim_Eval_Named(interp, override_name, 0, 0);
        free((void *)override_name);
 
        return retval;
@@ -647,7 +673,7 @@ int command_run_line(struct command_context *context, char *line)
                retcode = Jim_SetAssocData(interp, "retval", NULL, &retval);
                if (retcode == JIM_OK)
                {
-                       retcode = Jim_Eval_Named(interp, line, __THIS__FILE__, __LINE__);
+                       retcode = Jim_Eval_Named(interp, line, 0, 0);
 
                        Jim_DeleteAssocData(interp, "retval");
                }