/* TUI support I/O functions.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007
- Free Software Foundation, Inc.
+ Copyright (C) 1998-2014 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "target.h"
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
+#include "filestuff.h"
#include "gdb_curses.h"
|| (ch == KEY_LEFT) || (ch == KEY_RIGHT)
|| (ch == KEY_UP) || (ch == KEY_DOWN)
|| (ch == KEY_SF) || (ch == KEY_SR)
- || (ch == (int)'\f') || key_is_start_sequence (ch));
+ || (ch == (int)'\f')
+ || key_is_start_sequence (ch));
}
/* Use definition from readline 4.3. */
#undef CTRL_CHAR
-#define CTRL_CHAR(c) ((c) < control_character_threshold && (((c) & 0x80) == 0))
+#define CTRL_CHAR(c) \
+ ((c) < control_character_threshold && (((c) & 0x80) == 0))
/* This file controls the IO interactions between gdb and curses.
When the TUI is enabled, gdb has two modes a curses and a standard
#undef TUI_USE_PIPE_FOR_READLINE. */
/* For gdb 5.3, prefer to continue the pipe hack as a backup wheel. */
+#ifdef HAVE_PIPE
#define TUI_USE_PIPE_FOR_READLINE
+#endif
/* #undef TUI_USE_PIPE_FOR_READLINE */
/* TUI output files. */
struct ui_out *tui_old_uiout;
/* Readline previous hooks. */
-static Function *tui_old_rl_getc_function;
-static VFunction *tui_old_rl_redisplay_function;
-static VFunction *tui_old_rl_prep_terminal;
-static VFunction *tui_old_rl_deprep_terminal;
-static int tui_old_readline_echoing_p;
+static rl_getc_func_t *tui_old_rl_getc_function;
+static rl_voidfunc_t *tui_old_rl_redisplay_function;
+static rl_vintfunc_t *tui_old_rl_prep_terminal;
+static rl_voidfunc_t *tui_old_rl_deprep_terminal;
+static int tui_old_rl_echoing_p;
/* Readline output stream.
Should be removed when readline is clean. */
}
getyx (w, TUI_CMD_WIN->detail.command_info.cur_line,
TUI_CMD_WIN->detail.command_info.curch);
- TUI_CMD_WIN->detail.command_info.start_line = TUI_CMD_WIN->detail.command_info.cur_line;
+ TUI_CMD_WIN->detail.command_info.start_line
+ = TUI_CMD_WIN->detail.command_info.cur_line;
/* We could defer the following. */
wrefresh (w);
/* Detect when we temporarily left SingleKey and now the readline
edit buffer is empty, automatically restore the SingleKey
- mode. */
- if (tui_current_key_mode == TUI_ONE_COMMAND_MODE && rl_end == 0)
+ mode. The restore must only be done if the command has finished.
+ The command could call prompt_for_continue and we must not
+ restore SingleKey so that the prompt and normal keymap are used. */
+ if (tui_current_key_mode == TUI_ONE_COMMAND_MODE && rl_end == 0
+ && immediate_quit == 0)
tui_set_key_mode (TUI_SINGLE_KEY_MODE);
if (tui_current_key_mode == TUI_SINGLE_KEY_MODE)
(we can't use gdb_prompt() due to secondary prompts and can't use
rl_prompt because it points to an alloca buffer). */
xfree (tui_rl_saved_prompt);
- tui_rl_saved_prompt = xstrdup (rl_prompt);
+ tui_rl_saved_prompt = rl_prompt != NULL ? xstrdup (rl_prompt) : NULL;
}
/* Readline callback to restore the terminal. It is called once each
/* Read readline output pipe and feed the command window with it.
Should be removed when readline is clean. */
static void
-tui_readline_output (int code, gdb_client_data data)
+tui_readline_output (int error, gdb_client_data data)
{
int size;
char buf[256];
final slash. Otherwise, we return what we were passed.
Comes from readline/complete.c. */
-static char *
-printable_part (char *pathname)
+static const char *
+printable_part (const char *pathname)
{
- char *temp;
-
- temp = rl_filename_completion_desired ? strrchr (pathname, '/') : (char *)NULL;
-#if defined (__MSDOS__)
- if (rl_filename_completion_desired && temp == 0 && isalpha (pathname[0]) && pathname[1] == ':')
- temp = pathname + 1;
-#endif
- return (temp ? ++temp : pathname);
+ return rl_filename_completion_desired ? lbasename (pathname) : pathname;
}
/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and
} while (0)
static int
-print_filename (char *to_print, char *full_pathname)
+print_filename (const char *to_print, const char *full_pathname)
{
int printed_len = 0;
- char *s;
+ const char *s;
for (s = to_print; *s; s++)
{
tui_rl_display_match_list (char **matches, int len, int max)
{
typedef int QSFUNC (const void *, const void *);
- extern int _rl_qsort_string_compare (const void*, const void*);
+ extern int _rl_qsort_string_compare (const void *,
+ const void *);
extern int _rl_print_completions_horizontally;
int count, limit, printed_len;
int i, j, k, l;
- char *temp;
+ const char *temp;
/* Screen dimension correspond to the TUI command window. */
int screenwidth = TUI_CMD_WIN->generic.width;
{
char msg[256];
- sprintf (msg, "\nDisplay all %d possibilities? (y or n)", len);
+ xsnprintf (msg, sizeof (msg),
+ "\nDisplay all %d possibilities? (y or n)", len);
tui_puts (msg);
if (get_y_or_n () == 0)
{
void
tui_setup_io (int mode)
{
- extern int readline_echoing_p;
-
+ extern int _rl_echoing_p;
+
if (mode)
{
/* Redirect readline to TUI. */
tui_old_rl_prep_terminal = rl_prep_term_function;
tui_old_rl_getc_function = rl_getc_function;
tui_old_rl_outstream = rl_outstream;
- tui_old_readline_echoing_p = readline_echoing_p;
+ tui_old_rl_echoing_p = _rl_echoing_p;
rl_redisplay_function = tui_redisplay_readline;
rl_deprep_term_function = tui_deprep_terminal;
rl_prep_term_function = tui_prep_terminal;
rl_getc_function = tui_getc;
- readline_echoing_p = 0;
+ _rl_echoing_p = 0;
rl_outstream = tui_rl_outstream;
rl_prompt = 0;
rl_completion_display_matches_hook = tui_rl_display_match_list;
/* Keep track of previous gdb output. */
tui_old_stdout = gdb_stdout;
tui_old_stderr = gdb_stderr;
- tui_old_uiout = uiout;
+ tui_old_uiout = current_uiout;
/* Reconfigure gdb output. */
gdb_stdout = tui_stdout;
gdb_stderr = tui_stderr;
gdb_stdlog = gdb_stdout; /* for moment */
gdb_stdtarg = gdb_stderr; /* for moment */
- uiout = tui_out;
+ gdb_stdtargerr = gdb_stderr; /* for moment */
+ current_uiout = tui_out;
/* Save tty for SIGCONT. */
savetty ();
gdb_stderr = tui_old_stderr;
gdb_stdlog = gdb_stdout; /* for moment */
gdb_stdtarg = gdb_stderr; /* for moment */
- uiout = tui_old_uiout;
+ gdb_stdtargerr = gdb_stderr; /* for moment */
+ current_uiout = tui_old_uiout;
/* Restore readline. */
rl_redisplay_function = tui_old_rl_redisplay_function;
rl_getc_function = tui_old_rl_getc_function;
rl_outstream = tui_old_rl_outstream;
rl_completion_display_matches_hook = 0;
- readline_echoing_p = tui_old_readline_echoing_p;
+ _rl_echoing_p = tui_old_rl_echoing_p;
rl_already_prompted = 0;
/* Save tty for SIGCONT. */
tui_stderr = tui_fileopen (stderr);
tui_out = tui_out_new (tui_stdout);
- /* Create the default UI. It is not created because we installed a
- deprecated_init_ui_hook. */
- tui_old_uiout = uiout = cli_out_new (gdb_stdout);
+ /* Create the default UI. */
+ tui_old_uiout = cli_out_new (gdb_stdout);
#ifdef TUI_USE_PIPE_FOR_READLINE
/* Temporary solution for readline writing to stdout: redirect
readline output in a pipe, read that pipe and output the content
in the curses command window. */
- if (pipe (tui_readline_pipe) != 0)
+ if (gdb_pipe_cloexec (tui_readline_pipe) != 0)
{
fprintf_unfiltered (gdb_stderr, "Cannot create pipe for readline");
exit (1);
#ifdef TUI_USE_PIPE_FOR_READLINE
/* Flush readline output. */
- tui_readline_output (GDB_READABLE, 0);
+ tui_readline_output (0, 0);
#endif
ch = wgetch (w);
{
if (tui_win_resized ())
{
+ tui_resize_all ();
tui_refresh_all_win ();
dont_repeat ();
tui_set_win_resized_to (FALSE);