Piotr Caban : msvcp90: Added partial locale::_Locimp implementation.

Alexandre Julliard julliard at winehq.org
Wed Nov 23 13:40:08 CST 2011


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Nov 23 16:13:46 2011 +0100

msvcp90: Added partial locale::_Locimp implementation.

---

 dlls/msvcp90/locale.c |  119 ++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 98 insertions(+), 21 deletions(-)

diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index 6ebfb51..ad6c44b 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -115,6 +115,25 @@ locale_facet* __thiscall MSVCP_locale_facet_vector_dtor(locale_facet *this, unsi
 static const vtable_ptr MSVCP_locale_facet_vtable[] = {
     (vtable_ptr)THISCALL_NAME(MSVCP_locale_facet_vector_dtor)
 };
+#ifdef __i386__
+static inline locale_facet* call_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
+{
+    locale_facet *ret;
+    void *dummy;
+
+    __asm__ __volatile__ ("pushl %3\n\tcall *%2"
+                          : "=a" (ret), "=c" (dummy)
+                          : "r" (this->vtable[0]), "r" (flags), "1" (this)
+                          : "edx", "memory" );
+    return ret;
+}
+#else
+static inline locale_facet* call_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
+{
+    locale_facet * (__thiscall *dtor)(locale_facet *, unsigned int) = (void *)this->vtable[0];
+    return dtor(this, flags);
+}
+#endif
 
 /* ??0id at locale@std@@QAE at I@Z */
 /* ??0id at locale@std@@QEAA at _K@Z */
@@ -214,7 +233,7 @@ locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
     if(this->refs)
         this->refs--;
 
-    ret = this->refs ? this : NULL;
+    ret = this->refs ? NULL : this;
     _Lockit_dtor(&lock);
 
     return ret;
@@ -228,22 +247,26 @@ MSVCP_size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const loca
     return -1;
 }
 
-/* ??_F_Locimp at locale@std@@QAEXXZ */
-/* ??_F_Locimp at locale@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
-locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
-{
-    FIXME("(%p) stub\n", this);
-    return NULL;
-}
-
 /* ??0_Locimp at locale@std@@AAE at _N@Z */
 /* ??0_Locimp at locale@std@@AEAA at _N@Z */
 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, MSVCP_bool transparent)
 {
-    FIXME("(%p %d) stub\n", this, transparent);
-    return NULL;
+    TRACE("(%p %d)\n", this, transparent);
+
+    memset(this, 0, sizeof(locale__Locimp));
+    locale_facet_ctor_refs(&this->facet, 1);
+    this->transparent = transparent;
+    MSVCP_basic_string_char_ctor_cstr(&this->name, "*");
+    return this;
+}
+
+/* ??_F_Locimp at locale@std@@QAEXXZ */
+/* ??_F_Locimp at locale@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
+locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
+{
+    return locale__Locimp_ctor_transparent(this, FALSE);
 }
 
 /* ??0_Locimp at locale@std@@AAE at ABV012@@Z */
@@ -251,16 +274,32 @@ locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this,
 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
 {
-    FIXME("(%p %p) stub\n", this, copy);
-    return NULL;
+    MSVCP_size_t i;
+
+    TRACE("(%p %p)\n", this, copy);
+
+    memcpy(this, copy, sizeof(locale__Locimp));
+    locale_facet_ctor_refs(&this->facet, 1);
+    if(copy->facetvec) {
+        this->facetvec = MSVCRT_operator_new(copy->facet_cnt*sizeof(locale_facet*));
+        if(!this->facetvec) {
+            ERR("Out of memory\n");
+            throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+            return NULL;
+        }
+        for(i=0; i<this->facet_cnt; i++)
+            if(this->facetvec[i])
+                locale_facet__Incref(this->facetvec[i]);
+    }
+    MSVCP_basic_string_char_copy_ctor(&this->name, &copy->name);
+    return this;
 }
 
 /* ?_Locimp_ctor at _Locimp@locale at std@@CAXPAV123 at ABV123@@Z */
 /* ?_Locimp_ctor at _Locimp@locale at std@@CAXPEAV123 at AEBV123@@Z */
 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
 {
-    FIXME("(%p %p) stub\n", this, copy);
-    return NULL;
+    return locale__Locimp_copy_ctor(this, copy);
 }
 
 /* ??1_Locimp at locale@std@@MAE at XZ */
@@ -268,20 +307,30 @@ locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const
 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
 {
-    FIXME("(%p) stub\n", this);
+    TRACE("(%p)\n", this);
+
+    if(locale_facet__Decref(&this->facet)) {
+        MSVCP_size_t i;
+        for(i=0; i<this->facet_cnt; i++)
+            if(this->facetvec[i] && locale_facet__Decref(this->facetvec[i]))
+                call_locale_facet_vector_dtor(this->facetvec[i], 0);
+
+        MSVCRT_operator_delete(this->facetvec);
+        MSVCP_basic_string_char_dtor(&this->name);
+    }
 }
 
 /* ?_Locimp_dtor at _Locimp@locale at std@@CAXPAV123@@Z */
 /* ?_Locimp_dtor at _Locimp@locale at std@@CAXPEAV123@@Z */
 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
 {
-    FIXME("(%p) stub\n", this);
+    locale__Locimp_dtor(this);
 }
 
 DEFINE_THISCALL_WRAPPER(MSVCP_locale__Locimp_vector_dtor, 8)
 locale__Locimp* __thiscall MSVCP_locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
 {
-    TRACE("(%p %x) stub\n", this, flags);
+    TRACE("(%p %x)\n", this, flags);
     if(flags & 2) {
         /* we have an array, with the number of elements stored before the first object */
         int i, *ptr = (int *)this-1;
@@ -302,7 +351,35 @@ locale__Locimp* __thiscall MSVCP_locale__Locimp_vector_dtor(locale__Locimp *this
 /* ?_Locimp_Addfac at _Locimp@locale at std@@CAXPEAV123 at PEAVfacet@23 at _K@Z */
 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, MSVCP_size_t id)
 {
-    FIXME("(%p %p %lu) stub\n", locimp, facet, id);
+    TRACE("(%p %p %lu)\n", locimp, facet, id);
+
+    if(id >= locimp->facet_cnt) {
+        MSVCP_size_t new_size = id+1;
+        locale_facet **new_facetvec;
+
+        if(new_size < locale_id__Id_cnt+1)
+            new_size = locale_id__Id_cnt+1;
+
+        new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
+        if(!new_facetvec) {
+            ERR("Out of memory\n");
+            throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+            return;
+        }
+
+        memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
+        memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
+        MSVCRT_operator_delete(locimp->facetvec);
+        locimp->facetvec = new_facetvec;
+        locimp->facet_cnt = new_size;
+    }
+
+    if(locimp->facetvec[id] && locale_facet__Decref(locimp->facetvec[id]))
+        call_locale_facet_vector_dtor(locimp->facetvec[id], 0);
+
+    locimp->facetvec[id] = facet;
+    if(facet)
+        locale_facet__Incref(facet);
 }
 
 /* ?_Addfac at _Locimp@locale at std@@AAEXPAVfacet at 23@I at Z */
@@ -310,7 +387,7 @@ void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet
 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, MSVCP_size_t id)
 {
-    FIXME("(%p %p %lu) stub\n", this, facet, id);
+    locale__Locimp__Locimp_Addfac(this, facet, id);
 }
 
 /* ?_Clocptr_func at _Locimp@locale at std@@CAAAPAV123 at XZ */




More information about the wine-cvs mailing list