Introduce interpreter factories
[deliverable/binutils-gdb.git] / gdb / tui / tui-interp.c
CommitLineData
021e7609
AC
1/* TUI Interpreter definitions for GDB, the GNU debugger.
2
618f726f 3 Copyright (C) 2003-2016 Free Software Foundation, Inc.
021e7609
AC
4
5 This file is part of GDB.
6
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
021e7609
AC
10 (at your option) any later version.
11
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.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
021e7609
AC
19
20#include "defs.h"
21#include "interps.h"
22#include "top.h"
23#include "event-top.h"
24#include "event-loop.h"
25#include "ui-out.h"
95cd630e 26#include "cli-out.h"
d7b2e967 27#include "tui/tui-data.h"
021e7609 28#include "readline/readline.h"
d7b2e967 29#include "tui/tui-win.h"
021e7609 30#include "tui/tui.h"
d7b2e967 31#include "tui/tui-io.h"
fd664c91
PA
32#include "infrun.h"
33#include "observer.h"
34
35static struct ui_out *tui_ui_out (struct interp *self);
021e7609 36
1cc6d956
MS
37/* Set to 1 when the TUI mode must be activated when we first start
38 gdb. */
63858210
SC
39static int tui_start_enabled = 0;
40
fd664c91
PA
41/* The TUI interpreter. */
42static struct interp *tui_interp;
43
021e7609
AC
44/* Cleanup the tui before exiting. */
45
46static void
47tui_exit (void)
48{
1cc6d956
MS
49 /* Disable the tui. Curses mode is left leaving the screen in a
50 clean state (see endwin()). */
021e7609
AC
51 tui_disable ();
52}
53
fd664c91
PA
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. */
57
243a9253
PA
58/* Observer for the normal_stop notification. */
59
60static void
61tui_on_normal_stop (struct bpstats *bs, int print_frame)
62{
63 if (!interp_quiet_p (tui_interp))
64 {
65 if (print_frame)
66 print_stop_event (tui_ui_out (tui_interp));
67 }
68}
69
fd664c91
PA
70/* Observer for the signal_received notification. */
71
72static void
73tui_on_signal_received (enum gdb_signal siggnal)
74{
75 if (!interp_quiet_p (tui_interp))
76 print_signal_received_reason (tui_ui_out (tui_interp), siggnal);
77}
78
79/* Observer for the end_stepping_range notification. */
80
81static void
82tui_on_end_stepping_range (void)
83{
84 if (!interp_quiet_p (tui_interp))
85 print_end_stepping_range_reason (tui_ui_out (tui_interp));
86}
87
88/* Observer for the signal_exited notification. */
89
90static void
91tui_on_signal_exited (enum gdb_signal siggnal)
92{
93 if (!interp_quiet_p (tui_interp))
94 print_signal_exited_reason (tui_ui_out (tui_interp), siggnal);
95}
96
97/* Observer for the exited notification. */
98
99static void
100tui_on_exited (int exitstatus)
101{
102 if (!interp_quiet_p (tui_interp))
103 print_exited_reason (tui_ui_out (tui_interp), exitstatus);
104}
105
106/* Observer for the no_history notification. */
107
108static void
109tui_on_no_history (void)
110{
111 if (!interp_quiet_p (tui_interp))
112 print_no_history_reason (tui_ui_out (tui_interp));
113}
114
92bcb5f9
PA
115/* Observer for the sync_execution_done notification. */
116
117static void
118tui_on_sync_execution_done (void)
119{
120 if (!interp_quiet_p (tui_interp))
121 display_gdb_prompt (NULL);
122}
123
124/* Observer for the command_error notification. */
125
126static void
127tui_on_command_error (void)
128{
129 if (!interp_quiet_p (tui_interp))
130 display_gdb_prompt (NULL);
131}
132
021e7609
AC
133/* These implement the TUI interpreter. */
134
135static void *
4801a9a3 136tui_init (struct interp *self, int top_level)
021e7609
AC
137{
138 /* Install exit handler to leave the screen in a good shape. */
139 atexit (tui_exit);
140
8322445e
PA
141 if (top_level)
142 tui_interp = self;
143
dd1abb8c 144 tui_initialize_static_data ();
021e7609
AC
145
146 tui_initialize_io ();
9612b5ec 147 tui_initialize_win ();
1180b2c8
L
148 if (ui_file_isatty (gdb_stdout))
149 tui_initialize_readline ();
021e7609 150
fd664c91 151 /* If changing this, remember to update cli-interp.c as well. */
243a9253 152 observer_attach_normal_stop (tui_on_normal_stop);
fd664c91
PA
153 observer_attach_signal_received (tui_on_signal_received);
154 observer_attach_end_stepping_range (tui_on_end_stepping_range);
155 observer_attach_signal_exited (tui_on_signal_exited);
156 observer_attach_exited (tui_on_exited);
157 observer_attach_no_history (tui_on_no_history);
92bcb5f9
PA
158 observer_attach_sync_execution_done (tui_on_sync_execution_done);
159 observer_attach_command_error (tui_on_command_error);
fd664c91 160
021e7609
AC
161 return NULL;
162}
163
164static int
165tui_resume (void *data)
166{
95cd630e
DJ
167 struct ui_file *stream;
168
1cc6d956
MS
169 /* gdb_setup_readline will change gdb_stdout. If the TUI was
170 previously writing to gdb_stdout, then set it to the new
171 gdb_stdout afterwards. */
95cd630e
DJ
172
173 stream = cli_out_set_stream (tui_old_uiout, gdb_stdout);
174 if (stream != gdb_stdout)
175 {
176 cli_out_set_stream (tui_old_uiout, stream);
177 stream = NULL;
178 }
179
021e7609 180 gdb_setup_readline ();
95cd630e
DJ
181
182 if (stream != NULL)
183 cli_out_set_stream (tui_old_uiout, gdb_stdout);
184
63858210
SC
185 if (tui_start_enabled)
186 tui_enable ();
021e7609
AC
187 return 1;
188}
189
190static int
191tui_suspend (void *data)
192{
63858210 193 tui_start_enabled = tui_active;
021e7609
AC
194 tui_disable ();
195 return 1;
196}
197
4801a9a3
PA
198static struct ui_out *
199tui_ui_out (struct interp *self)
200{
201 if (tui_active)
202 return tui_out;
203 else
204 return tui_old_uiout;
205}
206
71fff37b 207static struct gdb_exception
021e7609
AC
208tui_exec (void *data, const char *command_str)
209{
e2e0b3e5 210 internal_error (__FILE__, __LINE__, _("tui_exec called"));
021e7609
AC
211}
212
8322445e
PA
213/* The TUI interpreter's vtable. */
214
215static const struct interp_procs tui_interp_procs = {
216 tui_init,
217 tui_resume,
218 tui_suspend,
219 tui_exec,
220 tui_ui_out,
221 NULL,
222 cli_command_loop
223};
224
225/* Factory for TUI interpreters. */
226
227static struct interp *
228tui_interp_factory (const char *name)
229{
230 return interp_new (name, &tui_interp_procs, NULL);
231}
232
2c0b251b
PA
233/* Provide a prototype to silence -Wmissing-prototypes. */
234extern initialize_file_ftype _initialize_tui_interp;
235
021e7609
AC
236void
237_initialize_tui_interp (void)
238{
8322445e
PA
239 interp_factory_register (INTERP_TUI, tui_interp_factory);
240
cc4349ed 241 if (interpreter_p && strcmp (interpreter_p, INTERP_TUI) == 0)
63858210
SC
242 tui_start_enabled = 1;
243
244 if (interpreter_p && strcmp (interpreter_p, INTERP_CONSOLE) == 0)
245 {
246 xfree (interpreter_p);
cc4349ed 247 interpreter_p = xstrdup (INTERP_TUI);
63858210 248 }
021e7609 249}
This page took 1.361635 seconds and 4 git commands to generate.