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.
This commit is contained in:
Zachary T Welch 2009-11-20 10:16:46 -08:00
parent a19aaf9136
commit 7a67aae93c
1 changed files with 17 additions and 7 deletions

View File

@ -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. * 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) 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. * Add the command into the linked list, sorted by name.
* @returns Returns false if the named command already exists in the list. * @param head Address to head of command list pointer, which may be
* Returns true otherwise. * 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) 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; *head = c;
return; return;
} }
struct command *cc = *head;
while (cc->next) cc = cc->next; while ((*head)->next && (strcmp(c->name, (*head)->name) > 0))
cc->next = c; 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( static struct command **command_list_for_parent(