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 */