summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog21
-rw-r--r--gdb/Makefile.in2
-rw-r--r--gdb/cli/cli-script.c43
-rw-r--r--gdb/top.c23
-rw-r--r--gdb/top.h4
-rw-r--r--gdb/tui/tui-hooks.c7
-rw-r--r--gdb/utils.c19
7 files changed, 81 insertions, 38 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index be33d8bef8f..7242fd93991 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,24 @@
+2006-03-29 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * Makefile.in (utils.o): Update.
+ * top.c (in_user_command): New.
+ (command_line_input): Use input_from_terminal_p.
+ (input_from_terminal_p): Don't check caution. Handle
+ stdin == NULL for Insight.
+ * top.h (in_user_command, caution): New declarations.
+ * utils.c: Include "top.h".
+ (query, defaulted_query): Check caution here. Move the call
+ to input_from_terminal_p higher.
+ * cli/cli-script.c (do_restore_user_call_depth): Only decrement
+ the depth. Update in_user_command if necessary.
+ (execute_user_command): Don't clobber old_chain. Set
+ in_user_command. Let do_restore_user_call_depth handle
+ user_call_depth.
+ (read_command_lines): Check whether to prompt before calling
+ Insight hooks.
+ * tui/tui-hooks.c (tui_query_hook): Remove newly unnecessary
+ input_from_terminal_p check.
+
2006-03-29 Ulrich Weigand <uweigand@de.ibm.com>
* s390-nat.c (s390_insert_watchpoint): Add missing argument.
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index ba418186e46..5d9f9e5506d 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -2744,7 +2744,7 @@ user-regs.o: user-regs.c $(defs_h) $(user_regs_h) $(gdbtypes_h) \
utils.o: utils.c $(defs_h) $(gdb_assert_h) $(gdb_string_h) $(event_top_h) \
$(exceptions_h) $(tui_h) $(gdbcmd_h) $(serial_h) $(bfd_h) \
$(target_h) $(demangle_h) $(expression_h) $(language_h) $(charset_h) \
- $(annotate_h) $(filenames_h) $(symfile_h) $(inferior_h) \
+ $(annotate_h) $(filenames_h) $(symfile_h) $(inferior_h) $(top_h) \
$(gdb_curses_h) $(readline_h) $(gdb_obstack_h)
uw-thread.o: uw-thread.c $(defs_h) $(gdbthread_h) $(target_h) $(inferior_h) \
$(regcache_h) $(gregset_h)
diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c
index ee986d11c72..b8e9d4f03f4 100644
--- a/gdb/cli/cli-script.c
+++ b/gdb/cli/cli-script.c
@@ -1,8 +1,8 @@
/* GDB CLI command scripting.
Copyright (c) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005 Free
- Software Foundation, Inc.
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GDB.
@@ -241,9 +241,9 @@ static void
do_restore_user_call_depth (void * call_depth)
{
int * depth = call_depth;
- /* We will be returning_to_top_level() at this point, so we want to
- reset our depth. */
- (*depth) = 0;
+ (*depth)--;
+ if ((*depth) == 0)
+ in_user_command = 0;
}
@@ -266,12 +266,17 @@ execute_user_command (struct cmd_list_element *c, char *args)
if (++user_call_depth > max_user_call_depth)
error (_("Max user call depth exceeded -- command aborted."));
- old_chain = make_cleanup (do_restore_user_call_depth, &user_call_depth);
+ make_cleanup (do_restore_user_call_depth, &user_call_depth);
/* Set the instream to 0, indicating execution of a
user-defined function. */
- old_chain = make_cleanup (do_restore_instream_cleanup, instream);
+ make_cleanup (do_restore_instream_cleanup, instream);
instream = (FILE *) 0;
+
+ /* Also set the global in_user_command, so that NULL instream is
+ not confused with Insight. */
+ in_user_command = 1;
+
while (cmdlines)
{
ret = execute_control_command (cmdlines);
@@ -283,8 +288,6 @@ execute_user_command (struct cmd_list_element *c, char *args)
cmdlines = cmdlines->next;
}
do_cleanups (old_chain);
-
- user_call_depth--;
}
enum command_control_type
@@ -920,15 +923,19 @@ read_command_lines (char *prompt_arg, int from_tty)
enum misc_command_type val;
control_level = 0;
- if (deprecated_readline_begin_hook)
- {
- /* Note - intentional to merge messages with no newline */
- (*deprecated_readline_begin_hook) ("%s %s\n", prompt_arg, END_MESSAGE);
- }
- else if (from_tty && input_from_terminal_p ())
+
+ if (from_tty && input_from_terminal_p ())
{
- printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE);
- gdb_flush (gdb_stdout);
+ if (deprecated_readline_begin_hook)
+ {
+ /* Note - intentional to merge messages with no newline */
+ (*deprecated_readline_begin_hook) ("%s %s\n", prompt_arg, END_MESSAGE);
+ }
+ else
+ {
+ printf_unfiltered ("%s\n%s\n", prompt_arg, END_MESSAGE);
+ gdb_flush (gdb_stdout);
+ }
}
head = tail = NULL;
@@ -989,7 +996,7 @@ read_command_lines (char *prompt_arg, int from_tty)
do_cleanups (old_chain);
}
- if (deprecated_readline_end_hook)
+ if (deprecated_readline_end_hook && from_tty && input_from_terminal_p ())
{
(*deprecated_readline_end_hook) ();
}
diff --git a/gdb/top.c b/gdb/top.c
index 61968afb63c..e129722ea7c 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -112,6 +112,10 @@ Whether to confirm potentially dangerous operations is %s.\n"),
FILE *instream;
+/* Flag to indicate whether a user defined command is currently running. */
+
+int in_user_command;
+
/* Current working directory. */
char *current_directory;
@@ -909,11 +913,11 @@ command_line_input (char *prompt_arg, int repeat, char *annotation_suffix)
}
/* Don't use fancy stuff if not talking to stdin. */
- if (deprecated_readline_hook && instream == NULL)
+ if (deprecated_readline_hook && input_from_terminal_p ())
{
rl = (*deprecated_readline_hook) (local_prompt);
}
- else if (command_editing_p && instream == stdin && ISATTY (instream))
+ else if (command_editing_p && input_from_terminal_p ())
{
rl = gdb_readline_wrapper (local_prompt);
}
@@ -1197,13 +1201,22 @@ quit_force (char *args, int from_tty)
exit (exit_code);
}
-/* Returns whether GDB is running on a terminal and whether the user
- desires that questions be asked of them on that terminal. */
+/* Returns whether GDB is running on a terminal and input is
+ currently coming from that terminal. */
int
input_from_terminal_p (void)
{
- return gdb_has_a_terminal () && (instream == stdin) & caution;
+ if (gdb_has_a_terminal () && instream == stdin)
+ return 1;
+
+ /* If INSTREAM is unset, and we are not in a user command, we
+ must be in Insight. That's like having a terminal, for our
+ purposes. */
+ if (instream == NULL && !in_user_command)
+ return 1;
+
+ return 0;
}
static void
diff --git a/gdb/top.h b/gdb/top.h
index e3f5d72c6ea..591bfa34e3c 100644
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -1,7 +1,7 @@
/* Top level stuff for GDB, the GNU debugger.
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1996, 1997, 1998, 1999, 2000, 2005 Free Software Foundation, Inc.
+ 1996, 1997, 1998, 1999, 2000, 2005, 2006 Free Software Foundation, Inc.
This file is part of GDB.
@@ -27,6 +27,8 @@
extern char *line;
extern int linesize;
extern FILE *instream;
+extern int in_user_command;
+extern int caution;
extern char gdb_dirbuf[1024];
extern int inhibit_gdbinit;
extern int epoch_interface;
diff --git a/gdb/tui/tui-hooks.c b/gdb/tui/tui-hooks.c
index 2e4632e9039..7099dd77a94 100644
--- a/gdb/tui/tui-hooks.c
+++ b/gdb/tui/tui-hooks.c
@@ -1,6 +1,7 @@
/* GDB hooks for TUI.
- Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GDB.
@@ -77,10 +78,6 @@ tui_query_hook (const char * msg, va_list argp)
int ans2;
int answer;
- /* Automatically answer "yes" if input is not from a terminal. */
- if (!input_from_terminal_p ())
- return 1;
-
echo ();
while (1)
{
diff --git a/gdb/utils.c b/gdb/utils.c
index c1ed5b73e20..00a060b2c57 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -54,6 +54,7 @@
#include "filenames.h"
#include "symfile.h"
#include "gdb_obstack.h"
+#include "top.h"
#include "inferior.h" /* for signed_pointer_to_address */
@@ -1141,16 +1142,17 @@ query (const char *ctlstr, ...)
int ans2;
int retval;
+ /* Automatically answer "yes" if input is not from the user
+ directly, or if the user did not want prompts. */
+ if (!input_from_terminal_p () || !caution)
+ return 1;
+
if (deprecated_query_hook)
{
va_start (args, ctlstr);
return deprecated_query_hook (ctlstr, args);
}
- /* Automatically answer "yes" if input is not from a terminal. */
- if (!input_from_terminal_p ())
- return 1;
-
while (1)
{
wrap_here (""); /* Flush any buffered output */
@@ -1244,15 +1246,16 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
n_string = "[n]";
}
+ /* Automatically answer the default value if input is not from the user
+ directly, or if the user did not want prompts. */
+ if (!input_from_terminal_p () || !caution)
+ return def_value;
+
if (deprecated_query_hook)
{
return deprecated_query_hook (ctlstr, args);
}
- /* Automatically answer default value if input is not from a terminal. */
- if (!input_from_terminal_p ())
- return def_value;
-
while (1)
{
wrap_here (""); /* Flush any buffered output */