Hi, On Thu, Mar 15, 2018 at 3:52 PM, Luiz Augusto von Dentz <luiz.dentz@xxxxxxxxx> wrote: > From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> > > This enables command generator to work with submenu commands like: > > [bluetooth]# advertise. > advertise.appearance advertise.manufacturer advertise.timeout > advertise.clear advertise.name advertise.tx-power > advertise.duration advertise.service advertise.uuids > > Note that by default submenus commands will not be shown until . is > present in the input, that way only one command list is active at time. > --- > src/shared/shell.c | 39 +++++++++++++++++++++++++++++++++------ > 1 file changed, 33 insertions(+), 6 deletions(-) > > diff --git a/src/shared/shell.c b/src/shared/shell.c > index 3b680d7b0..0a05b5215 100644 > --- a/src/shared/shell.c > +++ b/src/shared/shell.c > @@ -102,7 +102,7 @@ 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) > +static const struct bt_shell_menu *find_menu(const char *name, size_t len) > { > const struct queue_entry *entry; > > @@ -110,8 +110,10 @@ static const struct bt_shell_menu *find_menu(const char *name) > entry = entry->next) { > struct bt_shell_menu *menu = entry->data; > > - if (!strcmp(menu->name, name)) > + if (!strncmp(menu->name, name, len)) > return menu; > + > + > } > > return NULL; > @@ -151,7 +153,7 @@ static void cmd_menu(int argc, char *argv[]) > return bt_shell_noninteractive_quit(EXIT_FAILURE); > } > > - menu = find_menu(argv[1]); > + menu = find_menu(argv[1], strlen(argv[1])); > if (!menu) { > bt_shell_printf("Unable find menu with name: %s\n", argv[1]); > return bt_shell_noninteractive_quit(EXIT_FAILURE); > @@ -403,7 +405,7 @@ static int submenu_exec(int argc, char *argv[]) > len = name - argv[0]; > name[0] = '\0'; > > - submenu = find_menu(argv[0]); > + submenu = find_menu(argv[0], strlen(argv[0])); > if (!submenu) > return -ENOENT; > > @@ -601,12 +603,15 @@ static char *find_cmd(const char *text, > static char *cmd_generator(const char *text, int state) > { > static int index; > - static bool default_menu_enabled; > + static bool default_menu_enabled, submenu_enabled; > + static const struct bt_shell_menu *menu; > char *cmd; > > if (!state) { > index = 0; > + menu = NULL; > default_menu_enabled = true; > + submenu_enabled = false; > } > > if (default_menu_enabled) { > @@ -615,11 +620,33 @@ static char *cmd_generator(const char *text, int state) > return cmd; > } else { > index = 0; > + menu = data.menu; > default_menu_enabled = false; > } > } > > - return find_cmd(text, data.menu->entries, &index); > + if (!submenu_enabled) { > + cmd = find_cmd(text, menu->entries, &index); > + if (cmd || menu != data.main) > + return cmd; > + > + cmd = strrchr(text, '.'); > + if (!cmd) > + return NULL; > + > + menu = find_menu(text, cmd - text); > + if (!menu) > + return NULL; > + > + index = 0; > + submenu_enabled = true; > + } > + > + cmd = find_cmd(text + strlen(menu->name) + 1, menu->entries, &index); > + if (cmd) > + asprintf(&cmd, "%s.%s", menu->name, cmd); > + > + return cmd; > } > > static wordexp_t args; > -- > 2.14.3 Applied. -- Luiz Augusto von Dentz -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html