From: OpenOCD-Gerrit <ope...@us...> - 2021-04-18 14:35:55
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via 6b5e77ada6520398f9a2135e43e60067bc072e27 (commit) via fa23b1a71e4f1974791e90055c301f9bf124e835 (commit) via a7d68878e4ba5dfd5ca15c058980cf6c5fc55208 (commit) via d8d24f3b3696f5d2e64a67df87684132b48031d2 (commit) from f238337c9c2fdabb48992487e5243d03d32e215d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6b5e77ada6520398f9a2135e43e60067bc072e27 Author: Antonio Borneo <bor...@gm...> Date: Wed May 13 16:51:00 2020 +0200 helper/command: make script_debug() static Now that all commands are executed through the common handler command_unknown(), the message about command execution is logged by command_unknown(). There is no need, for "native" commands (.jim_handler) at root level to log the message (again) by itself. Remove calls to script_debug() apart from command_unknown(). Make script_debug() static as only used in command.c. Change-Id: I9b2728b69e7643d6121c4b35a96bc825bcb5488d Signed-off-by: Antonio Borneo <bor...@gm...> Reviewed-on: http://openocd.zylin.com/5676 Tested-by: jenkins Reviewed-by: Oleksij Rempel <li...@re...> diff --git a/src/helper/command.c b/src/helper/command.c index 630630f38..a7990d4f8 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -180,7 +180,7 @@ extern struct command_context *global_cmd_ctx; /* dump a single line to the log for the command. * Do nothing in case we are not at debug level 3 */ -void script_debug(Jim_Interp *interp, unsigned int argc, Jim_Obj * const *argv) +static void script_debug(Jim_Interp *interp, unsigned int argc, Jim_Obj * const *argv) { if (debug_level < LOG_LVL_DEBUG) return; diff --git a/src/helper/command.h b/src/helper/command.h index 1f2dc5b59..68f4c14fe 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -456,6 +456,4 @@ COMMAND_HELPER(handle_command_parse_bool, bool *out, const char *label); #define COMMAND_PARSE_ENABLE(in, out) \ COMMAND_PARSE_BOOL(in, out, "enable", "disable") -void script_debug(Jim_Interp *interp, unsigned int argc, Jim_Obj * const *argv); - #endif /* OPENOCD_HELPER_COMMAND_H */ diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index bf65e8119..3e7333515 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -108,8 +108,6 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args endstate = TAP_IDLE; - script_debug(interp, argc, args); - /* validate arguments as numbers */ e = JIM_OK; for (i = 2; i < argc; i += 2) { @@ -234,8 +232,6 @@ static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *ar return JIM_ERR; } - script_debug(interp, argc, args); - int i; for (i = 0; i < argc-1; i++) { const char *cp; @@ -266,8 +262,6 @@ static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *ar static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args) { - script_debug(interp, argc, args); - Jim_SetResult(interp, Jim_NewIntObj(interp, jtag_get_flush_queue_count())); return JIM_OK; commit fa23b1a71e4f1974791e90055c301f9bf124e835 Author: Antonio Borneo <bor...@gm...> Date: Mon May 25 16:09:12 2020 +0200 helper/command: get rid of the tree of struct command There is no need anymore to keep alive the tree of struct command. Remove it and let jim to free() the command's struct command that is referenced through command's private data. Change-Id: I2cd84e0274a969ce200320e3a177ac20c7823da0 Signed-off-by: Antonio Borneo <bor...@gm...> Reviewed-on: http://openocd.zylin.com/5675 Tested-by: jenkins Reviewed-by: Oleksij Rempel <li...@re...> diff --git a/src/helper/command.c b/src/helper/command.c index d79d7f464..630630f38 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -50,8 +50,7 @@ struct log_capture_state { }; static int unregister_command(struct command_context *context, - struct command *parent, const char *name); -static char *command_name(struct command *c, char delim); + const char *cmd_prefix, const char *name); static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj * const *argv); static int help_add_command(struct command_context *cmd_ctx, const char *cmd_name, const char *help_text, const char *usage_text); @@ -263,68 +262,8 @@ static struct command *command_find_from_name(Jim_Interp *interp, const char *na return jimcmd_privdata(cmd); } -/** - * Find a command by name from a list of commands. - * @returns Returns the named command if it exists in the list. - * Returns NULL otherwise. - */ -static struct command *command_find(struct command *head, const char *name) -{ - for (struct command *cc = head; cc; cc = cc->next) { - if (strcmp(cc->name, name) == 0) - return cc; - } - return NULL; -} - -/** - * Add the command into the linked list, sorted by name. - * @param head Address to head of command list pointer, which may be - * updated if @c c gets inserted at the beginning of the list. - * @param c The command to add to the list pointed to by @c head. - */ -static void command_add_child(struct command **head, struct command *c) -{ - assert(head); - if (NULL == *head) { - *head = c; - return; - } - - while ((*head)->next && (strcmp(c->name, (*head)->name) > 0)) - head = &(*head)->next; - - if (strcmp(c->name, (*head)->name) > 0) { - c->next = (*head)->next; - (*head)->next = c; - } else { - c->next = *head; - *head = c; - } -} - -static struct command **command_list_for_parent( - struct command_context *cmd_ctx, struct command *parent) -{ - return parent ? &parent->children : &cmd_ctx->commands; -} - -static void command_free(struct command *c) -{ - /** @todo if command has a handler, unregister its jim command! */ - - while (NULL != c->children) { - struct command *tmp = c->children; - c->children = tmp->next; - command_free(tmp); - } - - free(c->name); - free(c); -} - static struct command *command_new(struct command_context *cmd_ctx, - struct command *parent, const struct command_registration *cr) + const char *full_name, const struct command_registration *cr) { assert(cr->name); @@ -335,76 +274,86 @@ static struct command *command_new(struct command_context *cmd_ctx, * strlen(.usage) == 0 means that the command takes no * arguments. */ - if ((cr->jim_handler == NULL) && (cr->usage == NULL)) { - LOG_ERROR("BUG: command '%s%s%s' does not have the " + if (!cr->jim_handler && !cr->usage) + LOG_ERROR("BUG: command '%s' does not have the " "'.usage' field filled out", - parent && parent->name ? parent->name : "", - parent && parent->name ? " " : "", - cr->name); - } + full_name); struct command *c = calloc(1, sizeof(struct command)); if (NULL == c) return NULL; c->name = strdup(cr->name); - if (!c->name) - goto command_new_error; + if (!c->name) { + free(c); + return NULL; + } - c->parent = parent; c->handler = cr->handler; c->jim_handler = cr->jim_handler; c->mode = cr->mode; - command_add_child(command_list_for_parent(cmd_ctx, parent), c); - - if (cr->help || cr->usage) { - char *full_name = command_name(c, ' '); + if (cr->help || cr->usage) help_add_command(cmd_ctx, full_name, cr->help, cr->usage); - free(full_name); - } return c; +} + +static void command_free(struct Jim_Interp *interp, void *priv) +{ + struct command *c = priv; -command_new_error: - command_free(c); - return NULL; + free(c->name); + free(c); } static struct command *register_command(struct command_context *context, - struct command *parent, const struct command_registration *cr) + const char *cmd_prefix, const struct command_registration *cr) { + char *full_name; + if (!context || !cr->name) return NULL; - const char *name = cr->name; - struct command **head = command_list_for_parent(context, parent); - struct command *c = command_find(*head, name); - if (NULL != c) { + if (cmd_prefix) + full_name = alloc_printf("%s %s", cmd_prefix, cr->name); + else + full_name = strdup(cr->name); + if (!full_name) + return NULL; + + struct command *c = command_find_from_name(context->interp, full_name); + if (c) { /* TODO: originally we treated attempting to register a cmd twice as an error * Sometimes we need this behaviour, such as with flash banks. * http://www.mail-archive.com/ope...@li.../msg11152.html */ - LOG_DEBUG("command '%s' is already registered in '%s' context", - name, parent ? parent->name : "<global>"); + LOG_DEBUG("command '%s' is already registered", full_name); + free(full_name); return c; } - c = command_new(context, parent, cr); - if (NULL == c) + c = command_new(context, full_name, cr); + if (!c) { + free(full_name); return NULL; + } - char *full_name = command_name(c, ' '); LOG_DEBUG("registering '%s'...", full_name); int retval = Jim_CreateCommand(context->interp, full_name, - command_unknown, c, NULL); + command_unknown, c, command_free); if (retval != JIM_OK) { - unregister_command(context, parent, name); + command_run_linef(context, "del_help_text {%s}", full_name); + command_run_linef(context, "del_usage_text {%s}", full_name); + free(c); + free(full_name); return NULL; } + + free(full_name); return c; } -static int ___register_commands(struct command_context *cmd_ctx, struct command *parent, +int __register_commands(struct command_context *cmd_ctx, const char *cmd_prefix, const struct command_registration *cmds, void *data, struct target *override_target) { @@ -415,7 +364,7 @@ static int ___register_commands(struct command_context *cmd_ctx, struct command struct command *c = NULL; if (NULL != cr->name) { - c = register_command(cmd_ctx, parent, cr); + c = register_command(cmd_ctx, cmd_prefix, cr); if (NULL == c) { retval = ERROR_FAIL; break; @@ -424,31 +373,32 @@ static int ___register_commands(struct command_context *cmd_ctx, struct command c->jim_override_target = override_target; } if (NULL != cr->chain) { - struct command *p = c ? : parent; - retval = ___register_commands(cmd_ctx, p, cr->chain, data, override_target); + if (cr->name) { + if (cmd_prefix) { + char *new_prefix = alloc_printf("%s %s", cmd_prefix, cr->name); + if (!new_prefix) { + retval = ERROR_FAIL; + break; + } + retval = __register_commands(cmd_ctx, new_prefix, cr->chain, data, override_target); + free(new_prefix); + } else { + retval = __register_commands(cmd_ctx, cr->name, cr->chain, data, override_target); + } + } else { + retval = __register_commands(cmd_ctx, cmd_prefix, cr->chain, data, override_target); + } if (ERROR_OK != retval) break; } } if (ERROR_OK != retval) { for (unsigned j = 0; j < i; j++) - unregister_command(cmd_ctx, parent, cmds[j].name); + unregister_command(cmd_ctx, cmd_prefix, cmds[j].name); } return retval; } -int __register_commands(struct command_context *cmd_ctx, const char *cmd_prefix, - const struct command_registration *cmds, void *data, - struct target *override_target) -{ - struct command *parent = NULL; - - if (cmd_prefix) - parent = command_find(cmd_ctx->commands, cmd_prefix); - - return ___register_commands(cmd_ctx, parent, cmds, data, override_target); -} - static __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3))) int unregister_commands_match(struct command_context *cmd_ctx, const char *format, ...) { @@ -501,68 +451,29 @@ int unregister_commands_match(struct command_context *cmd_ctx, const char *forma int unregister_all_commands(struct command_context *context, const char *cmd_prefix) { - struct command *parent = NULL; - if (!context) return ERROR_OK; - if (!cmd_prefix || !*cmd_prefix) { - int retval = unregister_commands_match(context, "*"); - if (retval != ERROR_OK) - return retval; - } else { - Jim_Cmd *cmd = Jim_GetCommand(context->interp, Jim_NewStringObj(context->interp, cmd_prefix, -1), JIM_NONE); - if (cmd && jimcmd_is_ocd_command(cmd)) - parent = jimcmd_privdata(cmd); - - int retval = unregister_commands_match(context, "%s *", cmd_prefix); - if (retval != ERROR_OK) - return retval; - retval = unregister_commands_match(context, "%s", cmd_prefix); - if (retval != ERROR_OK) - return retval; - } + if (!cmd_prefix || !*cmd_prefix) + return unregister_commands_match(context, "*"); - struct command **head = command_list_for_parent(context, parent); - while (NULL != *head) { - struct command *tmp = *head; - *head = tmp->next; - command_free(tmp); - } + int retval = unregister_commands_match(context, "%s *", cmd_prefix); + if (retval != ERROR_OK) + return retval; - return ERROR_OK; + return unregister_commands_match(context, "%s", cmd_prefix); } static int unregister_command(struct command_context *context, - struct command *parent, const char *name) + const char *cmd_prefix, const char *name) { - if ((!context) || (!name)) + if (!context || !name) return ERROR_COMMAND_SYNTAX_ERROR; - struct command *p = NULL; - struct command **head = command_list_for_parent(context, parent); - for (struct command *c = *head; NULL != c; p = c, c = c->next) { - if (strcmp(name, c->name) != 0) - continue; - - char *full_name = command_name(c, ' '); - - int retval = unregister_commands_match(context, "%s", full_name); - if (retval != ERROR_OK) - return retval; - - free(full_name); - - if (p) - p->next = c->next; - else - *head = c->next; - - command_free(c); - return ERROR_OK; - } + if (!cmd_prefix || !*cmd_prefix) + return unregister_commands_match(context, "%s", name); - return ERROR_OK; + return unregister_commands_match(context, "%s %s", cmd_prefix, name); } void command_output_text(struct command_context *context, const char *data) @@ -619,33 +530,6 @@ void command_print(struct command_invocation *cmd, const char *format, ...) va_end(ap); } -static char *__command_name(struct command *c, char delim, unsigned extra) -{ - char *name; - unsigned len = strlen(c->name); - if (NULL == c->parent) { - /* allocate enough for the name, child names, and '\0' */ - name = malloc(len + extra + 1); - if (!name) { - LOG_ERROR("Out of memory"); - return NULL; - } - strcpy(name, c->name); - } else { - /* parent's extra must include both the space and name */ - name = __command_name(c->parent, delim, 1 + len + extra); - char dstr[2] = { delim, 0 }; - strcat(name, dstr); - strcat(name, c->name); - } - return name; -} - -static char *command_name(struct command *c, char delim) -{ - return __command_name(c, delim, 0); -} - static bool command_can_run(struct command_context *cmd_ctx, struct command *c, const char *full_name) { if (c->mode == COMMAND_ANY || c->mode == cmd_ctx->mode) diff --git a/src/helper/command.h b/src/helper/command.h index 4d1928c5a..1f2dc5b59 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -54,7 +54,6 @@ typedef int (*command_output_handler_t)(struct command_context *context, struct command_context { Jim_Interp *interp; enum command_mode mode; - struct command *commands; struct target *current_target; /* The target set by 'targets xx' command or the latest created */ struct target *current_target_override; @@ -182,8 +181,6 @@ typedef __COMMAND_HANDLER((*command_handler_t)); struct command { char *name; - struct command *parent; - struct command *children; command_handler_t handler; Jim_CmdProc *jim_handler; void *jim_handler_data; @@ -191,7 +188,6 @@ struct command { struct target *jim_override_target; /* Used only for target of target-prefixed cmd */ enum command_mode mode; - struct command *next; }; /* commit a7d68878e4ba5dfd5ca15c058980cf6c5fc55208 Author: Antonio Borneo <bor...@gm...> Date: Wed May 13 15:35:19 2020 +0200 helper/command: unregister commands through their full-name While keeping the struct command in place, unregister the jim commands by scanning the list of jim commands through their full-name. Change-Id: I0e903fbc31172858b703d67ccd471809c7949e86 Signed-off-by: Antonio Borneo <bor...@gm...> Reviewed-on: http://openocd.zylin.com/5674 Tested-by: jenkins Reviewed-by: Oleksij Rempel <li...@re...> diff --git a/src/helper/command.c b/src/helper/command.c index 5cddf2150..d79d7f464 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -243,6 +243,26 @@ struct command_context *current_command_context(Jim_Interp *interp) return cmd_ctx; } +/** + * Find a openocd command from fullname. + * @returns Returns the named command if it is registred in interp. + * Returns NULL otherwise. + */ +static struct command *command_find_from_name(Jim_Interp *interp, const char *name) +{ + if (!name) + return NULL; + + Jim_Obj *jim_name = Jim_NewStringObj(interp, name, -1); + Jim_IncrRefCount(jim_name); + Jim_Cmd *cmd = Jim_GetCommand(interp, jim_name, JIM_NONE); + Jim_DecrRefCount(interp, jim_name); + if (!cmd || jimcmd_is_proc(cmd) || !jimcmd_is_ocd_command(cmd)) + return NULL; + + return jimcmd_privdata(cmd); +} + /** * Find a command by name from a list of commands. * @returns Returns the named command if it exists in the list. @@ -429,12 +449,80 @@ int __register_commands(struct command_context *cmd_ctx, const char *cmd_prefix, return ___register_commands(cmd_ctx, parent, cmds, data, override_target); } +static __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 2, 3))) +int unregister_commands_match(struct command_context *cmd_ctx, const char *format, ...) +{ + Jim_Interp *interp = cmd_ctx->interp; + va_list ap; + + va_start(ap, format); + char *query = alloc_vprintf(format, ap); + va_end(ap); + if (!query) + return ERROR_FAIL; + + char *query_cmd = alloc_printf("info commands {%s}", query); + free(query); + if (!query_cmd) + return ERROR_FAIL; + + int retval = Jim_EvalSource(interp, __THIS__FILE__, __LINE__, query_cmd); + free(query_cmd); + if (retval != JIM_OK) + return ERROR_FAIL; + + Jim_Obj *list = Jim_GetResult(interp); + Jim_IncrRefCount(list); + + int len = Jim_ListLength(interp, list); + for (int i = 0; i < len; i++) { + Jim_Obj *elem = Jim_ListGetIndex(interp, list, i); + Jim_IncrRefCount(elem); + + const char *name = Jim_GetString(elem, NULL); + struct command *c = command_find_from_name(interp, name); + if (!c) { + /* not openocd command */ + Jim_DecrRefCount(interp, elem); + continue; + } + LOG_DEBUG("delete command \"%s\"", name); + Jim_DeleteCommand(interp, elem); + + help_del_command(cmd_ctx, name); + + Jim_DecrRefCount(interp, elem); + } + + Jim_DecrRefCount(interp, list); + return ERROR_OK; +} + int unregister_all_commands(struct command_context *context, - struct command *parent) + const char *cmd_prefix) { - if (context == NULL) + struct command *parent = NULL; + + if (!context) return ERROR_OK; + if (!cmd_prefix || !*cmd_prefix) { + int retval = unregister_commands_match(context, "*"); + if (retval != ERROR_OK) + return retval; + } else { + Jim_Cmd *cmd = Jim_GetCommand(context->interp, Jim_NewStringObj(context->interp, cmd_prefix, -1), JIM_NONE); + if (cmd && jimcmd_is_ocd_command(cmd)) + parent = jimcmd_privdata(cmd); + + int retval = unregister_commands_match(context, "%s *", cmd_prefix); + if (retval != ERROR_OK) + return retval; + retval = unregister_commands_match(context, "%s", cmd_prefix); + if (retval != ERROR_OK) + return retval; + } + struct command **head = command_list_for_parent(context, parent); while (NULL != *head) { struct command *tmp = *head; @@ -458,7 +546,11 @@ static int unregister_command(struct command_context *context, continue; char *full_name = command_name(c, ' '); - help_del_command(context, full_name); + + int retval = unregister_commands_match(context, "%s", full_name); + if (retval != ERROR_OK) + return retval; + free(full_name); if (p) diff --git a/src/helper/command.h b/src/helper/command.h index db095972a..4d1928c5a 100644 --- a/src/helper/command.h +++ b/src/helper/command.h @@ -311,11 +311,11 @@ static inline int register_commands_with_data(struct command_context *cmd_ctx, /** * Unregisters all commands from the specified context. * @param cmd_ctx The context that will be cleared of registered commands. - * @param parent If given, only clear commands from under this one command. + * @param cmd_prefix If given, only clear commands from under this one command. * @returns ERROR_OK on success, or an error code. */ int unregister_all_commands(struct command_context *cmd_ctx, - struct command *parent); + const char *cmd_prefix); /** * Unregisters the help for all commands. Used at exit to remove the help commit d8d24f3b3696f5d2e64a67df87684132b48031d2 Author: Antonio Borneo <bor...@gm...> Date: Sun May 10 17:48:25 2020 +0200 helper/command: simplify jim_command_mode() Now that every command has struct command as private data, use jim to get access to the struct command to read the command mode, instead of running through the tree of struct command. Change-Id: Iddacdbac604714f6abe38a050daad245bdcfd20c Signed-off-by: Antonio Borneo <bor...@gm...> Reviewed-on: http://openocd.zylin.com/5673 Tested-by: jenkins Reviewed-by: Oleksij Rempel <li...@re...> diff --git a/src/helper/command.c b/src/helper/command.c index 1628b6ee7..5cddf2150 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -52,16 +52,27 @@ struct log_capture_state { static int unregister_command(struct command_context *context, struct command *parent, const char *name); static char *command_name(struct command *c, char delim); +static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj * const *argv); static int help_add_command(struct command_context *cmd_ctx, const char *cmd_name, const char *help_text, const char *usage_text); static int help_del_command(struct command_context *cmd_ctx, const char *cmd_name); -/* wrap jimtcl internal data */ +/* set of functions to wrap jimtcl internal data */ static inline bool jimcmd_is_proc(Jim_Cmd *cmd) { return cmd->isproc; } +static inline bool jimcmd_is_ocd_command(Jim_Cmd *cmd) +{ + return !cmd->isproc && cmd->u.native.cmdProc == command_unknown; +} + +static inline void *jimcmd_privdata(Jim_Cmd *cmd) +{ + return cmd->isproc ? NULL : cmd->u.native.privData; +} + static void tcl_output(void *privData, const char *file, unsigned line, const char *function, const char *string) { @@ -340,8 +351,6 @@ command_new_error: return NULL; } -static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv); - static struct command *register_command(struct command_context *context, struct command *parent, const struct command_registration *cr) { @@ -914,19 +923,6 @@ COMMAND_HANDLER(handle_help_command) return retval; } -static int command_unknown_find(unsigned argc, Jim_Obj *const *argv, - struct command *head, struct command **out) -{ - if (0 == argc) - return argc; - const char *cmd_name = Jim_GetString(argv[0], NULL); - struct command *c = command_find(head, cmd_name); - if (NULL == c) - return argc; - *out = c; - return command_unknown_find(--argc, ++argv, (*out)->children, out); -} - static char *alloc_concatenate_strings(int argc, Jim_Obj * const *argv) { char *prev, *all; @@ -1038,18 +1034,19 @@ static int jim_command_mode(Jim_Interp *interp, int argc, Jim_Obj *const *argv) Jim_Cmd *cmd = Jim_GetCommand(interp, s, JIM_NONE); Jim_DecrRefCount(interp, s); free(full_name); - if (cmd && jimcmd_is_proc(cmd)) { - Jim_SetResultString(interp, "any", -1); - return JIM_OK; - } - struct command *c = cmd_ctx->commands; - int remaining = command_unknown_find(argc - 1, argv + 1, c, &c); - /* if nothing could be consumed, then it's an unknown command */ - if (remaining == argc - 1) { + if (!cmd || !(jimcmd_is_proc(cmd) || jimcmd_is_ocd_command(cmd))) { Jim_SetResultString(interp, "unknown", -1); return JIM_OK; } - mode = c->mode; + + if (jimcmd_is_proc(cmd)) { + /* tcl proc */ + mode = COMMAND_ANY; + } else { + struct command *c = jimcmd_privdata(cmd); + + mode = c->mode; + } } else mode = cmd_ctx->mode; ----------------------------------------------------------------------- Summary of changes: src/helper/command.c | 333 +++++++++++++++++++++++---------------------------- src/helper/command.h | 10 +- src/jtag/tcl.c | 6 - 3 files changed, 155 insertions(+), 194 deletions(-) hooks/post-receive -- Main OpenOCD repository |