Charles Hardin ckhardin at gmail.com bin2char does not need to be installed as part...
[fw/openocd] / src / openocd.c
index 1dfe5515ceb577580d3fa88739e192c145ea7849..3090bc4429574acfceac257ee1cfbfbd82cd8b00 100644 (file)
@@ -493,26 +493,32 @@ static void tcl_output(void *privData, const char *file, int line, const char *f
        Jim_AppendString(interp, tclOutput, string, strlen(string));
 }
 
+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=Jim_Eval(interp, line);
+       int retcode;
+
+       active_cmd_ctx = context;
+       openocd_retval=ERROR_OK;
+       retcode = Jim_Eval(interp, line);
        
        if (retcode == JIM_ERR) {
-               Jim_PrintErrorMessage(interp);
-           long t;
-           Jim_Obj *openocd_result=Jim_GetVariableStr(interp, "openocd_result", JIM_ERRMSG);
-           if (openocd_result)
-           {
-                   if (Jim_GetLong(interp, openocd_result, &t)==JIM_OK)
-                   {
-                       return t;
-                   }
+               if (openocd_retval!=ERROR_COMMAND_CLOSE_CONNECTION)
+               {
+                       /* We do not print the connection closed error message */
+                       Jim_PrintErrorMessage(interp);
                }
-           return ERROR_FAIL;
+               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;
@@ -559,12 +565,8 @@ static int Jim_Command_openocd_ignore(Jim_Interp *interp, int argc, Jim_Obj *con
        log_add_callback(tcl_output, tclOutput);
        retval=command_run_line_internal(active_cmd_ctx, cmd);
 
-       /* we need to be able to get at the retval, so we store in a variable
-        */
-       Jim_Obj *resultvar=Jim_NewIntObj(interp, retval);
-       Jim_IncrRefCount(resultvar);
-       Jim_SetGlobalVariableStr(interp, "openocd_result", resultvar);
-       Jim_DecrRefCount(interp, resultvar);
+       /* we need to be able to get at the retval, so we store in a global variable */
+       openocd_retval=retval;
        
        if (startLoop)
        {
@@ -592,7 +594,7 @@ static int Jim_Command_find(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
        if (argc != 2)
                return JIM_ERR;
-       char *file = (char*)Jim_GetString(argv[1], NULL);
+       const char *file = Jim_GetString(argv[1], NULL);
        char *full_path = find_file(file);
        if (full_path == NULL)
                return JIM_ERR;
@@ -612,6 +614,8 @@ static int Jim_Command_echo(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        return JIM_OK;
 }
 
+
+
 static size_t openocd_jim_fwrite(const void *_ptr, size_t size, size_t n, void *cookie)
 {
        size_t nbytes;
@@ -697,15 +701,30 @@ static char* openocd_jim_fgets(char *s, int size, void *cookie)
 void add_jim(const char *name, int (*cmd)(Jim_Interp *interp, int argc, Jim_Obj *const *argv), const char *help)
 {
        Jim_CreateCommand(interp, name, cmd, NULL, NULL);
-       /* FIX!!! add scheme to accumulate help! */
        
+       /* FIX!!! it would be prettier to invoke add_help_text... 
+       accumulate help text in Tcl helptext list.  */
+    Jim_Obj *helptext=Jim_GetGlobalVariableStr(interp, "ocd_helptext", JIM_ERRMSG);
+    if (Jim_IsShared(helptext))
+        helptext = Jim_DuplicateObj(interp, helptext);
+    
+       Jim_Obj *cmd_entry=Jim_NewListObj(interp, NULL, 0);
+       
+       Jim_Obj *cmd_list=Jim_NewListObj(interp, NULL, 0);
+       Jim_ListAppendElement(interp, cmd_list, Jim_NewStringObj(interp, name, -1));
+       
+       Jim_ListAppendElement(interp, cmd_entry, cmd_list);
+       Jim_ListAppendElement(interp, cmd_entry, Jim_NewStringObj(interp, help, -1));
+       Jim_ListAppendElement(interp, helptext, cmd_entry);
 }
 
+extern unsigned const char startup_tcl[];
+
 void initJim(void)
-{
+{      
        Jim_CreateCommand(interp, "openocd", Jim_Command_openocd, NULL, NULL);
        Jim_CreateCommand(interp, "openocd_throw", Jim_Command_openocd_throw, NULL, NULL);
-       Jim_CreateCommand(interp, "find", Jim_Command_find, NULL, NULL);
+       Jim_CreateCommand(interp, "openocd_find", Jim_Command_find, NULL, NULL);
        Jim_CreateCommand(interp, "echo", Jim_Command_echo, NULL, NULL);
        Jim_CreateCommand(interp, "mem2array", Jim_Command_mem2array, NULL, NULL );
        Jim_CreateCommand(interp, "array2mem", Jim_Command_array2mem, NULL, NULL );
@@ -719,14 +738,10 @@ void initJim(void)
        interp->cb_vfprintf = openocd_jim_vfprintf;
        interp->cb_fflush = openocd_jim_fflush;
        interp->cb_fgets = openocd_jim_fgets;
-}
-
-extern const unsigned char filedata_startup[];
-
-/* after command line parsing */
-void initJim2(void)
-{
-       if (Jim_Eval(interp, filedata_startup)==JIM_ERR)
+       
+       add_default_dirs();
+       
+       if (Jim_Eval(interp, startup_tcl)==JIM_ERR)
        {
                LOG_ERROR("Failed to run startup.tcl (embedded into OpenOCD compile time)");
                Jim_PrintErrorMessage(interp);
@@ -734,25 +749,12 @@ void initJim2(void)
        }
 }
 
-
-int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       FILE *script_file;
-
-       if (argc != 1)
-               return ERROR_COMMAND_SYNTAX_ERROR;
-
-       
-       /* Run a tcl script file */
-       return command_run_linef(cmd_ctx, "source [find {%s}]", args[0]);
-}
-
 command_context_t *setup_command_handler(void)
 {
        command_context_t *cmd_ctx;
        
        cmd_ctx = command_init();
-
+       
        register_command(cmd_ctx, NULL, "version", handle_version_command,
                                         COMMAND_EXEC, "show OpenOCD version");
        register_command(cmd_ctx, NULL, "daemon_startup", handle_daemon_startup_command, COMMAND_CONFIG, 
@@ -765,7 +767,6 @@ command_context_t *setup_command_handler(void)
        tcl_register_commands(cmd_ctx); /* tcl server commands */
        log_register_commands(cmd_ctx);
        jtag_register_commands(cmd_ctx);
-       register_command(cmd_ctx, NULL, "script", handle_script_command, COMMAND_ANY, "execute commands from <file>");
        xsvf_register_commands(cmd_ctx);
        target_register_commands(cmd_ctx);
        flash_register_commands(cmd_ctx);
@@ -825,10 +826,7 @@ int openocd_main(int argc, char *argv[])
        
        active_cmd_ctx=cfg_cmd_ctx;
        
-       add_default_dirs();
 
-       initJim2();
-       
        if (parse_cmdline_args(cfg_cmd_ctx, argc, argv) != ERROR_OK)
                return EXIT_FAILURE;