crt: Add a compatibility wrapper for _get_current_locale
This function only exists since Windows 8, but is is currently used
by libc++.
This fixes linker errors with libc++ when linking against msvcrt.dll.
This compatibility wrapper only returns NULL and doesn't attempt keeping
track of what the last set locale actually was. (Doing that is a bit hard
as well, since _get_current_locale is supposed to allocate and populate
a _locale_t struct, while setlocale only gets a locale name string.)
The parts of libc++ using this function probably won't work perfectly
on versions prior to Windows 8 with this wrapper, but this allows building
libc++ in general for a wider range of Windows versions, and having these
parts working as intended on Windows 8 and newer.
Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index eaa0080..8ee5a22 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -155,6 +155,7 @@
src_msvcrt=\
misc/_configthreadlocale.c \
+ misc/_get_current_locale.c \
misc/invalid_parameter_handler.c \
misc/output_format.c \
misc/purecall.c \
diff --git a/mingw-w64-crt/misc/_get_current_locale.c b/mingw-w64-crt/misc/_get_current_locale.c
new file mode 100644
index 0000000..f5ccc4a
--- /dev/null
+++ b/mingw-w64-crt/misc/_get_current_locale.c
@@ -0,0 +1,26 @@
+#include <windows.h>
+#include <locale.h>
+#include <msvcrt.h>
+
+static _locale_t __cdecl init_func(void);
+_locale_t (__cdecl *__MINGW_IMP_SYMBOL(_get_current_locale))(void) = init_func;
+
+static _locale_t __cdecl null_func(void)
+{
+ return NULL;
+}
+
+static _locale_t __cdecl init_func(void)
+{
+ HMODULE msvcrt = __mingw_get_msvcrt_handle();
+ _locale_t (__cdecl *func)(void) = NULL;
+
+ if (msvcrt) {
+ func = (void*)GetProcAddress(msvcrt, "_get_current_locale");
+ }
+
+ if (!func)
+ func = null_func;
+
+ return (__MINGW_IMP_SYMBOL(_get_current_locale) = func)();
+}
diff --git a/mingw-w64-headers/crt/locale.h b/mingw-w64-headers/crt/locale.h
index b6bae04..1f588e8 100644
--- a/mingw-w64-headers/crt/locale.h
+++ b/mingw-w64-headers/crt/locale.h
@@ -79,7 +79,7 @@
int __cdecl _configthreadlocale(int _Flag);
char *__cdecl setlocale(int _Category,const char *_Locale);
_CRTIMP struct lconv *__cdecl localeconv(void);
- _locale_t __cdecl _get_current_locale(void);
+ _CRTIMP _locale_t __cdecl _get_current_locale(void);
_locale_t __cdecl _create_locale(int _Category,const char *_Locale);
void __cdecl _free_locale(_locale_t _Locale);
_locale_t __cdecl __get_current_locale(void);