]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/command.c
change '\t' in format strings to spaces;improve error message
[karo-tx-uboot.git] / common / command.c
index b3ec510a27cd57d14596e78463dfb04db1fc6762..aa0fb0a3d36b06830afdcbcb4c3a37bd5c158088 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <linux/ctype.h>
 
 /*
  * Use puts() instead of printf() to avoid printf buffer overflow
@@ -140,7 +141,7 @@ cmd_tbl_t *find_cmd (const char *cmd)
        return find_cmd_tbl(cmd, &__u_boot_cmd_start, len);
 }
 
-int cmd_usage(cmd_tbl_t *cmdtp)
+int cmd_usage(const cmd_tbl_t *cmdtp)
 {
        printf("%s - %s\n\n", cmdtp->name, cmdtp->usage);
 
@@ -165,7 +166,7 @@ int var_complete(int argc, char * const argv[], char last_char, int maxv, char *
        static char tmp_buf[512];
        int space;
 
-       space = last_char == '\0' || last_char == ' ' || last_char == '\t';
+       space = last_char == '\0' || isblank(last_char);
 
        if (space && argc == 1)
                return env_complete("", maxv, cmdv, sizeof(tmp_buf), tmp_buf);
@@ -206,7 +207,7 @@ static int complete_cmdv(int argc, char * const argv[], char last_char, int maxv
        }
 
        /* more than one arg or one but the start of the next */
-       if (argc > 1 || (last_char == '\0' || last_char == ' ' || last_char == '\t')) {
+       if (argc > 1 || (last_char == '\0' || isblank(last_char))) {
                cmdtp = find_cmd(argv[0]);
                if (cmdtp == NULL || cmdtp->complete == NULL) {
                        cmdv[0] = NULL;
@@ -257,7 +258,7 @@ static int make_argv(char *s, int argvsz, char *argv[])
        while (argc < argvsz - 1) {
 
                /* skip any white space */
-               while ((*s == ' ') || (*s == '\t'))
+               while (isblank(*s))
                        ++s;
 
                if (*s == '\0') /* end of s, no more args       */
@@ -266,7 +267,7 @@ static int make_argv(char *s, int argvsz, char *argv[])
                argv[argc++] = s;       /* begin of argument string     */
 
                /* find end of string */
-               while (*s && (*s != ' ') && (*s != '\t'))
+               while (*s && !isblank(*s))
                        ++s;
 
                if (*s == '\0')         /* end of s, no more args       */
@@ -474,8 +475,75 @@ void fixup_cmdtable(cmd_tbl_t *cmdtp, int size)
                        addr = (ulong)(cmdtp->help) + gd->reloc_off;
                        cmdtp->help = (char *)addr;
                }
+#endif
+#ifdef CONFIG_AUTO_COMPLETE
+               if (cmdtp->complete) {
+                       addr = (ulong)(cmdtp->complete) + gd->reloc_off;
+                       cmdtp->complete =
+                               (int (*)(int, char * const [], char, int, char * []))addr;
+               }
 #endif
                cmdtp++;
        }
 }
 #endif
+
+/**
+ * Call a command function. This should be the only route in U-Boot to call
+ * a command, so that we can track whether we are waiting for input or
+ * executing a command.
+ *
+ * @param cmdtp                Pointer to the command to execute
+ * @param flag         Some flags normally 0 (see CMD_FLAG_.. above)
+ * @param argc         Number of arguments (arg 0 must be the command text)
+ * @param argv         Arguments
+ * @return 0 if command succeeded, else non-zero (CMD_RET_...)
+ */
+static int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       int result;
+
+       result = (cmdtp->cmd)(cmdtp, flag, argc, argv);
+       if (result)
+               debug("Command failed, result=%d", result);
+       return result;
+}
+
+enum command_ret_t cmd_process(int flag, int argc, char * const argv[],
+                              int *repeatable)
+{
+       enum command_ret_t rc = CMD_RET_SUCCESS;
+       cmd_tbl_t *cmdtp;
+
+       /* Look up command in command table */
+       cmdtp = find_cmd(argv[0]);
+       if (cmdtp == NULL) {
+               printf("Unknown command '%s' - try 'help'\n", argv[0]);
+               return 1;
+       }
+
+       /* found - check max args */
+       if (argc > cmdtp->maxargs)
+               rc = CMD_RET_USAGE;
+
+#if defined(CONFIG_CMD_BOOTD)
+       /* avoid "bootd" recursion */
+       else if (cmdtp->cmd == do_bootd) {
+               if (flag & CMD_FLAG_BOOTD) {
+                       puts("'bootd' recursion detected\n");
+                       rc = CMD_RET_FAILURE;
+               } else {
+                       flag |= CMD_FLAG_BOOTD;
+               }
+       }
+#endif
+
+       /* If OK so far, then do the command */
+       if (!rc) {
+               rc = cmd_call(cmdtp, flag, argc, argv);
+               *repeatable &= cmdtp->repeatable;
+       }
+       if (rc == CMD_RET_USAGE)
+               rc = cmd_usage(cmdtp);
+       return rc;
+}