psapi: Make sure that NtQueryVirtualMemory(MemorySectionName) succeeds under Windows...
[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
28 #include "windef.h"
29 #include "winbase.h"
30 #include "winnls.h"
31 #include "wine/unicode.h"
32 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(msvcp90);
34
35 char* __cdecl _Getdays(void);
36 char* __cdecl _Getmonths(void);
37 void* __cdecl _Gettnames(void);
38 unsigned int __cdecl ___lc_codepage_func(void);
39 LCID* __cdecl ___lc_handle_func(void);
40
41 typedef int category;
42
43 typedef struct {
44     MSVCP_size_t id;
45 } locale_id;
46
47 typedef struct {
48     const vtable_ptr *vtable;
49     MSVCP_size_t refs;
50 } locale_facet;
51
52 typedef struct _locale__Locimp {
53     locale_facet facet;
54     locale_facet **facetvec;
55     MSVCP_size_t facet_cnt;
56     category catmask;
57     MSVCP_bool transparent;
58     basic_string_char name;
59 } locale__Locimp;
60
61 typedef struct {
62     void *timeptr;
63 } _Timevec;
64
65 typedef struct {
66     _Lockit lock;
67     basic_string_char days;
68     basic_string_char months;
69     basic_string_char oldlocname;
70     basic_string_char newlocname;
71 } _Locinfo;
72
73 typedef struct {
74     LCID handle;
75     unsigned page;
76 } _Collvec;
77
78 typedef struct {
79     LCID handle;
80     unsigned page;
81     const short *table;
82     int delfl;
83 } _Ctypevec;
84
85 typedef struct {
86     LCID handle;
87     unsigned page;
88 } _Cvtvec;
89
90 typedef struct {
91     locale_facet facet;
92     _Collvec coll;
93 } collate;
94
95 typedef struct {
96     locale_facet facet;
97 } ctype_base;
98
99 typedef struct {
100     ctype_base base;
101     _Ctypevec ctype;
102 } ctype_char;
103
104 typedef struct {
105     ctype_base base;
106     _Ctypevec ctype;
107     _Cvtvec cvt;
108 } ctype_wchar;
109
110 typedef struct {
111     locale_facet facet;
112     const char *grouping;
113     char dp;
114     char sep;
115     const char *false_name;
116     const char *true_name;
117 } numpunct_char;
118
119 typedef struct {
120     locale_facet facet;
121     const char *grouping;
122     wchar_t dp;
123     wchar_t sep;
124     const wchar_t *false_name;
125     const wchar_t *true_name;
126 } numpunct_wchar;
127
128 typedef struct _num_get_char {
129     locale_facet    facet;
130     _Cvtvec         cvt;
131 } num_get_char;
132
133 typedef struct _num_get_wchar {
134     locale_facet    facet;
135     _Cvtvec         cvt;
136 } num_get_wchar;
137
138 struct _ios_base;
139 typedef struct _istreambuf_iterator_char
140 {
141     struct _basic_streambuf_char *strbuf;
142     MSVCP_bool      got;
143     char            val;
144 } istreambuf_iterator_char;
145
146 typedef struct _istreambuf_iterator_wchar
147 {
148     struct _basic_streambuf_wchar *strbuf;
149     MSVCP_bool      got;
150     wchar_t         val;
151 } istreambuf_iterator_wchar;
152
153 /* ?_Id_cnt@id@locale@std@@0HA */
154 int locale_id__Id_cnt = 0;
155
156 /* ?_Clocptr@_Locimp@locale@std@@0PAV123@A */
157 /* ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA */
158 locale__Locimp *locale__Locimp__Clocptr = NULL;
159
160 /* ??1facet@locale@std@@UAE@XZ */
161 /* ??1facet@locale@std@@UEAA@XZ */
162 DEFINE_THISCALL_WRAPPER(locale_facet_dtor, 4)
163 void __thiscall locale_facet_dtor(locale_facet *this)
164 {
165     TRACE("(%p)\n", this);
166 }
167
168 DEFINE_THISCALL_WRAPPER(MSVCP_locale_facet_vector_dtor, 8)
169 #define call_locale_facet_vector_dtor(this, flags) CALL_VTBL_FUNC(this, 0, \
170         locale_facet*, (locale_facet*, unsigned int), (this, flags))
171 locale_facet* __thiscall MSVCP_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
172 {
173     TRACE("(%p %x)\n", this, flags);
174     if(flags & 2) {
175         /* we have an array, with the number of elements stored before the first object */
176         int i, *ptr = (int *)this-1;
177
178         for(i=*ptr-1; i>=0; i--)
179             locale_facet_dtor(this+i);
180         MSVCRT_operator_delete(ptr);
181     } else {
182         locale_facet_dtor(this);
183         if(flags & 1)
184             MSVCRT_operator_delete(this);
185     }
186
187     return this;
188 }
189
190 const vtable_ptr MSVCP_locale_facet_vtable[] = {
191     (vtable_ptr)THISCALL_NAME(MSVCP_locale_facet_vector_dtor)
192 };
193
194 /* ??0id@locale@std@@QAE@I@Z */
195 /* ??0id@locale@std@@QEAA@_K@Z */
196 DEFINE_THISCALL_WRAPPER(locale_id_ctor_id, 8)
197 locale_id* __thiscall locale_id_ctor_id(locale_id *this, MSVCP_size_t id)
198 {
199     TRACE("(%p %lu)\n", this, id);
200
201     this->id = id;
202     return this;
203 }
204
205 /* ??_Fid@locale@std@@QAEXXZ */
206 /* ??_Fid@locale@std@@QEAAXXZ */
207 DEFINE_THISCALL_WRAPPER(locale_id_ctor, 4)
208 locale_id* __thiscall locale_id_ctor(locale_id *this)
209 {
210     TRACE("(%p)\n", this);
211
212     this->id = 0;
213     return this;
214 }
215
216 /* ??Bid@locale@std@@QAEIXZ */
217 /* ??Bid@locale@std@@QEAA_KXZ */
218 DEFINE_THISCALL_WRAPPER(locale_id_operator_size_t, 4)
219 MSVCP_size_t __thiscall locale_id_operator_size_t(locale_id *this)
220 {
221     _Lockit lock;
222
223     TRACE("(%p)\n", this);
224
225     if(!this->id) {
226         _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
227         this->id = ++locale_id__Id_cnt;
228         _Lockit_dtor(&lock);
229     }
230
231     return this->id;
232 }
233
234 /* ?_Id_cnt_func@id@locale@std@@CAAAHXZ */
235 /* ?_Id_cnt_func@id@locale@std@@CAAEAHXZ */
236 int* __cdecl locale_id__Id_cnt_func(void)
237 {
238     TRACE("\n");
239     return &locale_id__Id_cnt;
240 }
241
242 /* ??_Ffacet@locale@std@@QAEXXZ */
243 /* ??_Ffacet@locale@std@@QEAAXXZ */
244 DEFINE_THISCALL_WRAPPER(locale_facet_ctor, 4)
245 locale_facet* __thiscall locale_facet_ctor(locale_facet *this)
246 {
247     TRACE("(%p)\n", this);
248     this->vtable = MSVCP_locale_facet_vtable;
249     this->refs = 0;
250     return this;
251 }
252
253 /* ??0facet@locale@std@@IAE@I@Z */
254 /* ??0facet@locale@std@@IEAA@_K@Z */
255 DEFINE_THISCALL_WRAPPER(locale_facet_ctor_refs, 8)
256 locale_facet* __thiscall locale_facet_ctor_refs(locale_facet *this, MSVCP_size_t refs)
257 {
258     TRACE("(%p %lu)\n", this, refs);
259     this->vtable = MSVCP_locale_facet_vtable;
260     this->refs = refs;
261     return this;
262 }
263
264 /* ?_Incref@facet@locale@std@@QAEXXZ */
265 /* ?_Incref@facet@locale@std@@QEAAXXZ */
266 DEFINE_THISCALL_WRAPPER(locale_facet__Incref, 4)
267 void __thiscall locale_facet__Incref(locale_facet *this)
268 {
269     _Lockit lock;
270
271     TRACE("(%p)\n", this);
272
273     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
274     this->refs++;
275     _Lockit_dtor(&lock);
276 }
277
278 /* ?_Decref@facet@locale@std@@QAEPAV123@XZ */
279 /* ?_Decref@facet@locale@std@@QEAAPEAV123@XZ */
280 DEFINE_THISCALL_WRAPPER(locale_facet__Decref, 4)
281 locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
282 {
283     _Lockit lock;
284     locale_facet *ret;
285
286     TRACE("(%p)\n", this);
287
288     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
289     if(this->refs)
290         this->refs--;
291
292     ret = this->refs ? NULL : this;
293     _Lockit_dtor(&lock);
294
295     return ret;
296 }
297
298 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z */
299 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z */
300 MSVCP_size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const locale *loc)
301 {
302     TRACE("(%p %p)\n", facet, loc);
303     return -1;
304 }
305
306 /* ??0_Timevec@std@@QAE@ABV01@@Z */
307 /* ??0_Timevec@std@@QEAA@AEBV01@@Z */
308 /* This copy constructor modifies copied object */
309 DEFINE_THISCALL_WRAPPER(_Timevec_copy_ctor, 8)
310 _Timevec* __thiscall _Timevec_copy_ctor(_Timevec *this, _Timevec *copy)
311 {
312     TRACE("(%p %p)\n", this, copy);
313     this->timeptr = copy->timeptr;
314     copy->timeptr = NULL;
315     return this;
316 }
317
318 /* ??0_Timevec@std@@QAE@PAX@Z */
319 /* ??0_Timevec@std@@QEAA@PEAX@Z */
320 DEFINE_THISCALL_WRAPPER(_Timevec_ctor_timeptr, 8)
321 _Timevec* __thiscall _Timevec_ctor_timeptr(_Timevec *this, void *timeptr)
322 {
323     TRACE("(%p %p)\n", this, timeptr);
324     this->timeptr = timeptr;
325     return this;
326 }
327
328 /* ??_F_Timevec@std@@QAEXXZ */
329 /* ??_F_Timevec@std@@QEAAXXZ */
330 DEFINE_THISCALL_WRAPPER(_Timevec_ctor, 4)
331 _Timevec* __thiscall _Timevec_ctor(_Timevec *this)
332 {
333     TRACE("(%p)\n", this);
334     this->timeptr = NULL;
335     return this;
336 }
337
338 /* ??1_Timevec@std@@QAE@XZ */
339 /* ??1_Timevec@std@@QEAA@XZ */
340 DEFINE_THISCALL_WRAPPER(_Timevec_dtor, 4)
341 void __thiscall _Timevec_dtor(_Timevec *this)
342 {
343     TRACE("(%p)\n", this);
344     free(this->timeptr);
345 }
346
347 /* ??4_Timevec@std@@QAEAAV01@ABV01@@Z */
348 /* ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z */
349 DEFINE_THISCALL_WRAPPER(_Timevec_op_assign, 8)
350 _Timevec* __thiscall _Timevec_op_assign(_Timevec *this, _Timevec *right)
351 {
352     TRACE("(%p %p)\n", this, right);
353     this->timeptr = right->timeptr;
354     right->timeptr = NULL;
355     return this;
356 }
357
358 /* ?_Getptr@_Timevec@std@@QBEPAXXZ */
359 /* ?_Getptr@_Timevec@std@@QEBAPEAXXZ */
360 DEFINE_THISCALL_WRAPPER(_Timevec__Getptr, 4)
361 void* __thiscall _Timevec__Getptr(_Timevec *this)
362 {
363     TRACE("(%p)\n", this);
364     return this->timeptr;
365 }
366
367 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z */
368 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z */
369 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
370 {
371     const char *locale = NULL;
372
373     /* This function is probably modifying more global objects */
374     FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
375
376     if(!locstr)
377         throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
378
379     _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
380     MSVCP_basic_string_char_ctor_cstr(&locinfo->days, "");
381     MSVCP_basic_string_char_ctor_cstr(&locinfo->months, "");
382     MSVCP_basic_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
383
384     if(category)
385         locale = setlocale(LC_ALL, locstr);
386     else
387         locale = setlocale(LC_ALL, NULL);
388
389     if(locale)
390         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
391     else
392         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
393
394     return locinfo;
395 }
396
397 /* ??0_Locinfo@std@@QAE@HPBD@Z */
398 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
399 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
400 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
401 {
402     return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
403 }
404
405 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
406 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
407 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
408 {
409     return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
410 }
411
412 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
413 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
414 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
415 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
416 {
417     return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
418 }
419
420 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
421 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
422 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
423 {
424     return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
425 }
426
427 /* ??0_Locinfo@std@@QAE@PBD@Z */
428 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
429 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
430 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
431 {
432     return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
433 }
434
435 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
436 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
437 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
438 {
439     TRACE("(%p)\n", locinfo);
440
441     setlocale(LC_ALL, MSVCP_basic_string_char_c_str(&locinfo->oldlocname));
442     MSVCP_basic_string_char_dtor(&locinfo->days);
443     MSVCP_basic_string_char_dtor(&locinfo->months);
444     MSVCP_basic_string_char_dtor(&locinfo->oldlocname);
445     MSVCP_basic_string_char_dtor(&locinfo->newlocname);
446     _Lockit_dtor(&locinfo->lock);
447 }
448
449 /* ??_F_Locinfo@std@@QAEXXZ */
450 /* ??_F_Locinfo@std@@QEAAXXZ */
451 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
452 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
453 {
454     return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
455 }
456
457 /* ??1_Locinfo@std@@QAE@XZ */
458 /* ??1_Locinfo@std@@QEAA@XZ */
459 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
460 void __thiscall _Locinfo_dtor(_Locinfo *this)
461 {
462     _Locinfo__Locinfo_dtor(this);
463 }
464
465 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
466 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
467 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
468 {
469     const char *locale = NULL;
470
471     /* This function is probably modifying more global objects */
472     FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
473     if(!locstr)
474         throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
475
476     MSVCP_basic_string_char_dtor(&locinfo->newlocname);
477
478     if(category)
479         locale = setlocale(LC_ALL, locstr);
480     else
481         locale = setlocale(LC_ALL, NULL);
482
483     if(locale)
484         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
485     else
486         MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
487
488     return locinfo;
489 }
490
491 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
492 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
493 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
494 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
495 {
496     return _Locinfo__Locinfo_Addcats(this, category, locstr);
497 }
498
499 /* _Getcoll */
500 _Collvec __cdecl _Getcoll(void)
501 {
502     _Collvec ret;
503     _locale_t locale = _get_current_locale();
504
505     TRACE("\n");
506
507     ret.page = locale->locinfo->lc_collate_cp;
508     ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
509     _free_locale(locale);
510     return ret;
511 }
512
513 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
514 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
515 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
516 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
517 {
518     *ret = _Getcoll();
519     return ret;
520 }
521
522 /* _Getctype */
523 _Ctypevec __cdecl _Getctype(void)
524 {
525     _Ctypevec ret;
526     _locale_t locale = _get_current_locale();
527     short *table;
528
529     TRACE("\n");
530
531     ret.page = locale->locinfo->lc_codepage;
532     ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
533     ret.delfl = TRUE;
534     table = malloc(sizeof(short[256]));
535     if(!table) {
536         _free_locale(locale);
537         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
538     }
539     memcpy(table, locale->locinfo->pctype, sizeof(short[256]));
540     ret.table = table;
541     _free_locale(locale);
542     return ret;
543 }
544
545 /* ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ */
546 /* ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ */
547 DEFINE_THISCALL_WRAPPER(_Locinfo__Getctype, 8)
548 _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
549 {
550     *ret = _Getctype();
551     return ret;
552 }
553
554 /* _Getcvt */
555 _Cvtvec __cdecl _Getcvt(void)
556 {
557     _Cvtvec ret;
558     _locale_t locale = _get_current_locale();
559
560     TRACE("\n");
561
562     ret.page = locale->locinfo->lc_codepage;
563     ret.handle = locale->locinfo->lc_handle[LC_CTYPE];
564     _free_locale(locale);
565     return ret;
566 }
567
568 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
569 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
570 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
571 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
572 {
573     *ret = _Getcvt();
574     return ret;
575 }
576
577 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
578 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
579 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
580 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
581 {
582     FIXME("(%p) stub\n", this);
583     return 0;
584 }
585
586 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
587 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
588 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
589 const char* __thiscall _Locinfo__Getdays(_Locinfo *this)
590 {
591     char *days = _Getdays();
592
593     TRACE("(%p)\n", this);
594
595     if(days) {
596         MSVCP_basic_string_char_dtor(&this->days);
597         MSVCP_basic_string_char_ctor_cstr(&this->days, days);
598         free(days);
599     }
600
601     return this->days.size ? MSVCP_basic_string_char_c_str(&this->days) :
602         ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
603 }
604
605 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
606 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
607 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
608 const char* __thiscall _Locinfo__Getmonths(_Locinfo *this)
609 {
610     char *months = _Getmonths();
611
612     TRACE("(%p)\n", this);
613
614     if(months) {
615         MSVCP_basic_string_char_dtor(&this->months);
616         MSVCP_basic_string_char_ctor_cstr(&this->months, months);
617         free(months);
618     }
619
620     return this->months.size ? MSVCP_basic_string_char_c_str(&this->months) :
621         ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
622         ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
623 }
624
625 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
626 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
627 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
628 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
629 {
630     TRACE("(%p)\n", this);
631     return "false";
632 }
633
634 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
635 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
636 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
637 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
638 {
639     TRACE("(%p)\n", this);
640     return "true";
641 }
642
643 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
644 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
645 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
646 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
647 {
648     TRACE("(%p)\n", this);
649     return localeconv();
650 }
651
652 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
653 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
654 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
655 basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
656 {
657     TRACE("(%p)\n", this);
658
659     MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
660     return ret;
661 }
662
663 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
664 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
665 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
666 _Timevec*__thiscall _Locinfo__Gettnames(const _Locinfo *this, _Timevec *ret)
667 {
668     TRACE("(%p)\n", this);
669
670     _Timevec_ctor_timeptr(ret, _Gettnames());
671     return ret;
672 }
673
674 static const type_info locale_facet_type_info = {
675     MSVCP_locale_facet_vtable,
676     NULL,
677     ".?AVfacet@locale@std@@"
678 };
679
680 /* ?id@?$collate@D@std@@2V0locale@2@A */
681 locale_id collate_char_id = {0};
682
683 /* ??_7?$collate@D@std@@6B@ */
684 extern const vtable_ptr MSVCP_collate_char_vtable;
685
686 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
687 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
688 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
689 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
690 {
691     TRACE("(%p %p)\n", this, locinfo);
692     _Locinfo__Getcoll(locinfo, &this->coll);
693 }
694
695 /* ??0?$collate@D@std@@IAE@PBDI@Z */
696 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
697 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
698 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
699 {
700     _Locinfo locinfo;
701
702     TRACE("(%p %s %lu)\n", this, name, refs);
703
704     locale_facet_ctor_refs(&this->facet, refs);
705     this->facet.vtable = &MSVCP_collate_char_vtable;
706
707     _Locinfo_ctor_cstr(&locinfo, name);
708     collate_char__Init(this, &locinfo);
709     _Locinfo_dtor(&locinfo);
710     return this;
711 }
712
713 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
714 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
715 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
716 collate* __thiscall collate_char_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
717 {
718     TRACE("(%p %p %lu)\n", this, locinfo, refs);
719
720     locale_facet_ctor_refs(&this->facet, refs);
721     this->facet.vtable = &MSVCP_collate_char_vtable;
722     collate_char__Init(this, locinfo);
723     return this;
724 }
725
726 /* ??0?$collate@D@std@@QAE@I@Z */
727 /* ??0?$collate@D@std@@QEAA@_K@Z */
728 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
729 collate* __thiscall collate_char_ctor_refs(collate *this, MSVCP_size_t refs)
730 {
731     return collate_char_ctor_name(this, "C", refs);
732 }
733
734 /* ??1?$collate@D@std@@MAE@XZ */
735 /* ??1?$collate@D@std@@MEAA@XZ */
736 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
737 void __thiscall collate_char_dtor(collate *this)
738 {
739     TRACE("(%p)\n", this);
740 }
741
742 DEFINE_THISCALL_WRAPPER(MSVCP_collate_char_vector_dtor, 8)
743 collate* __thiscall MSVCP_collate_char_vector_dtor(collate *this, unsigned int flags)
744 {
745     TRACE("(%p %x)\n", this, flags);
746     if(flags & 2) {
747         /* we have an array, with the number of elements stored before the first object */
748         int i, *ptr = (int *)this-1;
749
750         for(i=*ptr-1; i>=0; i--)
751             collate_char_dtor(this+i);
752         MSVCRT_operator_delete(ptr);
753     } else {
754         collate_char_dtor(this);
755         if(flags & 1)
756             MSVCRT_operator_delete(this);
757     }
758
759     return this;
760 }
761
762 /* ??_F?$collate@D@std@@QAEXXZ */
763 /* ??_F?$collate@D@std@@QEAAXXZ */
764 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
765 collate* __thiscall collate_char_ctor(collate *this)
766 {
767     return collate_char_ctor_name(this, "C", 0);
768 }
769
770 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
771 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
772 MSVCP_size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale *loc)
773 {
774     TRACE("(%p %p)\n", facet, loc);
775
776     if(facet && !*facet) {
777         *facet = MSVCRT_operator_new(sizeof(collate));
778         if(!*facet) {
779             ERR("Out of memory\n");
780             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
781             return 0;
782         }
783         collate_char_ctor_name((collate*)*facet,
784                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0);
785     }
786
787     return LC_COLLATE;
788 }
789
790 /* _Strcoll */
791 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
792         const char *last2, const _Collvec *coll)
793 {
794     LCID lcid;
795
796     TRACE("(%s %s)\n", debugstr_an(first1, last1-first1), debugstr_an(first2, last2-first2));
797
798     if(coll)
799         lcid = coll->handle;
800     else
801         lcid = ___lc_handle_func()[LC_COLLATE];
802     return CompareStringA(lcid, 0, first1, last1-first1, first2, last2-first2)-2;
803 }
804
805 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
806 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
807 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
808 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
809         (const collate*, const char*, const char*, const char*, const char*), \
810         (this, first1, last1, first2, last2))
811 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
812         const char *last1, const char *first2, const char *last2)
813 {
814     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
815     return _Strcoll(first1, last1, first2, last2, &this->coll);
816 }
817
818 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
819 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
820 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
821 int __thiscall collate_char_compare(const collate *this, const char *first1,
822         const char *last1, const char *first2, const char *last2)
823 {
824     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
825     return call_collate_char_do_compare(this, first1, last1, first2, last2);
826 }
827
828 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
829 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
830 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
831 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
832         (const collate*, const char*, const char*), (this, first, last))
833 LONG __thiscall collate_char_do_hash(const collate *this,
834         const char *first, const char *last)
835 {
836     ULONG ret = 0;
837
838     TRACE("(%p %p %p)\n", this, first, last);
839
840     for(; first<last; first++)
841         ret = (ret<<8 | ret>>24) + *first;
842     return ret;
843 }
844
845 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
846 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
847 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
848 LONG __thiscall collate_char_hash(const collate *this,
849         const char *first, const char *last)
850 {
851     TRACE("(%p %p %p)\n", this, first, last);
852     return call_collate_char_do_hash(this, first, last);
853 }
854
855 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
856 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
857 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
858 basic_string_char* __thiscall collate_char_do_transform(const collate *this,
859         basic_string_char *ret, const char *first, const char *last)
860 {
861     FIXME("(%p %p %p) stub\n", this, first, last);
862     return ret;
863 }
864
865 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
866 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
867 DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
868 basic_string_char* __thiscall collate_char_transform(const collate *this,
869         basic_string_char *ret, const char *first, const char *last)
870 {
871     FIXME("(%p %p %p) stub\n", this, first, last);
872     return ret;
873 }
874
875 /* ?id@?$collate@_W@std@@2V0locale@2@A */
876 locale_id collate_wchar_id = {0};
877 /* ?id@?$collate@G@std@@2V0locale@2@A */
878 locale_id collate_short_id = {0};
879
880 /* ??_7?$collate@_W@std@@6B@ */
881 extern const vtable_ptr MSVCP_collate_wchar_vtable;
882 /* ??_7?$collate@G@std@@6B@ */
883 extern const vtable_ptr MSVCP_collate_short_vtable;
884
885 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
886 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
887 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
888 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
889 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
890 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
891 {
892     TRACE("(%p %p)\n", this, locinfo);
893     _Locinfo__Getcoll(locinfo, &this->coll);
894 }
895
896 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
897 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
898 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
899 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
900 {
901     _Locinfo locinfo;
902
903     TRACE("(%p %s %lu)\n", this, name, refs);
904
905     locale_facet_ctor_refs(&this->facet, refs);
906     this->facet.vtable = &MSVCP_collate_wchar_vtable;
907
908     _Locinfo_ctor_cstr(&locinfo, name);
909     collate_wchar__Init(this, &locinfo);
910     _Locinfo_dtor(&locinfo);
911     return this;
912 }
913
914 /* ??0?$collate@G@std@@IAE@PBDI@Z */
915 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
916 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
917 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
918 {
919     collate *ret = collate_wchar_ctor_name(this, name, refs);
920     ret->facet.vtable = &MSVCP_collate_short_vtable;
921     return ret;
922 }
923
924 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
925 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
926 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
927 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
928 {
929     TRACE("(%p %p %lu)\n", this, locinfo, refs);
930
931     locale_facet_ctor_refs(&this->facet, refs);
932     this->facet.vtable = &MSVCP_collate_wchar_vtable;
933     collate_wchar__Init(this, locinfo);
934     return this;
935 }
936
937 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
938 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
939 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
940 collate* __thiscall collate_short_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
941 {
942     collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
943     ret->facet.vtable = &MSVCP_collate_short_vtable;
944     return ret;
945 }
946
947 /* ??0?$collate@_W@std@@QAE@I@Z */
948 /* ??0?$collate@_W@std@@QEAA@_K@Z */
949 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
950 collate* __thiscall collate_wchar_ctor_refs(collate *this, MSVCP_size_t refs)
951 {
952     return collate_wchar_ctor_name(this, "C", refs);
953 }
954
955 /* ??0?$collate@G@std@@QAE@I@Z */
956 /* ??0?$collate@G@std@@QEAA@_K@Z */
957 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
958 collate* __thiscall collate_short_ctor_refs(collate *this, MSVCP_size_t refs)
959 {
960     collate *ret = collate_wchar_ctor_refs(this, refs);
961     ret->facet.vtable = &MSVCP_collate_short_vtable;
962     return ret;
963 }
964
965 /* ??1?$collate@_W@std@@MAE@XZ */
966 /* ??1?$collate@_W@std@@MEAA@XZ */
967 /* ??1?$collate@G@std@@MAE@XZ */
968 /* ??1?$collate@G@std@@MEAA@XZ */
969 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
970 void __thiscall collate_wchar_dtor(collate *this)
971 {
972     TRACE("(%p)\n", this);
973 }
974
975 DEFINE_THISCALL_WRAPPER(MSVCP_collate_wchar_vector_dtor, 8)
976 collate* __thiscall MSVCP_collate_wchar_vector_dtor(collate *this, unsigned int flags)
977 {
978     TRACE("(%p %x)\n", this, flags);
979     if(flags & 2) {
980         /* we have an array, with the number of elements stored before the first object */
981         int i, *ptr = (int *)this-1;
982
983         for(i=*ptr-1; i>=0; i--)
984             collate_wchar_dtor(this+i);
985         MSVCRT_operator_delete(ptr);
986     } else {
987         collate_wchar_dtor(this);
988         if(flags & 1)
989             MSVCRT_operator_delete(this);
990     }
991
992     return this;
993 }
994
995 DEFINE_THISCALL_WRAPPER(MSVCP_collate_short_vector_dtor, 8)
996 collate* __thiscall MSVCP_collate_short_vector_dtor(collate *this, unsigned int flags)
997 {
998     return MSVCP_collate_wchar_vector_dtor(this, flags);
999 }
1000
1001 /* ??_F?$collate@_W@std@@QAEXXZ */
1002 /* ??_F?$collate@_W@std@@QEAAXXZ */
1003 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
1004 collate* __thiscall collate_wchar_ctor(collate *this)
1005 {
1006     return collate_wchar_ctor_name(this, "C", 0);
1007 }
1008
1009 /* ??_F?$collate@G@std@@QAEXXZ */
1010 /* ??_F?$collate@G@std@@QEAAXXZ */
1011 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
1012 collate* __thiscall collate_short_ctor(collate *this)
1013 {
1014     collate *ret = collate_wchar_ctor(this);
1015     ret->facet.vtable = &MSVCP_collate_short_vtable;
1016     return ret;
1017 }
1018
1019 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1020 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1021 MSVCP_size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale *loc)
1022 {
1023     TRACE("(%p %p)\n", facet, loc);
1024
1025     if(facet && !*facet) {
1026         *facet = MSVCRT_operator_new(sizeof(collate));
1027         if(!*facet) {
1028             ERR("Out of memory\n");
1029             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1030             return 0;
1031         }
1032         collate_wchar_ctor_name((collate*)*facet,
1033                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0);
1034     }
1035
1036     return LC_COLLATE;
1037 }
1038
1039 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1040 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1041 MSVCP_size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
1042 {
1043     if(facet && !*facet) {
1044         collate_wchar__Getcat(facet, loc);
1045         (*(locale_facet**)facet)->vtable = &MSVCP_collate_short_vtable;
1046     }
1047
1048     return LC_COLLATE;
1049 }
1050
1051 /* _Wcscoll */
1052 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
1053         const wchar_t *last2, const _Collvec *coll)
1054 {
1055     LCID lcid;
1056
1057     TRACE("(%s %s)\n", debugstr_wn(first1, last1-first1), debugstr_wn(first2, last2-first2));
1058
1059     if(coll)
1060         lcid = coll->handle;
1061     else
1062         lcid = ___lc_handle_func()[LC_COLLATE];
1063     return CompareStringW(lcid, 0, first1, last1-first1, first2, last2-first2)-2;
1064 }
1065
1066 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
1067 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
1068 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
1069 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
1070 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
1071 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1072         (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1073         (this, first1, last1, first2, last2))
1074 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
1075         const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1076 {
1077     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1078     return _Wcscoll(first1, last1, first2, last2, &this->coll);
1079 }
1080
1081 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
1082 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
1083 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
1084 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
1085 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
1086 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
1087         const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1088 {
1089     TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1090     return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
1091 }
1092
1093 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
1094 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
1095 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
1096 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
1097 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
1098 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1099         (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1100 LONG __thiscall collate_wchar_do_hash(const collate *this,
1101         const wchar_t *first, const wchar_t *last)
1102 {
1103     ULONG ret = 0;
1104
1105     TRACE("(%p %p %p)\n", this, first, last);
1106
1107     for(; first<last; first++)
1108         ret = (ret<<8 | ret>>24) + *first;
1109     return ret;
1110 }
1111
1112 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
1113 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
1114 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
1115 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
1116 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
1117 LONG __thiscall collate_wchar_hash(const collate *this,
1118         const wchar_t *first, const wchar_t *last)
1119 {
1120     TRACE("(%p %p %p)\n", this, first, last);
1121     return call_collate_wchar_do_hash(this, first, last);
1122 }
1123
1124 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1125 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1126 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1127 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1128 DEFINE_THISCALL_WRAPPER(collate_wchar_do_transform, 16)
1129 basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
1130         basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1131 {
1132     FIXME("(%p %p %p) stub\n", this, first, last);
1133     return ret;
1134 }
1135
1136 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1137 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1138 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1139 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1140 DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
1141 basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
1142         basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1143 {
1144     FIXME("(%p %p %p) stub\n", this, first, last);
1145     return ret;
1146 }
1147
1148 /* ??_7ctype_base@std@@6B@ */
1149 extern const vtable_ptr MSVCP_ctype_base_vtable;
1150
1151 /* ??0ctype_base@std@@QAE@I@Z */
1152 /* ??0ctype_base@std@@QEAA@_K@Z */
1153 DEFINE_THISCALL_WRAPPER(ctype_base_ctor_refs, 8)
1154 ctype_base* __thiscall ctype_base_ctor_refs(ctype_base *this, MSVCP_size_t refs)
1155 {
1156     TRACE("(%p %lu)\n", this, refs);
1157     locale_facet_ctor_refs(&this->facet, refs);
1158     this->facet.vtable = &MSVCP_ctype_base_vtable;
1159     return this;
1160 }
1161
1162 /* ??_Fctype_base@std@@QAEXXZ */
1163 /* ??_Fctype_base@std@@QEAAXXZ */
1164 DEFINE_THISCALL_WRAPPER(ctype_base_ctor, 4)
1165 ctype_base* __thiscall ctype_base_ctor(ctype_base *this)
1166 {
1167     TRACE("(%p)\n", this);
1168     locale_facet_ctor_refs(&this->facet, 0);
1169     this->facet.vtable = &MSVCP_ctype_base_vtable;
1170     return this;
1171 }
1172
1173 /* ??1ctype_base@std@@UAE@XZ */
1174 /* ??1ctype_base@std@@UEAA@XZ */
1175 DEFINE_THISCALL_WRAPPER(ctype_base_dtor, 4)
1176 void __thiscall ctype_base_dtor(ctype_base *this)
1177 {
1178     TRACE("(%p)\n", this);
1179 }
1180
1181 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_base_vector_dtor, 8)
1182 ctype_base* __thiscall MSVCP_ctype_base_vector_dtor(ctype_base *this, unsigned int flags)
1183 {
1184     TRACE("(%p %x)\n", this, flags);
1185     if(flags & 2) {
1186         /* we have an array, with the number of elements stored before the first object */
1187         int i, *ptr = (int *)this-1;
1188
1189         for(i=*ptr-1; i>=0; i--)
1190             ctype_base_dtor(this+i);
1191         MSVCRT_operator_delete(ptr);
1192     } else {
1193         ctype_base_dtor(this);
1194         if(flags & 1)
1195             MSVCRT_operator_delete(this);
1196     }
1197
1198     return this;
1199 }
1200
1201 /* ?_Xran@ctype_base@std@@KAXXZ */
1202 void __cdecl ctype_base__Xran(void)
1203 {
1204     throw_exception(EXCEPTION_OUT_OF_RANGE, "out of range in ctype<T>");
1205 }
1206
1207 /* ?id@?$ctype@D@std@@2V0locale@2@A */
1208 locale_id ctype_char_id = {0};
1209 /* ?table_size@?$ctype@D@std@@2IB */
1210 /* ?table_size@?$ctype@D@std@@2_KB */
1211 MSVCP_size_t ctype_char_table_size = 256;
1212
1213 /* ??_7?$ctype@D@std@@6B@ */
1214 extern const vtable_ptr MSVCP_ctype_char_vtable;
1215
1216 /* ?_Id_func@?$ctype@D@std@@SAAAVid@locale@2@XZ */
1217 /* ?_Id_func@?$ctype@D@std@@SAAEAVid@locale@2@XZ */
1218 locale_id* __cdecl ctype_char__Id_func(void)
1219 {
1220     TRACE("()\n");
1221     return &ctype_char_id;
1222 }
1223
1224 /* ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z */
1225 /* ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z */
1226 DEFINE_THISCALL_WRAPPER(ctype_char__Init, 8)
1227 void __thiscall ctype_char__Init(ctype_char *this, _Locinfo *locinfo)
1228 {
1229     TRACE("(%p %p)\n", this, locinfo);
1230     _Locinfo__Getctype(locinfo, &this->ctype);
1231 }
1232
1233 /* ?_Tidy@?$ctype@D@std@@IAEXXZ */
1234 /* ?_Tidy@?$ctype@D@std@@IEAAXXZ */
1235 DEFINE_THISCALL_WRAPPER(ctype_char__Tidy, 4)
1236 void __thiscall ctype_char__Tidy(ctype_char *this)
1237 {
1238     TRACE("(%p)\n", this);
1239
1240     if(this->ctype.delfl)
1241         free((short*)this->ctype.table);
1242 }
1243
1244 /* ?classic_table@?$ctype@D@std@@KAPBFXZ */
1245 /* ?classic_table@?$ctype@D@std@@KAPEBFXZ */
1246 const short* __cdecl ctype_char_classic_table(void)
1247 {
1248     TRACE("()\n");
1249     return &((short*)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "_ctype"))[1];
1250 }
1251
1252 /* ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z */
1253 /* ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1254 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_locinfo, 12)
1255 ctype_char* __thiscall ctype_char_ctor_locinfo(ctype_char *this,
1256         _Locinfo *locinfo, MSVCP_size_t refs)
1257 {
1258     TRACE("(%p %p %lu)\n", this, locinfo, refs);
1259     ctype_base_ctor_refs(&this->base, refs);
1260     this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1261     ctype_char__Init(this, locinfo);
1262     return this;
1263 }
1264
1265 /* ??0?$ctype@D@std@@QAE@PBF_NI@Z */
1266 /* ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z */
1267 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_table, 16)
1268 ctype_char* __thiscall ctype_char_ctor_table(ctype_char *this,
1269         const short *table, MSVCP_bool delete, MSVCP_size_t refs)
1270 {
1271     _Locinfo locinfo;
1272
1273     TRACE("(%p %p %d %lu)\n", this, table, delete, refs);
1274
1275     ctype_base_ctor_refs(&this->base, refs);
1276     this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1277
1278     _Locinfo_ctor(&locinfo);
1279     ctype_char__Init(this, &locinfo);
1280     _Locinfo_dtor(&locinfo);
1281
1282     if(table) {
1283         ctype_char__Tidy(this);
1284         this->ctype.table = table;
1285         this->ctype.delfl = delete;
1286     }
1287     return this;
1288 }
1289
1290 /* ??_F?$ctype@D@std@@QAEXXZ */
1291 /* ??_F?$ctype@D@std@@QEAAXXZ */
1292 DEFINE_THISCALL_WRAPPER(ctype_char_ctor, 4)
1293 ctype_char* __thiscall ctype_char_ctor(ctype_char *this)
1294 {
1295     return ctype_char_ctor_table(this, NULL, FALSE, 0);
1296 }
1297
1298 /* ??1?$ctype@D@std@@MAE@XZ */
1299 /* ??1?$ctype@D@std@@MEAA@XZ */
1300 DEFINE_THISCALL_WRAPPER(ctype_char_dtor, 4)
1301 void __thiscall ctype_char_dtor(ctype_char *this)
1302 {
1303     TRACE("(%p)\n", this);
1304     ctype_char__Tidy(this);
1305 }
1306
1307 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_char_vector_dtor, 8)
1308 ctype_char* __thiscall MSVCP_ctype_char_vector_dtor(ctype_char *this, unsigned int flags)
1309 {
1310     TRACE("(%p %x)\n", this, flags);
1311     if(flags & 2) {
1312         /* we have an array, with the number of elements stored before the first object */
1313         int i, *ptr = (int *)this-1;
1314
1315         for(i=*ptr-1; i>=0; i--)
1316             ctype_char_dtor(this+i);
1317         MSVCRT_operator_delete(ptr);
1318     } else {
1319         ctype_char_dtor(this);
1320         if(flags & 1)
1321             MSVCRT_operator_delete(this);
1322     }
1323
1324     return this;
1325 }
1326
1327 /* ?do_narrow@?$ctype@D@std@@MBEDDD@Z */
1328 /* ?do_narrow@?$ctype@D@std@@MEBADDD@Z */
1329 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow_ch, 12)
1330 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 36, \
1331         char, (const ctype_char*, char, char), (this, ch, unused))
1332 char __thiscall ctype_char_do_narrow_ch(const ctype_char *this, char ch, char unused)
1333 {
1334     TRACE("(%p %c %c)\n", this, ch, unused);
1335     return ch;
1336 }
1337
1338 /* ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z */
1339 /* ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z */
1340 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow, 20)
1341 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 32, \
1342         const char*, (const ctype_char*, const char*, const char*, char, char*), \
1343         (this, first, last, unused, dest))
1344 const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
1345         const char *first, const char *last, char unused, char *dest)
1346 {
1347     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1348     memcpy(dest, first, last-first);
1349     return last;
1350 }
1351
1352 /* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
1353 /* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
1354 DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
1355 #define call_ctype_char__Do_narrow_s(this, first, last, unused, dest, size) CALL_VTBL_FUNC(this, 40, \
1356         const char*, (const ctype_char*, const char*, const char*, char, char*, MSVCP_size_t), \
1357         (this, first, last, unused, dest, size))
1358 const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
1359         const char *last, char unused, char *dest, MSVCP_size_t size)
1360 {
1361     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1362     memcpy_s(dest, size, first, last-first);
1363     return last;
1364 }
1365
1366 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
1367 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
1368 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
1369 char __thiscall ctype_char_narrow_ch(const ctype_char *this, char ch, char dflt)
1370 {
1371     TRACE("(%p %c %c)\n", this, ch, dflt);
1372     return call_ctype_char_do_narrow_ch(this, ch, dflt);
1373 }
1374
1375 /* ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z */
1376 /* ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z */
1377 DEFINE_THISCALL_WRAPPER(ctype_char_narrow, 20)
1378 const char* __thiscall ctype_char_narrow(const ctype_char *this,
1379         const char *first, const char *last, char dflt, char *dest)
1380 {
1381     TRACE("(%p %p %p %c %p)\n", this, first, last, dflt, dest);
1382     return call_ctype_char_do_narrow(this, first, last, dflt, dest);
1383 }
1384
1385 /* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
1386 /* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
1387 DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
1388 const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
1389         const char *last, char dflt, char *dest, MSVCP_size_t size)
1390 {
1391     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1392     return call_ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
1393 }
1394
1395 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
1396 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
1397 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
1398 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
1399         char, (const ctype_char*, char), (this, ch))
1400 char __thiscall ctype_char_do_widen_ch(const ctype_char *this, char ch)
1401 {
1402     TRACE("(%p %c)\n", this, ch);
1403     return ch;
1404 }
1405
1406 /* ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z */
1407 /* ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z */
1408 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen, 16)
1409 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 20, \
1410         const char*, (const ctype_char*, const char*, const char*, char*), \
1411         (this, first, last, dest))
1412 const char* __thiscall ctype_char_do_widen(const ctype_char *this,
1413         const char *first, const char *last, char *dest)
1414 {
1415     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1416     memcpy(dest, first, last-first);
1417     return last;
1418 }
1419
1420 /* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
1421 /* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
1422 DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
1423 #define call_ctype_char__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 28, \
1424         const char*, (const ctype_char*, const char*, const char*, char*, MSVCP_size_t), \
1425         (this, first, last, dest, size))
1426 const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
1427         const char *first, const char *last, char *dest, MSVCP_size_t size)
1428 {
1429     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1430     memcpy_s(dest, size, first, last-first);
1431     return last;
1432 }
1433
1434 /* ?widen@?$ctype@D@std@@QBEDD@Z */
1435 /* ?widen@?$ctype@D@std@@QEBADD@Z */
1436 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
1437 char __thiscall ctype_char_widen_ch(const ctype_char *this, char ch)
1438 {
1439     TRACE("(%p %c)\n", this, ch);
1440     return call_ctype_char_do_widen_ch(this, ch);
1441 }
1442
1443 /* ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z */
1444 /* ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z */
1445 DEFINE_THISCALL_WRAPPER(ctype_char_widen, 16)
1446 const char* __thiscall ctype_char_widen(const ctype_char *this,
1447         const char *first, const char *last, char *dest)
1448 {
1449     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1450     return call_ctype_char_do_widen(this, first, last, dest);
1451 }
1452
1453 /* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
1454 /* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
1455 DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
1456 const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
1457         const char *first, const char *last, char *dest, MSVCP_size_t size)
1458 {
1459     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1460     return call_ctype_char__Do_widen_s(this, first, last, dest, size);
1461 }
1462
1463 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1464 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1465 MSVCP_size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
1466 {
1467     TRACE("(%p %p)\n", facet, loc);
1468
1469     if(facet && !*facet) {
1470         _Locinfo locinfo;
1471
1472         *facet = MSVCRT_operator_new(sizeof(ctype_char));
1473         if(!*facet) {
1474             ERR("Out of memory\n");
1475             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1476             return 0;
1477         }
1478
1479         _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
1480         ctype_char_ctor_locinfo((ctype_char*)*facet, &locinfo, 0);
1481         _Locinfo_dtor(&locinfo);
1482     }
1483
1484     return LC_CTYPE;
1485 }
1486
1487 /* _Tolower */
1488 int __cdecl _Tolower(int ch, const _Ctypevec *ctype)
1489 {
1490     unsigned int cp;
1491
1492     TRACE("%d %p\n", ch, ctype);
1493
1494     if(ctype)
1495         cp = ctype->page;
1496     else
1497         cp = ___lc_codepage_func();
1498
1499     /* Don't convert to unicode in case of C locale */
1500     if(!cp) {
1501         if(ch>='A' && ch<='Z')
1502             ch = ch-'A'+'a';
1503         return ch;
1504     } else {
1505         WCHAR wide, lower;
1506         char str[2];
1507         int size;
1508
1509         if(ch > 255) {
1510             str[0] = (ch>>8) & 255;
1511             str[1] = ch & 255;
1512             size = 2;
1513         } else {
1514             str[0] = ch & 255;
1515             size = 1;
1516         }
1517
1518         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1519             return ch;
1520
1521         lower = tolowerW(wide);
1522         if(lower == wide)
1523             return ch;
1524
1525         WideCharToMultiByte(cp, 0, &lower, 1, str, 2, NULL, NULL);
1526
1527         return str[0] + (str[1]<<8);
1528     }
1529 }
1530
1531 /* ?do_tolower@?$ctype@D@std@@MBEDD@Z */
1532 /* ?do_tolower@?$ctype@D@std@@MEBADD@Z */
1533 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 8, \
1534         char, (const ctype_char*, char), (this, ch))
1535 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower_ch, 8)
1536 char __thiscall ctype_char_do_tolower_ch(const ctype_char *this, char ch)
1537 {
1538     TRACE("(%p %c)\n", this, ch);
1539     return _Tolower(ch, &this->ctype);
1540 }
1541
1542 /* ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z */
1543 /* ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
1544 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 4, \
1545         const char*, (const ctype_char*, char*, const char*), (this, first, last))
1546 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower, 12)
1547 const char* __thiscall ctype_char_do_tolower(const ctype_char *this, char *first, const char *last)
1548 {
1549     TRACE("(%p %p %p)\n", this, first, last);
1550     for(; first<last; first++)
1551         *first = _Tolower(*first, &this->ctype);
1552     return last;
1553 }
1554
1555 /* ?tolower@?$ctype@D@std@@QBEDD@Z */
1556 /* ?tolower@?$ctype@D@std@@QEBADD@Z */
1557 DEFINE_THISCALL_WRAPPER(ctype_char_tolower_ch, 8)
1558 char __thiscall ctype_char_tolower_ch(const ctype_char *this, char ch)
1559 {
1560     TRACE("(%p %c)\n", this, ch);
1561     return call_ctype_char_do_tolower_ch(this, ch);
1562 }
1563
1564 /* ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z */
1565 /* ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
1566 DEFINE_THISCALL_WRAPPER(ctype_char_tolower, 12)
1567 const char* __thiscall ctype_char_tolower(const ctype_char *this, char *first, const char *last)
1568 {
1569     TRACE("(%p %p %p)\n", this, first, last);
1570     return call_ctype_char_do_tolower(this, first, last);
1571 }
1572
1573 /* _Toupper */
1574 int __cdecl _Toupper(int ch, const _Ctypevec *ctype)
1575 {
1576     unsigned int cp;
1577
1578     TRACE("%d %p\n", ch, ctype);
1579
1580     if(ctype)
1581         cp = ctype->page;
1582     else
1583         cp = ___lc_codepage_func();
1584
1585     /* Don't convert to unicode in case of C locale */
1586     if(!cp) {
1587         if(ch>='a' && ch<='z')
1588             ch = ch-'a'+'A';
1589         return ch;
1590     } else {
1591         WCHAR wide, upper;
1592         char str[2];
1593         int size;
1594
1595         if(ch > 255) {
1596             str[0] = (ch>>8) & 255;
1597             str[1] = ch & 255;
1598             size = 2;
1599         } else {
1600             str[0] = ch & 255;
1601             size = 1;
1602         }
1603
1604         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1605             return ch;
1606
1607         upper = toupperW(wide);
1608         if(upper == wide)
1609             return ch;
1610
1611         WideCharToMultiByte(cp, 0, &upper, 1, str, 2, NULL, NULL);
1612
1613         return str[0] + (str[1]<<8);
1614     }
1615 }
1616
1617 /* ?do_toupper@?$ctype@D@std@@MBEDD@Z */
1618 /* ?do_toupper@?$ctype@D@std@@MEBADD@Z */
1619 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
1620         char, (const ctype_char*, char), (this, ch))
1621 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper_ch, 8)
1622 char __thiscall ctype_char_do_toupper_ch(const ctype_char *this, char ch)
1623 {
1624     TRACE("(%p %c)\n", this, ch);
1625     return _Toupper(ch, &this->ctype);
1626 }
1627
1628 /* ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z */
1629 /* ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
1630 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 12, \
1631         const char*, (const ctype_char*, char*, const char*), (this, first, last))
1632 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper, 12)
1633 const char* __thiscall ctype_char_do_toupper(const ctype_char *this,
1634         char *first, const char *last)
1635 {
1636     TRACE("(%p %p %p)\n", this, first, last);
1637     for(; first<last; first++)
1638         *first = _Toupper(*first, &this->ctype);
1639     return last;
1640 }
1641
1642 /* ?toupper@?$ctype@D@std@@QBEDD@Z */
1643 /* ?toupper@?$ctype@D@std@@QEBADD@Z */
1644 DEFINE_THISCALL_WRAPPER(ctype_char_toupper_ch, 8)
1645 char __thiscall ctype_char_toupper_ch(const ctype_char *this, char ch)
1646 {
1647     TRACE("(%p %c)\n", this, ch);
1648     return call_ctype_char_do_toupper_ch(this, ch);
1649 }
1650
1651 /* ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z */
1652 /* ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
1653 DEFINE_THISCALL_WRAPPER(ctype_char_toupper, 12)
1654 const char* __thiscall ctype_char_toupper(const ctype_char *this, char *first, const char *last)
1655 {
1656     TRACE("(%p %p %p)\n", this, first, last);
1657     return call_ctype_char_do_toupper(this, first, last);
1658 }
1659
1660 /* ?is@?$ctype@D@std@@QBE_NFD@Z */
1661 /* ?is@?$ctype@D@std@@QEBA_NFD@Z */
1662 DEFINE_THISCALL_WRAPPER(ctype_char_is_ch, 12)
1663 MSVCP_bool __thiscall ctype_char_is_ch(const ctype_char *this, short mask, char ch)
1664 {
1665     TRACE("(%p %x %c)\n", this, mask, ch);
1666     return (this->ctype.table[(unsigned char)ch] & mask) != 0;
1667 }
1668
1669 /* ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z */
1670 /* ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z */
1671 DEFINE_THISCALL_WRAPPER(ctype_char_is, 16)
1672 const char* __thiscall ctype_char_is(const ctype_char *this, const char *first, const char *last, short *dest)
1673 {
1674     TRACE("(%p %p %p %p)\n", this, first, last, dest);
1675     for(; first<last; first++)
1676         *dest++ = this->ctype.table[(unsigned char)*first];
1677     return last;
1678 }
1679
1680 /* ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z */
1681 /* ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
1682 DEFINE_THISCALL_WRAPPER(ctype_char_scan_is, 16)
1683 const char* __thiscall ctype_char_scan_is(const ctype_char *this, short mask, const char *first, const char *last)
1684 {
1685     TRACE("(%p %x %p %p)\n", this, mask, first, last);
1686     for(; first<last; first++)
1687         if(!ctype_char_is_ch(this, mask, *first))
1688             break;
1689     return first;
1690 }
1691
1692 /* ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z */
1693 /* ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
1694 DEFINE_THISCALL_WRAPPER(ctype_char_scan_not, 16)
1695 const char* __thiscall ctype_char_scan_not(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 /* ?table@?$ctype@D@std@@IBEPBFXZ */
1705 /* ?table@?$ctype@D@std@@IEBAPEBFXZ */
1706 DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
1707 const short* __thiscall ctype_char_table(const ctype_char *this)
1708 {
1709     TRACE("(%p)\n", this);
1710     return this->ctype.table;
1711 }
1712
1713 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
1714 locale_id ctype_wchar_id = {0};
1715 /* ?id@?$ctype@G@std@@2V0locale@2@A */
1716 locale_id ctype_short_id = {0};
1717
1718 /* ??_7?$ctype@_W@std@@6B@ */
1719 extern const vtable_ptr MSVCP_ctype_wchar_vtable;
1720 /* ??_7?$ctype@G@std@@6B@ */
1721 extern const vtable_ptr MSVCP_ctype_short_vtable;
1722
1723 /* ?_Id_func@?$ctype@_W@std@@SAAAVid@locale@2@XZ */
1724 /* ?_Id_func@?$ctype@_W@std@@SAAEAVid@locale@2@XZ */
1725 locale_id* __cdecl ctype_wchar__Id_func(void)
1726 {
1727     TRACE("()\n");
1728     return &ctype_wchar_id;
1729 }
1730
1731 /* ?_Id_func@?$ctype@G@std@@SAAAVid@locale@2@XZ */
1732 /* ?_Id_func@?$ctype@G@std@@SAAEAVid@locale@2@XZ */
1733 locale_id* __cdecl ctype_short__Id_func(void)
1734 {
1735     TRACE("()\n");
1736     return &ctype_short_id;
1737 }
1738
1739 /* ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z */
1740 /* ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
1741 /* ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z */
1742 /* ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z */
1743 DEFINE_THISCALL_WRAPPER(ctype_wchar__Init, 8)
1744 void __thiscall ctype_wchar__Init(ctype_wchar *this, _Locinfo *locinfo)
1745 {
1746     TRACE("(%p %p)\n", this, locinfo);
1747     _Locinfo__Getctype(locinfo, &this->ctype);
1748     _Locinfo__Getcvt(locinfo, &this->cvt);
1749 }
1750
1751 /* ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z */
1752 /* ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1753 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_locinfo, 12)
1754 ctype_wchar* __thiscall ctype_wchar_ctor_locinfo(ctype_wchar *this,
1755         _Locinfo *locinfo, MSVCP_size_t refs)
1756 {
1757     TRACE("(%p %p %lu)\n", this, locinfo, refs);
1758     ctype_base_ctor_refs(&this->base, refs);
1759     this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
1760     ctype_wchar__Init(this, locinfo);
1761     return this;
1762 }
1763
1764 /* ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z */
1765 /* ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1766 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_locinfo, 12)
1767 ctype_wchar* __thiscall ctype_short_ctor_locinfo(ctype_wchar *this,
1768         _Locinfo *locinfo, MSVCP_size_t refs)
1769 {
1770     ctype_wchar *ret = ctype_wchar_ctor_locinfo(this, locinfo, refs);
1771     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1772     return ret;
1773 }
1774
1775 /* ??0?$ctype@_W@std@@QAE@I@Z */
1776 /* ??0?$ctype@_W@std@@QEAA@_K@Z */
1777 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_refs, 8)
1778 ctype_wchar* __thiscall ctype_wchar_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
1779 {
1780     _Locinfo locinfo;
1781
1782     TRACE("(%p %lu)\n", this, refs);
1783
1784     ctype_base_ctor_refs(&this->base, refs);
1785     this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
1786
1787     _Locinfo_ctor(&locinfo);
1788     ctype_wchar__Init(this, &locinfo);
1789     _Locinfo_dtor(&locinfo);
1790     return this;
1791 }
1792
1793 /* ??0?$ctype@G@std@@QAE@I@Z */
1794 /* ??0?$ctype@G@std@@QEAA@_K@Z */
1795 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_refs, 8)
1796 ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
1797 {
1798     ctype_wchar *ret = ctype_wchar_ctor_refs(this, refs);
1799     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1800     return ret;
1801 }
1802
1803 /* ??0?$ctype@G@std@@IAE@PBDI@Z */
1804 /* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
1805 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
1806 ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
1807     const char *name, MSVCP_size_t refs)
1808 {
1809     _Locinfo locinfo;
1810
1811     TRACE("(%p %s %lu)\n", this, debugstr_a(name), refs);
1812
1813     ctype_base_ctor_refs(&this->base, refs);
1814     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1815
1816     _Locinfo_ctor_cstr(&locinfo, name);
1817     ctype_wchar__Init(this, &locinfo);
1818     _Locinfo_dtor(&locinfo);
1819     return this;
1820 }
1821
1822 /* ??_F?$ctype@_W@std@@QAEXXZ */
1823 /* ??_F?$ctype@_W@std@@QEAAXXZ */
1824 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
1825 ctype_wchar* __thiscall ctype_wchar_ctor(ctype_wchar *this)
1826 {
1827     TRACE("(%p)\n", this);
1828     return ctype_short_ctor_refs(this, 0);
1829 }
1830
1831 /* ??_F?$ctype@G@std@@QAEXXZ */
1832 /* ??_F?$ctype@G@std@@QEAAXXZ */
1833 DEFINE_THISCALL_WRAPPER(ctype_short_ctor, 4)
1834 ctype_wchar* __thiscall ctype_short_ctor(ctype_wchar *this)
1835 {
1836     ctype_wchar *ret = ctype_wchar_ctor(this);
1837     this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1838     return ret;
1839 }
1840
1841 /* ??1?$ctype@_W@std@@MAE@XZ */
1842 /* ??1?$ctype@_W@std@@MEAA@XZ */
1843 /* ??1?$ctype@G@std@@MAE@XZ */
1844 /* ??1?$ctype@G@std@@MEAA@XZ */
1845 DEFINE_THISCALL_WRAPPER(ctype_wchar_dtor, 4)
1846 void __thiscall ctype_wchar_dtor(ctype_wchar *this)
1847 {
1848     TRACE("(%p)\n", this);
1849     if(this->ctype.delfl)
1850         free((void*)this->ctype.table);
1851 }
1852
1853 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_wchar_vector_dtor, 8)
1854 ctype_wchar* __thiscall MSVCP_ctype_wchar_vector_dtor(ctype_wchar *this, unsigned int flags)
1855 {
1856     TRACE("(%p %x)\n", this, flags);
1857     if(flags & 2) {
1858         /* we have an array, with the number of elements stored before the first object */
1859         int i, *ptr = (int *)this-1;
1860
1861         for(i=*ptr-1; i>=0; i--)
1862             ctype_wchar_dtor(this+i);
1863         MSVCRT_operator_delete(ptr);
1864     } else {
1865         ctype_wchar_dtor(this);
1866         if(flags & 1)
1867             MSVCRT_operator_delete(this);
1868     }
1869
1870     return this;
1871 }
1872
1873 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_short_vector_dtor, 8)
1874 ctype_wchar* __thiscall MSVCP_ctype_short_vector_dtor(ctype_wchar *this, unsigned int flags)
1875 {
1876     return MSVCP_ctype_wchar_vector_dtor(this, flags);
1877 }
1878
1879 /* _Wcrtomb */
1880 int __cdecl _Wcrtomb(char *s, wchar_t wch, int *state, const _Cvtvec *cvt)
1881 {
1882     int cp, size;
1883     BOOL def;
1884
1885     TRACE("%p %d %p %p\n", s, wch, state, cvt);
1886
1887     if(cvt)
1888         cp = cvt->page;
1889     else
1890         cp = ___lc_codepage_func();
1891
1892     if(!cp) {
1893         if(wch > 255) {
1894            *_errno() = EILSEQ;
1895            return -1;
1896         }
1897
1898         *s = wch & 255;
1899         return 1;
1900     }
1901
1902     size = WideCharToMultiByte(cp, 0, &wch, 1, s, MB_LEN_MAX, NULL, &def);
1903     if(!size || def) {
1904         *_errno() = EILSEQ;
1905         return -1;
1906     }
1907
1908     return size;
1909 }
1910
1911 /* ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z */
1912 /* ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z */
1913 /* ?_Donarrow@?$ctype@G@std@@IBEDGD@Z */
1914 /* ?_Donarrow@?$ctype@G@std@@IEBADGD@Z */
1915 DEFINE_THISCALL_WRAPPER(ctype_wchar__Donarrow, 12)
1916 char __thiscall ctype_wchar__Donarrow(const ctype_wchar *this, wchar_t ch, char dflt)
1917 {
1918     char buf[MB_LEN_MAX];
1919
1920     TRACE("(%p %d %d)\n", this, ch, dflt);
1921
1922     return _Wcrtomb(buf, ch, NULL, &this->cvt)==1 ? buf[0] : dflt;
1923 }
1924
1925 /* ?do_narrow@?$ctype@_W@std@@MBED_WD@Z */
1926 /* ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z */
1927 /* ?do_narrow@?$ctype@G@std@@MBEDGD@Z */
1928 /* ?do_narrow@?$ctype@G@std@@MEBADGD@Z */
1929 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow_ch, 12)
1930 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 52, \
1931         char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
1932 char __thiscall ctype_wchar_do_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
1933 {
1934     return ctype_wchar__Donarrow(this, ch, dflt);
1935 }
1936
1937 /* ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z */
1938 /* ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z */
1939 /* ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z */
1940 /* ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z */
1941 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow, 20)
1942 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 48, \
1943         const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
1944         (this, first, last, dflt, dest))
1945 const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
1946         const wchar_t *first, const wchar_t *last, char dflt, char *dest)
1947 {
1948     TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
1949     for(; first<last; first++)
1950         *dest++ = ctype_wchar__Donarrow(this, *first, dflt);
1951     return last;
1952 }
1953
1954 /* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
1955 /* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
1956 /* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
1957 /* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
1958 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
1959 #define call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size) CALL_VTBL_FUNC(this, 56, \
1960         const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*, MSVCP_size_t), \
1961         (this, first, last, dflt, dest, size))
1962 const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
1963         const wchar_t *first, const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
1964 {
1965     TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
1966     /* This function converts all multi-byte characters to dflt,
1967      * thanks to it result size is known before converting */
1968     if(last-first > size)
1969         ctype_base__Xran();
1970     return ctype_wchar_do_narrow(this, first, last, dflt, dest);
1971 }
1972
1973 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
1974 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
1975 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
1976 /* ?narrow@?$ctype@G@std@@QEBADGD@Z */
1977 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow_ch, 12)
1978 char __thiscall ctype_wchar_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
1979 {
1980     TRACE("(%p %d %d)\n", this, ch, dflt);
1981     return call_ctype_wchar_do_narrow_ch(this, ch, dflt);
1982 }
1983
1984 /* ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z */
1985 /* ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z */
1986 /* ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z */
1987 /* ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z */
1988 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow, 20)
1989 const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
1990         const wchar_t *first, const wchar_t *last, char dflt, char *dest)
1991 {
1992     TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
1993     return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
1994 }
1995
1996 /* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
1997 /* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
1998 /* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
1999 /* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
2000 DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
2001 const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
2002         const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
2003 {
2004     TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
2005     return call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
2006 }
2007
2008 /* _Mbrtowc */
2009 int __cdecl _Mbrtowc(wchar_t *out, const char *in, MSVCP_size_t len, int *state, const _Cvtvec *cvt)
2010 {
2011     int i, cp;
2012     CPINFO cp_info;
2013     BOOL is_lead;
2014
2015     TRACE("(%p %p %lu %p %p)\n", out, in, len, state, cvt);
2016
2017     if(!len)
2018         return 0;
2019
2020     if(cvt)
2021         cp = cvt->page;
2022     else
2023         cp = ___lc_codepage_func();
2024
2025     if(!cp) {
2026         if(out)
2027             *out = (unsigned char)*in;
2028
2029         *state = 0;
2030         return *in ? 1 : 0;
2031     }
2032
2033     if(*state) {
2034         ((char*)state)[1] = *in;
2035
2036         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, (char*)state, 2, out, out ? 1 : 0)) {
2037             *state = 0;
2038             *_errno() = EILSEQ;
2039             return -1;
2040         }
2041
2042         *state = 0;
2043         return 2;
2044     }
2045
2046     GetCPInfo(cp, &cp_info);
2047     is_lead = FALSE;
2048     for(i=0; i<MAX_LEADBYTES; i+=2) {
2049         if(!cp_info.LeadByte[i+1])
2050             break;
2051         if((unsigned char)*in>=cp_info.LeadByte[i] && (unsigned char)*in<=cp_info.LeadByte[i+1]) {
2052             is_lead = TRUE;
2053             break;
2054         }
2055     }
2056
2057     if(is_lead) {
2058         if(len == 1) {
2059             *state = (unsigned char)*in;
2060             return -2;
2061         }
2062
2063         if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 2, out, out ? 1 : 0)) {
2064             *_errno() = EILSEQ;
2065             return -1;
2066         }
2067         return 2;
2068     }
2069
2070     if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 1, out, out ? 1 : 0)) {
2071         *_errno() = EILSEQ;
2072         return -1;
2073     }
2074     return 1;
2075 }
2076
2077 /* ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z */
2078 /* ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z */
2079 /* ?_Dowiden@?$ctype@G@std@@IBEGD@Z */
2080 /* ?_Dowiden@?$ctype@G@std@@IEBAGD@Z */
2081 DEFINE_THISCALL_WRAPPER(ctype_wchar__Dowiden, 8)
2082 wchar_t __thiscall ctype_wchar__Dowiden(const ctype_wchar *this, char ch)
2083 {
2084     wchar_t ret;
2085     int state = 0;
2086     TRACE("(%p %d)\n", this, ch);
2087     return _Mbrtowc(&ret, &ch, 1, &state, &this->cvt)<0 ? WEOF : ret;
2088 }
2089
2090 /* ?do_widen@?$ctype@_W@std@@MBE_WD@Z */
2091 /* ?do_widen@?$ctype@_W@std@@MEBA_WD@Z */
2092 /* ?do_widen@?$ctype@G@std@@MBEGD@Z */
2093 /* ?do_widen@?$ctype@G@std@@MEBAGD@Z */
2094 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen_ch, 8)
2095 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2096         wchar_t, (const ctype_wchar*, char), (this, ch))
2097 wchar_t __thiscall ctype_wchar_do_widen_ch(const ctype_wchar *this, char ch)
2098 {
2099     return ctype_wchar__Dowiden(this, ch);
2100 }
2101
2102 /* ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z */
2103 /* ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z */
2104 /* ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z */
2105 /* ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z */
2106 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen, 16)
2107 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 36, \
2108         const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2109         (this, first, last, dest))
2110 const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
2111         const char *first, const char *last, wchar_t *dest)
2112 {
2113     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2114     for(; first<last; first++)
2115         *dest++ = ctype_wchar__Dowiden(this, *first);
2116     return last;
2117 }
2118
2119 /* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
2120 /* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
2121 /* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
2122 /* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
2123 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
2124 #define call_ctype_wchar__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 44, \
2125         const char*, (const ctype_wchar*, const char*, const char*, wchar_t*, MSVCP_size_t), \
2126         (this, first, last, dest, size))
2127 const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
2128         const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2129 {
2130     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2131     /* This function converts all multi-byte characters to WEOF,
2132      * thanks to it result size is known before converting */
2133     if(size < last-first)
2134         ctype_base__Xran();
2135     return ctype_wchar_do_widen(this, first, last, dest);
2136 }
2137
2138 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
2139 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
2140 /* ?widen@?$ctype@G@std@@QBEGD@Z */
2141 /* ?widen@?$ctype@G@std@@QEBAGD@Z */
2142 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen_ch, 8)
2143 wchar_t __thiscall ctype_wchar_widen_ch(const ctype_wchar *this, char ch)
2144 {
2145     TRACE("(%p %d)\n", this, ch);
2146     return call_ctype_wchar_do_widen_ch(this, ch);
2147 }
2148
2149 /* ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z */
2150 /* ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z */
2151 /* ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z */
2152 /* ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z */
2153 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen, 16)
2154 const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
2155         const char *first, const char *last, wchar_t *dest)
2156 {
2157     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2158     return call_ctype_wchar_do_widen(this, first, last, dest);
2159 }
2160
2161 /* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
2162 /* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
2163 /* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
2164 /* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
2165 DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
2166 const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
2167         const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2168 {
2169     TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2170     return call_ctype_wchar__Do_widen_s(this, first, last, dest, size);
2171 }
2172
2173 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2174 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2175 MSVCP_size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
2176 {
2177     TRACE("(%p %p)\n", facet, loc);
2178
2179     if(facet && !*facet) {
2180         _Locinfo locinfo;
2181
2182         *facet = MSVCRT_operator_new(sizeof(ctype_wchar));
2183         if(!*facet) {
2184             ERR("Out of memory\n");
2185             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2186             return 0;
2187         }
2188
2189         _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
2190         ctype_wchar_ctor_locinfo((ctype_wchar*)*facet, &locinfo, 0);
2191         _Locinfo_dtor(&locinfo);
2192     }
2193
2194     return LC_CTYPE;
2195 }
2196
2197 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2198 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2199 MSVCP_size_t __cdecl ctype_short__Getcat(const locale_facet **facet, const locale *loc)
2200 {
2201     if(facet && !*facet) {
2202         ctype_wchar__Getcat(facet, loc);
2203         (*(locale_facet**)facet)->vtable = &MSVCP_ctype_short_vtable;
2204     }
2205
2206     return LC_CTYPE;
2207 }
2208
2209 /* _Towlower */
2210 wchar_t __cdecl _Towlower(wchar_t ch, const _Ctypevec *ctype)
2211 {
2212     TRACE("(%d %p)\n", ch, ctype);
2213     return tolowerW(ch);
2214 }
2215
2216 /* ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z */
2217 /* ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z */
2218 /* ?do_tolower@?$ctype@G@std@@MBEGG@Z */
2219 /* ?do_tolower@?$ctype@G@std@@MEBAGG@Z */
2220 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower_ch, 8)
2221 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2222         wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2223 wchar_t __thiscall ctype_wchar_do_tolower_ch(const ctype_wchar *this, wchar_t ch)
2224 {
2225     return _Towlower(ch, &this->ctype);
2226 }
2227
2228 /* ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2229 /* ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2230 /* ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2231 /* ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2232 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower, 12)
2233 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 20, \
2234         const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2235         (this, first, last))
2236 const wchar_t* __thiscall ctype_wchar_do_tolower(const ctype_wchar *this,
2237         wchar_t *first, const wchar_t *last)
2238 {
2239     TRACE("(%p %p %p)\n", this, first, last);
2240     for(; first<last; first++)
2241         *first = _Towlower(*first, &this->ctype);
2242     return last;
2243 }
2244
2245 /* ?tolower@?$ctype@_W@std@@QBE_W_W@Z */
2246 /* ?tolower@?$ctype@_W@std@@QEBA_W_W@Z */
2247 /* ?tolower@?$ctype@G@std@@QBEGG@Z */
2248 /* ?tolower@?$ctype@G@std@@QEBAGG@Z */
2249 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower_ch, 8)
2250 wchar_t __thiscall ctype_wchar_tolower_ch(const ctype_wchar *this, wchar_t ch)
2251 {
2252     TRACE("(%p %d)\n", this, ch);
2253     return call_ctype_wchar_do_tolower_ch(this, ch);
2254 }
2255
2256 /* ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2257 /* ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2258 /* ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2259 /* ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2260 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower, 12)
2261 const wchar_t* __thiscall ctype_wchar_tolower(const ctype_wchar *this,
2262         wchar_t *first, const wchar_t *last)
2263 {
2264     TRACE("(%p %p %p)\n", this, first, last);
2265     return call_ctype_wchar_do_tolower(this, first, last);
2266 }
2267
2268 /* _Towupper */
2269 wchar_t __cdecl _Towupper(wchar_t ch, const _Ctypevec *ctype)
2270 {
2271     TRACE("(%d %p)\n", ch, ctype);
2272     return toupperW(ch);
2273 }
2274
2275 /* ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z */
2276 /* ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z */
2277 /* ?do_toupper@?$ctype@G@std@@MBEGG@Z */
2278 /* ?do_toupper@?$ctype@G@std@@MEBAGG@Z */
2279 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper_ch, 8)
2280 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2281         wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2282 wchar_t __thiscall ctype_wchar_do_toupper_ch(const ctype_wchar *this, wchar_t ch)
2283 {
2284     return _Towupper(ch, &this->ctype);
2285 }
2286
2287 /* ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2288 /* ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2289 /* ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2290 /* ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2291 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper, 12)
2292 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 28, \
2293         const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2294         (this, first, last))
2295 const wchar_t* __thiscall ctype_wchar_do_toupper(const ctype_wchar *this,
2296         wchar_t *first, const wchar_t *last)
2297 {
2298     TRACE("(%p %p %p)\n", this, first, last);
2299     for(; first<last; first++)
2300         *first = _Towupper(*first, &this->ctype);
2301     return last;
2302 }
2303
2304 /* ?toupper@?$ctype@_W@std@@QBE_W_W@Z */
2305 /* ?toupper@?$ctype@_W@std@@QEBA_W_W@Z */
2306 /* ?toupper@?$ctype@G@std@@QBEGG@Z */
2307 /* ?toupper@?$ctype@G@std@@QEBAGG@Z */
2308 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper_ch, 8)
2309 wchar_t __thiscall ctype_wchar_toupper_ch(const ctype_wchar *this, wchar_t ch)
2310 {
2311     TRACE("(%p %d)\n", this, ch);
2312     return call_ctype_wchar_do_toupper_ch(this, ch);
2313 }
2314
2315 /* ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2316 /* ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2317 /* ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2318 /* ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2319 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper, 12)
2320 const wchar_t* __thiscall ctype_wchar_toupper(const ctype_wchar *this,
2321         wchar_t *first, const wchar_t *last)
2322 {
2323     TRACE("(%p %p %p)\n", this, first, last);
2324     return call_ctype_wchar_do_toupper(this, first, last);
2325 }
2326
2327 /* _Getwctypes */
2328 const wchar_t* __cdecl _Getwctypes(const wchar_t *first, const wchar_t *last,
2329         short *mask, const _Ctypevec *ctype)
2330 {
2331     TRACE("(%p %p %p %p)\n", first, last, mask, ctype);
2332     GetStringTypeW(CT_CTYPE1, first, last-first, (WORD*)mask);
2333     return last;
2334 }
2335
2336 /* _Getwctype */
2337 short __cdecl _Getwctype(wchar_t ch, const _Ctypevec *ctype)
2338 {
2339     short mask = 0;
2340     _Getwctypes(&ch, &ch+1, &mask, ctype);
2341     return mask;
2342 }
2343
2344 /* ?do_is@?$ctype@_W@std@@MBE_NF_W@Z */
2345 /* ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z */
2346 /* ?do_is@?$ctype@G@std@@MBE_NFG@Z */
2347 /* ?do_is@?$ctype@G@std@@MEBA_NFG@Z */
2348 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is_ch, 12)
2349 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 8, \
2350         MSVCP_bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2351 MSVCP_bool __thiscall ctype_wchar_do_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2352 {
2353     TRACE("(%p %x %d)\n", this, mask, ch);
2354     return (_Getwctype(ch, &this->ctype) & mask) != 0;
2355 }
2356
2357 /* ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z */
2358 /* ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z */
2359 /* ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z */
2360 /* ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z */
2361 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is, 16)
2362 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 4, \
2363         const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
2364         (this, first, last, dest))
2365 const wchar_t* __thiscall ctype_wchar_do_is(const ctype_wchar *this,
2366         const wchar_t *first, const wchar_t *last, short *dest)
2367 {
2368     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2369     return _Getwctypes(first, last, dest, &this->ctype);
2370 }
2371
2372 /* ?is@?$ctype@_W@std@@QBE_NF_W@Z */
2373 /* ?is@?$ctype@_W@std@@QEBA_NF_W@Z */
2374 /* ?is@?$ctype@G@std@@QBE_NFG@Z */
2375 /* ?is@?$ctype@G@std@@QEBA_NFG@Z */
2376 DEFINE_THISCALL_WRAPPER(ctype_wchar_is_ch, 12)
2377 MSVCP_bool __thiscall ctype_wchar_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2378 {
2379     TRACE("(%p %x %d)\n", this, mask, ch);
2380     return call_ctype_wchar_do_is_ch(this, mask, ch);
2381 }
2382
2383 /* ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z */
2384 /* ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z */
2385 /* ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z */
2386 /* ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z */
2387 DEFINE_THISCALL_WRAPPER(ctype_wchar_is, 16)
2388 const wchar_t* __thiscall ctype_wchar_is(const ctype_wchar *this,
2389         const wchar_t *first, const wchar_t *last, short *dest)
2390 {
2391     TRACE("(%p %p %p %p)\n", this, first, last, dest);
2392     return call_ctype_wchar_do_is(this, first, last, dest);
2393 }
2394
2395 /* ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
2396 /* ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
2397 /* ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z */
2398 /* ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
2399 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_is, 16)
2400 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 12, \
2401         const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
2402         (this, mask, first, last))
2403 const wchar_t* __thiscall ctype_wchar_do_scan_is(const ctype_wchar *this,
2404         short mask, const wchar_t *first, const wchar_t *last)
2405 {
2406     TRACE("(%p %d %p %p)\n", this, mask, first, last);
2407     for(; first<last; first++)
2408         if(!ctype_wchar_is_ch(this, mask, *first))
2409             break;
2410     return first;
2411 }
2412
2413 /* ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
2414 /* ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
2415 /* ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z */
2416 /* ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
2417 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_is, 16)
2418 const wchar_t* __thiscall ctype_wchar_scan_is(const ctype_wchar *this,
2419         short mask, const wchar_t *first, const wchar_t *last)
2420 {
2421     TRACE("(%p %x %p %p)\n", this, mask, first, last);
2422     return call_ctype_wchar_do_scan_is(this, mask, first, last);
2423 }
2424
2425 /* ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
2426 /* ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
2427 /* ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z */
2428 /* ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
2429 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_not, 16)
2430 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 16, \
2431         const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
2432         (this, mask, first, last))
2433 const wchar_t* __thiscall ctype_wchar_do_scan_not(const ctype_wchar *this,
2434         short mask, const wchar_t *first, const wchar_t *last)
2435 {
2436     TRACE("(%p %x %p %p)\n", this, mask, first, last);
2437     for(; first<last; first++)
2438         if(ctype_wchar_is_ch(this, mask, *first))
2439             break;
2440     return first;
2441 }
2442
2443 /* ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
2444 /* ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
2445 /* ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z */
2446 /* ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
2447 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_not, 16)
2448 const wchar_t* __thiscall ctype_wchar_scan_not(const ctype_wchar *this,
2449         short mask, const wchar_t *first, const wchar_t *last)
2450 {
2451     TRACE("(%p %x %p %p)\n", this, mask, first, last);
2452     return call_ctype_wchar_do_scan_not(this, mask, first, last);
2453 }
2454
2455 /* ?id@?$numpunct@D@std@@2V0locale@2@A */
2456 locale_id numpunct_char_id = {0};
2457
2458 /* ??_7?$numpunct@D@std@@6B@ */
2459 extern const vtable_ptr MSVCP_numpunct_char_vtable;
2460
2461 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
2462 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
2463 DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
2464 void __thiscall numpunct_char__Init(numpunct_char *this, _Locinfo *locinfo, MSVCP_bool isdef)
2465 {
2466     const struct lconv *lc = _Locinfo__Getlconv(locinfo);
2467     int len;
2468
2469     TRACE("(%p %p %d)\n", this, locinfo, isdef);
2470
2471     len = strlen(_Locinfo__Getfalse(locinfo))+1;
2472     this->false_name = MSVCRT_operator_new(len);
2473     if(this->false_name)
2474         memcpy((char*)this->false_name, _Locinfo__Getfalse(locinfo), len);
2475
2476     len = strlen(_Locinfo__Gettrue(locinfo))+1;
2477     this->true_name = MSVCRT_operator_new(len);
2478     if(this->true_name)
2479         memcpy((char*)this->true_name, _Locinfo__Gettrue(locinfo), len);
2480
2481     if(isdef) {
2482         this->grouping = MSVCRT_operator_new(1);
2483         if(this->grouping)
2484             *(char*)this->grouping = 0;
2485
2486         this->dp = '.';
2487         this->sep = ',';
2488     } else {
2489         len = strlen(lc->grouping)+1;
2490         this->grouping = MSVCRT_operator_new(len);
2491         if(this->grouping)
2492             memcpy((char*)this->grouping, lc->grouping, len);
2493
2494         this->dp = lc->decimal_point[0];
2495         this->sep = lc->thousands_sep[0];
2496     }
2497
2498     if(!this->false_name || !this->true_name || !this->grouping) {
2499         MSVCRT_operator_delete((char*)this->grouping);
2500         MSVCRT_operator_delete((char*)this->false_name);
2501         MSVCRT_operator_delete((char*)this->true_name);
2502
2503         ERR("Out of memory\n");
2504         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2505     }
2506 }
2507
2508 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
2509 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
2510 DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
2511 void __thiscall numpunct_char__Tidy(numpunct_char *this)
2512 {
2513     TRACE("(%p)\n", this);
2514
2515     MSVCRT_operator_delete((char*)this->grouping);
2516     MSVCRT_operator_delete((char*)this->false_name);
2517     MSVCRT_operator_delete((char*)this->true_name);
2518 }
2519
2520 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
2521 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
2522 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
2523 numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
2524         _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
2525 {
2526     TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
2527     locale_facet_ctor_refs(&this->facet, refs);
2528     this->facet.vtable = &MSVCP_numpunct_char_vtable;
2529     numpunct_char__Init(this, locinfo, usedef);
2530     return this;
2531 }
2532
2533 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
2534 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
2535 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
2536 numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
2537         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
2538 {
2539     _Locinfo locinfo;
2540
2541     TRACE("(%p %s %lu %d)\n", this, debugstr_a(name), refs, usedef);
2542     locale_facet_ctor_refs(&this->facet, refs);
2543     this->facet.vtable = &MSVCP_numpunct_char_vtable;
2544
2545     _Locinfo_ctor_cstr(&locinfo, name);
2546     numpunct_char__Init(this, &locinfo, usedef);
2547     _Locinfo_dtor(&locinfo);
2548     return this;
2549 }
2550
2551 /* ??0?$numpunct@D@std@@QAE@I@Z */
2552 /* ??0?$numpunct@D@std@@QEAA@_K@Z */
2553 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
2554 numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, MSVCP_size_t refs)
2555 {
2556     TRACE("(%p %lu)\n", this, refs);
2557     return numpunct_char_ctor_name(this, "C", refs, FALSE);
2558 }
2559
2560 /* ??_F?$numpunct@D@std@@QAEXXZ */
2561 /* ??_F?$numpunct@D@std@@QEAAXXZ */
2562 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
2563 numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
2564 {
2565     return numpunct_char_ctor_refs(this, 0);
2566 }
2567
2568 /* ??1?$numpunct@D@std@@MAE@XZ */
2569 /* ??1?$numpunct@D@std@@MEAA@XZ */
2570 DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
2571 void __thiscall numpunct_char_dtor(numpunct_char *this)
2572 {
2573     TRACE("(%p)\n", this);
2574     numpunct_char__Tidy(this);
2575 }
2576
2577 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_char_vector_dtor, 8)
2578 numpunct_char* __thiscall MSVCP_numpunct_char_vector_dtor(numpunct_char *this, unsigned int flags)
2579 {
2580     TRACE("(%p %x)\n", this, flags);
2581     if(flags & 2) {
2582         /* we have an array, with the number of elements stored before the first object */
2583         int i, *ptr = (int *)this-1;
2584
2585         for(i=*ptr-1; i>=0; i--)
2586             numpunct_char_dtor(this+i);
2587         MSVCRT_operator_delete(ptr);
2588     } else {
2589         numpunct_char_dtor(this);
2590         if(flags & 1)
2591             MSVCRT_operator_delete(this);
2592     }
2593
2594     return this;
2595 }
2596
2597 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2598 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2599 MSVCP_size_t __cdecl numpunct_char__Getcat(const locale_facet **facet, const locale *loc)
2600 {
2601     TRACE("(%p %p)\n", facet, loc);
2602
2603     if(facet && !*facet) {
2604         *facet = MSVCRT_operator_new(sizeof(numpunct_char));
2605         if(!*facet) {
2606             ERR("Out of memory\n");
2607             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2608             return 0;
2609         }
2610         numpunct_char_ctor_name((numpunct_char*)*facet,
2611                 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0, TRUE);
2612     }
2613
2614     return LC_NUMERIC;
2615 }
2616
2617 /* ?do_decimal_point@?$numpunct@D@std@@MBEDXZ */
2618 /* ?do_decimal_point@?$numpunct@D@std@@MEBADXZ */
2619 DEFINE_THISCALL_WRAPPER(numpunct_char_do_decimal_point, 4)
2620 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
2621         char, (const numpunct_char *this), (this))
2622 char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
2623 {
2624     TRACE("(%p)\n", this);
2625     return this->dp;
2626 }
2627
2628 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
2629 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
2630 DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
2631 char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
2632 {
2633     TRACE("(%p)\n", this);
2634     return call_numpunct_char_do_decimal_point(this);
2635 }
2636
2637 /* ?do_thousands_sep@?$numpunct@D@std@@MBEDXZ */
2638 /* ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ */
2639 DEFINE_THISCALL_WRAPPER(numpunct_char_do_thousands_sep, 4)
2640 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
2641         char, (const numpunct_char*), (this))
2642 char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
2643 {
2644     TRACE("(%p)\n", this);
2645     return this->sep;
2646 }
2647
2648 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
2649 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
2650 DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
2651 char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
2652 {
2653     TRACE("(%p)\n", this);
2654     return call_numpunct_char_do_thousands_sep(this);
2655 }
2656
2657 /* ?do_grouping@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2658 /* ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2659 DEFINE_THISCALL_WRAPPER(numpunct_char_do_grouping, 8)
2660 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
2661         basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
2662 basic_string_char* __thiscall numpunct_char_do_grouping(
2663         const numpunct_char *this, basic_string_char *ret)
2664 {
2665     TRACE("(%p)\n", this);
2666     return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
2667 }
2668
2669 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2670 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2671 DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
2672 basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
2673 {
2674     TRACE("(%p)\n", this);
2675     return call_numpunct_char_do_grouping(this, ret);
2676 }
2677
2678 /* ?do_falsename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2679 /* ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2680 DEFINE_THISCALL_WRAPPER(numpunct_char_do_falsename, 8)
2681 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
2682         basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
2683 basic_string_char* __thiscall numpunct_char_do_falsename(
2684         const numpunct_char *this, basic_string_char *ret)
2685 {
2686     TRACE("(%p)\n", this);
2687     return MSVCP_basic_string_char_ctor_cstr(ret, this->false_name);
2688 }
2689
2690 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2691 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2692 DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
2693 basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
2694 {
2695     TRACE("(%p)\n", this);
2696     return call_numpunct_char_do_falsename(this, ret);
2697 }
2698
2699 /* ?do_truename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2700 /* ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2701 DEFINE_THISCALL_WRAPPER(numpunct_char_do_truename, 8)
2702 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
2703         basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
2704 basic_string_char* __thiscall numpunct_char_do_truename(
2705         const numpunct_char *this, basic_string_char *ret)
2706 {
2707     TRACE("(%p)\n", this);
2708     return MSVCP_basic_string_char_ctor_cstr(ret, this->true_name);
2709 }
2710
2711 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2712 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2713 DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
2714 basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
2715 {
2716     TRACE("(%p)\n", this);
2717     return call_numpunct_char_do_truename(this, ret);
2718 }
2719
2720 /* ?id@?$numpunct@_W@std@@2V0locale@2@A */
2721 locale_id numpunct_wchar_id = {0};
2722 /* ?id@?$numpunct@G@std@@2V0locale@2@A */
2723 locale_id numpunct_short_id = {0};
2724
2725 /* ??_7?$numpunct@_W@std@@6B@ */
2726 extern const vtable_ptr MSVCP_numpunct_wchar_vtable;
2727 /* ??_7?$numpunct@G@std@@6B@ */
2728 extern const vtable_ptr MSVCP_numpunct_short_vtable;
2729
2730 /* ?_Init@?$numpunct@_W@std@@IAEXABV_Locinfo@2@_N@Z */
2731 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
2732 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
2733 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
2734 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
2735 void __thiscall numpunct_wchar__Init(numpunct_wchar *this, _Locinfo *locinfo, MSVCP_bool isdef)
2736 {
2737     FIXME("(%p %p %d) stub\n", this, locinfo, isdef);
2738 }
2739
2740 /* ?_Tidy@?$numpunct@_W@std@@AAEXXZ */
2741 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
2742 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
2743 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
2744 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
2745 void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
2746 {
2747     FIXME("(%p) stub\n", this);
2748 }
2749
2750 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
2751 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
2752 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
2753 numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
2754         _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
2755 {
2756     FIXME("(%p %p %lu %d) stub\n", this, locinfo, refs, usedef);
2757     this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
2758     return NULL;
2759 }
2760
2761 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
2762 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
2763 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
2764 numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
2765         _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
2766 {
2767     numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
2768     this->facet.vtable = &MSVCP_numpunct_short_vtable;
2769     return this;
2770 }
2771
2772 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
2773 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
2774 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
2775 numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
2776         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
2777 {
2778     FIXME("(%p %s %lu %d) stub\n", this, debugstr_a(name), refs, usedef);
2779     this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
2780     return NULL;
2781 }
2782
2783 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
2784 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
2785 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
2786 numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
2787         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
2788 {
2789     numpunct_wchar_ctor_name(this, name, refs, usedef);
2790     this->facet.vtable = &MSVCP_numpunct_short_vtable;
2791     return this;
2792 }
2793
2794 /* ??0?$numpunct@_W@std@@QAE@I@Z */
2795 /* ??0?$numpunct@_W@std@@QEAA@_K@Z */
2796 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
2797 numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
2798 {
2799     FIXME("(%p %lu) stub\n", this, refs);
2800     this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
2801     return NULL;
2802 }
2803
2804 /* ??0?$numpunct@G@std@@QAE@I@Z */
2805 /* ??0?$numpunct@G@std@@QEAA@_K@Z */
2806 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
2807 numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
2808 {
2809     numpunct_wchar_ctor_refs(this, refs);
2810     this->facet.vtable = &MSVCP_numpunct_short_vtable;
2811     return this;
2812 }
2813
2814 /* ??_F?$numpunct@_W@std@@QAEXXZ */
2815 /* ??_F?$numpunct@_W@std@@QEAAXXZ */
2816 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
2817 numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
2818 {
2819     return numpunct_wchar_ctor_refs(this, 0);
2820 }
2821
2822 /* ??_F?$numpunct@G@std@@QAEXXZ */
2823 /* ??_F?$numpunct@G@std@@QEAAXXZ */
2824 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
2825 numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
2826 {
2827     return numpunct_short_ctor_refs(this, 0);
2828 }
2829
2830 /* ??1?$numpunct@_W@std@@MAE@XZ */
2831 /* ??1?$numpunct@_W@std@@MEAA@XZ */
2832 /* ??1?$numpunct@G@std@@MAE@XZ */
2833 /* ??1?$numpunct@G@std@@MEAA@XZ */
2834 DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
2835 void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
2836 {
2837     FIXME("(%p) stub\n", this);
2838 }
2839
2840 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_wchar_vector_dtor, 8)
2841 numpunct_wchar* __thiscall MSVCP_numpunct_wchar_vector_dtor(numpunct_wchar *this, unsigned int flags)
2842 {
2843     TRACE("(%p %x)\n", this, flags);
2844     if(flags & 2) {
2845         /* we have an array, with the number of elements stored before the first object */
2846         int i, *ptr = (int *)this-1;
2847
2848         for(i=*ptr-1; i>=0; i--)
2849             numpunct_wchar_dtor(this+i);
2850         MSVCRT_operator_delete(ptr);
2851     } else {
2852         numpunct_wchar_dtor(this);
2853         if(flags & 1)
2854             MSVCRT_operator_delete(this);
2855     }
2856
2857     return this;
2858 }
2859
2860 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_short_vector_dtor, 8)
2861 numpunct_wchar* __thiscall MSVCP_numpunct_short_vector_dtor(numpunct_wchar *this, unsigned int flags)
2862 {
2863     return MSVCP_numpunct_wchar_vector_dtor(this, flags);
2864 }
2865
2866 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2867 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2868 MSVCP_size_t __cdecl numpunct_wchar__Getcat(const locale_facet **facet, const locale *loc)
2869 {
2870     FIXME("(%p %p) stub\n", facet, loc);
2871     return 0;
2872 }
2873
2874 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2875 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2876 MSVCP_size_t __cdecl numpunct_short__Getcat(const locale_facet **facet, const locale *loc)
2877 {
2878     FIXME("(%p %p) stub\n", facet, loc);
2879     return 0;
2880 }
2881
2882 /* ?do_decimal_point@?$numpunct@_W@std@@MBE_WXZ */
2883 /* ?do_decimal_point@?$numpunct@_W@std@@MEBA_WXZ */
2884 /* ?do_decimal_point@?$numpunct@G@std@@MBEGXZ */
2885 /* ?do_decimal_point@?$numpunct@G@std@@MEBAGXZ */
2886 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_decimal_point, 4)
2887 wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
2888 {
2889     FIXME("(%p) stub\n", this);
2890     return 0;
2891 }
2892
2893 /* ?decimal_point@?$numpunct@_W@std@@QBE_WXZ */
2894 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
2895 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
2896 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
2897 DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
2898 wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
2899 {
2900     FIXME("(%p) stub\n", this);
2901     return 0;
2902 }
2903
2904 /* ?do_thousands_sep@?$numpunct@_W@std@@MBE_WXZ */
2905 /* ?do_thousands_sep@?$numpunct@_W@std@@MEBA_WXZ */
2906 /* ?do_thousands_sep@?$numpunct@G@std@@MBEGXZ */
2907 /* ?do_thousands_sep@?$numpunct@G@std@@MEBAGXZ */
2908 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_thousands_sep, 4)
2909 wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
2910 {
2911     FIXME("(%p) stub\n", this);
2912     return 0;
2913 }
2914
2915 /* ?thousands_sep@?$numpunct@_W@std@@QBE_WXZ */
2916 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
2917 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
2918 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
2919 DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
2920 wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
2921 {
2922     FIXME("(%p) stub\n", this);
2923     return 0;
2924 }
2925
2926 /* ?do_grouping@?$numpunct@_W@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2927 /* ?do_grouping@?$numpunct@_W@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2928 /* ?do_grouping@?$numpunct@G@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2929 /* ?do_grouping@?$numpunct@G@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2930 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_grouping, 8)
2931 basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *this, basic_string_char *ret)
2932 {
2933     FIXME("(%p) stub\n", this);
2934     return ret;
2935 }
2936
2937 /* ?grouping@?$numpunct@_W@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2938 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2939 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2940 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
2941 DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
2942 basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
2943 {
2944     FIXME("(%p) stub\n", this);
2945     return ret;
2946 }
2947
2948 /* ?do_falsename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2949 /* ?do_falsename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2950 /* ?do_falsename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2951 /* ?do_falsename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2952 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_falsename, 8)
2953 basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
2954 {
2955     FIXME("(%p) stub\n", this);
2956     return ret;
2957 }
2958
2959 /* ?falsename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2960 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2961 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2962 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2963 DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
2964 basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
2965 {
2966     FIXME("(%p) stub\n", this);
2967     return ret;
2968 }
2969
2970 /* ?do_truename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2971 /* ?do_truename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2972 /* ?do_truename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2973 /* ?do_truename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2974 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_truename, 8)
2975 basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *this, basic_string_wchar *ret)
2976 {
2977     FIXME("(%p) stub\n", this);
2978     return ret;
2979 }
2980
2981 /* ?truename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2982 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
2983 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2984 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
2985 DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
2986 basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
2987 {
2988     FIXME("(%p) stub\n", this);
2989     return ret;
2990 }
2991
2992 /* ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
2993 locale_id num_get_wchar_id = {0};
2994 /* ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
2995 locale_id num_get_short_id = {0};
2996
2997 /* ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
2998 extern const vtable_ptr MSVCP_num_get_wchar_vtable;
2999 /* ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
3000 extern const vtable_ptr MSVCP_num_get_short_vtable;
3001
3002 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
3003 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
3004 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
3005 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
3006 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor__Init, 8)
3007 void __thiscall num_get_wchar_ctor__Init(num_get_wchar *this, const _Locinfo *locinfo)
3008 {
3009     FIXME("(%p %p) stub\n", this, locinfo);
3010 }
3011
3012 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
3013 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3014 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_locinfo, 12)
3015 num_get_wchar* __thiscall num_get_wchar_ctor_locinfo(num_get_wchar *this,
3016         _Locinfo *locinfo, MSVCP_size_t refs)
3017 {
3018     FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
3019     return NULL;
3020 }
3021
3022 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
3023 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3024 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_locinfo, 12)
3025 num_get_wchar* __thiscall num_get_short_ctor_locinfo(num_get_wchar *this,
3026         _Locinfo *locinfo, MSVCP_size_t refs)
3027 {
3028     FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
3029     return NULL;
3030 }
3031
3032 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
3033 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
3034 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_refs, 8)
3035 num_get_wchar* __thiscall num_get_wchar_ctor_refs(num_get_wchar *this, MSVCP_size_t refs)
3036 {
3037     FIXME("(%p %lu) stub\n", this, refs);
3038     return NULL;
3039 }
3040
3041 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
3042 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
3043 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_refs, 8)
3044 num_get_wchar* __thiscall num_get_short_ctor_refs(num_get_wchar *this, MSVCP_size_t refs)
3045 {
3046     FIXME("(%p %lu) stub\n", this, refs);
3047     return NULL;
3048 }
3049
3050 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
3051 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
3052 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor, 4)
3053 num_get_wchar* __thiscall num_get_wchar_ctor(num_get_wchar *this)
3054 {
3055     FIXME("(%p) stub\n", this);
3056     return NULL;
3057 }
3058
3059 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
3060 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
3061 DEFINE_THISCALL_WRAPPER(num_get_short_ctor, 4)
3062 num_get_wchar* __thiscall num_get_short_ctor(num_get_wchar *this)
3063 {
3064     FIXME("(%p) stub\n", this);
3065     return NULL;
3066 }
3067
3068 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
3069 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
3070 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
3071 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
3072 DEFINE_THISCALL_WRAPPER(num_get_wchar_dtor, 4)
3073 void __thiscall num_get_wchar_dtor(num_get_wchar *this)
3074 {
3075     FIXME("(%p) stub\n", this);
3076 }
3077
3078 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar_vector_dtor, 8)
3079 num_get_wchar* __thiscall MSVCP_num_get_wchar_vector_dtor(num_get_wchar *this, unsigned int flags)
3080 {
3081     TRACE("(%p %x)\n", this, flags);
3082     if(flags & 2) {
3083         /* we have an array, with the number of elements stored before the first object */
3084         int i, *ptr = (int *)this-1;
3085
3086         for(i=*ptr-1; i>=0; i--)
3087             num_get_wchar_dtor(this+i);
3088         MSVCRT_operator_delete(ptr);
3089     } else {
3090         num_get_wchar_dtor(this);
3091         if(flags & 1)
3092             MSVCRT_operator_delete(this);
3093     }
3094
3095     return this;
3096 }
3097
3098 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_short_vector_dtor, 8)
3099 num_get_wchar* __thiscall MSVCP_num_get_short_vector_dtor(num_get_wchar *this, unsigned int flags)
3100 {
3101     return MSVCP_num_get_wchar_vector_dtor(this, flags);
3102 }
3103
3104 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3105 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3106 MSVCP_size_t __cdecl num_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
3107 {
3108     FIXME("(%p %p) stub\n", facet, loc);
3109     return -1;
3110 }
3111
3112 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3113 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3114 MSVCP_size_t __cdecl num_get_short__Getcat(const locale_facet **facet, const locale *loc)
3115 {
3116     FIXME("(%p %p) stub\n", facet, loc);
3117     return -1;
3118 }
3119
3120 /* ?_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 */
3121 /* ?_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 */
3122 /* ?_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 */
3123 /* ?_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 */
3124 int __cdecl num_get_wchar__Getffld(char *dest, istreambuf_iterator_wchar *first,
3125     istreambuf_iterator_wchar *last, const locale *loc)
3126 {
3127     FIXME("(%p %p %p %p) stub\n", dest, first, last, loc);
3128     return -1;
3129 }
3130
3131 /* ?_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 */
3132 /* ?_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 */
3133 /* ?_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 */
3134 /* ?_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 */
3135 int __cdecl num_get_wchar__Getffldx(char *dest, istreambuf_iterator_wchar *first,
3136     istreambuf_iterator_wchar *last, struct _ios_base *ios, int *phexexp)
3137 {
3138     FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
3139     return -1;
3140 }
3141
3142 /* ?_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 */
3143 /* ?_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 */
3144 /* ?_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 */
3145 /* ?_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 */
3146 int __cdecl num_get_wchar__Getifld(char *dest, istreambuf_iterator_wchar *first,
3147     istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
3148 {
3149     FIXME("(%p %p %p %04x %p) stub\n", dest, first, last, fmtflags, loc);
3150     return -1;
3151 }
3152
3153 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABEH_W000@Z */
3154 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAH_W000@Z */
3155 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABEHGGGG@Z */
3156 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHGGGG@Z */
3157 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar__Hexdig, 20)
3158 int __thiscall MSVCP_num_get_wchar__Hexdig(num_get_wchar *this, wchar_t dig, wchar_t e0, wchar_t al, wchar_t au)
3159 {
3160     FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
3161     return -1;
3162 }
3163
3164 /* ?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 */
3165 /* ?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 */
3166 /* ?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 */
3167 /* ?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 */
3168 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_void,36)
3169 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_void(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3170     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, void **pval)
3171 {
3172     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3173     return ret;
3174 }
3175
3176 /* ?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 */
3177 /* ?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 */
3178 /* ?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 */
3179 /* ?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 */
3180 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_void,36)
3181 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_void(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3182     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, void **pval)
3183 {
3184     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3185     return ret;
3186 }
3187
3188 /* ?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 */
3189 /* ?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 */
3190 /* ?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 */
3191 /* ?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 */
3192 /* ?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 */
3193 /* ?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 */
3194 /* ?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 */
3195 /* ?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 */
3196 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_double,36)
3197 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_double(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3198     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, double *pval)
3199 {
3200     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3201     return ret;
3202 }
3203
3204 /* ?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 */
3205 /* ?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 */
3206 /* ?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 */
3207 /* ?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 */
3208 /* ?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 */
3209 /* ?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 */
3210 /* ?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 */
3211 /* ?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 */
3212 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_double,36)
3213 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_double(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3214     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, double *pval)
3215 {
3216     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3217     return ret;
3218 }
3219
3220 /* ?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 */
3221 /* ?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 */
3222 /* ?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 */
3223 /* ?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 */
3224 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_float,36)
3225 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_float(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3226     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, float *pval)
3227 {
3228     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3229     return ret;
3230 }
3231
3232 /* ?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 */
3233 /* ?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 */
3234 /* ?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 */
3235 /* ?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 */
3236 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_float,36)
3237 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_float(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3238     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, float *pval)
3239 {
3240     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3241     return ret;
3242 }
3243
3244 /* ?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 */
3245 /* ?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 */
3246 /* ?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 */
3247 /* ?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 */
3248 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint64,36)
3249 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint64(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3250     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONGLONG *pval)
3251 {
3252     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3253     return ret;
3254 }
3255
3256 /* ?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 */
3257 /* ?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 */
3258 /* ?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 */
3259 /* ?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 */
3260 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint64,36)
3261 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint64(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3262     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONGLONG *pval)
3263 {
3264     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3265     return ret;
3266 }
3267
3268 /* ?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 */
3269 /* ?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 */
3270 /* ?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 */
3271 /* ?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 */
3272 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_int64,36)
3273 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_int64(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3274     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONGLONG *pval)
3275 {
3276     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3277     return ret;
3278 }
3279
3280 /* ?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 */
3281 /* ?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 */
3282 /* ?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 */
3283 /* ?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 */
3284 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_int64,36)
3285 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_int64(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3286     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONGLONG *pval)
3287 {
3288     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3289     return ret;
3290 }
3291
3292 /* ?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 */
3293 /* ?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 */
3294 /* ?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 */
3295 /* ?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 */
3296 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ulong,36)
3297 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ulong(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3298     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONG *pval)
3299 {
3300     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3301     return ret;
3302 }
3303
3304 /* ?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 */
3305 /* ?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 */
3306 /* ?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 */
3307 /* ?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 */
3308 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ulong,36)
3309 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ulong(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3310     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, ULONG *pval)
3311 {
3312     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3313     return ret;
3314 }
3315
3316 /* ?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 */
3317 /* ?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 */
3318 /* ?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 */
3319 /* ?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 */
3320 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_long,36)
3321 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_long(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3322     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONG *pval)
3323 {
3324     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3325     return ret;
3326 }
3327
3328 /* ?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 */
3329 /* ?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 */
3330 /* ?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 */
3331 /* ?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 */
3332 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_long,36)
3333 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_long(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3334     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, LONG *pval)
3335 {
3336     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3337     return ret;
3338 }
3339
3340 /* ?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 */
3341 /* ?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 */
3342 /* ?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 */
3343 /* ?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 */
3344 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint,36)
3345 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3346     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned int *pval)
3347 {
3348     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3349     return ret;
3350 }
3351
3352 /* ?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 */
3353 /* ?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 */
3354 /* ?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 */
3355 /* ?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 */
3356 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint,36)
3357 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3358     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned int *pval)
3359 {
3360     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3361     return ret;
3362 }
3363
3364 /* ?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 */
3365 /* ?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 */
3366 /* ?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 */
3367 /* ?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 */
3368 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ushort,36)
3369 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ushort(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3370     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned short *pval)
3371 {
3372     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3373     return ret;
3374 }
3375
3376 /* ?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 */
3377 /* ?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 */
3378 /* ?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@ */
3379 /* ?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 */
3380 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ushort,36)
3381 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ushort(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3382     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, unsigned short *pval)
3383 {
3384     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3385     return ret;
3386 }
3387
3388 /* ?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 */
3389 /* ?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 */
3390 /* ?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 */
3391 /* ?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 */
3392 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_bool,36)
3393 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_bool(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3394     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, MSVCP_bool *pval)
3395 {
3396     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3397     return ret;
3398 }
3399
3400 /* ?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 */
3401 /* ?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 */
3402 /* ?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 */
3403 /* ?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 */
3404 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_bool,36)
3405 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get_wchar *this, istreambuf_iterator_wchar *ret,
3406     istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, struct _ios_base *base, int *state, MSVCP_bool *pval)
3407 {
3408     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3409     return ret;
3410 }
3411
3412 /* ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
3413 locale_id num_get_char_id = {0};
3414
3415 /* ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
3416 extern const vtable_ptr MSVCP_num_get_char_vtable;
3417
3418 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
3419 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
3420 DEFINE_THISCALL_WRAPPER(num_get_char_ctor__Init, 8)
3421 void __thiscall num_get_char_ctor__Init(num_get_char *this, const _Locinfo *locinfo)
3422 {
3423     FIXME("(%p %p) stub\n", this, locinfo);
3424 }
3425
3426 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
3427 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3428 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_locinfo, 12)
3429 num_get_char* __thiscall num_get_char_ctor_locinfo(num_get_char *this,
3430         _Locinfo *locinfo, MSVCP_size_t refs)
3431 {
3432     FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
3433     return NULL;
3434 }
3435
3436 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
3437 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
3438 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_refs, 8)
3439 num_get_char* __thiscall num_get_char_ctor_refs(num_get_char *this, MSVCP_size_t refs)
3440 {
3441     FIXME("(%p %lu) stub\n", this, refs);
3442     return NULL;
3443 }
3444
3445 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
3446 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
3447 DEFINE_THISCALL_WRAPPER(num_get_char_ctor, 4)
3448 num_get_char* __thiscall num_get_char_ctor(num_get_char *this)
3449 {
3450     FIXME("(%p) stub\n", this);
3451     return NULL;
3452 }
3453
3454 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
3455 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
3456 DEFINE_THISCALL_WRAPPER(num_get_char_dtor, 4)
3457 void __thiscall num_get_char_dtor(num_get_char *this)
3458 {
3459     FIXME("(%p) stub\n", this);
3460 }
3461
3462 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char_vector_dtor, 8)
3463 num_get_char* __thiscall MSVCP_num_get_char_vector_dtor(num_get_char *this, unsigned int flags)
3464 {
3465     TRACE("(%p %x)\n", this, flags);
3466     if(flags & 2) {
3467         /* we have an array, with the number of elements stored before the first object */
3468         int i, *ptr = (int *)this-1;
3469
3470         for(i=*ptr-1; i>=0; i--)
3471             num_get_char_dtor(this+i);
3472         MSVCRT_operator_delete(ptr);
3473     } else {
3474         num_get_char_dtor(this);
3475         if(flags & 1)
3476             MSVCRT_operator_delete(this);
3477     }
3478
3479     return this;
3480 }
3481
3482 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3483 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3484 MSVCP_size_t __cdecl num_get_char__Getcat(const locale_facet **facet, const locale *loc)
3485 {
3486     FIXME("(%p %p) stub\n", facet, loc);
3487     return -1;
3488 }
3489
3490 /* ?_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 */
3491 /* ?_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 */
3492 int __cdecl num_get_char__Getffld(char *dest, istreambuf_iterator_char *first,
3493     istreambuf_iterator_char *last, const locale *loc)
3494 {
3495     FIXME("(%p %p %p %p) stub\n", dest, first, last, loc);
3496     return -1;
3497 }
3498
3499 /* ?_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 */
3500 /* ?_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 */
3501 int __cdecl num_get_char__Getffldx(char *dest, istreambuf_iterator_char *first,
3502     istreambuf_iterator_char *last, struct _ios_base *ios, int *phexexp)
3503 {
3504     FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
3505     return -1;
3506 }
3507
3508 /* ?_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 */
3509 /* ?_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 */
3510 int __cdecl num_get_char__Getifld(char *dest, istreambuf_iterator_char *first,
3511     istreambuf_iterator_char *last, int fmtflags, const locale *loc)
3512 {
3513     FIXME("(%p %p %p %04x %p) stub\n", dest, first, last, fmtflags, loc);
3514     return -1;
3515 }
3516
3517 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABEHD000@Z */
3518 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHD000@Z */
3519 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char__Hexdig, 20)
3520 int __thiscall MSVCP_num_get_char__Hexdig(num_get_char *this, char dig, char e0, char al, char au)
3521 {
3522     FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
3523     return -1;
3524 }
3525
3526 /* ?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 */
3527 /* ?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 */
3528 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_void,36)
3529 istreambuf_iterator_char *__thiscall num_get_char_do_get_void(const num_get_char *this, istreambuf_iterator_char *ret,
3530     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, void **pval)
3531 {
3532     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3533     return ret;
3534 }
3535
3536 /* ?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 */
3537 /* ?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 */
3538 DEFINE_THISCALL_WRAPPER(num_get_char_get_void,36)
3539 istreambuf_iterator_char *__thiscall num_get_char_get_void(const num_get_char *this, istreambuf_iterator_char *ret,
3540     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, void **pval)
3541 {
3542     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3543     return ret;
3544 }
3545
3546 /* ?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 */
3547 /* ?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 */
3548 /* ?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 */
3549 /* ?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 */
3550 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_double,36)
3551 istreambuf_iterator_char *__thiscall num_get_char_do_get_double(const num_get_char *this, istreambuf_iterator_char *ret,
3552     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, double *pval)
3553 {
3554     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3555     return ret;
3556 }
3557
3558 /* ?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 */
3559 /* ?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 */
3560 /* ?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 */
3561 /* ?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 */
3562 DEFINE_THISCALL_WRAPPER(num_get_char_get_double,36)
3563 istreambuf_iterator_char *__thiscall num_get_char_get_double(const num_get_char *this, istreambuf_iterator_char *ret,
3564     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, double *pval)
3565 {
3566     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3567     return ret;
3568 }
3569
3570 /* ?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 */
3571 /* ?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 */
3572 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_float,36)
3573 istreambuf_iterator_char *__thiscall num_get_char_do_get_float(const num_get_char *this, istreambuf_iterator_char *ret,
3574     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, float *pval)
3575 {
3576     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3577     return ret;
3578 }
3579
3580 /* ?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 */
3581 /* ?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 */
3582 DEFINE_THISCALL_WRAPPER(num_get_char_get_float,36)
3583 istreambuf_iterator_char *__thiscall num_get_char_get_float(const num_get_char *this, istreambuf_iterator_char *ret,
3584     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, float *pval)
3585 {
3586     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3587     return ret;
3588 }
3589
3590 /* ?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 */
3591 /* ?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 */
3592 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint64,36)
3593 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint64(const num_get_char *this, istreambuf_iterator_char *ret,
3594     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONGLONG *pval)
3595 {
3596     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3597     return ret;
3598 }
3599
3600 /* ?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 */
3601 /* ?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 */
3602 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint64,36)
3603 istreambuf_iterator_char *__thiscall num_get_char_get_uint64(const num_get_char *this, istreambuf_iterator_char *ret,
3604     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONGLONG *pval)
3605 {
3606     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3607     return ret;
3608 }
3609
3610 /* ?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 */
3611 /* ?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 */
3612 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_int64,36)
3613 istreambuf_iterator_char *__thiscall num_get_char_do_get_int64(const num_get_char *this, istreambuf_iterator_char *ret,
3614     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONGLONG *pval)
3615 {
3616     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3617     return ret;
3618 }
3619
3620 /* ?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 */
3621 /* ?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 */
3622 DEFINE_THISCALL_WRAPPER(num_get_char_get_int64,36)
3623 istreambuf_iterator_char *__thiscall num_get_char_get_int64(const num_get_char *this, istreambuf_iterator_char *ret,
3624     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONGLONG *pval)
3625 {
3626     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3627     return ret;
3628 }
3629
3630 /* ?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 */
3631 /* ?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 */
3632 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ulong,36)
3633 istreambuf_iterator_char *__thiscall num_get_char_do_get_ulong(const num_get_char *this, istreambuf_iterator_char *ret,
3634     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONG *pval)
3635 {
3636     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3637     return ret;
3638 }
3639
3640 /* ?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 */
3641 /* ?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 */
3642 DEFINE_THISCALL_WRAPPER(num_get_char_get_ulong,36)
3643 istreambuf_iterator_char *__thiscall num_get_char_get_ulong(const num_get_char *this, istreambuf_iterator_char *ret,
3644     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, ULONG *pval)
3645 {
3646     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3647     return ret;
3648 }
3649
3650 /* ?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 */
3651 /* ?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 */
3652 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_long,36)
3653 istreambuf_iterator_char *__thiscall num_get_char_do_get_long(const num_get_char *this, istreambuf_iterator_char *ret,
3654     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONG *pval)
3655 {
3656     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3657     return ret;
3658 }
3659
3660 /* ?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 */
3661 /* ?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 */
3662 DEFINE_THISCALL_WRAPPER(num_get_char_get_long,36)
3663 istreambuf_iterator_char *__thiscall num_get_char_get_long(const num_get_char *this, istreambuf_iterator_char *ret,
3664     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, LONG *pval)
3665 {
3666     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3667     return ret;
3668 }
3669
3670 /* ?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 */
3671 /* ?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 */
3672 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint,36)
3673 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint(const num_get_char *this, istreambuf_iterator_char *ret,
3674     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned int *pval)
3675 {
3676     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3677     return ret;
3678 }
3679
3680 /* ?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 */
3681 /* ?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 */
3682 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint,36)
3683 istreambuf_iterator_char *__thiscall num_get_char_get_uint(const num_get_char *this, istreambuf_iterator_char *ret,
3684     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned int *pval)
3685 {
3686     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3687     return ret;
3688 }
3689
3690 /* ?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 */
3691 /* ?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 */
3692 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ushort,36)
3693 istreambuf_iterator_char *__thiscall num_get_char_do_get_ushort(const num_get_char *this, istreambuf_iterator_char *ret,
3694     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned short *pval)
3695 {
3696     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3697     return ret;
3698 }
3699
3700 /* ?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 */
3701 /* ?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 */
3702 DEFINE_THISCALL_WRAPPER(num_get_char_get_ushort,36)
3703 istreambuf_iterator_char *__thiscall num_get_char_get_ushort(const num_get_char *this, istreambuf_iterator_char *ret,
3704     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, unsigned short *pval)
3705 {
3706     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3707     return ret;
3708 }
3709
3710 /* ?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 */
3711 /* ?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 */
3712 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_bool,36)
3713 istreambuf_iterator_char *__thiscall num_get_char_do_get_bool(const num_get_char *this, istreambuf_iterator_char *ret,
3714     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, MSVCP_bool *pval)
3715 {
3716     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3717     return ret;
3718 }
3719
3720 /* ?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 */
3721 /* ?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 */
3722 DEFINE_THISCALL_WRAPPER(num_get_char_get_bool,36)
3723 istreambuf_iterator_char *__thiscall num_get_char_get_bool(const num_get_char *this, istreambuf_iterator_char *ret,
3724     istreambuf_iterator_char first, istreambuf_iterator_char last, struct _ios_base *base, int *state, MSVCP_bool *pval)
3725 {
3726     FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
3727     return ret;
3728 }
3729
3730 /* ??0_Locimp@locale@std@@AAE@_N@Z */
3731 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
3732 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
3733 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, MSVCP_bool transparent)
3734 {
3735     TRACE("(%p %d)\n", this, transparent);
3736
3737     memset(this, 0, sizeof(locale__Locimp));
3738     locale_facet_ctor_refs(&this->facet, 1);
3739     this->transparent = transparent;
3740     MSVCP_basic_string_char_ctor_cstr(&this->name, "*");
3741     return this;
3742 }
3743
3744 /* ??_F_Locimp@locale@std@@QAEXXZ */
3745 /* ??_F_Locimp@locale@std@@QEAAXXZ */
3746 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
3747 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
3748 {
3749     return locale__Locimp_ctor_transparent(this, FALSE);
3750 }
3751
3752 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
3753 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
3754 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
3755 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
3756 {
3757     _Lockit lock;
3758     MSVCP_size_t i;
3759
3760     TRACE("(%p %p)\n", this, copy);
3761
3762     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3763     memcpy(this, copy, sizeof(locale__Locimp));
3764     locale_facet_ctor_refs(&this->facet, 1);
3765     if(copy->facetvec) {
3766         this->facetvec = MSVCRT_operator_new(copy->facet_cnt*sizeof(locale_facet*));
3767         if(!this->facetvec) {
3768             _Lockit_dtor(&lock);
3769             ERR("Out of memory\n");
3770             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3771             return NULL;
3772         }
3773         for(i=0; i<this->facet_cnt; i++)
3774             if(this->facetvec[i])
3775                 locale_facet__Incref(this->facetvec[i]);
3776     }
3777     MSVCP_basic_string_char_copy_ctor(&this->name, &copy->name);
3778     _Lockit_dtor(&lock);
3779     return this;
3780 }
3781
3782 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
3783 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
3784 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
3785 {
3786     return locale__Locimp_copy_ctor(this, copy);
3787 }
3788
3789 /* ??1_Locimp@locale@std@@MAE@XZ */
3790 /* ??1_Locimp@locale@std@@MEAA@XZ */
3791 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
3792 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
3793 {
3794     TRACE("(%p)\n", this);
3795
3796     if(locale_facet__Decref(&this->facet)) {
3797         MSVCP_size_t i;
3798         for(i=0; i<this->facet_cnt; i++)
3799             if(this->facetvec[i] && locale_facet__Decref(this->facetvec[i]))
3800                 call_locale_facet_vector_dtor(this->facetvec[i], 0);
3801
3802         MSVCRT_operator_delete(this->facetvec);
3803         MSVCP_basic_string_char_dtor(&this->name);
3804     }
3805 }
3806
3807 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
3808 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
3809 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
3810 {
3811     locale__Locimp_dtor(this);
3812 }
3813
3814 DEFINE_THISCALL_WRAPPER(MSVCP_locale__Locimp_vector_dtor, 8)
3815 locale__Locimp* __thiscall MSVCP_locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
3816 {
3817     TRACE("(%p %x)\n", this, flags);
3818     if(flags & 2) {
3819         /* we have an array, with the number of elements stored before the first object */
3820         int i, *ptr = (int *)this-1;
3821
3822         for(i=*ptr-1; i>=0; i--)
3823             locale__Locimp_dtor(this+i);
3824         MSVCRT_operator_delete(ptr);
3825     } else {
3826         locale__Locimp_dtor(this);
3827         if(flags & 1)
3828             MSVCRT_operator_delete(this);
3829     }
3830
3831     return this;
3832 }
3833
3834 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
3835 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
3836 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, MSVCP_size_t id)
3837 {
3838     _Lockit lock;
3839
3840     TRACE("(%p %p %lu)\n", locimp, facet, id);
3841
3842     _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3843     if(id >= locimp->facet_cnt) {
3844         MSVCP_size_t new_size = id+1;
3845         locale_facet **new_facetvec;
3846
3847         if(new_size < locale_id__Id_cnt+1)
3848             new_size = locale_id__Id_cnt+1;
3849
3850         new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
3851         if(!new_facetvec) {
3852             _Lockit_dtor(&lock);
3853             ERR("Out of memory\n");
3854             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3855             return;
3856         }
3857
3858         memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
3859         memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
3860         MSVCRT_operator_delete(locimp->facetvec);
3861         locimp->facetvec = new_facetvec;
3862         locimp->facet_cnt = new_size;
3863     }
3864
3865     if(locimp->facetvec[id] && locale_facet__Decref(locimp->facetvec[id]))
3866         call_locale_facet_vector_dtor(locimp->facetvec[id], 0);
3867
3868     locimp->facetvec[id] = facet;
3869     if(facet)
3870         locale_facet__Incref(facet);
3871     _Lockit_dtor(&lock);
3872 }
3873
3874 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
3875 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
3876 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
3877 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, MSVCP_size_t id)
3878 {
3879     locale__Locimp__Locimp_Addfac(this, facet, id);
3880 }
3881
3882 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
3883 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
3884 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
3885 {
3886     FIXME("stub\n");
3887     return NULL;
3888 }
3889
3890 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
3891 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
3892 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
3893 {
3894     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
3895     return NULL;
3896 }
3897
3898 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
3899 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
3900 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
3901 {
3902     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
3903 }
3904
3905 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
3906 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
3907 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
3908 {
3909     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
3910 }
3911
3912 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
3913 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
3914 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
3915 {
3916     FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
3917 }
3918
3919 /* ??_7_Locimp@locale@std@@6B@ */
3920 const vtable_ptr MSVCP_locale__Locimp_vtable[] = {
3921     (vtable_ptr)THISCALL_NAME(MSVCP_locale__Locimp_vector_dtor)
3922 };
3923
3924 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
3925 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
3926 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
3927 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
3928 {
3929     TRACE("(%p %p)\n", this, locimp);
3930     /* Don't change locimp reference counter */
3931     this->ptr = locimp;
3932     return this;
3933 }
3934
3935 /* ??0locale@std@@QAE@ABV01@0H@Z */
3936 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
3937 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
3938 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
3939 {
3940     FIXME("(%p %p %p %d) stub\n", this, loc, other, cat);
3941     return NULL;
3942 }
3943
3944 /* ??0locale@std@@QAE@ABV01@@Z */
3945 /* ??0locale@std@@QEAA@AEBV01@@Z */
3946 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
3947 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
3948 {
3949     TRACE("(%p %p)\n", this, copy);
3950     this->ptr = copy->ptr;
3951     locale_facet__Incref(&this->ptr->facet);
3952     return this;
3953 }
3954
3955 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
3956 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
3957 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
3958 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
3959 {
3960     FIXME("(%p %p %s %d) stub\n", this, loc, locname, cat);
3961     return NULL;
3962 }
3963
3964 /* ??0locale@std@@QAE@PBDH@Z */
3965 /* ??0locale@std@@QEAA@PEBDH@Z */
3966 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
3967 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
3968 {
3969     FIXME("(%p %s %d) stub\n", this, locname, cat);
3970     return NULL;
3971 }
3972
3973 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
3974 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
3975 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
3976 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
3977 {
3978     TRACE("(%p)\n", this);
3979     this->ptr = NULL;
3980     return this;
3981 }
3982
3983 /* ??0locale@std@@QAE@XZ */
3984 /* ??0locale@std@@QEAA@XZ */
3985 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
3986 locale* __thiscall locale_ctor(locale *this)
3987 {
3988     TRACE("(%p)\n", this);
3989     this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
3990     if(!this->ptr) {
3991         ERR("Out of memory\n");
3992         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3993         return NULL;
3994     }
3995
3996     locale__Locimp_ctor(this->ptr);
3997     return this;
3998 }
3999
4000 /* ??1locale@std@@QAE@XZ */
4001 /* ??1locale@std@@QEAA@XZ */
4002 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
4003 void __thiscall locale_dtor(locale *this)
4004 {
4005     TRACE("(%p)\n", this);
4006     if(this->ptr)
4007         locale__Locimp_dtor(this->ptr);
4008 }
4009
4010 DEFINE_THISCALL_WRAPPER(MSVCP_locale_vector_dtor, 8)
4011 locale* __thiscall MSVCP_locale_vector_dtor(locale *this, unsigned int flags)
4012 {
4013     TRACE("(%p %x)\n", this, flags);
4014     if(flags & 2) {
4015         /* we have an array, with the number of elements stored before the first object */
4016         int i, *ptr = (int *)this-1;
4017
4018         for(i=*ptr-1; i>=0; i--)
4019             locale_dtor(this+i);
4020         MSVCRT_operator_delete(ptr);
4021     } else {
4022         locale_dtor(this);
4023         if(flags & 1)
4024             MSVCRT_operator_delete(this);
4025     }
4026
4027     return this;
4028 }
4029
4030 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
4031 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
4032 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
4033 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
4034 {
4035     FIXME("(%p %p) stub\n", this, loc);
4036     return NULL;
4037 }
4038
4039 /* ??8locale@std@@QBE_NABV01@@Z */
4040 /* ??8locale@std@@QEBA_NAEBV01@@Z */
4041 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
4042 MSVCP_bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
4043 {
4044     FIXME("(%p %p) stub\n", this, loc);
4045     return 0;
4046 }
4047
4048 /* ??9locale@std@@QBE_NABV01@@Z */
4049 /* ??9locale@std@@QEBA_NAEBV01@@Z */
4050 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
4051 MSVCP_bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
4052 {
4053     FIXME("(%p %p) stub\n", this, loc);
4054     return 0;
4055 }
4056
4057 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
4058 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
4059 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
4060 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, MSVCP_size_t id, MSVCP_size_t catmask)
4061 {
4062     TRACE("(%p %p %lu %lu)\n", this, facet, id, catmask);
4063
4064     if(this->ptr->facet.refs > 1) {
4065         locale__Locimp *new_ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
4066         if(!new_ptr) {
4067             ERR("Out of memory\n");
4068             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4069             return NULL;
4070         }
4071         locale__Locimp_copy_ctor(new_ptr, this->ptr);
4072         locale_facet__Decref(&this->ptr->facet);
4073         this->ptr = new_ptr;
4074     }
4075
4076     locale__Locimp__Addfac(this->ptr, facet, id);
4077
4078     if(catmask) {
4079         MSVCP_basic_string_char_dtor(&this->ptr->name);
4080         MSVCP_basic_string_char_ctor_cstr(&this->ptr->name, "*");
4081     }
4082     return this;
4083 }
4084
4085 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
4086 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
4087 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
4088 const locale_facet* __thiscall locale__Getfacet(const locale *this, MSVCP_size_t id)
4089 {
4090     FIXME("(%p %lu) stub\n", this, id);
4091     return NULL;
4092 }
4093
4094 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
4095 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
4096 locale__Locimp* __cdecl locale__Init(void)
4097 {
4098     FIXME("stub\n");
4099     return NULL;
4100 }
4101
4102 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
4103 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
4104 locale__Locimp* __cdecl locale__Getgloballocale(void)
4105 {
4106     FIXME("stub\n");
4107     return NULL;
4108 }
4109
4110 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
4111 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
4112 void __cdecl locale__Setgloballocale(void *locimp)
4113 {
4114     FIXME("(%p) stub\n", locimp);
4115 }
4116
4117 /* ?classic@locale@std@@SAABV12@XZ */
4118 /* ?classic@locale@std@@SAAEBV12@XZ */
4119 const locale* __cdecl locale_classic(void)
4120 {
4121     FIXME("stub\n");
4122     return NULL;
4123 }
4124
4125 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4126 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4127 DEFINE_THISCALL_WRAPPER(locale_name, 8)
4128 basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
4129 {
4130     TRACE( "(%p)\n", this);
4131     MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
4132     return ret;
4133 }
4134
4135 static const rtti_base_descriptor locale_facet_rtti_base_descriptor = {
4136     &locale_facet_type_info,
4137     0,
4138     { 0, -1, 0},
4139     64
4140 };
4141
4142 DEFINE_RTTI_DATA(collate_char, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$collate@D@std@@");
4143 DEFINE_RTTI_DATA(collate_wchar, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$collate@_W@std@@");
4144 DEFINE_RTTI_DATA(collate_short, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$collate@G@std@@");
4145 DEFINE_RTTI_DATA(ctype_base, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AUctype_base@std@@");
4146 DEFINE_RTTI_DATA(ctype_char, 0, 2, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, NULL, ".?AV?$ctype@D@std@@");
4147 DEFINE_RTTI_DATA(ctype_wchar, 0, 2, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, NULL, ".?AV?$ctype@_W@std@@");
4148 DEFINE_RTTI_DATA(ctype_short, 0, 2, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, NULL, ".?AV?$ctype@G@std@@");
4149 DEFINE_RTTI_DATA(numpunct_char, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$numpunct@D@std@@");
4150 DEFINE_RTTI_DATA(numpunct_wchar, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$numpunct@_W@std@@");
4151 DEFINE_RTTI_DATA(numpunct_short, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$numpunct@G@std@@");
4152 DEFINE_RTTI_DATA(num_get_char, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@");
4153 DEFINE_RTTI_DATA(num_get_wchar, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@");
4154 DEFINE_RTTI_DATA(num_get_short, 0, 1, &locale_facet_rtti_base_descriptor, NULL, NULL, ".?AV?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@");
4155
4156 #ifndef __GNUC__
4157 void __asm_dummy_vtables(void) {
4158 #endif
4159     __ASM_VTABLE(collate_char,
4160             VTABLE_ADD_FUNC(collate_char_do_compare)
4161             VTABLE_ADD_FUNC(collate_char_do_transform)
4162             VTABLE_ADD_FUNC(collate_char_do_hash));
4163     __ASM_VTABLE(collate_wchar,
4164             VTABLE_ADD_FUNC(collate_wchar_do_compare)
4165             VTABLE_ADD_FUNC(collate_wchar_do_transform)
4166             VTABLE_ADD_FUNC(collate_wchar_do_hash));
4167     __ASM_VTABLE(collate_short,
4168             VTABLE_ADD_FUNC(collate_wchar_do_compare)
4169             VTABLE_ADD_FUNC(collate_wchar_do_transform)
4170             VTABLE_ADD_FUNC(collate_wchar_do_hash));
4171     __ASM_VTABLE(ctype_base, "");
4172     __ASM_VTABLE(ctype_char,
4173             VTABLE_ADD_FUNC(ctype_char_do_tolower)
4174             VTABLE_ADD_FUNC(ctype_char_do_tolower_ch)
4175             VTABLE_ADD_FUNC(ctype_char_do_toupper)
4176             VTABLE_ADD_FUNC(ctype_char_do_toupper_ch)
4177             VTABLE_ADD_FUNC(ctype_char_do_widen)
4178             VTABLE_ADD_FUNC(ctype_char_do_widen_ch)
4179             VTABLE_ADD_FUNC(ctype_char__Do_widen_s)
4180             VTABLE_ADD_FUNC(ctype_char_do_narrow)
4181             VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
4182             VTABLE_ADD_FUNC(ctype_char__Do_narrow_s));
4183     __ASM_VTABLE(ctype_wchar,
4184             VTABLE_ADD_FUNC(ctype_wchar_do_is)
4185             VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
4186             VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
4187             VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
4188             VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
4189             VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
4190             VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
4191             VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
4192             VTABLE_ADD_FUNC(ctype_wchar_do_widen)
4193             VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
4194             VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
4195             VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
4196             VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
4197             VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s));
4198     __ASM_VTABLE(ctype_short,
4199             VTABLE_ADD_FUNC(ctype_wchar_do_is)
4200             VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
4201             VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
4202             VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
4203             VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
4204             VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
4205             VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
4206             VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
4207             VTABLE_ADD_FUNC(ctype_wchar_do_widen)
4208             VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
4209             VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
4210             VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
4211             VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
4212             VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s));
4213     __ASM_VTABLE(numpunct_char,
4214             VTABLE_ADD_FUNC(numpunct_char_do_decimal_point)
4215             VTABLE_ADD_FUNC(numpunct_char_do_thousands_sep)
4216             VTABLE_ADD_FUNC(numpunct_char_do_grouping)
4217             VTABLE_ADD_FUNC(numpunct_char_do_falsename)
4218             VTABLE_ADD_FUNC(numpunct_char_do_truename));
4219     __ASM_VTABLE(numpunct_wchar,
4220             VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
4221             VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
4222             VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
4223             VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
4224             VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
4225     __ASM_VTABLE(numpunct_short,
4226             VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
4227             VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
4228             VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
4229             VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
4230             VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
4231     __ASM_VTABLE(num_get_char,
4232             VTABLE_ADD_FUNC(num_get_char_do_get_void)
4233             VTABLE_ADD_FUNC(num_get_char_do_get_double)
4234             VTABLE_ADD_FUNC(num_get_char_do_get_double)
4235             VTABLE_ADD_FUNC(num_get_char_do_get_float)
4236             VTABLE_ADD_FUNC(num_get_char_do_get_uint64)
4237             VTABLE_ADD_FUNC(num_get_char_do_get_int64)
4238             VTABLE_ADD_FUNC(num_get_char_do_get_ulong)
4239             VTABLE_ADD_FUNC(num_get_char_do_get_long)
4240             VTABLE_ADD_FUNC(num_get_char_do_get_uint)
4241             VTABLE_ADD_FUNC(num_get_char_do_get_ushort)
4242             VTABLE_ADD_FUNC(num_get_char_do_get_bool));
4243     __ASM_VTABLE(num_get_short,
4244             VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
4245             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
4246             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
4247             VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
4248             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
4249             VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
4250             VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
4251             VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
4252             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
4253             VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
4254             VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
4255     __ASM_VTABLE(num_get_wchar,
4256             VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
4257             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
4258             VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
4259             VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
4260             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
4261             VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
4262             VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
4263             VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
4264             VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
4265             VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
4266             VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
4267 #ifndef __GNUC__
4268 }
4269 #endif