msvcp90: Added _Stoullx implementation.
[wine] / dlls / msvcp90 / locale.c
1 /*
2  * Copyright 2010 Piotr Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22
23 #include "msvcp90.h"
24 #include "locale.h"
25 #include "errno.h"
26 #include "limits.h"
27 #include "math.h"
28
29 #include "wine/list.h"
30
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winnls.h"
34 #include "wine/unicode.h"
35 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(msvcp90);
37
38 char* __cdecl _Getdays(void);
39 char* __cdecl _Getmonths(void);
40 void* __cdecl _Gettnames(void);
41 unsigned int __cdecl ___lc_codepage_func(void);
42 LCID* __cdecl ___lc_handle_func(void);
43 const locale_facet* __thiscall locale__Getfacet(const locale*, MSVCP_size_t);
44
45 typedef int category;
46
47 typedef struct {
48     MSVCP_size_t id;
49 } locale_id;
50
51 typedef struct _locale__Locimp {
52     locale_facet facet;
53     locale_facet **facetvec;
54     MSVCP_size_t facet_cnt;
55     category catmask;
56     MSVCP_bool transparent;
57     basic_string_char name;
58 } locale__Locimp;
59
60 typedef struct {
61     void *timeptr;
62 } _Timevec;
63
64 typedef struct {
65     _Lockit lock;
66     basic_string_char days;
67     basic_string_char months;
68     basic_string_char oldlocname;
69     basic_string_char newlocname;
70 } _Locinfo;
71
72 typedef struct {
73     LCID handle;
74     unsigned page;
75 } _Collvec;
76
77 typedef struct {
78     locale_facet facet;
79     _Collvec coll;
80 } collate;
81
82 typedef struct {
83     locale_facet facet;
84     const char *grouping;
85     char dp;
86     char sep;
87     const char *false_name;
88     const char *true_name;
89 } numpunct_char;
90
91 typedef struct {
92     locale_facet facet;
93     const char *grouping;
94     wchar_t dp;
95     wchar_t sep;
96     const wchar_t *false_name;
97     const wchar_t *true_name;
98 } numpunct_wchar;
99
100 typedef struct {
101     locale_facet facet;
102     _Cvtvec cvt;
103 } num_get;
104
105 struct _ios_base;
106 typedef struct _istreambuf_iterator_char
107 {
108     struct _basic_streambuf_char *strbuf;
109     MSVCP_bool      got;
110     char            val;
111 } istreambuf_iterator_char;
112
113 typedef struct _istreambuf_iterator_wchar
114 {
115     struct _basic_streambuf_wchar *strbuf;
116     MSVCP_bool      got;
117     wchar_t         val;
118 } istreambuf_iterator_wchar;
119
120 /* ?_Id_cnt@id@locale@std@@0HA */
121 int locale_id__Id_cnt = 0;
122
123 static locale__Locimp *global_locale;
124 static locale classic_locale;
125
126 /* ?_Clocptr@_Locimp@locale@std@@0PAV123@A */
127 /* ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA */
128 locale__Locimp *locale__Locimp__Clocptr = NULL;
129
130 /* ??1facet@locale@std@@UAE@XZ */
131 /* ??1facet@locale@std@@UEAA@XZ */
132 DEFINE_THISCALL_WRAPPER(locale_facet_dtor, 4)
133 void __thiscall locale_facet_dtor(locale_facet *this)
134 {
135     TRACE("(%p)\n", this);
136 }
137
138 DEFINE_THISCALL_WRAPPER(MSVCP_locale_facet_vector_dtor, 8)
139 #define call_locale_facet_vector_dtor(this, flags) CALL_VTBL_FUNC(this, 0, \
140         locale_facet*, (locale_facet*, unsigned int), (this, flags))
141 locale_facet* __thiscall MSVCP_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
142 {
143     TRACE("(%p %x)\n", this, flags);
144     if(flags & 2) {
145         /* we have an array, with the number of elements stored before the first object */
146         int i, *ptr = (int *)this-1;
147
148         for(i=*ptr-1; i>=0; i--)
149             locale_facet_dtor(this+i);
150         MSVCRT_operator_delete(ptr);
151     } else {
152         locale_facet_dtor(this);
153         if(flags & 1)
154             MSVCRT_operator_delete(this);
155     }
156
157     return this;
158 }
159
160 typedef struct
161 {
162     locale_facet *fac;
163     struct list entry;
164 } facets_elem;
165 static struct list lazy_facets = LIST_INIT(lazy_facets);
166
167 /* Not exported from msvcp90 */
168 /* ?facet_Register@facet@locale@std@@CAXPAV123@@Z */
169 /* ?facet_Register@facet@locale@std@@CAXPEAV123@@Z */
170 void __cdecl locale_facet_register(locale_facet *add)
171 {
172     facets_elem *head = MSVCRT_operator_new(sizeof(*head));
173     if(!head) {
174         ERR("Out of memory\n");
175         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
176     }
177
178     head->fac = add;
179     list_add_head(&lazy_facets, &head->entry);
180 }
181
182 /* Not exported from msvcp90 */
183 /* ??_7facet@locale@std@@6B@ */
184 extern const vtable_ptr MSVCP_locale_facet_vtable;
185
186 /* ??0id@locale@std@@QAE@I@Z */
187 /* ??0id@locale@std@@QEAA@_K@Z */
188 DEFINE_THISCALL_WRAPPER(locale_id_ctor_id, 8)
189 locale_id* __thiscall locale_id_ctor_id(locale_id *this, MSVCP_size_t id)
190 {
191     TRACE("(%p %lu)\n", this, id);
192
193     this->id = id;
194     return this;
195 }
196
197 /* ??_Fid@locale@std@@QAEXXZ */
198 /* ??_Fid@locale@std@@QEAAXXZ */
199 DEFINE_THISCALL_WRAPPER(locale_id_ctor, 4)
200 locale_id* __thiscall locale_id_ctor(locale_id *this)
201 {
202     TRACE("(%p)\n", this);
203
204     this->id = 0;
205     return this;
206 }
207
208 /* ??Bid@locale@std@@QAEIXZ */
209 /* ??Bid@locale@std@@QEAA_KXZ */
210 DEFINE_THISCALL_WRAPPER(locale_id_operator_size_t, 4)
211 MSVCP_size_t __thiscall locale_id_operator_size_t(locale_id *this)
212 {
213     _Lockit lock;
214
215     TRACE("(%p)\n", this);
216
217     if(!this->id) {
218         _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
219         this->id = ++locale_id__Id_cnt;
220         _Lockit_dtor(&lock);
221     }
222
223     return this->id;
224 }
225
226 /* ?_Id_cnt_func@id@locale@std@@CAAAHXZ */
227 /* ?_Id_cnt_func@id@locale@std@@CAAEAHXZ */
228 int* __cdecl locale_id__Id_cnt_func(void)
229 {
230     TRACE("\n");
231     return &locale_id__Id_cnt;
232 }
233
234 /* ??_Ffacet@locale@std@@QAEXXZ */
235 /* ??_Ffacet@locale@std@@QEAAXXZ */
236 DEFINE_THISCALL_WRAPPER(locale_facet_ctor, 4)
237 locale_facet* __thiscall locale_facet_ctor(locale_facet *this)
238 {
239     TRACE("(%p)\n", this);
240     this->vtable = &MSVCP_locale_facet_vtable;
241     this->refs = 0;
242     return this;
243 }
244
245 /* ??0facet@locale@std@@IAE@I@Z */
246 /* ??0facet@locale@std@@IEAA@_K@Z */
247 DEFINE_THISCALL_WRAPPER(locale_facet_ctor_refs, 8)
248 locale_facet* __thiscall locale_facet_ctor_refs(locale_facet *this, MSVCP_size_t refs)
249 {
250     TRACE("(%p %lu)\n", this, refs);
251     this->vtable = &MSVCP_locale_facet_vtable;
252     this->refs = refs;
253     return this;
254 }
255
256 /* ?_Incref@facet@locale@std@@QAEXXZ */
257 /* ?_Incref@facet@locale@std@@QEAAXXZ */
258 DEFINE_THISCALL_WRAPPER(locale_facet__Incref, 4)
259 void __thiscall locale_facet__Incref(locale_facet *this)
260 {
261     _Lockit lock;
262
263     TRACE("(%p)\n", this);
264
265     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
266     this->refs++;
267     _Lockit_dtor(&lock);
268 }
269
270 /* ?_Decref@facet@locale@std@@QAEPAV123@XZ */
271 /* ?_Decref@facet@locale@std@@QEAAPEAV123@XZ */
272 DEFINE_THISCALL_WRAPPER(locale_facet__Decref, 4)
273 locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
274 {
275     _Lockit lock;
276     locale_facet *ret;
277
278     TRACE("(%p)\n", this);
279
280     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
281     if(this->refs)
282         this->refs--;
283
284     ret = this->refs ? NULL : this;
285     _Lockit_dtor(&lock);
286
287     return ret;
288 }
289
290 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z */
291 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z */
292 MSVCP_size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const locale *loc)
293 {
294     TRACE("(%p %p)\n", facet, loc);
295     return -1;
296 }
297
298 /* ??0_Timevec@std@@QAE@ABV01@@Z */
299 /* ??0_Timevec@std@@QEAA@AEBV01@@Z */
300 /* This copy constructor modifies copied object */
301 DEFINE_THISCALL_WRAPPER(_Timevec_copy_ctor, 8)
302 _Timevec* __thiscall _Timevec_copy_ctor(_Timevec *this, _Timevec *copy)
303 {
304     TRACE("(%p %p)\n", this, copy);
305     this->timeptr = copy->timeptr;
306     copy->timeptr = NULL;
307     return this;
308 }
309
310 /* ??0_Timevec@std@@QAE@PAX@Z */
311 /* ??0_Timevec@std@@QEAA@PEAX@Z */
312 DEFINE_THISCALL_WRAPPER(_Timevec_ctor_timeptr, 8)
313 _Timevec* __thiscall _Timevec_ctor_timeptr(_Timevec *this, void *timeptr)
314 {
315     TRACE("(%p %p)\n", this, timeptr);
316     this->timeptr = timeptr;
317     return this;
318 }
319
320 /* ??_F_Timevec@std@@QAEXXZ */
321 /* ??_F_Timevec@std@@QEAAXXZ */
322 DEFINE_THISCALL_WRAPPER(_Timevec_ctor, 4)
323 _Timevec* __thiscall _Timevec_ctor(_Timevec *this)
324 {
325     TRACE("(%p)\n", this);
326     this->timeptr = NULL;
327     return this;
328 }
329
330 /* ??1_Timevec@std@@QAE@XZ */
331 /* ??1_Timevec@std@@QEAA@XZ */
332 DEFINE_THISCALL_WRAPPER(_Timevec_dtor, 4)
333 void __thiscall _Timevec_dtor(_Timevec *this)
334 {
335     TRACE("(%p)\n", this);
336     free(this->timeptr);
337 }
338
339 /* ??4_Timevec@std@@QAEAAV01@ABV01@@Z */
340 /* ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z */
341 DEFINE_THISCALL_WRAPPER(_Timevec_op_assign, 8)
342 _Timevec* __thiscall _Timevec_op_assign(_Timevec *this, _Timevec *right)
343 {
344     TRACE("(%p %p)\n", this, right);
345     this->timeptr = right->timeptr;
346     right->timeptr = NULL;
347     return this;
348 }
349
350 /* ?_Getptr@_Timevec@std@@QBEPAXXZ */
351 /* ?_Getptr@_Timevec@std@@QEBAPEAXXZ */
352 DEFINE_THISCALL_WRAPPER(_Timevec__Getptr, 4)
353 void* __thiscall _Timevec__Getptr(_Timevec *this)
354 {
355     TRACE("(%p)\n", this);
356     return this->timeptr;
357 }
358
359 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z */
360 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z */
361 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
362 {
363     const char *locale = NULL;
364
365     /* This function is probably modifying more global objects */
366     FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
367
368     if(!locstr)
369         throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
370
371     _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
372     MSVCP_basic_string_char_ctor_cstr(&locinfo->days, "");
373     MSVCP_basic_string_char_ctor_cstr(&locinfo->months, "");
374     MSVCP_basic_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
375
376     if(category)
377         locale = setlocale(LC_ALL, locstr);
378     else
379         locale = setlocale(LC_ALL, NULL);
380
381     if(locale)
382         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
383     else
384         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
385
386     return locinfo;
387 }
388
389 /* ??0_Locinfo@std@@QAE@HPBD@Z */
390 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
391 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
392 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
393 {
394     return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
395 }
396
397 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
398 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
399 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
400 {
401     return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
402 }
403
404 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
405 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
406 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
407 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
408 {
409     return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
410 }
411
412 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
413 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
414 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
415 {
416     return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
417 }
418
419 /* ??0_Locinfo@std@@QAE@PBD@Z */
420 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
421 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
422 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
423 {
424     return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
425 }
426
427 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
428 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
429 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
430 {
431     TRACE("(%p)\n", locinfo);
432
433     setlocale(LC_ALL, MSVCP_basic_string_char_c_str(&locinfo->oldlocname));
434     MSVCP_basic_string_char_dtor(&locinfo->days);
435     MSVCP_basic_string_char_dtor(&locinfo->months);
436     MSVCP_basic_string_char_dtor(&locinfo->oldlocname);
437     MSVCP_basic_string_char_dtor(&locinfo->newlocname);
438     _Lockit_dtor(&locinfo->lock);
439 }
440
441 /* ??_F_Locinfo@std@@QAEXXZ */
442 /* ??_F_Locinfo@std@@QEAAXXZ */
443 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
444 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
445 {
446     return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
447 }
448
449 /* ??1_Locinfo@std@@QAE@XZ */
450 /* ??1_Locinfo@std@@QEAA@XZ */
451 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
452 void __thiscall _Locinfo_dtor(_Locinfo *this)
453 {
454     _Locinfo__Locinfo_dtor(this);
455 }
456
457 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
458 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
459 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
460 {
461     const char *locale = NULL;
462
463     /* This function is probably modifying more global objects */
464     FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
465     if(!locstr)
466         throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
467
468     MSVCP_basic_string_char_dtor(&locinfo->newlocname);
469
470     if(category)
471         locale = setlocale(LC_ALL, locstr);
472     else
473         locale = setlocale(LC_ALL, NULL);
474
475     if(locale)
476         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
477     else
478         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
479
480     return locinfo;
481 }
482
483 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
484 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
485 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
486 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
487 {
488     return _Locinfo__Locinfo_Addcats(this, category, locstr);
489 }
490
491 /* _Getcoll */
492 _Collvec __cdecl _Getcoll(void)
493 {
494     _Collvec ret;
495     _locale_t locale = _get_current_locale();
496
497     TRACE("\n");
498
499     ret.page = locale->locinfo->lc_collate_cp;
500     ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
501     _free_locale(locale);
502     return ret;
503 }
504
505 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
506 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
507 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
508 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
509 {
510     *ret = _Getcoll();
511     return ret;
512 }
513
514 /* _Getctype */
515 _Ctypevec __cdecl _Getctype(void)
516 {
517     _Ctypevec ret;
518     _locale_t locale = _get_current_locale();
519     short *table;
520
521     TRACE("\n");
522
523     ret.page = locale->locinfo->lc_codepage;
524     ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
525     ret.delfl = TRUE;
526     table = malloc(sizeof(short[256]));
527     if(!table) {
528         _free_locale(locale);
529         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
530     }
531     memcpy(table, locale->locinfo->pctype, sizeof(short[256]));
532     ret.table = table;
533     _free_locale(locale);
534     return ret;
535 }
536
537 /* ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ */
538 /* ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ */
539 DEFINE_THISCALL_WRAPPER(_Locinfo__Getctype, 8)
540 _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
541 {
542     *ret = _Getctype();
543     return ret;
544 }
545
546 /* _Getcvt */
547 _Cvtvec __cdecl _Getcvt(void)
548 {
549     _Cvtvec ret;
550     _locale_t locale = _get_current_locale();
551
552     TRACE("\n");
553
554     ret.page = locale->locinfo->lc_codepage;
555     ret.handle = locale->locinfo->lc_handle[LC_CTYPE];
556     _free_locale(locale);
557     return ret;
558 }
559
560 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
561 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
562 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
563 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
564 {
565     *ret = _Getcvt();
566     return ret;
567 }
568
569 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
570 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
571 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
572 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
573 {
574     FIXME("(%p) stub\n", this);
575     return 0;
576 }
577
578 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
579 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
580 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
581 const char* __thiscall _Locinfo__Getdays(_Locinfo *this)
582 {
583     char *days = _Getdays();
584
585     TRACE("(%p)\n", this);
586
587     if(days) {
588         MSVCP_basic_string_char_dtor(&this->days);
589         MSVCP_basic_string_char_ctor_cstr(&this->days, days);
590         free(days);
591     }
592
593     return this->days.size ? MSVCP_basic_string_char_c_str(&this->days) :
594         ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
595 }
596
597 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
598 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
599 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
600 const char* __thiscall _Locinfo__Getmonths(_Locinfo *this)
601 {
602     char *months = _Getmonths();
603
604     TRACE("(%p)\n", this);
605
606     if(months) {
607         MSVCP_basic_string_char_dtor(&this->months);
608         MSVCP_basic_string_char_ctor_cstr(&this->months, months);
609         free(months);
610     }
611
612     return this->months.size ? MSVCP_basic_string_char_c_str(&this->months) :
613         ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
614         ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
615 }
616
617 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
618 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
619 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
620 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
621 {
622     TRACE("(%p)\n", this);
623     return "false";
624 }
625
626 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
627 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
628 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
629 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
630 {
631     TRACE("(%p)\n", this);
632     return "true";
633 }
634
635 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
636 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
637 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
638 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
639 {
640     TRACE("(%p)\n", this);
641     return localeconv();
642 }
643
644 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
645 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
646 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
647 basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
648 {
649     TRACE("(%p)\n", this);
650
651     MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
652     return ret;
653 }
654
655 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
656 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
657 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
658 _Timevec*__thiscall _Locinfo__Gettnames(const _Locinfo *this, _Timevec *ret)
659 {
660     TRACE("(%p)\n", this);
661
662     _Timevec_ctor_timeptr(ret, _Gettnames());
663     return ret;
664 }
665
666 /* ?id@?$collate@D@std@@2V0locale@2@A */
667 locale_id collate_char_id = {0};
668
669 /* ??_7?$collate@D@std@@6B@ */
670 extern const vtable_ptr MSVCP_collate_char_vtable;
671
672 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
673 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
674 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
675 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
676 {
677     TRACE("(%p %p)\n", this, locinfo);
678     _Locinfo__Getcoll(locinfo, &this->coll);
679 }
680
681 /* ??0?$collate@D@std@@IAE@PBDI@Z */
682 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
683 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
684 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
685 {
686     _Locinfo locinfo;
687
688     TRACE("(%p %s %lu)\n", this, name, refs);
689
690     locale_facet_ctor_refs(&this->facet, refs);
691     this->facet.vtable = &MSVCP_collate_char_vtable;
692
693     _Locinfo_ctor_cstr(&locinfo, name);
694     collate_char__Init(this, &locinfo);
695     _Locinfo_dtor(&locinfo);
696     return this;
697 }
698
699 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
700 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
701 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
702 collate* __thiscall collate_char_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
703 {
704     TRACE("(%p %p %lu)\n", this, locinfo, refs);
705
706     locale_facet_ctor_refs(&this->facet, refs);
707     this->facet.vtable = &MSVCP_collate_char_vtable;
708     collate_char__Init(this, locinfo);
709     return this;
710 }
711
712 /* ??0?$collate@D@std@@QAE@I@Z */
713 /* ??0?$collate@D@std@@QEAA@_K@Z */
714 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
715 collate* __thiscall collate_char_ctor_refs(collate *this, MSVCP_size_t refs)
716 {
717     return collate_char_ctor_name(this, "C", refs);
718 }
719
720 /* ??1?$collate@D@std@@MAE@XZ */
721 /* ??1?$collate@D@std@@MEAA@XZ */
722 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
723 void __thiscall collate_char_dtor(collate *this)
724 {
725     TRACE("(%p)\n", this);
726 }
727
728 DEFINE_THISCALL_WRAPPER(MSVCP_collate_char_vector_dtor, 8)
729 collate* __thiscall MSVCP_collate_char_vector_dtor(collate *this, unsigned int flags)
730 {
731     TRACE("(%p %x)\n", this, flags);
732     if(flags & 2) {
733         /* we have an array, with the number of elements stored before the first object */
734         int i, *ptr = (int *)this-1;
735
736         for(i=*ptr-1; i>=0; i--)
737             collate_char_dtor(this+i);
738         MSVCRT_operator_delete(ptr);
739     } else {
740         collate_char_dtor(this);
741         if(flags & 1)
742             MSVCRT_operator_delete(this);
743     }
744
745     return this;
746 }
747
748 /* ??_F?$collate@D@std@@QAEXXZ */
749 /* ??_F?$collate@D@std@@QEAAXXZ */
750 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
751 collate* __thiscall collate_char_ctor(collate *this)
752 {
753     return collate_char_ctor_name(this, "C", 0);
754 }
755
756 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
757 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
758 MSVCP_size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale *loc)
759 {
760     TRACE("(%p %p)\n", facet, loc);
761
762     if(facet && !*facet) {
763         *facet = MSVCRT_operator_new(sizeof(collate));
764         if(!*facet) {
765             ERR("Out of memory\n");
766             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
767             return 0;
768         }
769         collate_char_ctor_name((collate*)*facet,
770                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0);
771     }
772
773     return LC_COLLATE;
774 }
775
776 /* _Strcoll */
777 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
778         const char *last2, const _Collvec *coll)
779 {
780     LCID lcid;
781
782     TRACE("(%s %s)\n", debugstr_an(first1, last1-first1), debugstr_an(first2, last2-first2));
783
784     if(coll)
785         lcid = coll->handle;
786     else
787         lcid = ___lc_handle_func()[LC_COLLATE];
788     return CompareStringA(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
789 }
790
791 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
792 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
793 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
794 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
795         (const collate*, const char*, const char*, const char*, const char*), \
796         (this, first1, last1, first2, last2))
797 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
798         const char *last1, const char *first2, const char *last2)
799 {
800     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
801     return _Strcoll(first1, last1, first2, last2, &this->coll);
802 }
803
804 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
805 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
806 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
807 int __thiscall collate_char_compare(const collate *this, const char *first1,
808         const char *last1, const char *first2, const char *last2)
809 {
810     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
811     return call_collate_char_do_compare(this, first1, last1, first2, last2);
812 }
813
814 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
815 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
816 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
817 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
818         (const collate*, const char*, const char*), (this, first, last))
819 LONG __thiscall collate_char_do_hash(const collate *this,
820         const char *first, const char *last)
821 {
822     ULONG ret = 0;
823
824     TRACE("(%p %p %p)\n", this, first, last);
825
826     for(; first<last; first++)
827         ret = (ret<<8 | ret>>24) + *first;
828     return ret;
829 }
830
831 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
832 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
833 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
834 LONG __thiscall collate_char_hash(const collate *this,
835         const char *first, const char *last)
836 {
837     TRACE("(%p %p %p)\n", this, first, last);
838     return call_collate_char_do_hash(this, first, last);
839 }
840
841 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
842 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
843 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
844 basic_string_char* __thiscall collate_char_do_transform(const collate *this,
845         basic_string_char *ret, const char *first, const char *last)
846 {
847     FIXME("(%p %p %p) stub\n", this, first, last);
848     return ret;
849 }
850
851 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
852 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
853 DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
854 basic_string_char* __thiscall collate_char_transform(const collate *this,
855         basic_string_char *ret, const char *first, const char *last)
856 {
857     FIXME("(%p %p %p) stub\n", this, first, last);
858     return ret;
859 }
860
861 /* ?id@?$collate@_W@std@@2V0locale@2@A */
862 locale_id collate_wchar_id = {0};
863 /* ?id@?$collate@G@std@@2V0locale@2@A */
864 locale_id collate_short_id = {0};
865
866 /* ??_7?$collate@_W@std@@6B@ */
867 extern const vtable_ptr MSVCP_collate_wchar_vtable;
868 /* ??_7?$collate@G@std@@6B@ */
869 extern const vtable_ptr MSVCP_collate_short_vtable;
870
871 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
872 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
873 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
874 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
875 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
876 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
877 {
878     TRACE("(%p %p)\n", this, locinfo);
879     _Locinfo__Getcoll(locinfo, &this->coll);
880 }
881
882 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
883 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
884 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
885 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
886 {
887     _Locinfo locinfo;
888
889     TRACE("(%p %s %lu)\n", this, name, refs);
890
891     locale_facet_ctor_refs(&this->facet, refs);
892     this->facet.vtable = &MSVCP_collate_wchar_vtable;
893
894     _Locinfo_ctor_cstr(&locinfo, name);
895     collate_wchar__Init(this, &locinfo);
896     _Locinfo_dtor(&locinfo);
897     return this;
898 }
899
900 /* ??0?$collate@G@std@@IAE@PBDI@Z */
901 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
902 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
903 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
904 {
905     collate *ret = collate_wchar_ctor_name(this, name, refs);
906     ret->facet.vtable = &MSVCP_collate_short_vtable;
907     return ret;
908 }
909
910 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
911 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
912 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
913 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
914 {
915     TRACE("(%p %p %lu)\n", this, locinfo, refs);
916
917     locale_facet_ctor_refs(&this->facet, refs);
918     this->facet.vtable = &MSVCP_collate_wchar_vtable;
919     collate_wchar__Init(this, locinfo);
920     return this;
921 }
922
923 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
924 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
925 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
926 collate* __thiscall collate_short_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
927 {
928     collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
929     ret->facet.vtable = &MSVCP_collate_short_vtable;
930     return ret;
931 }
932
933 /* ??0?$collate@_W@std@@QAE@I@Z */
934 /* ??0?$collate@_W@std@@QEAA@_K@Z */
935 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
936 collate* __thiscall collate_wchar_ctor_refs(collate *this, MSVCP_size_t refs)
937 {
938     return collate_wchar_ctor_name(this, "C", refs);
939 }
940
941 /* ??0?$collate@G@std@@QAE@I@Z */
942 /* ??0?$collate@G@std@@QEAA@_K@Z */
943 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
944 collate* __thiscall collate_short_ctor_refs(collate *this, MSVCP_size_t refs)
945 {
946     collate *ret = collate_wchar_ctor_refs(this, refs);
947     ret->facet.vtable = &MSVCP_collate_short_vtable;
948     return ret;
949 }
950
951 /* ??1?$collate@_W@std@@MAE@XZ */
952 /* ??1?$collate@_W@std@@MEAA@XZ */
953 /* ??1?$collate@G@std@@MAE@XZ */
954 /* ??1?$collate@G@std@@MEAA@XZ */
955 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
956 void __thiscall collate_wchar_dtor(collate *this)
957 {
958     TRACE("(%p)\n", this);
959 }
960
961 DEFINE_THISCALL_WRAPPER(MSVCP_collate_wchar_vector_dtor, 8)
962 collate* __thiscall MSVCP_collate_wchar_vector_dtor(collate *this, unsigned int flags)
963 {
964     TRACE("(%p %x)\n", this, flags);
965     if(flags & 2) {
966         /* we have an array, with the number of elements stored before the first object */
967         int i, *ptr = (int *)this-1;
968
969         for(i=*ptr-1; i>=0; i--)
970             collate_wchar_dtor(this+i);
971         MSVCRT_operator_delete(ptr);
972     } else {
973         collate_wchar_dtor(this);
974         if(flags & 1)
975             MSVCRT_operator_delete(this);
976     }
977
978     return this;
979 }
980
981 DEFINE_THISCALL_WRAPPER(MSVCP_collate_short_vector_dtor, 8)
982 collate* __thiscall MSVCP_collate_short_vector_dtor(collate *this, unsigned int flags)
983 {
984     return MSVCP_collate_wchar_vector_dtor(this, flags);
985 }
986
987 /* ??_F?$collate@_W@std@@QAEXXZ */
988 /* ??_F?$collate@_W@std@@QEAAXXZ */
989 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
990 collate* __thiscall collate_wchar_ctor(collate *this)
991 {
992     return collate_wchar_ctor_name(this, "C", 0);
993 }
994
995 /* ??_F?$collate@G@std@@QAEXXZ */
996 /* ??_F?$collate@G@std@@QEAAXXZ */
997 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
998 collate* __thiscall collate_short_ctor(collate *this)
999 {
1000     collate *ret = collate_wchar_ctor(this);
1001     ret->facet.vtable = &MSVCP_collate_short_vtable;
1002     return ret;
1003 }
1004
1005 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1006 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1007 MSVCP_size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale *loc)
1008 {
1009     TRACE("(%p %p)\n", facet, loc);
1010
1011     if(facet && !*facet) {
1012         *facet = MSVCRT_operator_new(sizeof(collate));
1013         if(!*facet) {
1014             ERR("Out of memory\n");
1015             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1016             return 0;
1017         }
1018         collate_wchar_ctor_name((collate*)*facet,
1019                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0);
1020     }
1021
1022     return LC_COLLATE;
1023 }
1024
1025 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1026 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1027 MSVCP_size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
1028 {
1029     if(facet && !*facet) {
1030         collate_wchar__Getcat(facet, loc);
1031         (*(locale_facet**)facet)->vtable = &MSVCP_collate_short_vtable;
1032     }
1033
1034     return LC_COLLATE;
1035 }
1036
1037 /* _Wcscoll */
1038 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
1039         const wchar_t *last2, const _Collvec *coll)
1040 {
1041     LCID lcid;
1042
1043     TRACE("(%s %s)\n", debugstr_wn(first1, last1-first1), debugstr_wn(first2, last2-first2));
1044
1045     if(coll)
1046         lcid = coll->handle;
1047     else
1048         lcid = ___lc_handle_func()[LC_COLLATE];
1049     return CompareStringW(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1050 }
1051
1052 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
1053 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
1054 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
1055 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
1056 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
1057 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1058         (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1059         (this, first1, last1, first2, last2))
1060 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
1061         const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1062 {
1063     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1064     return _Wcscoll(first1, last1, first2, last2, &this->coll);
1065 }
1066
1067 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
1068 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
1069 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
1070 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
1071 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
1072 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
1073         const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1074 {
1075     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1076     return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
1077 }
1078
1079 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
1080 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
1081 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
1082 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
1083 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
1084 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1085         (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1086 LONG __thiscall collate_wchar_do_hash(const collate *this,
1087         const wchar_t *first, const wchar_t *last)
1088 {
1089     ULONG ret = 0;
1090
1091     TRACE("(%p %p %p)\n", this, first, last);
1092
1093     for(; first<last; first++)
1094         ret = (ret<<8 | ret>>24) + *first;
1095     return ret;
1096 }
1097
1098 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
1099 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
1100 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
1101 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
1102 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
1103 LONG __thiscall collate_wchar_hash(const collate *this,
1104         const wchar_t *first, const wchar_t *last)
1105 {
1106     TRACE("(%p %p %p)\n", this, first, last);
1107     return call_collate_wchar_do_hash(this, first, last);
1108 }
1109
1110 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1111 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1112 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1113 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1114 DEFINE_THISCALL_WRAPPER(collate_wchar_do_transform, 16)
1115 basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
1116         basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1117 {
1118     FIXME("(%p %p %p) stub\n", this, first, last);
1119     return ret;
1120 }
1121
1122 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1123 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1124 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1125 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1126 DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
1127 basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
1128         basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1129 {
1130     FIXME("(%p %p %p) stub\n", this, first, last);
1131     return ret;
1132 }
1133
1134 /* ??_7ctype_base@std@@6B@ */
1135 extern const vtable_ptr MSVCP_ctype_base_vtable;
1136
1137 /* ??0ctype_base@std@@QAE@I@Z */
1138 /* ??0ctype_base@std@@QEAA@_K@Z */
1139 DEFINE_THISCALL_WRAPPER(ctype_base_ctor_refs, 8)
1140 ctype_base* __thiscall ctype_base_ctor_refs(ctype_base *this, MSVCP_size_t refs)
1141 {
1142     TRACE("(%p %lu)\n", this, refs);
1143     locale_facet_ctor_refs(&this->facet, refs);
1144     this->facet.vtable = &MSVCP_ctype_base_vtable;
1145     return this;
1146 }
1147
1148 /* ??_Fctype_base@std@@QAEXXZ */
1149 /* ??_Fctype_base@std@@QEAAXXZ */
1150 DEFINE_THISCALL_WRAPPER(ctype_base_ctor, 4)
1151 ctype_base* __thiscall ctype_base_ctor(ctype_base *this)
1152 {
1153     TRACE("(%p)\n", this);
1154     locale_facet_ctor_refs(&this->facet, 0);
1155     this->facet.vtable = &MSVCP_ctype_base_vtable;
1156     return this;
1157 }
1158
1159 /* ??1ctype_base@std@@UAE@XZ */
1160 /* ??1ctype_base@std@@UEAA@XZ */
1161 DEFINE_THISCALL_WRAPPER(ctype_base_dtor, 4)
1162 void __thiscall ctype_base_dtor(ctype_base *this)
1163 {
1164     TRACE("(%p)\n", this);
1165 }
1166
1167 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_base_vector_dtor, 8)
1168 ctype_base* __thiscall MSVCP_ctype_base_vector_dtor(ctype_base *this, unsigned int flags)
1169 {
1170     TRACE("(%p %x)\n", this, flags);
1171     if(flags & 2) {
1172         /* we have an array, with the number of elements stored before the first object */
1173         int i, *ptr = (int *)this-1;
1174
1175         for(i=*ptr-1; i>=0; i--)
1176             ctype_base_dtor(this+i);
1177         MSVCRT_operator_delete(ptr);
1178     } else {
1179         ctype_base_dtor(this);
1180         if(flags & 1)
1181             MSVCRT_operator_delete(this);
1182     }
1183
1184     return this;
1185 }
1186
1187 /* ?_Xran@ctype_base@std@@KAXXZ */
1188 void __cdecl ctype_base__Xran(void)
1189 {
1190     throw_exception(EXCEPTION_OUT_OF_RANGE, "out of range in ctype<T>");
1191 }
1192
1193 /* ?id@?$ctype@D@std@@2V0locale@2@A */
1194 locale_id ctype_char_id = {0};
1195 /* ?table_size@?$ctype@D@std@@2IB */
1196 /* ?table_size@?$ctype@D@std@@2_KB */
1197 MSVCP_size_t ctype_char_table_size = 256;
1198
1199 /* ??_7?$ctype@D@std@@6B@ */
1200 extern const vtable_ptr MSVCP_ctype_char_vtable;
1201
1202 /* ?_Id_func@?$ctype@D@std@@SAAAVid@locale@2@XZ */
1203 /* ?_Id_func@?$ctype@D@std@@SAAEAVid@locale@2@XZ */
1204 locale_id* __cdecl ctype_char__Id_func(void)
1205 {
1206     TRACE("()\n");
1207     return &ctype_char_id;
1208 }
1209
1210 /* ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z */
1211 /* ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z */
1212 DEFINE_THISCALL_WRAPPER(ctype_char__Init, 8)
1213 void __thiscall ctype_char__Init(ctype_char *this, _Locinfo *locinfo)
1214 {
1215     TRACE("(%p %p)\n", this, locinfo);
1216     _Locinfo__Getctype(locinfo, &this->ctype);
1217 }
1218
1219 /* ?_Tidy@?$ctype@D@std@@IAEXXZ */
1220 /* ?_Tidy@?$ctype@D@std@@IEAAXXZ */
1221 DEFINE_THISCALL_WRAPPER(ctype_char__Tidy, 4)
1222 void __thiscall ctype_char__Tidy(ctype_char *this)
1223 {
1224     TRACE("(%p)\n", this);
1225
1226     if(this->ctype.delfl)
1227         free((short*)this->ctype.table);
1228 }
1229
1230 /* ?classic_table@?$ctype@D@std@@KAPBFXZ */
1231 /* ?classic_table@?$ctype@D@std@@KAPEBFXZ */
1232 const short* __cdecl ctype_char_classic_table(void)
1233 {
1234     TRACE("()\n");
1235     return &((short*)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "_ctype"))[1];
1236 }
1237
1238 /* ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z */
1239 /* ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1240 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_locinfo, 12)
1241 ctype_char* __thiscall ctype_char_ctor_locinfo(ctype_char *this,
1242         _Locinfo *locinfo, MSVCP_size_t refs)
1243 {
1244     TRACE("(%p %p %lu)\n", this, locinfo, refs);
1245     ctype_base_ctor_refs(&this->base, refs);
1246     this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1247     ctype_char__Init(this, locinfo);
1248     return this;
1249 }
1250
1251 /* ??0?$ctype@D@std@@QAE@PBF_NI@Z */
1252 /* ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z */
1253 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_table, 16)
1254 ctype_char* __thiscall ctype_char_ctor_table(ctype_char *this,
1255         const short *table, MSVCP_bool delete, MSVCP_size_t refs)
1256 {
1257     _Locinfo locinfo;
1258
1259     TRACE("(%p %p %d %lu)\n", this, table, delete, refs);
1260
1261     ctype_base_ctor_refs(&this->base, refs);
1262     this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1263
1264     _Locinfo_ctor(&locinfo);
1265     ctype_char__Init(this, &locinfo);
1266     _Locinfo_dtor(&locinfo);
1267
1268     if(table) {
1269         ctype_char__Tidy(this);
1270         this->ctype.table = table;
1271         this->ctype.delfl = delete;
1272     }
1273     return this;
1274 }
1275
1276 /* ??_F?$ctype@D@std@@QAEXXZ */
1277 /* ??_F?$ctype@D@std@@QEAAXXZ */
1278 DEFINE_THISCALL_WRAPPER(ctype_char_ctor, 4)
1279 ctype_char* __thiscall ctype_char_ctor(ctype_char *this)
1280 {
1281     return ctype_char_ctor_table(this, NULL, FALSE, 0);
1282 }
1283
1284 /* ??1?$ctype@D@std@@MAE@XZ */
1285 /* ??1?$ctype@D@std@@MEAA@XZ */
1286 DEFINE_THISCALL_WRAPPER(ctype_char_dtor, 4)
1287 void __thiscall ctype_char_dtor(ctype_char *this)
1288 {
1289     TRACE("(%p)\n", this);
1290     ctype_char__Tidy(this);
1291 }
1292
1293 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_char_vector_dtor, 8)
1294 ctype_char* __thiscall MSVCP_ctype_char_vector_dtor(ctype_char *this, unsigned int flags)
1295 {
1296     TRACE("(%p %x)\n", this, flags);
1297     if(flags & 2) {
1298         /* we have an array, with the number of elements stored before the first object */
1299         int i, *ptr = (int *)this-1;
1300
1301         for(i=*ptr-1; i>=0; i--)
1302             ctype_char_dtor(this+i);
1303         MSVCRT_operator_delete(ptr);
1304     } else {
1305         ctype_char_dtor(this);
1306         if(flags & 1)
1307             MSVCRT_operator_delete(this);
1308     }
1309
1310     return this;
1311 }
1312
1313 /* ?do_narrow@?$ctype@D@std@@MBEDDD@Z */
1314 /* ?do_narrow@?$ctype@D@std@@MEBADDD@Z */
1315 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow_ch, 12)
1316 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 36, \
1317         char, (const ctype_char*, char, char), (this, ch, unused))
1318 char __thiscall ctype_char_do_narrow_ch(const ctype_char *this, char ch, char unused)
1319 {
1320     TRACE("(%p %c %c)\n", this, ch, unused);
1321     return ch;
1322 }
1323
1324 /* ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z */
1325 /* ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z */
1326 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow, 20)
1327 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 32, \
1328         const char*, (const ctype_char*, const char*, const char*, char, char*), \
1329         (this, first, last, unused, dest))
1330 const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
1331         const char *first, const char *last, char unused, char *dest)
1332 {
1333     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1334     memcpy(dest, first, last-first);
1335     return last;
1336 }
1337
1338 /* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
1339 /* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
1340 DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
1341 #define call_ctype_char__Do_narrow_s(this, first, last, unused, dest, size) CALL_VTBL_FUNC(this, 40, \
1342         const char*, (const ctype_char*, const char*, const char*, char, char*, MSVCP_size_t), \
1343         (this, first, last, unused, dest, size))
1344 const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
1345         const char *last, char unused, char *dest, MSVCP_size_t size)
1346 {
1347     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1348     memcpy_s(dest, size, first, last-first);
1349     return last;
1350 }
1351
1352 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
1353 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
1354 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
1355 char __thiscall ctype_char_narrow_ch(const ctype_char *this, char ch, char dflt)
1356 {
1357     TRACE("(%p %c %c)\n", this, ch, dflt);
1358     return call_ctype_char_do_narrow_ch(this, ch, dflt);
1359 }
1360
1361 /* ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z */
1362 /* ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z */
1363 DEFINE_THISCALL_WRAPPER(ctype_char_narrow, 20)
1364 const char* __thiscall ctype_char_narrow(const ctype_char *this,
1365         const char *first, const char *last, char dflt, char *dest)
1366 {
1367     TRACE("(%p %p %p %c %p)\n", this, first, last, dflt, dest);
1368     return call_ctype_char_do_narrow(this, first, last, dflt, dest);
1369 }
1370
1371 /* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
1372 /* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
1373 DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
1374 const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
1375         const char *last, char dflt, char *dest, MSVCP_size_t size)
1376 {
1377     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1378     return call_ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
1379 }
1380
1381 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
1382 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
1383 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
1384 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
1385         char, (const ctype_char*, char), (this, ch))
1386 char __thiscall ctype_char_do_widen_ch(const ctype_char *this, char ch)
1387 {
1388     TRACE("(%p %c)\n", this, ch);
1389     return ch;
1390 }
1391
1392 /* ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z */
1393 /* ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z */
1394 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen, 16)
1395 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 20, \
1396         const char*, (const ctype_char*, const char*, const char*, char*), \
1397         (this, first, last, dest))
1398 const char* __thiscall ctype_char_do_widen(const ctype_char *this,
1399         const char *first, const char *last, char *dest)
1400 {
1401     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1402     memcpy(dest, first, last-first);
1403     return last;
1404 }
1405
1406 /* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
1407 /* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
1408 DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
1409 #define call_ctype_char__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 28, \
1410         const char*, (const ctype_char*, const char*, const char*, char*, MSVCP_size_t), \
1411         (this, first, last, dest, size))
1412 const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
1413         const char *first, const char *last, char *dest, MSVCP_size_t size)
1414 {
1415     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1416     memcpy_s(dest, size, first, last-first);
1417     return last;
1418 }
1419
1420 /* ?widen@?$ctype@D@std@@QBEDD@Z */
1421 /* ?widen@?$ctype@D@std@@QEBADD@Z */
1422 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
1423 char __thiscall ctype_char_widen_ch(const ctype_char *this, char ch)
1424 {
1425     TRACE("(%p %c)\n", this, ch);
1426     return call_ctype_char_do_widen_ch(this, ch);
1427 }
1428
1429 /* ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z */
1430 /* ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z */
1431 DEFINE_THISCALL_WRAPPER(ctype_char_widen, 16)
1432 const char* __thiscall ctype_char_widen(const ctype_char *this,
1433         const char *first, const char *last, char *dest)
1434 {
1435     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1436     return call_ctype_char_do_widen(this, first, last, dest);
1437 }
1438
1439 /* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
1440 /* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
1441 DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
1442 const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
1443         const char *first, const char *last, char *dest, MSVCP_size_t size)
1444 {
1445     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1446     return call_ctype_char__Do_widen_s(this, first, last, dest, size);
1447 }
1448
1449 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1450 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1451 MSVCP_size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
1452 {
1453     TRACE("(%p %p)\n", facet, loc);
1454
1455     if(facet && !*facet) {
1456         _Locinfo locinfo;
1457
1458         *facet = MSVCRT_operator_new(sizeof(ctype_char));
1459         if(!*facet) {
1460             ERR("Out of memory\n");
1461             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1462             return 0;
1463         }
1464
1465         _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
1466         ctype_char_ctor_locinfo((ctype_char*)*facet, &locinfo, 0);
1467         _Locinfo_dtor(&locinfo);
1468     }
1469
1470     return LC_CTYPE;
1471 }
1472
1473 ctype_char* ctype_char_use_facet(const locale *loc)
1474 {
1475     static ctype_char *obj = NULL;
1476
1477     _Lockit lock;
1478     const locale_facet *fac;
1479
1480     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1481     fac = locale__Getfacet(loc, ctype_char_id.id);
1482     if(fac) {
1483         _Lockit_dtor(&lock);
1484         return (ctype_char*)fac;
1485     }
1486
1487     if(obj)
1488         return obj;
1489
1490     ctype_char__Getcat(&fac, loc);
1491     obj = (ctype_char*)fac;
1492     locale_facet__Incref(&obj->base.facet);
1493     locale_facet_register(&obj->base.facet);
1494     _Lockit_dtor(&lock);
1495
1496     return obj;
1497 }
1498
1499 /* _Tolower */
1500 int __cdecl _Tolower(int ch, const _Ctypevec *ctype)
1501 {
1502     unsigned int cp;
1503
1504     TRACE("%d %p\n", ch, ctype);
1505
1506     if(ctype)
1507         cp = ctype->page;
1508     else
1509         cp = ___lc_codepage_func();
1510
1511     /* Don't convert to unicode in case of C locale */
1512     if(!cp) {
1513         if(ch>='A' && ch<='Z')
1514             ch = ch-'A'+'a';
1515         return ch;
1516     } else {
1517         WCHAR wide, lower;
1518         char str[2];
1519         int size;
1520
1521         if(ch > 255) {
1522             str[0] = (ch>>8) & 255;
1523             str[1] = ch & 255;
1524             size = 2;
1525         } else {
1526             str[0] = ch & 255;
1527             size = 1;
1528         }
1529
1530         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1531             return ch;
1532
1533         lower = tolowerW(wide);
1534         if(lower == wide)
1535             return ch;
1536
1537         WideCharToMultiByte(cp, 0, &lower, 1, str, 2, NULL, NULL);
1538
1539         return str[0] + (str[1]<<8);
1540     }
1541 }
1542
1543 /* ?do_tolower@?$ctype@D@std@@MBEDD@Z */
1544 /* ?do_tolower@?$ctype@D@std@@MEBADD@Z */
1545 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 8, \
1546         char, (const ctype_char*, char), (this, ch))
1547 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower_ch, 8)
1548 char __thiscall ctype_char_do_tolower_ch(const ctype_char *this, char ch)
1549 {
1550     TRACE("(%p %c)\n", this, ch);
1551     return _Tolower(ch, &this->ctype);
1552 }
1553
1554 /* ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z */
1555 /* ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
1556 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 4, \
1557         const char*, (const ctype_char*, char*, const char*), (this, first, last))
1558 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower, 12)
1559 const char* __thiscall ctype_char_do_tolower(const ctype_char *this, char *first, const char *last)
1560 {
1561     TRACE("(%p %p %p)\n", this, first, last);
1562     for(; first<last; first++)
1563         *first = _Tolower(*first, &this->ctype);
1564     return last;
1565 }
1566
1567 /* ?tolower@?$ctype@D@std@@QBEDD@Z */
1568 /* ?tolower@?$ctype@D@std@@QEBADD@Z */
1569 DEFINE_THISCALL_WRAPPER(ctype_char_tolower_ch, 8)
1570 char __thiscall ctype_char_tolower_ch(const ctype_char *this, char ch)
1571 {
1572     TRACE("(%p %c)\n", this, ch);
1573     return call_ctype_char_do_tolower_ch(this, ch);
1574 }
1575
1576 /* ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z */
1577 /* ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
1578 DEFINE_THISCALL_WRAPPER(ctype_char_tolower, 12)
1579 const char* __thiscall ctype_char_tolower(const ctype_char *this, char *first, const char *last)
1580 {
1581     TRACE("(%p %p %p)\n", this, first, last);
1582     return call_ctype_char_do_tolower(this, first, last);
1583 }
1584
1585 /* _Toupper */
1586 int __cdecl _Toupper(int ch, const _Ctypevec *ctype)
1587 {
1588     unsigned int cp;
1589
1590     TRACE("%d %p\n", ch, ctype);
1591
1592     if(ctype)
1593         cp = ctype->page;
1594     else
1595         cp = ___lc_codepage_func();
1596
1597     /* Don't convert to unicode in case of C locale */
1598     if(!cp) {
1599         if(ch>='a' && ch<='z')
1600             ch = ch-'a'+'A';
1601         return ch;
1602     } else {
1603         WCHAR wide, upper;
1604         char str[2];
1605         int size;
1606
1607         if(ch > 255) {
1608             str[0] = (ch>>8) & 255;
1609             str[1] = ch & 255;
1610             size = 2;
1611         } else {
1612             str[0] = ch & 255;
1613             size = 1;
1614         }
1615
1616         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1617             return ch;
1618
1619         upper = toupperW(wide);
1620         if(upper == wide)
1621             return ch;
1622
1623         WideCharToMultiByte(cp, 0, &upper, 1, str, 2, NULL, NULL);
1624
1625         return str[0] + (str[1]<<8);
1626     }
1627 }
1628
1629 /* ?do_toupper@?$ctype@D@std@@MBEDD@Z */
1630 /* ?do_toupper@?$ctype@D@std@@MEBADD@Z */
1631 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
1632         char, (const ctype_char*, char), (this, ch))
1633 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper_ch, 8)
1634 char __thiscall ctype_char_do_toupper_ch(const ctype_char *this, char ch)
1635 {
1636     TRACE("(%p %c)\n", this, ch);
1637     return _Toupper(ch, &this->ctype);
1638 }
1639
1640 /* ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z */
1641 /* ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
1642 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 12, \
1643         const char*, (const ctype_char*, char*, const char*), (this, first, last))
1644 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper, 12)
1645 const char* __thiscall ctype_char_do_toupper(const ctype_char *this,
1646         char *first, const char *last)
1647 {
1648     TRACE("(%p %p %p)\n", this, first, last);
1649     for(; first<last; first++)
1650         *first = _Toupper(*first, &this->ctype);
1651     return last;
1652 }
1653
1654 /* ?toupper@?$ctype@D@std@@QBEDD@Z */
1655 /* ?toupper@?$ctype@D@std@@QEBADD@Z */
1656 DEFINE_THISCALL_WRAPPER(ctype_char_toupper_ch, 8)
1657 char __thiscall ctype_char_toupper_ch(const ctype_char *this, char ch)
1658 {
1659     TRACE("(%p %c)\n", this, ch);
1660     return call_ctype_char_do_toupper_ch(this, ch);
1661 }
1662
1663 /* ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z */
1664 /* ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
1665 DEFINE_THISCALL_WRAPPER(ctype_char_toupper, 12)
1666 const char* __thiscall ctype_char_toupper(const ctype_char *this, char *first, const char *last)
1667 {
1668     TRACE("(%p %p %p)\n", this, first, last);
1669     return call_ctype_char_do_toupper(this, first, last);
1670 }
1671
1672 /* ?is@?$ctype@D@std@@QBE_NFD@Z */
1673 /* ?is@?$ctype@D@std@@QEBA_NFD@Z */
1674 DEFINE_THISCALL_WRAPPER(ctype_char_is_ch, 12)
1675 MSVCP_bool __thiscall ctype_char_is_ch(const ctype_char *this, short mask, char ch)
1676 {
1677     TRACE("(%p %x %c)\n", this, mask, ch);
1678     return (this->ctype.table[(unsigned char)ch] & mask) != 0;
1679 }
1680
1681 /* ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z */
1682 /* ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z */
1683 DEFINE_THISCALL_WRAPPER(ctype_char_is, 16)
1684 const char* __thiscall ctype_char_is(const ctype_char *this, const char *first, const char *last, short *dest)
1685 {
1686     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1687     for(; first<last; first++)
1688         *dest++ = this->ctype.table[(unsigned char)*first];
1689     return last;
1690 }
1691
1692 /* ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z */
1693 /* ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
1694 DEFINE_THISCALL_WRAPPER(ctype_char_scan_is, 16)
1695 const char* __thiscall ctype_char_scan_is(const ctype_char *this, short mask, const char *first, const char *last)
1696 {
1697     TRACE("(%p %x %p %p)\n", this, mask, first, last);
1698     for(; first<last; first++)
1699         if(!ctype_char_is_ch(this, mask, *first))
1700             break;
1701     return first;
1702 }
1703
1704 /* ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z */
1705 /* ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
1706 DEFINE_THISCALL_WRAPPER(ctype_char_scan_not, 16)
1707 const char* __thiscall ctype_char_scan_not(const ctype_char *this, short mask, const char *first, const char *last)
1708 {
1709     TRACE("(%p %x %p %p)\n", this, mask, first, last);
1710     for(; first<last; first++)
1711         if(ctype_char_is_ch(this, mask, *first))
1712             break;
1713     return first;
1714 }
1715
1716 /* ?table@?$ctype@D@std@@IBEPBFXZ */
1717 /* ?table@?$ctype@D@std@@IEBAPEBFXZ */
1718 DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
1719 const short* __thiscall ctype_char_table(const ctype_char *this)
1720 {
1721     TRACE("(%p)\n", this);
1722     return this->ctype.table;
1723 }
1724
1725 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
1726 locale_id ctype_wchar_id = {0};
1727 /* ?id@?$ctype@G@std@@2V0locale@2@A */
1728 locale_id ctype_short_id = {0};
1729
1730 /* ??_7?$ctype@_W@std@@6B@ */
1731 extern const vtable_ptr MSVCP_ctype_wchar_vtable;
1732 /* ??_7?$ctype@G@std@@6B@ */
1733 extern const vtable_ptr MSVCP_ctype_short_vtable;
1734
1735 /* ?_Id_func@?$ctype@_W@std@@SAAAVid@locale@2@XZ */
1736 /* ?_Id_func@?$ctype@_W@std@@SAAEAVid@locale@2@XZ */
1737 locale_id* __cdecl ctype_wchar__Id_func(void)
1738 {
1739     TRACE("()\n");
1740     return &ctype_wchar_id;
1741 }
1742
1743 /* ?_Id_func@?$ctype@G@std@@SAAAVid@locale@2@XZ */
1744 /* ?_Id_func@?$ctype@G@std@@SAAEAVid@locale@2@XZ */
1745 locale_id* __cdecl ctype_short__Id_func(void)
1746 {
1747     TRACE("()\n");
1748     return &ctype_short_id;
1749 }
1750
1751 /* ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z */
1752 /* ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
1753 /* ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z */
1754 /* ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z */
1755 DEFINE_THISCALL_WRAPPER(ctype_wchar__Init, 8)
1756 void __thiscall ctype_wchar__Init(ctype_wchar *this, _Locinfo *locinfo)
1757 {
1758     TRACE("(%p %p)\n", this, locinfo);
1759     _Locinfo__Getctype(locinfo, &this->ctype);
1760     _Locinfo__Getcvt(locinfo, &this->cvt);
1761 }
1762
1763 /* ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z */
1764 /* ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1765 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_locinfo, 12)
1766 ctype_wchar* __thiscall ctype_wchar_ctor_locinfo(ctype_wchar *this,
1767         _Locinfo *locinfo, MSVCP_size_t refs)
1768 {
1769     TRACE("(%p %p %lu)\n", this, locinfo, refs);
1770     ctype_base_ctor_refs(&this->base, refs);
1771     this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
1772     ctype_wchar__Init(this, locinfo);
1773     return this;
1774 }
1775
1776 /* ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z */
1777 /* ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1778 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_locinfo, 12)
1779 ctype_wchar* __thiscall ctype_short_ctor_locinfo(ctype_wchar *this,
1780         _Locinfo *locinfo, MSVCP_size_t refs)
1781 {
1782     ctype_wchar *ret = ctype_wchar_ctor_locinfo(this, locinfo, refs);
1783     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1784     return ret;
1785 }
1786
1787 /* ??0?$ctype@_W@std@@QAE@I@Z */
1788 /* ??0?$ctype@_W@std@@QEAA@_K@Z */
1789 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_refs, 8)
1790 ctype_wchar* __thiscall ctype_wchar_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
1791 {
1792     _Locinfo locinfo;
1793
1794     TRACE("(%p %lu)\n", this, refs);
1795
1796     ctype_base_ctor_refs(&this->base, refs);
1797     this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
1798
1799     _Locinfo_ctor(&locinfo);
1800     ctype_wchar__Init(this, &locinfo);
1801     _Locinfo_dtor(&locinfo);
1802     return this;
1803 }
1804
1805 /* ??0?$ctype@G@std@@QAE@I@Z */
1806 /* ??0?$ctype@G@std@@QEAA@_K@Z */
1807 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_refs, 8)
1808 ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
1809 {
1810     ctype_wchar *ret = ctype_wchar_ctor_refs(this, refs);
1811     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1812     return ret;
1813 }
1814
1815 /* ??0?$ctype@G@std@@IAE@PBDI@Z */
1816 /* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
1817 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
1818 ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
1819     const char *name, MSVCP_size_t refs)
1820 {
1821     _Locinfo locinfo;
1822
1823     TRACE("(%p %s %lu)\n", this, debugstr_a(name), refs);
1824
1825     ctype_base_ctor_refs(&this->base, refs);
1826     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1827
1828     _Locinfo_ctor_cstr(&locinfo, name);
1829     ctype_wchar__Init(this, &locinfo);
1830     _Locinfo_dtor(&locinfo);
1831     return this;
1832 }
1833
1834 /* ??_F?$ctype@_W@std@@QAEXXZ */
1835 /* ??_F?$ctype@_W@std@@QEAAXXZ */
1836 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
1837 ctype_wchar* __thiscall ctype_wchar_ctor(ctype_wchar *this)
1838 {
1839     TRACE("(%p)\n", this);
1840     return ctype_short_ctor_refs(this, 0);
1841 }
1842
1843 /* ??_F?$ctype@G@std@@QAEXXZ */
1844 /* ??_F?$ctype@G@std@@QEAAXXZ */
1845 DEFINE_THISCALL_WRAPPER(ctype_short_ctor, 4)
1846 ctype_wchar* __thiscall ctype_short_ctor(ctype_wchar *this)
1847 {
1848     ctype_wchar *ret = ctype_wchar_ctor(this);
1849     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1850     return ret;
1851 }
1852
1853 /* ??1?$ctype@_W@std@@MAE@XZ */
1854 /* ??1?$ctype@_W@std@@MEAA@XZ */
1855 /* ??1?$ctype@G@std@@MAE@XZ */
1856 /* ??1?$ctype@G@std@@MEAA@XZ */
1857 DEFINE_THISCALL_WRAPPER(ctype_wchar_dtor, 4)
1858 void __thiscall ctype_wchar_dtor(ctype_wchar *this)
1859 {
1860     TRACE("(%p)\n", this);
1861     if(this->ctype.delfl)
1862         free((void*)this->ctype.table);
1863 }
1864
1865 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_wchar_vector_dtor, 8)
1866 ctype_wchar* __thiscall MSVCP_ctype_wchar_vector_dtor(ctype_wchar *this, unsigned int flags)
1867 {
1868     TRACE("(%p %x)\n", this, flags);
1869     if(flags & 2) {
1870         /* we have an array, with the number of elements stored before the first object */
1871         int i, *ptr = (int *)this-1;
1872
1873         for(i=*ptr-1; i>=0; i--)
1874             ctype_wchar_dtor(this+i);
1875         MSVCRT_operator_delete(ptr);
1876     } else {
1877         ctype_wchar_dtor(this);
1878         if(flags & 1)
1879             MSVCRT_operator_delete(this);
1880     }
1881
1882     return this;
1883 }
1884
1885 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_short_vector_dtor, 8)
1886 ctype_wchar* __thiscall MSVCP_ctype_short_vector_dtor(ctype_wchar *this, unsigned int flags)
1887 {
1888     return MSVCP_ctype_wchar_vector_dtor(this, flags);
1889 }
1890
1891 /* _Wcrtomb */
1892 int __cdecl _Wcrtomb(char *s, wchar_t wch, int *state, const _Cvtvec *cvt)
1893 {
1894     int cp, size;
1895     BOOL def;
1896
1897     TRACE("%p %d %p %p\n", s, wch, state, cvt);
1898
1899     if(cvt)
1900         cp = cvt->page;
1901     else
1902         cp = ___lc_codepage_func();
1903
1904     if(!cp) {
1905         if(wch > 255) {
1906            *_errno() = EILSEQ;
1907            return -1;
1908         }
1909
1910         *s = wch & 255;
1911         return 1;
1912     }
1913
1914     size = WideCharToMultiByte(cp, 0, &wch, 1, s, MB_LEN_MAX, NULL, &def);
1915     if(!size || def) {
1916         *_errno() = EILSEQ;
1917         return -1;
1918     }
1919
1920     return size;
1921 }
1922
1923 /* ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z */
1924 /* ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z */
1925 /* ?_Donarrow@?$ctype@G@std@@IBEDGD@Z */
1926 /* ?_Donarrow@?$ctype@G@std@@IEBADGD@Z */
1927 DEFINE_THISCALL_WRAPPER(ctype_wchar__Donarrow, 12)
1928 char __thiscall ctype_wchar__Donarrow(const ctype_wchar *this, wchar_t ch, char dflt)
1929 {
1930     char buf[MB_LEN_MAX];
1931
1932     TRACE("(%p %d %d)\n", this, ch, dflt);
1933
1934     return _Wcrtomb(buf, ch, NULL, &this->cvt)==1 ? buf[0] : dflt;
1935 }
1936
1937 /* ?do_narrow@?$ctype@_W@std@@MBED_WD@Z */
1938 /* ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z */
1939 /* ?do_narrow@?$ctype@G@std@@MBEDGD@Z */
1940 /* ?do_narrow@?$ctype@G@std@@MEBADGD@Z */
1941 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow_ch, 12)
1942 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 52, \
1943         char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
1944 char __thiscall ctype_wchar_do_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
1945 {
1946     return ctype_wchar__Donarrow(this, ch, dflt);
1947 }
1948
1949 /* ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z */
1950 /* ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z */
1951 /* ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z */
1952 /* ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z */
1953 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow, 20)
1954 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 48, \
1955         const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
1956         (this, first, last, dflt, dest))
1957 const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
1958         const wchar_t *first, const wchar_t *last, char dflt, char *dest)
1959 {
1960     TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
1961     for(; first<last; first++)
1962         *dest++ = ctype_wchar__Donarrow(this, *first, dflt);
1963     return last;
1964 }
1965
1966 /* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
1967 /* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
1968 /* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
1969 /* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
1970 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
1971 #define call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size) CALL_VTBL_FUNC(this, 56, \
1972         const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*, MSVCP_size_t), \
1973         (this, first, last, dflt, dest, size))
1974 const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
1975         const wchar_t *first, const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
1976 {
1977     TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
1978     /* This function converts all multi-byte characters to dflt,
1979      * thanks to it result size is known before converting */
1980     if(last-first > size)
1981         ctype_base__Xran();
1982     return ctype_wchar_do_narrow(this, first, last, dflt, dest);
1983 }
1984
1985 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
1986 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
1987 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
1988 /* ?narrow@?$ctype@G@std@@QEBADGD@Z */
1989 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow_ch, 12)
1990 char __thiscall ctype_wchar_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
1991 {
1992     TRACE("(%p %d %d)\n", this, ch, dflt);
1993     return call_ctype_wchar_do_narrow_ch(this, ch, dflt);
1994 }
1995
1996 /* ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z */
1997 /* ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z */
1998 /* ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z */
1999 /* ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z */
2000 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow, 20)
2001 const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
2002         const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2003 {
2004     TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2005     return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
2006 }
2007
2008 /* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
2009 /* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
2010 /* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
2011 /* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
2012 DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
2013 const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
2014         const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
2015 {
2016     TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
2017     return call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
2018 }
2019
2020 /* _Mbrtowc */
2021 int __cdecl _Mbrtowc(wchar_t *out, const char *in, MSVCP_size_t len, int *state, const _Cvtvec *cvt)
2022 {
2023     int i, cp;
2024     CPINFO cp_info;
2025     BOOL is_lead;
2026
2027     TRACE("(%p %p %lu %p %p)\n", out, in, len, state, cvt);
2028
2029     if(!len)
2030         return 0;
2031
2032     if(cvt)
2033         cp = cvt->page;
2034     else
2035         cp = ___lc_codepage_func();
2036
2037     if(!cp) {
2038         if(out)
2039             *out = (unsigned char)*in;
2040
2041         *state = 0;
2042         return *in ? 1 : 0;
2043     }
2044
2045     if(*state) {
2046         ((char*)state)[1] = *in;
2047
2048         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, (char*)state, 2, out, out ? 1 : 0)) {
2049             *state = 0;
2050             *_errno() = EILSEQ;
2051             return -1;
2052         }
2053
2054         *state = 0;
2055         return 2;
2056     }
2057
2058     GetCPInfo(cp, &cp_info);
2059     is_lead = FALSE;
2060     for(i=0; i<MAX_LEADBYTES; i+=2) {
2061         if(!cp_info.LeadByte[i+1])
2062             break;
2063         if((unsigned char)*in>=cp_info.LeadByte[i] && (unsigned char)*in<=cp_info.LeadByte[i+1]) {
2064             is_lead = TRUE;
2065             break;
2066         }
2067     }
2068
2069     if(is_lead) {
2070         if(len == 1) {
2071             *state = (unsigned char)*in;
2072             return -2;
2073         }
2074
2075         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 2, out, out ? 1 : 0)) {
2076             *_errno() = EILSEQ;
2077             return -1;
2078         }
2079         return 2;
2080     }
2081
2082     if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 1, out, out ? 1 : 0)) {
2083         *_errno() = EILSEQ;
2084         return -1;
2085     }
2086     return 1;
2087 }
2088
2089 /* ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z */
2090 /* ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z */
2091 /* ?_Dowiden@?$ctype@G@std@@IBEGD@Z */
2092 /* ?_Dowiden@?$ctype@G@std@@IEBAGD@Z */
2093 DEFINE_THISCALL_WRAPPER(ctype_wchar__Dowiden, 8)
2094 wchar_t __thiscall ctype_wchar__Dowiden(const ctype_wchar *this, char ch)
2095 {
2096     wchar_t ret;
2097     int state = 0;
2098     TRACE("(%p %d)\n", this, ch);
2099     return _Mbrtowc(&ret, &ch, 1, &state, &this->cvt)<0 ? WEOF : ret;
2100 }
2101
2102 /* ?do_widen@?$ctype@_W@std@@MBE_WD@Z */
2103 /* ?do_widen@?$ctype@_W@std@@MEBA_WD@Z */
2104 /* ?do_widen@?$ctype@G@std@@MBEGD@Z */
2105 /* ?do_widen@?$ctype@G@std@@MEBAGD@Z */
2106 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen_ch, 8)
2107 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2108         wchar_t, (const ctype_wchar*, char), (this, ch))
2109 wchar_t __thiscall ctype_wchar_do_widen_ch(const ctype_wchar *this, char ch)
2110 {
2111     return ctype_wchar__Dowiden(this, ch);
2112 }
2113
2114 /* ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z */
2115 /* ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z */
2116 /* ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z */
2117 /* ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z */
2118 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen, 16)
2119 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 36, \
2120         const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2121         (this, first, last, dest))
2122 const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
2123         const char *first, const char *last, wchar_t *dest)
2124 {
2125     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2126     for(; first<last; first++)
2127         *dest++ = ctype_wchar__Dowiden(this, *first);
2128     return last;
2129 }
2130
2131 /* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
2132 /* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
2133 /* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
2134 /* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
2135 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
2136 #define call_ctype_wchar__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 44, \
2137         const char*, (const ctype_wchar*, const char*, const char*, wchar_t*, MSVCP_size_t), \
2138         (this, first, last, dest, size))
2139 const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
2140         const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2141 {
2142     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2143     /* This function converts all multi-byte characters to WEOF,
2144      * thanks to it result size is known before converting */
2145     if(size < last-first)
2146         ctype_base__Xran();
2147     return ctype_wchar_do_widen(this, first, last, dest);
2148 }
2149
2150 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
2151 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
2152 /* ?widen@?$ctype@G@std@@QBEGD@Z */
2153 /* ?widen@?$ctype@G@std@@QEBAGD@Z */
2154 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen_ch, 8)
2155 wchar_t __thiscall ctype_wchar_widen_ch(const ctype_wchar *this, char ch)
2156 {
2157     TRACE("(%p %d)\n", this, ch);
2158     return call_ctype_wchar_do_widen_ch(this, ch);
2159 }
2160
2161 /* ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z */
2162 /* ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z */
2163 /* ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z */
2164 /* ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z */
2165 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen, 16)
2166 const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
2167         const char *first, const char *last, wchar_t *dest)
2168 {
2169     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2170     return call_ctype_wchar_do_widen(this, first, last, dest);
2171 }
2172
2173 /* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
2174 /* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
2175 /* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
2176 /* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
2177 DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
2178 const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
2179         const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2180 {
2181     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2182     return call_ctype_wchar__Do_widen_s(this, first, last, dest, size);
2183 }
2184
2185 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2186 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2187 MSVCP_size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
2188 {
2189     TRACE("(%p %p)\n", facet, loc);
2190
2191     if(facet && !*facet) {
2192         _Locinfo locinfo;
2193
2194         *facet = MSVCRT_operator_new(sizeof(ctype_wchar));
2195         if(!*facet) {
2196             ERR("Out of memory\n");
2197             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2198             return 0;
2199         }
2200
2201         _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
2202         ctype_wchar_ctor_locinfo((ctype_wchar*)*facet, &locinfo, 0);
2203         _Locinfo_dtor(&locinfo);
2204     }
2205
2206     return LC_CTYPE;
2207 }
2208
2209 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2210 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2211 MSVCP_size_t __cdecl ctype_short__Getcat(const locale_facet **facet, const locale *loc)
2212 {
2213     if(facet && !*facet) {
2214         ctype_wchar__Getcat(facet, loc);
2215         (*(locale_facet**)facet)->vtable = &MSVCP_ctype_short_vtable;
2216     }
2217
2218     return LC_CTYPE;
2219 }
2220
2221 /* _Towlower */
2222 wchar_t __cdecl _Towlower(wchar_t ch, const _Ctypevec *ctype)
2223 {
2224     TRACE("(%d %p)\n", ch, ctype);
2225     return tolowerW(ch);
2226 }
2227
2228 ctype_wchar* ctype_wchar_use_facet(const locale *loc)
2229 {
2230     static ctype_wchar *obj = NULL;
2231
2232     _Lockit lock;
2233     const locale_facet *fac;
2234
2235     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2236     fac = locale__Getfacet(loc, ctype_wchar_id.id);
2237     if(fac) {
2238         _Lockit_dtor(&lock);
2239         return (ctype_wchar*)fac;
2240     }
2241
2242     if(obj)
2243         return obj;
2244
2245     ctype_wchar__Getcat(&fac, loc);
2246     obj = (ctype_wchar*)fac;
2247     locale_facet__Incref(&obj->base.facet);
2248     locale_facet_register(&obj->base.facet);
2249     _Lockit_dtor(&lock);
2250
2251     return obj;
2252 }
2253
2254 /* ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z */
2255 /* ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z */
2256 /* ?do_tolower@?$ctype@G@std@@MBEGG@Z */
2257 /* ?do_tolower@?$ctype@G@std@@MEBAGG@Z */
2258 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower_ch, 8)
2259 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2260         wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2261 wchar_t __thiscall ctype_wchar_do_tolower_ch(const ctype_wchar *this, wchar_t ch)
2262 {
2263     return _Towlower(ch, &this->ctype);
2264 }
2265
2266 /* ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2267 /* ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2268 /* ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2269 /* ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2270 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower, 12)
2271 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 20, \
2272         const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2273         (this, first, last))
2274 const wchar_t* __thiscall ctype_wchar_do_tolower(const ctype_wchar *this,
2275         wchar_t *first, const wchar_t *last)
2276 {
2277     TRACE("(%p %p %p)\n", this, first, last);
2278     for(; first<last; first++)
2279         *first = _Towlower(*first, &this->ctype);
2280     return last;
2281 }
2282
2283 /* ?tolower@?$ctype@_W@std@@QBE_W_W@Z */
2284 /* ?tolower@?$ctype@_W@std@@QEBA_W_W@Z */
2285 /* ?tolower@?$ctype@G@std@@QBEGG@Z */
2286 /* ?tolower@?$ctype@G@std@@QEBAGG@Z */
2287 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower_ch, 8)
2288 wchar_t __thiscall ctype_wchar_tolower_ch(const ctype_wchar *this, wchar_t ch)
2289 {
2290     TRACE("(%p %d)\n", this, ch);
2291     return call_ctype_wchar_do_tolower_ch(this, ch);
2292 }
2293
2294 /* ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2295 /* ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2296 /* ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2297 /* ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2298 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower, 12)
2299 const wchar_t* __thiscall ctype_wchar_tolower(const ctype_wchar *this,
2300         wchar_t *first, const wchar_t *last)
2301 {
2302     TRACE("(%p %p %p)\n", this, first, last);
2303     return call_ctype_wchar_do_tolower(this, first, last);
2304 }
2305
2306 /* _Towupper */
2307 wchar_t __cdecl _Towupper(wchar_t ch, const _Ctypevec *ctype)
2308 {
2309     TRACE("(%d %p)\n", ch, ctype);
2310     return toupperW(ch);
2311 }
2312
2313 /* ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z */
2314 /* ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z */
2315 /* ?do_toupper@?$ctype@G@std@@MBEGG@Z */
2316 /* ?do_toupper@?$ctype@G@std@@MEBAGG@Z */
2317 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper_ch, 8)
2318 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2319         wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2320 wchar_t __thiscall ctype_wchar_do_toupper_ch(const ctype_wchar *this, wchar_t ch)
2321 {
2322     return _Towupper(ch, &this->ctype);
2323 }
2324
2325 /* ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2326 /* ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2327 /* ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2328 /* ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2329 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper, 12)
2330 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 28, \
2331         const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2332         (this, first, last))
2333 const wchar_t* __thiscall ctype_wchar_do_toupper(const ctype_wchar *this,
2334         wchar_t *first, const wchar_t *last)
2335 {
2336     TRACE("(%p %p %p)\n", this, first, last);
2337     for(; first<last; first++)
2338         *first = _Towupper(*first, &this->ctype);
2339     return last;
2340 }
2341
2342 /* ?toupper@?$ctype@_W@std@@QBE_W_W@Z */
2343 /* ?toupper@?$ctype@_W@std@@QEBA_W_W@Z */
2344 /* ?toupper@?$ctype@G@std@@QBEGG@Z */
2345 /* ?toupper@?$ctype@G@std@@QEBAGG@Z */
2346 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper_ch, 8)
2347 wchar_t __thiscall ctype_wchar_toupper_ch(const ctype_wchar *this, wchar_t ch)
2348 {
2349     TRACE("(%p %d)\n", this, ch);
2350     return call_ctype_wchar_do_toupper_ch(this, ch);
2351 }
2352
2353 /* ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2354 /* ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2355 /* ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2356 /* ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2357 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper, 12)
2358 const wchar_t* __thiscall ctype_wchar_toupper(const ctype_wchar *this,
2359         wchar_t *first, const wchar_t *last)
2360 {
2361     TRACE("(%p %p %p)\n", this, first, last);
2362     return call_ctype_wchar_do_toupper(this, first, last);
2363 }
2364
2365 /* _Getwctypes */
2366 const wchar_t* __cdecl _Getwctypes(const wchar_t *first, const wchar_t *last,
2367         short *mask, const _Ctypevec *ctype)
2368 {
2369     TRACE("(%p %p %p %p)\n", first, last, mask, ctype);
2370     GetStringTypeW(CT_CTYPE1, first, last-first, (WORD*)mask);
2371     return last;
2372 }
2373
2374 /* _Getwctype */
2375 short __cdecl _Getwctype(wchar_t ch, const _Ctypevec *ctype)
2376 {
2377     short mask = 0;
2378     _Getwctypes(&ch, &ch+1, &mask, ctype);
2379     return mask;
2380 }
2381
2382 /* ?do_is@?$ctype@_W@std@@MBE_NF_W@Z */
2383 /* ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z */
2384 /* ?do_is@?$ctype@G@std@@MBE_NFG@Z */
2385 /* ?do_is@?$ctype@G@std@@MEBA_NFG@Z */
2386 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is_ch, 12)
2387 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 8, \
2388         MSVCP_bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2389 MSVCP_bool __thiscall ctype_wchar_do_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2390 {
2391     TRACE("(%p %x %d)\n", this, mask, ch);
2392     return (_Getwctype(ch, &this->ctype) & mask) != 0;
2393 }
2394
2395 /* ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z */
2396 /* ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z */
2397 /* ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z */
2398 /* ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z */
2399 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is, 16)
2400 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 4, \
2401         const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
2402         (this, first, last, dest))
2403 const wchar_t* __thiscall ctype_wchar_do_is(const ctype_wchar *this,
2404         const wchar_t *first, const wchar_t *last, short *dest)
2405 {
2406     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2407     return _Getwctypes(first, last, dest, &this->ctype);
2408 }
2409
2410 /* ?is@?$ctype@_W@std@@QBE_NF_W@Z */
2411 /* ?is@?$ctype@_W@std@@QEBA_NF_W@Z */
2412 /* ?is@?$ctype@G@std@@QBE_NFG@Z */
2413 /* ?is@?$ctype@G@std@@QEBA_NFG@Z */
2414 DEFINE_THISCALL_WRAPPER(ctype_wchar_is_ch, 12)
2415 MSVCP_bool __thiscall ctype_wchar_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2416 {
2417     TRACE("(%p %x %d)\n", this, mask, ch);
2418     return call_ctype_wchar_do_is_ch(this, mask, ch);
2419 }
2420
2421 /* ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z */
2422 /* ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z */
2423 /* ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z */
2424 /* ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z */
2425 DEFINE_THISCALL_WRAPPER(ctype_wchar_is, 16)
2426 const wchar_t* __thiscall ctype_wchar_is(const ctype_wchar *this,
2427         const wchar_t *first, const wchar_t *last, short *dest)
2428 {
2429     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2430     return call_ctype_wchar_do_is(this, first, last, dest);
2431 }
2432
2433 /* ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
2434 /* ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
2435 /* ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z */
2436 /* ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
2437 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_is, 16)
2438 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 12, \
2439         const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
2440         (this, mask, first, last))
2441 const wchar_t* __thiscall ctype_wchar_do_scan_is(const ctype_wchar *this,
2442         short mask, const wchar_t *first, const wchar_t *last)
2443 {
2444     TRACE("(%p %d %p %p)\n", this, mask, first, last);
2445     for(; first<last; first++)
2446         if(!ctype_wchar_is_ch(this, mask, *first))
2447             break;
2448     return first;
2449 }
2450
2451 /* ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
2452 /* ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
2453 /* ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z */
2454 /* ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
2455 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_is, 16)
2456 const wchar_t* __thiscall ctype_wchar_scan_is(const ctype_wchar *this,
2457         short mask, const wchar_t *first, const wchar_t *last)
2458 {
2459     TRACE("(%p %x %p %p)\n", this, mask, first, last);
2460     return call_ctype_wchar_do_scan_is(this, mask, first, last);
2461 }
2462
2463 /* ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
2464 /* ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
2465 /* ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z */
2466 /* ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
2467 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_not, 16)
2468 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 16, \
2469         const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
2470         (this, mask, first, last))
2471 const wchar_t* __thiscall ctype_wchar_do_scan_not(const ctype_wchar *this,
2472         short mask, const wchar_t *first, const wchar_t *last)
2473 {
2474     TRACE("(%p %x %p %p)\n", this, mask, first, last);
2475     for(; first<last; first++)
2476         if(ctype_wchar_is_ch(this, mask, *first))
2477             break;
2478     return first;
2479 }
2480
2481 /* ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
2482 /* ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
2483 /* ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z */
2484 /* ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
2485 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_not, 16)
2486 const wchar_t* __thiscall ctype_wchar_scan_not(const ctype_wchar *this,
2487         short mask, const wchar_t *first, const wchar_t *last)
2488 {
2489     TRACE("(%p %x %p %p)\n", this, mask, first, last);
2490     return call_ctype_wchar_do_scan_not(this, mask, first, last);
2491 }
2492
2493 /* ??_7codecvt_base@std@@6B@ */
2494 extern const vtable_ptr MSVCP_codecvt_base_vtable;
2495
2496 /* ??0codecvt_base@std@@QAE@I@Z */
2497 /* ??0codecvt_base@std@@QEAA@_K@Z */
2498 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor_refs, 8)
2499 codecvt_base* __thiscall codecvt_base_ctor_refs(codecvt_base *this, MSVCP_size_t refs)
2500 {
2501     TRACE("(%p %lu)\n", this, refs);
2502     locale_facet_ctor_refs(&this->facet, refs);
2503     this->facet.vtable = &MSVCP_codecvt_base_vtable;
2504     return this;
2505 }
2506
2507 /* ??_Fcodecvt_base@std@@QAEXXZ */
2508 /* ??_Fcodecvt_base@std@@QEAAXXZ */
2509 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor, 4)
2510 codecvt_base* __thiscall codecvt_base_ctor(codecvt_base *this)
2511 {
2512     return codecvt_base_ctor_refs(this, 0);
2513 }
2514
2515 /* ??1codecvt_base@std@@UAE@XZ */
2516 /* ??1codecvt_base@std@@UEAA@XZ */
2517 DEFINE_THISCALL_WRAPPER(codecvt_base_dtor, 4)
2518 void __thiscall codecvt_base_dtor(codecvt_base *this)
2519 {
2520     TRACE("(%p)\n", this);
2521     locale_facet_dtor(&this->facet);
2522 }
2523
2524 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_base_vector_dtor, 8)
2525 codecvt_base* __thiscall MSVCP_codecvt_base_vector_dtor(codecvt_base *this, unsigned int flags)
2526 {
2527     TRACE("(%p %x)\n", this, flags);
2528     if(flags & 2) {
2529         /* we have an array, with the number of elements stored before the first object */
2530         int i, *ptr = (int *)this-1;
2531
2532         for(i=*ptr-1; i>=0; i--)
2533             codecvt_base_dtor(this+i);
2534         MSVCRT_operator_delete(ptr);
2535     } else {
2536         codecvt_base_dtor(this);
2537         if(flags & 1)
2538             MSVCRT_operator_delete(this);
2539     }
2540
2541     return this;
2542 }
2543
2544 /* ?do_always_noconv@codecvt_base@std@@MBE_NXZ */
2545 /* ?do_always_noconv@codecvt_base@std@@MEBA_NXZ */
2546 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 4, \
2547         MSVCP_bool, (const codecvt_base*), (this))
2548 DEFINE_THISCALL_WRAPPER(codecvt_base_do_always_noconv, 4)
2549 MSVCP_bool __thiscall codecvt_base_do_always_noconv(const codecvt_base *this)
2550 {
2551     TRACE("(%p)\n", this);
2552     return TRUE;
2553 }
2554
2555 /* ?always_noconv@codecvt_base@std@@QBE_NXZ */
2556 /* ?always_noconv@codecvt_base@std@@QEBA_NXZ */
2557 DEFINE_THISCALL_WRAPPER(codecvt_base_always_noconv, 4)
2558 MSVCP_bool __thiscall codecvt_base_always_noconv(const codecvt_base *this)
2559 {
2560     TRACE("(%p)\n", this);
2561     return call_codecvt_base_do_always_noconv(this);
2562 }
2563
2564 /* ?do_max_length@codecvt_base@std@@MBEHXZ */
2565 /* ?do_max_length@codecvt_base@std@@MEBAHXZ */
2566 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 8, \
2567         int, (const codecvt_base*), (this))
2568 DEFINE_THISCALL_WRAPPER(codecvt_base_do_max_length, 4)
2569 int __thiscall codecvt_base_do_max_length(const codecvt_base *this)
2570 {
2571     TRACE("(%p)\n", this);
2572     return 1;
2573 }
2574
2575 /* ?max_length@codecvt_base@std@@QBEHXZ */
2576 /* ?max_length@codecvt_base@std@@QEBAHXZ */
2577 DEFINE_THISCALL_WRAPPER(codecvt_base_max_length, 4)
2578 int __thiscall codecvt_base_max_length(const codecvt_base *this)
2579 {
2580     TRACE("(%p)\n", this);
2581     return call_codecvt_base_do_max_length(this);
2582 }
2583
2584 /* ?do_encoding@codecvt_base@std@@MBEHXZ */
2585 /* ?do_encoding@codecvt_base@std@@MEBAHXZ */
2586 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 12, \
2587         int, (const codecvt_base*), (this))
2588 DEFINE_THISCALL_WRAPPER(codecvt_base_do_encoding, 4)
2589 int __thiscall codecvt_base_do_encoding(const codecvt_base *this)
2590 {
2591     TRACE("(%p)\n", this);
2592     return 1;
2593 }
2594
2595 /* ?encoding@codecvt_base@std@@QBEHXZ */
2596 /* ?encoding@codecvt_base@std@@QEBAHXZ */
2597 DEFINE_THISCALL_WRAPPER(codecvt_base_encoding, 4)
2598 int __thiscall codecvt_base_encoding(const codecvt_base *this)
2599 {
2600     TRACE("(%p)\n", this);
2601     return call_codecvt_base_do_encoding(this);
2602 }
2603
2604 /* ?id@?$codecvt@DDH@std@@2V0locale@2@A */
2605 locale_id codecvt_char_id = {0};
2606
2607 /* ??_7?$codecvt@DDH@std@@6B@ */
2608 extern const vtable_ptr MSVCP_codecvt_char_vtable;
2609
2610 /* ?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z */
2611 /* ?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z */
2612 DEFINE_THISCALL_WRAPPER(codecvt_char__Init, 8)
2613 void __thiscall codecvt_char__Init(codecvt_char *this, const _Locinfo *locinfo)
2614 {
2615     TRACE("(%p %p)\n", this, locinfo);
2616 }
2617
2618 /* ??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z */
2619 /* ??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2620 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_locinfo, 12)
2621 codecvt_char* __thiscall codecvt_char_ctor_locinfo(codecvt_char *this, const _Locinfo *locinfo, MSVCP_size_t refs)
2622 {
2623     TRACE("(%p %p %lu)\n", this, locinfo, refs);
2624     codecvt_base_ctor_refs(&this->base, refs);
2625     this->base.facet.vtable = &MSVCP_codecvt_char_vtable;
2626     return this;
2627 }
2628
2629 /* ??0?$codecvt@DDH@std@@QAE@I@Z */
2630 /* ??0?$codecvt@DDH@std@@QEAA@_K@Z */
2631 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_refs, 8)
2632 codecvt_char* __thiscall codecvt_char_ctor_refs(codecvt_char *this, MSVCP_size_t refs)
2633 {
2634     return codecvt_char_ctor_locinfo(this, NULL, refs);
2635 }
2636
2637 /* ??_F?$codecvt@DDH@std@@QAEXXZ */
2638 /* ??_F?$codecvt@DDH@std@@QEAAXXZ */
2639 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor, 4)
2640 codecvt_char* __thiscall codecvt_char_ctor(codecvt_char *this)
2641 {
2642     return codecvt_char_ctor_locinfo(this, NULL, 0);
2643 }
2644
2645 /* ??1?$codecvt@DDH@std@@MAE@XZ */
2646 /* ??1?$codecvt@DDH@std@@MEAA@XZ */
2647 DEFINE_THISCALL_WRAPPER(codecvt_char_dtor, 4)
2648 void __thiscall codecvt_char_dtor(codecvt_char *this)
2649 {
2650     TRACE("(%p)\n", this);
2651     codecvt_base_dtor(&this->base);
2652 }
2653
2654 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_char_vector_dtor, 8)
2655 codecvt_char* __thiscall MSVCP_codecvt_char_vector_dtor(codecvt_char *this, unsigned int flags)
2656 {
2657     TRACE("(%p %x)\n", this, flags);
2658     if(flags & 2) {
2659         /* we have an array, with the number of elements stored before the first object */
2660         int i, *ptr = (int *)this-1;
2661
2662         for(i=*ptr-1; i>=0; i--)
2663             codecvt_char_dtor(this+i);
2664         MSVCRT_operator_delete(ptr);
2665     } else {
2666         codecvt_char_dtor(this);
2667         if(flags & 1)
2668             MSVCRT_operator_delete(this);
2669     }
2670
2671     return this;
2672 }
2673
2674 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2675 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2676 MSVCP_size_t __cdecl codecvt_char__Getcat(const locale_facet **facet, const locale *loc)
2677 {
2678     TRACE("(%p %p)\n", facet, loc);
2679
2680     if(facet && !*facet) {
2681         *facet = MSVCRT_operator_new(sizeof(codecvt_char));
2682         if(!*facet) {
2683             ERR("Out of memory\n");
2684             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2685             return 0;
2686         }
2687         codecvt_char_ctor((codecvt_char*)*facet);
2688     }
2689
2690     return LC_CTYPE;
2691 }
2692
2693 codecvt_char* codecvt_char_use_facet(const locale *loc)
2694 {
2695     static codecvt_char *obj = NULL;
2696
2697     _Lockit lock;
2698     const locale_facet *fac;
2699
2700     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2701     fac = locale__Getfacet(loc, codecvt_char_id.id);
2702     if(fac) {
2703         _Lockit_dtor(&lock);
2704         return (codecvt_char*)fac;
2705     }
2706
2707     if(obj)
2708         return obj;
2709
2710     codecvt_char__Getcat(&fac, loc);
2711     obj = (codecvt_char*)fac;
2712     locale_facet__Incref(&obj->base.facet);
2713     locale_facet_register(&obj->base.facet);
2714     _Lockit_dtor(&lock);
2715
2716     return obj;
2717 }
2718
2719 /* ?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2720 /* ?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2721 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
2722     CALL_VTBL_FUNC(this, 16, int, \
2723             (const codecvt_char*, int*, const char*, const char*, const char**, char*, char*, char**), \
2724             (this, state, from, from_end, from_next, to, to_end, to_next))
2725 DEFINE_THISCALL_WRAPPER(codecvt_char_do_in, 32)
2726 int __thiscall codecvt_char_do_in(const codecvt_char *this, int *state,
2727         const char *from, const char *from_end, const char **from_next,
2728         char *to, char *to_end, char **to_next)
2729 {
2730     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
2731             from_next, to, to_end, to_next);
2732     *from_next = from;
2733     *to_next = to;
2734     return CODECVT_noconv;
2735 }
2736
2737 /* ?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2738 /* ?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2739 DEFINE_THISCALL_WRAPPER(codecvt_char_in, 32)
2740 int __thiscall codecvt_char_in(const codecvt_char *this, int *state,
2741         const char *from, const char *from_end, const char **from_next,
2742         char *to, char *to_end, char **to_next)
2743 {
2744     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
2745             from_next, to, to_end, to_next);
2746     return call_codecvt_char_do_in(this, state, from, from_end, from_next,
2747             to, to_end, to_next);
2748 }
2749
2750 /* ?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2751 /* ?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2752 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
2753     CALL_VTBL_FUNC(this, 20, int, \
2754             (const codecvt_char*, int*, const char*, const char*, const char**, char*, char*, char**), \
2755             (this, state, from, from_end, from_next, to, to_end, to_next))
2756 DEFINE_THISCALL_WRAPPER(codecvt_char_do_out, 32)
2757 int __thiscall codecvt_char_do_out(const codecvt_char *this, int *state,
2758         const char *from, const char *from_end, const char **from_next,
2759         char *to, char *to_end, char **to_next)
2760 {
2761     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
2762             from_end, from_next, to, to_end, to_next);
2763     *from_next = from;
2764     *to_next = to;
2765     return CODECVT_noconv;
2766 }
2767
2768 /* ?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2769 /* ?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2770 DEFINE_THISCALL_WRAPPER(codecvt_char_out, 32)
2771 int __thiscall codecvt_char_out(const codecvt_char *this, int *state,
2772         const char *from, const char *from_end, const char **from_next,
2773         char *to, char *to_end, char **to_next)
2774 {
2775     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
2776             from_next, to, to_end, to_next);
2777     return call_codecvt_char_do_out(this, state, from, from_end, from_next,
2778             to, to_end, to_next);
2779 }
2780
2781 /* ?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z */
2782 /* ?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
2783 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
2784         int, (const codecvt_char*, int*, char*, char*, char**), (this, state, to, to_end, to_next))
2785 DEFINE_THISCALL_WRAPPER(codecvt_char_do_unshift, 20)
2786 int __thiscall codecvt_char_do_unshift(const codecvt_char *this,
2787         int *state, char *to, char *to_end, char **to_next)
2788 {
2789     TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
2790     *to_next = to;
2791     return CODECVT_noconv;
2792 }
2793
2794 /* ?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z */
2795 /* ?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
2796 DEFINE_THISCALL_WRAPPER(codecvt_char_unshift, 20)
2797 int __thiscall codecvt_char_unshift(const codecvt_char *this,
2798         int *state, char *to, char *to_end, char **to_next)
2799 {
2800     TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
2801     return call_codecvt_char_do_unshift(this, state, to, to_end, to_next);
2802 }
2803
2804 /* ?do_length@?$codecvt@DDH@std@@MBEHABHPBD1I@Z */
2805 /* ?do_length@?$codecvt@DDH@std@@MEBAHAEBHPEBD1_K@Z */
2806 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
2807         int, (const codecvt_char*, const int*, const char*, const char*, MSVCP_size_t), \
2808         (this, state, from, from_end, max))
2809 DEFINE_THISCALL_WRAPPER(codecvt_char_do_length, 20)
2810 int __thiscall codecvt_char_do_length(const codecvt_char *this, const int *state,
2811         const char *from, const char *from_end, MSVCP_size_t max)
2812 {
2813     TRACE("(%p %p %p %p %lu)\n", this, state, from, from_end, max);
2814     return (from_end-from > max ? max : from_end-from);
2815 }
2816
2817 /* ?length@?$codecvt@DDH@std@@QBEHABHPBD1I@Z */
2818 /* ?length@?$codecvt@DDH@std@@QEBAHAEBHPEBD1_K@Z */
2819 DEFINE_THISCALL_WRAPPER(codecvt_char_length, 20)
2820 int __thiscall codecvt_char_length(const codecvt_char *this, const int *state,
2821         const char *from, const char *from_end, MSVCP_size_t max)
2822 {
2823     TRACE("(%p %p %p %p %lu)\n", this, state, from, from_end, max);
2824     return call_codecvt_char_do_length(this, state, from, from_end, max);
2825 }
2826
2827 /* ?id@?$codecvt@_WDH@std@@2V0locale@2@A */
2828 locale_id codecvt_wchar_id = {0};
2829 /* ?id@?$codecvt@GDH@std@@2V0locale@2@A */
2830 locale_id codecvt_short_id = {0};
2831
2832 /* ??_7?$codecvt@_WDH@std@@6B@ */
2833 extern const vtable_ptr MSVCP_codecvt_wchar_vtable;
2834 /* ??_7?$codecvt@GDH@std@@6B@ */
2835 extern const vtable_ptr MSVCP_codecvt_short_vtable;
2836
2837 /* ?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z */
2838 /* ?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z */
2839 /* ?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z */
2840 /* ?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z */
2841 DEFINE_THISCALL_WRAPPER(codecvt_wchar__Init, 8)
2842 void __thiscall codecvt_wchar__Init(codecvt_wchar *this, const _Locinfo *locinfo)
2843 {
2844     TRACE("(%p %p)\n", this, locinfo);
2845     _Locinfo__Getcvt(locinfo, &this->cvt);
2846 }
2847
2848 /* ??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z */
2849 /* ??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2850 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_locinfo, 12)
2851 codecvt_wchar* __thiscall codecvt_wchar_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, MSVCP_size_t refs)
2852 {
2853     TRACE("(%p %p %ld)\n", this, locinfo, refs);
2854
2855     codecvt_base_ctor_refs(&this->base, refs);
2856     this->base.facet.vtable = &MSVCP_codecvt_wchar_vtable;
2857
2858     codecvt_wchar__Init(this, locinfo);
2859     return this;
2860 }
2861
2862 /* ??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z */
2863 /* ??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2864 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_locinfo, 12)
2865 codecvt_wchar* __thiscall codecvt_short_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, MSVCP_size_t refs)
2866 {
2867     TRACE("(%p %p %ld)\n", this, locinfo, refs);
2868
2869     codecvt_wchar_ctor_locinfo(this, locinfo, refs);
2870     this->base.facet.vtable = &MSVCP_codecvt_short_vtable;
2871     return this;
2872 }
2873
2874 /* ??0?$codecvt@_WDH@std@@QAE@I@Z */
2875 /* ??0?$codecvt@_WDH@std@@QEAA@_K@Z */
2876 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_refs, 8)
2877 codecvt_wchar* __thiscall codecvt_wchar_ctor_refs(codecvt_wchar *this, MSVCP_size_t refs)
2878 {
2879     _Locinfo locinfo;
2880
2881     TRACE("(%p %ld)\n", this, refs);
2882
2883     _Locinfo_ctor(&locinfo);
2884     codecvt_wchar_ctor_locinfo(this, &locinfo, refs);
2885     _Locinfo_dtor(&locinfo);
2886     return this;
2887 }
2888
2889 /* ??0?$codecvt@GDH@std@@QAE@I@Z */
2890 /* ??0?$codecvt@GDH@std@@QEAA@_K@Z */
2891 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_refs, 8)
2892 codecvt_wchar* __thiscall codecvt_short_ctor_refs(codecvt_wchar *this, MSVCP_size_t refs)
2893 {
2894     _Locinfo locinfo;
2895
2896     TRACE("(%p %ld)\n", this, refs);
2897
2898     _Locinfo_ctor(&locinfo);
2899     codecvt_short_ctor_locinfo(this, &locinfo, refs);
2900     _Locinfo_dtor(&locinfo);
2901     return this;
2902 }
2903
2904 /* ??0?$codecvt@GDH@std@@IAE@PBDI@Z */
2905 /* ??0?$codecvt@GDH@std@@IEAA@PEBD_K@Z */
2906 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_name, 12)
2907 codecvt_wchar* __thiscall codecvt_short_ctor_name(codecvt_wchar *this, const char *name, MSVCP_size_t refs)
2908 {
2909     _Locinfo locinfo;
2910
2911     TRACE("(%p %s %ld)\n", this, name, refs);
2912
2913     _Locinfo_ctor_cstr(&locinfo, name);
2914     codecvt_short_ctor_locinfo(this, &locinfo, refs);
2915     _Locinfo_dtor(&locinfo);
2916     return this;
2917 }
2918
2919 /* ??_F?$codecvt@_WDH@std@@QAEXXZ */
2920 /* ??_F?$codecvt@_WDH@std@@QEAAXXZ */
2921 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor, 4)
2922 codecvt_wchar* __thiscall codecvt_wchar_ctor(codecvt_wchar *this)
2923 {
2924     return codecvt_wchar_ctor_refs(this, 0);
2925 }
2926
2927 /* ??_F?$codecvt@GDH@std@@QAEXXZ */
2928 /* ??_F?$codecvt@GDH@std@@QEAAXXZ */
2929 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor, 4)
2930 codecvt_wchar* __thiscall codecvt_short_ctor(codecvt_wchar *this)
2931 {
2932     return codecvt_short_ctor_refs(this, 0);
2933 }
2934
2935 /* ??1?$codecvt@GDH@std@@MAE@XZ */
2936 /* ??1?$codecvt@GDH@std@@MEAA@XZ */
2937 /* ??1?$codecvt@_WDH@std@@MAE@XZ */
2938 /* ??1?$codecvt@_WDH@std@@MEAA@XZ */
2939 DEFINE_THISCALL_WRAPPER(codecvt_wchar_dtor, 4)
2940 void __thiscall codecvt_wchar_dtor(codecvt_wchar *this)
2941 {
2942     TRACE("(%p)\n", this);
2943     codecvt_base_dtor(&this->base);
2944 }
2945
2946 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_wchar_vector_dtor, 8)
2947 codecvt_wchar* __thiscall MSVCP_codecvt_wchar_vector_dtor(codecvt_wchar *this, unsigned int flags)
2948 {
2949     TRACE("(%p %x)\n", this, flags);
2950     if(flags & 2) {
2951         /* we have an array, with the number of elements stored before the first object */
2952         int i, *ptr = (int *)this-1;
2953
2954         for(i=*ptr-1; i>=0; i--)
2955             codecvt_wchar_dtor(this+i);
2956         MSVCRT_operator_delete(ptr);
2957     } else {
2958         codecvt_wchar_dtor(this);
2959         if(flags & 1)
2960             MSVCRT_operator_delete(this);
2961     }
2962
2963     return this;
2964 }
2965
2966 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_short_vector_dtor, 8)
2967 codecvt_wchar* __thiscall MSVCP_codecvt_short_vector_dtor(codecvt_wchar *this, unsigned int flags)
2968 {
2969     return MSVCP_codecvt_wchar_vector_dtor(this, flags);
2970 }
2971
2972 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2973 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2974 unsigned int __cdecl codecvt_wchar__Getcat(const locale_facet **facet, const locale *loc)
2975 {
2976     TRACE("(%p %p)\n", facet, loc);
2977
2978     if(facet && !*facet) {
2979         _Locinfo locinfo;
2980
2981         *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
2982         if(!*facet) {
2983             ERR("Out of memory\n");
2984             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2985             return 0;
2986         }
2987
2988         _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
2989         codecvt_wchar_ctor_locinfo((codecvt_wchar*)*facet, &locinfo, 0);
2990         _Locinfo_dtor(&locinfo);
2991     }
2992
2993     return LC_CTYPE;
2994 }
2995
2996 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2997 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2998 unsigned int __cdecl codecvt_short__Getcat(const locale_facet **facet, const locale *loc)
2999 {
3000     TRACE("(%p %p)\n", facet, loc);
3001
3002     if(facet && !*facet) {
3003         _Locinfo locinfo;
3004
3005         *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
3006         if(!*facet) {
3007             ERR("Out of memory\n");
3008             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3009             return 0;
3010         }
3011
3012         _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
3013         codecvt_short_ctor((codecvt_wchar*)*facet);
3014         _Locinfo_dtor(&locinfo);
3015     }
3016
3017     return LC_CTYPE;
3018 }
3019
3020 /* ?_Id_func@?$codecvt@_WDH@std@@SAAAVid@locale@2@XZ */
3021 /* ?_Id_func@?$codecvt@_WDH@std@@SAAEAVid@locale@2@XZ */
3022 locale_id* __cdecl codecvt_wchar__Id_func(void)
3023 {
3024     TRACE("()\n");
3025     return &codecvt_wchar_id;
3026 }
3027
3028 /* ?_Id_func@?$codecvt@GDH@std@@SAAAVid@locale@2@XZ */
3029 /* ?_Id_func@?$codecvt@GDH@std@@SAAEAVid@locale@2@XZ */
3030 locale_id* __cdecl codecvt_short__Id_func(void)
3031 {
3032     TRACE("()\n");
3033     return &codecvt_short_id;
3034 }
3035
3036 /* ?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ */
3037 /* ?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ */
3038 /* ?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ */
3039 /* ?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ */
3040 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_always_noconv, 4)
3041 MSVCP_bool __thiscall codecvt_wchar_do_always_noconv(const codecvt_wchar *this)
3042 {
3043     TRACE("(%p)\n", this);
3044     return FALSE;
3045 }
3046
3047 /* ?do_max_length@?$codecvt@GDH@std@@MBEHXZ */
3048 /* ?do_max_length@?$codecvt@GDH@std@@MEBAHXZ */
3049 /* ?do_max_length@?$codecvt@_WDH@std@@MBEHXZ */
3050 /* ?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ */
3051 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_max_length, 4)
3052 int __thiscall codecvt_wchar_do_max_length(const codecvt_wchar *this)
3053 {
3054     TRACE("(%p)\n", this);
3055     return MB_LEN_MAX;
3056 }
3057
3058 /* ?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3059 /* ?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3060 /* ?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3061 /* ?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3062 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3063     CALL_VTBL_FUNC(this, 16, int, \
3064             (const codecvt_wchar*, int*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3065             (this, state, from, from_end, from_next, to, to_end, to_next))
3066 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_in, 32)
3067 int __thiscall codecvt_wchar_do_in(const codecvt_wchar *this, int *state,
3068         const char *from, const char *from_end, const char **from_next,
3069         wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3070 {
3071     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3072             from_end, from_next, to, to_end, to_next);
3073
3074     *from_next = from;
3075     *to_next = to;
3076
3077     while(*from_next!=from_end && *to_next!=to_end) {
3078         switch(_Mbrtowc(*to_next, *from_next, from_end-*from_next, state, &this->cvt)) {
3079         case -2:
3080             *from_next = from_end;
3081             return CODECVT_partial;
3082         case -1:
3083             return CODECVT_error;
3084         case 2:
3085             (*from_next)++;
3086             /* fall through */
3087         case 0:
3088         case 1:
3089             (*from_next)++;
3090             (*to_next)++;
3091         }
3092     }
3093
3094     return CODECVT_ok;
3095 }
3096
3097 /* ?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3098 /* ?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3099 /* ?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3100 /* ?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3101 DEFINE_THISCALL_WRAPPER(codecvt_wchar_in, 32)
3102 int __thiscall codecvt_wchar_in(const codecvt_wchar *this, int *state,
3103         const char *from, const char *from_end, const char **from_next,
3104         wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3105 {
3106     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3107             from_end, from_next, to, to_end, to_next);
3108     return call_codecvt_wchar_do_in(this, state, from,
3109             from_end, from_next, to, to_end, to_next);
3110 }
3111
3112 /* ?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3113 /* ?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3114 /* ?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3115 /* ?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3116 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3117     CALL_VTBL_FUNC(this, 20, int, \
3118             (const codecvt_wchar*, int*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3119             (this, state, from, from_end, from_next, to, to_end, to_next))
3120 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_out, 32)
3121 int __thiscall codecvt_wchar_do_out(const codecvt_wchar *this, int *state,
3122         const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3123         char *to, char *to_end, char **to_next)
3124 {
3125     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3126             from_end, from_next, to, to_end, to_next);
3127
3128     *from_next = from;
3129     *to_next = to;
3130
3131     while(*from_next!=from_end && *to_next!=to_end) {
3132         int old_state = *state, size;
3133         char buf[MB_LEN_MAX];
3134
3135         switch((size = _Wcrtomb(buf, **from_next, state, &this->cvt))) {
3136         case -1:
3137             return CODECVT_error;
3138         default:
3139             if(size > from_end-*from_next) {
3140                 *state = old_state;
3141                 return CODECVT_partial;
3142             }
3143
3144             (*from_next)++;
3145             (*to_next) += size;
3146         }
3147     }
3148
3149     return CODECVT_ok;
3150 }
3151
3152 /* ?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3153 /* ?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3154 /* ?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3155 /* ?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3156 DEFINE_THISCALL_WRAPPER(codecvt_wchar_out, 32)
3157 int __thiscall codecvt_wchar_out(const codecvt_wchar *this, int *state,
3158         const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3159         char *to, char *to_end, char **to_next)
3160 {
3161     TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3162             from_end, from_next, to, to_end, to_next);
3163     return call_codecvt_wchar_do_out(this, state, from,
3164             from_end, from_next, to, to_end, to_next);
3165 }
3166
3167 /* ?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z */
3168 /* ?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3169 /* ?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z */
3170 /* ?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3171 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3172         int, (const codecvt_wchar*, int*, char*, char*, char**), (this, state, to, to_end, to_next))
3173 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_unshift, 20)
3174 int __thiscall codecvt_wchar_do_unshift(const codecvt_wchar *this,
3175         int *state, char *to, char *to_end, char **to_next)
3176 {
3177     TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3178     if(*state)
3179         WARN("unexpected state: %x\n", *state);
3180
3181     *to_next = to;
3182     return CODECVT_ok;
3183 }
3184
3185 /* ?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z */
3186 /* ?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3187 /* ?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z */
3188 /* ?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3189 DEFINE_THISCALL_WRAPPER(codecvt_wchar_unshift, 20)
3190 int __thiscall codecvt_wchar_unshift(const codecvt_wchar *this,
3191         int *state, char *to, char *to_end, char **to_next)
3192 {
3193     TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3194     return call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next);
3195 }
3196
3197 /* ?do_length@?$codecvt@GDH@std@@MBEHABHPBD1I@Z */
3198 /* ?do_length@?$codecvt@GDH@std@@MEBAHAEBHPEBD1_K@Z */
3199 /* ?do_length@?$codecvt@_WDH@std@@MBEHABHPBD1I@Z */
3200 /* ?do_length@?$codecvt@_WDH@std@@MEBAHAEBHPEBD1_K@Z */
3201 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3202         int, (const codecvt_wchar*, const int*, const char*, const char*, MSVCP_size_t), \
3203         (this, state, from, from_end, max))
3204 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_length, 20)
3205 int __thiscall codecvt_wchar_do_length(const codecvt_wchar *this, const int *state,
3206         const char *from, const char *from_end, MSVCP_size_t max)
3207 {
3208     int tmp_state = *state, ret=0;
3209
3210     TRACE("(%p %p %p %p %ld)\n", this, state, from, from_end, max);
3211
3212     while(ret<max && from!=from_end) {
3213         switch(_Mbrtowc(NULL, from, from_end-from, &tmp_state, &this->cvt)) {
3214         case -2:
3215         case -1:
3216             return ret;
3217         case 2:
3218             from++;
3219             /* fall through */
3220         case 0:
3221         case 1:
3222             from++;
3223             ret++;
3224         }
3225     }
3226
3227     return ret;
3228 }
3229
3230 /* ?length@?$codecvt@GDH@std@@QBEHABHPBD1I@Z */
3231 /* ?length@?$codecvt@GDH@std@@QEBAHAEBHPEBD1_K@Z */
3232 /* ?length@?$codecvt@_WDH@std@@QBEHABHPBD1I@Z */
3233 /* ?length@?$codecvt@_WDH@std@@QEBAHAEBHPEBD1_K@Z */
3234 DEFINE_THISCALL_WRAPPER(codecvt_wchar_length, 20)
3235 int __thiscall codecvt_wchar_length(const codecvt_wchar *this, const int *state,
3236         const char *from, const char *from_end, MSVCP_size_t max)
3237 {
3238     TRACE("(%p %p %p %p %ld)\n", this, state, from, from_end, max);
3239     return call_codecvt_wchar_do_length(this, state, from, from_end, max);
3240 }
3241
3242 /* ?id@?$numpunct@D@std@@2V0locale@2@A */
3243 locale_id numpunct_char_id = {0};
3244
3245 /* ??_7?$numpunct@D@std@@6B@ */
3246 extern const vtable_ptr MSVCP_numpunct_char_vtable;
3247
3248 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
3249 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
3250 DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
3251 void __thiscall numpunct_char__Init(numpunct_char *this, _Locinfo *locinfo, MSVCP_bool isdef)
3252 {
3253     int len;
3254
3255     TRACE("(%p %p %d)\n", this, locinfo, isdef);
3256
3257     len = strlen(_Locinfo__Getfalse(locinfo))+1;
3258     this->false_name = MSVCRT_operator_new(len);
3259     if(this->false_name)
3260         memcpy((char*)this->false_name, _Locinfo__Getfalse(locinfo), len);
3261
3262     len = strlen(_Locinfo__Gettrue(locinfo))+1;
3263     this->true_name = MSVCRT_operator_new(len);
3264     if(this->true_name)
3265         memcpy((char*)this->true_name, _Locinfo__Gettrue(locinfo), len);
3266
3267     if(isdef) {
3268         this->grouping = MSVCRT_operator_new(1);
3269         if(this->grouping)
3270             *(char*)this->grouping = 0;
3271
3272         this->dp = '.';
3273         this->sep = ',';
3274     } else {
3275         const struct lconv *lc = _Locinfo__Getlconv(locinfo);
3276
3277         len = strlen(lc->grouping)+1;
3278         this->grouping = MSVCRT_operator_new(len);
3279         if(this->grouping)
3280             memcpy((char*)this->grouping, lc->grouping, len);
3281
3282         this->dp = lc->decimal_point[0];
3283         this->sep = lc->thousands_sep[0];
3284     }
3285
3286     if(!this->false_name || !this->true_name || !this->grouping) {
3287         MSVCRT_operator_delete((char*)this->grouping);
3288         MSVCRT_operator_delete((char*)this->false_name);
3289         MSVCRT_operator_delete((char*)this->true_name);
3290
3291         ERR("Out of memory\n");
3292         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3293     }
3294 }
3295
3296 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
3297 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
3298 DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
3299 void __thiscall numpunct_char__Tidy(numpunct_char *this)
3300 {
3301     TRACE("(%p)\n", this);
3302
3303     MSVCRT_operator_delete((char*)this->grouping);
3304     MSVCRT_operator_delete((char*)this->false_name);
3305     MSVCRT_operator_delete((char*)this->true_name);
3306 }
3307
3308 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
3309 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
3310 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
3311 numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
3312         _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
3313 {
3314     TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
3315     locale_facet_ctor_refs(&this->facet, refs);
3316     this->facet.vtable = &MSVCP_numpunct_char_vtable;
3317     numpunct_char__Init(this, locinfo, usedef);
3318     return this;
3319 }
3320
3321 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
3322 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
3323 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
3324 numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
3325         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
3326 {
3327     _Locinfo locinfo;
3328
3329     TRACE("(%p %s %lu %d)\n", this, debugstr_a(name), refs, usedef);
3330     locale_facet_ctor_refs(&this->facet, refs);
3331     this->facet.vtable = &MSVCP_numpunct_char_vtable;
3332
3333     _Locinfo_ctor_cstr(&locinfo, name);
3334     numpunct_char__Init(this, &locinfo, usedef);
3335     _Locinfo_dtor(&locinfo);
3336     return this;
3337 }
3338
3339 /* ??0?$numpunct@D@std@@QAE@I@Z */
3340 /* ??0?$numpunct@D@std@@QEAA@_K@Z */
3341 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
3342 numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, MSVCP_size_t refs)
3343 {
3344     TRACE("(%p %lu)\n", this, refs);
3345     return numpunct_char_ctor_name(this, "C", refs, FALSE);
3346 }
3347
3348 /* ??_F?$numpunct@D@std@@QAEXXZ */
3349 /* ??_F?$numpunct@D@std@@QEAAXXZ */
3350 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
3351 numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
3352 {
3353     return numpunct_char_ctor_refs(this, 0);
3354 }
3355
3356 /* ??1?$numpunct@D@std@@MAE@XZ */
3357 /* ??1?$numpunct@D@std@@MEAA@XZ */
3358 DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
3359 void __thiscall numpunct_char_dtor(numpunct_char *this)
3360 {
3361     TRACE("(%p)\n", this);
3362     numpunct_char__Tidy(this);
3363 }
3364
3365 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_char_vector_dtor, 8)
3366 numpunct_char* __thiscall MSVCP_numpunct_char_vector_dtor(numpunct_char *this, unsigned int flags)
3367 {
3368     TRACE("(%p %x)\n", this, flags);
3369     if(flags & 2) {
3370         /* we have an array, with the number of elements stored before the first object */
3371         int i, *ptr = (int *)this-1;
3372
3373         for(i=*ptr-1; i>=0; i--)
3374             numpunct_char_dtor(this+i);
3375         MSVCRT_operator_delete(ptr);
3376     } else {
3377         numpunct_char_dtor(this);
3378         if(flags & 1)
3379             MSVCRT_operator_delete(this);
3380     }
3381
3382     return this;
3383 }
3384
3385 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3386 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3387 MSVCP_size_t __cdecl numpunct_char__Getcat(const locale_facet **facet, const locale *loc)
3388 {
3389     TRACE("(%p %p)\n", facet, loc);
3390
3391     if(facet && !*facet) {
3392         *facet = MSVCRT_operator_new(sizeof(numpunct_char));
3393         if(!*facet) {
3394             ERR("Out of memory\n");
3395             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3396             return 0;
3397         }
3398         numpunct_char_ctor_name((numpunct_char*)*facet,
3399                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0, TRUE);
3400     }
3401
3402     return LC_NUMERIC;
3403 }
3404
3405 /* ?do_decimal_point@?$numpunct@D@std@@MBEDXZ */
3406 /* ?do_decimal_point@?$numpunct@D@std@@MEBADXZ */
3407 DEFINE_THISCALL_WRAPPER(numpunct_char_do_decimal_point, 4)
3408 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
3409         char, (const numpunct_char *this), (this))
3410 char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
3411 {
3412     TRACE("(%p)\n", this);
3413     return this->dp;
3414 }
3415
3416 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
3417 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
3418 DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
3419 char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
3420 {
3421     TRACE("(%p)\n", this);
3422     return call_numpunct_char_do_decimal_point(this);
3423 }
3424
3425 /* ?do_thousands_sep@?$numpunct@D@std@@MBEDXZ */
3426 /* ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ */
3427 DEFINE_THISCALL_WRAPPER(numpunct_char_do_thousands_sep, 4)
3428 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
3429         char, (const numpunct_char*), (this))
3430 char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
3431 {
3432     TRACE("(%p)\n", this);
3433     return this->sep;
3434 }
3435
3436 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
3437 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
3438 DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
3439 char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
3440 {
3441     TRACE("(%p)\n", this);
3442     return call_numpunct_char_do_thousands_sep(this);
3443 }
3444
3445 /* ?do_grouping@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3446 /* ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3447 DEFINE_THISCALL_WRAPPER(numpunct_char_do_grouping, 8)
3448 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
3449         basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
3450 basic_string_char* __thiscall numpunct_char_do_grouping(
3451         const numpunct_char *this, basic_string_char *ret)
3452 {
3453     TRACE("(%p)\n", this);
3454     return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
3455 }
3456
3457 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3458 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3459 DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
3460 basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
3461 {
3462     TRACE("(%p)\n", this);
3463     return call_numpunct_char_do_grouping(this, ret);
3464 }
3465
3466 /* ?do_falsename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3467 /* ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3468 DEFINE_THISCALL_WRAPPER(numpunct_char_do_falsename, 8)
3469 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
3470         basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
3471 basic_string_char* __thiscall numpunct_char_do_falsename(
3472         const numpunct_char *this, basic_string_char *ret)
3473 {
3474     TRACE("(%p)\n", this);
3475     return MSVCP_basic_string_char_ctor_cstr(ret, this->false_name);
3476 }
3477
3478 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3479 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3480 DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
3481 basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
3482 {
3483     TRACE("(%p)\n", this);
3484     return call_numpunct_char_do_falsename(this, ret);
3485 }
3486
3487 /* ?do_truename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3488 /* ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3489 DEFINE_THISCALL_WRAPPER(numpunct_char_do_truename, 8)
3490 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
3491         basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
3492 basic_string_char* __thiscall numpunct_char_do_truename(
3493         const numpunct_char *this, basic_string_char *ret)
3494 {
3495     TRACE("(%p)\n", this);
3496     return MSVCP_basic_string_char_ctor_cstr(ret, this->true_name);
3497 }
3498
3499 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3500 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3501 DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
3502 basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
3503 {
3504     TRACE("(%p)\n", this);
3505     return call_numpunct_char_do_truename(this, ret);
3506 }
3507
3508 /* ?id@?$numpunct@_W@std@@2V0locale@2@A */
3509 locale_id numpunct_wchar_id = {0};
3510 /* ?id@?$numpunct@G@std@@2V0locale@2@A */
3511 locale_id numpunct_short_id = {0};
3512
3513 /* ??_7?$numpunct@_W@std@@6B@ */
3514 extern const vtable_ptr MSVCP_numpunct_wchar_vtable;
3515 /* ??_7?$numpunct@G@std@@6B@ */
3516 extern const vtable_ptr MSVCP_numpunct_short_vtable;
3517
3518 /* ?_Init@?$numpunct@_W@std@@IAEXABV_Locinfo@2@_N@Z */
3519 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
3520 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
3521 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
3522 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
3523 void __thiscall numpunct_wchar__Init(numpunct_wchar *this, _Locinfo *locinfo, MSVCP_bool isdef)
3524 {
3525     const char *to_convert;
3526     _Cvtvec cvt;
3527     int len;
3528
3529     TRACE("(%p %p %d)\n", this, locinfo, isdef);
3530
3531     _Locinfo__Getcvt(locinfo, &cvt);
3532
3533     to_convert = _Locinfo__Getfalse(locinfo);
3534     len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
3535     this->false_name = MSVCRT_operator_new(len*sizeof(WCHAR));
3536     if(this->false_name)
3537         MultiByteToWideChar(cvt.page, 0, to_convert, -1,
3538                 (wchar_t*)this->false_name, len);
3539
3540     to_convert = _Locinfo__Gettrue(locinfo);
3541     len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
3542     this->true_name = MSVCRT_operator_new(len*sizeof(WCHAR));
3543     if(this->true_name)
3544         MultiByteToWideChar(cvt.page, 0, to_convert, -1,
3545                 (wchar_t*)this->true_name, len);
3546
3547     if(isdef) {
3548         this->grouping = MSVCRT_operator_new(1);
3549         if(this->grouping)
3550             *(char*)this->grouping = 0;
3551
3552         this->dp = '.';
3553         this->sep = ',';
3554     } else {
3555         const struct lconv *lc = _Locinfo__Getlconv(locinfo);
3556
3557         len = strlen(lc->grouping)+1;
3558         this->grouping = MSVCRT_operator_new(len);
3559         if(this->grouping)
3560             memcpy((char*)this->grouping, lc->grouping, len);
3561
3562         this->dp = lc->decimal_point[0];
3563         this->sep = lc->thousands_sep[0];
3564     }
3565
3566     if(!this->false_name || !this->true_name || !this->grouping) {
3567         MSVCRT_operator_delete((char*)this->grouping);
3568         MSVCRT_operator_delete((wchar_t*)this->false_name);
3569         MSVCRT_operator_delete((wchar_t*)this->true_name);
3570
3571         ERR("Out of memory\n");
3572         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3573     }
3574 }
3575
3576 /* ?_Tidy@?$numpunct@_W@std@@AAEXXZ */
3577 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
3578 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
3579 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
3580 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
3581 void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
3582 {
3583     TRACE("(%p)\n", this);
3584
3585     MSVCRT_operator_delete((char*)this->grouping);
3586     MSVCRT_operator_delete((wchar_t*)this->false_name);
3587     MSVCRT_operator_delete((wchar_t*)this->true_name);
3588 }
3589
3590 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
3591 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
3592 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
3593 numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
3594         _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
3595 {
3596     TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
3597     locale_facet_ctor_refs(&this->facet, refs);
3598     this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
3599     numpunct_wchar__Init(this, locinfo, usedef);
3600     return this;
3601 }
3602
3603 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
3604 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
3605 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
3606 numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
3607         _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
3608 {
3609     numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
3610     this->facet.vtable = &MSVCP_numpunct_short_vtable;
3611     return this;
3612 }
3613
3614 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
3615 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
3616 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
3617 numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
3618         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
3619 {
3620     _Locinfo locinfo;
3621
3622     TRACE("(%p %s %lu %d)\n", this, debugstr_a(name), refs, usedef);
3623     locale_facet_ctor_refs(&this->facet, refs);
3624     this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
3625
3626     _Locinfo_ctor_cstr(&locinfo, name);
3627     numpunct_wchar__Init(this, &locinfo, usedef);
3628     _Locinfo_dtor(&locinfo);
3629     return this;
3630 }
3631
3632 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
3633 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
3634     DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
3635 numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
3636         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
3637 {
3638     numpunct_wchar_ctor_name(this, name, refs, usedef);
3639     this->facet.vtable = &MSVCP_numpunct_short_vtable;
3640     return this;
3641 }
3642
3643 /* ??0?$numpunct@_W@std@@QAE@I@Z */
3644 /* ??0?$numpunct@_W@std@@QEAA@_K@Z */
3645     DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
3646 numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
3647 {
3648     TRACE("(%p %lu)\n", this, refs);
3649     return numpunct_wchar_ctor_name(this, "C", refs, FALSE);
3650 }
3651
3652 /* ??0?$numpunct@G@std@@QAE@I@Z */
3653 /* ??0?$numpunct@G@std@@QEAA@_K@Z */
3654 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
3655 numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
3656 {
3657     numpunct_wchar_ctor_refs(this, refs);
3658     this->facet.vtable = &MSVCP_numpunct_short_vtable;
3659     return this;
3660 }
3661
3662 /* ??_F?$numpunct@_W@std@@QAEXXZ */
3663 /* ??_F?$numpunct@_W@std@@QEAAXXZ */
3664 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
3665 numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
3666 {
3667     return numpunct_wchar_ctor_refs(this, 0);
3668 }
3669
3670 /* ??_F?$numpunct@G@std@@QAEXXZ */
3671 /* ??_F?$numpunct@G@std@@QEAAXXZ */
3672 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
3673 numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
3674 {
3675     return numpunct_short_ctor_refs(this, 0);
3676 }
3677
3678 /* ??1?$numpunct@_W@std@@MAE@XZ */
3679 /* ??1?$numpunct@_W@std@@MEAA@XZ */
3680 /* ??1?$numpunct@G@std@@MAE@XZ */
3681 /* ??1?$numpunct@G@std@@MEAA@XZ */
3682 DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
3683 void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
3684 {
3685     TRACE("(%p)\n", this);
3686     numpunct_wchar__Tidy(this);
3687 }
3688
3689 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_wchar_vector_dtor, 8)
3690 numpunct_wchar* __thiscall MSVCP_numpunct_wchar_vector_dtor(numpunct_wchar *this, unsigned int flags)
3691 {
3692     TRACE("(%p %x)\n", this, flags);
3693     if(flags & 2) {
3694         /* we have an array, with the number of elements stored before the first object */
3695         int i, *ptr = (int *)this-1;
3696
3697         for(i=*ptr-1; i>=0; i--)
3698             numpunct_wchar_dtor(this+i);
3699         MSVCRT_operator_delete(ptr);
3700     } else {
3701         numpunct_wchar_dtor(this);
3702         if(flags & 1)
3703             MSVCRT_operator_delete(this);
3704     }
3705
3706     return this;
3707 }
3708
3709 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_short_vector_dtor, 8)
3710 numpunct_wchar* __thiscall MSVCP_numpunct_short_vector_dtor(numpunct_wchar *this, unsigned int flags)
3711 {
3712     return MSVCP_numpunct_wchar_vector_dtor(this, flags);
3713 }
3714
3715 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3716 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3717 MSVCP_size_t __cdecl numpunct_wchar__Getcat(const locale_facet **facet, const locale *loc)
3718 {
3719     TRACE("(%p %p)\n", facet, loc);
3720
3721     if(facet && !*facet) {
3722         *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
3723         if(!*facet) {
3724             ERR("Out of memory\n");
3725             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3726             return 0;
3727         }
3728         numpunct_wchar_ctor_name((numpunct_wchar*)*facet,
3729                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0, TRUE);
3730     }
3731
3732     return LC_NUMERIC;
3733 }
3734
3735 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3736 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3737 MSVCP_size_t __cdecl numpunct_short__Getcat(const locale_facet **facet, const locale *loc)
3738 {
3739     TRACE("(%p %p)\n", facet, loc);
3740
3741     if(facet && !*facet) {
3742         *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
3743         if(!*facet) {
3744             ERR("Out of memory\n");
3745             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3746             return 0;
3747         }
3748         numpunct_short_ctor_name((numpunct_wchar*)*facet,
3749                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0, TRUE);
3750     }
3751
3752     return LC_NUMERIC;
3753 }
3754
3755 /* ?do_decimal_point@?$numpunct@_W@std@@MBE_WXZ */
3756 /* ?do_decimal_point@?$numpunct@_W@std@@MEBA_WXZ */
3757 /* ?do_decimal_point@?$numpunct@G@std@@MBEGXZ */
3758 /* ?do_decimal_point@?$numpunct@G@std@@MEBAGXZ */
3759 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_decimal_point, 4)
3760 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
3761         wchar_t, (const numpunct_wchar *this), (this))
3762 wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
3763 {
3764     TRACE("(%p)\n", this);
3765     return this->dp;
3766 }
3767
3768 /* ?decimal_point@?$numpunct@_W@std@@QBE_WXZ */
3769 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
3770 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
3771 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
3772 DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
3773 wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
3774 {
3775     TRACE("(%p)\n", this);
3776     return call_numpunct_wchar_do_decimal_point(this);
3777 }
3778
3779 /* ?do_thousands_sep@?$numpunct@_W@std@@MBE_WXZ */
3780 /* ?do_thousands_sep@?$numpunct@_W@std@@MEBA_WXZ */
3781 /* ?do_thousands_sep@?$numpunct@G@std@@MBEGXZ */
3782 /* ?do_thousands_sep@?$numpunct@G@std@@MEBAGXZ */
3783 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_thousands_sep, 4)
3784 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
3785         wchar_t, (const numpunct_wchar *this), (this))
3786 wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
3787 {
3788     TRACE("(%p)\n", this);
3789     return this->sep;
3790 }
3791
3792 /* ?thousands_sep@?$numpunct@_W@std@@QBE_WXZ */
3793 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
3794 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
3795 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
3796 DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
3797 wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
3798 {
3799     TRACE("(%p)\n", this);
3800     return call_numpunct_wchar_do_thousands_sep(this);
3801 }
3802
3803 /* ?do_grouping@?$numpunct@_W@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3804 /* ?do_grouping@?$numpunct@_W@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3805 /* ?do_grouping@?$numpunct@G@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3806 /* ?do_grouping@?$numpunct@G@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3807 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_grouping, 8)
3808 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
3809         basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
3810 basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *this, basic_string_char *ret)
3811 {
3812     TRACE("(%p)\n", this);
3813     return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
3814 }
3815
3816 /* ?grouping@?$numpunct@_W@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3817 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3818 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3819 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3820 DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
3821 basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
3822 {
3823     TRACE("(%p)\n", this);
3824     return call_numpunct_wchar_do_grouping(this, ret);
3825 }
3826
3827 /* ?do_falsename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3828 /* ?do_falsename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3829 /* ?do_falsename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3830 /* ?do_falsename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3831 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_falsename, 8)
3832 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
3833         basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
3834 basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
3835 {
3836     TRACE("(%p)\n", this);
3837     return MSVCP_basic_string_wchar_ctor_cstr(ret, this->false_name);
3838 }
3839
3840 /* ?falsename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3841 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3842 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3843 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3844 DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
3845 basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
3846 {
3847     TRACE("(%p)\n", this);
3848     return call_numpunct_wchar_do_falsename(this, ret);
3849 }
3850
3851 /* ?do_truename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3852 /* ?do_truename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3853 /* ?do_truename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3854 /* ?do_truename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3855 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_truename, 8)
3856 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
3857         basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
3858 basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *this, basic_string_wchar *ret)
3859 {
3860     TRACE("(%p)\n", this);
3861     return MSVCP_basic_string_wchar_ctor_cstr(ret, this->true_name);
3862 }
3863
3864 /* ?truename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3865 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3866 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3867 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3868 DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
3869 basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
3870 {
3871     TRACE("(%p)\n", this);
3872     return call_numpunct_wchar_do_truename(this, ret);
3873 }
3874
3875 double __cdecl _Stod(const char *buf, char **buf_end, LONG exp)
3876 {
3877     double ret = strtod(buf, buf_end);
3878
3879     if(exp)
3880         ret *= pow(10, exp);
3881     return ret;
3882 }
3883
3884 double __cdecl _Stodx(const char *buf, char **buf_end, LONG exp, int *err)
3885 {
3886     double ret;
3887
3888     *err = *_errno();
3889     *_errno() = 0;
3890     ret = _Stod(buf, buf_end, exp);
3891     if(*_errno()) {
3892         *err = *_errno();
3893     }else {
3894         *_errno() = *err;
3895         *err = 0;
3896     }
3897     return ret;
3898 }
3899
3900 float __cdecl _Stof(const char *buf, char **buf_end, LONG exp)
3901 {
3902     return _Stod(buf, buf_end, exp);
3903 }
3904
3905 float __cdecl _Stofx(const char *buf, char **buf_end, LONG exp, int *err)
3906 {
3907     return _Stodx(buf, buf_end, exp, err);
3908 }
3909
3910 __int64 __cdecl _Stoll(const char *buf, char **buf_end, int base)
3911 {
3912     return _strtoi64(buf, buf_end, base);
3913 }
3914
3915 __int64 __cdecl _Stollx(const char *buf, char **buf_end, int base, int *err)
3916 {
3917     __int64 ret;
3918
3919     *err = *_errno();
3920     *_errno() = 0;
3921     ret = _strtoi64(buf, buf_end, base);
3922     if(*_errno()) {
3923         *err = *_errno();
3924     }else {
3925         *_errno() = *err;
3926         *err = 0;
3927     }
3928     return ret;
3929 }
3930
3931 LONG __cdecl _Stolx(const char *buf, char **buf_end, int base, int *err)
3932 {
3933     __int64 i = _Stollx(buf, buf_end, base, err);
3934     if(!*err && i!=(__int64)((LONG)i))
3935         *err = ERANGE;
3936     return i;
3937 }
3938
3939 unsigned __int64 __cdecl _Stoull(const char *buf, char **buf_end, int base)
3940 {
3941     return _strtoui64(buf, buf_end, base);
3942 }
3943
3944 unsigned __int64 __cdecl _Stoullx(const char *buf, char **buf_end, int base, int *err)
3945 {
3946     unsigned __int64 ret;
3947
3948     *err = *_errno();
3949     *_errno() = 0;
3950     ret = _strtoui64(buf, buf_end, base);
3951     if(*_errno()) {
3952         *err = *_errno();
3953     }else {
3954         *_errno() = *err;
3955         *err = 0;
3956     }
3957     return ret;
3958 }
3959
3960 ULONG __cdecl _Stoul(const char *buf, char **buf_end, int base)
3961 {
3962     int err;
3963     unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, &err);
3964     if(!err && i!=(unsigned __int64)((ULONG)i))
3965         *_errno() = ERANGE;
3966     return buf[0]=='-' ? -i : i;
3967 }
3968
3969 ULONG __cdecl _Stoulx(const char *buf, char **buf_end, int base, int *err)
3970 {
3971     unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, err);
3972     if(!*err && i!=(unsigned __int64)((ULONG)i))
3973         *err = ERANGE;
3974     return buf[0]=='-' ? -i : i;
3975 }
3976
3977 /* ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
3978 locale_id num_get_wchar_id = {0};
3979 /* ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
3980 locale_id num_get_short_id = {0};
3981
3982 /* ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
3983 extern const vtable_ptr MSVCP_num_get_wchar_vtable;
3984 /* ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
3985 extern const vtable_ptr MSVCP_num_get_short_vtable;
3986
3987 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
3988 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
3989 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
3990 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
3991 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor__Init, 8)
3992 void __thiscall num_get_wchar_ctor__Init(num_get *this, const _Locinfo *locinfo)
3993 {
3994     FIXME("(%p %p) stub\n", this, locinfo);
3995 }
3996
3997 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
3998 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3999 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_locinfo, 12)
4000 num_get* __thiscall num_get_wchar_ctor_locinfo(num_get *this,
4001         _Locinfo *locinfo, MSVCP_size_t refs)
4002 {
4003     FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
4004     return NULL;
4005 }
4006
4007 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4008 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4009 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_locinfo, 12)
4010 num_get* __thiscall num_get_short_ctor_locinfo(num_get *this,
4011         _Locinfo *locinfo, MSVCP_size_t refs)
4012 {
4013     FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
4014     return NULL;
4015 }
4016
4017 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
4018 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
4019 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_refs, 8)
4020 num_get* __thiscall num_get_wchar_ctor_refs(num_get *this, MSVCP_size_t refs)
4021 {
4022     FIXME("(%p %lu) stub\n", this, refs);
4023     return NULL;
4024 }
4025
4026 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
4027 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
4028 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_refs, 8)
4029 num_get* __thiscall num_get_short_ctor_refs(num_get *this, MSVCP_size_t refs)
4030 {
4031     FIXME("(%p %lu) stub\n", this, refs);
4032     return NULL;
4033 }
4034
4035 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4036 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4037 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor, 4)
4038 num_get* __thiscall num_get_wchar_ctor(num_get *this)
4039 {
4040     FIXME("(%p) stub\n", this);
4041     return NULL;
4042 }
4043
4044 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4045 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4046 DEFINE_THISCALL_WRAPPER(num_get_short_ctor, 4)
4047 num_get* __thiscall num_get_short_ctor(num_get *this)
4048 {
4049     FIXME("(%p) stub\n", this);
4050     return NULL;
4051 }
4052
4053 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
4054 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
4055 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
4056 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
4057 DEFINE_THISCALL_WRAPPER(num_get_wchar_dtor, 4)
4058 void __thiscall num_get_wchar_dtor(num_get *this)
4059 {
4060     FIXME("(%p) stub\n", this);
4061 }
4062
4063 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar_vector_dtor, 8)
4064 num_get* __thiscall MSVCP_num_get_wchar_vector_dtor(num_get *this, unsigned int flags)
4065 {
4066     TRACE("(%p %x)\n", this, flags);
4067     if(flags & 2) {
4068         /* we have an array, with the number of elements stored before the first object */
4069         int i, *ptr = (int *)this-1;
4070
4071         for(i=*ptr-1; i>=0; i--)
4072             num_get_wchar_dtor(this+i);
4073         MSVCRT_operator_delete(ptr);
4074     } else {
4075         num_get_wchar_dtor(this);
4076         if(flags & 1)
4077             MSVCRT_operator_delete(this);
4078     }
4079
4080     return this;
4081 }
4082
4083 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_short_vector_dtor, 8)
4084 num_get* __thiscall MSVCP_num_get_short_vector_dtor(num_get *this, unsigned int flags)
4085 {
4086     return MSVCP_num_get_wchar_vector_dtor(this, flags);
4087 }
4088
4089 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4090 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4091 MSVCP_size_t __cdecl num_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
4092 {
4093     FIXME("(%p %p) stub\n", facet, loc);
4094     return -1;
4095 }
4096
4097 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4098 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4099 MSVCP_size_t __cdecl num_get_short__Getcat(const locale_facet **facet, const locale *loc)
4100 {
4101     FIXME("(%p %p) stub\n", facet, loc);
4102     return -1;
4103 }
4104
4105 /* ?_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1ABVlocale@2@@Z */
4106 /* ?_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AEBVlocale@2@@Z */
4107 /* ?_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1ABVlocale@2@@Z */
4108 /* ?_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AEBVlocale@2@@Z */
4109 int __cdecl num_get_wchar__Getffld(num_get *this, char *dest, istreambuf_iterator_wchar *first,
4110     istreambuf_iterator_wchar *last, const locale *loc)
4111 {
4112     FIXME("(%p %p %p %p) stub\n", dest, first, last, loc);
4113     return -1;
4114 }
4115
4116 /* ?_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AAVios_base@2@PAH@Z */
4117 /* ?_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AEAVios_base@2@PEAH@Z */
4118 /* ?_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AAVios_base@2@PAH@Z */
4119 /* ?_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AEAVios_base@2@PEAH@Z */
4120 int __cdecl num_get_wchar__Getffldx(num_get *this, char *dest, istreambuf_iterator_wchar *first,
4121     istreambuf_iterator_wchar *last, struct _ios_base *ios, int *phexexp)
4122 {
4123     FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
4124     return -1;
4125 }
4126
4127 /* ?_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1HABVlocale@2@@Z */
4128 /* ?_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1HAEBVlocale@2@@Z */
4129 /* ?_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1HABVlocale@2@@Z */
4130 /* ?_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1HAEBVlocale@2@@Z */
4131 int __cdecl num_get_wchar__Getifld(num_get *this, char *dest, istreambuf_iterator_wchar *first,
4132     istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
4133 {
4134     FIXME("(%p %p %p %04x %p) stub\n", dest, first, last, fmtflags, loc);
4135     return -1;
4136 }
4137
4138 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABEH_W000@Z */
4139 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAH_W000@Z */
4140 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABEHGGGG@Z */
4141 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHGGGG@Z */
4142 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar__Hexdig, 20)
4143 int __thiscall MSVCP_num_get_wchar__Hexdig(num_get *this, wchar_t dig, wchar_t e0, wchar_t al, wchar_t au)
4144 {
4145     FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
4146     return -1;
4147 }
4148
4149 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z */
4150 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z */
4151 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z */
4152 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z */
4153 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_void,36)
4154 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
4155     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, void **pval)
4156 {
4157     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4158     return ret;
4159 }
4160
4161 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z */
4162 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z */
4163 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z */
4164 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z */
4165 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_void,36)
4166 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
4167     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, void **pval)
4168 {
4169     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4170     return ret;
4171 }
4172
4173 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
4174 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
4175 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z */
4176 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z */
4177 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
4178 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
4179 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z */
4180 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z */
4181 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_double,36)
4182 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
4183     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, double *pval)
4184 {
4185     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4186     return ret;
4187 }
4188
4189 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
4190 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
4191 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z */
4192 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z */
4193 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
4194 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
4195 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z */
4196 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z */
4197 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_double,36)
4198 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
4199     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, double *pval)
4200 {
4201     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4202     return ret;
4203 }
4204
4205 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z */
4206 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z */
4207 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z */
4208 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z */
4209 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_float,36)
4210 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
4211     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, float *pval)
4212 {
4213     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4214     return ret;
4215 }
4216
4217 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z */
4218 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z */
4219 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z */
4220 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z */
4221 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_float,36)
4222 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
4223     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, float *pval)
4224 {
4225     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4226     return ret;
4227 }
4228
4229 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z */
4230 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z */
4231 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z */
4232 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z */
4233 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint64,36)
4234 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
4235     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONGLONG *pval)
4236 {
4237     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4238     return ret;
4239 }
4240
4241 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z */
4242 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z */
4243 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z */
4244 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z */
4245 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint64,36)
4246 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
4247     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONGLONG *pval)
4248 {
4249     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4250     return ret;
4251 }
4252
4253 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z */
4254 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z */
4255 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z */
4256 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z */
4257 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_int64,36)
4258 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
4259     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONGLONG *pval)
4260 {
4261     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4262     return ret;
4263 }
4264
4265 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z */
4266 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z */
4267 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z */
4268 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z */
4269 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_int64,36)
4270 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
4271     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONGLONG *pval)
4272 {
4273     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4274     return ret;
4275 }
4276
4277 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z */
4278 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z */
4279 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z */
4280 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z */
4281 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ulong,36)
4282 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
4283     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONG *pval)
4284 {
4285     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4286     return ret;
4287 }
4288
4289 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z */
4290 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z */
4291 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z */
4292 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z */
4293 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ulong,36)
4294 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
4295     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONG *pval)
4296 {
4297     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4298     return ret;
4299 }
4300
4301 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z */
4302 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z */
4303 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z */
4304 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z */
4305 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_long,36)
4306 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
4307     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONG *pval)
4308 {
4309     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4310     return ret;
4311 }
4312
4313 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z */
4314 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z */
4315 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z */
4316 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z */
4317 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_long,36)
4318 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
4319     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONG *pval)
4320 {
4321     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4322     return ret;
4323 }
4324
4325 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z */
4326 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z */
4327 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z */
4328 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z */
4329 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint,36)
4330 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
4331     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned int *pval)
4332 {
4333     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4334     return ret;
4335 }
4336
4337 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z */
4338 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z */
4339 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z */
4340 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z */
4341 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint,36)
4342 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
4343     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned int *pval)
4344 {
4345     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4346     return ret;
4347 }
4348
4349 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z */
4350 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z */
4351 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z */
4352 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z */
4353 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ushort,36)
4354 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
4355     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned short *pval)
4356 {
4357     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4358     return ret;
4359 }
4360
4361 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z */
4362 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z */
4363 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@ */
4364 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z */
4365 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ushort,36)
4366 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
4367     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned short *pval)
4368 {
4369     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4370     return ret;
4371 }
4372
4373 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z */
4374 /* ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z */
4375 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z */
4376 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z */
4377 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_bool,36)
4378 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
4379     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, MSVCP_bool *pval)
4380 {
4381     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4382     return ret;
4383 }
4384
4385 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z */
4386 /* ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z */
4387 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z */
4388 /* ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z */
4389 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_bool,36)
4390 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
4391     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, MSVCP_bool *pval)
4392 {
4393     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4394     return ret;
4395 }
4396
4397 /* ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
4398 locale_id num_get_char_id = {0};
4399
4400 /* ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
4401 extern const vtable_ptr MSVCP_num_get_char_vtable;
4402
4403 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4404 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4405 DEFINE_THISCALL_WRAPPER(num_get_char_ctor__Init, 8)
4406 void __thiscall num_get_char_ctor__Init(num_get *this, const _Locinfo *locinfo)
4407 {
4408     FIXME("(%p %p) stub\n", this, locinfo);
4409 }
4410
4411 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4412 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4413 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_locinfo, 12)
4414 num_get* __thiscall num_get_char_ctor_locinfo(num_get *this,
4415         _Locinfo *locinfo, MSVCP_size_t refs)
4416 {
4417     FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
4418     return NULL;
4419 }
4420
4421 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
4422 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
4423 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_refs, 8)
4424 num_get* __thiscall num_get_char_ctor_refs(num_get *this, MSVCP_size_t refs)
4425 {
4426     FIXME("(%p %lu) stub\n", this, refs);
4427     return NULL;
4428 }
4429
4430 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
4431 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
4432 DEFINE_THISCALL_WRAPPER(num_get_char_ctor, 4)
4433 num_get* __thiscall num_get_char_ctor(num_get *this)
4434 {
4435     FIXME("(%p) stub\n", this);
4436     return NULL;
4437 }
4438
4439 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
4440 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
4441 DEFINE_THISCALL_WRAPPER(num_get_char_dtor, 4)
4442 void __thiscall num_get_char_dtor(num_get *this)
4443 {
4444     FIXME("(%p) stub\n", this);
4445 }
4446
4447 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char_vector_dtor, 8)
4448 num_get* __thiscall MSVCP_num_get_char_vector_dtor(num_get *this, unsigned int flags)
4449 {
4450     TRACE("(%p %x)\n", this, flags);
4451     if(flags & 2) {
4452         /* we have an array, with the number of elements stored before the first object */
4453         int i, *ptr = (int *)this-1;
4454
4455         for(i=*ptr-1; i>=0; i--)
4456             num_get_char_dtor(this+i);
4457         MSVCRT_operator_delete(ptr);
4458     } else {
4459         num_get_char_dtor(this);
4460         if(flags & 1)
4461             MSVCRT_operator_delete(this);
4462     }
4463
4464     return this;
4465 }
4466
4467 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4468 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4469 MSVCP_size_t __cdecl num_get_char__Getcat(const locale_facet **facet, const locale *loc)
4470 {
4471     FIXME("(%p %p) stub\n", facet, loc);
4472     return -1;
4473 }
4474
4475 /* ?_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1ABVlocale@2@@Z */
4476 /* ?_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AEBVlocale@2@@Z */
4477 int __cdecl num_get_char__Getffld(num_get *this, char *dest, istreambuf_iterator_char *first,
4478     istreambuf_iterator_char *last, const locale *loc)
4479 {
4480     FIXME("(%p %p %p %p) stub\n", dest, first, last, loc);
4481     return -1;
4482 }
4483
4484 /* ?_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AAVios_base@2@PAH@Z */
4485 /* ?_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AEAVios_base@2@PEAH@Z */
4486 int __cdecl num_get_char__Getffldx(num_get *this, char *dest, istreambuf_iterator_char *first,
4487     istreambuf_iterator_char *last, struct _ios_base *ios, int *phexexp)
4488 {
4489     FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
4490     return -1;
4491 }
4492
4493 /* ?_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1HABVlocale@2@@Z */
4494 /* ?_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1HAEBVlocale@2@@Z */
4495 int __cdecl num_get_char__Getifld(num_get *this, char *dest, istreambuf_iterator_char *first,
4496     istreambuf_iterator_char *last, int fmtflags, const locale *loc)
4497 {
4498     FIXME("(%p %p %p %04x %p) stub\n", dest, first, last, fmtflags, loc);
4499     return -1;
4500 }
4501
4502 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABEHD000@Z */
4503 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHD000@Z */
4504 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char__Hexdig, 20)
4505 int __thiscall MSVCP_num_get_char__Hexdig(num_get *this, char dig, char e0, char al, char au)
4506 {
4507     FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
4508     return -1;
4509 }
4510
4511 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z */
4512 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z */
4513 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_void,36)
4514 istreambuf_iterator_char *__thiscall num_get_char_do_get_void(const num_get *this, istreambuf_iterator_char *ret,
4515     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, void **pval)
4516 {
4517     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4518     return ret;
4519 }
4520
4521 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z */
4522 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z */
4523 DEFINE_THISCALL_WRAPPER(num_get_char_get_void,36)
4524 istreambuf_iterator_char *__thiscall num_get_char_get_void(const num_get *this, istreambuf_iterator_char *ret,
4525     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, void **pval)
4526 {
4527     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4528     return ret;
4529 }
4530
4531 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
4532 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
4533 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z */
4534 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z */
4535 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_double,36)
4536 istreambuf_iterator_char *__thiscall num_get_char_do_get_double(const num_get *this, istreambuf_iterator_char *ret,
4537     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, double *pval)
4538 {
4539     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4540     return ret;
4541 }
4542
4543 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
4544 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
4545 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z */
4546 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z */
4547 DEFINE_THISCALL_WRAPPER(num_get_char_get_double,36)
4548 istreambuf_iterator_char *__thiscall num_get_char_get_double(const num_get *this, istreambuf_iterator_char *ret,
4549     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, double *pval)
4550 {
4551     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4552     return ret;
4553 }
4554
4555 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z */
4556 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z */
4557 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_float,36)
4558 istreambuf_iterator_char *__thiscall num_get_char_do_get_float(const num_get *this, istreambuf_iterator_char *ret,
4559     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, float *pval)
4560 {
4561     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4562     return ret;
4563 }
4564
4565 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z */
4566 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z */
4567 DEFINE_THISCALL_WRAPPER(num_get_char_get_float,36)
4568 istreambuf_iterator_char *__thiscall num_get_char_get_float(const num_get *this, istreambuf_iterator_char *ret,
4569     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, float *pval)
4570 {
4571     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4572     return ret;
4573 }
4574
4575 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z */
4576 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z */
4577 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint64,36)
4578 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
4579     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONGLONG *pval)
4580 {
4581     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4582     return ret;
4583 }
4584
4585 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z */
4586 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z */
4587 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint64,36)
4588 istreambuf_iterator_char *__thiscall num_get_char_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
4589     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONGLONG *pval)
4590 {
4591     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4592     return ret;
4593 }
4594
4595 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z */
4596 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z */
4597 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_int64,36)
4598 istreambuf_iterator_char *__thiscall num_get_char_do_get_int64(const num_get *this, istreambuf_iterator_char *ret,
4599     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONGLONG *pval)
4600 {
4601     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4602     return ret;
4603 }
4604
4605 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z */
4606 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z */
4607 DEFINE_THISCALL_WRAPPER(num_get_char_get_int64,36)
4608 istreambuf_iterator_char *__thiscall num_get_char_get_int64(const num_get *this, istreambuf_iterator_char *ret,
4609     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONGLONG *pval)
4610 {
4611     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4612     return ret;
4613 }
4614
4615 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z */
4616 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z */
4617 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ulong,36)
4618 istreambuf_iterator_char *__thiscall num_get_char_do_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
4619     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONG *pval)
4620 {
4621     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4622     return ret;
4623 }
4624
4625 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z */
4626 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z */
4627 DEFINE_THISCALL_WRAPPER(num_get_char_get_ulong,36)
4628 istreambuf_iterator_char *__thiscall num_get_char_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
4629     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONG *pval)
4630 {
4631     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4632     return ret;
4633 }
4634
4635 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z */
4636 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z */
4637 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_long,36)
4638 istreambuf_iterator_char *__thiscall num_get_char_do_get_long(const num_get *this, istreambuf_iterator_char *ret,
4639     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONG *pval)
4640 {
4641     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4642     return ret;
4643 }
4644
4645 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z */
4646 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z */
4647 DEFINE_THISCALL_WRAPPER(num_get_char_get_long,36)
4648 istreambuf_iterator_char *__thiscall num_get_char_get_long(const num_get *this, istreambuf_iterator_char *ret,
4649     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONG *pval)
4650 {
4651     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4652     return ret;
4653 }
4654
4655 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z */
4656 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z */
4657 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint,36)
4658 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint(const num_get *this, istreambuf_iterator_char *ret,
4659     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned int *pval)
4660 {
4661     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4662     return ret;
4663 }
4664
4665 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z */
4666 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z */
4667 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint,36)
4668 istreambuf_iterator_char *__thiscall num_get_char_get_uint(const num_get *this, istreambuf_iterator_char *ret,
4669     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned int *pval)
4670 {
4671     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4672     return ret;
4673 }
4674
4675 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z */
4676 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z */
4677 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ushort,36)
4678 istreambuf_iterator_char *__thiscall num_get_char_do_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
4679     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned short *pval)
4680 {
4681     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4682     return ret;
4683 }
4684
4685 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z */
4686 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z */
4687 DEFINE_THISCALL_WRAPPER(num_get_char_get_ushort,36)
4688 istreambuf_iterator_char *__thiscall num_get_char_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
4689     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned short *pval)
4690 {
4691     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4692     return ret;
4693 }
4694
4695 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z */
4696 /* ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z */
4697 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_bool,36)
4698 istreambuf_iterator_char *__thiscall num_get_char_do_get_bool(const num_get *this, istreambuf_iterator_char *ret,
4699     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, MSVCP_bool *pval)
4700 {
4701     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4702     return ret;
4703 }
4704
4705 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z */
4706 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z */
4707 DEFINE_THISCALL_WRAPPER(num_get_char_get_bool,36)
4708 istreambuf_iterator_char *__thiscall num_get_char_get_bool(const num_get *this, istreambuf_iterator_char *ret,
4709     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, MSVCP_bool *pval)
4710 {
4711     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4712     return ret;
4713 }
4714
4715 /* ??0_Locimp@locale@std@@AAE@_N@Z */
4716 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
4717 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
4718 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, MSVCP_bool transparent)
4719 {
4720     TRACE("(%p %d)\n", this, transparent);
4721
4722     memset(this, 0, sizeof(locale__Locimp));
4723     locale_facet_ctor_refs(&this->facet, 1);
4724     this->transparent = transparent;
4725     MSVCP_basic_string_char_ctor_cstr(&this->name, "*");
4726     return this;
4727 }
4728
4729 /* ??_F_Locimp@locale@std@@QAEXXZ */
4730 /* ??_F_Locimp@locale@std@@QEAAXXZ */
4731 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
4732 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
4733 {
4734     return locale__Locimp_ctor_transparent(this, FALSE);
4735 }
4736
4737 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
4738 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
4739 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
4740 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
4741 {
4742     _Lockit lock;
4743     MSVCP_size_t i;
4744
4745     TRACE("(%p %p)\n", this, copy);
4746
4747     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4748     memcpy(this, copy, sizeof(locale__Locimp));
4749     locale_facet_ctor_refs(&this->facet, 1);
4750     if(copy->facetvec) {
4751         this->facetvec = MSVCRT_operator_new(copy->facet_cnt*sizeof(locale_facet*));
4752         if(!this->facetvec) {
4753             _Lockit_dtor(&lock);
4754             ERR("Out of memory\n");
4755             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4756             return NULL;
4757         }
4758         for(i=0; i<this->facet_cnt; i++)
4759             if(this->facetvec[i])
4760                 locale_facet__Incref(this->facetvec[i]);
4761     }
4762     MSVCP_basic_string_char_copy_ctor(&this->name, &copy->name);
4763     _Lockit_dtor(&lock);
4764     return this;
4765 }
4766
4767 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
4768 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
4769 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
4770 {
4771     return locale__Locimp_copy_ctor(this, copy);
4772 }
4773
4774 /* ??1_Locimp@locale@std@@MAE@XZ */
4775 /* ??1_Locimp@locale@std@@MEAA@XZ */
4776 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
4777 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
4778 {
4779     TRACE("(%p)\n", this);
4780
4781     if(locale_facet__Decref(&this->facet)) {
4782         MSVCP_size_t i;
4783         for(i=0; i<this->facet_cnt; i++)
4784             if(this->facetvec[i] && locale_facet__Decref(this->facetvec[i]))
4785                 call_locale_facet_vector_dtor(this->facetvec[i], 0);
4786
4787         MSVCRT_operator_delete(this->facetvec);
4788         MSVCP_basic_string_char_dtor(&this->name);
4789     }
4790 }
4791
4792 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
4793 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
4794 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
4795 {
4796     locale__Locimp_dtor(this);
4797 }
4798
4799 DEFINE_THISCALL_WRAPPER(MSVCP_locale__Locimp_vector_dtor, 8)
4800 locale__Locimp* __thiscall MSVCP_locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
4801 {
4802     TRACE("(%p %x)\n", this, flags);
4803     if(flags & 2) {
4804         /* we have an array, with the number of elements stored before the first object */
4805         int i, *ptr = (int *)this-1;
4806
4807         for(i=*ptr-1; i>=0; i--)
4808             locale__Locimp_dtor(this+i);
4809         MSVCRT_operator_delete(ptr);
4810     } else {
4811         locale__Locimp_dtor(this);
4812         if(flags & 1)
4813             MSVCRT_operator_delete(this);
4814     }
4815
4816     return this;
4817 }
4818
4819 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
4820 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
4821 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, MSVCP_size_t id)
4822 {
4823     _Lockit lock;
4824
4825     TRACE("(%p %p %lu)\n", locimp, facet, id);
4826
4827     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4828     if(id >= locimp->facet_cnt) {
4829         MSVCP_size_t new_size = id+1;
4830         locale_facet **new_facetvec;
4831
4832         if(new_size < locale_id__Id_cnt+1)
4833             new_size = locale_id__Id_cnt+1;
4834
4835         new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
4836         if(!new_facetvec) {
4837             _Lockit_dtor(&lock);
4838             ERR("Out of memory\n");
4839             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4840             return;
4841         }
4842
4843         memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
4844         memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
4845         MSVCRT_operator_delete(locimp->facetvec);
4846         locimp->facetvec = new_facetvec;
4847         locimp->facet_cnt = new_size;
4848     }
4849
4850     if(locimp->facetvec[id] && locale_facet__Decref(locimp->facetvec[id]))
4851         call_locale_facet_vector_dtor(locimp->facetvec[id], 0);
4852
4853     locimp->facetvec[id] = facet;
4854     if(facet)
4855         locale_facet__Incref(facet);
4856     _Lockit_dtor(&lock);
4857 }
4858
4859 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
4860 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
4861 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
4862 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, MSVCP_size_t id)
4863 {
4864     locale__Locimp__Locimp_Addfac(this, facet, id);
4865 }
4866
4867 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
4868 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
4869 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
4870 {
4871     FIXME("stub\n");
4872     return NULL;
4873 }
4874
4875 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
4876 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
4877 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
4878 {
4879     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
4880     return NULL;
4881 }
4882
4883 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
4884 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
4885 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
4886 {
4887     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
4888 }
4889
4890 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
4891 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
4892 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
4893 {
4894     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
4895 }
4896
4897 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
4898 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
4899 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
4900 {
4901     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
4902 }
4903
4904 /* ??_7_Locimp@locale@std@@6B@ */
4905 const vtable_ptr MSVCP_locale__Locimp_vtable[] = {
4906     (vtable_ptr)THISCALL_NAME(MSVCP_locale__Locimp_vector_dtor)
4907 };
4908
4909 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
4910 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
4911 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
4912 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
4913 {
4914     TRACE("(%p %p)\n", this, locimp);
4915     /* Don't change locimp reference counter */
4916     this->ptr = locimp;
4917     return this;
4918 }
4919
4920 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
4921 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
4922 locale__Locimp* __cdecl locale__Init(void)
4923 {
4924     _Lockit lock;
4925
4926     TRACE("\n");
4927
4928     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4929     if(global_locale) {
4930         _Lockit_dtor(&lock);
4931         return global_locale;
4932     }
4933
4934     global_locale = MSVCRT_operator_new(sizeof(locale__Locimp));
4935     if(!global_locale) {
4936         _Lockit_dtor(&lock);
4937         ERR("Out of memory\n");
4938         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4939         return NULL;
4940     }
4941
4942     locale__Locimp_ctor(global_locale);
4943     global_locale->catmask = (1<<(LC_MAX+1))-1;
4944     MSVCP_basic_string_char_dtor(&global_locale->name);
4945     MSVCP_basic_string_char_ctor_cstr(&global_locale->name, "C");
4946
4947     locale__Locimp__Clocptr = global_locale;
4948     global_locale->facet.refs++;
4949     locale_ctor_locimp(&classic_locale, locale__Locimp__Clocptr);
4950     _Lockit_dtor(&lock);
4951
4952     return global_locale;
4953 }
4954
4955 /* ??0locale@std@@QAE@ABV01@0H@Z */
4956 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
4957 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
4958 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
4959 {
4960     FIXME("(%p %p %p %d) stub\n", this, loc, other, cat);
4961     return NULL;
4962 }
4963
4964 /* ??0locale@std@@QAE@ABV01@@Z */
4965 /* ??0locale@std@@QEAA@AEBV01@@Z */
4966 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
4967 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
4968 {
4969     TRACE("(%p %p)\n", this, copy);
4970     this->ptr = copy->ptr;
4971     locale_facet__Incref(&this->ptr->facet);
4972     return this;
4973 }
4974
4975 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
4976 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
4977 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
4978 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
4979 {
4980     FIXME("(%p %p %s %d) stub\n", this, loc, locname, cat);
4981     return NULL;
4982 }
4983
4984 /* ??0locale@std@@QAE@PBDH@Z */
4985 /* ??0locale@std@@QEAA@PEBDH@Z */
4986 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
4987 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
4988 {
4989     FIXME("(%p %s %d) stub\n", this, locname, cat);
4990     return NULL;
4991 }
4992
4993 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
4994 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
4995 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
4996 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
4997 {
4998     TRACE("(%p)\n", this);
4999     this->ptr = NULL;
5000     return this;
5001 }
5002
5003 /* ??0locale@std@@QAE@XZ */
5004 /* ??0locale@std@@QEAA@XZ */
5005 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
5006 locale* __thiscall locale_ctor(locale *this)
5007 {
5008     TRACE("(%p)\n", this);
5009     this->ptr = locale__Init();
5010     locale_facet__Incref(&this->ptr->facet);
5011     return this;
5012 }
5013
5014 /* ??1locale@std@@QAE@XZ */
5015 /* ??1locale@std@@QEAA@XZ */
5016 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
5017 void __thiscall locale_dtor(locale *this)
5018 {
5019     TRACE("(%p)\n", this);
5020     if(this->ptr)
5021         locale__Locimp_dtor(this->ptr);
5022 }
5023
5024 DEFINE_THISCALL_WRAPPER(MSVCP_locale_vector_dtor, 8)
5025 locale* __thiscall MSVCP_locale_vector_dtor(locale *this, unsigned int flags)
5026 {
5027     TRACE("(%p %x)\n", this, flags);
5028     if(flags & 2) {
5029         /* we have an array, with the number of elements stored before the first object */
5030         int i, *ptr = (int *)this-1;
5031
5032         for(i=*ptr-1; i>=0; i--)
5033             locale_dtor(this+i);
5034         MSVCRT_operator_delete(ptr);
5035     } else {
5036         locale_dtor(this);
5037         if(flags & 1)
5038             MSVCRT_operator_delete(this);
5039     }
5040
5041     return this;
5042 }
5043
5044 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
5045 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
5046 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
5047 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
5048 {
5049     FIXME("(%p %p) stub\n", this, loc);
5050     return NULL;
5051 }
5052
5053 /* ??8locale@std@@QBE_NABV01@@Z */
5054 /* ??8locale@std@@QEBA_NAEBV01@@Z */
5055 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
5056 MSVCP_bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
5057 {
5058     FIXME("(%p %p) stub\n", this, loc);
5059     return 0;
5060 }
5061
5062 /* ??9locale@std@@QBE_NABV01@@Z */
5063 /* ??9locale@std@@QEBA_NAEBV01@@Z */
5064 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
5065 MSVCP_bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
5066 {
5067     FIXME("(%p %p) stub\n", this, loc);
5068     return 0;
5069 }
5070
5071 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
5072 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
5073 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
5074 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, MSVCP_size_t id, MSVCP_size_t catmask)
5075 {
5076     TRACE("(%p %p %lu %lu)\n", this, facet, id, catmask);
5077
5078     if(this->ptr->facet.refs > 1) {
5079         locale__Locimp *new_ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
5080         if(!new_ptr) {
5081             ERR("Out of memory\n");
5082             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
5083             return NULL;
5084         }
5085         locale__Locimp_copy_ctor(new_ptr, this->ptr);
5086         locale_facet__Decref(&this->ptr->facet);
5087         this->ptr = new_ptr;
5088     }
5089
5090     locale__Locimp__Addfac(this->ptr, facet, id);
5091
5092     if(catmask) {
5093         MSVCP_basic_string_char_dtor(&this->ptr->name);
5094         MSVCP_basic_string_char_ctor_cstr(&this->ptr->name, "*");
5095     }
5096     return this;
5097 }
5098
5099 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
5100 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
5101 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
5102 const locale_facet* __thiscall locale__Getfacet(const locale *this, MSVCP_size_t id)
5103 {
5104     locale_facet *fac;
5105
5106     TRACE("(%p %lu)\n", this, id);
5107
5108     fac = id < this->ptr->facet_cnt ? this->ptr->facetvec[id] : NULL;
5109     if(fac || !this->ptr->transparent)
5110         return fac;
5111
5112     return id < global_locale->facet_cnt ? global_locale->facetvec[id] : NULL;
5113 }
5114
5115 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
5116 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
5117 locale__Locimp* __cdecl locale__Getgloballocale(void)
5118 {
5119     TRACE("\n");
5120     return global_locale;
5121 }
5122
5123 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
5124 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
5125 void __cdecl locale__Setgloballocale(void *locimp)
5126 {
5127     TRACE("(%p)\n", locimp);
5128     global_locale = locimp;
5129 }
5130
5131 /* ?classic@locale@std@@SAABV12@XZ */
5132 /* ?classic@locale@std@@SAAEBV12@XZ */
5133 const locale* __cdecl locale_classic(void)
5134 {
5135     TRACE("\n");
5136     locale__Init();
5137     return &classic_locale;
5138 }
5139
5140 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
5141 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
5142 DEFINE_THISCALL_WRAPPER(locale_name, 8)
5143 basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
5144 {
5145     TRACE( "(%p)\n", this);
5146     MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
5147     return ret;
5148 }
5149
5150 /* ?global@locale@std@@SA?AV12@ABV12@@Z */
5151 /* ?global@locale@std@@SA?AV12@AEBV12@@Z */
5152 locale* __cdecl locale_global(locale *ret, const locale *loc)
5153 {
5154     _Lockit lock;
5155     int i;
5156
5157     TRACE("(%p %p)\n", loc, ret);
5158
5159     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5160     locale_ctor(ret);
5161
5162     if(loc->ptr != global_locale) {
5163         locale_facet__Decref(&global_locale->facet);
5164         global_locale = loc->ptr;
5165         locale_facet__Incref(&global_locale->facet);
5166
5167         for(i=LC_ALL+1; i<=LC_MAX; i++) {
5168             if((global_locale->catmask & (1<<(i-1))) == 0)
5169                 continue;
5170             setlocale(i, MSVCP_basic_string_char_c_str(&global_locale->name));
5171         }
5172     }
5173     _Lockit_dtor(&lock);
5174     return ret;
5175 }
5176
5177 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@");
5178 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@");
5179 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@");
5180 DEFINE_RTTI_DATA1(collate_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@G@std@@");
5181 DEFINE_RTTI_DATA1(ctype_base, 0, &locale_facet_rtti_base_descriptor, ".?AUctype_base@std@@");
5182 DEFINE_RTTI_DATA2(ctype_char, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@D@std@@");
5183 DEFINE_RTTI_DATA2(ctype_wchar, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@_W@std@@");
5184 DEFINE_RTTI_DATA2(ctype_short, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@G@std@@");
5185 DEFINE_RTTI_DATA1(codecvt_base, 0, &locale_facet_rtti_base_descriptor, ".?AVcodecvt_base@std@@");
5186 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDH@std@@");
5187 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDH@std@@");
5188 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDH@std@@");
5189 DEFINE_RTTI_DATA1(numpunct_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@D@std@@");
5190 DEFINE_RTTI_DATA1(numpunct_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@_W@std@@");
5191 DEFINE_RTTI_DATA1(numpunct_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@G@std@@");
5192 DEFINE_RTTI_DATA1(num_get_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@");
5193 DEFINE_RTTI_DATA1(num_get_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@");
5194 DEFINE_RTTI_DATA1(num_get_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@");
5195
5196 #ifndef __GNUC__
5197 void __asm_dummy_vtables(void) {
5198 #endif
5199     __ASM_VTABLE(locale_facet, "");
5200     __ASM_VTABLE(collate_char,
5201             VTABLE_ADD_FUNC(collate_char_do_compare)
5202             VTABLE_ADD_FUNC(collate_char_do_transform)
5203             VTABLE_ADD_FUNC(collate_char_do_hash));
5204     __ASM_VTABLE(collate_wchar,
5205             VTABLE_ADD_FUNC(collate_wchar_do_compare)
5206             VTABLE_ADD_FUNC(collate_wchar_do_transform)
5207             VTABLE_ADD_FUNC(collate_wchar_do_hash));
5208     __ASM_VTABLE(collate_short,
5209             VTABLE_ADD_FUNC(collate_wchar_do_compare)
5210             VTABLE_ADD_FUNC(collate_wchar_do_transform)
5211             VTABLE_ADD_FUNC(collate_wchar_do_hash));
5212     __ASM_VTABLE(ctype_base, "");
5213     __ASM_VTABLE(ctype_char,
5214             VTABLE_ADD_FUNC(ctype_char_do_tolower)
5215             VTABLE_ADD_FUNC(ctype_char_do_tolower_ch)
5216             VTABLE_ADD_FUNC(ctype_char_do_toupper)
5217             VTABLE_ADD_FUNC(ctype_char_do_toupper_ch)
5218             VTABLE_ADD_FUNC(ctype_char_do_widen)
5219             VTABLE_ADD_FUNC(ctype_char_do_widen_ch)
5220             VTABLE_ADD_FUNC(ctype_char__Do_widen_s)
5221             VTABLE_ADD_FUNC(ctype_char_do_narrow)
5222             VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
5223             VTABLE_ADD_FUNC(ctype_char__Do_narrow_s));
5224     __ASM_VTABLE(ctype_wchar,
5225             VTABLE_ADD_FUNC(ctype_wchar_do_is)
5226             VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
5227             VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
5228             VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
5229             VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
5230             VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
5231             VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
5232             VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
5233             VTABLE_ADD_FUNC(ctype_wchar_do_widen)
5234             VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
5235             VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
5236             VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
5237             VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
5238             VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s));
5239     __ASM_VTABLE(ctype_short,
5240             VTABLE_ADD_FUNC(ctype_wchar_do_is)
5241             VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
5242             VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
5243             VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
5244             VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
5245             VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
5246             VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
5247             VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
5248             VTABLE_ADD_FUNC(ctype_wchar_do_widen)
5249             VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
5250             VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
5251             VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
5252             VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
5253             VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s));
5254     __ASM_VTABLE(codecvt_base,
5255             VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
5256             VTABLE_ADD_FUNC(codecvt_base_do_max_length)
5257             VTABLE_ADD_FUNC(codecvt_base_do_encoding));
5258     __ASM_VTABLE(codecvt_char,
5259             VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
5260             VTABLE_ADD_FUNC(codecvt_base_do_max_length)
5261             VTABLE_ADD_FUNC(codecvt_base_do_encoding)
5262             VTABLE_ADD_FUNC(codecvt_char_do_in)
5263             VTABLE_ADD_FUNC(codecvt_char_do_out)
5264             VTABLE_ADD_FUNC(codecvt_char_do_unshift)
5265             VTABLE_ADD_FUNC(codecvt_char_do_length));
5266     __ASM_VTABLE(codecvt_wchar,
5267             VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
5268             VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
5269             VTABLE_ADD_FUNC(codecvt_base_do_encoding)
5270             VTABLE_ADD_FUNC(codecvt_wchar_do_in)
5271             VTABLE_ADD_FUNC(codecvt_wchar_do_out)
5272             VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
5273             VTABLE_ADD_FUNC(codecvt_wchar_do_length));
5274     __ASM_VTABLE(codecvt_short,
5275             VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
5276             VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
5277             VTABLE_ADD_FUNC(codecvt_base_do_encoding)
5278             VTABLE_ADD_FUNC(codecvt_wchar_do_in)
5279             VTABLE_ADD_FUNC(codecvt_wchar_do_out)
5280             VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
5281             VTABLE_ADD_FUNC(codecvt_wchar_do_length));
5282     __ASM_VTABLE(numpunct_char,
5283             VTABLE_ADD_FUNC(numpunct_char_do_decimal_point)
5284             VTABLE_ADD_FUNC(numpunct_char_do_thousands_sep)
5285             VTABLE_ADD_FUNC(numpunct_char_do_grouping)
5286             VTABLE_ADD_FUNC(numpunct_char_do_falsename)
5287             VTABLE_ADD_FUNC(numpunct_char_do_truename));
5288     __ASM_VTABLE(numpunct_wchar,
5289             VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
5290             VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
5291             VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
5292             VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
5293             VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
5294     __ASM_VTABLE(numpunct_short,
5295             VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
5296             VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
5297             VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
5298             VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
5299             VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
5300     __ASM_VTABLE(num_get_char,
5301             VTABLE_ADD_FUNC(num_get_char_do_get_void)
5302             VTABLE_ADD_FUNC(num_get_char_do_get_double)
5303             VTABLE_ADD_FUNC(num_get_char_do_get_double)
5304             VTABLE_ADD_FUNC(num_get_char_do_get_float)
5305             VTABLE_ADD_FUNC(num_get_char_do_get_uint64)
5306             VTABLE_ADD_FUNC(num_get_char_do_get_int64)
5307             VTABLE_ADD_FUNC(num_get_char_do_get_ulong)
5308             VTABLE_ADD_FUNC(num_get_char_do_get_long)
5309             VTABLE_ADD_FUNC(num_get_char_do_get_uint)
5310             VTABLE_ADD_FUNC(num_get_char_do_get_ushort)
5311             VTABLE_ADD_FUNC(num_get_char_do_get_bool));
5312     __ASM_VTABLE(num_get_short,
5313             VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
5314             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5315             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5316             VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
5317             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
5318             VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
5319             VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
5320             VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
5321             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
5322             VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
5323             VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
5324     __ASM_VTABLE(num_get_wchar,
5325             VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
5326             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5327             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5328             VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
5329             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
5330             VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
5331             VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
5332             VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
5333             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
5334             VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
5335             VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
5336 #ifndef __GNUC__
5337 }
5338 #endif
5339
5340 void free_locale(void)
5341 {
5342     facets_elem *iter, *safe;
5343
5344     if(global_locale) {
5345         locale__Locimp_dtor(global_locale);
5346         locale_dtor(&classic_locale);
5347     }
5348
5349     LIST_FOR_EACH_ENTRY_SAFE(iter, safe, &lazy_facets, facets_elem, entry) {
5350         list_remove(&iter->entry);
5351         if(locale_facet__Decref(iter->fac))
5352             call_locale_facet_vector_dtor(iter->fac, 1);
5353         MSVCRT_operator_delete(iter);
5354     }
5355 }