Commit f84858ac authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Added _get_current_locale implementation.

parent 8d6354c5
...@@ -675,7 +675,7 @@ ...@@ -675,7 +675,7 @@
@ varargs _fwscanf_s_l(ptr wstr ptr) msvcrt._fwscanf_s_l @ varargs _fwscanf_s_l(ptr wstr ptr) msvcrt._fwscanf_s_l
@ cdecl _gcvt(double long str) msvcrt._gcvt @ cdecl _gcvt(double long str) msvcrt._gcvt
@ cdecl _gcvt_s(ptr long double long) msvcrt._gcvt_s @ cdecl _gcvt_s(ptr long double long) msvcrt._gcvt_s
@ stub _get_current_locale @ cdecl _get_current_locale() msvcrt._get_current_locale
@ stub _get_daylight @ stub _get_daylight
@ cdecl _get_doserrno(ptr) msvcrt._get_doserrno @ cdecl _get_doserrno(ptr) msvcrt._get_doserrno
@ stub _get_dstbias @ stub _get_dstbias
......
...@@ -517,7 +517,7 @@ ...@@ -517,7 +517,7 @@
@ cdecl _gcvt(double long str) msvcrt._gcvt @ cdecl _gcvt(double long str) msvcrt._gcvt
@ cdecl _gcvt_s(ptr long double long) msvcrt._gcvt_s @ cdecl _gcvt_s(ptr long double long) msvcrt._gcvt_s
@ stub _get_amblksiz @ stub _get_amblksiz
@ stub _get_current_locale @ cdecl _get_current_locale() msvcrt._get_current_locale
@ stub _get_daylight @ stub _get_daylight
@ cdecl _get_doserrno(ptr) msvcrt._get_doserrno @ cdecl _get_doserrno(ptr) msvcrt._get_doserrno
@ stub _get_dstbias @ stub _get_dstbias
......
...@@ -512,7 +512,7 @@ ...@@ -512,7 +512,7 @@
@ cdecl _gcvt(double long str) msvcrt._gcvt @ cdecl _gcvt(double long str) msvcrt._gcvt
@ cdecl _gcvt_s(ptr long double long) msvcrt._gcvt_s @ cdecl _gcvt_s(ptr long double long) msvcrt._gcvt_s
@ stub _get_amblksiz @ stub _get_amblksiz
@ stub _get_current_locale @ cdecl _get_current_locale() msvcrt._get_current_locale
@ stub _get_daylight @ stub _get_daylight
@ cdecl _get_doserrno(ptr) msvcrt._get_doserrno @ cdecl _get_doserrno(ptr) msvcrt._get_doserrno
@ stub _get_dstbias @ stub _get_dstbias
......
...@@ -603,6 +603,9 @@ void free_locinfo(MSVCRT_pthreadlocinfo locinfo) ...@@ -603,6 +603,9 @@ void free_locinfo(MSVCRT_pthreadlocinfo locinfo)
if(!locinfo) if(!locinfo)
return; return;
if(InterlockedDecrement(&locinfo->refcount))
return;
for(i=MSVCRT_LC_MIN+1; i<=MSVCRT_LC_MAX; i++) { for(i=MSVCRT_LC_MIN+1; i<=MSVCRT_LC_MAX; i++) {
MSVCRT_free(locinfo->lc_category[i].locale); MSVCRT_free(locinfo->lc_category[i].locale);
MSVCRT_free(locinfo->lc_category[i].refcount); MSVCRT_free(locinfo->lc_category[i].refcount);
...@@ -640,9 +643,26 @@ void free_mbcinfo(MSVCRT_pthreadmbcinfo mbcinfo) ...@@ -640,9 +643,26 @@ void free_mbcinfo(MSVCRT_pthreadmbcinfo mbcinfo)
if(!mbcinfo) if(!mbcinfo)
return; return;
if(InterlockedDecrement(&mbcinfo->refcount))
return;
MSVCRT_free(mbcinfo); MSVCRT_free(mbcinfo);
} }
/* _get_current_locale - not exported in native msvcrt */
MSVCRT__locale_t CDECL MSVCRT__get_current_locale(void)
{
MSVCRT__locale_t loc = MSVCRT_malloc(sizeof(MSVCRT__locale_tstruct));
if(!loc)
return NULL;
loc->locinfo = get_locinfo();
loc->mbcinfo = get_mbcinfo();
InterlockedIncrement(&loc->locinfo->refcount);
InterlockedIncrement(&loc->mbcinfo->refcount);
return loc;
}
/* _free_locale - not exported in native msvcrt */ /* _free_locale - not exported in native msvcrt */
void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale) void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale)
{ {
...@@ -747,6 +767,8 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) ...@@ -747,6 +767,8 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale)
} }
memset(loc->locinfo, 0, sizeof(MSVCRT_threadlocinfo)); memset(loc->locinfo, 0, sizeof(MSVCRT_threadlocinfo));
loc->locinfo->refcount = 1;
loc->mbcinfo->refcount = 1;
loc->locinfo->lconv = MSVCRT_malloc(sizeof(struct MSVCRT_lconv)); loc->locinfo->lconv = MSVCRT_malloc(sizeof(struct MSVCRT_lconv));
if(!loc->locinfo->lconv) { if(!loc->locinfo->lconv) {
...@@ -762,8 +784,6 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) ...@@ -762,8 +784,6 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale)
return NULL; return NULL;
} }
loc->locinfo->refcount = 1;
if(lcid[MSVCRT_LC_COLLATE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_COLLATE)) { if(lcid[MSVCRT_LC_COLLATE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_COLLATE)) {
if(update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE], loc, MSVCRT_LC_COLLATE)) { if(update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE], loc, MSVCRT_LC_COLLATE)) {
MSVCRT__free_locale(loc); MSVCRT__free_locale(loc);
......
...@@ -1490,6 +1490,7 @@ ...@@ -1490,6 +1490,7 @@
@ cdecl -arch=i386 __control87_2(long long ptr ptr) @ cdecl -arch=i386 __control87_2(long long ptr ptr)
@ cdecl _configthreadlocale(long) @ cdecl _configthreadlocale(long)
@ cdecl _create_locale(long str) MSVCRT__create_locale @ cdecl _create_locale(long str) MSVCRT__create_locale
@ cdecl _get_current_locale() MSVCRT__get_current_locale
@ cdecl _dupenv_s(ptr ptr str) @ cdecl _dupenv_s(ptr ptr str)
@ cdecl _free_locale(ptr) MSVCRT__free_locale @ cdecl _free_locale(ptr) MSVCRT__free_locale
@ cdecl _get_invalid_parameter_handler() @ cdecl _get_invalid_parameter_handler()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment