- Backport readline history for input mode commands like `command' (BZ

215816).
- Resolves: rhbz#215816
This commit is contained in:
Jan Kratochvil 2007-01-11 21:28:57 +00:00
parent 65bc5f9692
commit 3cdd4d2bbe
3 changed files with 209 additions and 128 deletions

View File

@ -1,97 +1,52 @@
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=215816 https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=215816
Index: ./gdb/testsuite/gdb.base/readline-callback-history.c 2007-01-03 Jan Kratochvil <jan.kratochvil@redhat.com>
=================================================================== Daniel Jacobowitz <dan@codesourcery.com>
RCS file: ./gdb/testsuite/gdb.base/readline-callback-history.c
diff -N ./gdb/testsuite/gdb.base/readline-callback-history.c * gdb.base/readline.exp: Set $TERM. Test arrow keys in
--- /dev/null 1 Jan 1970 00:00:00 -0000 secondary prompts.
+++ ./gdb/testsuite/gdb.base/readline-callback-history.c 25 Dec 2006 22:54:37 -0000
@@ -0,0 +1,25 @@
+/* This testcase is part of GDB, the GNU debugger. --- ./gdb/testsuite/gdb.base/readline.exp 8 Jun 2003 13:14:05 -0000 1.2
+ +++ ./gdb/testsuite/gdb.base/readline.exp 3 Jan 2007 21:22:47 -0000
+ Copyright 2006 Free Software Foundation, Inc. @@ -1,4 +1,4 @@
+ -# Copyright 2002 Free Software Foundation, Inc.
+ This program is free software; you can redistribute it and/or modify +# Copyright 2002, 2003, 2007 Free Software Foundation, Inc.
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or # This program is free software; you can redistribute it and/or modify
+ (at your option) any later version. # it under the terms of the GNU General Public License as published by
+ @@ -159,6 +159,14 @@ if [info exists env(INPUTRC)] {
+ This program is distributed in the hope that it will be useful, }
+ but WITHOUT ANY WARRANTY; without even the implied warranty of set env(INPUTRC) "/dev/null"
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details. +# The arrow key test relies on the standard VT100 bindings, so make
+ +# sure that an appropriate terminal is selected. The same bug
+ You should have received a copy of the GNU General Public License +# doesn't show up if we use ^P / ^N instead.
+ along with this program; if not, write to the Free Software +if [info exists env(TERM)] {
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + set old_term $env(TERM)
+
+ Please email any bugs, comments, and/or additions to this file to:
+ bug-gdb@prep.ai.mit.edu */
+
+int main()
+{
+ return 0;
+} +}
Index: ./gdb/testsuite/gdb.base/readline-callback-history.exp +set env(TERM) "vt100"
===================================================================
RCS file: ./gdb/testsuite/gdb.base/readline-callback-history.exp
diff -N ./gdb/testsuite/gdb.base/readline-callback-history.exp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ./gdb/testsuite/gdb.base/readline-callback-history.exp 25 Dec 2006 22:54:37 -0000
@@ -0,0 +1,55 @@
+# Copyright 2006 Free Software Foundation, Inc.
+ +
+# This program is free software; you can redistribute it and/or modify gdb_start
+# it under the terms of the GNU General Public License as published by gdb_reinitialize_dir $srcdir/$subdir
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version. @@ -178,6 +186,18 @@ operate_and_get_next "operate-and-get-ne
+# "p 5" "" \
+# This program is distributed in the hope that it will be useful, "end" ".* = 5"
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Verify that arrow keys work in secondary prompts. The control
+# GNU General Public License for more details. +# sequence is a hard-coded VT100 up arrow.
+# +gdb_test "print 42" "\\\$\[0-9\]* = 42"
+# You should have received a copy of the GNU General Public License +set msg "arrow keys with secondary prompt"
+# along with this program; if not, write to the Free Software +gdb_test_multiple "if 1 > 0\n\033\[A\033\[A\nend" $msg {
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + -re ".*\\\$\[0-9\]* = 42\r\n$gdb_prompt $" {
+ + pass $msg
+if $tracelevel then { + }
+ strace $tracelevel + -re ".*Undefined command:.*$gdb_prompt $" {
+ fail $msg
+ }
+} +}
+
+set prms_id 0 # Now repeat the first test with a history file that fills the entire
+set bug_id 0 # history list.
+
+set testfile start
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ untested "Couldn't compile test program"
+ return -1
+}
+
+# For: \033[A (up arrow)
+set env(TERM) vt100
+
+# Get things started.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# For C programs, "start" should stop in main().
+
+gdb_test "b main" \
+ "Breakpoint 1 at.*" \
+ "Breakpoint put"
+
+gdb_test "run" \
+ "Breakpoint 1, main (.*) at .*" \
+ "Stopped at the breakpoint"
+
+# \033[A (up arrow)
+gdb_test "command 1\n\033\[A\nend" \
+ "Type commands for when breakpoint 1 is hit.*\n>command 1.*" \
+ "History is available even from callback"

View File

@ -1,42 +1,165 @@
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=215816 https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=215816
Index: ./readline/readline.c 2007-01-03 Jan Kratochvil <jan.kratochvil@redhat.com>
=================================================================== Daniel Jacobowitz <dan@codesourcery.com>
RCS file: /cvs/src/src/readline/readline.c,v
retrieving revision 1.10 * Makefile.in (top.o): Update.
diff -u -p -r1.10 readline.c * top.c (gdb_readline_wrapper_done, gdb_readline_wrapper_result)
--- ./readline/readline.c 5 May 2006 18:26:12 -0000 1.10 (saved_after_char_processing_hook, gdb_readline_wrapper_line)
+++ ./readline/readline.c 22 Nov 2006 19:40:17 -0000 (struct gdb_readline_wrapper_cleanup, gdb_readline_wrapper_cleanup):
@@ -295,6 +295,7 @@ readline (prompt) New.
const char *prompt; (gdb_readline_wrapper): Rewrite to use asynchronous readline.
{
char *value;
+ int in_callback; --- ./gdb/Makefile.in 3 Jan 2007 18:05:43 -0000 1.864
+++ ./gdb/Makefile.in 3 Jan 2007 21:22:46 -0000
@@ -2782,7 +2782,7 @@ top.o: top.c $(defs_h) $(gdbcmd_h) $(cal
$(annotate_h) $(completer_h) $(top_h) $(version_h) $(serial_h) \
$(doublest_h) $(gdb_assert_h) $(readline_h) $(readline_history_h) \
$(event_top_h) $(gdb_string_h) $(gdb_stat_h) $(ui_out_h) \
- $(cli_out_h) $(main_h)
+ $(cli_out_h) $(main_h) $(event_loop_h)
tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(gdbtypes_h) \
$(expression_h) $(gdbcmd_h) $(value_h) $(target_h) $(language_h) \
$(gdb_string_h) $(inferior_h) $(tracepoint_h) $(remote_h) \
--- ./gdb/top.c 1 Jan 2007 05:57:49 -0000 1.116
+++ ./gdb/top.c 3 Jan 2007 21:22:47 -0000
@@ -47,6 +47,7 @@
#include "doublest.h"
#include "gdb_assert.h"
#include "main.h"
+#include "event-loop.h"
/* If we are at EOF return a NULL string. */ /* readline include files */
if (rl_pending_input == EOF) #include "readline/readline.h"
@@ -303,6 +304,13 @@ readline (prompt) @@ -710,24 +710,84 @@
return ((char *)NULL);
}
+ /* When we call readline, we have to make sure that readline isn't in
+ the callback state. Otherwise, it will get really confused.
+ PR gdb tui/2173. */
+ in_callback = RL_ISSTATE (RL_STATE_CALLBACK);
+ if (in_callback)
+ RL_UNSETSTATE (RL_STATE_CALLBACK);
+
rl_set_prompt (prompt);
rl_initialize ();
@@ -321,6 +329,9 @@ readline (prompt)
rl_clear_signals ();
#endif
+ if (in_callback)
+ RL_SETSTATE (RL_STATE_CALLBACK);
+
return (value);
} }
/* This is like readline(), but it has some gdb-specific behavior.
- gdb can use readline in both the synchronous and async modes during
+ gdb may want readline in both the synchronous and async modes during
a single gdb invocation. At the ordinary top-level prompt we might
be using the async readline. That means we can't use
rl_pre_input_hook, since it doesn't work properly in async mode.
However, for a secondary prompt (" >", such as occurs during a
- `define'), gdb just calls readline() directly, running it in
- synchronous mode. So for operate-and-get-next to work in this
- situation, we have to switch the hooks around. That is what
- gdb_readline_wrapper is for. */
+ `define'), gdb wants a synchronous response.
+
+ We used to call readline() directly, running it in synchronous
+ mode. But mixing modes this way is not supported, and as of
+ readline 5.x it no longer works; the arrow keys come unbound during
+ the synchronous call. So we make a nested call into the event
+ loop. That's what gdb_readline_wrapper is for. */
+
+/* A flag set as soon as gdb_readline_wrapper_line is called; we can't
+ rely on gdb_readline_wrapper_result, which might still be NULL if
+ the user types Control-D for EOF. */
+static int gdb_readline_wrapper_done;
+
+/* The result of the current call to gdb_readline_wrapper, once a newline
+ is seen. */
+static char *gdb_readline_wrapper_result;
+
+/* Any intercepted hook. Operate-and-get-next sets this, expecting it
+ to be called after the newline is processed (which will redisplay
+ the prompt). But in gdb_readline_wrapper we will not get a new
+ prompt until the next call, or until we return to the event loop.
+ So we disable this hook around the newline and restore it before we
+ return. */
+static void (*saved_after_char_processing_hook) (void);
+
+/* This function is called when readline has seen a complete line of
+ text. */
+
+static void
+gdb_readline_wrapper_line (char *line)
+{
+ gdb_assert (!gdb_readline_wrapper_done);
+ gdb_readline_wrapper_result = line;
+ gdb_readline_wrapper_done = 1;
+
+ /* Prevent operate-and-get-next from acting too early. */
+ saved_after_char_processing_hook = after_char_processing_hook;
+ after_char_processing_hook = NULL;
+}
+
+struct gdb_readline_wrapper_cleanup
+ {
+ void (*handler_orig) (char *);
+ char *prompt_orig;
+ int already_prompted_orig;
+ };
+
+static void
+gdb_readline_wrapper_cleanup (void *arg)
+{
+ struct gdb_readline_wrapper_cleanup *cleanup = arg;
+
+ gdb_assert (rl_already_prompted == 1);
+ rl_already_prompted = cleanup->already_prompted_orig;
+ PROMPT (0) = cleanup->prompt_orig;
+
+ gdb_assert (input_handler == gdb_readline_wrapper_line);
+ input_handler = cleanup->handler_orig;
+ gdb_readline_wrapper_result = NULL;
+ gdb_readline_wrapper_done = 0;
+
+ after_char_processing_hook = saved_after_char_processing_hook;
+ saved_after_char_processing_hook = NULL;
+
+ xfree (cleanup);
+}
+
char *
gdb_readline_wrapper (char *prompt)
{
- /* Set the hook that works in this case. */
- if (after_char_processing_hook)
- {
- rl_pre_input_hook = (Function *) after_char_processing_hook;
- after_char_processing_hook = NULL;
- }
+ struct cleanup *back_to;
+ struct gdb_readline_wrapper_cleanup *cleanup;
+ char *retval;
/* Before calling readline, ensure we have the terminal. If we don't
have the terminal and call readline, we risk the possibility of
@@ -737,7 +797,32 @@
a page break prompt. */
terminal_ours ();
- return readline (prompt);
+ cleanup = xmalloc (sizeof (*cleanup));
+ cleanup->handler_orig = input_handler;
+ input_handler = gdb_readline_wrapper_line;
+
+ cleanup->prompt_orig = get_prompt ();
+ PROMPT (0) = prompt;
+ cleanup->already_prompted_orig = rl_already_prompted;
+
+ back_to = make_cleanup (gdb_readline_wrapper_cleanup, cleanup);
+
+ /* Display our prompt and prevent double prompt display. */
+ display_gdb_prompt (NULL);
+ rl_already_prompted = 1;
+
+ if (after_char_processing_hook)
+ (*after_char_processing_hook) ();
+ gdb_assert (after_char_processing_hook == NULL);
+
+ /* gdb_do_one_event argument is unused. */
+ while (gdb_do_one_event (NULL) >= 0)
+ if (gdb_readline_wrapper_done)
+ break;
+
+ retval = gdb_readline_wrapper_result;
+ do_cleanups (back_to);
+ return retval;
}

View File

@ -11,7 +11,7 @@ Name: gdb
Version: 6.5 Version: 6.5
# The release always contains a leading reserved number, start it at 0. # The release always contains a leading reserved number, start it at 0.
Release: 23%{?dist} Release: 24%{?dist}
License: GPL License: GPL
Group: Development/Debuggers Group: Development/Debuggers
@ -613,6 +613,9 @@ fi
# don't include the files in include, they are part of binutils # don't include the files in include, they are part of binutils
%changelog %changelog
* Thu Jan 11 2007 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.5-24
- Backport readline history for input mode commands like `command' (BZ 215816).
* Tue Jan 9 2007 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.5-23 * Tue Jan 9 2007 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.5-23
- Find symbols properly at their original (included) file (BZ 109921). - Find symbols properly at their original (included) file (BZ 109921).
- Remove the stuck mock(1) builds disfunctional workaround (-> mock BZ 221351). - Remove the stuck mock(1) builds disfunctional workaround (-> mock BZ 221351).