diff options
author | Juergen Beisert <jbe@isonoe.(none)> | 2007-10-19 13:20:09 +0200 |
---|---|---|
committer | Juergen Beisert <jbe@isonoe.(none)> | 2007-10-19 13:20:09 +0200 |
commit | 18690c9c23d424f5a28d24f4369533745c4ddbb3 (patch) | |
tree | ac20ba228c0b69c8995793780fcf4d70a815fb8f /common | |
parent | b21ed7177c94b805ab0433049a8950d9ef770f19 (diff) | |
parent | 3c0323a650337816289dc1dcc113df717ecb3cd0 (diff) | |
download | barebox-18690c9c23d424f5a28d24f4369533745c4ddbb3.tar.gz barebox-18690c9c23d424f5a28d24f4369533745c4ddbb3.tar.xz |
Merge branch 'master' of jbe@octopus:/home/git/projects/u-boot-v2
Diffstat (limited to 'common')
-rw-r--r-- | common/command.c | 106 |
1 files changed, 36 insertions, 70 deletions
diff --git a/common/command.c b/common/command.c index c78da7e3a5..fdd7444e6d 100644 --- a/common/command.c +++ b/common/command.c @@ -73,37 +73,6 @@ U_BOOT_CMD_END #ifdef CONFIG_SHELL_HUSH -static int do_readline (cmd_tbl_t *cmdtp, int argc, char *argv[]) -{ - char *buf = xzalloc(CONFIG_CBSIZE); - - if (argc < 3) { - u_boot_cmd_usage(cmdtp); - return 1; - } - - if (readline(argv[1], buf, CONFIG_CBSIZE) < 0) { - free(buf); - return 1; - } - - setenv(argv[2], buf); - free(buf); - - return 0; -} - -static __maybe_unused char cmd_readline_help[] = -"Usage: readline <prompt> VAR\n" -"readline reads a line of user input into variable VAR.\n"; - -U_BOOT_CMD_START(readline) - .maxargs = 3, - .cmd = do_readline, - .usage = "prompt for user input", - U_BOOT_CMD_HELP(cmd_readline_help) -U_BOOT_CMD_END - static int do_exit (cmd_tbl_t *cmdtp, int argc, char *argv[]) { int r; @@ -150,32 +119,17 @@ EXPORT_SYMBOL(u_boot_cmd_usage); */ static int do_help (cmd_tbl_t * cmdtp, int argc, char *argv[]) { - if (argc == 1) { /*show list of commands */ - int cmd_items = &__u_boot_cmd_end - - &__u_boot_cmd_start; /* pointer arith! */ - int i; - - /* No need to sort the command list. The linker already did - * this for us. - */ - cmdtp = &__u_boot_cmd_start; - for (i = 0; i < cmd_items; i++) { - /* print short help (usage) */ - - /* allow user abort */ - if (ctrlc ()) - return 1; + if (argc == 1) { /* show list of commands */ + for_each_command(cmdtp) { if (!cmdtp->usage) continue; printf("%10s - %s\n", cmdtp->name, cmdtp->usage); - cmdtp++; } return 0; } - /* - * command help (long version) - */ - if ((cmdtp = find_cmd (argv[1])) != NULL) { + + /* command help (long version) */ + if ((cmdtp = find_cmd(argv[1])) != NULL) { u_boot_cmd_usage(cmdtp); return 0; } else { @@ -204,7 +158,13 @@ U_BOOT_CMD_START(help) U_BOOT_CMD_HELP(cmd_help_help) U_BOOT_CMD_END -#ifdef CONFIG_MODULES +static int compare(struct list_head *a, struct list_head *b) +{ + char *na = list_entry(a, cmd_tbl_t, list)->name; + char *nb = list_entry(b, cmd_tbl_t, list)->name; + + return strcmp(na, nb); +} int register_command(cmd_tbl_t *cmd) { @@ -214,17 +174,37 @@ int register_command(cmd_tbl_t *cmd) * with a module. */ - printf("register command %s\n", cmd->name); + debug("register command %s\n", cmd->name); /* * Would be nice to have some kind of list_add_sort * to keep the command list in order */ - list_add_tail(&cmd->list, &command_list); + list_add_sort(&cmd->list, &command_list, compare); + + if (cmd->aliases) { + char **aliases = cmd->aliases; + while(*aliases) { + char *usage = "alias for "; + cmd_tbl_t *c = xzalloc(sizeof(cmd_tbl_t)); + + memcpy(c, cmd, sizeof(cmd_tbl_t)); + + c->name = *aliases; + c->usage = xmalloc(strlen(usage) + strlen(cmd->name) + 1); + sprintf(c->usage, "%s%s", usage, cmd->name); + + c->aliases = NULL; + + register_command(c); + + aliases++; + } + } return 0; } -#endif +EXPORT_SYMBOL(register_command); /* * find command table entry for a command @@ -247,20 +227,6 @@ cmd_tbl_t *find_cmd (const char *cmd) cmdtp_temp = cmdtp; /* abbreviated command ? */ n_found++; } - - if (cmdtp->aliases) { - char **aliases = cmdtp->aliases; - while(*aliases) { - if (strncmp (cmd, *aliases, len) == 0) { - if (len == strlen (cmdtp->name)) - return cmdtp; /* full match */ - - cmdtp_temp = cmdtp; /* abbreviated command ? */ - n_found++; - } - aliases++; - } - } } if (n_found == 1) { /* exactly one match */ @@ -283,7 +249,7 @@ static int init_command_list(void) for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) - list_add_tail(&cmdtp->list, &command_list); + register_command(cmdtp); return 0; } |