diff options
-rw-r--r-- | gdb/ChangeLog | 21 | ||||
-rw-r--r-- | gdb/Makefile.in | 2 | ||||
-rw-r--r-- | gdb/cli/cli-script.c | 43 | ||||
-rw-r--r-- | gdb/top.c | 23 | ||||
-rw-r--r-- | gdb/top.h | 4 | ||||
-rw-r--r-- | gdb/tui/tui-hooks.c | 7 | ||||
-rw-r--r-- | gdb/utils.c | 19 |
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 */ |