| #include <windows.h> |
| #include <locale.h> |
| |
| #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; |
| } |
| |
| HANDLE __mingw_get_msvcrt_handle(void); |
| |
| static unsigned int __cdecl init_codepage_func(void) |
| { |
| HMODULE msvcrt = __mingw_get_msvcrt_handle(); |
| |
| if(msvcrt) { |
| __mingw_get_codepage = (void*)GetProcAddress(msvcrt, "___lc_codepage_func"); |
| if(__mingw_get_codepage) |
| return __mingw_get_codepage(); |
| |
| msvcrt__lc_codepage = (unsigned int*)GetProcAddress(msvcrt, "__lc_codepage"); |
| if(msvcrt__lc_codepage) |
| return (__mingw_get_codepage = msvcrt__lc_codepage_func)(); |
| } |
| |
| return (__mingw_get_codepage = setlocale_codepage_hack)(); |
| } |
| |
| unsigned int (__cdecl *__mingw_get_codepage)(void) = init_codepage_func; |