2007-11-12 Markus Deuling <deuling@de.ibm.com>
[deliverable/binutils-gdb.git] / gdb / tui / tui-interp.c
CommitLineData
021e7609
AC
1/* TUI Interpreter definitions for GDB, the GNU debugger.
2
6aba47ca 3 Copyright (C) 2003, 2007 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 *
51tui_init (void)
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 {
167 /* FIXME: this should really be a call to a hook that is
168 interface specific, because interfaces can display the
169 prompt in their own way. */
170 display_gdb_prompt (0);
171 /* This call looks bizarre, but it is required. If the user
172 entered a command that caused an error,
173 after_char_processing_hook won't be called from
174 rl_callback_read_char_wrapper. Using a cleanup there
175 won't work, since we want this function to be called
176 after a new prompt is printed. */
177 if (after_char_processing_hook)
178 (*after_char_processing_hook) ();
179 /* Maybe better to set a flag to be checked somewhere as to
180 whether display the prompt or not. */
181 }
182 }
183
184 /* We are done with the event loop. There are no more event sources
185 to listen to. So we exit GDB. */
186 return;
187}
188
189void
190_initialize_tui_interp (void)
191{
192 static const struct interp_procs procs = {
193 tui_init,
194 tui_resume,
195 tui_suspend,
196 tui_exec,
197 tui_display_prompt_p,
198 tui_command_loop,
199 };
200 struct interp *tui_interp;
201
1cc6d956 202 /* Create a default uiout builder for the TUI. */
021e7609 203 tui_out = tui_out_new (gdb_stdout);
cc4349ed
AS
204 interp_add (interp_new (INTERP_TUI, NULL, tui_out, &procs));
205 if (interpreter_p && strcmp (interpreter_p, INTERP_TUI) == 0)
63858210
SC
206 tui_start_enabled = 1;
207
208 if (interpreter_p && strcmp (interpreter_p, INTERP_CONSOLE) == 0)
209 {
210 xfree (interpreter_p);
cc4349ed 211 interpreter_p = xstrdup (INTERP_TUI);
63858210 212 }
021e7609 213}
This page took 0.441466 seconds and 4 git commands to generate.