Listing 4 (except.c)

/************* EXCEPT.C COPYRIGHT 1990 GREGORY COLVIN *********
This program may be distributed free with this copyright notice.
***************************************************************/

#include <stdio.h>
#include <string.h>

#define XDEBUG

#include "except.h"

X_TRAP *X_Trap = 0;
XCEPTION X_Error = 0;
volatile sig_atomic_t X_Signal;
char *X_Assert;

void X_TrapError( void )
{
   if (X_Error) {
      if (X_Trap)
         longjmp(X_Trap->context,X_Error);

      if (X_Error == X_ERRNO)
         fprintf(stderr,"C run-time libary error: %s\n",
                      strerror(errno));
      else if (X_Error == X_SIGNAL)
         fprintf(stderr,"Signal raised: %d\n",
                      (int)X_Signal);
      else if (X_Error == X_ASSERT)
         fprintf(stderr,"Assertion false: %s\n",
                      X_Assert);
      else if (X_Error == X_SYSTEM)
          fprintf{stderr,"System call failed.\n");
      else
          fprintf(stderr,"Exception not handled.\n");
      exit(EXIT_FAILURE);
   }
}

void X_HandleSignal( int sig )
{
   signal( sig, X_HandleSignal );
   X_Signal = sig;
   longjmp(X_Trap->context,X_SIGNAL);
}

void X_ReturnSignal( int sig )
{
   signal( sig, X_ReturnSignal );
   X_Signal = sig;
}
/* End of File */