gdb: sim: add command line completion

For now, only the sub-command name is completed.  No support yet for
completing options to that command.  But even this is a huge step as
currently, nothing is completed, and the basic "help sim" is fairly
obtuse as to what exactly the "sim" command accepts.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Mike Frysinger 2011-04-15 03:43:46 +00:00
parent d2cfa400a1
commit 56a9aa1d10
6 changed files with 86 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2011-04-14 Mike Frysinger <vapier@gentoo.org>
* remote-sim.c (sim_command_completer): New function.
(_initialize_remote_sim): Set completer to sim_command_completer.
2011-04-13 Thiago Jung Bauermann <bauerman@br.ibm.com>
* breakpoint.c (print_exception_catchpoint): Rename to ...

View File

@ -1193,6 +1193,18 @@ simulator_command (char *args, int from_tty)
registers_changed ();
}
static char **
sim_command_completer (struct cmd_list_element *ignore, char *text, char *word)
{
struct sim_inferior_data *sim_data;
sim_data = inferior_data (current_inferior (), sim_inferior_data_key);
if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
return NULL;
return sim_complete_command (sim_data->gdbsim_desc, text, word);
}
/* Check to see if a thread is still alive. */
static int
@ -1287,11 +1299,14 @@ init_gdbsim_ops (void)
void
_initialize_remote_sim (void)
{
struct cmd_list_element *c;
init_gdbsim_ops ();
add_target (&gdbsim_ops);
add_com ("sim", class_obscure, simulator_command,
_("Send a command to the simulator."));
c = add_com ("sim", class_obscure, simulator_command,
_("Send a command to the simulator."));
set_cmd_completer (c, sim_command_completer);
sim_inferior_data_key
= register_inferior_data_with_cleanup (sim_inferior_data_cleanup);

View File

@ -1,3 +1,7 @@
2011-04-14 Mike Frysinger <vapier@gentoo.org>
* remote-sim.h (sim_complete_command): New prototype.
2011-03-05 Mike Frysinger <vapier@gentoo.org>
* sim-bfin.h: New file.

View File

@ -276,6 +276,10 @@ void sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc);
void sim_do_command (SIM_DESC sd, char *cmd);
/* Complete a command based on the available sim commands. Returns an
array of possible matches. */
char **sim_complete_command (SIM_DESC sd, char *text, char *word);
#ifdef __cplusplus
}
#endif

View File

@ -1,3 +1,8 @@
2011-04-14 Mike Frysinger <vapier@gentoo.org>
* sim-options.c (complete_option_list, sim_complete_command):
New functions.
2011-04-02 Mike Frysinger <vapier@gentoo.org>
* dv-glue.c: Fix up style.

View File

@ -915,6 +915,57 @@ find_match (SIM_DESC sd, sim_cpu *cpu, char *argv[], int *pargi)
return matching_opt;
}
static char **
complete_option_list (char **ret, size_t *cnt, const struct option_list *ol,
char *text, char *word)
{
const OPTION *opt = NULL;
int argi;
size_t len = strlen (word);
for ( ; ol != NULL; ol = ol->next)
for (opt = ol->options; OPTION_VALID_P (opt); ++opt)
{
const char *name = opt->opt.name;
/* A long option to match against? */
if (!name)
continue;
/* Does this option actually match? */
if (strncmp (name, word, len))
continue;
ret = xrealloc (ret, ++*cnt * sizeof (ret[0]));
ret[*cnt - 2] = xstrdup (name);
}
return ret;
}
/* All leading text is stored in @text, while the current word being
completed is stored in @word. Trailing text of @word is not. */
char **
sim_complete_command (SIM_DESC sd, char *text, char *word)
{
char **ret = NULL;
size_t cnt = 1;
sim_cpu *cpu;
/* Only complete first word for now. */
if (text != word)
return ret;
cpu = STATE_CPU (sd, 0);
if (cpu)
ret = complete_option_list (ret, &cnt, CPU_OPTIONS (cpu), text, word);
ret = complete_option_list (ret, &cnt, STATE_OPTIONS (sd), text, word);
if (ret)
ret[cnt - 1] = NULL;
return ret;
}
SIM_RC
sim_args_command (SIM_DESC sd, char *cmd)
{