Pass the whole commandline.
[gdbmicli.git] / main.c
diff --git a/main.c b/main.c
index 040c6f1..2980031 100644 (file)
--- a/main.c
+++ b/main.c
@@ -349,58 +349,42 @@ completion_entry_function (const char *text, int matches)
     gdb_assert_not_reached ("too many matches");
 }
 
+extern char **mi_gdb_argv;
+extern void (*mi_gdb_start_hook) (mi_h *h);
+
+static void
+start_hook (mi_h *h)
+{
+  on_exit (h_disconnect, h);
+  mi_set_console_cb (h, console_cb, NULL);
+//  mi_set_to_gdb_cb (h, to_gdb_cb, NULL);
+//  mi_set_from_gdb_cb (h, from_gdb_cb, NULL);
+}
+
 int
 main (int argc, char **argv)
 {
   mi_h *h;
-  char *cmd;
-  const char *ex[argc], *arg_file = NULL, *arg_core = NULL, *arg_pid = NULL;
-  unsigned ex_count = 0, ex_used = 0;
+  mi_output *res;
 
   setbuf (stdout, NULL);
 
-  while (*++argv != NULL)
-    {
-      if (strcmp (*argv, "-ex") == 0 && argv[1] != NULL)
-       ex[ex_count++] = *++argv;
-      else if (strcmp (*argv, "-c") == 0 && argv[1] != NULL)
-       arg_core = *++argv;
-      else if (strncmp (*argv, "--core=", strlen ("--core=")) == 0)
-       arg_core = xstrdup (&(*argv)[strlen ("--core=")]);
-      else if (strcmp (*argv, "-p") == 0 && argv[1] != NULL)
-       arg_pid = *++argv;
-      else if (strncmp (*argv, "--pid=", strlen ("--pid=")) == 0)
-       arg_pid = xstrdup (&(*argv)[strlen ("--pid=")]);
-      else if (arg_file == NULL)
-       arg_file = *argv;
-      else if (arg_core == NULL && arg_pid == NULL)
-       {
-         char *end = NULL;
-
-         strtol (*argv, &end, 0);
-         if (isdigit ((*argv)[0]) && (end == NULL || *end == '\0'))
-           arg_pid = *argv;
-         else
-           arg_core = *argv;
-       }
-      else
-       fatal (_("Excess command line argument: %s"), *argv);
-    }
-  if (arg_core != NULL && arg_pid != NULL)
-    fatal (_("Can't attach to process and specify a core file "
-            "at the same time."));
+  mi_gdb_argv = xmalloc ((argc + 2) * sizeof (*mi_gdb_argv));
+  memcpy (&mi_gdb_argv[2], &argv[1], argc * sizeof (*mi_gdb_argv));
+  mi_gdb_argv[0] = "gdb";
+  mi_gdb_argv[1] = "--interpreter=mi";
 
-  mi_set_workaround (MI_PSYM_SEARCH, 0);
+  mi_gdb_start_hook = start_hook;
 
   h = mi_connect_local ();
   if (h == NULL)
     fatal ("Cannot connect to GDB");
 
-  on_exit (h_disconnect, h);
-
-  mi_set_console_cb (h, console_cb, NULL);
-//  mi_set_to_gdb_cb (h, to_gdb_cb, NULL);
-//  mi_set_from_gdb_cb (h, from_gdb_cb, NULL);
+  /* First eat the prompt.  Then run empty command so that additional results
+     from -ex or -x during mi_connect_local are flushed.  */
+  res = mi_get_response_blk (h);
+  gdb_assert (res == NULL);
+  default_command (h, "echo");
 
   completion_entry_function_h = h;
   rl_completion_entry_function = completion_entry_function;
@@ -420,31 +404,13 @@ main (int argc, char **argv)
 
   for (;;)
     {
-      if (ex_used < ex_count)
-       cmd = xstrdup (ex[ex_used++]);
-      else if (arg_file != NULL)
-       {
-         cmd = xstrprintf ("file %s", arg_file);
-         arg_file = NULL;
-       }
-      else if (arg_core != NULL)
-       {
-         cmd = xstrprintf ("core-file %s", arg_core);
-         arg_core = NULL;
-       }
-      else if (arg_pid != NULL)
-       {
-         cmd = xstrprintf ("attach %s", arg_pid);
-         arg_pid = NULL;
-       }
+      char *cmd = readline ("(gdb) ");
+
+      if (cmd == NULL)
+       cmd = xstrdup ("quit");
       else
-       {
-         cmd = readline ("(gdb) ");
-         if (cmd == NULL)
-           cmd = xstrdup ("quit");
-         else
-           add_history (cmd);
-       }
+       add_history (cmd);
+
       executecommand (h, cmd);
       xfree (cmd);
     }