diff src/sighandlers.cc @ 4787:02c748eb2ddc

[project @ 2004-02-18 21:20:26 by jwe]
author jwe
date Wed, 18 Feb 2004 21:20:26 +0000
parents f6d6335c08f6
children 62f2fb593455
line wrap: on
line diff
--- a/src/sighandlers.cc	Wed Feb 18 12:52:20 2004 +0000
+++ b/src/sighandlers.cc	Wed Feb 18 21:20:26 2004 +0000
@@ -46,6 +46,7 @@
 #include "pager.h"
 #include "pt-bp.h"
 #include "sighandlers.h"
+#include "sysdep.h"
 #include "syswait.h"
 #include "toplev.h"
 #include "utils.h"
@@ -93,7 +94,8 @@
 #endif
 
 static void
-my_friendly_exit (const char *sig_name, int sig_number)
+my_friendly_exit (const char *sig_name, int sig_number,
+		  bool save_vars = true)
 {
   static bool been_there_done_that = false;
 
@@ -112,7 +114,8 @@
 
       std::cerr << "panic: " << sig_name << " -- stopping myself...\n";
 
-      save_user_variables ();
+      if (save_vars)
+	save_user_variables ();
 
       if (sig_number < 0)
 	exit (1);
@@ -235,7 +238,7 @@
   // here?
 
   if (can_interrupt)
-    octave_interrupt_state = 1;
+    octave_interrupt_state++;
 
   SIGHANDLER_RETURN (0);
 }
@@ -303,11 +306,7 @@
 // for SIGINT only.
 
 static RETSIGTYPE
-#if defined (ACK_USES_SIG) || defined (REINSTALL_USES_SIG)
 sigint_handler (int sig)
-#else
-sigint_handler (int)
-#endif
 {
   MAYBE_ACK_SIGNAL (sig);
 
@@ -334,7 +333,47 @@
       if (octave_interrupt_immediately)
 	octave_jump_to_enclosing_context ();
       else
-	octave_interrupt_state = 1;
+	{
+	  octave_interrupt_state++;
+
+	  if (interactive)
+	    {
+	      if (octave_interrupt_state > 3)
+		{
+		  // XXX FIXME XXX -- might want to attempt to flush
+		  // any pending input first...
+
+		  std::cerr << "abort [y/N]? ";
+
+		  int c = octave_kbhit ();
+
+		  std::cerr << static_cast<char> (c) << std::endl;
+
+		  if (c == 'y' || c == 'Y')
+		    {
+		      std::cerr << "save top-level workspace [y/N]? ";
+
+		      c = octave_kbhit ();
+
+		      std::cerr << static_cast<char> (c) << std::endl;
+
+		      my_friendly_exit (sys_siglist[sig], sig,
+					(c == 'y' || c == 'Y'));
+		    }
+		  else
+		    {
+		      // We will still eventually interrupt and jump to
+		      // the top level even if no additional interrupts
+		      // happen, but we will have to wait until it is
+		      // safe to do so.  It will take 3 more
+		      // consecutive interrupts before we offer to
+		      // abort again.
+
+		      octave_interrupt_state = 1;
+		    }
+		}
+	    }
+	}
     }
 
   SIGHANDLER_RETURN (0);
@@ -357,7 +396,7 @@
   // here?
 
   if (pipe_handler_error_count  > 100)
-    octave_interrupt_state = 1;
+    octave_interrupt_state++;
 
   SIGHANDLER_RETURN (0);
 }