Mercurial > octave-nkf
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); }