+extern void (*_PDCLIB_sigfpe)( int );\r
+extern void (*_PDCLIB_sigill)( int );\r
+extern void (*_PDCLIB_sigsegv)( int );\r
+\r
+static LPTOP_LEVEL_EXCEPTION_FILTER oldFilter;\r
+static LONG CALLBACK sehExceptionFilter( EXCEPTION_POINTERS * exInfo )\r
+{\r
+ int sig;\r
+ void (*handler)( int );\r
+\r
+ switch( exInfo->ExceptionRecord->ExceptionCode ) {\r
+ case EXCEPTION_ACCESS_VIOLATION:\r
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:\r
+ case EXCEPTION_DATATYPE_MISALIGNMENT:\r
+ case EXCEPTION_GUARD_PAGE:\r
+ case EXCEPTION_IN_PAGE_ERROR:\r
+ case EXCEPTION_STACK_OVERFLOW:\r
+ sig = SIGSEGV;\r
+ handler = _PDCLIB_sigsegv;\r
+ break;\r
+\r
+ case EXCEPTION_ILLEGAL_INSTRUCTION:\r
+ case EXCEPTION_PRIV_INSTRUCTION:\r
+ sig = SIGILL;\r
+ handler = _PDCLIB_sigill;\r
+ break;\r
+\r
+ case EXCEPTION_INT_DIVIDE_BY_ZERO:\r
+ case EXCEPTION_INT_OVERFLOW:\r
+ case EXCEPTION_FLT_DENORMAL_OPERAND:\r
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:\r
+ case EXCEPTION_FLT_INEXACT_RESULT:\r
+ case EXCEPTION_FLT_INVALID_OPERATION:\r
+ case EXCEPTION_FLT_OVERFLOW:\r
+ case EXCEPTION_FLT_STACK_CHECK:\r
+ case EXCEPTION_FLT_UNDERFLOW:\r
+ sig = SIGFPE;\r
+ handler = _PDCLIB_sigfpe;\r
+ break;\r
+\r
+ default:\r
+ return oldFilter ? oldFilter( exInfo ) : EXCEPTION_EXECUTE_HANDLER;\r
+ }\r
+\r
+ if(handler == SIG_DFL) {\r
+ return EXCEPTION_EXECUTE_HANDLER;\r
+ } else if(handler == SIG_IGN) {\r
+ return EXCEPTION_CONTINUE_EXECUTION;\r
+ } else {\r
+ handler( sig );\r
+ return EXCEPTION_CONTINUE_EXECUTION;\r
+ }\r
+}\r
+\r