Global variable *mon_cmds and *info_cmds are not directly used any more, *cur_mon is not used in completion related functions. It is possible to create a monitor with different command table now, but that requirement do not exist yet, so not changed it to save trouble. Log command is still a special case now, may be it can be converted as sub group later.
Patch 1-3 make sure the functions can be re-entered safely. V2: General: To discard *info_comds more graceful, help related function is modified to support sub command too. Patch 6/7 are added to improve help related functions. Patch 5: not directly return to make sure args are freed. Address Luiz's comments: Split patch into small series. struct mon_cmd_t was not moved into header file, instead mon_cmnd_t *cmd_table is added as a member in struct Monitor. 5/7: drop original code comments for "info" in monitor_find_completion(). v3: 5/7: add parameter **args_cmdline in parse_cmdline() to tell next valid parameter's position. This fix the issue in case command length in input is not equal to its name's length such as "help|?", and the case input start with space such as " s". 7/7: better commit message. v4: Address Eric's comments: 1/7, 2/7, 4/7: better commit title and message. 1/7 remove useless (char *) in old code, add space around "for ()" in old code. 3/7: separate code moving patch before usage. 4/7: add space around "for ()" in old code, add min(nb_args, MAX_ARGS) in free to make code stronger. Wenchao Xia (7): 1 monitor: avoid direct use of global *cur_mon in completion functions 2 monitor: avoid direct use of global variable *mon_cmds 3 monitor: code move for parse_cmdline() 4 monitor: avoid direct use of global *info_cmds in help functions 5 monitor: support sub commands in auto completion 6 monitor: improve "help" in auto completion for sub command 7 monitor: improve "help" to allow show details of single command in sub group hmp-commands.hx | 2 +- include/monitor/readline.h | 3 +- monitor.c | 387 ++++++++++++++++++++++++++++---------------- readline.c | 5 +- 4 files changed, 254 insertions(+), 143 deletions(-)