Module: wine Branch: master Commit: 5401437739f28169f548aa2b53ff57f2918149b6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5401437739f28169f548aa2b53... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Tue Mar 19 15:38:14 2013 +0100 msvcp90: Added time_put facet to locale object. --- dlls/msvcp90/locale.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 135 insertions(+), 3 deletions(-) diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c index 253edb6..5e11ece 100644 --- a/dlls/msvcp90/locale.c +++ b/dlls/msvcp90/locale.c @@ -7982,6 +7982,34 @@ MSVCP_size_t __cdecl time_put_char__Getcat(const locale_facet **facet, const loc return LC_TIME; } +static time_put* time_put_char_use_facet(const locale *loc) +{ + static time_put *obj = NULL; + + _Lockit lock; + const locale_facet *fac; + + _Lockit_ctor_locktype(&lock, _LOCK_LOCALE); + fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_char_id)); + if(fac) { + _Lockit_dtor(&lock); + return (time_put*)fac; + } + + if(obj) { + _Lockit_dtor(&lock); + return obj; + } + + time_put_char__Getcat(&fac, loc); + obj = (time_put*)fac; + locale_facet__Incref(&obj->facet); + locale_facet_register(&obj->facet); + _Lockit_dtor(&lock); + + return obj; +} + /* ?do_put@?$time_put(a)DV?$ostreambuf_iterator(a)DU?$char_traits(a)D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator(a)DU?$char_traits(a)D@std@@@2(a)V32@AAVios_base(a)2@DPBUtm@@DD(a)Z */ /* ?do_put@?$time_put(a)DV?$ostreambuf_iterator(a)DU?$char_traits(a)D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator(a)DU?$char_traits(a)D@std@@@2(a)V32@AEAVios_base(a)2@DPEBUtm@@DD(a)Z */ DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 36) @@ -8217,6 +8245,34 @@ MSVCP_size_t __cdecl time_put_wchar__Getcat(const locale_facet **facet, const lo return LC_TIME; } +static time_put* time_put_wchar_use_facet(const locale *loc) +{ + static time_put *obj = NULL; + + _Lockit lock; + const locale_facet *fac; + + _Lockit_ctor_locktype(&lock, _LOCK_LOCALE); + fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_wchar_id)); + if(fac) { + _Lockit_dtor(&lock); + return (time_put*)fac; + } + + if(obj) { + _Lockit_dtor(&lock); + return obj; + } + + time_put_wchar__Getcat(&fac, loc); + obj = (time_put*)fac; + locale_facet__Incref(&obj->facet); + locale_facet_register(&obj->facet); + _Lockit_dtor(&lock); + + return obj; +} + /* ?_Getcat@?$time_put(a)GV?$ostreambuf_iterator(a)GU?$char_traits(a)G@std@@@std@@@std@@SAIPAPBVfacet(a)locale@2(a)PBV42@@Z */ /* ?_Getcat@?$time_put(a)GV?$ostreambuf_iterator(a)GU?$char_traits(a)G@std@@@std@@@std@@SA_KPEAPEBVfacet(a)locale@2(a)PEBV42@@Z */ MSVCP_size_t __cdecl time_put_short__Getcat(const locale_facet **facet, const locale *loc) @@ -8237,6 +8293,34 @@ MSVCP_size_t __cdecl time_put_short__Getcat(const locale_facet **facet, const lo return LC_TIME; } +static time_put* time_put_short_use_facet(const locale *loc) +{ + static time_put *obj = NULL; + + _Lockit lock; + const locale_facet *fac; + + _Lockit_ctor_locktype(&lock, _LOCK_LOCALE); + fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_short_id)); + if(fac) { + _Lockit_dtor(&lock); + return (time_put*)fac; + } + + if(obj) { + _Lockit_dtor(&lock); + return obj; + } + + time_put_short__Getcat(&fac, loc); + obj = (time_put*)fac; + locale_facet__Incref(&obj->facet); + locale_facet_register(&obj->facet); + _Lockit_dtor(&lock); + + return obj; +} + /* ?do_put@?$time_put(a)GV?$ostreambuf_iterator(a)GU?$char_traits(a)G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator(a)GU?$char_traits(a)G@std@@@2(a)V32@AAVios_base(a)2@GPBUtm@@DD(a)Z */ /* ?do_put@?$time_put(a)GV?$ostreambuf_iterator(a)GU?$char_traits(a)G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator(a)GU?$char_traits(a)G@std@@@2(a)V32@AEAVios_base(a)2@GPEBUtm@@DD(a)Z */ /* ?do_put@?$time_put(a)_WV?$ostreambuf_iterator(a)_WU?$char_traits(a)_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator(a)_WU?$char_traits(a)_W@std@@@2(a)V32@AAVios_base(a)2@_WPBUtm@@DD(a)Z */ @@ -8491,7 +8575,7 @@ locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void) /* ?_Makeushloc(a)_Locimp@locale(a)std@@CAXABV_Locinfo(a)3@HPAV123(a)PBV23@@Z */ /* ?_Makeushloc(a)_Locimp@locale(a)std@@CAXAEBV_Locinfo(a)3@HPEAV123(a)PEBV23@@Z */ /* List of missing facets: - * messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put + * messages, money_get, money_put, moneypunct, moneypunct, time_get */ void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc) { @@ -8577,6 +8661,22 @@ void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, l locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_short_id)); } + if(cat & (1<<(time_put_short__Getcat(NULL, NULL)-1))) { + time_put *t; + + if(loc) { + t = time_put_short_use_facet(loc); + }else { + t = MSVCRT_operator_new(sizeof(time_put)); + if(!t) { + ERR("Out of memory\n"); + throw_exception(EXCEPTION_BAD_ALLOC, NULL); + } + time_put_short_ctor_locinfo(t, locinfo, 0); + } + locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_short_id)); + } + if(cat & (1<<(codecvt_short__Getcat(NULL, NULL)-1))) { codecvt_wchar *codecvt; @@ -8597,7 +8697,7 @@ void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, l /* ?_Makewloc(a)_Locimp@locale(a)std@@CAXABV_Locinfo(a)3@HPAV123(a)PBV23@@Z */ /* ?_Makewloc(a)_Locimp@locale(a)std@@CAXAEBV_Locinfo(a)3@HPEAV123(a)PEBV23@@Z */ /* List of missing facets: - * messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put + * messages, money_get, money_put, moneypunct, moneypunct, time_get */ void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc) { @@ -8683,6 +8783,22 @@ void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, loc locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_wchar_id)); } + if(cat & (1<<(time_put_wchar__Getcat(NULL, NULL)-1))) { + time_put *t; + + if(loc) { + t = time_put_wchar_use_facet(loc); + }else { + t = MSVCRT_operator_new(sizeof(time_put)); + if(!t) { + ERR("Out of memory\n"); + throw_exception(EXCEPTION_BAD_ALLOC, NULL); + } + time_put_wchar_ctor_locinfo(t, locinfo, 0); + } + locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_wchar_id)); + } + if(cat & (1<<(codecvt_wchar__Getcat(NULL, NULL)-1))) { codecvt_wchar *codecvt; @@ -8703,7 +8819,7 @@ void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, loc /* ?_Makexloc(a)_Locimp@locale(a)std@@CAXABV_Locinfo(a)3@HPAV123(a)PBV23@@Z */ /* ?_Makexloc(a)_Locimp@locale(a)std@@CAXAEBV_Locinfo(a)3@HPEAV123(a)PEBV23@@Z */ /* List of missing facets: - * messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put + * messages, money_get, money_put, moneypunct, moneypunct, time_get */ void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc) { @@ -8789,6 +8905,22 @@ void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, loc locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_char_id)); } + if(cat & (1<<(time_put_char__Getcat(NULL, NULL)-1))) { + time_put *t; + + if(loc) { + t = time_put_char_use_facet(loc); + }else { + t = MSVCRT_operator_new(sizeof(time_put)); + if(!t) { + ERR("Out of memory\n"); + throw_exception(EXCEPTION_BAD_ALLOC, NULL); + } + time_put_char_ctor_locinfo(t, locinfo, 0); + } + locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_char_id)); + } + if(cat & (1<<(codecvt_char__Getcat(NULL, NULL)-1))) { codecvt_char *codecvt;