New common function "startswith"
[deliverable/binutils-gdb.git] / gdb / tui / tui-interp.c
CommitLineData
021e7609
AC
1/* TUI Interpreter definitions for GDB, the GNU debugger.
2
32d0add0 3 Copyright (C) 2003-2015 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
58/* Observer for the signal_received notification. */
59
60static void
61tui_on_signal_received (enum gdb_signal siggnal)
62{
63 if (!interp_quiet_p (tui_interp))
64 print_signal_received_reason (tui_ui_out (tui_interp), siggnal);
65}
66
67/* Observer for the end_stepping_range notification. */
68
69static void
70tui_on_end_stepping_range (void)
71{
72 if (!interp_quiet_p (tui_interp))
73 print_end_stepping_range_reason (tui_ui_out (tui_interp));
74}
75
76/* Observer for the signal_exited notification. */
77
78static void
79tui_on_signal_exited (enum gdb_signal siggnal)
80{
81 if (!interp_quiet_p (tui_interp))
82 print_signal_exited_reason (tui_ui_out (tui_interp), siggnal);
83}
84
85/* Observer for the exited notification. */
86
87static void
88tui_on_exited (int exitstatus)
89{
90 if (!interp_quiet_p (tui_interp))
91 print_exited_reason (tui_ui_out (tui_interp), exitstatus);
92}
93
94/* Observer for the no_history notification. */
95
96static void
97tui_on_no_history (void)
98{
99 if (!interp_quiet_p (tui_interp))
100 print_no_history_reason (tui_ui_out (tui_interp));
101}
102
92bcb5f9
PA
103/* Observer for the sync_execution_done notification. */
104
105static void
106tui_on_sync_execution_done (void)
107{
108 if (!interp_quiet_p (tui_interp))
109 display_gdb_prompt (NULL);
110}
111
112/* Observer for the command_error notification. */
113
114static void
115tui_on_command_error (void)
116{
117 if (!interp_quiet_p (tui_interp))
118 display_gdb_prompt (NULL);
119}
120
021e7609
AC
121/* These implement the TUI interpreter. */
122
123static void *
4801a9a3 124tui_init (struct interp *self, int top_level)
021e7609
AC
125{
126 /* Install exit handler to leave the screen in a good shape. */
127 atexit (tui_exit);
128
dd1abb8c 129 tui_initialize_static_data ();
021e7609
AC
130
131 tui_initialize_io ();
9612b5ec 132 tui_initialize_win ();
1180b2c8
L
133 if (ui_file_isatty (gdb_stdout))
134 tui_initialize_readline ();
021e7609 135
fd664c91
PA
136 /* If changing this, remember to update cli-interp.c as well. */
137 observer_attach_signal_received (tui_on_signal_received);
138 observer_attach_end_stepping_range (tui_on_end_stepping_range);
139 observer_attach_signal_exited (tui_on_signal_exited);
140 observer_attach_exited (tui_on_exited);
141 observer_attach_no_history (tui_on_no_history);
92bcb5f9
PA
142 observer_attach_sync_execution_done (tui_on_sync_execution_done);
143 observer_attach_command_error (tui_on_command_error);
fd664c91 144
021e7609
AC
145 return NULL;
146}
147
148static int
149tui_resume (void *data)
150{
95cd630e
DJ
151 struct ui_file *stream;
152
1cc6d956
MS
153 /* gdb_setup_readline will change gdb_stdout. If the TUI was
154 previously writing to gdb_stdout, then set it to the new
155 gdb_stdout afterwards. */
95cd630e
DJ
156
157 stream = cli_out_set_stream (tui_old_uiout, gdb_stdout);
158 if (stream != gdb_stdout)
159 {
160 cli_out_set_stream (tui_old_uiout, stream);
161 stream = NULL;
162 }
163
021e7609 164 gdb_setup_readline ();
95cd630e
DJ
165
166 if (stream != NULL)
167 cli_out_set_stream (tui_old_uiout, gdb_stdout);
168
63858210
SC
169 if (tui_start_enabled)
170 tui_enable ();
021e7609
AC
171 return 1;
172}
173
174static int
175tui_suspend (void *data)
176{
63858210 177 tui_start_enabled = tui_active;
021e7609
AC
178 tui_disable ();
179 return 1;
180}
181
4801a9a3
PA
182static struct ui_out *
183tui_ui_out (struct interp *self)
184{
185 if (tui_active)
186 return tui_out;
187 else
188 return tui_old_uiout;
189}
190
71fff37b 191static struct gdb_exception
021e7609
AC
192tui_exec (void *data, const char *command_str)
193{
e2e0b3e5 194 internal_error (__FILE__, __LINE__, _("tui_exec called"));
021e7609
AC
195}
196
2c0b251b
PA
197/* Provide a prototype to silence -Wmissing-prototypes. */
198extern initialize_file_ftype _initialize_tui_interp;
199
021e7609
AC
200void
201_initialize_tui_interp (void)
202{
203 static const struct interp_procs procs = {
204 tui_init,
205 tui_resume,
206 tui_suspend,
207 tui_exec,
4801a9a3 208 tui_ui_out,
4d09c5b4
AB
209 NULL,
210 cli_command_loop
021e7609 211 };
021e7609 212
1cc6d956 213 /* Create a default uiout builder for the TUI. */
4801a9a3
PA
214 tui_interp = interp_new (INTERP_TUI, &procs);
215 interp_add (tui_interp);
cc4349ed 216 if (interpreter_p && strcmp (interpreter_p, INTERP_TUI) == 0)
63858210
SC
217 tui_start_enabled = 1;
218
219 if (interpreter_p && strcmp (interpreter_p, INTERP_CONSOLE) == 0)
220 {
221 xfree (interpreter_p);
cc4349ed 222 interpreter_p = xstrdup (INTERP_TUI);
63858210 223 }
021e7609 224}
This page took 1.189952 seconds and 4 git commands to generate.