summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorJuergen Beisert <jbe@isonoe.(none)>2007-10-19 13:20:09 +0200
committerJuergen Beisert <jbe@isonoe.(none)>2007-10-19 13:20:09 +0200
commit18690c9c23d424f5a28d24f4369533745c4ddbb3 (patch)
treeac20ba228c0b69c8995793780fcf4d70a815fb8f /common
parentb21ed7177c94b805ab0433049a8950d9ef770f19 (diff)
parent3c0323a650337816289dc1dcc113df717ecb3cd0 (diff)
downloadbarebox-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.c106
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;
}