Jeff Smith : msvcrt: Factor out code for creating lc_time_data structure.

Alexandre Julliard julliard at winehq.org
Wed Dec 4 16:13:04 CST 2019


Module: wine
Branch: master
Commit: dba7dac4588c5e994d5d7afb388e9997c388c7b2
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=dba7dac4588c5e994d5d7afb388e9997c388c7b2

Author: Jeff Smith <whydoubt at gmail.com>
Date:   Wed Dec  4 15:29:55 2019 +0100

msvcrt: Factor out code for creating lc_time_data structure.

Signed-off-by: Jeff Smith <whydoubt at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/locale.c | 167 +++++++++++++++++++++++++++------------------------
 1 file changed, 87 insertions(+), 80 deletions(-)

diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index fc41f05da2..6f2a83cc7c 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -910,8 +910,7 @@ static inline BOOL category_needs_update(int cat, int user_cat,
     return lcid!=locinfo->lc_handle[cat] || cp!=locinfo->lc_id[cat].wCodePage;
 }
 
-static MSVCRT_pthreadlocinfo create_locinfo(int category,
-        const char *locale, MSVCRT_pthreadlocinfo old_locinfo)
+static MSVCRT___lc_time_data* create_time_data(LCID lcid)
 {
     static const DWORD time_data[] = {
         LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
@@ -930,11 +929,6 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
         LOCALE_SSHORTDATE, LOCALE_SLONGDATE,
         LOCALE_STIMEFORMAT
     };
-    static const char collate[] = "COLLATE=";
-    static const char ctype[] = "CTYPE=";
-    static const char monetary[] = "MONETARY=";
-    static const char numeric[] = "NUMERIC=";
-    static const char time[] = "TIME=";
     static const char cloc_short_date[] = "MM/dd/yy";
     static const MSVCRT_wchar_t cloc_short_dateW[] = {'M','M','/','d','d','/','y','y',0};
     static const char cloc_long_date[] = "dddd, MMMM dd, yyyy";
@@ -942,8 +936,91 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
     static const char cloc_time[] = "HH:mm:ss";
     static const MSVCRT_wchar_t cloc_timeW[] = {'H','H',':','m','m',':','s','s',0};
 
+    MSVCRT___lc_time_data *cur;
+    const DWORD flags = lcid ? 0 : LOCALE_NOUSEROVERRIDE;
+    const LCID lcid_tmp = lcid ? lcid : MAKELCID(LANG_ENGLISH, SORT_DEFAULT);
+    int i, ret, size;
+
+    size = sizeof(MSVCRT___lc_time_data);
+    for(i=0; i<ARRAY_SIZE(time_data); i++) {
+        if(time_data[i]==LOCALE_SSHORTDATE && !lcid) {
+            size += sizeof(cloc_short_date) + sizeof(cloc_short_dateW);
+        }else if(time_data[i]==LOCALE_SLONGDATE && !lcid) {
+            size += sizeof(cloc_long_date) + sizeof(cloc_long_dateW);
+        }else {
+            ret = GetLocaleInfoA(lcid_tmp, time_data[i]|flags, NULL, 0);
+            if(!ret)
+                return NULL;
+            size += ret;
+
+            ret = GetLocaleInfoW(lcid_tmp, time_data[i]|flags, NULL, 0);
+            if(!ret)
+                return NULL;
+            size += ret*sizeof(MSVCRT_wchar_t);
+        }
+    }
+#if _MSVCR_VER >= 110
+    size += LCIDToLocaleName(lcid, NULL, 0, 0)*sizeof(MSVCRT_wchar_t);
+#endif
+
+    cur = MSVCRT_malloc(size);
+    if(!cur)
+        return NULL;
+
+    ret = 0;
+    for(i=0; i<ARRAY_SIZE(time_data); i++) {
+        cur->str.str[i] = &cur->data[ret];
+        if(time_data[i]==LOCALE_SSHORTDATE && !lcid) {
+            memcpy(&cur->data[ret], cloc_short_date, sizeof(cloc_short_date));
+            ret += sizeof(cloc_short_date);
+        }else if(time_data[i]==LOCALE_SLONGDATE && !lcid) {
+            memcpy(&cur->data[ret], cloc_long_date, sizeof(cloc_long_date));
+            ret += sizeof(cloc_long_date);
+        }else if(time_data[i]==LOCALE_STIMEFORMAT && !lcid) {
+            memcpy(&cur->data[ret], cloc_time, sizeof(cloc_time));
+            ret += sizeof(cloc_time);
+        }else {
+            ret += GetLocaleInfoA(lcid_tmp, time_data[i]|flags,
+                &cur->data[ret], size-ret);
+        }
+    }
+    for(i=0; i<ARRAY_SIZE(time_data); i++) {
+        cur->wstr.wstr[i] = (MSVCRT_wchar_t*)&cur->data[ret];
+        if(time_data[i]==LOCALE_SSHORTDATE && !lcid) {
+            memcpy(&cur->data[ret], cloc_short_dateW, sizeof(cloc_short_dateW));
+            ret += sizeof(cloc_short_dateW);
+        }else if(time_data[i]==LOCALE_SLONGDATE && !lcid) {
+            memcpy(&cur->data[ret], cloc_long_dateW, sizeof(cloc_long_dateW));
+            ret += sizeof(cloc_long_dateW);
+        }else if(time_data[i]==LOCALE_STIMEFORMAT && !lcid) {
+            memcpy(&cur->data[ret], cloc_timeW, sizeof(cloc_timeW));
+            ret += sizeof(cloc_timeW);
+        }else {
+            ret += GetLocaleInfoW(lcid_tmp, time_data[i]|flags,
+                    (MSVCRT_wchar_t*)&cur->data[ret], size-ret)*sizeof(MSVCRT_wchar_t);
+        }
+    }
+#if _MSVCR_VER >= 110
+    cur->locname = (MSVCRT_wchar_t*)&cur->data[ret];
+    LCIDToLocaleName(lcid, cur->locname, (size-ret)/sizeof(MSVCRT_wchar_t), 0);
+#else
+    cur->lcid = lcid;
+#endif
+
+    return cur;
+}
+
+static MSVCRT_pthreadlocinfo create_locinfo(int category,
+        const char *locale, MSVCRT_pthreadlocinfo old_locinfo)
+{
+    static const char collate[] = "COLLATE=";
+    static const char ctype[] = "CTYPE=";
+    static const char monetary[] = "MONETARY=";
+    static const char numeric[] = "NUMERIC=";
+    static const char time[] = "TIME=";
+
     MSVCRT_pthreadlocinfo locinfo;
-    LCID lcid[6] = { 0 }, lcid_tmp;
+    LCID lcid[6] = { 0 };
     unsigned short cp[6] = { 0 };
     const char *locale_name[6] = { 0 };
     int locale_len[6] = { 0 };
@@ -952,7 +1029,7 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
 #if _MSVCR_VER >= 100
     MSVCRT_wchar_t wbuf[256];
 #endif
-    int i, ret, size;
+    int i;
 
     TRACE("(%d %s)\n", category, locale);
 
@@ -1588,8 +1665,6 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
         locinfo->lc_handle[MSVCRT_LC_TIME] = old_locinfo->lc_handle[MSVCRT_LC_TIME];
         locinfo->lc_id[MSVCRT_LC_TIME].wCodePage = old_locinfo->lc_id[MSVCRT_LC_TIME].wCodePage;
     } else {
-        DWORD flags = lcid[MSVCRT_LC_TIME] ? 0 : LOCALE_NOUSEROVERRIDE;
-
         if(lcid[MSVCRT_LC_TIME] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_TIME)) {
             if(!update_threadlocinfo_category(lcid[MSVCRT_LC_TIME],
                         cp[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) {
@@ -1604,79 +1679,11 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
         } else
             locinfo->lc_category[MSVCRT_LC_TIME].locale = MSVCRT__strdup("C");
 
-        size = sizeof(MSVCRT___lc_time_data);
-        lcid_tmp = lcid[MSVCRT_LC_TIME] ? lcid[MSVCRT_LC_TIME] : MAKELCID(LANG_ENGLISH, SORT_DEFAULT);
-        for(i=0; i<ARRAY_SIZE(time_data); i++) {
-            if(time_data[i]==LOCALE_SSHORTDATE && !lcid[MSVCRT_LC_TIME]) {
-                size += sizeof(cloc_short_date) + sizeof(cloc_short_dateW);
-            }else if(time_data[i]==LOCALE_SLONGDATE && !lcid[MSVCRT_LC_TIME]) {
-                size += sizeof(cloc_long_date) + sizeof(cloc_long_dateW);
-            }else {
-                ret = GetLocaleInfoA(lcid_tmp, time_data[i]|flags, NULL, 0);
-                if(!ret) {
-                    free_locinfo(locinfo);
-                    return NULL;
-                }
-                size += ret;
-
-                ret = GetLocaleInfoW(lcid_tmp, time_data[i]|flags, NULL, 0);
-                if(!ret) {
-                    free_locinfo(locinfo);
-                    return NULL;
-                }
-                size += ret*sizeof(MSVCRT_wchar_t);
-            }
-        }
-#if _MSVCR_VER >= 110
-        size += LCIDToLocaleName(lcid[MSVCRT_LC_TIME], NULL, 0, 0)*sizeof(MSVCRT_wchar_t);
-#endif
-
-        locinfo->lc_time_curr = MSVCRT_malloc(size);
+        locinfo->lc_time_curr = create_time_data(lcid[MSVCRT_LC_TIME]);
         if(!locinfo->lc_time_curr) {
             free_locinfo(locinfo);
             return NULL;
         }
-
-        ret = 0;
-        for(i=0; i<ARRAY_SIZE(time_data); i++) {
-            locinfo->lc_time_curr->str.str[i] = &locinfo->lc_time_curr->data[ret];
-            if(time_data[i]==LOCALE_SSHORTDATE && !lcid[MSVCRT_LC_TIME]) {
-                memcpy(&locinfo->lc_time_curr->data[ret], cloc_short_date, sizeof(cloc_short_date));
-                ret += sizeof(cloc_short_date);
-            }else if(time_data[i]==LOCALE_SLONGDATE && !lcid[MSVCRT_LC_TIME]) {
-                memcpy(&locinfo->lc_time_curr->data[ret], cloc_long_date, sizeof(cloc_long_date));
-                ret += sizeof(cloc_long_date);
-            }else if(time_data[i]==LOCALE_STIMEFORMAT && !lcid[MSVCRT_LC_TIME]) {
-                memcpy(&locinfo->lc_time_curr->data[ret], cloc_time, sizeof(cloc_time));
-                ret += sizeof(cloc_time);
-            }else {
-                ret += GetLocaleInfoA(lcid_tmp, time_data[i]|flags,
-                    &locinfo->lc_time_curr->data[ret], size-ret);
-            }
-        }
-        for(i=0; i<ARRAY_SIZE(time_data); i++) {
-            locinfo->lc_time_curr->wstr.wstr[i] = (MSVCRT_wchar_t*)&locinfo->lc_time_curr->data[ret];
-            if(time_data[i]==LOCALE_SSHORTDATE && !lcid[MSVCRT_LC_TIME]) {
-                memcpy(&locinfo->lc_time_curr->data[ret], cloc_short_dateW, sizeof(cloc_short_dateW));
-                ret += sizeof(cloc_short_dateW);
-            }else if(time_data[i]==LOCALE_SLONGDATE && !lcid[MSVCRT_LC_TIME]) {
-                memcpy(&locinfo->lc_time_curr->data[ret], cloc_long_dateW, sizeof(cloc_long_dateW));
-                ret += sizeof(cloc_long_dateW);
-            }else if(time_data[i]==LOCALE_STIMEFORMAT && !lcid[MSVCRT_LC_TIME]) {
-                memcpy(&locinfo->lc_time_curr->data[ret], cloc_timeW, sizeof(cloc_timeW));
-                ret += sizeof(cloc_timeW);
-            }else {
-                ret += GetLocaleInfoW(lcid_tmp, time_data[i]|flags,
-                        (MSVCRT_wchar_t*)&locinfo->lc_time_curr->data[ret], size-ret)*sizeof(MSVCRT_wchar_t);
-            }
-        }
-#if _MSVCR_VER >= 110
-        locinfo->lc_time_curr->locname = (MSVCRT_wchar_t*)&locinfo->lc_time_curr->data[ret];
-        LCIDToLocaleName(lcid[MSVCRT_LC_TIME], locinfo->lc_time_curr->locname,
-                (size-ret)/sizeof(MSVCRT_wchar_t), 0);
-#else
-        locinfo->lc_time_curr->lcid = lcid[MSVCRT_LC_TIME];
-#endif
     }
 
     return locinfo;




More information about the wine-cvs mailing list