From 9d2b18a0f9df38cfe15e10766b1302f10d426355 Mon Sep 17 00:00:00 2001 From: wdenk Date: Sat, 28 Jun 2003 23:11:04 +0000 Subject: Rewrite command lookup and help command (fix problems with bubble sort when sorting command name list). Minor cleanup here and there. --- CHANGELOG | 3 ++ common/cmd_bdinfo.c | 1 + common/cmd_bootm.c | 9 +++++- common/cmd_mem.c | 6 ++-- common/command.c | 92 +++++++++++++++++++++++++++++------------------------ lib_ppc/board.c | 48 +++++++--------------------- 6 files changed, 79 insertions(+), 80 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0aa06bb556..6ec62cb998 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Changes since U-Boot 0.4.0: ====================================================================== +* Rewrite command lookup and help command (fix problems with bubble + sort when sorting command name list). Minor cleanup here and there. + * Merge from "stable branch", tag LABEL_2003_06_28_1800-stable: - Allow to call sysmon function interactively - PIC on LWMON board needs delay after power-on diff --git a/common/cmd_bdinfo.c b/common/cmd_bdinfo.c index 3f73cf852e..542e25b332 100644 --- a/common/cmd_bdinfo.c +++ b/common/cmd_bdinfo.c @@ -26,6 +26,7 @@ */ #include #include +#include /* for print_IPaddr */ #if (CONFIG_COMMANDS & CFG_CMD_BDI) diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 7ade068b56..1327e34688 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -873,7 +873,14 @@ int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } cmd_tbl_t U_BOOT_CMD(BOOTD) = MK_CMD_ENTRY( - "bootd", 1, 1, do_bootd, + "boot", 1, 1, do_bootd, + "boot - boot default, i.e., run 'bootcmd'\n", + NULL +); + +/* keep old command name "bootd" for backward compatibility */ +cmd_tbl_t U_BOOT_CMD(BOOTD) = MK_CMD_ENTRY( + "bootd", 1, 1, do_bootd, "bootd - boot default, i.e., run 'bootcmd'\n", NULL ); diff --git a/common/cmd_mem.c b/common/cmd_mem.c index 944aada1ee..4d02d2dcfc 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -36,8 +36,10 @@ #include #endif -#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | CFG_CMD_PCI | CFG_CMD_I2C\ - | CMD_CMD_PORTIO)) +#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | \ + CFG_CMD_I2C | \ + CFG_CMD_PCI | \ + CMD_CMD_PORTIO ) ) int cmd_get_data_size(char* arg, int default_size) { /* Check for a size specification .b, .w or .l. diff --git a/common/command.c b/common/command.c index 607c74616a..059da7c96c 100644 --- a/common/command.c +++ b/common/command.c @@ -72,44 +72,44 @@ int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) if (argc == 1) { /*show list of commands */ - int cmd_items = (((int) &__u_boot_cmd_end) - - ((int) &__u_boot_cmd_start)) / - sizeof (*cmdtp); - int end_sort; - cmd_tbl_t *cmd_array[(cmd_items + 1)]; - int i; - - /* Make list of commands from .uboot_cmd section */ - cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start; - for (i = 1; i <= cmd_items; i++) { - cmd_array[i] = cmdtp; - cmdtp++; + int cmd_items = &__u_boot_cmd_end - + &__u_boot_cmd_start; /* pointer arith! */ + cmd_tbl_t *cmd_array[cmd_items]; + int i, j, swaps; + + /* Make array of commands from .uboot_cmd section */ + cmdtp = &__u_boot_cmd_start; + for (i = 0; i < cmd_items; i++) { + cmd_array[i] = cmdtp++; } - /* Sort command list */ - end_sort = 0; - for (i = 1; end_sort != 1 || i <= cmd_items - 1; i++) { - if (i == cmd_items) { /* Last command */ - end_sort = 1; - i = 1; - } - if (strcmp (cmd_array[i]->name, cmd_array[i + 1]->name) > 0) { - end_sort = 0; - *cmd_array[0] = *cmd_array[i]; - *cmd_array[i] = *cmd_array[i + 1]; - *cmd_array[i + 1] = *cmd_array[0]; + /* Sort command list (trivial bubble sort) */ + for (i = cmd_items - 1; i > 0; --i) { + swaps = 0; + for (j = 0; j < i; ++j) { + if (strcmp (cmd_array[j]->name, + cmd_array[j + 1]->name) > 0) { + cmd_tbl_t *tmp; + tmp = cmd_array[j]; + cmd_array[j] = cmd_array[j + 1]; + cmd_array[j + 1] = tmp; + ++swaps; + } } + if (!swaps) + break; } /* print short help (usage) */ - for (cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start; - cmdtp != (cmd_tbl_t *) & __u_boot_cmd_end; cmdtp++) { + for (i = 0; i < cmd_items; i++) { + const char *usage = cmd_array[i]->usage; + /* allow user abort */ if (ctrlc ()) return 1; - if (cmdtp->usage == NULL) + if (usage == NULL) continue; - puts (cmdtp->usage); + puts (usage); } return 0; } @@ -181,21 +181,31 @@ cmd_tbl_t U_BOOT_CMD(ECHO) = MK_CMD_ENTRY( cmd_tbl_t *find_cmd (const char *cmd) { cmd_tbl_t *cmdtp; - cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start; /*Init value */ - int one_cmd_name = 0; - - for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) { - if ((strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) && - (strlen (cmd) == strlen (cmdtp->name))) - return cmdtp; - else if (strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) { - cmdtp_temp = cmdtp; - one_cmd_name++; - } else; + const char *p; + int len; + int n_found = 0; + + /* + * Some commands allow length modifiers (like "cp.b"); + * compare command name only until first dot. + */ + len = ((p = strchr(cmd, '.')) == NULL) ? strlen (cmd) : (p - cmd); + + for (cmdtp = &__u_boot_cmd_start; + cmdtp != &__u_boot_cmd_end; + cmdtp++) { + if (strncmp (cmd, cmdtp->name, len) == 0) { + if (len == strlen (cmdtp->name)) + return cmdtp; /* full match */ + + cmdtp_temp = cmdtp; /* abbreviated command ? */ + n_found++; + } } - if (one_cmd_name == 1) + if (n_found == 1) { /* exactly one match */ return cmdtp_temp; + } - return NULL; /* not found || one_cmd_name >2 */ + return NULL; /* not found or ambiguous command */ } diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 044d8f87c4..daa2a6df44 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -401,9 +401,7 @@ void board_init_f (ulong bootflag) #ifdef CONFIG_LOGBUFFER /* reserve kernel log buffer */ addr -= (LOGBUFF_RESERVE); -# ifdef DEBUG - printf ("Reserving %ldk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr); -# endif + debug ("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr); #endif #ifdef CONFIG_PRAM @@ -413,16 +411,12 @@ void board_init_f (ulong bootflag) i = getenv_r ("pram", tmp, sizeof (tmp)); reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM; addr -= (reg << 10); /* size is in kB */ -# ifdef DEBUG - printf ("Reserving %ldk for protected RAM at %08lx\n", reg, addr); -# endif + debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr); #endif /* CONFIG_PRAM */ /* round down to next 4 kB limit */ addr &= ~(4096 - 1); -#ifdef DEBUG - printf ("Top of RAM usable for U-Boot at: %08lx\n", addr); -#endif + debug ("Top of RAM usable for U-Boot at: %08lx\n", addr); #ifdef CONFIG_LCD /* reserve memory for LCD display (always full pages) */ @@ -443,9 +437,7 @@ void board_init_f (ulong bootflag) addr -= len; addr &= ~(4096 - 1); -#ifdef DEBUG - printf ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr); -#endif + debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr); #ifdef CONFIG_AMIGAONEG3SE gd->relocaddr = addr; @@ -455,10 +447,8 @@ void board_init_f (ulong bootflag) * reserve memory for malloc() arena */ addr_sp = addr - TOTAL_MALLOC_LEN; -#ifdef DEBUG - printf ("Reserving %dk for malloc() at: %08lx\n", + debug ("Reserving %dk for malloc() at: %08lx\n", TOTAL_MALLOC_LEN >> 10, addr_sp); -#endif /* * (permanently) allocate a Board Info struct @@ -467,16 +457,12 @@ void board_init_f (ulong bootflag) addr_sp -= sizeof (bd_t); bd = (bd_t *) addr_sp; gd->bd = bd; -#ifdef DEBUG - printf ("Reserving %d Bytes for Board Info at: %08lx\n", + debug ("Reserving %d Bytes for Board Info at: %08lx\n", sizeof (bd_t), addr_sp); -#endif addr_sp -= sizeof (gd_t); id = (gd_t *) addr_sp; -#ifdef DEBUG - printf ("Reserving %d Bytes for Global Data at: %08lx\n", + debug ("Reserving %d Bytes for Global Data at: %08lx\n", sizeof (gd_t), addr_sp); -#endif /* * Finally, we set up a new (bigger) stack. @@ -488,9 +474,7 @@ void board_init_f (ulong bootflag) addr_sp &= ~0xF; *((ulong *) addr_sp)-- = 0; *((ulong *) addr_sp)-- = 0; -#ifdef DEBUG - printf ("Stack Pointer at: %08lx\n", addr_sp); -#endif + debug ("Stack Pointer at: %08lx\n", addr_sp); /* * Save local variables to board info struct @@ -536,9 +520,7 @@ void board_init_f (ulong bootflag) #endif #endif -#ifdef DEBUG - printf ("New Stack Pointer is: %08lx\n", addr_sp); -#endif + debug ("New Stack Pointer is: %08lx\n", addr_sp); WATCHDOG_RESET (); @@ -588,9 +570,7 @@ void board_init_r (gd_t *id, ulong dest_addr) gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ -#ifdef DEBUG - printf ("Now running in RAM - U-Boot at: %08lx\n", dest_addr); -#endif + debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr); WATCHDOG_RESET (); @@ -847,9 +827,7 @@ void board_init_r (gd_t *id, ulong dest_addr) defined(CONFIG_SPD823TS) ) WATCHDOG_RESET (); -# ifdef DEBUG - puts ("Reset Ethernet PHY\n"); -# endif + debug ("Reset Ethernet PHY\n"); reset_phy (); #endif @@ -859,9 +837,7 @@ void board_init_r (gd_t *id, ulong dest_addr) kgdb_init (); #endif -#ifdef DEBUG - printf ("U-Boot relocated to %08lx\n", dest_addr); -#endif + debug ("U-Boot relocated to %08lx\n", dest_addr); /* * Enable Interrupts -- cgit v1.2.1