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, ©->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