diff options
author | Zachary T Welch <zw@superlucidity.net> | 2009-11-20 10:16:46 -0800 |
---|---|---|
committer | Zachary T Welch <zw@superlucidity.net> | 2009-11-20 15:03:41 -0800 |
commit | 7a67aae93c7de1e72baaba65635af0461ad8d040 (patch) | |
tree | 9d07832cdf8a54479a58accf4258b2b9567b7841 | |
parent | a19aaf913688424dbd6384028854c178c9eb5bf2 (diff) | |
download | riscv-openocd-7a67aae93c7de1e72baaba65635af0461ad8d040.zip riscv-openocd-7a67aae93c7de1e72baaba65635af0461ad8d040.tar.gz riscv-openocd-7a67aae93c7de1e72baaba65635af0461ad8d040.tar.bz2 |
maintain command lists in sorted order
Use insertion sort to the command link lists. The only practical effect
of this is to order the output of the new 'help' command.
-rw-r--r-- | src/helper/command.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/helper/command.c b/src/helper/command.c index d8b7875..f6c6b2d 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -177,7 +177,8 @@ static int script_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv) /** * Find a command by name from a list of commands. - * @returns The named command if found, or NULL. + * @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) { @@ -190,9 +191,10 @@ static struct command *command_find(struct command *head, const char *name) } /** - * Add the command to the end of linked list. - * @returns Returns false if the named command already exists in the list. - * Returns true otherwise. + * 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) { @@ -202,9 +204,17 @@ static void command_add_child(struct command **head, struct command *c) *head = c; return; } - struct command *cc = *head; - while (cc->next) cc = cc->next; - cc->next = c; + + 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( |