Re: [PATCH] meshctl: Add commands autocompletion

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marcin,

On Thu, Sep 7, 2017 at 10:58 AM, Marcin Kraglak
<marcin.kraglak@xxxxxxxxx> wrote:
> ---
>  mesh/main.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>  mesh/util.c |  5 +++++
>  mesh/util.h |  1 +
>  3 files changed, 48 insertions(+)
>
> diff --git a/mesh/main.c b/mesh/main.c
> index 42506a6..c4ede8b 100644
> --- a/mesh/main.c
> +++ b/mesh/main.c
> @@ -1985,6 +1985,47 @@ static const struct menu_entry meshctl_cmd_table[] = {
>         { }
>  };
>
> +static char *cmd_generator(const char *text, int state)
> +{
> +       struct menu_entry *cmd_table;
> +       static int index, len;
> +       const char *cmd;
> +
> +       cmd_table = get_current_cmd_table();
> +       if (!cmd_table)
> +               return NULL;
> +
> +       if (!state) {
> +               index = 0;
> +               len = strlen(text);
> +       }
> +
> +       while ((cmd = cmd_table[index].cmd)) {
> +               index++;
> +
> +               if (!strncmp(cmd, text, len))
> +                       return strdup(cmd);
> +       }
> +
> +       return NULL;
> +}
> +
> +static char **cmd_completion(const char *text, int start, int end)
> +{
> +       char **matches = NULL;
> +
> +       if (start > 0)
> +               goto done;
> +
> +       matches = rl_completion_matches(text, cmd_generator);
> +
> +done:
> +       if (!matches)
> +               rl_attempted_completion_over = 1;
> +
> +       return matches;
> +}
> +
>  static void rl_handler(char *input)
>  {
>         char *cmd, *arg;
> @@ -2214,6 +2255,7 @@ int main(int argc, char *argv[])
>         dbus_conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);
>
>         setlinebuf(stdout);
> +       rl_attempted_completion_function = cmd_completion;
>
>         rl_erase_empty_line = 1;
>         rl_callback_handler_install(NULL, rl_handler);
> diff --git a/mesh/util.c b/mesh/util.c
> index fac4bab..139b1cd 100644
> --- a/mesh/util.c
> +++ b/mesh/util.c
> @@ -191,6 +191,11 @@ void print_cmd_menu(const struct menu_entry *cmd_table)
>
>  }
>
> +struct menu_entry *get_current_cmd_table(void)
> +{
> +       return current_cmd_table;
> +}
> +
>  void cmd_menu_cleanup(void)
>  {
>         main_cmd_table = NULL;
> diff --git a/mesh/util.h b/mesh/util.h
> index 7f729ab..ba226df 100644
> --- a/mesh/util.h
> +++ b/mesh/util.h
> @@ -41,6 +41,7 @@ bool switch_cmd_menu(const char *name);
>  void set_menu_prompt(const char *prefix, const char * node);
>  void process_menu_cmd(const char *cmd, const char *arg);
>  void print_cmd_menu(const struct menu_entry *cmd_table);
> +struct menu_entry *get_current_cmd_table(void);
>  void cmd_menu_cleanup(void);
>  void print_byte_array(const char *prefix, const void *ptr, int len);
>  bool str2hex(const char *str, uint16_t in_len, uint8_t *out_buf,
> --
> 2.9.3

It might be better if we move the menu setup to src/shared and ensure
both bluetoothctl and meshctl use the same codebase so we avoid having
to duplicate this for every new command line tool.

-- 
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



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux