| /** |
| * This file has no copyright assigned and is placed in the Public Domain. |
| * This file is part of the mingw-w64 runtime package. |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| */ |
| |
| #ifdef NDEBUG |
| #undef NDEBUG |
| #endif |
| |
| #include <assert.h> |
| #include <crtdbg.h> |
| #include <errno.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <wchar.h> |
| |
| #define WIN32_LEAN_AND_MEAN |
| #include <windows.h> |
| |
| #include "libtest.h" |
| |
| /** |
| * Invalid parameter handler. |
| */ |
| __attribute__ ((__noreturn__)) |
| static void __cdecl mingw_test_invalid_parameter_handler ( |
| const wchar_t *expression, |
| const wchar_t *function, |
| const wchar_t *file, |
| unsigned int line, |
| uintptr_t pReserved |
| ) { |
| fprintf(stderr, "Invalid parameter: %ls", expression); |
| /* Additional arguments are non-NULL only for debug CRT DLLs */ |
| if (function) |
| fprintf(stderr, ", function %ls", function); |
| if (file) |
| fprintf(stderr, ", file %ls", file); |
| if (line) |
| fprintf(stderr, ", line %d", line); |
| fprintf(stderr, "\n"); |
| (void)pReserved; |
| /* Ensure that this handler does not return, as the whole handler replaces calling of Dr. Watson */ |
| abort (); |
| } |
| |
| static int __cdecl mingw_test_fini (void) { |
| _CrtCheckMemory (); |
| _CrtDumpMemoryLeaks (); |
| |
| return EXIT_SUCCESS; |
| } |
| |
| void mingw_test_init (void) { |
| UINT oldErrorMode = SetErrorMode (0); |
| SetErrorMode (oldErrorMode | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); |
| |
| /** |
| * msvcr80.dll and later attempt to set multibyte code page to active |
| * ANSI code page during initialization. |
| * |
| * If active ANSI code page is 65001 (UTF-8), _setmbcp will fail |
| * and set `errno` to EINVAL. |
| * |
| * Some tests may assume `errno` to be set to zero when entering main. |
| */ |
| errno = 0; |
| |
| /* Set CRT _invalid_parameter() output to CRT stderr and call abort (the default is to just call Dr. Watson) */ |
| _set_invalid_parameter_handler (mingw_test_invalid_parameter_handler); |
| |
| /** |
| * Disable buffering. |
| * This ensures that all output is written to log files. |
| */ |
| setvbuf (stdout, NULL, _IONBF, 0); |
| setvbuf (stderr, NULL, _IONBF, 0); |
| |
| #if __MSVCRT_VERSION__ >= 0x0800 |
| /** |
| * Make `abort` as silent as possible. |
| */ |
| _set_abort_behavior (0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); |
| #endif |
| |
| #if __MSVCRT_VERSION__ >= 0x0400 |
| /** |
| * We don't want failed assertions to pop-up a message box. |
| */ |
| assert (_set_error_mode (_OUT_TO_STDERR) != -1); |
| #endif |
| |
| /** |
| * Redirect `_CRT_WARN` debug messages to `stderr`. |
| */ |
| assert (_CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE) != -1); |
| assert (_CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR) != _CRTDBG_HFILE_ERROR); |
| |
| /** |
| * Redirect `_CRT_ERROR` debug messages to `stderr`. |
| */ |
| assert (_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE) != -1); |
| assert (_CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR) != _CRTDBG_HFILE_ERROR); |
| |
| /** |
| * Redirect `_CRT_ASSERT` debug messages to `stderr`. |
| */ |
| assert (_CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE) != -1); |
| assert (_CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR) != _CRTDBG_HFILE_ERROR); |
| |
| _onexit (mingw_test_fini); |
| } |