Listing 1 (except.h)

/*********** EXCEPT.H COPYRIGHT 1990 GREGORY COLVIN ************
This program may be distributed free with this copyright notice.
***************************************************************/
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <signal.h>
#include <setjmp.h>

typedef struct x_trap {
   struct x_trap *next;
   jmp_buf context;
} X_TRAP;

typedef enum {
   X_ERRNO=-1, X_ASSERT=-2, X_SIGNAL=-3, X_SYSTEM=-4, X_USER=-5
} XCEPTION;

extern X_TRAP *X_Trap;
extern XCEPTION X_Error;
extern volatile sig_atomic_t X_Signal;

extern void X_TrapError( void );
extern void X_HandleSignal( int sig );
extern void X_ReturnSignal( int sig );

#define BEGIN_TRY                                   \
{ X_ TRAP trap;                                     \
  trap.next = X Trap; X_Trap = &trap; X_Signal = 0; \
  TRY: if (!(X_Error = setjmp(trap.context)))

#define FAIL(error) \
  if (X_Error =(error)) X_TrapError(); else

#define FAIL_TRY else

#define RETRY if (X_Error) goto TRY

#define END_TRY               \
  if (X_Signal && !X_Error)   \
    FAIL(X_SIGNAL);           \
  X_Trap = X_Trap->next;      \
  FAIL(X_Error);              \
}

#ifdef XDEBUG
  extern char *X_Assert;
  #undef assert
  #define assert(x) \
    ((x)? (void)0: (X_Assert=#x,X_Error=X_ASSERT,X_TrapError()))

#endif