Mercurial > octave
diff libcruft/misc/quit.h @ 4153:6b96ce9f5743
[project @ 2002-11-06 20:38:49 by jwe]
author | jwe |
---|---|
date | Wed, 06 Nov 2002 20:38:50 +0000 |
parents | |
children | 61fba034b13b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/misc/quit.h Wed Nov 06 20:38:50 2002 +0000 @@ -0,0 +1,135 @@ +/* + +Copyright (C) 2002 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_quit_h) +#define octave_quit_h 1 + +#ifdef __cplusplus +extern "C" { +#endif + +// Include setjmp.h, not csetjmp since the latter might only define +// the ANSI standard C interface. + +#include <setjmp.h> + +extern jmp_buf current_context; + +extern void octave_save_current_context (void *); + +#define octave_set_current_context setjmp (current_context) + +extern void octave_restore_current_context (void *); + +extern void octave_jump_to_enclosing_context (void) GCC_ATTR_NORETURN; + +extern void octave_save_signal_mask (void); + +extern void octave_restore_signal_mask (void); + +#if defined (USE_EXCEPTIONS_FOR_INTERRUPTS) + +#ifdef __cplusplus +class +octave_interrupt_exception +{ +}; +#endif + +extern int octave_interrupt_immediately; + +extern int octave_interrupt_state; + +extern void octave_throw_interrupt_exception (void) GCC_ATTR_NORETURN; + +#define OCTAVE_QUIT \ + do \ + { \ + if (octave_interrupt_state) \ + { \ + octave_interrupt_state = 0; \ + octave_throw_interrupt_exception (); \ + } \ + } \ + while (0) + +#define OCTAVE_JUMP_TO_TOP_LEVEL \ + do { octave_interrupt_state = 1; } while (0) + +#define OCTAVE_THROW_TO_TOP_LEVEL octave_throw_interrupt_exception () + +#define OCTAVE_TRY_WITH_INTERRUPTS try + +#define OCTAVE_CATCH_INTERRUPTS catch (octave_interrupt_exception) + +#define BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE \ + do \ + { \ + jmp_buf saved_context; \ + \ + octave_save_current_context ((char *) saved_context); \ + \ + if (octave_set_current_context) \ + { \ + octave_restore_current_context ((char *) saved_context); \ + OCTAVE_THROW_TO_TOP_LEVEL; \ + } \ + else \ + { \ + octave_interrupt_immediately++ + +#define END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE \ + octave_interrupt_immediately--; \ + octave_restore_current_context ((char *) saved_context); \ + } \ + } \ + while (0) + +#else + +#define OCTAVE_QUIT do { } while (0) + +#define OCTAVE_JUMP_TO_TOP_LEVEL octave_jump_to_enclosing_context () + +#define OCTAVE_THROW_TO_TOP_LEVEL OCTAVE_JUMP_TO_TOP_LEVEL + +#define OCTAVE_TRY_WITH_INTERRUPTS + +#define OCTAVE_CATCH_INTERRUPTS if (0) + +#define BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE do { } while (0) + +#define END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE do { } while (0) + +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/