Hi Marcel, On Mon, Nov 6, 2017 at 3:52 PM, Marcel Holtmann <marcel@xxxxxxxxxxxx> wrote: > Hi Luiz, > >>>>>>>> +#ifdef HAVE_CONFIG_H >>>>>>>> +#include <config.h> >>>>>>>> +#endif >>>>>>>> + >>>>>>>> +#include <stdio.h> >>>>>>>> +#include "src/shared/util.h" >>>>>>>> +#include "src/shared/queue.h" >>>>>>>> +#include "src/shared/bt_shell.h" >>>>>>>> + >>>>>>>> +#define CMD_LENGTH 48 >>>>>>>> + >>>>>>>> +static struct { >>>>>>>> + const struct bt_shell_menu_entry *current; >>>>>>>> +} bt_shell_data; >>>>>>>> + >>>>>>>> +bool bt_shell_init(const struct bt_shell_menu_entry *menu) >>>>>>>> +{ >>>>>>>> + if (bt_shell_data.current || !menu) >>>>>>>> + return false; >>>>>>>> + >>>>>>>> + bt_shell_data.current = menu; >>>>>>>> + >>>>>>>> + return true; >>>>>>>> +} >>>>>>>> + >>>>>>>> +void bt_shell_cleanup(void) >>>>>>>> +{ >>>>>>>> + bt_shell_data.current = NULL; >>>>>>>> +} >>>>>>>> + >>>>>>>> +void bt_shell_process(const char *cmd, const char *arg) >>>>>>>> +{ >>>>>>>> + const struct bt_shell_menu_entry *entry; >>>>>>>> + >>>>>>>> + if (!bt_shell_data.current || !cmd) >>>>>>>> + return; >>>>>>>> + >>>>>>>> + for (entry = bt_shell_data.current; entry->cmd; >>>>>>>> entry++) { >>>>>>>> + if (strcmp(cmd, entry->cmd)) >>>>>>>> + continue; >>>>>>>> + >>>>>>>> + if (entry->func) { >>>>>>>> + entry->func(arg); >>>>>>>> + return; >>>>>>>> + } >>>>>>>> + } >>>>>>>> + >>>>>>>> + if (strcmp(cmd, "help")) { >>>>>>>> + printf("Invalid command\n"); >>>>>>>> + return; >>>>>>>> + } >>>>>>>> + >>>>>>>> + bt_shell_print_menu(); >>>>>>>> +} >>>>>>>> + >>>>>>>> +void bt_shell_print_menu(void) >>>>>>>> +{ >>>>>>>> + const struct bt_shell_menu_entry *entry; >>>>>>>> + >>>>>>>> + if (!bt_shell_data.current) >>>>>>>> + return; >>>>>>>> + >>>>>>>> + printf("Available commands:\n"); >>>>>>>> + for (entry = bt_shell_data.current; entry->cmd; >>>>>>>> entry++) { >>>>>>>> + printf(" %s %-*s %s\n", entry->cmd, >>>>>>>> + (int)(CMD_LENGTH - >>>>>>>> strlen(entry->cmd)), >>>>>>>> + entry->arg ? : "", >>>>>>>> entry->desc ? : ""); >>>>>>> >>>>>>> >>>>>>> I think that it is better to >>>>>>> - add some white-spaces >>>>>>> or >>>>>>> - add a new line >>>>>>> between the argument string and the description string, because >>>>>>> it is a little >>>>>>> difficult for the help of register-characteristic to read as >>>>>>> below: >>>>>>> >>>>>>> [bluetooth]# help >>>>>>> Available commands: >>>>>>> ... >>>>>>> unregister-service >>>>>>> <UUID/object> Unregister application service >>>>>>> register-characteristic <UUID> <Flags=read,write,notify...> >>>>>>> Register application characteristic >>>>>>> unregister-characteristic >>>>>>> <UUID/object> Unregister application characteristic >>>>>>> register-descriptor <UUID> <Flags=read,write...> Register >>>>>>> application descriptor >>>>>> >>>>>> It should probably have the same formatting as bluetoothctl: >>>>>> >>>>>> https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/client/ma >>>>>> in.c#n2677 >>>>>> >>>>>> -- >>>>>> Luiz Augusto von Dentz >>>>> >>>>> Yes, I'll correct it >>>> >>>> Are you still working on this? >>>> >>> No, unfortunatelly I don't have enough time to finish it. >> >> Ok, so I will start working on it myself. > > just a side note, lets do src/shared/shell.[ch] and not start with bt_ prefixes in file names. Yep, Ive just did that. Ive also started replacing GChannel usage to struct io, etc, and moved the whole rl_handler into the shell so it will automatically setup the readline internals so in the future all we have to do to replace readline is to rework the internals of bt_shell. > Regards > > Marcel > -- 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