2006-12-31 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / gdb / event-top.c
index 3540343c462d0cce28acd74cd38fef2b82eacbbd..d7d6d972fdad8ef1050b6d34482169eefa67d797 100644 (file)
@@ -1,6 +1,6 @@
 /* Top level stuff for GDB, the GNU debugger.
 
-   Copyright 1999, 2000, 2001, 2002, 2004, 2005 Free Software
+   Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005 Free Software
    Foundation, Inc.
 
    Written by Elena Zannoni <ezannoni@cygnus.com> of Cygnus Solutions.
@@ -19,8 +19,8 @@
 
    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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA. */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
 
 #include "defs.h"
 #include "top.h"
@@ -32,6 +32,7 @@
 #include "interps.h"
 #include <signal.h>
 #include "exceptions.h"
+#include "cli/cli-script.h"     /* for reset_command_nest_depth */
 
 /* For dont_repeat() */
 #include "gdbcmd.h"
@@ -49,14 +50,14 @@ static void command_line_handler_continuation (struct continuation_arg *arg);
 static void change_line_handler (void);
 static void change_annotation_level (void);
 static void command_handler (char *command);
-static void async_do_nothing (gdb_client_data arg);
-static void async_disconnect (gdb_client_data arg);
-static void async_stop_sig (gdb_client_data arg);
-static void async_float_handler (gdb_client_data arg);
 
 /* Signal handlers. */
+#ifdef SIGQUIT
 static void handle_sigquit (int sig);
+#endif
+#ifdef SIGHUP
 static void handle_sighup (int sig);
+#endif
 static void handle_sigfpe (int sig);
 #if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)
 static void handle_sigwinch (int sig);
@@ -64,10 +65,16 @@ static void handle_sigwinch (int sig);
 
 /* Functions to be invoked by the event loop in response to
    signals. */
+#if defined (SIGQUIT) || defined (SIGHUP)
 static void async_do_nothing (gdb_client_data);
+#endif
+#ifdef SIGHUP
 static void async_disconnect (gdb_client_data);
+#endif
 static void async_float_handler (gdb_client_data);
+#ifdef STOP_SIGNAL
 static void async_stop_sig (gdb_client_data);
+#endif
 
 /* Readline offers an alternate interface, via callback
    functions. These are all included in the file callback.c in the
@@ -133,7 +140,9 @@ void *sigint_token;
 #ifdef SIGHUP
 void *sighup_token;
 #endif
+#ifdef SIGQUIT
 void *sigquit_token;
+#endif
 void *sigfpe_token;
 #if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)
 void *sigwinch_token;
@@ -252,6 +261,9 @@ display_gdb_prompt (char *new_prompt)
   int prompt_length = 0;
   char *gdb_prompt = get_prompt ();
 
+  /* Reset the nesting depth used when trace-commands is set.  */
+  reset_command_nest_depth ();
+
   /* Each interpreter has its own rules on displaying the command
      prompt.  */
   if (!current_interp_display_prompt_p ())
@@ -410,7 +422,7 @@ stdin_event_handler (int error, gdb_client_data client_data)
 {
   if (error)
     {
-      printf_unfiltered ("error detected on stdin\n");
+      printf_unfiltered (_("error detected on stdin\n"));
       delete_file_handler (input_fd);
       discard_all_continuations ();
       /* If stdin died, we may as well kill gdb. */
@@ -489,7 +501,10 @@ command_handler (char *command)
      but GDB is still alive. In such a case, we just quit gdb
      killing the inferior program too. */
   if (command == 0)
-    quit_command ((char *) 0, stdin == instream);
+    {
+      printf_unfiltered ("quit\n");
+      execute_command ("quit", stdin == instream);
+    }
 
   time_at_cmd_start = get_run_time ();
 
@@ -533,7 +548,7 @@ command_handler (char *command)
        {
          long cmd_time = get_run_time () - time_at_cmd_start;
 
-         printf_unfiltered ("Command execution time: %ld.%06ld\n",
+         printf_unfiltered (_("Command execution time: %ld.%06ld\n"),
                             cmd_time / 1000000, cmd_time % 1000000);
        }
 
@@ -544,7 +559,7 @@ command_handler (char *command)
          long space_now = lim - lim_at_start;
          long space_diff = space_now - space_at_cmd_start;
 
-         printf_unfiltered ("Space used: %ld (%c%ld for this command)\n",
+         printf_unfiltered (_("Space used: %ld (%c%ld for this command)\n"),
                             space_now,
                             (space_diff >= 0 ? '+' : '-'),
                             space_diff);
@@ -572,7 +587,7 @@ command_line_handler_continuation (struct continuation_arg *arg)
     {
       long cmd_time = get_run_time () - time_at_cmd_start;
 
-      printf_unfiltered ("Command execution time: %ld.%06ld\n",
+      printf_unfiltered (_("Command execution time: %ld.%06ld\n"),
                         cmd_time / 1000000, cmd_time % 1000000);
     }
   if (display_space)
@@ -582,7 +597,7 @@ command_line_handler_continuation (struct continuation_arg *arg)
       long space_now = lim - lim_at_start;
       long space_diff = space_now - space_at_cmd_start;
 
-      printf_unfiltered ("Space used: %ld (%c%ld for this command)\n",
+      printf_unfiltered (_("Space used: %ld (%c%ld for this command)\n"),
                         space_now,
                         (space_diff >= 0 ? '+' : '-'),
                         space_diff);
@@ -615,9 +630,9 @@ command_line_handler (char *rl)
 
   if (annotation_level > 1 && instream == stdin)
     {
-      printf_unfiltered ("\n\032\032post-");
+      printf_unfiltered (("\n\032\032post-"));
       puts_unfiltered (async_annotation_suffix);
-      printf_unfiltered ("\n");
+      printf_unfiltered (("\n"));
     }
 
   if (linebuffer == 0)
@@ -888,6 +903,7 @@ async_init_signals (void)
   signal (SIGINT, handle_sigint);
   sigint_token =
     create_async_signal_handler (async_request_quit, NULL);
+  signal (SIGTERM, handle_sigterm);
 
   /* If SIGTRAP was set to SIG_IGN, then the SIG_IGN will get passed
      to the inferior and breakpoints will be ignored.  */
@@ -895,6 +911,7 @@ async_init_signals (void)
   signal (SIGTRAP, SIG_DFL);
 #endif
 
+#ifdef SIGQUIT
   /* If we initialize SIGQUIT to SIG_IGN, then the SIG_IGN will get
      passed to the inferior, which we don't want.  It would be
      possible to do a "signal (SIGQUIT, SIG_DFL)" after we fork, but
@@ -906,6 +923,7 @@ async_init_signals (void)
   signal (SIGQUIT, handle_sigquit);
   sigquit_token =
     create_async_signal_handler (async_do_nothing, NULL);
+#endif
 #ifdef SIGHUP
   if (signal (SIGHUP, handle_sighup) != SIG_IGN)
     sighup_token =
@@ -958,6 +976,15 @@ handle_sigint (int sig)
     mark_async_signal_handler_wrapper (sigint_token);
 }
 
+/* Quit GDB if SIGTERM is received.
+   GDB would quit anyway, but this way it will clean up properly.  */
+void
+handle_sigterm (int sig)
+{
+  signal (sig, handle_sigterm);
+  quit_force ((char *) 0, stdin == instream);
+}
+
 /* Do the quit. All the checks have been done by the caller. */
 void
 async_request_quit (gdb_client_data arg)
@@ -966,6 +993,7 @@ async_request_quit (gdb_client_data arg)
   quit ();
 }
 
+#ifdef SIGQUIT
 /* Tell the event loop what to do if SIGQUIT is received. 
    See event-signal.c. */
 static void
@@ -974,13 +1002,17 @@ handle_sigquit (int sig)
   mark_async_signal_handler_wrapper (sigquit_token);
   signal (sig, handle_sigquit);
 }
+#endif
 
-/* Called by the event loop in response to a SIGQUIT. */
+#if defined (SIGQUIT) || defined (SIGHUP)
+/* Called by the event loop in response to a SIGQUIT or an
+   ignored SIGHUP.  */
 static void
 async_do_nothing (gdb_client_data arg)
 {
   /* Empty function body. */
 }
+#endif
 
 #ifdef SIGHUP
 /* Tell the event loop what to do if SIGHUP is received. 
@@ -1102,8 +1134,10 @@ gdb_setup_readline (void)
      that the sync setup is ALL done in gdb_init, and we would only
      mess it up here.  The sync stuff should really go away over
      time.  */
+  extern int batch_silent;
 
-  gdb_stdout = stdio_fileopen (stdout);
+  if (!batch_silent)
+    gdb_stdout = stdio_fileopen (stdout);
   gdb_stderr = stdio_fileopen (stderr);
   gdb_stdlog = gdb_stderr;  /* for moment */
   gdb_stdtarg = gdb_stderr; /* for moment */
This page took 0.026811 seconds and 4 git commands to generate.