Piotr Caban : msvcrt: Call set_lc_locale_name in update_threadlocinfo_category.
Alexandre Julliard
julliard at winehq.org
Wed Nov 18 15:48:01 CST 2020
Module: wine
Branch: master
Commit: 3ecede0c613feb1573061e1cbd518d9a5b13735a
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3ecede0c613feb1573061e1cbd518d9a5b13735a
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Nov 18 17:25:44 2020 +0100
msvcrt: Call set_lc_locale_name in update_threadlocinfo_category.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcrt/locale.c | 81 +++++++++++++++++++---------------------------------
1 file changed, 29 insertions(+), 52 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index 4b20f097758..ca50fc7e390 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -400,6 +400,33 @@ static BOOL init_category_name(const char *name, int len,
return TRUE;
}
+#if _MSVCR_VER >= 110
+static inline BOOL set_lc_locale_name(MSVCRT_pthreadlocinfo locinfo, int cat)
+{
+ LCID lcid = locinfo->lc_handle[cat];
+ WCHAR buf[100];
+ int len;
+
+ len = GetLocaleInfoW(lcid, LOCALE_SISO639LANGNAME
+ |LOCALE_NOUSEROVERRIDE, buf, 100);
+ if(!len) return FALSE;
+
+ if(LocaleNameToLCID(buf, 0) != lcid)
+ len = LCIDToLocaleName(lcid, buf, 100, 0);
+
+ if(!len || !(locinfo->lc_name[cat] = MSVCRT_malloc(len*sizeof(MSVCRT_wchar_t))))
+ return FALSE;
+
+ memcpy(locinfo->lc_name[cat], buf, len*sizeof(MSVCRT_wchar_t));
+ return TRUE;
+}
+#else
+static inline BOOL set_lc_locale_name(MSVCRT_pthreadlocinfo locinfo, int cat)
+{
+ return TRUE;
+}
+#endif
+
/* INTERNAL: Set lc_handle, lc_id and lc_category in threadlocinfo struct */
static BOOL update_threadlocinfo_category(LCID lcid, unsigned short cp,
MSVCRT_pthreadlocinfo locinfo, int category)
@@ -429,6 +456,8 @@ static BOOL update_threadlocinfo_category(LCID lcid, unsigned short cp,
locinfo->lc_handle[category] = lcid;
+ set_lc_locale_name(locinfo, category);
+
if(!locinfo->lc_category[category].locale) {
int len = 0;
@@ -1007,33 +1036,6 @@ void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale)
MSVCRT_free(locale);
}
-#if _MSVCR_VER >= 110
-static inline BOOL set_lc_locale_name(MSVCRT_pthreadlocinfo locinfo, int cat)
-{
- LCID lcid = locinfo->lc_handle[cat];
- WCHAR buf[100];
- int len;
-
- len = GetLocaleInfoW(lcid, LOCALE_SISO639LANGNAME
- |LOCALE_NOUSEROVERRIDE, buf, 100);
- if(!len) return FALSE;
-
- if(LocaleNameToLCID(buf, 0) != lcid)
- len = LCIDToLocaleName(lcid, buf, 100, 0);
-
- if(!len || !(locinfo->lc_name[cat] = MSVCRT_malloc(len*sizeof(MSVCRT_wchar_t))))
- return FALSE;
-
- memcpy(locinfo->lc_name[cat], buf, len*sizeof(MSVCRT_wchar_t));
- return TRUE;
-}
-#else
-static inline BOOL set_lc_locale_name(MSVCRT_pthreadlocinfo locinfo, int cat)
-{
- return TRUE;
-}
-#endif
-
static inline BOOL category_needs_update(int cat, int user_cat,
const MSVCRT_threadlocinfo *locinfo, LCID lcid, unsigned short cp)
{
@@ -1242,11 +1244,6 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
}
locinfo->lc_collate_cp = locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage;
-
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_COLLATE)) {
- free_locinfo(locinfo);
- return NULL;
- }
} else {
if(!init_category_name("C", 1, locinfo, MSVCRT_LC_COLLATE)) {
free_locinfo(locinfo);
@@ -1309,11 +1306,6 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
for(j=cp_info.LeadByte[i]; j<=cp_info.LeadByte[i+1]; j++)
locinfo->ctype1[j+1] |= MSVCRT__LEADBYTE;
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_CTYPE)) {
- free_locinfo(locinfo);
- return NULL;
- }
-
for(i=0; i<256; i++) {
if(locinfo->pctype[i] & MSVCRT__LEADBYTE)
buf[i] = ' ';
@@ -1563,11 +1555,6 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
#endif
-
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_MONETARY)) {
- free_locinfo(locinfo);
- return NULL;
- }
} else {
locinfo->lconv->int_curr_symbol = MSVCRT_malloc(sizeof(char));
locinfo->lconv->currency_symbol = MSVCRT_malloc(sizeof(char));
@@ -1711,11 +1698,6 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
#endif
-
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_NUMERIC)) {
- free_locinfo(locinfo);
- return NULL;
- }
} else {
locinfo->lconv->decimal_point = MSVCRT_malloc(sizeof(char[2]));
locinfo->lconv->thousands_sep = MSVCRT_malloc(sizeof(char));
@@ -1769,11 +1751,6 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
return NULL;
}
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_TIME)) {
- free_locinfo(locinfo);
- return NULL;
- }
-
locinfo->lc_time_curr = create_time_data(lcid[MSVCRT_LC_TIME]);
if(!locinfo->lc_time_curr) {
free_locinfo(locinfo);
More information about the wine-cvs
mailing list