Create a single cmd_call() function to handle command execution
[oweals/u-boot.git] / common / command.c
index ef4a081109d3c6155f0692c20d9c0278abef936f..fe290759cd06d871bd6779585e4c4d2c7ecadd45 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);
 
@@ -162,18 +163,17 @@ int cmd_usage(cmd_tbl_t *cmdtp)
 
 int var_complete(int argc, char * const argv[], char last_char, int maxv, char *cmdv[])
 {
-#if 0 /* need to reimplement */
        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);
 
        if (!space && argc == 2)
                return env_complete(argv[1], maxv, cmdv, sizeof(tmp_buf), tmp_buf);
-#endif
+
        return 0;
 }
 
@@ -207,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;
@@ -258,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       */
@@ -267,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       */
@@ -475,8 +475,36 @@ 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_...)
+ */
+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;
+}