add script_command_run helper
authorZachary T Welch <zw@superlucidity.net>
Wed, 25 Nov 2009 03:51:49 +0000 (19:51 -0800)
committerZachary T Welch <zw@superlucidity.net>
Wed, 25 Nov 2009 18:29:05 +0000 (10:29 -0800)
Eliminates duplicated code in script_command and handle_unknown_command.
Fixes bug with duplicated help output generated by placeholder commands.

src/helper/command.c

index 8b29ab4ac4b41a48ce1953adffb1ec2715d7bbf0..62fb48791c771dee0cacddbb2bcc3391c2228e1b 100644 (file)
@@ -150,33 +150,41 @@ static struct command_context *current_command_context(void)
        return cmd_ctx;
 }
 
-static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+static int script_command_run(Jim_Interp *interp,
+               int argc, Jim_Obj *const *argv, struct command *c, bool capture)
 {
-       /* the private data is stashed in the interp structure */
-
-       struct command *c = interp->cmdPrivData;
-       assert(c);
-
        target_call_timer_callbacks_now();
        LOG_USER_N("%s", ""); /* Keep GDB connection alive*/
 
-       script_debug(interp, c->name, argc, argv);
-
        unsigned nwords;
        const char **words = script_command_args_alloc(argc, argv, &nwords);
        if (NULL == words)
                return JIM_ERR;
 
-       Jim_Obj *tclOutput = command_log_capture_start(interp);
+       Jim_Obj *tclOutput = NULL;
+       if (capture)
+               tclOutput = command_log_capture_start(interp);
 
        struct command_context *cmd_ctx = current_command_context();
        int retval = run_command(cmd_ctx, c, (const char **)words, nwords);
 
-       command_log_capture_finish(interp, tclOutput);
+       if (capture)
+               command_log_capture_finish(interp, tclOutput);
+
        script_command_args_free(words, nwords);
        return command_retval_set(interp, retval);
 }
 
+static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       /* the private data is stashed in the interp structure */
+
+       struct command *c = interp->cmdPrivData;
+       assert(c);
+       script_debug(interp, c->name, argc, argv);
+       return script_command_run(interp, argc, argv, c, true);
+}
+
 /* nice short description of source file */
 #define __THIS__FILE__ "command.c"
 
@@ -922,22 +930,7 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                return (*c->jim_handler)(interp, count, start);
        }
 
-       unsigned nwords;
-       const char **words = script_command_args_alloc(count, start, &nwords);
-       if (NULL == words)
-               return JIM_ERR;
-
-       Jim_Obj *tclOutput = command_log_capture_start(interp);
-
-       int retval = run_command(cmd_ctx, c, words, nwords);
-
-       command_log_capture_finish(interp, tclOutput);
-       script_command_args_free(words, nwords);
-
-       if (!found && ERROR_OK == retval)
-               retval = ERROR_FAIL;
-
-       return command_retval_set(interp, retval);
+       return script_command_run(interp, count, start, c, found);
 }
 
 int help_add_command(struct command_context *cmd_ctx, struct command *parent,