diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index c30b90751a5..45547ae442b 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -317,6 +317,16 @@ static inline void swap_pointers(void **p1, void **p2) { *p2 = hlp; } +/* INTERNAL: returns _locale_t struct for current locale */ +MSVCRT__locale_t get_locale(void) { + thread_data_t *data = msvcrt_get_thread_data(); + + if(!data || !data->locale) + return MSVCRT_locale; + + return data->locale; +} + /********************************************************************* * wsetlocale (MSVCRT.@) diff --git a/dlls/msvcrt/main.c b/dlls/msvcrt/main.c index a8b77e1c5d5..e2184b37792 100644 --- a/dlls/msvcrt/main.c +++ b/dlls/msvcrt/main.c @@ -69,6 +69,7 @@ static inline void msvcrt_free_tls_mem(void) HeapFree(GetProcessHeap(),0,tls->asctime_buffer); HeapFree(GetProcessHeap(),0,tls->wasctime_buffer); HeapFree(GetProcessHeap(),0,tls->strerror_buffer); + _free_locale(tls->locale); } HeapFree(GetProcessHeap(), 0, tls); } diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 34d1c9efbca..9b99cd7e5de 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -115,6 +115,7 @@ struct __thread_data { MSVCRT_unexpected_function unexpected_handler; MSVCRT__se_translator_function se_translator; EXCEPTION_RECORD *exc_record; + struct MSVCRT_localeinfo_struct *locale; }; typedef struct __thread_data thread_data_t; @@ -791,6 +792,7 @@ typedef struct MSVCRT_localeinfo_struct } MSVCRT__locale_tstruct, *MSVCRT__locale_t; extern MSVCRT__locale_t MSVCRT_locale; +MSVCRT__locale_t get_locale(void); void __cdecl _free_locale(MSVCRT__locale_t); #ifndef __WINE_MSVCRT_TEST