shell: Fix not being able to auto complete submenus
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 7 Apr 2022 23:19:26 +0000 (16:19 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 15 May 2023 09:25:54 +0000 (14:55 +0530)
submenus should be part of the list of possible auto completes just as
other commands.

Signed-off-by: Manika Shrivastava <manika.sh@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
src/shared/shell.c

index 94e9f56..b0d6949 100644 (file)
@@ -138,14 +138,22 @@ static void cmd_help(int argc, char *argv[])
        return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
-static const struct bt_shell_menu *find_menu(const char *name, size_t len)
+static const struct bt_shell_menu *find_menu(const char *name, size_t len,
+                                                       int *index)
 {
        const struct queue_entry *entry;
+       int i;
 
-       for (entry = queue_get_entries(data.submenus); entry;
-                                               entry = entry->next) {
+       for (i = 0, entry = queue_get_entries(data.submenus); entry;
+                                               entry = entry->next, i++) {
                struct bt_shell_menu *menu = entry->data;
 
+               if (index) {
+                       if (i < *index)
+                               continue;
+                       (*index)++;
+               }
+
                if (!strncmp(menu->name, name, len))
                        return menu;
        }
@@ -187,7 +195,7 @@ static void cmd_menu(int argc, char *argv[])
                return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
-       menu = find_menu(argv[1], strlen(argv[1]));
+       menu = find_menu(argv[1], strlen(argv[1]), NULL);
        if (!menu) {
                bt_shell_printf("Unable find menu with name: %s\n", argv[1]);
                return bt_shell_noninteractive_quit(EXIT_FAILURE);
@@ -484,7 +492,7 @@ static int submenu_exec(int argc, char *argv[])
        len = name - argv[0];
        name[0] = '\0';
 
-       submenu = find_menu(argv[0], strlen(argv[0]));
+       submenu = find_menu(argv[0], strlen(argv[0]), NULL);
        if (!submenu)
                return -ENOENT;
 
@@ -734,7 +742,7 @@ static char *find_cmd(const char *text,
 static char *cmd_generator(const char *text, int state)
 {
        static int index;
-       static bool default_menu_enabled, submenu_enabled;
+       static bool default_menu_enabled, menu_enabled, submenu_enabled;
        static const struct bt_shell_menu *menu;
        char *cmd;
 
@@ -753,9 +761,22 @@ static char *cmd_generator(const char *text, int state)
                        index = 0;
                        menu = data.menu;
                        default_menu_enabled = false;
+
+                       if (data.main == data.menu)
+                               menu_enabled = true;
                }
        }
 
+       if (menu_enabled) {
+               menu = find_menu(text, strlen(text), &index);
+               if (menu)
+                       return strdup(menu->name);
+
+               index = 0;
+               menu = data.menu;
+               menu_enabled = false;
+       }
+
        if (!submenu_enabled) {
                cmd = find_cmd(text, menu->entries, &index);
                if (cmd || menu != data.main)
@@ -765,7 +786,7 @@ static char *cmd_generator(const char *text, int state)
                if (!cmd)
                        return NULL;
 
-               menu = find_menu(text, cmd - text);
+               menu = find_menu(text, cmd - text, NULL);
                if (!menu)
                        return NULL;