It's not available on XP, so we need to provice a compat implementation
for libmsvcrt-os.a.
Signed-off-by: Jacek Caban <[email protected]>
---
mingw-w64-crt/Makefile.am | 5 +-
mingw-w64-crt/lib-common/msvcrt.def.in | 2 +-
mingw-w64-crt/lib32/msvcr100.def.in | 2 +-
mingw-w64-crt/lib32/msvcr80.def.in | 1 +
mingw-w64-crt/lib32/msvcr90.def.in | 2 +-
mingw-w64-crt/lib32/msvcr90d.def.in | 2 +-
mingw-w64-crt/lib64/msvcr100.def.in | 2 +-
mingw-w64-crt/lib64/msvcr80.def.in | 1 +
mingw-w64-crt/lib64/msvcr90.def.in | 2 +-
mingw-w64-crt/lib64/msvcr90d.def.in | 2 +-
mingw-w64-crt/misc/wassert.c | 72 +++++++++++++-------------
mingw-w64-headers/crt/assert.h | 3 +-
12 files changed, 49 insertions(+), 47 deletions(-)
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 0af497af..e7de216d 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -231,7 +231,8 @@ src_ucrtbase=\
src_msvcrt32=\
$(src_msvcrt) \
- misc/lc_locale_func.c
+ misc/lc_locale_func.c \
+ misc/wassert.c
src_msvcrt64=\
$(src_msvcrt) \
@@ -327,7 +328,7 @@ src_libmingwex=\
misc/spawnve.c misc/spawnvp.c misc/spawnvpe.c misc/strnlen.c misc/strsafe.c \
misc/strtoimax.c misc/strtold.c misc/strtoumax.c misc/tdelete.c misc/tfind.c \
misc/tsearch.c misc/twalk.c misc/uchar_c16rtomb.c misc/uchar_c32rtomb.c misc/uchar_mbrtoc16.c \
- misc/uchar_mbrtoc32.c misc/wassert.c misc/wcrtomb.c misc/wcsnlen.c misc/wcstof.c \
+ misc/uchar_mbrtoc32.c misc/wcrtomb.c misc/wcsnlen.c misc/wcstof.c \
misc/wcstoimax.c misc/wcstold.c misc/wcstoumax.c misc/wctob.c misc/wctrans.c \
misc/wctype.c misc/wdirent.c misc/winbs_uint64.c misc/winbs_ulong.c misc/winbs_ushort.c \
misc/wmemchr.c misc/wmemcmp.c misc/wmemcpy.c misc/wmemmove.c misc/wmempcpy.c \
diff --git a/mingw-w64-crt/lib-common/msvcrt.def.in b/mingw-w64-crt/lib-common/msvcrt.def.in
index 449beb0a..e271d2e3 100644
--- a/mingw-w64-crt/lib-common/msvcrt.def.in
+++ b/mingw-w64-crt/lib-common/msvcrt.def.in
@@ -1138,7 +1138,7 @@ _waccess
; _waccess_s Replaced by emu
_wasctime
; _wasctime_s Replaced by emu
-F_ARM_ANY(_wassert)
+F_NON_I386(_wassert)
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/lib32/msvcr100.def.in b/mingw-w64-crt/lib32/msvcr100.def.in
index 1c6ae3dc..9c149db1 100644
--- a/mingw-w64-crt/lib32/msvcr100.def.in
+++ b/mingw-w64-crt/lib32/msvcr100.def.in
@@ -1519,7 +1519,7 @@ _waccess
_waccess_s
_wasctime
_wasctime_s
-_wassert DATA
+_wassert
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/lib32/msvcr80.def.in b/mingw-w64-crt/lib32/msvcr80.def.in
index f5e95550..d0776d8f 100644
--- a/mingw-w64-crt/lib32/msvcr80.def.in
+++ b/mingw-w64-crt/lib32/msvcr80.def.in
@@ -800,6 +800,7 @@ _strtoui64
_ungetwch
_vscprintf
_vscwprintf
+_wassert
_wcserror
_wcstoi64
_wcstoui64
diff --git a/mingw-w64-crt/lib32/msvcr90.def.in b/mingw-w64-crt/lib32/msvcr90.def.in
index c341951a..c7e67aea 100644
--- a/mingw-w64-crt/lib32/msvcr90.def.in
+++ b/mingw-w64-crt/lib32/msvcr90.def.in
@@ -1153,7 +1153,7 @@ _waccess
_waccess_s
_wasctime
_wasctime_s
-_wassert DATA
+_wassert
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/lib32/msvcr90d.def.in b/mingw-w64-crt/lib32/msvcr90d.def.in
index 2fe211dd..e54acf63 100644
--- a/mingw-w64-crt/lib32/msvcr90d.def.in
+++ b/mingw-w64-crt/lib32/msvcr90d.def.in
@@ -1219,7 +1219,7 @@ _waccess
_waccess_s
_wasctime
_wasctime_s
-_wassert DATA
+_wassert
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/lib64/msvcr100.def.in b/mingw-w64-crt/lib64/msvcr100.def.in
index 68c09d6c..48fc5a8d 100644
--- a/mingw-w64-crt/lib64/msvcr100.def.in
+++ b/mingw-w64-crt/lib64/msvcr100.def.in
@@ -1466,7 +1466,7 @@ _waccess
_waccess_s
_wasctime
_wasctime_s
-_wassert DATA
+_wassert
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/lib64/msvcr80.def.in b/mingw-w64-crt/lib64/msvcr80.def.in
index 2372e2e6..7e05606e 100644
--- a/mingw-w64-crt/lib64/msvcr80.def.in
+++ b/mingw-w64-crt/lib64/msvcr80.def.in
@@ -557,6 +557,7 @@ vsnprintf == _vsnprintf
_vsnwprintf
_waccess
_wasctime
+_wassert
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/lib64/msvcr90.def.in b/mingw-w64-crt/lib64/msvcr90.def.in
index cf01dc0c..ec087968 100644
--- a/mingw-w64-crt/lib64/msvcr90.def.in
+++ b/mingw-w64-crt/lib64/msvcr90.def.in
@@ -1086,7 +1086,7 @@ _waccess
_waccess_s
_wasctime
_wasctime_s
-_wassert DATA
+_wassert
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/lib64/msvcr90d.def.in b/mingw-w64-crt/lib64/msvcr90d.def.in
index 99b167ee..e40b3691 100644
--- a/mingw-w64-crt/lib64/msvcr90d.def.in
+++ b/mingw-w64-crt/lib64/msvcr90d.def.in
@@ -1146,7 +1146,7 @@ _waccess
_waccess_s
_wasctime
_wasctime_s
-_wassert DATA
+_wassert
_wchdir
_wchmod
_wcmdln DATA
diff --git a/mingw-w64-crt/misc/wassert.c b/mingw-w64-crt/misc/wassert.c
index 7d745d92..2fdd5e29 100644
--- a/mingw-w64-crt/misc/wassert.c
+++ b/mingw-w64-crt/misc/wassert.c
@@ -3,47 +3,47 @@
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
-#include <windows.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <signal.h>
-extern int mingw_app_type;
-
-void __cdecl _wassert (const wchar_t *, const wchar_t *,unsigned);
-void __cdecl _assert (const char *, const char *, unsigned);
+#include <assert.h>
+#include <stdlib.h>
+#include <windows.h>
+#include "msvcrt.h"
-void __cdecl
-_wassert (const wchar_t *_Message, const wchar_t *_File, unsigned _Line)
+/* _wassert is not available on XP, so forward it to _assert if needed */
+static void __cdecl mingw_wassert(const wchar_t *_Message, const wchar_t *_File, unsigned _Line)
{
- wchar_t *msgbuf = (wchar_t *) malloc (8192*sizeof(wchar_t));
- wchar_t fn[MAX_PATH + 1];
- DWORD nCode;
-
- if (!_File || _File[0] == 0)
- _File = L"<unknown>";
- if (!_Message || _Message[0] == 0)
- _Message = L"?";
- if (! GetModuleFileNameW (NULL, fn, MAX_PATH))
- wcscpy (fn, L"<unknown>");
- _snwprintf (msgbuf, 8191, L"Assertion failed!\n\nProgram: %ws\n"
- "File: %ws, Line %u\n\nExpression: %ws",
- fn, _File,_Line, _Message);
- if (mingw_app_type == 0)
+ char *message = NULL, *file = NULL;
+ size_t len;
+
+ if ((len = wcstombs(NULL, _Message, 0)) != (size_t)-1)
{
- fwprintf (stderr, L"%ws\n", msgbuf);
- abort ();
+ message = malloc(len + 1);
+ wcstombs(message, _Message, len + 1);
}
- nCode = MessageBoxW (NULL, msgbuf, L"MinGW Runtime Assertion", MB_ABORTRETRYIGNORE|
- MB_ICONHAND|MB_SETFOREGROUND|MB_TASKMODAL);
- if (nCode == IDABORT)
+
+ if ((len = wcstombs(NULL, _File, 0)) != (size_t)-1)
{
- raise (SIGABRT);
- _exit (3);
- abort ();
+ file = malloc(len + 1);
+ wcstombs(file, _File, len + 1);
}
- if (nCode == IDIGNORE)
- return;
- abort ();
+
+ _assert(message, file, _Line);
+
+ free(message);
+ free(file);
+}
+
+static void __cdecl init_wassert(const wchar_t *message, const wchar_t *file, unsigned line);
+
+void (__cdecl *__MINGW_IMP_SYMBOL(_wassert))(const wchar_t*, const wchar_t*,unsigned) = init_wassert;
+
+static void __cdecl init_wassert(const wchar_t *message, const wchar_t *file, unsigned line)
+{
+ void *func;
+
+ func = (void*)GetProcAddress(__mingw_get_msvcrt_handle(), "_wassert");
+ if(!func)
+ func = mingw_wassert;
+
+ return (__MINGW_IMP_SYMBOL(_wassert) = func)(message, file, line);
}
diff --git a/mingw-w64-headers/crt/assert.h b/mingw-w64-headers/crt/assert.h
index 4004a959..fce63a03 100644
--- a/mingw-w64-headers/crt/assert.h
+++ b/mingw-w64-headers/crt/assert.h
@@ -42,8 +42,7 @@ extern "C" {
#endif /* _CRT_TERMINATE_DEFINED */
-extern void __cdecl
-_wassert(const wchar_t *_Message,const wchar_t *_File,unsigned _Line);
+_CRTIMP void __cdecl _wassert(const wchar_t *_Message,const wchar_t *_File,unsigned _Line);
_CRTIMP void __cdecl _assert (const char *_Message, const char *_File, unsigned _Line);
#ifdef __cplusplus
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public