--- /dev/null
+#include "seh_excn.h"
+
+/*
+ * Exception / signal handlers.
+ */
+#if defined(__MINGW32__)
+jmp_buf seh_unwind_to;
+unsigned long seh_excn_code; /* variable used to communicate what kind of exception we've caught;nice. */
+
+EXCEPTION_DISPOSITION
+catchDivZero(struct _EXCEPTION_RECORD* rec,
+ void* arg1 __attribute__((unused)),
+ struct _CONTEXT* ctxt __attribute__((unused)),
+ void* arg2 __attribute__((unused)))
+{
+ if ((rec->ExceptionFlags & EH_UNWINDING) != 0) {
+ // When the system unwinds the SEH stack after having handled an excn,
+ // return immediately.
+ return ExceptionContinueSearch;
+ }
+ switch (rec->ExceptionCode) {
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+ case EXCEPTION_INT_DIVIDE_BY_ZERO:
+ seh_excn_code = 0;
+ longjmp(seh_unwind_to, rec->ExceptionCode);
+ return ExceptionContinueExecution;
+ case EXCEPTION_STACK_OVERFLOW:
+ seh_excn_code = 1;
+ longjmp(seh_unwind_to, rec->ExceptionCode);
+ return ExceptionContinueExecution;
+ case EXCEPTION_ACCESS_VIOLATION:
+ seh_excn_code = 2;
+ longjmp(seh_unwind_to, rec->ExceptionCode);
+ return ExceptionContinueExecution;
+ longjmp(seh_unwind_to, rec->ExceptionCode);
+ return ExceptionContinueExecution;
+ default: ;
+ }
+ return ExceptionContinueSearch;
+}
+#endif
+