Tests for function fstat().
[gnulib.git] / m4 / nocrash.m4
index 1f92c26..60aad95 100644 (file)
@@ -1,12 +1,12 @@
-# nocrash.m4 serial 1
-dnl Copyright (C) 2005 Free Software Foundation, Inc.
+# nocrash.m4 serial 3
+dnl Copyright (C) 2005, 2009-2011 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini.
 
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
 
 dnl Based on libsigsegv, from Bruno Haible and Paolo Bonzini.
 
-AC_PREREQ(2.13)
+AC_PREREQ([2.13])
 
 dnl Expands to some code for use in .c programs that will cause the configure
 dnl test to exit instead of crashing. This is useful to avoid triggering
 
 dnl Expands to some code for use in .c programs that will cause the configure
 dnl test to exit instead of crashing. This is useful to avoid triggering
@@ -79,6 +79,34 @@ nocrash_init (void)
     }
   }
 }
     }
   }
 }
+#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+/* Avoid a crash on native Windows.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+  switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+    {
+    case EXCEPTION_ACCESS_VIOLATION:
+    case EXCEPTION_IN_PAGE_ERROR:
+    case EXCEPTION_STACK_OVERFLOW:
+    case EXCEPTION_GUARD_PAGE:
+    case EXCEPTION_PRIV_INSTRUCTION:
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+    case EXCEPTION_DATATYPE_MISALIGNMENT:
+    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+      exit (1);
+    }
+  return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+  SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
 #else
 /* Avoid a crash on POSIX systems.  */
 #include <signal.h>
 #else
 /* Avoid a crash on POSIX systems.  */
 #include <signal.h>