msvcp110: Add wide-char days and months to _LocInfo.

This commit is contained in:
Daniel Lehman 2015-06-08 14:17:39 -07:00 committed by Alexandre Julliard
parent 1a4db7cdf5
commit 79118f3543
5 changed files with 115 additions and 18 deletions

View file

@ -1818,12 +1818,12 @@
@ cdecl -arch=arm ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ(ptr) basic_streambuf_wchar__Unlock
@ thiscall -arch=i386 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ(ptr) basic_streambuf_wchar__Unlock
@ cdecl -arch=win64 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ(ptr) basic_streambuf_wchar__Unlock
@ stub -arch=arm ?_W_Getdays@_Locinfo@std@@QBAPBGXZ
@ stub -arch=i386 ?_W_Getdays@_Locinfo@std@@QBEPBGXZ
@ stub -arch=win64 ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ
@ stub -arch=arm ?_W_Getmonths@_Locinfo@std@@QBAPBGXZ
@ stub -arch=i386 ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ
@ stub -arch=win64 ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ
@ cdecl -arch=arm ?_W_Getdays@_Locinfo@std@@QBAPBGXZ(ptr) _Locinfo__W_Getdays
@ thiscall -arch=i386 ?_W_Getdays@_Locinfo@std@@QBEPBGXZ(ptr) _Locinfo__W_Getdays
@ cdecl -arch=win64 ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ(ptr) _Locinfo__W_Getdays
@ cdecl -arch=arm ?_W_Getmonths@_Locinfo@std@@QBAPBGXZ(ptr) _Locinfo__W_Getmonths
@ thiscall -arch=i386 ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ(ptr) _Locinfo__W_Getmonths
@ cdecl -arch=win64 ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ(ptr) _Locinfo__W_Getmonths
@ stub -arch=arm ?_W_Gettnames@_Locinfo@std@@QBA?AV_Timevec@2@XZ
@ stub -arch=i386 ?_W_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ
@ stub -arch=win64 ?_W_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ

View file

@ -1779,12 +1779,12 @@
@ cdecl -arch=arm ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ(ptr) basic_streambuf_wchar__Unlock
@ thiscall -arch=i386 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ(ptr) basic_streambuf_wchar__Unlock
@ cdecl -arch=win64 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ(ptr) basic_streambuf_wchar__Unlock
@ stub -arch=arm ?_W_Getdays@_Locinfo@std@@QBAPBGXZ
@ stub -arch=i386 ?_W_Getdays@_Locinfo@std@@QBEPBGXZ
@ stub -arch=win64 ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ
@ stub -arch=arm ?_W_Getmonths@_Locinfo@std@@QBAPBGXZ
@ stub -arch=i386 ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ
@ stub -arch=win64 ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ
@ cdecl -arch=arm ?_W_Getdays@_Locinfo@std@@QBAPBGXZ(ptr) _Locinfo__W_Getdays
@ thiscall -arch=i386 ?_W_Getdays@_Locinfo@std@@QBEPBGXZ(ptr) _Locinfo__W_Getdays
@ cdecl -arch=win64 ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ(ptr) _Locinfo__W_Getdays
@ cdecl -arch=arm ?_W_Getmonths@_Locinfo@std@@QBAPBGXZ(ptr) _Locinfo__W_Getmonths
@ thiscall -arch=i386 ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ(ptr) _Locinfo__W_Getmonths
@ cdecl -arch=win64 ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ(ptr) _Locinfo__W_Getmonths
@ stub -arch=arm ?_W_Gettnames@_Locinfo@std@@QBA?AV_Timevec@2@XZ
@ stub -arch=i386 ?_W_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ
@ stub -arch=win64 ?_W_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ

View file

@ -1779,12 +1779,12 @@
@ cdecl -arch=arm ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ
@ thiscall -arch=i386 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ
@ cdecl -arch=win64 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ
@ stub -arch=arm ?_W_Getdays@_Locinfo@std@@QBAPBGXZ
@ stub -arch=i386 ?_W_Getdays@_Locinfo@std@@QBEPBGXZ
@ stub -arch=win64 ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ
@ stub -arch=arm ?_W_Getmonths@_Locinfo@std@@QBAPBGXZ
@ stub -arch=i386 ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ
@ stub -arch=win64 ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ
@ cdecl -arch=arm ?_W_Getdays@_Locinfo@std@@QBAPBGXZ(ptr) msvcp120.?_W_Getdays@_Locinfo@std@@QBAPBGXZ
@ thiscall -arch=i386 ?_W_Getdays@_Locinfo@std@@QBEPBGXZ(ptr) msvcp120.?_W_Getdays@_Locinfo@std@@QBEPBGXZ
@ cdecl -arch=win64 ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ(ptr) msvcp120.?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ
@ cdecl -arch=arm ?_W_Getmonths@_Locinfo@std@@QBAPBGXZ(ptr) msvcp120.?_W_Getmonths@_Locinfo@std@@QBAPBGXZ
@ thiscall -arch=i386 ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ(ptr) msvcp120.?_W_Getmonths@_Locinfo@std@@QBEPBGXZ
@ cdecl -arch=win64 ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ(ptr) msvcp120.?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ
@ stub -arch=arm ?_W_Gettnames@_Locinfo@std@@QBA?AV_Timevec@2@XZ
@ stub -arch=i386 ?_W_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ
@ stub -arch=win64 ?_W_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ

View file

@ -48,7 +48,9 @@ typedef enum {
} dateorder;
char* __cdecl _Getdays(void);
wchar_t* __cdecl _W_Getdays(void);
char* __cdecl _Getmonths(void);
wchar_t* __cdecl _W_Getmonths(void);
void* __cdecl _Gettnames(void);
unsigned int __cdecl ___lc_codepage_func(void);
int __cdecl ___lc_collate_cp_func(void);
@ -86,6 +88,12 @@ LCID* __cdecl ___lc_handle_func(void);
#define locale_string_char_dtor(this) _Yarn_char_dtor(this)
#define locale_string_char_c_str(this) _Yarn_char_c_str(this)
#define locale_string_char_assign(this,assign) _Yarn_char_op_assign(this,assign)
#define locale_string_wchar _Yarn_wchar
#define locale_string_wchar_ctor(this) _Yarn_wchar_ctor(this)
#define locale_string_wchar_ctor_cstr(this,str) _Yarn_wchar_ctor(this); _Yarn_wchar_op_assign_cstr(this,str)
#define locale_string_wchar_dtor(this) _Yarn_wchar_dtor(this)
#define locale_string_wchar_c_str(this) _Yarn_wchar__C_str(this)
#endif
typedef int category;
@ -111,6 +119,10 @@ typedef struct {
_Lockit lock;
locale_string days;
locale_string months;
#if _MSVCP_VER >= 110
locale_string_wchar wdays;
locale_string_wchar wmonths;
#endif
locale_string oldlocname;
locale_string newlocname;
} _Locinfo;
@ -502,6 +514,9 @@ void* __thiscall _Timevec__Getptr(_Timevec *this)
_Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
{
const char *locale = NULL;
#if _MSVCP_VER >= 110
static const wchar_t empty[] = { '\0' };
#endif
/* This function is probably modifying more global objects */
FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
@ -512,6 +527,10 @@ _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int categor
_Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
locale_string_char_ctor_cstr(&locinfo->days, "");
locale_string_char_ctor_cstr(&locinfo->months, "");
#if _MSVCP_VER >= 110
locale_string_wchar_ctor_cstr(&locinfo->wdays, empty);
locale_string_wchar_ctor_cstr(&locinfo->wmonths, empty);
#endif
locale_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
if(category)
@ -574,6 +593,10 @@ void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
setlocale(LC_ALL, locale_string_char_c_str(&locinfo->oldlocname));
locale_string_char_dtor(&locinfo->days);
locale_string_char_dtor(&locinfo->months);
#if _MSVCP_VER >= 110
locale_string_wchar_dtor(&locinfo->wdays);
locale_string_wchar_dtor(&locinfo->wmonths);
#endif
locale_string_char_dtor(&locinfo->oldlocname);
locale_string_char_dtor(&locinfo->newlocname);
_Lockit_dtor(&locinfo->lock);
@ -778,6 +801,75 @@ const char* __thiscall _Locinfo__Getdays(_Locinfo *this)
return ret;
}
#if _MSVCP_VER >= 110
/* ?_W_Getdays@_Locinfo@std@@QBEPBGXZ */
/* ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ */
DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getdays, 4)
const wchar_t* __thiscall _Locinfo__W_Getdays(_Locinfo *this)
{
static const wchar_t defdays[] =
{
':','S','u','n',':','S','u','n','d','a','y',
':','M','o','n',':','M','o','n','d','a','y',
':','T','u','e',':','T','u','e','s','d','a','y',
':','W','e','d',':','W','e','d','n','e','s','d','a','y',
':','T','h','u',':','T','h','u','r','s','d','a','y',
':','F','r','i',':','F','r','i','d','a','y',
':','S','a','t',':','S','a','t','u','r','d','a','y'
};
wchar_t *wdays = _W_Getdays();
const wchar_t *ret;
TRACE("(%p)\n", this);
if(wdays) {
locale_string_wchar_dtor(&this->wdays);
locale_string_wchar_ctor_cstr(&this->wdays, wdays);
free(wdays);
}
ret = locale_string_wchar_c_str(&this->wdays);
if (!ret[0]) ret = defdays;
return ret;
}
/* ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ */
/* ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ */
DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getmonths, 4)
const wchar_t* __thiscall _Locinfo__W_Getmonths(_Locinfo *this)
{
static const wchar_t defmonths[] =
{
':','J','a','n',':','J','a','n','u','a','r','y',
':','F','e','b',':','F','e','b','r','u','a','r','y',
':','M','a','r',':','M','a','r','c','h',
':','A','p','r',':','A','p','r','i','l',
':','M','a','y',':','M','a','y',
':','J','u','n',':','J','u','n','e',
':','J','u','l',':','J','u','l','y',
':','A','u','g',':','A','u','g','u','s','t',
':','S','e','p',':','S','e','p','t','e','m','b','e','r',
':','O','c','t',':','O','c','t','o','b','e','r',
':','N','o','v',':','N','o','v','e','m','b','e','r',
':','D','e','c',':','D','e','c','e','m','b','e','r'
};
wchar_t *wmonths = _W_Getmonths();
const wchar_t *ret;
TRACE("(%p)\n", this);
if(wmonths) {
locale_string_wchar_dtor(&this->wmonths);
locale_string_wchar_ctor_cstr(&this->wmonths, wmonths);
free(wmonths);
}
ret = locale_string_wchar_c_str(&this->wmonths);
if (!ret[0]) ret = defmonths;
return ret;
}
#endif
/* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
/* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)

View file

@ -154,6 +154,11 @@ typedef struct
wchar_t null_str;
} _Yarn_wchar;
_Yarn_wchar* __thiscall _Yarn_wchar_ctor(_Yarn_wchar*);
const wchar_t* __thiscall _Yarn_wchar__C_str(const _Yarn_wchar*);
void __thiscall _Yarn_wchar_dtor(_Yarn_wchar*);
_Yarn_wchar* __thiscall _Yarn_wchar_op_assign_cstr(_Yarn_wchar*, const wchar_t*);
/* class locale::facet */
typedef struct {
const vtable_ptr *vtable;