(TRAP_REMOVE_SYSCALL_FLAG): New macro.
[deliverable/binutils-gdb.git] / gdb / tui / tui-interp.c
CommitLineData
021e7609
AC
1/* TUI Interpreter definitions for GDB, the GNU debugger.
2
0fb0cc75 3 Copyright (C) 2003, 2007, 2008, 2009 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"
60250e8b 32#include "exceptions.h"
021e7609 33
1cc6d956
MS
34/* Set to 1 when the TUI mode must be activated when we first start
35 gdb. */
63858210
SC
36static int tui_start_enabled = 0;
37
021e7609
AC
38/* Cleanup the tui before exiting. */
39
40static void
41tui_exit (void)
42{
1cc6d956
MS
43 /* Disable the tui. Curses mode is left leaving the screen in a
44 clean state (see endwin()). */
021e7609
AC
45 tui_disable ();
46}
47
48/* These implement the TUI interpreter. */
49
50static void *
683f2885 51tui_init (int top_level)
021e7609
AC
52{
53 /* Install exit handler to leave the screen in a good shape. */
54 atexit (tui_exit);
55
dd1abb8c 56 tui_initialize_static_data ();
021e7609
AC
57
58 tui_initialize_io ();
9612b5ec 59 tui_initialize_win ();
021e7609
AC
60 tui_initialize_readline ();
61
62 return NULL;
63}
64
65static int
66tui_resume (void *data)
67{
95cd630e
DJ
68 struct ui_file *stream;
69
1cc6d956
MS
70 /* gdb_setup_readline will change gdb_stdout. If the TUI was
71 previously writing to gdb_stdout, then set it to the new
72 gdb_stdout afterwards. */
95cd630e
DJ
73
74 stream = cli_out_set_stream (tui_old_uiout, gdb_stdout);
75 if (stream != gdb_stdout)
76 {
77 cli_out_set_stream (tui_old_uiout, stream);
78 stream = NULL;
79 }
80
021e7609 81 gdb_setup_readline ();
95cd630e
DJ
82
83 if (stream != NULL)
84 cli_out_set_stream (tui_old_uiout, gdb_stdout);
85
63858210
SC
86 if (tui_start_enabled)
87 tui_enable ();
021e7609
AC
88 return 1;
89}
90
91static int
92tui_suspend (void *data)
93{
63858210 94 tui_start_enabled = tui_active;
021e7609
AC
95 tui_disable ();
96 return 1;
97}
98
99/* Display the prompt if we are silent. */
100
101static int
102tui_display_prompt_p (void *data)
103{
104 if (interp_quiet_p (NULL))
105 return 0;
106 else
107 return 1;
108}
109
71fff37b 110static struct gdb_exception
021e7609
AC
111tui_exec (void *data, const char *command_str)
112{
e2e0b3e5 113 internal_error (__FILE__, __LINE__, _("tui_exec called"));
021e7609
AC
114}
115
116
117/* Initialize all the necessary variables, start the event loop,
118 register readline, and stdin, start the loop. */
119
120static void
121tui_command_loop (void *data)
122{
021e7609
AC
123 /* If we are using readline, set things up and display the first
124 prompt, otherwise just print the prompt. */
125 if (async_command_editing_p)
126 {
2ed23f5f
MS
127 int length;
128 char *a_prompt;
129 char *gdb_prompt = get_prompt ();
130
021e7609
AC
131 /* Tell readline what the prompt to display is and what function
132 it will need to call after a whole line is read. This also
133 displays the first prompt. */
2ed23f5f
MS
134 length = strlen (PREFIX (0))
135 + strlen (gdb_prompt) + strlen (SUFFIX (0)) + 1;
136 a_prompt = (char *) alloca (length);
021e7609
AC
137 strcpy (a_prompt, PREFIX (0));
138 strcat (a_prompt, gdb_prompt);
139 strcat (a_prompt, SUFFIX (0));
140 rl_callback_handler_install (a_prompt, input_handler);
141 }
142 else
143 display_gdb_prompt (0);
144
145 /* Loop until there is nothing to do. This is the entry point to the
146 event loop engine. gdb_do_one_event, called via catch_errors()
147 will process one event for each invocation. It blocks waits for
148 an event and then processes it. >0 when an event is processed, 0
149 when catch_errors() caught an error and <0 when there are no
150 longer any event sources registered. */
151 while (1)
152 {
153 int result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL);
154 if (result < 0)
155 break;
156
157 /* Update gdb output according to TUI mode. Since catch_errors
158 preserves the uiout from changing, this must be done at top
159 level of event loop. */
160 if (tui_active)
161 uiout = tui_out;
162 else
163 uiout = tui_old_uiout;
164
165 if (result == 0)
166 {
32c1e744
VP
167 /* If any exception escaped to here, we better enable
168 stdin. Otherwise, any command that calls async_disable_stdin,
169 and then throws, will leave stdin inoperable. */
712af3be 170 async_enable_stdin ();
021e7609
AC
171 /* FIXME: this should really be a call to a hook that is
172 interface specific, because interfaces can display the
173 prompt in their own way. */
174 display_gdb_prompt (0);
175 /* This call looks bizarre, but it is required. If the user
176 entered a command that caused an error,
177 after_char_processing_hook won't be called from
178 rl_callback_read_char_wrapper. Using a cleanup there
179 won't work, since we want this function to be called
180 after a new prompt is printed. */
181 if (after_char_processing_hook)
182 (*after_char_processing_hook) ();
183 /* Maybe better to set a flag to be checked somewhere as to
184 whether display the prompt or not. */
185 }
186 }
187
188 /* We are done with the event loop. There are no more event sources
189 to listen to. So we exit GDB. */
190 return;
191}
192
2c0b251b
PA
193/* Provide a prototype to silence -Wmissing-prototypes. */
194extern initialize_file_ftype _initialize_tui_interp;
195
021e7609
AC
196void
197_initialize_tui_interp (void)
198{
199 static const struct interp_procs procs = {
200 tui_init,
201 tui_resume,
202 tui_suspend,
203 tui_exec,
204 tui_display_prompt_p,
205 tui_command_loop,
206 };
207 struct interp *tui_interp;
208
1cc6d956 209 /* Create a default uiout builder for the TUI. */
021e7609 210 tui_out = tui_out_new (gdb_stdout);
cc4349ed
AS
211 interp_add (interp_new (INTERP_TUI, NULL, tui_out, &procs));
212 if (interpreter_p && strcmp (interpreter_p, INTERP_TUI) == 0)
63858210
SC
213 tui_start_enabled = 1;
214
215 if (interpreter_p && strcmp (interpreter_p, INTERP_CONSOLE) == 0)
216 {
217 xfree (interpreter_p);
cc4349ed 218 interpreter_p = xstrdup (INTERP_TUI);
63858210 219 }
021e7609 220}
This page took 0.630937 seconds and 4 git commands to generate.