/* Top level stuff for GDB, the GNU debugger.

   Copyright (C) 1986-2022 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "gdbcmd.h"
#include "cli/cli-cmds.h"
#include "cli/cli-script.h"
#include "cli/cli-setshow.h"
#include "cli/cli-decode.h"
#include "symtab.h"
#include "inferior.h"
#include "infrun.h"
#include <signal.h>
#include "target.h"
#include "target-dcache.h"
#include "breakpoint.h"
#include "gdbtypes.h"
#include "expression.h"
#include "value.h"
#include "language.h"
#include "terminal.h"
#include "gdbsupport/job-control.h"
#include "annotate.h"
#include "completer.h"
#include "top.h"
#include "gdbsupport/version.h"
#include "serial.h"
#include "main.h"
#include "gdbsupport/event-loop.h"
#include "gdbthread.h"
#include "extension.h"
#include "interps.h"
#include "observable.h"
#include "maint.h"
#include "filenames.h"
#include "frame.h"
#include "gdbsupport/buffer.h"
#include "gdbsupport/gdb_select.h"
#include "gdbsupport/scope-exit.h"
#include "gdbarch.h"
#include "gdbsupport/pathstuff.h"
#include "cli/cli-style.h"
#include "pager.h"

/* readline include files.  */
#include "readline/readline.h"
#include "readline/history.h"

/* readline defines this.  */
#undef savestring

#include <sys/types.h>

#include "event-top.h"
#include <sys/stat.h>
#include <ctype.h>
#include "ui-out.h"
#include "cli-out.h"
#include "tracepoint.h"
#include "inf-loop.h"

#if defined(TUI)
# include "tui/tui.h"
#endif

#ifndef O_NOCTTY
# define O_NOCTTY 0
#endif

extern void initialize_all_files (void);

#define PROMPT(X) the_prompts.prompt_stack[the_prompts.top + X].prompt
#define PREFIX(X) the_prompts.prompt_stack[the_prompts.top + X].prefix
#define SUFFIX(X) the_prompts.prompt_stack[the_prompts.top + X].suffix

/* Default command line prompt.  This is overridden in some configs.  */

#ifndef DEFAULT_PROMPT
#define DEFAULT_PROMPT	"(gdb) "
#endif

struct ui_file **
current_ui_gdb_stdout_ptr ()
{
  return &current_ui->m_gdb_stdout;
}

struct ui_file **
current_ui_gdb_stdin_ptr ()
{
  return &current_ui->m_gdb_stdin;
}

struct ui_file **
current_ui_gdb_stderr_ptr ()
{
  return &current_ui->m_gdb_stderr;
}

struct ui_file **
current_ui_gdb_stdlog_ptr ()
{
  return &current_ui->m_gdb_stdlog;
}

struct ui_out **
current_ui_current_uiout_ptr ()
{
  return &current_ui->m_current_uiout;
}

int inhibit_gdbinit = 0;

/* Flag for whether we want to confirm potentially dangerous
   operations.  Default is yes.  */

bool confirm = true;

static void
show_confirm (struct ui_file *file, int from_tty,
	      struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("Whether to confirm potentially "
		      "dangerous operations is %s.\n"),
	      value);
}

/* The last command line executed on the console.  Used for command
   repetitions when the user enters an empty line.  */

static char *saved_command_line;

/* If not NULL, the arguments that should be passed if
   saved_command_line is repeated.  */

static const char *repeat_arguments;

/* The previous last command line executed on the console.  Used for command
   repetitions when a command wants to relaunch the previously launched
   command.  We need this as when a command is running, saved_command_line
   already contains the line of the currently executing command.  */

static char *previous_saved_command_line;

/* If not NULL, the arguments that should be passed if the
   previous_saved_command_line is repeated.  */

static const char *previous_repeat_arguments;

/* Nonzero if the current command is modified by "server ".  This
   affects things like recording into the command history, commands
   repeating on RETURN, etc.  This is so a user interface (emacs, GUI,
   whatever) can issue its own commands and also send along commands
   from the user, and have the user not notice that the user interface
   is issuing commands too.  */
bool server_command;

/* Timeout limit for response from target.  */

/* The default value has been changed many times over the years.  It
   was originally 5 seconds.  But that was thought to be a long time
   to sit and wait, so it was changed to 2 seconds.  That was thought
   to be plenty unless the connection was going through some terminal
   server or multiplexer or other form of hairy serial connection.

   In mid-1996, remote_timeout was moved from remote.c to top.c and
   it began being used in other remote-* targets.  It appears that the
   default was changed to 20 seconds at that time, perhaps because the
   Renesas E7000 ICE didn't always respond in a timely manner.

   But if 5 seconds is a long time to sit and wait for retransmissions,
   20 seconds is far worse.  This demonstrates the difficulty of using
   a single variable for all protocol timeouts.

   As remote.c is used much more than remote-e7000.c, it was changed
   back to 2 seconds in 1999.  */

int remote_timeout = 2;

/* Sbrk location on entry to main.  Used for statistics only.  */
#ifdef HAVE_USEFUL_SBRK
char *lim_at_start;
#endif

/* Hooks for alternate command interfaces.  */

/* This hook is called from within gdb's many mini-event loops which
   could steal control from a real user interface's event loop.  It
   returns non-zero if the user is requesting a detach, zero
   otherwise.  */

int (*deprecated_ui_loop_hook) (int);


/* Called from print_frame_info to list the line we stopped in.  */

void (*deprecated_print_frame_info_listing_hook) (struct symtab * s,
						  int line,
						  int stopline,
						  int noerror);
/* Replaces most of query.  */

int (*deprecated_query_hook) (const char *, va_list);

/* Replaces most of warning.  */

void (*deprecated_warning_hook) (const char *, va_list);

/* These three functions support getting lines of text from the user.
   They are used in sequence.  First deprecated_readline_begin_hook is
   called with a text string that might be (for example) a message for
   the user to type in a sequence of commands to be executed at a
   breakpoint.  If this function calls back to a GUI, it might take
   this opportunity to pop up a text interaction window with this
   message.  Next, deprecated_readline_hook is called with a prompt
   that is emitted prior to collecting the user input.  It can be
   called multiple times.  Finally, deprecated_readline_end_hook is
   called to notify the GUI that we are done with the interaction
   window and it can close it.  */

void (*deprecated_readline_begin_hook) (const char *, ...);
char *(*deprecated_readline_hook) (const char *);
void (*deprecated_readline_end_hook) (void);

/* Called as appropriate to notify the interface that we have attached
   to or detached from an already running process.  */

void (*deprecated_attach_hook) (void);
void (*deprecated_detach_hook) (void);

/* Used by UI as a wrapper around command execution.  May do various
   things like enabling/disabling buttons, etc...  */

void (*deprecated_call_command_hook) (struct cmd_list_element * c,
				      const char *cmd, int from_tty);

/* Called when the current thread changes.  Argument is thread id.  */

void (*deprecated_context_hook) (int id);

/* The highest UI number ever assigned.  */
static int highest_ui_num;

/* Unbuffer STREAM.  This is a wrapper around setbuf(STREAM, nullptr)
   which applies some special rules for MS-Windows hosts.  */

static void
unbuffer_stream (FILE *stream)
{
  /* Unbuffer the input stream so that in gdb_readline_no_editing_callback,
     the calls to fgetc fetch only one char at the time from STREAM.

     This is important because gdb_readline_no_editing_callback will read
     from STREAM up to the first '\n' character, after this GDB returns to
     the event loop and relies on a select on STREAM indicating that more
     input is pending.

     If STREAM is buffered then the fgetc calls may have moved all the
     pending input from the kernel into a local buffer, after which the
     select will not indicate that more input is pending, and input after
     the first '\n' will not be processed immediately.

     Please ensure that any changes in this area run the MI tests with the
     FORCE_SEPARATE_MI_TTY=1 flag being passed.  */

#ifdef __MINGW32__
  /* With MS-Windows runtime, making stdin unbuffered when it's
     connected to the terminal causes it to misbehave.  */
  if (!ISATTY (stream))
    setbuf (stream, nullptr);
#else
  /* On GNU/Linux the issues described above can impact GDB even when
     dealing with input from a terminal.  For now we unbuffer the input
     stream for everyone except MS-Windows.  */
  setbuf (stream, nullptr);
#endif
}

/* See top.h.  */

ui::ui (FILE *instream_, FILE *outstream_, FILE *errstream_)
  : next (nullptr),
    num (++highest_ui_num),
    call_readline (nullptr),
    input_handler (nullptr),
    command_editing (0),
    interp_info (nullptr),
    async (0),
    secondary_prompt_depth (0),
    stdin_stream (instream_),
    instream (instream_),
    outstream (outstream_),
    errstream (errstream_),
    input_fd (fileno (instream)),
    m_input_interactive_p (ISATTY (instream)),
    prompt_state (PROMPT_NEEDED),
    m_gdb_stdout (new pager_file (new stdio_file (outstream))),
    m_gdb_stdin (new stdio_file (instream)),
    m_gdb_stderr (new stderr_file (errstream)),
    m_gdb_stdlog (m_gdb_stderr),
    m_current_uiout (nullptr)
{
  buffer_init (&line_buffer);

  unbuffer_stream (instream_);

  if (ui_list == NULL)
    ui_list = this;
  else
    {
      struct ui *last;

      for (last = ui_list; last->next != NULL; last = last->next)
	;
      last->next = this;
    }
}

ui::~ui ()
{
  struct ui *ui, *uiprev;

  uiprev = NULL;

  for (ui = ui_list; ui != NULL; uiprev = ui, ui = ui->next)
    if (ui == this)
      break;

  gdb_assert (ui != NULL);

  if (uiprev != NULL)
    uiprev->next = next;
  else
    ui_list = next;

  delete m_gdb_stdin;
  delete m_gdb_stdout;
  delete m_gdb_stderr;
}

/* Open file named NAME for read/write, making sure not to make it the
   controlling terminal.  */

static gdb_file_up
open_terminal_stream (const char *name)
{
  scoped_fd fd = gdb_open_cloexec (name, O_RDWR | O_NOCTTY, 0);
  if (fd.get () < 0)
    perror_with_name  (_("opening terminal failed"));

  return fd.to_file ("w+");
}

/* Implementation of the "new-ui" command.  */

static void
new_ui_command (const char *args, int from_tty)
{
  int argc;
  const char *interpreter_name;
  const char *tty_name;

  dont_repeat ();

  gdb_argv argv (args);
  argc = argv.count ();

  if (argc < 2)
    error (_("Usage: new-ui INTERPRETER TTY"));

  interpreter_name = argv[0];
  tty_name = argv[1];

  {
    scoped_restore save_ui = make_scoped_restore (&current_ui);

    /* Open specified terminal.  Note: we used to open it three times,
       once for each of stdin/stdout/stderr, but that does not work
       with Windows named pipes.  */
    gdb_file_up stream = open_terminal_stream (tty_name);

    std::unique_ptr<ui> ui
      (new struct ui (stream.get (), stream.get (), stream.get ()));

    ui->async = 1;

    current_ui = ui.get ();

    set_top_level_interpreter (interpreter_name);

    interp_pre_command_loop (top_level_interpreter ());

    /* Make sure the file is not closed.  */
    stream.release ();

    ui.release ();
  }

  gdb_printf ("New UI allocated\n");
}

/* Handler for SIGHUP.  */

#ifdef SIGHUP
/* NOTE 1999-04-29: This function will be static again, once we modify
   gdb to use the event loop as the default command loop and we merge
   event-top.c into this file, top.c.  */
/* static */ void
quit_cover (void)
{
  /* Stop asking user for confirmation --- we're exiting.  This
     prevents asking the user dumb questions.  */
  confirm = 0;
  quit_command ((char *) 0, 0);
}
#endif /* defined SIGHUP */

/* Line number we are currently in, in a file which is being sourced.  */
/* NOTE 1999-04-29: This variable will be static again, once we modify
   gdb to use the event loop as the default command loop and we merge
   event-top.c into this file, top.c.  */
/* static */ int source_line_number;

/* Name of the file we are sourcing.  */
/* NOTE 1999-04-29: This variable will be static again, once we modify
   gdb to use the event loop as the default command loop and we merge
   event-top.c into this file, top.c.  */
/* static */ std::string source_file_name;

/* Read commands from STREAM.  */
void
read_command_file (FILE *stream)
{
  struct ui *ui = current_ui;

  unbuffer_stream (stream);

  scoped_restore save_instream
    = make_scoped_restore (&ui->instream, stream);

  /* Read commands from `instream' and execute them until end of file
     or error reading instream.  */

  while (ui->instream != NULL && !feof (ui->instream))
    {
      const char *command;

      /* Get a command-line.  This calls the readline package.  */
      command = command_line_input (NULL, NULL);
      if (command == NULL)
	break;
      command_handler (command);
    }
}

#ifdef __MSDOS__
static void
do_chdir_cleanup (void *old_dir)
{
  chdir ((const char *) old_dir);
  xfree (old_dir);
}
#endif

scoped_value_mark
prepare_execute_command ()
{
  /* With multiple threads running while the one we're examining is
     stopped, the dcache can get stale without us being able to detect
     it.  For the duration of the command, though, use the dcache to
     help things like backtrace.  */
  if (non_stop)
    target_dcache_invalidate ();

  return scoped_value_mark ();
}

/* Tell the user if the language has changed (except first time) after
   executing a command.  */

void
check_frame_language_change (void)
{
  static int warned = 0;
  struct frame_info *frame;

  /* First make sure that a new frame has been selected, in case the
     command or the hooks changed the program state.  */
  frame = deprecated_safe_get_selected_frame ();
  if (current_language != expected_language)
    {
      if (language_mode == language_mode_auto && info_verbose)
	{
	  /* Print what changed.  */
	  language_info ();
	}
      warned = 0;
    }

  /* Warn the user if the working language does not match the language
     of the current frame.  Only warn the user if we are actually
     running the program, i.e. there is a stack.  */
  /* FIXME: This should be cacheing the frame and only running when
     the frame changes.  */

  if (has_stack_frames ())
    {
      enum language flang;

      flang = get_frame_language (frame);
      if (!warned
	  && flang != language_unknown
	  && flang != current_language->la_language)
	{
	  gdb_printf ("%s\n", _(lang_frame_mismatch_warn));
	  warned = 1;
	}
    }
}

/* See top.h.  */

void
wait_sync_command_done (void)
{
  /* Processing events may change the current UI.  */
  scoped_restore save_ui = make_scoped_restore (&current_ui);
  struct ui *ui = current_ui;

  /* We're about to wait until the target stops after having resumed
     it so must force-commit resumptions, in case we're being called
     in some context where a scoped_disable_commit_resumed object is
     active.  I.e., this function is a commit-resumed sync/flush
     point.  */
  scoped_enable_commit_resumed enable ("sync wait");

  while (gdb_do_one_event () >= 0)
    if (ui->prompt_state != PROMPT_BLOCKED)
      break;
}

/* See top.h.  */

void
maybe_wait_sync_command_done (int was_sync)
{
  /* If the interpreter is in sync mode (we're running a user
     command's list, running command hooks or similars), and we
     just ran a synchronous command that started the target, wait
     for that command to end.  */
  if (!current_ui->async
      && !was_sync
      && current_ui->prompt_state == PROMPT_BLOCKED)
    wait_sync_command_done ();
}

/* See command.h.  */

void
set_repeat_arguments (const char *args)
{
  repeat_arguments = args;
}

/* Execute the line P as a command, in the current user context.
   Pass FROM_TTY as second argument to the defining function.  */

void
execute_command (const char *p, int from_tty)
{
  struct cmd_list_element *c;
  const char *line;
  const char *cmd_start = p;

  auto cleanup_if_error = make_scope_exit (bpstat_clear_actions);
  scoped_value_mark cleanup = prepare_execute_command ();

  /* This can happen when command_line_input hits end of file.  */
  if (p == NULL)
    {
      cleanup_if_error.release ();
      return;
    }

  target_log_command (p);

  while (*p == ' ' || *p == '\t')
    p++;
  if (*p)
    {
      const char *cmd = p;
      const char *arg;
      std::string default_args;
      std::string default_args_and_arg;
      int was_sync = current_ui->prompt_state == PROMPT_BLOCKED;

      line = p;

      /* If trace-commands is set then this will print this command.  */
      print_command_trace ("%s", p);

      c = lookup_cmd (&cmd, cmdlist, "", &default_args, 0, 1);
      p = cmd;

      scoped_restore save_repeat_args
	= make_scoped_restore (&repeat_arguments, nullptr);
      const char *args_pointer = p;

      if (!default_args.empty ())
	{
	  if (*p != '\0')
	    default_args_and_arg = default_args + ' ' + p;
	  else
	    default_args_and_arg = default_args;
	  arg = default_args_and_arg.c_str ();
	}
      else
	{
	  /* Pass null arg rather than an empty one.  */
	  arg = *p == '\0' ? nullptr : p;
	}

      /* FIXME: cagney/2002-02-02: The c->type test is pretty dodgy
	 while the is_complete_command(cfunc) test is just plain
	 bogus.  They should both be replaced by a test of the form
	 c->strip_trailing_white_space_p.  */
      /* NOTE: cagney/2002-02-02: The function.cfunc in the below
	 can't be replaced with func.  This is because it is the
	 cfunc, and not the func, that has the value that the
	 is_complete_command hack is testing for.  */
      /* Clear off trailing whitespace, except for set and complete
	 command.  */
      std::string without_whitespace;
      if (arg
	  && c->type != set_cmd
	  && !is_complete_command (c))
	{
	  const char *old_end = arg + strlen (arg) - 1;
	  p = old_end;
	  while (p >= arg && (*p == ' ' || *p == '\t'))
	    p--;
	  if (p != old_end)
	    {
	      without_whitespace = std::string (arg, p + 1);
	      arg = without_whitespace.c_str ();
	    }
	}

      /* If this command has been pre-hooked, run the hook first.  */
      execute_cmd_pre_hook (c);

      if (c->deprecated_warn_user)
	deprecated_cmd_warning (line, cmdlist);

      /* c->user_commands would be NULL in the case of a python command.  */
      if (c->theclass == class_user && c->user_commands)
	execute_user_command (c, arg);
      else if (c->theclass == class_user
	       && c->is_prefix () && !c->allow_unknown)
	/* If this is a user defined prefix that does not allow unknown
	   (in other words, C is a prefix command and not a command
	   that can be followed by its args), report the list of
	   subcommands.  */
	{
	  std::string prefixname = c->prefixname ();
          std::string prefixname_no_space
	    = prefixname.substr (0, prefixname.length () - 1);
	  gdb_printf
	    ("\"%s\" must be followed by the name of a subcommand.\n",
	     prefixname_no_space.c_str ());
	  help_list (*c->subcommands, prefixname.c_str (), all_commands,
		     gdb_stdout);
	}
      else if (c->type == set_cmd)
	do_set_command (arg, from_tty, c);
      else if (c->type == show_cmd)
	do_show_command (arg, from_tty, c);
      else if (c->is_command_class_help ())
	error (_("That is not a command, just a help topic."));
      else if (deprecated_call_command_hook)
	deprecated_call_command_hook (c, arg, from_tty);
      else
	cmd_func (c, arg, from_tty);

      maybe_wait_sync_command_done (was_sync);

      /* If this command has been post-hooked, run the hook last.  */
      execute_cmd_post_hook (c);

      if (repeat_arguments != NULL && cmd_start == saved_command_line)
	{
	  gdb_assert (strlen (args_pointer) >= strlen (repeat_arguments));
	  strcpy (saved_command_line + (args_pointer - cmd_start),
		  repeat_arguments);
	}
    }

  /* Only perform the frame-language-change check if the command
     we just finished executing did not resume the inferior's execution.
     If it did resume the inferior, we will do that check after
     the inferior stopped.  */
  if (has_stack_frames () && inferior_thread ()->state != THREAD_RUNNING)
    check_frame_language_change ();

  cleanup_if_error.release ();
}

/* See gdbcmd.h.  */

void
execute_fn_to_ui_file (struct ui_file *file, std::function<void(void)> fn)
{
  /* GDB_STDOUT should be better already restored during these
     restoration callbacks.  */
  set_batch_flag_and_restore_page_info save_page_info;

  scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);

  {
    current_uiout->redirect (file);
    ui_out_redirect_pop redirect_popper (current_uiout);

    scoped_restore save_stdout
      = make_scoped_restore (&gdb_stdout, file);
    scoped_restore save_stderr
      = make_scoped_restore (&gdb_stderr, file);
    scoped_restore save_stdlog
      = make_scoped_restore (&gdb_stdlog, file);
    scoped_restore save_stdtarg
      = make_scoped_restore (&gdb_stdtarg, file);
    scoped_restore save_stdtargerr
      = make_scoped_restore (&gdb_stdtargerr, file);

    fn ();
  }
}

/* See gdbcmd.h.  */

void
execute_fn_to_string (std::string &res, std::function<void(void)> fn,
		      bool term_out)
{
  string_file str_file (term_out);

  try
    {
      execute_fn_to_ui_file (&str_file, fn);
    }
  catch (...)
    {
      /* Finally.  */
      res = std::move (str_file.string ());
      throw;
    }

  /* And finally.  */
  res = std::move (str_file.string ());
}

/* See gdbcmd.h.  */

void
execute_command_to_ui_file (struct ui_file *file,
			    const char *p, int from_tty)
{
  execute_fn_to_ui_file (file, [=]() { execute_command (p, from_tty); });
}

/* See gdbcmd.h.  */

void
execute_command_to_string (std::string &res, const char *p, int from_tty,
			   bool term_out)
{
  execute_fn_to_string (res, [=]() { execute_command (p, from_tty); },
			term_out);
}

/* See gdbcmd.h.  */

void
execute_command_to_string (const char *p, int from_tty,
			   bool term_out)
{
  std::string dummy;
  execute_fn_to_string (dummy, [=]() { execute_command (p, from_tty); },
			term_out);
}

/* When nonzero, cause dont_repeat to do nothing.  This should only be
   set via prevent_dont_repeat.  */

static int suppress_dont_repeat = 0;

/* See command.h  */

void
dont_repeat (void)
{
  struct ui *ui = current_ui;

  if (suppress_dont_repeat || server_command)
    return;

  /* If we aren't reading from standard input, we are saving the last
     thing read from stdin in line and don't want to delete it.  Null
     lines won't repeat here in any case.  */
  if (ui->instream == ui->stdin_stream)
    {
      *saved_command_line = 0;
      repeat_arguments = NULL;
    }
}

/* See command.h  */

const char *
repeat_previous ()
{
  /* Do not repeat this command, as this command is a repeating command.  */
  dont_repeat ();

  /* We cannot free saved_command_line, as this line is being executed,
     so swap it with previous_saved_command_line.  */
  std::swap (previous_saved_command_line, saved_command_line);
  std::swap (previous_repeat_arguments, repeat_arguments);

  const char *prev = skip_spaces (get_saved_command_line ());
  if (*prev == '\0')
    error (_("No previous command to relaunch"));
  return prev;
}

/* See command.h.  */

scoped_restore_tmpl<int>
prevent_dont_repeat (void)
{
  return make_scoped_restore (&suppress_dont_repeat, 1);
}

/* See command.h.  */

char *
get_saved_command_line ()
{
  return saved_command_line;
}

/* See command.h.  */

void
save_command_line (const char *cmd)
{
  xfree (previous_saved_command_line);
  previous_saved_command_line = saved_command_line;
  previous_repeat_arguments = repeat_arguments;
  saved_command_line = xstrdup (cmd);
  repeat_arguments = NULL;
}


/* Read a line from the stream "instream" without command line editing.

   It prints PROMPT once at the start.
   Action is compatible with "readline", e.g. space for the result is
   malloc'd and should be freed by the caller.

   A NULL return means end of file.  */

static char *
gdb_readline_no_editing (const char *prompt)
{
  struct buffer line_buffer;
  struct ui *ui = current_ui;
  /* Read from stdin if we are executing a user defined command.  This
     is the right thing for prompt_for_continue, at least.  */
  FILE *stream = ui->instream != NULL ? ui->instream : stdin;
  int fd = fileno (stream);

  buffer_init (&line_buffer);

  if (prompt != NULL)
    {
      /* Don't use a _filtered function here.  It causes the assumed
	 character position to be off, since the newline we read from
	 the user is not accounted for.  */
      printf_unfiltered ("%s", prompt);
      gdb_flush (gdb_stdout);
    }

  while (1)
    {
      int c;
      fd_set readfds;

      QUIT;

      /* Wait until at least one byte of data is available.  Control-C
	 can interrupt interruptible_select, but not fgetc.  */
      FD_ZERO (&readfds);
      FD_SET (fd, &readfds);
      if (interruptible_select (fd + 1, &readfds, NULL, NULL, NULL) == -1)
	{
	  if (errno == EINTR)
	    {
	      /* If this was ctrl-c, the QUIT above handles it.  */
	      continue;
	    }
	  perror_with_name (("select"));
	}

      c = fgetc (stream);

      if (c == EOF)
	{
	  if (line_buffer.used_size > 0)
	    /* The last line does not end with a newline.  Return it, and
	       if we are called again fgetc will still return EOF and
	       we'll return NULL then.  */
	    break;
	  xfree (buffer_finish (&line_buffer));
	  return NULL;
	}

      if (c == '\n')
	{
	  if (line_buffer.used_size > 0
	      && line_buffer.buffer[line_buffer.used_size - 1] == '\r')
	    line_buffer.used_size--;
	  break;
	}

      buffer_grow_char (&line_buffer, c);
    }

  buffer_grow_char (&line_buffer, '\0');
  return buffer_finish (&line_buffer);
}

/* Variables which control command line editing and history
   substitution.  These variables are given default values at the end
   of this file.  */
static bool command_editing_p;

/* NOTE 1999-04-29: This variable will be static again, once we modify
   gdb to use the event loop as the default command loop and we merge
   event-top.c into this file, top.c.  */

/* static */ bool history_expansion_p;

/* Should we write out the command history on exit?  In order to write out
   the history both this flag must be true, and the history_filename
   variable must be set to something sensible.  */
static bool write_history_p;

/* The name of the file in which GDB history will be written.  If this is
   set to NULL, of the empty string then history will not be written.  */
static std::string history_filename;

/* Implement 'show history save'.  */
static void
show_write_history_p (struct ui_file *file, int from_tty,
		      struct cmd_list_element *c, const char *value)
{
  if (!write_history_p || !history_filename.empty ())
    gdb_printf (file, _("Saving of the history record on exit is %s.\n"),
		value);
  else
    gdb_printf (file, _("Saving of the history is disabled due to "
			"the value of 'history filename'.\n"));
}

/* The variable associated with the "set/show history size"
   command.  The value -1 means unlimited, and -2 means undefined.  */
static int history_size_setshow_var = -2;

static void
show_history_size (struct ui_file *file, int from_tty,
		   struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("The size of the command history is %s.\n"),
	      value);
}

/* Variable associated with the "history remove-duplicates" option.
   The value -1 means unlimited.  */
static int history_remove_duplicates = 0;

static void
show_history_remove_duplicates (struct ui_file *file, int from_tty,
				struct cmd_list_element *c, const char *value)
{
  gdb_printf (file,
	      _("The number of history entries to look back at for "
		"duplicates is %s.\n"),
	      value);
}

/* Implement 'show history filename'.  */
static void
show_history_filename (struct ui_file *file, int from_tty,
		       struct cmd_list_element *c, const char *value)
{
  if (!history_filename.empty ())
    gdb_printf (file, _("The filename in which to record "
			"the command history is \"%ps\".\n"),
		styled_string (file_name_style.style (), value));
  else
    gdb_printf (file, _("There is no filename currently set for "
			"recording the command history in.\n"));
}

/* This is like readline(), but it has some gdb-specific behavior.
   gdb may want readline in both the synchronous and async modes during
   a single gdb invocation.  At the ordinary top-level prompt we might
   be using the async readline.  That means we can't use
   rl_pre_input_hook, since it doesn't work properly in async mode.
   However, for a secondary prompt (" >", such as occurs during a
   `define'), gdb wants a synchronous response.

   We used to call readline() directly, running it in synchronous
   mode.  But mixing modes this way is not supported, and as of
   readline 5.x it no longer works; the arrow keys come unbound during
   the synchronous call.  So we make a nested call into the event
   loop.  That's what gdb_readline_wrapper is for.  */

/* A flag set as soon as gdb_readline_wrapper_line is called; we can't
   rely on gdb_readline_wrapper_result, which might still be NULL if
   the user types Control-D for EOF.  */
static int gdb_readline_wrapper_done;

/* The result of the current call to gdb_readline_wrapper, once a newline
   is seen.  */
static char *gdb_readline_wrapper_result;

/* Any intercepted hook.  Operate-and-get-next sets this, expecting it
   to be called after the newline is processed (which will redisplay
   the prompt).  But in gdb_readline_wrapper we will not get a new
   prompt until the next call, or until we return to the event loop.
   So we disable this hook around the newline and restore it before we
   return.  */
static void (*saved_after_char_processing_hook) (void);


/* See top.h.  */

int
gdb_in_secondary_prompt_p (struct ui *ui)
{
  return ui->secondary_prompt_depth > 0;
}


/* This function is called when readline has seen a complete line of
   text.  */

static void
gdb_readline_wrapper_line (gdb::unique_xmalloc_ptr<char> &&line)
{
  gdb_assert (!gdb_readline_wrapper_done);
  gdb_readline_wrapper_result = line.release ();
  gdb_readline_wrapper_done = 1;

  /* Prevent operate-and-get-next from acting too early.  */
  saved_after_char_processing_hook = after_char_processing_hook;
  after_char_processing_hook = NULL;

  /* Prevent parts of the prompt from being redisplayed if annotations
     are enabled, and readline's state getting out of sync.  We'll
     reinstall the callback handler, which puts the terminal in raw
     mode (or in readline lingo, in prepped state), when we're next
     ready to process user input, either in display_gdb_prompt, or if
     we're handling an asynchronous target event and running in the
     background, just before returning to the event loop to process
     further input (or more target events).  */
  if (current_ui->command_editing)
    gdb_rl_callback_handler_remove ();
}

class gdb_readline_wrapper_cleanup
{
public:
  gdb_readline_wrapper_cleanup ()
    : m_handler_orig (current_ui->input_handler),
      m_already_prompted_orig (current_ui->command_editing
			       ? rl_already_prompted : 0),
      m_target_is_async_orig (target_is_async_p ()),
      m_save_ui (&current_ui)
  {
    current_ui->input_handler = gdb_readline_wrapper_line;
    current_ui->secondary_prompt_depth++;

    if (m_target_is_async_orig)
      target_async (false);
  }

  ~gdb_readline_wrapper_cleanup ()
  {
    struct ui *ui = current_ui;

    if (ui->command_editing)
      rl_already_prompted = m_already_prompted_orig;

    gdb_assert (ui->input_handler == gdb_readline_wrapper_line);
    ui->input_handler = m_handler_orig;

    /* Don't restore our input handler in readline yet.  That would make
       readline prep the terminal (putting it in raw mode), while the
       line we just read may trigger execution of a command that expects
       the terminal in the default cooked/canonical mode, such as e.g.,
       running Python's interactive online help utility.  See
       gdb_readline_wrapper_line for when we'll reinstall it.  */

    gdb_readline_wrapper_result = NULL;
    gdb_readline_wrapper_done = 0;
    ui->secondary_prompt_depth--;
    gdb_assert (ui->secondary_prompt_depth >= 0);

    after_char_processing_hook = saved_after_char_processing_hook;
    saved_after_char_processing_hook = NULL;

    if (m_target_is_async_orig)
      target_async (true);
  }

  DISABLE_COPY_AND_ASSIGN (gdb_readline_wrapper_cleanup);

private:

  void (*m_handler_orig) (gdb::unique_xmalloc_ptr<char> &&);
  int m_already_prompted_orig;

  /* Whether the target was async.  */
  int m_target_is_async_orig;

  /* Processing events may change the current UI.  */
  scoped_restore_tmpl<struct ui *> m_save_ui;
};

char *
gdb_readline_wrapper (const char *prompt)
{
  struct ui *ui = current_ui;

  gdb_readline_wrapper_cleanup cleanup;

  /* Display our prompt and prevent double prompt display.  Don't pass
     down a NULL prompt, since that has special meaning for
     display_gdb_prompt -- it indicates a request to print the primary
     prompt, while we want a secondary prompt here.  */
  display_gdb_prompt (prompt != NULL ? prompt : "");
  if (ui->command_editing)
    rl_already_prompted = 1;

  if (after_char_processing_hook)
    (*after_char_processing_hook) ();
  gdb_assert (after_char_processing_hook == NULL);

  while (gdb_do_one_event () >= 0)
    if (gdb_readline_wrapper_done)
      break;

  return gdb_readline_wrapper_result;
}


/* The current saved history number from operate-and-get-next.
   This is -1 if not valid.  */
static int operate_saved_history = -1;

/* This is put on the appropriate hook and helps operate-and-get-next
   do its work.  */
static void
gdb_rl_operate_and_get_next_completion (void)
{
  int delta = where_history () - operate_saved_history;

  /* The `key' argument to rl_get_previous_history is ignored.  */
  rl_get_previous_history (delta, 0);
  operate_saved_history = -1;

  /* readline doesn't automatically update the display for us.  */
  rl_redisplay ();

  after_char_processing_hook = NULL;
  rl_pre_input_hook = NULL;
}

/* This is a gdb-local readline command handler.  It accepts the
   current command line (like RET does) and, if this command was taken
   from the history, arranges for the next command in the history to
   appear on the command line when the prompt returns.
   We ignore the arguments.  */
static int
gdb_rl_operate_and_get_next (int count, int key)
{
  int where;

  /* Use the async hook.  */
  after_char_processing_hook = gdb_rl_operate_and_get_next_completion;

  /* Find the current line, and find the next line to use.  */
  where = where_history();

  if ((history_is_stifled () && (history_length >= history_max_entries))
      || (where >= history_length - 1))
    operate_saved_history = where;
  else
    operate_saved_history = where + 1;

  return rl_newline (1, key);
}

/* Number of user commands executed during this session.  */

static int command_count = 0;

/* Add the user command COMMAND to the input history list.  */

void
gdb_add_history (const char *command)
{
  command_count++;

  if (history_remove_duplicates != 0)
    {
      int lookbehind;
      int lookbehind_threshold;

      /* The lookbehind threshold for finding a duplicate history entry is
	 bounded by command_count because we can't meaningfully delete
	 history entries that are already stored in the history file since
	 the history file is appended to.  */
      if (history_remove_duplicates == -1
	  || history_remove_duplicates > command_count)
	lookbehind_threshold = command_count;
      else
	lookbehind_threshold = history_remove_duplicates;

      using_history ();
      for (lookbehind = 0; lookbehind < lookbehind_threshold; lookbehind++)
	{
	  HIST_ENTRY *temp = previous_history ();

	  if (temp == NULL)
	    break;

	  if (strcmp (temp->line, command) == 0)
	    {
	      HIST_ENTRY *prev = remove_history (where_history ());
	      command_count--;
	      free_history_entry (prev);
	      break;
	    }
	}
      using_history ();
    }

  add_history (command);
}

/* Safely append new history entries to the history file in a corruption-free
   way using an intermediate local history file.  */

static void
gdb_safe_append_history (void)
{
  int ret, saved_errno;

  std::string local_history_filename
    = string_printf ("%s-gdb%ld~", history_filename.c_str (), (long) getpid ());

  ret = rename (history_filename.c_str (), local_history_filename.c_str ());
  saved_errno = errno;
  if (ret < 0 && saved_errno != ENOENT)
    {
      warning (_("Could not rename %ps to %ps: %s"),
	       styled_string (file_name_style.style (),
			      history_filename.c_str ()),
	       styled_string (file_name_style.style (),
			      local_history_filename.c_str ()),
	       safe_strerror (saved_errno));
    }
  else
    {
      if (ret < 0)
	{
	  /* If the rename failed with ENOENT then either the global history
	     file never existed in the first place or another GDB process is
	     currently appending to it (and has thus temporarily renamed it).
	     Since we can't distinguish between these two cases, we have to
	     conservatively assume the first case and therefore must write out
	     (not append) our known history to our local history file and try
	     to move it back anyway.  Otherwise a global history file would
	     never get created!  */
	   gdb_assert (saved_errno == ENOENT);
	   write_history (local_history_filename.c_str ());
	}
      else
	{
	  append_history (command_count, local_history_filename.c_str ());
	  if (history_is_stifled ())
	    history_truncate_file (local_history_filename.c_str (),
				   history_max_entries);
	}

      ret = rename (local_history_filename.c_str (), history_filename.c_str ());
      saved_errno = errno;
      if (ret < 0 && saved_errno != EEXIST)
	warning (_("Could not rename %s to %s: %s"),
		 local_history_filename.c_str (), history_filename.c_str (),
		 safe_strerror (saved_errno));
    }
}

/* Read one line from the command input stream `instream' into a local
   static buffer.  The buffer is made bigger as necessary.  Returns
   the address of the start of the line.

   NULL is returned for end of file.

   This routine either uses fancy command line editing or simple input
   as the user has requested.  */

const char *
command_line_input (const char *prompt_arg, const char *annotation_suffix)
{
  static struct buffer cmd_line_buffer;
  static int cmd_line_buffer_initialized;
  struct ui *ui = current_ui;
  const char *prompt = prompt_arg;
  char *cmd;
  int from_tty = ui->instream == ui->stdin_stream;

  /* The annotation suffix must be non-NULL.  */
  if (annotation_suffix == NULL)
    annotation_suffix = "";

  if (from_tty && annotation_level > 1)
    {
      char *local_prompt;

      local_prompt
	= (char *) alloca ((prompt == NULL ? 0 : strlen (prompt))
			   + strlen (annotation_suffix) + 40);
      if (prompt == NULL)
	local_prompt[0] = '\0';
      else
	strcpy (local_prompt, prompt);
      strcat (local_prompt, "\n\032\032");
      strcat (local_prompt, annotation_suffix);
      strcat (local_prompt, "\n");

      prompt = local_prompt;
    }

  if (!cmd_line_buffer_initialized)
    {
      buffer_init (&cmd_line_buffer);
      cmd_line_buffer_initialized = 1;
    }

  /* Starting a new command line.  */
  cmd_line_buffer.used_size = 0;

#ifdef SIGTSTP
  if (job_control)
    signal (SIGTSTP, handle_sigtstp);
#endif

  while (1)
    {
      gdb::unique_xmalloc_ptr<char> rl;

      /* Make sure that all output has been output.  Some machines may
	 let you get away with leaving out some of the gdb_flush, but
	 not all.  */
      gdb_flush (gdb_stdout);
      gdb_flush (gdb_stderr);

      if (!source_file_name.empty ())
	++source_line_number;

      if (from_tty && annotation_level > 1)
	printf_unfiltered ("\n\032\032pre-%s\n", annotation_suffix);

      /* Don't use fancy stuff if not talking to stdin.  */
      if (deprecated_readline_hook
	  && from_tty
	  && current_ui->input_interactive_p ())
	{
	  rl.reset ((*deprecated_readline_hook) (prompt));
	}
      else if (command_editing_p
	       && from_tty
	       && current_ui->input_interactive_p ())
	{
	  rl.reset (gdb_readline_wrapper (prompt));
	}
      else
	{
	  rl.reset (gdb_readline_no_editing (prompt));
	}

      cmd = handle_line_of_input (&cmd_line_buffer, rl.get (),
				  0, annotation_suffix);
      if (cmd == (char *) EOF)
	{
	  cmd = NULL;
	  break;
	}
      if (cmd != NULL)
	break;

      /* Got partial input.  I.e., got a line that ends with a
	 continuation character (backslash).  Suppress printing the
	 prompt again.  */
      prompt = NULL;
    }

#ifdef SIGTSTP
  if (job_control)
    signal (SIGTSTP, SIG_DFL);
#endif

  return cmd;
}

/* See top.h.  */
void
print_gdb_version (struct ui_file *stream, bool interactive)
{
  /* From GNU coding standards, first line is meant to be easy for a
     program to parse, and is just canonical program name and version
     number, which starts after last space.  */

  std::string v_str = string_printf ("GNU gdb %s%s", PKGVERSION, version);
  gdb_printf (stream, "%ps\n",
	      styled_string (version_style.style (), v_str.c_str ()));

  /* Second line is a copyright notice.  */

  gdb_printf (stream,
	      "Copyright (C) 2022 Free Software Foundation, Inc.\n");

  /* Following the copyright is a brief statement that the program is
     free software, that users are free to copy and change it on
     certain conditions, that it is covered by the GNU GPL, and that
     there is no warranty.  */

  gdb_printf (stream, "\
License GPLv3+: GNU GPL version 3 or later <%ps>\
\nThis is free software: you are free to change and redistribute it.\n\
There is NO WARRANTY, to the extent permitted by law.",
		    styled_string (file_name_style.style (),
				   "http://gnu.org/licenses/gpl.html"));

  if (!interactive)
    return;

  gdb_printf (stream, ("\nType \"show copying\" and "
		       "\"show warranty\" for details.\n"));

  /* After the required info we print the configuration information.  */

  gdb_printf (stream, "This GDB was configured as \"");
  if (strcmp (host_name, target_name) != 0)
    {
      gdb_printf (stream, "--host=%s --target=%s",
		  host_name, target_name);
    }
  else
    {
      gdb_printf (stream, "%s", host_name);
    }
  gdb_printf (stream, "\".\n");

  gdb_printf (stream, _("Type \"show configuration\" "
			"for configuration details.\n"));

  if (REPORT_BUGS_TO[0])
    {
      gdb_printf (stream,
		  _("For bug reporting instructions, please see:\n"));
      gdb_printf (stream, "%ps.\n",
		  styled_string (file_name_style.style (),
				 REPORT_BUGS_TO));
    }
  gdb_printf (stream,
	      _("Find the GDB manual and other documentation \
resources online at:\n    <%ps>."),
	      styled_string (file_name_style.style (),
			     "http://www.gnu.org/software/gdb/documentation/"));
  gdb_printf (stream, "\n\n");
  gdb_printf (stream, _("For help, type \"help\".\n"));
  gdb_printf (stream,
	      _("Type \"apropos word\" to search for commands \
related to \"word\"."));
}

/* Print the details of GDB build-time configuration.  */
void
print_gdb_configuration (struct ui_file *stream)
{
  gdb_printf (stream, _("\
This GDB was configured as follows:\n\
   configure --host=%s --target=%s\n\
"), host_name, target_name);

  gdb_printf (stream, _("\
	     --with-auto-load-dir=%s\n\
	     --with-auto-load-safe-path=%s\n\
"), AUTO_LOAD_DIR, AUTO_LOAD_SAFE_PATH);

#if HAVE_LIBEXPAT
  gdb_printf (stream, _("\
	     --with-expat\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-expat\n\
"));
#endif

  if (GDB_DATADIR[0])
    gdb_printf (stream, _("\
	     --with-gdb-datadir=%s%s\n\
"), GDB_DATADIR, GDB_DATADIR_RELOCATABLE ? " (relocatable)" : "");

#ifdef ICONV_BIN
  gdb_printf (stream, _("\
	     --with-iconv-bin=%s%s\n\
"), ICONV_BIN, ICONV_BIN_RELOCATABLE ? " (relocatable)" : "");
#endif

  if (JIT_READER_DIR[0])
    gdb_printf (stream, _("\
	     --with-jit-reader-dir=%s%s\n\
"), JIT_READER_DIR, JIT_READER_DIR_RELOCATABLE ? " (relocatable)" : "");

#if HAVE_LIBUNWIND_IA64_H
  gdb_printf (stream, _("\
	     --with-libunwind-ia64\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-libunwind-ia64\n\
"));
#endif

#if HAVE_LIBLZMA
  gdb_printf (stream, _("\
	     --with-lzma\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-lzma\n\
"));
#endif

#if HAVE_LIBBABELTRACE
  gdb_printf (stream, _("\
	     --with-babeltrace\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-babeltrace\n\
"));
#endif

#if HAVE_LIBIPT
  gdb_printf (stream, _("\
	     --with-intel-pt\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-intel-pt\n\
"));
#endif

#if HAVE_LIBMPFR
  gdb_printf (stream, _("\
	     --with-mpfr\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-mpfr\n\
"));
#endif
#if HAVE_LIBXXHASH
  gdb_printf (stream, _("\
	     --with-xxhash\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-xxhash\n\
"));
#endif
#ifdef WITH_PYTHON_PATH
  gdb_printf (stream, _("\
	     --with-python=%s%s\n\
"), WITH_PYTHON_PATH, PYTHON_PATH_RELOCATABLE ? " (relocatable)" : "");
#else
  gdb_printf (stream, _("\
	     --without-python\n\
"));
#endif
#ifdef WITH_PYTHON_LIBDIR
  gdb_printf (stream, _("\
	     --with-python-libdir=%s%s\n\
"), WITH_PYTHON_LIBDIR, PYTHON_LIBDIR_RELOCATABLE ? " (relocatable)" : "");
#else
  gdb_printf (stream, _("\
	     --without-python-libdir\n\
"));
#endif

#if HAVE_LIBDEBUGINFOD
  gdb_printf (stream, _("\
	     --with-debuginfod\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-debuginfod\n\
"));
#endif

#if HAVE_GUILE
  gdb_printf (stream, _("\
	     --with-guile\n\
"));
#else
  gdb_printf (stream, _("\
	     --without-guile\n\
"));
#endif

#if HAVE_SOURCE_HIGHLIGHT
  gdb_printf (stream, _("\
	     --enable-source-highlight\n\
"));
#else
  gdb_printf (stream, _("\
	     --disable-source-highlight\n\
"));
#endif

#if CXX_STD_THREAD
  gdb_printf (stream, _("\
	     --enable-threading\n\
"));
#else
  gdb_printf (stream, _("\
	     --disable-threading\n\
"));
#endif

#ifdef RELOC_SRCDIR
  gdb_printf (stream, _("\
	     --with-relocated-sources=%s\n\
"), RELOC_SRCDIR);
#endif

  if (DEBUGDIR[0])
    gdb_printf (stream, _("\
	     --with-separate-debug-dir=%s%s\n\
"), DEBUGDIR, DEBUGDIR_RELOCATABLE ? " (relocatable)" : "");

  if (TARGET_SYSTEM_ROOT[0])
    gdb_printf (stream, _("\
	     --with-sysroot=%s%s\n\
"), TARGET_SYSTEM_ROOT, TARGET_SYSTEM_ROOT_RELOCATABLE ? " (relocatable)" : "");

  if (SYSTEM_GDBINIT[0])
    gdb_printf (stream, _("\
	     --with-system-gdbinit=%s%s\n\
"), SYSTEM_GDBINIT, SYSTEM_GDBINIT_RELOCATABLE ? " (relocatable)" : "");

  if (SYSTEM_GDBINIT_DIR[0])
    gdb_printf (stream, _("\
	     --with-system-gdbinit-dir=%s%s\n\
"), SYSTEM_GDBINIT_DIR, SYSTEM_GDBINIT_DIR_RELOCATABLE ? " (relocatable)" : "");

  /* We assume "relocatable" will be printed at least once, thus we always
     print this text.  It's a reasonably safe assumption for now.  */
  gdb_printf (stream, _("\n\
(\"Relocatable\" means the directory can be moved with the GDB installation\n\
tree, and GDB will still find it.)\n\
"));
}


/* The current top level prompt, settable with "set prompt", and/or
   with the python `gdb.prompt_hook' hook.  */
static std::string top_prompt;

/* Access method for the GDB prompt string.  */

const std::string &
get_prompt ()
{
  return top_prompt;
}

/* Set method for the GDB prompt string.  */

void
set_prompt (const char *s)
{
  top_prompt = s;
}


/* Kills or detaches the given inferior, depending on how we originally
   gained control of it.  */

static void
kill_or_detach (inferior *inf, int from_tty)
{
  if (inf->pid == 0)
    return;

  thread_info *thread = any_thread_of_inferior (inf);
  if (thread != NULL)
    {
      switch_to_thread (thread);

      /* Leave core files alone.  */
      if (target_has_execution ())
	{
	  if (inf->attach_flag)
	    target_detach (inf, from_tty);
	  else
	    target_kill ();
	}
    }
}

/* Prints info about what GDB will do to inferior INF on a "quit".  OUT is
   where to collect the output.  */

static void
print_inferior_quit_action (inferior *inf, ui_file *out)
{
  if (inf->pid == 0)
    return;

  if (inf->attach_flag)
    gdb_printf (out,
		_("\tInferior %d [%s] will be detached.\n"), inf->num,
		target_pid_to_str (ptid_t (inf->pid)).c_str ());
  else
    gdb_printf (out,
		_("\tInferior %d [%s] will be killed.\n"), inf->num,
		target_pid_to_str (ptid_t (inf->pid)).c_str ());
}

/* If necessary, make the user confirm that we should quit.  Return
   non-zero if we should quit, zero if we shouldn't.  */

int
quit_confirm (void)
{
  /* Don't even ask if we're only debugging a core file inferior.  */
  if (!have_live_inferiors ())
    return 1;

  /* Build the query string as a single string.  */
  string_file stb;

  stb.puts (_("A debugging session is active.\n\n"));

  for (inferior *inf : all_inferiors ())
    print_inferior_quit_action (inf, &stb);

  stb.puts (_("\nQuit anyway? "));

  return query ("%s", stb.c_str ());
}

/* Prepare to exit GDB cleanly by undoing any changes made to the
   terminal so that we leave the terminal in the state we acquired it.  */

static void
undo_terminal_modifications_before_exit (void)
{
  struct ui *saved_top_level = current_ui;

  target_terminal::ours ();

  current_ui = main_ui;

#if defined(TUI)
  tui_disable ();
#endif
  gdb_disable_readline ();

  current_ui = saved_top_level;
}


/* Quit without asking for confirmation.  */

void
quit_force (int *exit_arg, int from_tty)
{
  int exit_code = 0;

  /* An optional expression may be used to cause gdb to terminate with the
     value of that expression.  */
  if (exit_arg)
    exit_code = *exit_arg;
  else if (return_child_result)
    exit_code = return_child_result_value;

  gdb::observers::gdb_exiting.notify (exit_code);

  undo_terminal_modifications_before_exit ();

  /* We want to handle any quit errors and exit regardless.  */

  /* Get out of tfind mode, and kill or detach all inferiors.  */
  try
    {
      disconnect_tracing ();
      for (inferior *inf : all_inferiors ())
	kill_or_detach (inf, from_tty);
    }
  catch (const gdb_exception &ex)
    {
      exception_print (gdb_stderr, ex);
    }

  /* Give all pushed targets a chance to do minimal cleanup, and pop
     them all out.  */
  for (inferior *inf : all_inferiors ())
    {
      switch_to_inferior_no_thread (inf);
      try
	{
	  pop_all_targets ();
	}
      catch (const gdb_exception &ex)
	{
	  exception_print (gdb_stderr, ex);
	}
    }

  /* Save the history information if it is appropriate to do so.  */
  try
    {
      if (write_history_p && !history_filename.empty ())
	{
	  int save = 0;

	  /* History is currently shared between all UIs.  If there's
	     any UI with a terminal, save history.  */
	  for (ui *ui : all_uis ())
	    {
	      if (ui->input_interactive_p ())
		{
		  save = 1;
		  break;
		}
	    }

	  if (save)
	    gdb_safe_append_history ();
	}
    }
  catch (const gdb_exception &ex)
    {
      exception_print (gdb_stderr, ex);
    }

  /* Destroy any values currently allocated now instead of leaving it
     to global destructors, because that may be too late.  For
     example, the destructors of xmethod values call into the Python
     runtime, which is finalized via a final cleanup.  */
  finalize_values ();

  /* Do any final cleanups before exiting.  */
  try
    {
      do_final_cleanups ();
    }
  catch (const gdb_exception &ex)
    {
      exception_print (gdb_stderr, ex);
    }

  exit (exit_code);
}

/* The value of the "interactive-mode" setting.  */
static enum auto_boolean interactive_mode = AUTO_BOOLEAN_AUTO;

/* Implement the "show interactive-mode" option.  */

static void
show_interactive_mode (struct ui_file *file, int from_tty,
		       struct cmd_list_element *c,
		       const char *value)
{
  if (interactive_mode == AUTO_BOOLEAN_AUTO)
    gdb_printf (file, "Debugger's interactive mode "
		"is %s (currently %s).\n",
		value, current_ui->input_interactive_p () ? "on" : "off");
  else
    gdb_printf (file, "Debugger's interactive mode is %s.\n", value);
}

/* Returns whether GDB is running on an interactive terminal.  */

bool
ui::input_interactive_p () const
{
  if (batch_flag)
    return false;

  if (interactive_mode != AUTO_BOOLEAN_AUTO)
    return interactive_mode == AUTO_BOOLEAN_TRUE;

  return m_input_interactive_p;
}

static void
dont_repeat_command (const char *ignored, int from_tty)
{
  /* Can't call dont_repeat here because we're not necessarily reading
     from stdin.  */
  *saved_command_line = 0;
}

/* Functions to manipulate command line editing control variables.  */

/* Number of commands to print in each call to show_commands.  */
#define Hist_print 10
void
show_commands (const char *args, int from_tty)
{
  /* Index for history commands.  Relative to history_base.  */
  int offset;

  /* Number of the history entry which we are planning to display next.
     Relative to history_base.  */
  static int num = 0;

  /* Print out some of the commands from the command history.  */

  if (args)
    {
      if (args[0] == '+' && args[1] == '\0')
	/* "info editing +" should print from the stored position.  */
	;
      else
	/* "info editing <exp>" should print around command number <exp>.  */
	num = (parse_and_eval_long (args) - history_base) - Hist_print / 2;
    }
  /* "show commands" means print the last Hist_print commands.  */
  else
    {
      num = history_length - Hist_print;
    }

  if (num < 0)
    num = 0;

  /* If there are at least Hist_print commands, we want to display the last
     Hist_print rather than, say, the last 6.  */
  if (history_length - num < Hist_print)
    {
      num = history_length - Hist_print;
      if (num < 0)
	num = 0;
    }

  for (offset = num;
       offset < num + Hist_print && offset < history_length;
       offset++)
    {
      gdb_printf ("%5d  %s\n", history_base + offset,
		  (history_get (history_base + offset))->line);
    }

  /* The next command we want to display is the next one that we haven't
     displayed yet.  */
  num += Hist_print;

  /* If the user repeats this command with return, it should do what
     "show commands +" does.  This is unnecessary if arg is null,
     because "show commands +" is not useful after "show commands".  */
  if (from_tty && args)
    set_repeat_arguments ("+");
}

/* Update the size of our command history file to HISTORY_SIZE.

   A HISTORY_SIZE of -1 stands for unlimited.  */

static void
set_readline_history_size (int history_size)
{
  gdb_assert (history_size >= -1);

  if (history_size == -1)
    unstifle_history ();
  else
    stifle_history (history_size);
}

/* Called by do_setshow_command.  */
static void
set_history_size_command (const char *args,
			  int from_tty, struct cmd_list_element *c)
{
  set_readline_history_size (history_size_setshow_var);
}

bool info_verbose = false;	/* Default verbose msgs off.  */

/* Called by do_set_command.  An elaborate joke.  */
void
set_verbose (const char *args, int from_tty, struct cmd_list_element *c)
{
  const char *cmdname = "verbose";
  struct cmd_list_element *showcmd;

  showcmd = lookup_cmd_1 (&cmdname, showlist, NULL, NULL, 1);
  gdb_assert (showcmd != NULL && showcmd != CMD_LIST_AMBIGUOUS);

  if (c->doc && c->doc_allocated)
    xfree ((char *) c->doc);
  if (showcmd->doc && showcmd->doc_allocated)
    xfree ((char *) showcmd->doc);
  if (info_verbose)
    {
      c->doc = _("Set verbose printing of informational messages.");
      showcmd->doc = _("Show verbose printing of informational messages.");
    }
  else
    {
      c->doc = _("Set verbosity.");
      showcmd->doc = _("Show verbosity.");
    }
  c->doc_allocated = 0;
  showcmd->doc_allocated = 0;
}

/* Init the history buffer.  Note that we are called after the init file(s)
   have been read so that the user can change the history file via his
   .gdbinit file (for instance).  The GDBHISTFILE environment variable
   overrides all of this.  */

void
init_history (void)
{
  const char *tmpenv;

  tmpenv = getenv ("GDBHISTSIZE");
  if (tmpenv)
    {
      long var;
      int saved_errno;
      char *endptr;

      tmpenv = skip_spaces (tmpenv);
      errno = 0;
      var = strtol (tmpenv, &endptr, 10);
      saved_errno = errno;
      endptr = skip_spaces (endptr);

      /* If GDBHISTSIZE is non-numeric then ignore it.  If GDBHISTSIZE is the
	 empty string, a negative number or a huge positive number (larger than
	 INT_MAX) then set the history size to unlimited.  Otherwise set our
	 history size to the number we have read.  This behavior is consistent
	 with how bash handles HISTSIZE.  */
      if (*endptr != '\0')
	;
      else if (*tmpenv == '\0'
	       || var < 0
	       || var > INT_MAX
	       /* On targets where INT_MAX == LONG_MAX, we have to look at
		  errno after calling strtol to distinguish between a value that
		  is exactly INT_MAX and an overflowing value that was clamped
		  to INT_MAX.  */
	       || (var == INT_MAX && saved_errno == ERANGE))
	history_size_setshow_var = -1;
      else
	history_size_setshow_var = var;
    }

  /* If neither the init file nor GDBHISTSIZE has set a size yet, pick the
     default.  */
  if (history_size_setshow_var == -2)
    history_size_setshow_var = 256;

  set_readline_history_size (history_size_setshow_var);

  if (!history_filename.empty ())
    read_history (history_filename.c_str ());
}

static void
show_prompt (struct ui_file *file, int from_tty,
	     struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("Gdb's prompt is \"%s\".\n"), value);
}

/* "set editing" command.  */

static void
set_editing (const char *args, int from_tty, struct cmd_list_element *c)
{
  change_line_handler (set_editing_cmd_var);
  /* Update the control variable so that MI's =cmd-param-changed event
     shows the correct value. */
  set_editing_cmd_var = current_ui->command_editing;
}

static void
show_editing (struct ui_file *file, int from_tty,
	      struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("Editing of command lines as "
		      "they are typed is %s.\n"),
	      current_ui->command_editing ? _("on") : _("off"));
}

static void
show_annotation_level (struct ui_file *file, int from_tty,
		       struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("Annotation_level is %s.\n"), value);
}

static void
show_exec_done_display_p (struct ui_file *file, int from_tty,
			  struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("Notification of completion for "
		      "asynchronous execution commands is %s.\n"),
	      value);
}

/* New values of the "data-directory" parameter are staged here.
   Extension languages, for example Python's gdb.parameter API, will read
   the value directory from this variable, so we must ensure that this
   always contains the correct value.  */
static std::string staged_gdb_datadir;

/* "set" command for the gdb_datadir configuration variable.  */

static void
set_gdb_datadir (const char *args, int from_tty, struct cmd_list_element *c)
{
  set_gdb_data_directory (staged_gdb_datadir.c_str ());

  /* SET_GDB_DATA_DIRECTORY will resolve relative paths in
     STAGED_GDB_DATADIR, so we now copy the value from GDB_DATADIR
     back into STAGED_GDB_DATADIR so the extension languages can read the
     correct value.  */
  staged_gdb_datadir = gdb_datadir;

  gdb::observers::gdb_datadir_changed.notify ();
}

/* "show" command for the gdb_datadir configuration variable.  */

static void
show_gdb_datadir (struct ui_file *file, int from_tty,
		  struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("GDB's data directory is \"%ps\".\n"),
	      styled_string (file_name_style.style (),
			     gdb_datadir.c_str ()));
}

/* Implement 'set history filename'.  */

static void
set_history_filename (const char *args,
		      int from_tty, struct cmd_list_element *c)
{
  /* We include the current directory so that if the user changes
     directories the file written will be the same as the one
     that was read.  */
  if (!history_filename.empty ()
      && !IS_ABSOLUTE_PATH (history_filename.c_str ()))
    history_filename = gdb_abspath (history_filename.c_str ());
}

/* Whether we're in quiet startup mode.  */

static bool startup_quiet;

/* See top.h.  */

bool
check_quiet_mode ()
{
  return startup_quiet;
}

/* Show whether GDB should start up in quiet mode.  */

static void
show_startup_quiet (struct ui_file *file, int from_tty,
	      struct cmd_list_element *c, const char *value)
{
  gdb_printf (file, _("Whether to start up quietly is %s.\n"),
	      value);
}

static void
init_gdb_version_vars (void)
{
  struct internalvar *major_version_var = create_internalvar ("_gdb_major");
  struct internalvar *minor_version_var = create_internalvar ("_gdb_minor");
  int vmajor = 0, vminor = 0, vrevision = 0;
  sscanf (version, "%d.%d.%d", &vmajor, &vminor, &vrevision);
  set_internalvar_integer (major_version_var, vmajor);
  set_internalvar_integer (minor_version_var, vminor + (vrevision > 0));
}

static void
init_main (void)
{
  struct cmd_list_element *c;

  /* Initialize the prompt to a simple "(gdb) " prompt or to whatever
     the DEFAULT_PROMPT is.  */
  set_prompt (DEFAULT_PROMPT);

  /* Set the important stuff up for command editing.  */
  command_editing_p = 1;
  history_expansion_p = 0;
  write_history_p = 0;

  /* Setup important stuff for command line editing.  */
  rl_completion_word_break_hook = gdb_completion_word_break_characters;
  rl_attempted_completion_function = gdb_rl_attempted_completion_function;
  set_rl_completer_word_break_characters (default_word_break_characters ());
  rl_completer_quote_characters = get_gdb_completer_quote_characters ();
  rl_completion_display_matches_hook = cli_display_match_list;
  rl_readline_name = "gdb";
  rl_terminal_name = getenv ("TERM");
  rl_deprep_term_function = gdb_rl_deprep_term_function;

  /* The name for this defun comes from Bash, where it originated.
     15 is Control-o, the same binding this function has in Bash.  */
  rl_add_defun ("operate-and-get-next", gdb_rl_operate_and_get_next, 15);

  add_setshow_string_cmd ("prompt", class_support,
			  &top_prompt,
			  _("Set gdb's prompt."),
			  _("Show gdb's prompt."),
			  NULL, NULL,
			  show_prompt,
			  &setlist, &showlist);

  add_com ("dont-repeat", class_support, dont_repeat_command, _("\
Don't repeat this command.\nPrimarily \
used inside of user-defined commands that should not be repeated when\n\
hitting return."));

  add_setshow_boolean_cmd ("editing", class_support,
			   &set_editing_cmd_var, _("\
Set editing of command lines as they are typed."), _("\
Show editing of command lines as they are typed."), _("\
Use \"on\" to enable the editing, and \"off\" to disable it.\n\
Without an argument, command line editing is enabled.  To edit, use\n\
EMACS-like or VI-like commands like control-P or ESC."),
			   set_editing,
			   show_editing,
			   &setlist, &showlist);

  add_setshow_boolean_cmd ("save", no_class, &write_history_p, _("\
Set saving of the history record on exit."), _("\
Show saving of the history record on exit."), _("\
Use \"on\" to enable the saving, and \"off\" to disable it.\n\
Without an argument, saving is enabled."),
			   NULL,
			   show_write_history_p,
			   &sethistlist, &showhistlist);

  add_setshow_zuinteger_unlimited_cmd ("size", no_class,
				       &history_size_setshow_var, _("\
Set the size of the command history."), _("\
Show the size of the command history."), _("\
This is the number of previous commands to keep a record of.\n\
If set to \"unlimited\", the number of commands kept in the history\n\
list is unlimited.  This defaults to the value of the environment\n\
variable \"GDBHISTSIZE\", or to 256 if this variable is not set."),
			    set_history_size_command,
			    show_history_size,
			    &sethistlist, &showhistlist);

  add_setshow_zuinteger_unlimited_cmd ("remove-duplicates", no_class,
				       &history_remove_duplicates, _("\
Set how far back in history to look for and remove duplicate entries."), _("\
Show how far back in history to look for and remove duplicate entries."), _("\
If set to a nonzero value N, GDB will look back at the last N history entries\n\
and remove the first history entry that is a duplicate of the most recent\n\
entry, each time a new history entry is added.\n\
If set to \"unlimited\", this lookbehind is unbounded.\n\
Only history entries added during this session are considered for removal.\n\
If set to 0, removal of duplicate history entries is disabled.\n\
By default this option is set to 0."),
			   NULL,
			   show_history_remove_duplicates,
			   &sethistlist, &showhistlist);

  add_setshow_optional_filename_cmd ("filename", no_class, &history_filename, _("\
Set the filename in which to record the command history."), _("\
Show the filename in which to record the command history."), _("\
(the list of previous commands of which a record is kept)."),
			    set_history_filename,
			    show_history_filename,
			    &sethistlist, &showhistlist);

  add_setshow_boolean_cmd ("confirm", class_support, &confirm, _("\
Set whether to confirm potentially dangerous operations."), _("\
Show whether to confirm potentially dangerous operations."), NULL,
			   NULL,
			   show_confirm,
			   &setlist, &showlist);

  add_setshow_zinteger_cmd ("annotate", class_obscure, &annotation_level, _("\
Set annotation_level."), _("\
Show annotation_level."), _("\
0 == normal;     1 == fullname (for use when running under emacs)\n\
2 == output annotated suitably for use by programs that control GDB."),
			    NULL,
			    show_annotation_level,
			    &setlist, &showlist);

  add_setshow_boolean_cmd ("exec-done-display", class_support,
			   &exec_done_display_p, _("\
Set notification of completion for asynchronous execution commands."), _("\
Show notification of completion for asynchronous execution commands."), _("\
Use \"on\" to enable the notification, and \"off\" to disable it."),
			   NULL,
			   show_exec_done_display_p,
			   &setlist, &showlist);

  add_setshow_filename_cmd ("data-directory", class_maintenance,
			   &staged_gdb_datadir, _("Set GDB's data directory."),
			   _("Show GDB's data directory."),
			   _("\
When set, GDB uses the specified path to search for data files."),
			   set_gdb_datadir, show_gdb_datadir,
			   &setlist,
			    &showlist);
  /* Prime the initial value for data-directory.  */
  staged_gdb_datadir = gdb_datadir;

  add_setshow_auto_boolean_cmd ("interactive-mode", class_support,
				&interactive_mode, _("\
Set whether GDB's standard input is a terminal."), _("\
Show whether GDB's standard input is a terminal."), _("\
If on, GDB assumes that standard input is a terminal.  In practice, it\n\
means that GDB should wait for the user to answer queries associated to\n\
commands entered at the command prompt.  If off, GDB assumes that standard\n\
input is not a terminal, and uses the default answer to all queries.\n\
If auto (the default), determine which mode to use based on the standard\n\
input settings."),
			NULL,
			show_interactive_mode,
			&setlist, &showlist);

  add_setshow_boolean_cmd ("startup-quietly", class_support,
			       &startup_quiet, _("\
Set whether GDB should start up quietly."), _("		\
Show whether GDB should start up quietly."), _("\
This setting will not affect the current session.  Instead this command\n\
should be added to the .gdbearlyinit file in the users home directory to\n\
affect future GDB sessions."),
			       NULL,
			       show_startup_quiet,
			       &setlist, &showlist);

  c = add_cmd ("new-ui", class_support, new_ui_command, _("\
Create a new UI.\n\
Usage: new-ui INTERPRETER TTY\n\
The first argument is the name of the interpreter to run.\n\
The second argument is the terminal the UI runs on."), &cmdlist);
  set_cmd_completer (c, interpreter_completer);
}

/* See top.h.  */

void
gdb_init ()
{
  saved_command_line = xstrdup ("");
  previous_saved_command_line = xstrdup ("");

  /* Run the init function of each source file.  */

#ifdef __MSDOS__
  /* Make sure we return to the original directory upon exit, come
     what may, since the OS doesn't do that for us.  */
  make_final_cleanup (do_chdir_cleanup, xstrdup (current_directory));
#endif

  init_cmd_lists ();	    /* This needs to be done first.  */

  init_page_info ();

  /* Here is where we call all the _initialize_foo routines.  */
  initialize_all_files ();

  /* This creates the current_program_space.  Do this after all the
     _initialize_foo routines have had a chance to install their
     per-sspace data keys.  Also do this before
     initialize_current_architecture is called, because it accesses
     exec_bfd of the current program space.  */
  initialize_progspace ();
  initialize_inferiors ();
  initialize_current_architecture ();
  init_main ();			/* But that omits this file!  Do it now.  */

  initialize_stdin_serial ();

  /* Take a snapshot of our tty state before readline/ncurses have had a chance
     to alter it.  */
  set_initial_gdb_ttystate ();

  gdb_init_signals ();

  /* We need a default language for parsing expressions, so simple
     things like "set width 0" won't fail if no language is explicitly
     set in a config file or implicitly set by reading an executable
     during startup.  */
  set_language (language_c);
  expected_language = current_language;	/* Don't warn about the change.  */

  /* Create $_gdb_major and $_gdb_minor convenience variables.  */
  init_gdb_version_vars ();
}

void _initialize_top ();
void
_initialize_top ()
{
  /* Determine a default value for the history filename.  */
  const char *tmpenv = getenv ("GDBHISTFILE");
  if (tmpenv != nullptr)
    history_filename = tmpenv;
  else
    {
      /* We include the current directory so that if the user changes
	 directories the file written will be the same as the one
	 that was read.  */
#ifdef __MSDOS__
      /* No leading dots in file names are allowed on MSDOS.  */
      const char *fname = "_gdb_history";
#else
      const char *fname = ".gdb_history";
#endif

      history_filename = gdb_abspath (fname);
    }
}
