Collect output from openocd commands into openocd_output local variable
git-svn-id: svn://svn.berlios.de/openocd/trunk@820 b42882b7-edfa-0310-969c-e2dbd0fdcd60__archive__
parent
5a3712072f
commit
5fefa83d07
|
@ -94,8 +94,9 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
||||||
*retval = run_command(context, c, words, nwords);
|
*retval = run_command(context, c, words, nwords);
|
||||||
|
|
||||||
log_remove_callback(tcl_output, tclOutput);
|
log_remove_callback(tcl_output, tclOutput);
|
||||||
Jim_SetResult(interp, tclOutput);
|
|
||||||
|
|
||||||
|
/* We dump output into this local variable */
|
||||||
|
Jim_SetVariableStr(interp, "openocd_output", tclOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nwords; i++)
|
for (i = 0; i < nwords; i++)
|
||||||
|
@ -295,7 +296,14 @@ void command_print_n(command_context_t *context, char *format, ...)
|
||||||
string = alloc_vprintf(format, ap);
|
string = alloc_vprintf(format, ap);
|
||||||
if (string != NULL)
|
if (string != NULL)
|
||||||
{
|
{
|
||||||
context->output_handler(context, string);
|
/* 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);
|
||||||
|
// We already printed it above
|
||||||
|
//command_output_text(context, string);
|
||||||
free(string);
|
free(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -313,7 +321,14 @@ void command_print(command_context_t *context, char *format, ...)
|
||||||
if (string != NULL)
|
if (string != NULL)
|
||||||
{
|
{
|
||||||
strcat(string, "\n"); /* alloc_vprintf guaranteed the buffer to be at least one char longer */
|
strcat(string, "\n"); /* alloc_vprintf guaranteed the buffer to be at least one char longer */
|
||||||
context->output_handler(context, string);
|
/* 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);
|
||||||
|
// We already printed it above
|
||||||
|
//command_output_text(context, string);
|
||||||
free(string);
|
free(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,7 +384,6 @@ int command_run_line(command_context_t *context, char *line)
|
||||||
/* run the line thru a script engine */
|
/* run the line thru a script engine */
|
||||||
int retval;
|
int retval;
|
||||||
int retcode;
|
int retcode;
|
||||||
|
|
||||||
Jim_DeleteAssocData(interp, "context"); /* remove existing */
|
Jim_DeleteAssocData(interp, "context"); /* remove existing */
|
||||||
retcode = Jim_SetAssocData(interp, "context", NULL, context);
|
retcode = Jim_SetAssocData(interp, "context", NULL, context);
|
||||||
if (retcode != JIM_OK)
|
if (retcode != JIM_OK)
|
||||||
|
@ -382,9 +396,20 @@ int command_run_line(command_context_t *context, char *line)
|
||||||
if (retcode != JIM_OK)
|
if (retcode != JIM_OK)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
|
|
||||||
|
active_cmd_ctx = context;
|
||||||
retcode = Jim_Eval(interp, line);
|
retcode = Jim_Eval(interp, line);
|
||||||
if (retcode == JIM_ERR) {
|
if (retcode == JIM_ERR) {
|
||||||
|
if (retval!=ERROR_COMMAND_CLOSE_CONNECTION)
|
||||||
|
{
|
||||||
|
/* We do not print the connection closed error message */
|
||||||
Jim_PrintErrorMessage(interp);
|
Jim_PrintErrorMessage(interp);
|
||||||
|
}
|
||||||
|
if (retval==ERROR_OK)
|
||||||
|
{
|
||||||
|
/* It wasn't a low level OpenOCD command that failed */
|
||||||
|
return ERROR_FAIL;
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
} else if (retcode == JIM_EXIT) {
|
} else if (retcode == JIM_EXIT) {
|
||||||
/* ignore. */
|
/* ignore. */
|
||||||
/* exit(Jim_GetExitCode(interp)); */
|
/* exit(Jim_GetExitCode(interp)); */
|
||||||
|
|
|
@ -485,59 +485,6 @@ static int Jim_Command_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int openocd_retval;
|
|
||||||
|
|
||||||
/* try to execute as Jim command, otherwise fall back to standard command.
|
|
||||||
* Note that even if the Jim command caused an error, then we succeeded
|
|
||||||
* to execute it, hence this fn pretty much always returns ERROR_OK. */
|
|
||||||
int jim_command(command_context_t *context, char *line)
|
|
||||||
{
|
|
||||||
int retval=ERROR_OK;
|
|
||||||
int retcode;
|
|
||||||
|
|
||||||
active_cmd_ctx = context;
|
|
||||||
openocd_retval=ERROR_OK;
|
|
||||||
retcode = Jim_Eval(interp, line);
|
|
||||||
|
|
||||||
if (retcode == JIM_ERR) {
|
|
||||||
if (openocd_retval!=ERROR_COMMAND_CLOSE_CONNECTION)
|
|
||||||
{
|
|
||||||
/* We do not print the connection closed error message */
|
|
||||||
Jim_PrintErrorMessage(interp);
|
|
||||||
}
|
|
||||||
if (openocd_retval==ERROR_OK)
|
|
||||||
{
|
|
||||||
/* It wasn't a low level OpenOCD command that failed */
|
|
||||||
return ERROR_FAIL;
|
|
||||||
}
|
|
||||||
return openocd_retval;
|
|
||||||
}
|
|
||||||
const char *result;
|
|
||||||
int reslen;
|
|
||||||
result = Jim_GetString(Jim_GetResult(interp), &reslen);
|
|
||||||
|
|
||||||
if (retcode == JIM_EXIT) {
|
|
||||||
/* ignore. */
|
|
||||||
/* exit(Jim_GetExitCode(interp)); */
|
|
||||||
} else {
|
|
||||||
if (reslen) {
|
|
||||||
int i;
|
|
||||||
char buff[256+1];
|
|
||||||
for (i = 0; i < reslen; i += 256)
|
|
||||||
{
|
|
||||||
int chunk;
|
|
||||||
chunk = reslen - i;
|
|
||||||
if (chunk > 256)
|
|
||||||
chunk = 256;
|
|
||||||
strncpy(buff, result+i, chunk);
|
|
||||||
buff[chunk] = 0;
|
|
||||||
LOG_USER_N("%s", buff);
|
|
||||||
}
|
|
||||||
LOG_USER_N("%s", "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find full path to file */
|
/* find full path to file */
|
||||||
static int Jim_Command_find(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
static int Jim_Command_find(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
||||||
|
|
|
@ -95,12 +95,16 @@ add_help_text help "Tcl implementation of help command"
|
||||||
|
|
||||||
#a bit of backwards compatibility
|
#a bit of backwards compatibility
|
||||||
proc openocd_throw {cmd} {
|
proc openocd_throw {cmd} {
|
||||||
return [eval $cmd]
|
set openocd_output ""
|
||||||
|
eval $cmd
|
||||||
|
return $openocd_output
|
||||||
}
|
}
|
||||||
|
|
||||||
#a bit of backwards compatibility
|
#a bit of backwards compatibility
|
||||||
proc openocd {cmd} {
|
proc openocd {cmd} {
|
||||||
return [eval $cmd]
|
set openocd_output ""
|
||||||
|
eval $cmd
|
||||||
|
return $openocd_output
|
||||||
}
|
}
|
||||||
|
|
||||||
# If a fn is unknown to Tcl, we try to execute it as an OpenOCD command
|
# If a fn is unknown to Tcl, we try to execute it as an OpenOCD command
|
||||||
|
|
Loading…
Reference in New Issue