123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- /* Manages interpreters for GDB, the GNU debugger.
- Copyright (C) 2000-2022 Free Software Foundation, Inc.
- Written by Jim Ingham <jingham@apple.com> of Apple Computer, 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 INTERPS_H
- #define INTERPS_H
- struct ui_out;
- struct interp;
- struct ui;
- class completion_tracker;
- typedef struct interp *(*interp_factory_func) (const char *name);
- /* Each interpreter kind (CLI, MI, etc.) registers itself with a call
- to this function, passing along its name, and a pointer to a
- function that creates a new instance of an interpreter with that
- name. */
- extern void interp_factory_register (const char *name,
- interp_factory_func func);
- extern struct gdb_exception interp_exec (struct interp *interp,
- const char *command);
- class interp
- {
- public:
- explicit interp (const char *name);
- virtual ~interp () = 0;
- virtual void init (bool top_level)
- {}
- virtual void resume () = 0;
- virtual void suspend () = 0;
- virtual gdb_exception exec (const char *command) = 0;
- /* Returns the ui_out currently used to collect results for this
- interpreter. It can be a formatter for stdout, as is the case
- for the console & mi outputs, or it might be a result
- formatter. */
- virtual ui_out *interp_ui_out () = 0;
- /* Provides a hook for interpreters to do any additional
- setup/cleanup that they might need when logging is enabled or
- disabled. */
- virtual void set_logging (ui_file_up logfile, bool logging_redirect,
- bool debug_redirect) = 0;
- /* Called before starting an event loop, to give the interpreter a
- chance to e.g., print a prompt. */
- virtual void pre_command_loop ()
- {}
- /* Returns true if this interpreter supports using the readline
- library; false if it uses GDB's own simplified readline
- emulation. */
- virtual bool supports_command_editing ()
- { return false; }
- const char *name () const
- {
- return m_name;
- }
- /* This is the name in "-i=" and "set interpreter". */
- private:
- char *m_name;
- /* Interpreters are stored in a linked list, this is the next
- one... */
- public:
- struct interp *next;
- /* Has the init method been run? */
- bool inited;
- };
- /* Look up the interpreter for NAME, creating one if none exists yet.
- If NAME is not a interpreter type previously registered with
- interp_factory_register, return NULL; otherwise return a pointer to
- the interpreter. */
- extern struct interp *interp_lookup (struct ui *ui, const char *name);
- /* Set the current UI's top level interpreter to the interpreter named
- NAME. Throws an error if NAME is not a known interpreter or the
- interpreter fails to initialize. */
- extern void set_top_level_interpreter (const char *name);
- /* Temporarily set the current interpreter, and reset it on
- destruction. */
- class scoped_restore_interp
- {
- public:
- scoped_restore_interp (const char *name)
- : m_interp (set_interp (name))
- {
- }
- ~scoped_restore_interp ()
- {
- set_interp (m_interp->name ());
- }
- scoped_restore_interp (const scoped_restore_interp &) = delete;
- scoped_restore_interp &operator= (const scoped_restore_interp &) = delete;
- private:
- struct interp *set_interp (const char *name);
- struct interp *m_interp;
- };
- extern int current_interp_named_p (const char *name);
- /* Call this function to give the current interpreter an opportunity
- to do any special handling of streams when logging is enabled or
- disabled. LOGFILE is the stream for the log file when logging is
- starting and is NULL when logging is ending. LOGGING_REDIRECT is
- the value of the "set logging redirect" setting. If true, the
- interpreter should configure the output streams to send output only
- to the logfile. If false, the interpreter should configure the
- output streams to send output to both the current output stream
- (i.e., the terminal) and the log file. DEBUG_REDIRECT is same as
- LOGGING_REDIRECT, but for the value of "set logging debugredirect"
- instead. */
- extern void current_interp_set_logging (ui_file_up logfile,
- bool logging_redirect,
- bool debug_redirect);
- /* Returns the top-level interpreter. */
- extern struct interp *top_level_interpreter (void);
- /* Return the current UI's current interpreter. */
- extern struct interp *current_interpreter (void);
- extern struct interp *command_interp (void);
- extern void clear_interpreter_hooks (void);
- /* Returns true if INTERP supports using the readline library; false
- if it uses GDB's own simplified form of readline. */
- extern int interp_supports_command_editing (struct interp *interp);
- /* Called before starting an event loop, to give the interpreter a
- chance to e.g., print a prompt. */
- extern void interp_pre_command_loop (struct interp *interp);
- /* List the possible interpreters which could complete the given
- text. */
- extern void interpreter_completer (struct cmd_list_element *ignore,
- completion_tracker &tracker,
- const char *text,
- const char *word);
- /* well-known interpreters */
- #define INTERP_CONSOLE "console"
- #define INTERP_MI1 "mi1"
- #define INTERP_MI2 "mi2"
- #define INTERP_MI3 "mi3"
- #define INTERP_MI "mi"
- #define INTERP_TUI "tui"
- #define INTERP_INSIGHT "insight"
- #endif
|