Daniel Lehman : msvcp90: Implement time_get<char> ctors and dtors ( Valgrind).

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 16 08:37:19 CDT 2015


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

Author: Daniel Lehman <dlehman at esri.com>
Date:   Mon Jun 22 17:45:28 2015 -0700

msvcp90: Implement time_get<char> ctors and dtors (Valgrind).

---

 dlls/msvcp90/locale.c | 84 +++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 65 insertions(+), 19 deletions(-)

diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index f9a42e6..5bd10eb 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -9665,38 +9665,79 @@ extern const vtable_ptr MSVCP_time_get_char_vtable;
 DEFINE_THISCALL_WRAPPER(time_get_char__Init, 8)
 void __thiscall time_get_char__Init(time_get_char *this, const _Locinfo *locinfo)
 {
-    FIXME("(%p %p) stub\n", this, locinfo);
-}
+    const char *months;
+    const char *days;
+    int len;
 
-/* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IAE at PBDI@Z */
-/* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IEAA at PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(time_get_char_ctor_name, 12)
-time_get_char* __thiscall time_get_char_ctor_name(time_get_char *this, const char *name, unsigned int refs)
-{
-    FIXME("(%p %p %d) stub\n", this, name, refs);
-    this->facet.vtable = &MSVCP_time_get_char_vtable;
-    return NULL;
+    TRACE("(%p %p)\n", this, locinfo);
+
+    days = _Locinfo__Getdays(locinfo);
+    len = strlen(days)+1;
+    this->days = MSVCRT_operator_new(len);
+    if(!this->days)
+    {
+        ERR("Out of memory\n");
+        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+    }
+    memcpy((char*)this->days, days, len);
+
+    months = _Locinfo__Getmonths(locinfo);
+    len = strlen(months)+1;
+    this->months = MSVCRT_operator_new(len);
+    if(!this->months)
+    {
+        MSVCRT_operator_delete((char*)this->days);
+
+        ERR("Out of memory\n");
+        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+    }
+    memcpy((char*)this->months, months, len);
+
+    this->dateorder = _Locinfo__Getdateorder(locinfo);
+    _Locinfo__Getcvt(locinfo, &this->cvt);
 }
 
 /* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at ABV_Locinfo@1 at I@Z */
 /* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QEAA at AEBV_Locinfo@1 at _K@Z */
 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_locinfo, 12)
 time_get_char* __thiscall time_get_char_ctor_locinfo(time_get_char *this,
-        const _Locinfo *locinfo, unsigned int refs)
+        const _Locinfo *locinfo, MSVCP_size_t refs)
 {
-    FIXME("(%p %p %d) stub\n", this, locinfo, refs);
+    TRACE("(%p %p %lu)\n", this, locinfo, refs);
+    locale_facet_ctor_refs(&this->facet, refs);
     this->facet.vtable = &MSVCP_time_get_char_vtable;
-    return NULL;
+    time_get_char__Init(this, locinfo);
+    return this;
+}
+
+/* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IAE at PBDI@Z */
+/* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@IEAA at PEBD_K@Z */
+DEFINE_THISCALL_WRAPPER(time_get_char_ctor_name, 12)
+time_get_char* __thiscall time_get_char_ctor_name(time_get_char *this, const char *name, MSVCP_size_t refs)
+{
+    _Locinfo locinfo;
+
+    TRACE("(%p %s %lu)\n", this, name, refs);
+
+    _Locinfo_ctor_cstr(&locinfo, name);
+    time_get_char_ctor_locinfo(this, &locinfo, refs);
+    _Locinfo_dtor(&locinfo);
+    return this;
 }
 
 /* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAE at I@Z */
 /* ??0?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QEAA at _K@Z */
 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_refs, 8)
-time_get_char* __thiscall time_get_char_ctor_refs(time_get_char *this, unsigned int refs)
+time_get_char* __thiscall time_get_char_ctor_refs(time_get_char *this, MSVCP_size_t refs)
 {
-    FIXME("(%p %d) stub\n", this, refs);
-    this->facet.vtable = &MSVCP_time_get_char_vtable;
-    return NULL;
+    _Locinfo locinfo;
+
+    TRACE("(%p %lu)\n", this, refs);
+
+    _Locinfo_ctor(&locinfo);
+    time_get_char_ctor_locinfo(this, &locinfo, refs);
+    _Locinfo_dtor(&locinfo);
+    return this;
 }
 
 /* ??_F?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QAEXXZ */
@@ -9712,7 +9753,10 @@ time_get_char* __thiscall time_get_char_ctor(time_get_char *this)
 DEFINE_THISCALL_WRAPPER(time_get_char__Tidy, 4)
 void __thiscall time_get_char__Tidy(time_get_char *this)
 {
-    FIXME("(%p) stub\n", this);
+    TRACE("(%p)\n", this);
+
+    MSVCRT_operator_delete((char*)this->days);
+    MSVCRT_operator_delete((char*)this->months);
 }
 
 /* ??1?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MAE at XZ */
@@ -9720,7 +9764,9 @@ void __thiscall time_get_char__Tidy(time_get_char *this)
 DEFINE_THISCALL_WRAPPER(time_get_char_dtor, 4) /* virtual */
 void __thiscall time_get_char_dtor(time_get_char *this)
 {
-    FIXME("(%p) stub\n", this);
+    TRACE("(%p)\n", this);
+
+    time_get_char__Tidy(this);
 }
 
 DEFINE_THISCALL_WRAPPER(time_get_char_vector_dtor, 8)




More information about the wine-cvs mailing list