msvcp90: Added collate<unsigned short> class stub.
[wine.git] / dlls / msvcp90 / locale.c
blob03b325dff6792241ebcccda6d2263a3cc1e38ed8
1 /*
2 * Copyright 2010 Piotr Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "config.h"
21 #include <stdarg.h>
23 #include "msvcp90.h"
24 #include "locale.h"
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(msvcp90);
31 char* __cdecl _Getdays(void);
32 char* __cdecl _Getmonths(void);
33 void* __cdecl _Gettnames(void);
35 typedef int category;
37 typedef struct {
38 MSVCP_size_t id;
39 } locale_id;
41 typedef struct {
42 const vtable_ptr *vtable;
43 MSVCP_size_t refs;
44 } locale_facet;
46 typedef struct _locale__Locimp {
47 locale_facet facet;
48 locale_facet **facetvec;
49 MSVCP_size_t facet_cnt;
50 category catmask;
51 MSVCP_bool transparent;
52 basic_string_char name;
53 } locale__Locimp;
55 typedef struct {
56 void *timeptr;
57 } _Timevec;
59 typedef struct {
60 _Lockit lock;
61 basic_string_char days;
62 basic_string_char months;
63 basic_string_char oldlocname;
64 basic_string_char newlocname;
65 } _Locinfo;
67 typedef struct {
68 LCID handle;
69 unsigned page;
70 } _Collvec;
72 typedef struct {
73 LCID handle;
74 unsigned page;
75 short *table;
76 int delfl;
77 } _Ctypevec;
79 typedef struct {
80 LCID handle;
81 unsigned page;
82 } _Cvtvec;
84 typedef struct {
85 locale_facet facet;
86 _Collvec coll;
87 } collate;
89 /* ?_Id_cnt@id@locale@std@@0HA */
90 int locale_id__Id_cnt = 0;
92 /* ?_Clocptr@_Locimp@locale@std@@0PAV123@A */
93 /* ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA */
94 locale__Locimp *locale__Locimp__Clocptr = NULL;
96 /* ??1facet@locale@std@@UAE@XZ */
97 /* ??1facet@locale@std@@UEAA@XZ */
98 DEFINE_THISCALL_WRAPPER(locale_facet_dtor, 4)
99 void __thiscall locale_facet_dtor(locale_facet *this)
101 TRACE("(%p)\n", this);
104 DEFINE_THISCALL_WRAPPER(MSVCP_locale_facet_vector_dtor, 8)
105 locale_facet* __thiscall MSVCP_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
107 TRACE("(%p %x)\n", this, flags);
108 if(flags & 2) {
109 /* we have an array, with the number of elements stored before the first object */
110 int i, *ptr = (int *)this-1;
112 for(i=*ptr-1; i>=0; i--)
113 locale_facet_dtor(this+i);
114 MSVCRT_operator_delete(ptr);
115 } else {
116 locale_facet_dtor(this);
117 if(flags & 1)
118 MSVCRT_operator_delete(this);
121 return this;
124 const vtable_ptr MSVCP_locale_facet_vtable[] = {
125 (vtable_ptr)THISCALL_NAME(MSVCP_locale_facet_vector_dtor)
127 #ifdef __i386__
128 static inline locale_facet* call_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
130 locale_facet *ret;
131 void *dummy;
133 __asm__ __volatile__ ("pushl %3\n\tcall *%2"
134 : "=a" (ret), "=c" (dummy)
135 : "r" (this->vtable[0]), "r" (flags), "1" (this)
136 : "edx", "memory" );
137 return ret;
139 #else
140 static inline locale_facet* call_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
142 locale_facet * (__thiscall *dtor)(locale_facet *, unsigned int) = (void *)this->vtable[0];
143 return dtor(this, flags);
145 #endif
147 /* ??0id@locale@std@@QAE@I@Z */
148 /* ??0id@locale@std@@QEAA@_K@Z */
149 DEFINE_THISCALL_WRAPPER(locale_id_ctor_id, 8)
150 locale_id* __thiscall locale_id_ctor_id(locale_id *this, MSVCP_size_t id)
152 TRACE("(%p %lu)\n", this, id);
154 this->id = id;
155 return this;
158 /* ??_Fid@locale@std@@QAEXXZ */
159 /* ??_Fid@locale@std@@QEAAXXZ */
160 DEFINE_THISCALL_WRAPPER(locale_id_ctor, 4)
161 locale_id* __thiscall locale_id_ctor(locale_id *this)
163 TRACE("(%p)\n", this);
165 this->id = 0;
166 return this;
169 /* ??Bid@locale@std@@QAEIXZ */
170 /* ??Bid@locale@std@@QEAA_KXZ */
171 DEFINE_THISCALL_WRAPPER(locale_id_operator_size_t, 4)
172 MSVCP_size_t __thiscall locale_id_operator_size_t(locale_id *this)
174 _Lockit lock;
176 TRACE("(%p)\n", this);
178 if(!this->id) {
179 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
180 this->id = ++locale_id__Id_cnt;
181 _Lockit_dtor(&lock);
184 return this->id;
187 /* ?_Id_cnt_func@id@locale@std@@CAAAHXZ */
188 /* ?_Id_cnt_func@id@locale@std@@CAAEAHXZ */
189 int* __cdecl locale_id__Id_cnt_func(void)
191 TRACE("\n");
192 return &locale_id__Id_cnt;
195 /* ??_Ffacet@locale@std@@QAEXXZ */
196 /* ??_Ffacet@locale@std@@QEAAXXZ */
197 DEFINE_THISCALL_WRAPPER(locale_facet_ctor, 4)
198 locale_facet* __thiscall locale_facet_ctor(locale_facet *this)
200 TRACE("(%p)\n", this);
201 this->vtable = MSVCP_locale_facet_vtable;
202 this->refs = 0;
203 return this;
206 /* ??0facet@locale@std@@IAE@I@Z */
207 /* ??0facet@locale@std@@IEAA@_K@Z */
208 DEFINE_THISCALL_WRAPPER(locale_facet_ctor_refs, 8)
209 locale_facet* __thiscall locale_facet_ctor_refs(locale_facet *this, MSVCP_size_t refs)
211 TRACE("(%p %lu)\n", this, refs);
212 this->vtable = MSVCP_locale_facet_vtable;
213 this->refs = refs;
214 return this;
217 /* ?_Incref@facet@locale@std@@QAEXXZ */
218 /* ?_Incref@facet@locale@std@@QEAAXXZ */
219 DEFINE_THISCALL_WRAPPER(locale_facet__Incref, 4)
220 void __thiscall locale_facet__Incref(locale_facet *this)
222 _Lockit lock;
224 TRACE("(%p)\n", this);
226 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
227 this->refs++;
228 _Lockit_dtor(&lock);
231 /* ?_Decref@facet@locale@std@@QAEPAV123@XZ */
232 /* ?_Decref@facet@locale@std@@QEAAPEAV123@XZ */
233 DEFINE_THISCALL_WRAPPER(locale_facet__Decref, 4)
234 locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
236 _Lockit lock;
237 locale_facet *ret;
239 TRACE("(%p)\n", this);
241 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
242 if(this->refs)
243 this->refs--;
245 ret = this->refs ? NULL : this;
246 _Lockit_dtor(&lock);
248 return ret;
251 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z */
252 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z */
253 MSVCP_size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const locale *loc)
255 TRACE("(%p %p)\n", facet, loc);
256 return -1;
259 /* ?id@?$collate@D@std@@2V0locale@2@A */
260 locale_id collate_char_id = {0};
262 /* ??_7?$collate@D@std@@6B@ */
263 extern const vtable_ptr MSVCP_collate_char_vtable;
265 /* ??0?$collate@D@std@@IAE@PBDI@Z */
266 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
267 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
268 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
270 FIXME("(%p %s %lu) stub\n", this, name, refs);
271 this->facet.vtable = &MSVCP_collate_char_vtable;
272 return NULL;
275 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
276 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
277 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
278 collate* __thiscall collate_char_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
280 FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
281 this->facet.vtable = &MSVCP_collate_char_vtable;
282 return NULL;
285 /* ??0?$collate@D@std@@QAE@I@Z */
286 /* ??0?$collate@D@std@@QEAA@_K@Z */
287 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
288 collate* __thiscall collate_char_ctor_refs(collate *this, MSVCP_size_t refs)
290 FIXME("(%p %lu) stub\n", this, refs);
291 this->facet.vtable = &MSVCP_collate_char_vtable;
292 return NULL;
295 /* ??1?$collate@D@std@@MAE@XZ */
296 /* ??1?$collate@D@std@@MEAA@XZ */
297 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
298 void __thiscall collate_char_dtor(collate *this)
300 FIXME("(%p) stub\n", this);
303 DEFINE_THISCALL_WRAPPER(MSVCP_collate_char_vector_dtor, 8)
304 collate* __thiscall MSVCP_collate_char_vector_dtor(collate *this, unsigned int flags)
306 TRACE("(%p %x)\n", this, flags);
307 if(flags & 2) {
308 /* we have an array, with the number of elements stored before the first object */
309 int i, *ptr = (int *)this-1;
311 for(i=*ptr-1; i>=0; i--)
312 collate_char_dtor(this+i);
313 MSVCRT_operator_delete(ptr);
314 } else {
315 collate_char_dtor(this);
316 if(flags & 1)
317 MSVCRT_operator_delete(this);
320 return this;
323 /* ??_F?$collate@D@std@@QAEXXZ */
324 /* ??_F?$collate@D@std@@QEAAXXZ */
325 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
326 collate* __thiscall collate_char_ctor(collate *this)
328 FIXME("(%p) stub\n", this);
329 this->facet.vtable = &MSVCP_collate_char_vtable;
330 return NULL;
333 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
334 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
335 MSVCP_size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale_facet *loc)
337 FIXME("(%p %p) stub\n", facet, loc);
338 return 0;
341 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
342 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
343 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
344 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
346 FIXME("(%p %p) stub\n", this, locinfo);
349 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
350 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
351 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
352 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
353 const char *last1, const char *first2, const char *last2)
355 FIXME("(%p %p %p %p %p) stub\n", this, first1, last1, first2, last2);
356 return 0;
359 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
360 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
361 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
362 int __thiscall collate_char_compare(const collate *this, const char *first1,
363 const char *last1, const char *first2, const char *last2)
365 FIXME("(%p %p %p %p %p) stub\n", this, first1, last1, first2, last2);
366 return 0;
369 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
370 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
371 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
372 LONG __thiscall collate_char_do_hash(const collate *this,
373 const char *first, const char *last)
375 FIXME("(%p %p %p) stub\n", this, first, last);
376 return 0;
379 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
380 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
381 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
382 LONG __thiscall collate_char_hash(const collate *this,
383 const char *first, const char *last)
385 FIXME("(%p %p %p) stub\n", this, first, last);
386 return 0;
389 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
390 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
391 DEFINE_THISCALL_WRAPPER_RETPTR(collate_char_do_transform, 12)
392 basic_string_char __thiscall collate_char_do_transform(const collate *this,
393 const char *first, const char *last)
395 basic_string_char ret = {0}; /* FIXME */
396 FIXME("(%p %p %p) stub\n", this, first, last);
397 return ret;
400 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
401 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
402 DEFINE_THISCALL_WRAPPER_RETPTR(collate_char_transform, 12)
403 basic_string_char __thiscall collate_char_transform(const collate *this,
404 const char *first, const char *last)
406 basic_string_char ret = {0}; /* FIXME */
407 FIXME("(%p %p %p) stub\n", this, first, last);
408 return ret;
411 /* ?id@?$collate@_W@std@@2V0locale@2@A */
412 locale_id collate_wchar_id = {0};
413 /* ?id@?$collate@G@std@@2V0locale@2@A */
414 locale_id collate_short_id = {0};
416 /* ??_7?$collate@_W@std@@6B@ */
417 extern const vtable_ptr MSVCP_collate_wchar_vtable;
418 /* ??_7?$collate@G@std@@6B@ */
419 extern const vtable_ptr MSVCP_collate_short_vtable;
421 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
422 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
423 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
424 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
426 FIXME("(%p %s %lu) stub\n", this, name, refs);
427 this->facet.vtable = &MSVCP_collate_wchar_vtable;
428 return NULL;
431 /* ??0?$collate@G@std@@IAE@PBDI@Z */
432 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
433 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
434 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
436 collate *ret = collate_wchar_ctor_name(this, name, refs);
437 ret->facet.vtable = &MSVCP_collate_short_vtable;
438 return ret;
441 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
442 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
443 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
444 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
446 FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
447 this->facet.vtable = &MSVCP_collate_wchar_vtable;
448 return NULL;
451 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
452 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
453 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
454 collate* __thiscall collate_short_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
456 collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
457 ret->facet.vtable = &MSVCP_collate_short_vtable;
458 return ret;
461 /* ??0?$collate@_W@std@@QAE@I@Z */
462 /* ??0?$collate@_W@std@@QEAA@_K@Z */
463 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
464 collate* __thiscall collate_wchar_ctor_refs(collate *this, MSVCP_size_t refs)
466 FIXME("(%p %lu) stub\n", this, refs);
467 this->facet.vtable = &MSVCP_collate_wchar_vtable;
468 return NULL;
471 /* ??0?$collate@G@std@@QAE@I@Z */
472 /* ??0?$collate@G@std@@QEAA@_K@Z */
473 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
474 collate* __thiscall collate_short_ctor_refs(collate *this, MSVCP_size_t refs)
476 collate *ret = collate_wchar_ctor_refs(this, refs);
477 ret->facet.vtable = &MSVCP_collate_short_vtable;
478 return ret;
481 /* ??1?$collate@_W@std@@MAE@XZ */
482 /* ??1?$collate@_W@std@@MEAA@XZ */
483 /* ??1?$collate@G@std@@MAE@XZ */
484 /* ??1?$collate@G@std@@MEAA@XZ */
485 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
486 void __thiscall collate_wchar_dtor(collate *this)
488 FIXME("(%p) stub\n", this);
491 DEFINE_THISCALL_WRAPPER(MSVCP_collate_wchar_vector_dtor, 8)
492 collate* __thiscall MSVCP_collate_wchar_vector_dtor(collate *this, unsigned int flags)
494 TRACE("(%p %x)\n", this, flags);
495 if(flags & 2) {
496 /* we have an array, with the number of elements stored before the first object */
497 int i, *ptr = (int *)this-1;
499 for(i=*ptr-1; i>=0; i--)
500 collate_wchar_dtor(this+i);
501 MSVCRT_operator_delete(ptr);
502 } else {
503 collate_wchar_dtor(this);
504 if(flags & 1)
505 MSVCRT_operator_delete(this);
508 return this;
511 DEFINE_THISCALL_WRAPPER(MSVCP_collate_short_vector_dtor, 8)
512 collate* __thiscall MSVCP_collate_short_vector_dtor(collate *this, unsigned int flags)
514 return MSVCP_collate_wchar_vector_dtor(this, flags);
517 /* ??_F?$collate@_W@std@@QAEXXZ */
518 /* ??_F?$collate@_W@std@@QEAAXXZ */
519 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
520 collate* __thiscall collate_wchar_ctor(collate *this)
522 FIXME("(%p) stub\n", this);
523 this->facet.vtable = &MSVCP_collate_wchar_vtable;
524 return NULL;
527 /* ??_F?$collate@G@std@@QAEXXZ */
528 /* ??_F?$collate@G@std@@QEAAXXZ */
529 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
530 collate* __thiscall collate_short_ctor(collate *this)
532 collate *ret = collate_wchar_ctor(this);
533 ret->facet.vtable = &MSVCP_collate_short_vtable;
534 return ret;
537 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
538 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
539 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
540 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
541 MSVCP_size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale_facet *loc)
543 FIXME("(%p %p) stub\n", facet, loc);
544 return 0;
547 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
548 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
549 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
550 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
551 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
552 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
554 FIXME("(%p %p) stub\n", this, locinfo);
557 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
558 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
559 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
560 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
561 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
562 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
563 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
565 FIXME("(%p %p %p %p %p) stub\n", this, first1, last1, first2, last2);
566 return 0;
569 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
570 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
571 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
572 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
573 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
574 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
575 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
577 FIXME("(%p %p %p %p %p) stub\n", this, first1, last1, first2, last2);
578 return 0;
581 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
582 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
583 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
584 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
585 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
586 LONG __thiscall collate_wchar_do_hash(const collate *this,
587 const wchar_t *first, const wchar_t *last)
589 FIXME("(%p %p %p) stub\n", this, first, last);
590 return 0;
593 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
594 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
595 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
596 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
597 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
598 LONG __thiscall collate_wchar_hash(const collate *this,
599 const wchar_t *first, const wchar_t *last)
601 FIXME("(%p %p %p) stub\n", this, first, last);
602 return 0;
605 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
606 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
607 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
608 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
609 DEFINE_THISCALL_WRAPPER_RETPTR(collate_wchar_do_transform, 12)
610 basic_string_wchar __thiscall collate_wchar_do_transform(const collate *this,
611 const wchar_t *first, const wchar_t *last)
613 basic_string_wchar ret = {0}; /* FIXME */
614 FIXME("(%p %p %p) stub\n", this, first, last);
615 return ret;
618 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
619 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
620 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
621 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
622 DEFINE_THISCALL_WRAPPER_RETPTR(collate_wchar_transform, 12)
623 basic_string_wchar __thiscall collate_wchar_transform(const collate *this,
624 const wchar_t *first, const wchar_t *last)
626 basic_string_wchar ret = {0}; /* FIXME */
627 FIXME("(%p %p %p) stub\n", this, first, last);
628 return ret;
631 /* ??0_Locimp@locale@std@@AAE@_N@Z */
632 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
633 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
634 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, MSVCP_bool transparent)
636 TRACE("(%p %d)\n", this, transparent);
638 memset(this, 0, sizeof(locale__Locimp));
639 locale_facet_ctor_refs(&this->facet, 1);
640 this->transparent = transparent;
641 MSVCP_basic_string_char_ctor_cstr(&this->name, "*");
642 return this;
645 /* ??_F_Locimp@locale@std@@QAEXXZ */
646 /* ??_F_Locimp@locale@std@@QEAAXXZ */
647 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
648 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
650 return locale__Locimp_ctor_transparent(this, FALSE);
653 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
654 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
655 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
656 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
658 _Lockit lock;
659 MSVCP_size_t i;
661 TRACE("(%p %p)\n", this, copy);
663 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
664 memcpy(this, copy, sizeof(locale__Locimp));
665 locale_facet_ctor_refs(&this->facet, 1);
666 if(copy->facetvec) {
667 this->facetvec = MSVCRT_operator_new(copy->facet_cnt*sizeof(locale_facet*));
668 if(!this->facetvec) {
669 _Lockit_dtor(&lock);
670 ERR("Out of memory\n");
671 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
672 return NULL;
674 for(i=0; i<this->facet_cnt; i++)
675 if(this->facetvec[i])
676 locale_facet__Incref(this->facetvec[i]);
678 MSVCP_basic_string_char_copy_ctor(&this->name, &copy->name);
679 _Lockit_dtor(&lock);
680 return this;
683 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
684 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
685 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
687 return locale__Locimp_copy_ctor(this, copy);
690 /* ??1_Locimp@locale@std@@MAE@XZ */
691 /* ??1_Locimp@locale@std@@MEAA@XZ */
692 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
693 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
695 TRACE("(%p)\n", this);
697 if(locale_facet__Decref(&this->facet)) {
698 MSVCP_size_t i;
699 for(i=0; i<this->facet_cnt; i++)
700 if(this->facetvec[i] && locale_facet__Decref(this->facetvec[i]))
701 call_locale_facet_vector_dtor(this->facetvec[i], 0);
703 MSVCRT_operator_delete(this->facetvec);
704 MSVCP_basic_string_char_dtor(&this->name);
708 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
709 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
710 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
712 locale__Locimp_dtor(this);
715 DEFINE_THISCALL_WRAPPER(MSVCP_locale__Locimp_vector_dtor, 8)
716 locale__Locimp* __thiscall MSVCP_locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
718 TRACE("(%p %x)\n", this, flags);
719 if(flags & 2) {
720 /* we have an array, with the number of elements stored before the first object */
721 int i, *ptr = (int *)this-1;
723 for(i=*ptr-1; i>=0; i--)
724 locale__Locimp_dtor(this+i);
725 MSVCRT_operator_delete(ptr);
726 } else {
727 locale__Locimp_dtor(this);
728 if(flags & 1)
729 MSVCRT_operator_delete(this);
732 return this;
735 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
736 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
737 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, MSVCP_size_t id)
739 _Lockit lock;
741 TRACE("(%p %p %lu)\n", locimp, facet, id);
743 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
744 if(id >= locimp->facet_cnt) {
745 MSVCP_size_t new_size = id+1;
746 locale_facet **new_facetvec;
748 if(new_size < locale_id__Id_cnt+1)
749 new_size = locale_id__Id_cnt+1;
751 new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
752 if(!new_facetvec) {
753 _Lockit_dtor(&lock);
754 ERR("Out of memory\n");
755 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
756 return;
759 memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
760 memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
761 MSVCRT_operator_delete(locimp->facetvec);
762 locimp->facetvec = new_facetvec;
763 locimp->facet_cnt = new_size;
766 if(locimp->facetvec[id] && locale_facet__Decref(locimp->facetvec[id]))
767 call_locale_facet_vector_dtor(locimp->facetvec[id], 0);
769 locimp->facetvec[id] = facet;
770 if(facet)
771 locale_facet__Incref(facet);
772 _Lockit_dtor(&lock);
775 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
776 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
777 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
778 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, MSVCP_size_t id)
780 locale__Locimp__Locimp_Addfac(this, facet, id);
783 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
784 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
785 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
787 FIXME("stub\n");
788 return NULL;
791 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
792 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
793 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
795 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
796 return NULL;
799 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
800 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
801 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
803 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
806 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
807 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
808 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
810 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
813 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
814 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
815 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
817 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
820 /* ??_7_Locimp@locale@std@@6B@ */
821 const vtable_ptr MSVCP_locale__Locimp_vtable[] = {
822 (vtable_ptr)THISCALL_NAME(MSVCP_locale__Locimp_vector_dtor)
825 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
826 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
827 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
828 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
830 TRACE("(%p %p)\n", this, locimp);
831 /* Don't change locimp reference counter */
832 this->ptr = locimp;
833 return this;
836 /* ??0locale@std@@QAE@ABV01@0H@Z */
837 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
838 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
839 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
841 FIXME("(%p %p %p %d) stub\n", this, loc, other, cat);
842 return NULL;
845 /* ??0locale@std@@QAE@ABV01@@Z */
846 /* ??0locale@std@@QEAA@AEBV01@@Z */
847 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
848 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
850 TRACE("(%p %p)\n", this, copy);
851 this->ptr = copy->ptr;
852 locale_facet__Incref(&this->ptr->facet);
853 return this;
856 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
857 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
858 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
859 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
861 FIXME("(%p %p %s %d) stub\n", this, loc, locname, cat);
862 return NULL;
865 /* ??0locale@std@@QAE@PBDH@Z */
866 /* ??0locale@std@@QEAA@PEBDH@Z */
867 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
868 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
870 FIXME("(%p %s %d) stub\n", this, locname, cat);
871 return NULL;
874 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
875 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
876 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
877 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
879 TRACE("(%p)\n", this);
880 this->ptr = NULL;
881 return this;
884 /* ??0locale@std@@QAE@XZ */
885 /* ??0locale@std@@QEAA@XZ */
886 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
887 locale* __thiscall locale_ctor(locale *this)
889 TRACE("(%p)\n", this);
890 this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
891 if(!this->ptr) {
892 ERR("Out of memory\n");
893 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
894 return NULL;
897 locale__Locimp_ctor(this->ptr);
898 return this;
901 /* ??1locale@std@@QAE@XZ */
902 /* ??1locale@std@@QEAA@XZ */
903 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
904 void __thiscall locale_dtor(locale *this)
906 TRACE("(%p)\n", this);
907 if(this->ptr)
908 locale__Locimp_dtor(this->ptr);
911 DEFINE_THISCALL_WRAPPER(MSVCP_locale_vector_dtor, 8)
912 locale* __thiscall MSVCP_locale_vector_dtor(locale *this, unsigned int flags)
914 TRACE("(%p %x)\n", this, flags);
915 if(flags & 2) {
916 /* we have an array, with the number of elements stored before the first object */
917 int i, *ptr = (int *)this-1;
919 for(i=*ptr-1; i>=0; i--)
920 locale_dtor(this+i);
921 MSVCRT_operator_delete(ptr);
922 } else {
923 locale_dtor(this);
924 if(flags & 1)
925 MSVCRT_operator_delete(this);
928 return this;
931 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
932 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
933 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
934 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
936 FIXME("(%p %p) stub\n", this, loc);
937 return NULL;
940 /* ??8locale@std@@QBE_NABV01@@Z */
941 /* ??8locale@std@@QEBA_NAEBV01@@Z */
942 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
943 MSVCP_bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
945 FIXME("(%p %p) stub\n", this, loc);
946 return 0;
949 /* ??9locale@std@@QBE_NABV01@@Z */
950 /* ??9locale@std@@QEBA_NAEBV01@@Z */
951 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
952 MSVCP_bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
954 FIXME("(%p %p) stub\n", this, loc);
955 return 0;
958 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
959 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
960 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
961 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, MSVCP_size_t id, MSVCP_size_t catmask)
963 TRACE("(%p %p %lu %lu)\n", this, facet, id, catmask);
965 if(this->ptr->facet.refs > 1) {
966 locale__Locimp *new_ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
967 if(!new_ptr) {
968 ERR("Out of memory\n");
969 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
970 return NULL;
972 locale__Locimp_copy_ctor(new_ptr, this->ptr);
973 locale_facet__Decref(&this->ptr->facet);
974 this->ptr = new_ptr;
977 locale__Locimp__Addfac(this->ptr, facet, id);
979 if(catmask) {
980 MSVCP_basic_string_char_dtor(&this->ptr->name);
981 MSVCP_basic_string_char_ctor_cstr(&this->ptr->name, "*");
983 return this;
986 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
987 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
988 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
989 const locale_facet* __thiscall locale__Getfacet(const locale *this, MSVCP_size_t id)
991 FIXME("(%p %lu) stub\n", this, id);
992 return NULL;
995 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
996 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
997 locale__Locimp* __cdecl locale__Init(void)
999 FIXME("stub\n");
1000 return NULL;
1003 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
1004 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
1005 locale__Locimp* __cdecl locale__Getgloballocale(void)
1007 FIXME("stub\n");
1008 return NULL;
1011 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
1012 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
1013 void __cdecl locale__Setgloballocale(void *locimp)
1015 FIXME("(%p) stub\n", locimp);
1018 /* ?classic@locale@std@@SAABV12@XZ */
1019 /* ?classic@locale@std@@SAAEBV12@XZ */
1020 const locale* __cdecl locale_classic(void)
1022 FIXME("stub\n");
1023 return NULL;
1026 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1027 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1028 DEFINE_THISCALL_WRAPPER_RETPTR(locale_name, 4)
1029 basic_string_char __thiscall locale_name(const locale *this)
1031 TRACE( "(%p)\n", this);
1032 return this->ptr->name;
1035 /* ??0_Timevec@std@@QAE@ABV01@@Z */
1036 /* ??0_Timevec@std@@QEAA@AEBV01@@Z */
1037 /* This copy constructor modifies copied object */
1038 DEFINE_THISCALL_WRAPPER(_Timevec_copy_ctor, 8)
1039 _Timevec* __thiscall _Timevec_copy_ctor(_Timevec *this, _Timevec *copy)
1041 TRACE("(%p %p)\n", this, copy);
1042 this->timeptr = copy->timeptr;
1043 copy->timeptr = NULL;
1044 return this;
1047 /* ??0_Timevec@std@@QAE@PAX@Z */
1048 /* ??0_Timevec@std@@QEAA@PEAX@Z */
1049 DEFINE_THISCALL_WRAPPER(_Timevec_ctor_timeptr, 8)
1050 _Timevec* __thiscall _Timevec_ctor_timeptr(_Timevec *this, void *timeptr)
1052 TRACE("(%p %p)\n", this, timeptr);
1053 this->timeptr = timeptr;
1054 return this;
1057 /* ??_F_Timevec@std@@QAEXXZ */
1058 /* ??_F_Timevec@std@@QEAAXXZ */
1059 DEFINE_THISCALL_WRAPPER(_Timevec_ctor, 4)
1060 _Timevec* __thiscall _Timevec_ctor(_Timevec *this)
1062 TRACE("(%p)\n", this);
1063 this->timeptr = NULL;
1064 return this;
1067 /* ??1_Timevec@std@@QAE@XZ */
1068 /* ??1_Timevec@std@@QEAA@XZ */
1069 DEFINE_THISCALL_WRAPPER(_Timevec_dtor, 4)
1070 void __thiscall _Timevec_dtor(_Timevec *this)
1072 TRACE("(%p)\n", this);
1073 free(this->timeptr);
1076 /* ??4_Timevec@std@@QAEAAV01@ABV01@@Z */
1077 /* ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z */
1078 DEFINE_THISCALL_WRAPPER(_Timevec_op_assign, 8)
1079 _Timevec* __thiscall _Timevec_op_assign(_Timevec *this, _Timevec *right)
1081 TRACE("(%p %p)\n", this, right);
1082 this->timeptr = right->timeptr;
1083 right->timeptr = NULL;
1084 return this;
1087 /* ?_Getptr@_Timevec@std@@QBEPAXXZ */
1088 /* ?_Getptr@_Timevec@std@@QEBAPEAXXZ */
1089 DEFINE_THISCALL_WRAPPER(_Timevec__Getptr, 4)
1090 void* __thiscall _Timevec__Getptr(_Timevec *this)
1092 TRACE("(%p)\n", this);
1093 return this->timeptr;
1096 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z */
1097 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z */
1098 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
1100 const char *locale = NULL;
1102 /* This function is probably modifying more global objects */
1103 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
1105 if(!locstr)
1106 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
1108 _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
1109 MSVCP_basic_string_char_ctor_cstr(&locinfo->days, "");
1110 MSVCP_basic_string_char_ctor_cstr(&locinfo->months, "");
1111 MSVCP_basic_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
1113 if(category)
1114 locale = setlocale(LC_ALL, locstr);
1115 else
1116 locale = setlocale(LC_ALL, NULL);
1118 if(locale)
1119 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
1120 else
1121 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
1122 _Lockit_dtor(&locinfo->lock);
1124 return locinfo;
1127 /* ??0_Locinfo@std@@QAE@HPBD@Z */
1128 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
1129 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
1130 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
1132 return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
1135 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
1136 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
1137 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
1139 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
1142 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
1143 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
1144 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
1145 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
1147 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
1150 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
1151 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
1152 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
1154 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
1157 /* ??0_Locinfo@std@@QAE@PBD@Z */
1158 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
1159 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
1160 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
1162 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
1165 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
1166 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
1167 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
1169 TRACE("(%p)\n", locinfo);
1171 setlocale(LC_ALL, MSVCP_basic_string_char_c_str(&locinfo->oldlocname));
1172 MSVCP_basic_string_char_dtor(&locinfo->days);
1173 MSVCP_basic_string_char_dtor(&locinfo->months);
1174 MSVCP_basic_string_char_dtor(&locinfo->oldlocname);
1175 MSVCP_basic_string_char_dtor(&locinfo->newlocname);
1178 /* ??_F_Locinfo@std@@QAEXXZ */
1179 /* ??_F_Locinfo@std@@QEAAXXZ */
1180 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
1181 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
1183 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
1186 /* ??1_Locinfo@std@@QAE@XZ */
1187 /* ??1_Locinfo@std@@QEAA@XZ */
1188 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
1189 void __thiscall _Locinfo_dtor(_Locinfo *this)
1191 _Locinfo__Locinfo_dtor(this);
1194 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
1195 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
1196 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
1198 const char *locale = NULL;
1200 /* This function is probably modifying more global objects */
1201 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
1202 if(!locstr)
1203 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
1205 _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
1206 MSVCP_basic_string_char_dtor(&locinfo->newlocname);
1208 if(category)
1209 locale = setlocale(LC_ALL, locstr);
1210 else
1211 locale = setlocale(LC_ALL, NULL);
1213 if(locale)
1214 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
1215 else
1216 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
1217 _Lockit_dtor(&locinfo->lock);
1219 return locinfo;
1222 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
1223 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
1224 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
1225 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
1227 return _Locinfo__Locinfo_Addcats(this, category, locstr);
1230 /* _Getcoll */
1231 _Collvec __cdecl _Getcoll(void)
1233 _Collvec ret;
1234 _locale_t locale = _get_current_locale();
1236 TRACE("\n");
1238 ret.page = locale->locinfo->lc_collate_cp;
1239 ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
1240 _free_locale(locale);
1241 return ret;
1244 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
1245 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
1246 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 4)
1247 _Collvec __thiscall _Locinfo__Getcoll(const _Locinfo *this)
1249 return _Getcoll();
1252 /* _Getctype */
1253 _Ctypevec __cdecl _Getctype(void)
1255 _Ctypevec ret;
1256 _locale_t locale = _get_current_locale();
1258 TRACE("\n");
1260 ret.page = locale->locinfo->lc_codepage;
1261 ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
1262 ret.delfl = TRUE;
1263 ret.table = malloc(sizeof(short[256]));
1264 if(!ret.table) {
1265 _free_locale(locale);
1266 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1268 memcpy(ret.table, locale->locinfo->pctype, sizeof(short[256]));
1269 _free_locale(locale);
1270 return ret;
1273 /* ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ */
1274 /* ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ */
1275 DEFINE_THISCALL_WRAPPER_RETPTR(_Locinfo__Getctype, 4)
1276 _Ctypevec __thiscall _Locinfo__Getctype(const _Locinfo *this)
1278 return _Getctype();
1281 /* _Getcvt */
1282 _Cvtvec __cdecl _Getcvt(void)
1284 _Cvtvec ret;
1285 _locale_t locale = _get_current_locale();
1287 TRACE("\n");
1289 ret.page = locale->locinfo->lc_codepage;
1290 ret.handle = locale->locinfo->lc_handle[LC_CTYPE];
1291 _free_locale(locale);
1292 return ret;
1295 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
1296 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
1297 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 4)
1298 _Cvtvec __thiscall _Locinfo__Getcvt(const _Locinfo *this)
1300 return _Getcvt();
1303 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
1304 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
1305 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
1306 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
1308 FIXME("(%p) stub\n", this);
1309 return 0;
1312 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
1313 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
1314 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
1315 const char* __thiscall _Locinfo__Getdays(_Locinfo *this)
1317 char *days = _Getdays();
1319 TRACE("(%p)\n", this);
1321 if(days) {
1322 MSVCP_basic_string_char_dtor(&this->days);
1323 MSVCP_basic_string_char_ctor_cstr(&this->days, days);
1324 free(days);
1327 return this->days.size ? MSVCP_basic_string_char_c_str(&this->days) :
1328 ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
1331 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
1332 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
1333 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
1334 const char* __thiscall _Locinfo__Getmonths(_Locinfo *this)
1336 char *months = _Getmonths();
1338 TRACE("(%p)\n", this);
1340 if(months) {
1341 MSVCP_basic_string_char_dtor(&this->months);
1342 MSVCP_basic_string_char_ctor_cstr(&this->months, months);
1343 free(months);
1346 return this->months.size ? MSVCP_basic_string_char_c_str(&this->months) :
1347 ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
1348 ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
1351 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
1352 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
1353 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
1354 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
1356 TRACE("(%p)\n", this);
1357 return "false";
1360 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
1361 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
1362 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
1363 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
1365 TRACE("(%p)\n", this);
1366 return "true";
1369 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
1370 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
1371 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
1372 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
1374 TRACE("(%p)\n", this);
1375 return localeconv();
1378 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1379 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
1380 DEFINE_THISCALL_WRAPPER_RETPTR(_Locinfo__Getname, 4)
1381 basic_string_char __thiscall _Locinfo__Getname(const _Locinfo *this)
1383 basic_string_char ret;
1385 TRACE("(%p)\n", this);
1387 MSVCP_basic_string_char_copy_ctor(&ret, &this->newlocname);
1388 return ret;
1391 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
1392 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
1393 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 4)
1394 _Timevec __thiscall _Locinfo__Gettnames(const _Locinfo *this)
1396 _Timevec ret;
1398 TRACE("(%p)\n", this);
1400 _Timevec_ctor_timeptr(&ret, _Gettnames());
1401 return ret;
1404 static const type_info locale_facet_type_info = {
1405 MSVCP_locale_facet_vtable,
1406 NULL,
1407 ".?AVfacet@locale@std@@"
1410 static const rtti_base_descriptor locale_facet_rtti_base_descriptor = {
1411 &locale_facet_type_info,
1413 { 0, -1, 0},
1417 static const type_info collate_char_type_info = {
1418 &MSVCP_collate_char_vtable,
1419 NULL,
1420 ".?AV?$collate@D@std@@"
1423 static const rtti_base_descriptor collate_char_rtti_base_descriptor = {
1424 &collate_char_type_info,
1426 { 0, -1, 0},
1430 static const rtti_base_array collate_char_rtti_base_array = {
1432 &collate_char_rtti_base_descriptor,
1433 &locale_facet_rtti_base_descriptor,
1434 NULL,
1435 NULL
1439 static const rtti_object_hierarchy collate_char_hierarchy = {
1443 &collate_char_rtti_base_array
1446 const rtti_object_locator collate_char_rtti = {
1450 &collate_char_type_info,
1451 &collate_char_hierarchy
1454 static const type_info collate_wchar_type_info = {
1455 &MSVCP_collate_wchar_vtable,
1456 NULL,
1457 ".?AV?$collate@_W@std@@"
1460 static const rtti_base_descriptor collate_wchar_rtti_base_descriptor = {
1461 &collate_wchar_type_info,
1463 { 0, -1, 0},
1467 static const rtti_base_array collate_wchar_rtti_base_array = {
1469 &collate_wchar_rtti_base_descriptor,
1470 &locale_facet_rtti_base_descriptor,
1471 NULL,
1472 NULL
1476 static const rtti_object_hierarchy collate_wchar_hierarchy = {
1480 &collate_wchar_rtti_base_array
1483 const rtti_object_locator collate_wchar_rtti = {
1487 &collate_wchar_type_info,
1488 &collate_wchar_hierarchy
1491 static const type_info collate_short_type_info = {
1492 &MSVCP_collate_short_vtable,
1493 NULL,
1494 ".?AV?$collate@G@std@@"
1497 static const rtti_base_descriptor collate_short_rtti_base_descriptor = {
1498 &collate_short_type_info,
1500 { 0, -1, 0},
1504 static const rtti_base_array collate_short_rtti_base_array = {
1506 &collate_short_rtti_base_descriptor,
1507 &locale_facet_rtti_base_descriptor,
1508 NULL,
1509 NULL
1513 static const rtti_object_hierarchy collate_short_hierarchy = {
1517 &collate_short_rtti_base_array
1520 const rtti_object_locator collate_short_rtti = {
1524 &collate_short_type_info,
1525 &collate_short_hierarchy
1528 #ifndef __GNUC__
1529 void __asm_dummy_vtables(void) {
1530 #endif
1531 __ASM_VTABLE(collate_char,
1532 VTABLE_ADD_FUNC(collate_char_do_compare)
1533 VTABLE_ADD_FUNC(collate_char_do_transform)
1534 VTABLE_ADD_FUNC(collate_char_do_hash));
1535 __ASM_VTABLE(collate_wchar,
1536 VTABLE_ADD_FUNC(collate_wchar_do_compare)
1537 VTABLE_ADD_FUNC(collate_wchar_do_transform)
1538 VTABLE_ADD_FUNC(collate_wchar_do_hash));
1539 __ASM_VTABLE(collate_short,
1540 VTABLE_ADD_FUNC(collate_wchar_do_compare)
1541 VTABLE_ADD_FUNC(collate_wchar_do_transform)
1542 VTABLE_ADD_FUNC(collate_wchar_do_hash));
1543 #ifndef __GNUC__
1545 #endif