| #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)(); |
| } |