Module: wine Branch: master Commit: 344883fb853ce50ff4713c16b521c8e034032c9e URL: http://source.winehq.org/git/wine.git/?a=commit;h=344883fb853ce50ff4713c16b5...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Dec 7 13:48:22 2011 +0100
msvcrt: Initialize lc_time_curr inside create_locale.
---
dlls/msvcrt/locale.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++- dlls/msvcrt/msvcrt.h | 21 ++++++++++++++++- 2 files changed, 80 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index 6893685..1c91658 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -634,6 +634,8 @@ void free_locinfo(MSVCRT_pthreadlocinfo locinfo) MSVCRT_free(locinfo->pclmap); MSVCRT_free(locinfo->pcumap);
+ MSVCRT_free(locinfo->lc_time_curr); + MSVCRT_free(locinfo); }
@@ -677,6 +679,23 @@ void CDECL MSVCRT__free_locale(MSVCRT__locale_t locale) /* _create_locale - not exported in native msvcrt */ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) { + static const DWORD time_data[] = { + LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, + LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5, + LOCALE_SABBREVDAYNAME6, + LOCALE_SDAYNAME7, LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, + LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, + LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3, + LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, + LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9, + LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12, + LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3, LOCALE_SMONTHNAME4, + LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, + LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12, + LOCALE_S1159, LOCALE_S2359, + LOCALE_SSHORTDATE, LOCALE_SLONGDATE, + LOCALE_STIMEFORMAT + }; static const char collate[] = "COLLATE="; static const char ctype[] = "CTYPE="; static const char monetary[] = "MONETARY="; @@ -686,7 +705,7 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) MSVCRT__locale_t loc; LCID lcid[6] = { 0 }; char buf[256]; - int i; + int i, ret, size;
TRACE("(%d %s)\n", category, locale);
@@ -1124,6 +1143,44 @@ MSVCRT__locale_t CDECL MSVCRT__create_locale(int category, const char *locale) } else loc->locinfo->lc_category[MSVCRT_LC_TIME].locale = MSVCRT__strdup("C");
+ size = sizeof(MSVCRT___lc_time_data); + for(i=0; i<sizeof(time_data)/sizeof(time_data[0]); i++) { + ret = GetLocaleInfoA(lcid[MSVCRT_LC_TIME], time_data[i] + |LOCALE_NOUSEROVERRIDE, NULL, 0); + if(!ret) { + MSVCRT__free_locale(loc); + return NULL; + } + size += ret; + + ret = GetLocaleInfoW(lcid[MSVCRT_LC_TIME], time_data[i] + |LOCALE_NOUSEROVERRIDE, NULL, 0); + if(!ret) { + MSVCRT__free_locale(loc); + return NULL; + } + size += ret*sizeof(MSVCRT_wchar_t); + } + + loc->locinfo->lc_time_curr = MSVCRT_malloc(size); + if(!loc->locinfo->lc_time_curr) { + MSVCRT__free_locale(loc); + return NULL; + } + + ret = 0; + for(i=0; i<sizeof(time_data)/sizeof(time_data[0]); i++) { + loc->locinfo->lc_time_curr->str[i] = &loc->locinfo->lc_time_curr->data[ret]; + ret += GetLocaleInfoA(lcid[MSVCRT_LC_TIME], time_data[i]|LOCALE_NOUSEROVERRIDE, + &loc->locinfo->lc_time_curr->data[ret], size-ret); + } + for(i=0; i<sizeof(time_data)/sizeof(time_data[0]); i++) { + loc->locinfo->lc_time_curr->wstr[i] = (MSVCRT_wchar_t*)&loc->locinfo->lc_time_curr->data[ret]; + ret += GetLocaleInfoW(lcid[MSVCRT_LC_TIME], time_data[i]|LOCALE_NOUSEROVERRIDE, + (MSVCRT_wchar_t*)&loc->locinfo->lc_time_curr->data[ret], size-ret)*sizeof(MSVCRT_wchar_t); + } + loc->locinfo->lc_time_curr->lcid = lcid[MSVCRT_LC_TIME]; + return loc; }
@@ -1248,6 +1305,8 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale) (void**)&loc->locinfo->lc_category[MSVCRT_LC_TIME].locale); swap_pointers((void**)&locinfo->lc_category[MSVCRT_LC_TIME].refcount, (void**)&loc->locinfo->lc_category[MSVCRT_LC_TIME].refcount); + swap_pointers((void**)&locinfo->lc_time_curr, + (void**)&loc->locinfo->lc_time_curr);
if(category != MSVCRT_LC_ALL) break; diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index d9eb6bd..0695e6f 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -108,6 +108,25 @@ typedef struct MSVCRT_tagLC_ID { unsigned short wCodePage; } MSVCRT_LC_ID, *MSVCRT_LPLC_ID;
+typedef struct { + /* str table contains following strings: + * short weekday names [7]; + * weekday names [7]; + * short month names [12]; + * month names [12]; + * s1159 (AM); + * s2359 (PM); + * short date format; + * date format; + * time format; + */ + char *str[43]; + LCID lcid; + int unk[2]; + MSVCRT_wchar_t *wstr[43]; + char data[1]; +} MSVCRT___lc_time_data; + typedef struct MSVCRT_threadlocaleinfostruct { int refcount; unsigned int lc_codepage; @@ -131,7 +150,7 @@ typedef struct MSVCRT_threadlocaleinfostruct { unsigned short *pctype; unsigned char *pclmap; unsigned char *pcumap; - struct MSVCRT___lc_time_data *lc_time_curr; + MSVCRT___lc_time_data *lc_time_curr; } MSVCRT_threadlocinfo;
typedef struct MSVCRT_threadmbcinfostruct {