* Code cleanup:
  - remove trailing white space, trailing empty lines, C++ comments, etc.
  - split cmd_boot.c (separate cmd_bdinfo.c and cmd_load.c)

* Patches by Kenneth Johansson, 25 Jun 2003:
  - major rework of command structure
    (work done mostly by Michal Cendrowski and Joakim Kristiansen)
diff --git a/common/command.c b/common/command.c
index 842e784..607c746 100644
--- a/common/command.c
+++ b/common/command.c
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2000
+ * (C) Copyright 2000-2003
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * See file CREDITS for list of people who contributed to this
@@ -27,93 +27,6 @@
 
 #include <common.h>
 #include <command.h>
-#include <cmd_cache.h>
-#include <cmd_mem.h>
-#include <cmd_boot.h>
-#include <cmd_flash.h>
-#include <cmd_bootm.h>
-#include <cmd_net.h>
-#include <cmd_nvedit.h>
-#include <cmd_misc.h>
-#include <cmd_kgdb.h>
-#include <cmd_ide.h>
-#include <cmd_disk.h>
-#include <cmd_console.h>
-#include <cmd_reginfo.h>
-#include <cmd_pcmcia.h>
-#include <cmd_autoscript.h>
-#include <cmd_diag.h>
-
-#include <cmd_eeprom.h>
-#include <cmd_i2c.h>
-#include <cmd_spi.h>
-#include <cmd_immap.h>
-#include <cmd_rtc.h>
-
-#include <cmd_elf.h>
-#include <cmd_fdc.h>		/* Floppy support */
-#include <cmd_usb.h>		/* USB support */
-#include <cmd_scsi.h>
-#include <cmd_pci.h>
-#include <cmd_mii.h>
-#include <cmd_dcr.h>		/* 4xx DCR register access */
-#include <cmd_doc.h>
-#include <cmd_nand.h>
-#include <cmd_jffs2.h>
-#include <cmd_fpga.h>
-
-#include <cmd_bsp.h>		/* board special functions */
-
-#include <cmd_bedbug.h>
-#include <cmd_elf.h>
-
-#include <cmd_dtt.h>
-
-#include <cmd_vfd.h>		/* load a bitmap to the VFDs on TRAB */
-#include <cmd_log.h>
-#include <cmd_fdos.h>
-#include <cmd_bmp.h>
-#include <cmd_portio.h>
-#include <cmd_mmc.h>
-#include <cmd_fat.h>
-
-#ifdef CONFIG_AMIGAONEG3SE
-#include <cmd_menu.h>
-#include <cmd_boota.h>
-#endif
-
-/*
- * HELP command
- */
-#define	CMD_TBL_HELP	MK_CMD_TBL_ENTRY(					\
-	"help",		1,	CFG_MAXARGS,	1,	do_help,		\
-	"help    - print online help\n",					\
-	"[command ...]\n"							\
-	"    - show help information (for 'command')\n"				\
-	"'help' prints online help for the monitor commands.\n\n"		\
-	"Without arguments, it prints a short usage message for all commands.\n\n" \
-	"To get detailed help information for specific commands you can type\n"	\
-	"'help' with one or more command names as arguments.\n"			\
-    ),
-
-#define	CMD_TBL_QUES	MK_CMD_TBL_ENTRY(					\
-	"?",		1,	CFG_MAXARGS,	1,	do_help,		\
-	"?       - alias for 'help'\n",						\
-	NULL									\
-    ),
-
-#define CMD_TBL_VERS	MK_CMD_TBL_ENTRY(					\
-	"version",	4,	1,		1,	do_version,		\
-	"version - print monitor version\n",					\
-	NULL									\
-    ),
-
-#define CMD_TBL_ECHO	MK_CMD_TBL_ENTRY(					\
-	"echo",		4,	CFG_MAXARGS,	1,	do_echo,		\
-	"echo    - echo args to console\n",					\
-	"[args..]\n"								\
-	"    - echo args to console; \\c suppresses newline\n"			\
-    ),
 
 int
 do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
@@ -152,32 +65,59 @@
  * Use puts() instead of printf() to avoid printf buffer overflow
  * for long help messages
  */
-int
-do_help (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 {
 	int i;
 	int rcode = 0;
 
-	if (argc == 1) {	/* print short help (usage) */
+	if (argc == 1) {	/*show list of commands */
 
-		for (cmdtp=&cmd_tbl[0]; cmdtp->name; cmdtp++) {
+		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++;
+		}
+		/* 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];
+			}
+		}
+
+		/* print short help (usage) */
+		for (cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start;
+			 cmdtp != (cmd_tbl_t *) & __u_boot_cmd_end; cmdtp++) {
 			/* allow user abort */
-			if (ctrlc())
+			if (ctrlc ())
 				return 1;
-
 			if (cmdtp->usage == NULL)
 				continue;
 			puts (cmdtp->usage);
 		}
-
 		return 0;
 	}
-
 	/*
 	 * command help (long version)
 	 */
-	for (i=1; i<argc; ++i) {
-		if ((cmdtp = find_cmd(argv[i])) != NULL) {
+	for (i = 1; i < argc; ++i) {
+		if ((cmdtp = find_cmd (argv[i])) != NULL) {
 #ifdef	CFG_LONGHELP
 			/* found - print (long) help info */
 			puts (cmdtp->name);
@@ -196,164 +136,66 @@
 		} else {
 			printf ("Unknown command '%s' - try 'help'"
 				" without arguments for list of all"
-				" known commands\n\n",
-				argv[i]
-			);
+				" known commands\n\n", argv[i]
+					);
 			rcode = 1;
 		}
 	}
 	return rcode;
 }
 
+
+cmd_tbl_t U_BOOT_CMD(HELP) = MK_CMD_ENTRY(
+	"help",	CFG_MAXARGS,	1,	do_help,
+ 	"help    - print online help\n",
+ 	"[command ...]\n"
+ 	"    - show help information (for 'command')\n"
+ 	"'help' prints online help for the monitor commands.\n\n"
+ 	"Without arguments, it prints a short usage message for all commands.\n\n"
+ 	"To get detailed help information for specific commands you can type\n"
+  "'help' with one or more command names as arguments.\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(QUES) = MK_CMD_ENTRY(
+	"?",	CFG_MAXARGS,	1,	do_help,
+ 	"?       - alias for 'help'\n",
+	NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(VERS) = MK_CMD_ENTRY(
+	"version",	1,		1,	do_version,
+ 	"version - print monitor version\n",
+	NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(ECHO) = MK_CMD_ENTRY(
+	"echo",	CFG_MAXARGS,	1,	do_echo,
+ 	"echo    - echo args to console\n",
+ 	"[args..]\n"
+	"    - echo args to console; \\c suppresses newline\n"
+);
+
 /***************************************************************************
  * find command table entry for a command
  */
-cmd_tbl_t *find_cmd(const char *cmd)
+cmd_tbl_t *find_cmd (const char *cmd)
 {
 	cmd_tbl_t *cmdtp;
 
-	/* Search command table - Use linear search - it's a small table */
-	for (cmdtp = &cmd_tbl[0]; cmdtp->name; cmdtp++) {
-		if (strncmp (cmd, cmdtp->name, cmdtp->lmin) == 0)
+	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;
 	}
-	return NULL;	/* not found */
-}
+	if (one_cmd_name == 1)
+		return cmdtp_temp;
 
-/*
- * The commands in this table are sorted alphabetically by the
- * command name and in descending order by the command name string
- * length. This is to prevent conflicts in command name parsing.
- * Please ensure that new commands are added according to that rule.
- * Please use $(TOPDIR)/doc/README.commands as a reference AND make
- * sure it gets updated.
- */
-
-cmd_tbl_t cmd_tbl[] = {
-	CMD_TBL_ASKENV
-	CMD_TBL_ASM
-	CMD_TBL_AUTOSCRIPT
-	CMD_TBL_BASE
-	CMD_TBL_BDINFO
-	CMD_TBL_BMP
-#ifdef CONFIG_AMIGAONEG3SE
-	CMD_TBL_BOOTA
-#endif
-	CMD_TBL_BOOTELF
-	CMD_TBL_BOOTM
-	CMD_TBL_BOOTP
-	CMD_TBL_BOOTVX
-	CMD_TBL_BOOTD
-	CMD_TBL_BREAK
-	CMD_TBL_BRGINFO
-	CMD_TBL_CARINFO
-	CMD_TBL_JFFS2_CHPART
-	CMD_TBL_CMP
-	CMD_TBL_CONINFO
-	CMD_TBL_CONTINUE
-	CMD_TBL_CP
-	CMD_TBL_CRC
-	CMD_TBL_DATE
-	CMD_TBL_DCACHE
-	CMD_TBL_DHCP
-	CMD_TBL_DIAG
-	CMD_TBL_DISK
-	CMD_TBL_DMAINFO
-	CMD_TBL_DIS
-	CMD_TBL_DOCBOOT
-	CMD_TBL_DOC
-	CMD_TBL_DTT
-	CMD_TBL_ECHO
-	CMD_TBL_EEPROM
-	CMD_TBL_FAT
-	CMD_TBL_FCCINFO
-	CMD_TBL_FLERASE
-	CMD_TBL_FDC
-        CMD_TBL_FDOS_BOOT
-        CMD_TBL_FDOS_LS
-	CMD_TBL_FLINFO
-	CMD_TBL_FPGA
-	CMD_TBL_JFFS2_FSINFO
-	CMD_TBL_JFFS2_FSLOAD
-	CMD_TBL_GETDCR
-	CMD_TBL_GO
-	CMD_TBL_HELP
-	CMD_TBL_HWFLOW
-	CMD_TBL_I2CINFO
-	CMD_TBL_ICACHE
-#ifdef CONFIG_8260
-	CMD_TBL_ICINFO
-#endif
-	CMD_TBL_IMD
-	CMD_TBL_IMM
-	CMD_TBL_INM
-	CMD_TBL_IMW
-	CMD_TBL_PORTIO_IN
-	CMD_TBL_ICRC
-	CMD_TBL_IPROBE
-	CMD_TBL_ILOOP
-	CMD_TBL_ISDRAM
-	CMD_TBL_IDE
-	CMD_TBL_IMINFO
-	CMD_TBL_IOPINFO
-	CMD_TBL_IOPSET
-	CMD_TBL_IRQINFO
-	CMD_TBL_KGDB
-	CMD_TBL_LOADB
-	CMD_TBL_LOADS
-	CMD_TBL_LOG
-	CMD_TBL_LOOP
-	CMD_TBL_JFFS2_LS
-	CMD_TBL_MCCINFO
-	CMD_TBL_MMC
-	CMD_TBL_MD
-	CMD_TBL_MEMCINFO
-#ifdef CONFIG_AMIGAONEG3SE
-	CMD_TBL_MENU
-#endif
-	CMD_TBL_MII
-	CMD_TBL_MM
-	CMD_TBL_MTEST
-	CMD_TBL_MUXINFO
-	CMD_TBL_MW
-	CMD_TBL_NAND
-	CMD_TBL_NANDBOOT
-	CMD_TBL_NEXT
-	CMD_TBL_NM
-	CMD_TBL_PING
-	CMD_TBL_PORTIO_OUT
-	CMD_TBL_PCI
-	CMD_TBL_PRINTENV
-	CMD_TBL_PROTECT
-	CMD_TBL_RARPB
-	CMD_TBL_RDUMP
-	CMD_TBL_PINIT
-	CMD_TBL_REGINFO
-	CMD_TBL_RESET
-	CMD_TBL_RUN
-	CMD_TBL_SAVEENV
-	CMD_TBL_SAVES
-	CMD_TBL_SCCINFO
-	CMD_TBL_SCSIBOOT
-	CMD_TBL_SCSI
-	CMD_TBL_SETDCR
-	CMD_TBL_SETENV
-	CMD_TBL_SIINFO
-	CMD_TBL_SITINFO
-	CMD_TBL_SIUINFO
-	CMD_TBL_MISC		/* sleep */
-	CMD_TBL_SMCINFO
-	CMD_TBL_SPIINFO
-	CMD_TBL_SPI
-	CMD_TBL_STACK
-	CMD_TBL_STEP
-	CMD_TBL_TFTPB
-	CMD_TBL_USBBOOT
-	CMD_TBL_USB
-	CMD_TBL_VERS
-	CMD_TBL_BSP
-	CMD_TBL_VFD
-	CMD_TBL_QUES		/* keep this ("help") the last entry */
-	/* the following entry terminates this table */
-	MK_CMD_TBL_ENTRY( NULL, 0, 0, 0, NULL, NULL, NULL )
-};
+	return NULL;	/* not found || one_cmd_name >2 */
+}