New cli-utils.h/.c function extract_info_print_args
[deliverable/binutils-gdb.git] / gdb / cli / cli-interp.c
index 3e6a2fdb97b65a780abb1e1f3620589a120e5d9e..75d80933c99b2a9fc2b72f98bf801f8ae999b774 100644 (file)
@@ -1,6 +1,6 @@
 /* CLI Definitions for GDB, the GNU debugger.
 
-   Copyright (C) 2002-2016 Free Software Foundation, Inc.
+   Copyright (C) 2002-2018 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "top.h"               /* for "execute_command" */
 #include "event-top.h"
 #include "infrun.h"
-#include "observer.h"
+#include "observable.h"
 #include "gdbthread.h"
 #include "thread-fsm.h"
+#include "inferior.h"
+
+cli_interp_base::cli_interp_base (const char *name)
+  : interp (name)
+{}
+
+cli_interp_base::~cli_interp_base ()
+{}
 
 /* The console interpreter.  */
-struct cli_interp
+
+class cli_interp final : public cli_interp_base
 {
+ public:
+  explicit cli_interp (const char *name);
+  ~cli_interp ();
+
+  void init (bool top_level) override;
+  void resume () override;
+  void suspend () override;
+  gdb_exception exec (const char *command_str) override;
+  ui_out *interp_ui_out () override;
+
   /* The ui_out for the console interpreter.  */
   cli_ui_out *cli_uiout;
 };
 
+cli_interp::cli_interp (const char *name)
+  : cli_interp_base (name)
+{
+  /* Create a default uiout builder for the CLI.  */
+  this->cli_uiout = cli_out_new (gdb_stdout);
+}
+
+cli_interp::~cli_interp ()
+{
+  delete cli_uiout;
+}
+
 /* Suppress notification struct.  */
 struct cli_suppress_notification cli_suppress_notification =
   {
@@ -49,14 +80,12 @@ struct cli_suppress_notification cli_suppress_notification =
 static struct cli_interp *
 as_cli_interp (struct interp *interp)
 {
-  if (strcmp (interp_name (interp), INTERP_CONSOLE) == 0)
-    return (struct cli_interp *) interp_data (interp);
-  return NULL;
+  return dynamic_cast<cli_interp *> (interp);
 }
 
 /* Longjmp-safe wrapper for "execute_command".  */
 static struct gdb_exception safe_execute_command (struct ui_out *uiout,
-                                                 char *command, 
+                                                 const char *command, 
                                                  int from_tty);
 
 /* See cli-interp.h.
@@ -255,24 +284,23 @@ cli_on_user_selected_context_changed (user_selected_what selection)
 /* pre_command_loop implementation.  */
 
 void
-cli_interpreter_pre_command_loop (struct interp *self)
+cli_interp_base::pre_command_loop ()
 {
   display_gdb_prompt (0);
 }
 
 /* These implement the cli out interpreter: */
 
-static void *
-cli_interpreter_init (struct interp *self, int top_level)
+void
+cli_interp::init (bool top_level)
 {
-  return interp_data (self);
 }
 
-static int
-cli_interpreter_resume (void *data)
+void
+cli_interp::resume ()
 {
   struct ui *ui = current_ui;
-  struct cli_interp *cli = (struct cli_interp *) data;
+  struct cli_interp *cli = this;
   struct ui_file *stream;
 
   /*sync_execution = 1; */
@@ -294,29 +322,21 @@ cli_interpreter_resume (void *data)
 
   if (stream != NULL)
     cli->cli_uiout->set_stream (gdb_stdout);
-
-  return 1;
 }
 
-static int
-cli_interpreter_suspend (void *data)
+void
+cli_interp::suspend ()
 {
   gdb_disable_readline ();
-  return 1;
 }
 
-static struct gdb_exception
-cli_interpreter_exec (void *data, const char *command_str)
+gdb_exception
+cli_interp::exec (const char *command_str)
 {
-  struct cli_interp *cli = (struct cli_interp *) data;
+  struct cli_interp *cli = this;
   struct ui_file *old_stream;
   struct gdb_exception result;
 
-  /* FIXME: cagney/2003-02-01: Need to const char *propogate
-     safe_execute_command.  */
-  char *str = (char *) alloca (strlen (command_str) + 1);
-  strcpy (str, command_str);
-
   /* gdb_stdout could change between the time cli_uiout was
      initialized and now.  Since we're probably using a different
      interpreter which has a new ui_file for gdb_stdout, use that one
@@ -325,26 +345,26 @@ cli_interpreter_exec (void *data, const char *command_str)
      It is important that it gets reset everytime, since the user
      could set gdb to use a different interpreter.  */
   old_stream = cli->cli_uiout->set_stream (gdb_stdout);
-  result = safe_execute_command (cli->cli_uiout, str, 1);
+  result = safe_execute_command (cli->cli_uiout, command_str, 1);
   cli->cli_uiout->set_stream (old_stream);
   return result;
 }
 
-int
-cli_interpreter_supports_command_editing (struct interp *interp)
+bool
+cli_interp_base::supports_command_editing ()
 {
-  return 1;
+  return true;
 }
 
 static struct gdb_exception
-safe_execute_command (struct ui_out *command_uiout, char *command, int from_tty)
+safe_execute_command (struct ui_out *command_uiout, const char *command,
+                     int from_tty)
 {
   struct gdb_exception e = exception_none;
-  struct ui_out *saved_uiout;
 
   /* Save and override the global ``struct ui_out'' builder.  */
-  saved_uiout = current_uiout;
-  current_uiout = command_uiout;
+  scoped_restore saved_uiout = make_scoped_restore (&current_uiout,
+                                                   command_uiout);
 
   TRY
     {
@@ -356,51 +376,85 @@ safe_execute_command (struct ui_out *command_uiout, char *command, int from_tty)
     }
   END_CATCH
 
-  /* Restore the global builder.  */
-  current_uiout = saved_uiout;
-
   /* FIXME: cagney/2005-01-13: This shouldn't be needed.  Instead the
      caller should print the exception.  */
   exception_print (gdb_stderr, e);
   return e;
 }
 
-static struct ui_out *
-cli_ui_out (struct interp *self)
+ui_out *
+cli_interp::interp_ui_out ()
 {
-  struct cli_interp *cli = (struct cli_interp *) interp_data (self);
+  struct cli_interp *cli = (struct cli_interp *) this;
 
   return cli->cli_uiout;
 }
 
-/* The CLI interpreter's vtable.  */
-
-static const struct interp_procs cli_interp_procs = {
-  cli_interpreter_init,                /* init_proc */
-  cli_interpreter_resume,      /* resume_proc */
-  cli_interpreter_suspend,     /* suspend_proc */
-  cli_interpreter_exec,                /* exec_proc */
-  cli_ui_out,                  /* ui_out_proc */
-  NULL,                        /* set_logging_proc */
-  cli_interpreter_pre_command_loop, /* pre_command_loop_proc */
-  cli_interpreter_supports_command_editing, /* supports_command_editing_proc */
+/* These hold the pushed copies of the gdb output files.
+   If NULL then nothing has yet been pushed.  */
+struct saved_output_files
+{
+  ui_file *out;
+  ui_file *err;
+  ui_file *log;
+  ui_file *targ;
+  ui_file *targerr;
 };
+static saved_output_files saved_output;
+
+/* See cli-interp.h.  */
+
+void
+cli_interp_base::set_logging (ui_file_up logfile, bool logging_redirect)
+{
+  if (logfile != NULL)
+    {
+      saved_output.out = gdb_stdout;
+      saved_output.err = gdb_stderr;
+      saved_output.log = gdb_stdlog;
+      saved_output.targ = gdb_stdtarg;
+      saved_output.targerr = gdb_stdtargerr;
+
+      /* A raw pointer since ownership is transferred to
+        gdb_stdout.  */
+      ui_file *output = make_logging_output (gdb_stdout,
+                                            std::move (logfile),
+                                            logging_redirect);
+      gdb_stdout = output;
+      gdb_stdlog = output;
+      gdb_stderr = output;
+      gdb_stdtarg = output;
+      gdb_stdtargerr = output;
+    }
+  else
+    {
+      /* Only delete one of the files -- they are all set to the same
+        value.  */
+      delete gdb_stdout;
+
+      gdb_stdout = saved_output.out;
+      gdb_stderr = saved_output.err;
+      gdb_stdlog = saved_output.log;
+      gdb_stdtarg = saved_output.targ;
+      gdb_stdtargerr = saved_output.targerr;
+
+      saved_output.out = NULL;
+      saved_output.err = NULL;
+      saved_output.log = NULL;
+      saved_output.targ = NULL;
+      saved_output.targerr = NULL;
+    }
+}
 
 /* Factory for CLI interpreters.  */
 
 static struct interp *
 cli_interp_factory (const char *name)
 {
-  struct cli_interp *cli = XNEW (struct cli_interp);
-
-  /* Create a default uiout builder for the CLI.  */
-  cli->cli_uiout = cli_out_new (gdb_stdout);
-
-  return interp_new (name, &cli_interp_procs, cli);
+  return new cli_interp (name);
 }
 
 /* Standard gdb initialization hook.  */
-extern initialize_file_ftype _initialize_cli_interp; /* -Wmissing-prototypes */
 
 void
 _initialize_cli_interp (void)
@@ -408,14 +462,14 @@ _initialize_cli_interp (void)
   interp_factory_register (INTERP_CONSOLE, cli_interp_factory);
 
   /* If changing this, remember to update tui-interp.c as well.  */
-  observer_attach_normal_stop (cli_on_normal_stop);
-  observer_attach_end_stepping_range (cli_on_end_stepping_range);
-  observer_attach_signal_received (cli_on_signal_received);
-  observer_attach_signal_exited (cli_on_signal_exited);
-  observer_attach_exited (cli_on_exited);
-  observer_attach_no_history (cli_on_no_history);
-  observer_attach_sync_execution_done (cli_on_sync_execution_done);
-  observer_attach_command_error (cli_on_command_error);
-  observer_attach_user_selected_context_changed
+  gdb::observers::normal_stop.attach (cli_on_normal_stop);
+  gdb::observers::end_stepping_range.attach (cli_on_end_stepping_range);
+  gdb::observers::signal_received.attach (cli_on_signal_received);
+  gdb::observers::signal_exited.attach (cli_on_signal_exited);
+  gdb::observers::exited.attach (cli_on_exited);
+  gdb::observers::no_history.attach (cli_on_no_history);
+  gdb::observers::sync_execution_done.attach (cli_on_sync_execution_done);
+  gdb::observers::command_error.attach (cli_on_command_error);
+  gdb::observers::user_selected_context_changed.attach
     (cli_on_user_selected_context_changed);
 }
This page took 0.027468 seconds and 4 git commands to generate.