In embedded hosts, the Jim interpreter can come from the
existing context rather than be created by OpenOCD.

Signed-off-by: Øyvind Harboe <oyvind.har...@zylin.com>
---
 src/helper/command.c |   18 +++++++++++-------
 src/helper/command.h |    6 ++++--
 src/openocd.c        |    6 +++---
 3 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/helper/command.c b/src/helper/command.c
index dcad6a1..d657668 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -1272,7 +1272,7 @@ static const struct command_registration 
command_builtin_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct command_context* command_init(const char *startup_tcl)
+struct command_context* command_init(const char *startup_tcl, Jim_Interp 
*interp)
 {
        struct command_context* context = malloc(sizeof(struct 
command_context));
        const char *HostOs;
@@ -1284,14 +1284,18 @@ struct command_context* command_init(const char 
*startup_tcl)
        context->output_handler_priv = NULL;
 
 #if !BUILD_ECOSBOARD
-       Jim_InitEmbedded();
-       /* Create an interpreter */
-       context->interp = Jim_CreateInterp();
-       /* Add all the Jim core commands */
-       Jim_RegisterCoreCommands(context->interp);
+       /* Create a jim interpreter if we were not handed one */
+       if (interp == NULL)
+       {
+               Jim_InitEmbedded();
+               /* Create an interpreter */
+               interp = Jim_CreateInterp();
+               /* Add all the Jim core commands */
+               Jim_RegisterCoreCommands(interp);
+       }
 #endif
+       context->interp = interp;
 
-       Jim_Interp *interp = context->interp;
 #if defined(_MSC_VER)
        /* WinXX - is generic, the forward
         * looking problem is this:
diff --git a/src/helper/command.h b/src/helper/command.h
index 611db87..8d68c18 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -323,9 +323,11 @@ void command_set_output_handler(struct command_context* 
context,
 int command_context_mode(struct command_context *context, enum command_mode 
mode);
 
 /**
- * Creates a new command context using the startup TCL provided.
+ * Creates a new command context using the startup TCL provided and
+ * the existing Jim interpreter, if any. If interp == NULL, then command_init
+ * creates a command interpreter.
  */
-struct command_context* command_init(const char *startup_tcl);
+struct command_context* command_init(const char *startup_tcl, Jim_Interp 
*interp);
 /**
  * Creates a copy of an existing command context.  This does not create
  * a deep copy of the command list, so modifications in one context will
diff --git a/src/openocd.c b/src/openocd.c
index 22d4582..44e0292 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -188,14 +188,14 @@ static const struct command_registration 
openocd_command_handlers[] = {
 struct command_context *global_cmd_ctx;
 
 /* NB! this fn can be invoked outside this file for non PC hosted builds */
-struct command_context *setup_command_handler(void)
+struct command_context *setup_command_handler(Jim_Interp *interp)
 {
        log_init();
        LOG_DEBUG("log_init: complete");
 
        struct command_context *cmd_ctx;
 
-       global_cmd_ctx = cmd_ctx = command_init(openocd_startup_tcl);
+       global_cmd_ctx = cmd_ctx = command_init(openocd_startup_tcl, interp);
 
        register_commands(cmd_ctx, NULL, openocd_command_handlers);
        /* register subsystem commands */
@@ -242,7 +242,7 @@ int openocd_main(int argc, char *argv[])
        /* initialize commandline interface */
        struct command_context *cmd_ctx;
 
-       cmd_ctx = setup_command_handler();
+       cmd_ctx = setup_command_handler(NULL);
 
 #if BUILD_IOUTIL
        if (ioutil_init(cmd_ctx) != ERROR_OK)
-- 
1.6.3.3

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to