blob: e6847ae8b663c6c6d8c9f4df48468381a98d0e17 [file] [log] [blame]
#define __lc_codepage __dummy_lc_codepage
#define ___lc_codepage_func __dummy____lc_codepage_func
#include <windows.h>
#include <locale.h>
#include <msvcrt.h>
#undef __lc_codepage
#undef ___lc_codepage_func
#include "mb_wc_common.h"
static unsigned int *msvcrt__lc_codepage;
static unsigned int __cdecl msvcrt___lc_codepage_func(void)
{
return *msvcrt__lc_codepage;
}
static unsigned int __cdecl setlocale_codepage_hack(void)
{
/* locale :: "lang[_country[.code_page]]" | ".code_page" */
const char *cp_str = strchr (setlocale(LC_CTYPE, NULL), '.');
return cp_str ? atoi(cp_str + 1) : 0;
}
static unsigned int __cdecl init_codepage_func(void);
unsigned int (__cdecl *__MINGW_IMP_SYMBOL(___lc_codepage_func))(void) = init_codepage_func;
unsigned int __cdecl ___lc_codepage_func (void)
{
return __MINGW_IMP_SYMBOL(___lc_codepage_func) ();
}
static unsigned int __cdecl init_codepage_func(void)
{
HMODULE msvcrt = __mingw_get_msvcrt_handle();
unsigned int (__cdecl *func)(void) = NULL;
if(msvcrt) {
func = (void*)GetProcAddress(msvcrt, "___lc_codepage_func");
if(!func) {
msvcrt__lc_codepage = (unsigned int*)GetProcAddress(msvcrt, "__lc_codepage");
if(msvcrt__lc_codepage)
func = msvcrt___lc_codepage_func;
}
}
if(!func)
func = setlocale_codepage_hack;
return (__MINGW_IMP_SYMBOL(___lc_codepage_func) = func)();
}