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

   Copyright (C) 1986-2024 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/>.  */

#ifndef GDB_TOP_H
#define GDB_TOP_H

#include "gdbsupport/event-loop.h"
#include "gdbsupport/next-iterator.h"
#include "value.h"

/* From top.c.  */
extern bool confirm;
extern int inhibit_gdbinit;
extern auto_boolean interactive_mode;

/* Print the GDB version banner to STREAM.  If INTERACTIVE is false,
   then information referring to commands (e.g., "show configuration")
   is omitted; this mode is used for the --version command line
   option.  If INTERACTIVE is true, then interactive commands are
   mentioned.  */
extern void print_gdb_version (struct ui_file *stream, bool interactive);

extern void print_gdb_configuration (struct ui_file *);

extern void read_command_file (FILE *);
extern void init_history (void);
extern void command_loop (void);
extern int quit_confirm (void);
[[noreturn]] extern void quit_force (int *, int);
extern void quit_command (const char *, int);
extern void quit_cover (void);
extern void execute_command (const char *, int);

/* Run FN.  Capture its output into the returned string, do not display it
   to the screen.  The global BATCH_FLAG will temporarily be set to true.
   When TERM_OUT is true the output is collected with terminal behavior
   (e.g. with styling).  When TERM_OUT is false raw output will be collected
   (e.g. no styling).  */

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

/* As execute_fn_to_ui_file, but run execute_command for P and FROM_TTY.  */

extern void execute_command_to_ui_file (struct ui_file *file,
					const char *p, int from_tty);

/* As execute_fn_to_string, but run execute_command for P and FROM_TTY.  */

extern void execute_command_to_string (std::string &res, const char *p,
				       int from_tty, bool term_out);

/* Same as the above, but ignore resulting string.  */

extern void execute_command_to_string (const char *p,
				       int from_tty, bool term_out);

/* 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.  WAS_SYNC indicates whether sync_execution was set before
   the command was run.  */

extern void maybe_wait_sync_command_done (int was_sync);

/* Wait for a synchronous execution command to end.  */
extern void wait_sync_command_done (void);

extern void check_frame_language_change (void);

/* Prepare for execution of a command.
   Call this before every command, CLI or MI.
   Returns a cleanup to be run after the command is completed.  */
extern scoped_value_mark prepare_execute_command (void);

/* This function returns a pointer to the string that is used
   by gdb for its command prompt.  */
extern const std::string &get_prompt ();

/* This function returns a pointer to the string that is used
   by gdb for its command prompt.  */
extern void set_prompt (const char *s);

/* Return 1 if UI's current input handler is a secondary prompt, 0
   otherwise.  */

extern int gdb_in_secondary_prompt_p (struct ui *ui);

/* Perform _initialize initialization.  */
extern void gdb_init ();

/* For use by event-top.c.  */
/* Variables from top.c.  */
extern int source_line_number;
extern std::string source_file_name;
extern bool history_expansion_p;
extern bool server_command;
extern char *lim_at_start;

extern void gdb_add_history (const char *);

extern void show_commands (const char *args, int from_tty);

extern void set_verbose (const char *, int, struct cmd_list_element *);

extern const char *handle_line_of_input (std::string &cmd_line_buffer,
					 const char *rl, int repeat,
					 const char *annotation_suffix);

/* Call at startup to see if the user has requested that gdb start up
   quietly.  */

extern bool check_quiet_mode ();

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

extern void unbuffer_stream (FILE *stream);

#endif /* GDB_TOP_H */