added capture command to capture log output. Useful when wanting to capture log outpu...
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 16 Oct 2008 12:21:02 +0000 (12:21 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 16 Oct 2008 12:21:02 +0000 (12:21 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1069 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/helper/command.c

index 8dde2568e88fc7d4ccc05c9b8e4fd491f715bf7d..d34c402bafc9e6871a3b4b82125625a10dc5802b 100644 (file)
@@ -624,6 +624,32 @@ static char* openocd_jim_fgets(char *s, int size, void *cookie)
        return NULL;
 }
 
+
+static int jim_capture(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       if (argc != 2)
+               return JIM_ERR;
+       int retcode;
+       const char *str = Jim_GetString(argv[1], NULL);
+
+       /* capture log output and return it */
+       Jim_Obj *tclOutput = Jim_NewStringObj(interp, "", 0);
+       /* a garbage collect can happen, so we need a reference count to this object */
+       Jim_IncrRefCount(tclOutput);
+
+       log_add_callback(tcl_output, tclOutput);
+
+       retcode = Jim_Eval_Named(interp, str, __FILE__, __LINE__ );
+
+       log_remove_callback(tcl_output, tclOutput);
+
+       /* We dump output into this local variable */
+       Jim_SetResult(interp, tclOutput);
+       Jim_DecrRefCount(interp, tclOutput);
+
+       return retcode;
+}
+
 command_context_t* command_init()
 {
        command_context_t* context = malloc(sizeof(command_context_t));
@@ -645,6 +671,7 @@ command_context_t* command_init()
 
        Jim_CreateCommand(interp, "ocd_find", jim_find, NULL, NULL);
        Jim_CreateCommand(interp, "echo", jim_echo, NULL, NULL);
+       Jim_CreateCommand(interp, "capture", jim_capture, NULL, NULL);
 
        /* Set Jim's STDIO */
        interp->cookie_stdin = interp;