common: command: Fix command auto-completion
authorBoris Brezillon <boris.brezillon@bootlin.com>
Mon, 3 Dec 2018 21:54:18 +0000 (22:54 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 15 Jan 2019 20:28:53 +0000 (15:28 -0500)
When auto-completing command arguments, the last argument is not
necessarily the one we need to auto-complete. When the last character is
a space, a tab or '\0' what we want instead is list all possible values,
or if there's only one possible value, place this value on the command
line instead of trying to suffix the last valid argument with missing
chars.

Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
common/command.c

index 2433a89e0a8e10f3098eb453e25db33f574436f5..435824356b5032a6dcf416e4008f3315532ba242 100644 (file)
@@ -362,13 +362,21 @@ int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp)
        sep = NULL;
        seplen = 0;
        if (i == 1) { /* one match; perfect */
-               k = strlen(argv[argc - 1]);
+               if (last_char != '\0' && !isblank(last_char))
+                       k = strlen(argv[argc - 1]);
+               else
+                       k = 0;
+
                s = cmdv[0] + k;
                len = strlen(s);
                sep = " ";
                seplen = 1;
        } else if (i > 1 && (j = find_common_prefix(cmdv)) != 0) { /* more */
-               k = strlen(argv[argc - 1]);
+               if (last_char != '\0' && !isblank(last_char))
+                       k = strlen(argv[argc - 1]);
+               else
+                       k = 0;
+
                j -= k;
                if (j > 0) {
                        s = cmdv[0] + k;