print syntax for command upon syntax error.
[fw/openocd] / src / openocd.c
index 8cac5530a48b49c1836531d5e1047da48b5dcd99..2d7e774734b32f9db1531318907589f20b255669 100644 (file)
@@ -499,7 +499,10 @@ static void tcl_output(void *privData, const char *file, int line, const char *f
 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;
+       retcode = Jim_Eval(interp, line);
        
        if (retcode == JIM_ERR) {
                Jim_PrintErrorMessage(interp);
@@ -592,7 +595,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 +615,36 @@ static int Jim_Command_echo(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        return JIM_OK;
 }
 
+static int Jim_Command_script(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+       int retval;
+       const char *file;
+       char *full_path;
+
+       if (argc != 2)
+       {
+               Jim_WrongNumArgs(interp, 1, argv, "file name missing");
+               return JIM_ERR;
+       }
+
+       /* Run a tcl script file */
+       file = Jim_GetString(argv[1], NULL);
+       full_path = find_file(file);
+       if (full_path == NULL)
+       {
+               Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+               Jim_AppendStrings(interp, Jim_GetResult(interp), "script: could not open file", file, NULL);
+               return JIM_ERR;
+       }
+       retval = Jim_EvalFile(interp, full_path);
+       free(full_path);
+       /* convert a return to ok */
+       if (retval == JIM_RETURN)
+               return JIM_OK;
+       return retval;
+}
+
+
 static size_t openocd_jim_fwrite(const void *_ptr, size_t size, size_t n, void *cookie)
 {
        size_t nbytes;
@@ -701,6 +734,9 @@ void add_jim(const char *name, int (*cmd)(Jim_Interp *interp, int argc, Jim_Obj
        /* 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);
@@ -711,14 +747,15 @@ void add_jim(const char *name, int (*cmd)(Jim_Interp *interp, int argc, Jim_Obj
        Jim_ListAppendElement(interp, helptext, cmd_entry);
 }
 
-extern const unsigned char filedata_startup[];
+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, "echo", Jim_Command_echo, NULL, NULL);
+       Jim_CreateCommand(interp, "script", Jim_Command_script, NULL, NULL);
        Jim_CreateCommand(interp, "mem2array", Jim_Command_mem2array, NULL, NULL );
        Jim_CreateCommand(interp, "array2mem", Jim_Command_array2mem, NULL, NULL );
 
@@ -734,7 +771,7 @@ void initJim(void)
        
        add_default_dirs();
        
-       if (Jim_Eval(interp, filedata_startup)==JIM_ERR)
+       if (Jim_Eval(interp, startup_tcl)==JIM_ERR)
        {
                LOG_ERROR("Failed to run startup.tcl (embedded into OpenOCD compile time)");
                Jim_PrintErrorMessage(interp);
@@ -742,20 +779,6 @@ void initJim(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;
@@ -774,7 +797,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);