Piotr Caban : msvcp90: Added collate facet to locale object.

Alexandre Julliard julliard at winehq.org
Mon Mar 25 14:19:38 CDT 2013


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Mar 19 15:37:59 2013 +0100

msvcp90: Added collate facet to locale object.

---

 dlls/msvcp90/locale.c |  144 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 138 insertions(+), 6 deletions(-)

diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index 77b140c..253edb6 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -768,7 +768,7 @@ collate* __thiscall collate_char_ctor_name(collate *this, const char *name, MSVC
 /* ??0?$collate at D@std@@QAE at ABV_Locinfo@1 at I@Z */
 /* ??0?$collate at D@std@@QEAA at AEBV_Locinfo@1 at _K@Z */
 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
-collate* __thiscall collate_char_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
+collate* __thiscall collate_char_ctor_locinfo(collate *this, const _Locinfo *locinfo, MSVCP_size_t refs)
 {
     TRACE("(%p %p %lu)\n", this, locinfo, refs);
 
@@ -842,6 +842,34 @@ MSVCP_size_t __cdecl collate_char__Getcat(const locale_facet **facet, const loca
     return LC_COLLATE;
 }
 
+static collate* collate_char_use_facet(const locale *loc)
+{
+    static collate *obj = NULL;
+
+    _Lockit lock;
+    const locale_facet *fac;
+
+    _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
+    fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_char_id));
+    if(fac) {
+        _Lockit_dtor(&lock);
+        return (collate*)fac;
+    }
+
+    if(obj) {
+        _Lockit_dtor(&lock);
+        return obj;
+    }
+
+    collate_char__Getcat(&fac, loc);
+    obj = (collate*)fac;
+    locale_facet__Incref(&obj->facet);
+    locale_facet_register(&obj->facet);
+    _Lockit_dtor(&lock);
+
+    return obj;
+}
+
 /* _Strcoll */
 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
         const char *last2, const _Collvec *coll)
@@ -979,7 +1007,7 @@ collate* __thiscall collate_short_ctor_name(collate *this, const char *name, MSV
 /* ??0?$collate at _W@std@@QAE at ABV_Locinfo@1 at I@Z */
 /* ??0?$collate at _W@std@@QEAA at AEBV_Locinfo@1 at _K@Z */
 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
-collate* __thiscall collate_wchar_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
+collate* __thiscall collate_wchar_ctor_locinfo(collate *this, const _Locinfo *locinfo, MSVCP_size_t refs)
 {
     TRACE("(%p %p %lu)\n", this, locinfo, refs);
 
@@ -992,7 +1020,7 @@ collate* __thiscall collate_wchar_ctor_locinfo(collate *this, _Locinfo *locinfo,
 /* ??0?$collate at G@std@@QAE at ABV_Locinfo@1 at I@Z */
 /* ??0?$collate at G@std@@QEAA at AEBV_Locinfo@1 at _K@Z */
 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
-collate* __thiscall collate_short_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
+collate* __thiscall collate_short_ctor_locinfo(collate *this, const _Locinfo *locinfo, MSVCP_size_t refs)
 {
     collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
     ret->facet.vtable = &MSVCP_collate_short_vtable;
@@ -1085,6 +1113,34 @@ MSVCP_size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const loc
     return LC_COLLATE;
 }
 
+static collate* collate_wchar_use_facet(const locale *loc)
+{
+        static collate *obj = NULL;
+
+        _Lockit lock;
+        const locale_facet *fac;
+
+        _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
+        fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_wchar_id));
+        if(fac) {
+            _Lockit_dtor(&lock);
+            return (collate*)fac;
+        }
+
+        if(obj) {
+            _Lockit_dtor(&lock);
+            return obj;
+        }
+
+        collate_wchar__Getcat(&fac, loc);
+        obj = (collate*)fac;
+        locale_facet__Incref(&obj->facet);
+        locale_facet_register(&obj->facet);
+        _Lockit_dtor(&lock);
+
+        return obj;
+}
+
 /* ?_Getcat@?$collate at G@std@@SAIPAPBVfacet at locale@2 at PBV42@@Z */
 /* ?_Getcat@?$collate at G@std@@SA_KPEAPEBVfacet at locale@2 at PEBV42@@Z */
 MSVCP_size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
@@ -1097,6 +1153,34 @@ MSVCP_size_t __cdecl collate_short__Getcat(const locale_facet **facet, const loc
     return LC_COLLATE;
 }
 
+static collate* collate_short_use_facet(const locale *loc)
+{
+    static collate *obj = NULL;
+
+    _Lockit lock;
+    const locale_facet *fac;
+
+    _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
+    fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_short_id));
+    if(fac) {
+        _Lockit_dtor(&lock);
+        return (collate*)fac;
+    }
+
+    if(obj) {
+        _Lockit_dtor(&lock);
+        return obj;
+    }
+
+    collate_short__Getcat(&fac, loc);
+    obj = (collate*)fac;
+    locale_facet__Incref(&obj->facet);
+    locale_facet_register(&obj->facet);
+    _Lockit_dtor(&lock);
+
+    return obj;
+}
+
 /* _Wcscoll */
 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
         const wchar_t *last2, const _Collvec *coll)
@@ -8407,7 +8491,7 @@ locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
 /* ?_Makeushloc at _Locimp@locale at std@@CAXABV_Locinfo at 3@HPAV123 at PBV23@@Z */
 /* ?_Makeushloc at _Locimp@locale at std@@CAXAEBV_Locinfo at 3@HPEAV123 at PEBV23@@Z */
 /* List of missing facets:
- * num_put, collate, messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put
+ * messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put
  */
 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
 {
@@ -8477,6 +8561,22 @@ void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, l
         locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_short_id));
     }
 
+    if(cat & (1<<(collate_short__Getcat(NULL, NULL)-1))) {
+        collate *c;
+
+        if(loc) {
+            c = collate_short_use_facet(loc);
+        }else {
+            c = MSVCRT_operator_new(sizeof(collate));
+            if(!c) {
+                ERR("Out of memory\n");
+                throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+            }
+            collate_short_ctor_locinfo(c, locinfo, 0);
+        }
+        locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_short_id));
+    }
+
     if(cat & (1<<(codecvt_short__Getcat(NULL, NULL)-1))) {
         codecvt_wchar *codecvt;
 
@@ -8497,7 +8597,7 @@ void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, l
 /* ?_Makewloc at _Locimp@locale at std@@CAXABV_Locinfo at 3@HPAV123 at PBV23@@Z */
 /* ?_Makewloc at _Locimp@locale at std@@CAXAEBV_Locinfo at 3@HPEAV123 at PEBV23@@Z */
 /* List of missing facets:
- * collate, messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put
+ * messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put
  */
 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
 {
@@ -8567,6 +8667,22 @@ void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, loc
         locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_wchar_id));
     }
 
+    if(cat & (1<<(collate_wchar__Getcat(NULL, NULL)-1))) {
+        collate *c;
+
+        if(loc) {
+            c = collate_wchar_use_facet(loc);
+        }else {
+            c = MSVCRT_operator_new(sizeof(collate));
+            if(!c) {
+                ERR("Out of memory\n");
+                throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+            }
+            collate_wchar_ctor_locinfo(c, locinfo, 0);
+        }
+        locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_wchar_id));
+    }
+
     if(cat & (1<<(codecvt_wchar__Getcat(NULL, NULL)-1))) {
         codecvt_wchar *codecvt;
 
@@ -8587,7 +8703,7 @@ void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, loc
 /* ?_Makexloc at _Locimp@locale at std@@CAXABV_Locinfo at 3@HPAV123 at PBV23@@Z */
 /* ?_Makexloc at _Locimp@locale at std@@CAXAEBV_Locinfo at 3@HPEAV123 at PEBV23@@Z */
 /* List of missing facets:
- * collate, messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put
+ * messages, money_get, money_put, moneypunct, moneypunct, time_get, time_put
  */
 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
 {
@@ -8657,6 +8773,22 @@ void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, loc
         locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_char_id));
     }
 
+    if(cat & (1<<(collate_char__Getcat(NULL, NULL)-1))) {
+        collate *c;
+
+        if(loc) {
+            c = collate_char_use_facet(loc);
+        }else {
+            c = MSVCRT_operator_new(sizeof(collate));
+            if(!c) {
+                ERR("Out of memory\n");
+                throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+            }
+            collate_char_ctor_locinfo(c, locinfo, 0);
+        }
+        locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_char_id));
+    }
+
     if(cat & (1<<(codecvt_char__Getcat(NULL, NULL)-1))) {
         codecvt_char *codecvt;
 




More information about the wine-cvs mailing list