| /* Manages interpreters for GDB, the GNU debugger. | 
 |  | 
 |    Copyright (C) 2000-2021 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; | 
 | }; | 
 |  | 
 | extern void interp_add (struct ui *ui, struct interp *interp); | 
 |  | 
 | /* 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 |