1 /* CLI Definitions for GDB, the GNU debugger.
3 Copyright (C) 2002-2016 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "cli-interp.h"
23 #include "event-top.h"
26 #include "top.h" /* for "execute_command" */
27 #include "event-top.h"
31 /* The console interpreter. */
34 /* The ui_out for the console interpreter. */
35 struct ui_out *cli_uiout;
38 /* Returns the INTERP's data cast as cli_interp if INTERP is a CLI,
39 and returns NULL otherwise. */
41 static struct cli_interp *
42 as_cli_interp (struct interp *interp)
44 if (strcmp (interp_name (interp), INTERP_CONSOLE) == 0)
45 return (struct cli_interp *) interp_data (interp);
49 /* Longjmp-safe wrapper for "execute_command". */
50 static struct gdb_exception safe_execute_command (struct ui_out *uiout,
54 /* Observers for several run control events. If the interpreter is
55 quiet (i.e., another interpreter is being run with
56 interpreter-exec), print nothing. */
58 /* Observer for the normal_stop notification. */
61 cli_on_normal_stop (struct bpstats *bs, int print_frame)
63 struct switch_thru_all_uis state;
65 SWITCH_THRU_ALL_UIS (state)
67 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
73 print_stop_event (cli->cli_uiout);
77 /* Observer for the signal_received notification. */
80 cli_on_signal_received (enum gdb_signal siggnal)
82 struct switch_thru_all_uis state;
84 SWITCH_THRU_ALL_UIS (state)
86 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
91 print_signal_received_reason (cli->cli_uiout, siggnal);
95 /* Observer for the end_stepping_range notification. */
98 cli_on_end_stepping_range (void)
100 struct switch_thru_all_uis state;
102 SWITCH_THRU_ALL_UIS (state)
104 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
109 print_end_stepping_range_reason (cli->cli_uiout);
113 /* Observer for the signalled notification. */
116 cli_on_signal_exited (enum gdb_signal siggnal)
118 struct switch_thru_all_uis state;
120 SWITCH_THRU_ALL_UIS (state)
122 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
127 print_signal_exited_reason (cli->cli_uiout, siggnal);
131 /* Observer for the exited notification. */
134 cli_on_exited (int exitstatus)
136 struct switch_thru_all_uis state;
138 SWITCH_THRU_ALL_UIS (state)
140 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
145 print_exited_reason (cli->cli_uiout, exitstatus);
149 /* Observer for the no_history notification. */
152 cli_on_no_history (void)
154 struct switch_thru_all_uis state;
156 SWITCH_THRU_ALL_UIS (state)
158 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
163 print_no_history_reason (cli->cli_uiout);
167 /* Observer for the sync_execution_done notification. */
170 cli_on_sync_execution_done (void)
172 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
177 display_gdb_prompt (NULL);
180 /* Observer for the command_error notification. */
183 cli_on_command_error (void)
185 struct cli_interp *cli = as_cli_interp (top_level_interpreter ());
190 display_gdb_prompt (NULL);
193 /* pre_command_loop implementation. */
196 cli_interpreter_pre_command_loop (struct interp *self)
198 display_gdb_prompt (0);
201 /* These implement the cli out interpreter: */
204 cli_interpreter_init (struct interp *self, int top_level)
206 return interp_data (self);
210 cli_interpreter_resume (void *data)
212 struct ui *ui = current_ui;
213 struct cli_interp *cli = (struct cli_interp *) data;
214 struct ui_file *stream;
216 /*sync_execution = 1; */
218 /* gdb_setup_readline will change gdb_stdout. If the CLI was
219 previously writing to gdb_stdout, then set it to the new
220 gdb_stdout afterwards. */
222 stream = cli_out_set_stream (cli->cli_uiout, gdb_stdout);
223 if (stream != gdb_stdout)
225 cli_out_set_stream (cli->cli_uiout, stream);
229 gdb_setup_readline (1);
231 ui->input_handler = command_line_handler;
234 cli_out_set_stream (cli->cli_uiout, gdb_stdout);
240 cli_interpreter_suspend (void *data)
242 gdb_disable_readline ();
246 static struct gdb_exception
247 cli_interpreter_exec (void *data, const char *command_str)
249 struct cli_interp *cli = (struct cli_interp *) data;
250 struct ui_file *old_stream;
251 struct gdb_exception result;
253 /* FIXME: cagney/2003-02-01: Need to const char *propogate
254 safe_execute_command. */
255 char *str = (char *) alloca (strlen (command_str) + 1);
256 strcpy (str, command_str);
258 /* gdb_stdout could change between the time cli_uiout was
259 initialized and now. Since we're probably using a different
260 interpreter which has a new ui_file for gdb_stdout, use that one
261 instead of the default.
263 It is important that it gets reset everytime, since the user
264 could set gdb to use a different interpreter. */
265 old_stream = cli_out_set_stream (cli->cli_uiout, gdb_stdout);
266 result = safe_execute_command (cli->cli_uiout, str, 1);
267 cli_out_set_stream (cli->cli_uiout, old_stream);
272 cli_interpreter_supports_command_editing (struct interp *interp)
277 static struct gdb_exception
278 safe_execute_command (struct ui_out *command_uiout, char *command, int from_tty)
280 struct gdb_exception e = exception_none;
281 struct ui_out *saved_uiout;
283 /* Save and override the global ``struct ui_out'' builder. */
284 saved_uiout = current_uiout;
285 current_uiout = command_uiout;
289 execute_command (command, from_tty);
291 CATCH (exception, RETURN_MASK_ALL)
297 /* Restore the global builder. */
298 current_uiout = saved_uiout;
300 /* FIXME: cagney/2005-01-13: This shouldn't be needed. Instead the
301 caller should print the exception. */
302 exception_print (gdb_stderr, e);
306 static struct ui_out *
307 cli_ui_out (struct interp *self)
309 struct cli_interp *cli = (struct cli_interp *) interp_data (self);
311 return cli->cli_uiout;
314 /* The CLI interpreter's vtable. */
316 static const struct interp_procs cli_interp_procs = {
317 cli_interpreter_init, /* init_proc */
318 cli_interpreter_resume, /* resume_proc */
319 cli_interpreter_suspend, /* suspend_proc */
320 cli_interpreter_exec, /* exec_proc */
321 cli_ui_out, /* ui_out_proc */
322 NULL, /* set_logging_proc */
323 cli_interpreter_pre_command_loop, /* pre_command_loop_proc */
324 cli_interpreter_supports_command_editing, /* supports_command_editing_proc */
327 /* Factory for CLI interpreters. */
329 static struct interp *
330 cli_interp_factory (const char *name)
332 struct cli_interp *cli = XNEW (struct cli_interp);
334 /* Create a default uiout builder for the CLI. */
335 cli->cli_uiout = cli_out_new (gdb_stdout);
337 return interp_new (name, &cli_interp_procs, cli);
340 /* Standard gdb initialization hook. */
341 extern initialize_file_ftype _initialize_cli_interp; /* -Wmissing-prototypes */
344 _initialize_cli_interp (void)
346 interp_factory_register (INTERP_CONSOLE, cli_interp_factory);
348 /* If changing this, remember to update tui-interp.c as well. */
349 observer_attach_normal_stop (cli_on_normal_stop);
350 observer_attach_end_stepping_range (cli_on_end_stepping_range);
351 observer_attach_signal_received (cli_on_signal_received);
352 observer_attach_signal_exited (cli_on_signal_exited);
353 observer_attach_exited (cli_on_exited);
354 observer_attach_no_history (cli_on_no_history);
355 observer_attach_sync_execution_done (cli_on_sync_execution_done);
356 observer_attach_command_error (cli_on_command_error);