gdb: sim: add command line completion
authorMike Frysinger <vapier@gentoo.org>
Fri, 15 Apr 2011 03:43:46 +0000 (03:43 +0000)
committerMike Frysinger <vapier@gentoo.org>
Fri, 15 Apr 2011 03:43:46 +0000 (03:43 +0000)
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>
gdb/ChangeLog
gdb/remote-sim.c
include/gdb/ChangeLog
include/gdb/remote-sim.h
sim/common/ChangeLog
sim/common/sim-options.c

index 5796795cc56688bda6501e9bea32cd0ac746ed9e..5398e1c00ddcb3e106599236f6b6e2af22fe7c36 100644 (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 ...
index baaf4397a422fe85d12c5c554ba74ea016174a6b..bf4e0ee715eb21f842393c5dad76b2500c586743 100644 (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);
index 8b31e114759d35e7012a967bec132b76484c695b..dabaa5b19e0df8d455a06761d7b93424c40bcd16 100644 (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.
index a171cfda5b3ec30d76e883f0ac69eda5211f9df1..5f6000d83df1073944411e119cdc42c5ec48b84d 100644 (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
index 6c236f51dbae59141f8512af21f346018f42013b..25e758ba7bd542f2bf75e5f41c403abc068afc39 100644 (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.
index 0b4d4eee6de2e9dc95cd1c27c4558feb0f271dfb..ee8a8ec69ce338189eeada609468aedca0705b80 100644 (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)
 {