shell: Fix not able to auto complete commands with submenu prefix
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 7 Apr 2022 23:41:34 +0000 (16:41 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 15 May 2023 09:25:54 +0000 (14:55 +0530)
If the command was given with submenu prefix the code wasn't able to
detect the command to be able to generate the auto complete for its
arguments.

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

index b0d6949..a83e2bd 100644 (file)
@@ -910,6 +910,26 @@ static char **menu_completion(const struct bt_shell_menu_entry *entry,
        return matches;
 }
 
+static char **submenu_completion(const char *text, int argc, char *input_cmd)
+{
+       const struct bt_shell_menu *menu;
+       char *cmd;
+
+       if (data.main != data.menu)
+               return NULL;
+
+       cmd = strrchr(input_cmd, '.');
+       if (!cmd)
+               return NULL;
+
+       menu = find_menu(input_cmd, cmd - input_cmd, NULL);
+       if (!menu)
+               return NULL;
+
+       return menu_completion(menu->entries, text, argc,
+                               input_cmd + strlen(menu->name) + 1);
+}
+
 static char **shell_completion(const char *text, int start, int end)
 {
        char **matches = NULL;
@@ -927,10 +947,14 @@ static char **shell_completion(const char *text, int start, int end)
 
                matches = menu_completion(default_menu, text, w.we_wordc,
                                                        w.we_wordv[0]);
-               if (!matches)
+               if (!matches) {
                        matches = menu_completion(data.menu->entries, text,
                                                        w.we_wordc,
                                                        w.we_wordv[0]);
+                       if (!matches)
+                               matches = submenu_completion(text, w.we_wordc,
+                                                               w.we_wordv[0]);
+               }
 
                wordfree(&w);
        } else {