-
-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;
-
- active_cmd_ctx = context;
- openocd_retval=ERROR_OK;
- retcode = Jim_Eval(interp, line);
-
- if (retcode == JIM_ERR) {
- if (openocd_retval!=ERROR_COMMAND_CLOSE_CONNECTION)
- {
- /* We do not print the connection closed error message */
- Jim_PrintErrorMessage(interp);
- }
- 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;
- result = Jim_GetString(Jim_GetResult(interp), &reslen);
-
- if (retcode == JIM_EXIT) {
- /* ignore. */
- /* exit(Jim_GetExitCode(interp)); */
- } else {
- if (reslen) {
- int i;
- char buff[256+1];
- for (i = 0; i < reslen; i += 256)
- {
- int chunk;
- chunk = reslen - i;
- if (chunk > 256)
- chunk = 256;
- strncpy(buff, result+i, chunk);
- buff[chunk] = 0;
- LOG_USER_N("%s", buff);
- }
- LOG_USER_N("%s", "\n");
- }
- }
- return retval;
-}
-
-/* find full path to file */
-static int Jim_Command_find(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
- if (argc != 2)
- return JIM_ERR;
- const char *file = Jim_GetString(argv[1], NULL);
- char *full_path = find_file(file);
- if (full_path == NULL)
- return JIM_ERR;
- Jim_Obj *result = Jim_NewStringObj(interp, full_path, strlen(full_path));
- free(full_path);
-
- Jim_SetResult(interp, result);
- return JIM_OK;
-}
-
-static int Jim_Command_echo(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
- if (argc != 2)
- return JIM_ERR;
- char *str = (char*)Jim_GetString(argv[1], NULL);
- LOG_USER("%s", str);
- return JIM_OK;
-}
-
-
-
-static size_t openocd_jim_fwrite(const void *_ptr, size_t size, size_t n, void *cookie)
-{
- size_t nbytes;
- const char *ptr;
-
- /* make it a char easier to read code */
- ptr = _ptr;
-
- nbytes = size * n;
- if (nbytes == 0) {
- return 0;
- }
-
- if (!active_cmd_ctx) {
- /* TODO: Where should this go? */
- return n;
- }
-
- /* do we have to chunk it? */
- if (ptr[nbytes] == 0) {
- /* no it is a C style string */
- command_output_text(active_cmd_ctx, ptr);
- return strlen(ptr);
- }
- /* GRR we must chunk - not null terminated */
- while (nbytes) {
- char chunk[128+1];
- int x;
-
- x = nbytes;
- if (x > 128) {
- x = 128;
- }
- /* copy it */
- memcpy(chunk, ptr, x);
- /* terminate it */
- chunk[n] = 0;
- /* output it */
- command_output_text(active_cmd_ctx, chunk);
- ptr += x;
- nbytes -= x;
- }
-
- return n;
-}
-
-static size_t openocd_jim_fread(void *ptr, size_t size, size_t n, void *cookie )
-{
- /* TCL wants to read... tell him no */
- return 0;
-}
-
-static int openocd_jim_vfprintf(void *cookie, const char *fmt, va_list ap)
-{
- char *cp;
- int n;
-
- n = -1;
- if (active_cmd_ctx) {
- cp = alloc_vprintf(fmt, ap);
- if (cp) {
- command_output_text(active_cmd_ctx, cp);
- n = strlen(cp);
- free(cp);
- }
- }
- return n;
-}
-
-static int openocd_jim_fflush(void *cookie)
-{
- /* nothing to flush */
- return 0;
-}
-
-static char* openocd_jim_fgets(char *s, int size, void *cookie)
-{
- /* not supported */
- errno = ENOTSUP;
- return NULL;
-}
-
-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!!! 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_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 );
-
- /* Set Jim's STDIO */
- interp->cookie_stdin = NULL;
- interp->cookie_stdout = NULL;
- interp->cookie_stderr = NULL;
- interp->cb_fwrite = openocd_jim_fwrite;
- interp->cb_fread = openocd_jim_fread ;
- interp->cb_vfprintf = openocd_jim_vfprintf;
- interp->cb_fflush = openocd_jim_fflush;
- interp->cb_fgets = openocd_jim_fgets;
-
- 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);
- exit(-1);
- }
-}
-
-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,
- "deprecated - use \"init\" and \"reset\" at end of startup script instead");
-