msvcp90: Added num_get<char>::get functions implementation.
[wine/multimedia.git] / dlls / msvcp90 / locale.c
blob5a2dd86fad681fbf99df613c6abca94f60ff7051
1 /*
2 * Copyright 2010 Piotr Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "config.h"
21 #include <stdarg.h>
23 #include "msvcp90.h"
24 #include "locale.h"
25 #include "errno.h"
26 #include "limits.h"
27 #include "math.h"
28 #include "stdio.h"
30 #include "wine/list.h"
32 #include "windef.h"
33 #include "winbase.h"
34 #include "winnls.h"
35 #include "wine/unicode.h"
36 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(msvcp90);
39 char* __cdecl _Getdays(void);
40 char* __cdecl _Getmonths(void);
41 void* __cdecl _Gettnames(void);
42 unsigned int __cdecl ___lc_codepage_func(void);
43 LCID* __cdecl ___lc_handle_func(void);
44 const locale_facet* __thiscall locale__Getfacet(const locale*, MSVCP_size_t);
46 typedef int category;
48 typedef struct {
49 MSVCP_size_t id;
50 } locale_id;
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;
61 typedef struct {
62 void *timeptr;
63 } _Timevec;
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;
73 typedef struct {
74 LCID handle;
75 unsigned page;
76 } _Collvec;
78 typedef struct {
79 locale_facet facet;
80 _Collvec coll;
81 } collate;
83 typedef struct {
84 locale_facet facet;
85 const char *grouping;
86 char dp;
87 char sep;
88 const char *false_name;
89 const char *true_name;
90 } numpunct_char;
92 typedef struct {
93 locale_facet facet;
94 const char *grouping;
95 wchar_t dp;
96 wchar_t sep;
97 const wchar_t *false_name;
98 const wchar_t *true_name;
99 } numpunct_wchar;
101 typedef struct {
102 locale_facet facet;
103 _Cvtvec cvt;
104 } num_get;
106 typedef struct _istreambuf_iterator_char
108 basic_streambuf_char *strbuf;
109 MSVCP_bool got;
110 char val;
111 } istreambuf_iterator_char;
113 typedef struct _istreambuf_iterator_wchar
115 basic_streambuf_wchar *strbuf;
116 MSVCP_bool got;
117 wchar_t val;
118 } istreambuf_iterator_wchar;
120 /* ?_Id_cnt@id@locale@std@@0HA */
121 int locale_id__Id_cnt = 0;
123 static locale__Locimp *global_locale;
124 static locale classic_locale;
126 /* ?_Clocptr@_Locimp@locale@std@@0PAV123@A */
127 /* ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA */
128 locale__Locimp *locale__Locimp__Clocptr = NULL;
130 static char istreambuf_iterator_char_val(istreambuf_iterator_char *this)
132 if(this->strbuf && !this->got) {
133 int c = basic_streambuf_char_sgetc(this->strbuf);
134 if(c == EOF)
135 this->strbuf = NULL;
136 else
137 this->val = c;
140 this->got = TRUE;
141 return this->val;
144 static void istreambuf_iterator_char_inc(istreambuf_iterator_char *this)
146 if(!this->strbuf || basic_streambuf_char_sbumpc(this->strbuf)==EOF) {
147 this->strbuf = NULL;
148 this->got = TRUE;
149 }else {
150 this->got = FALSE;
151 istreambuf_iterator_char_val(this);
155 /* ??1facet@locale@std@@UAE@XZ */
156 /* ??1facet@locale@std@@UEAA@XZ */
157 DEFINE_THISCALL_WRAPPER(locale_facet_dtor, 4)
158 void __thiscall locale_facet_dtor(locale_facet *this)
160 TRACE("(%p)\n", this);
163 DEFINE_THISCALL_WRAPPER(MSVCP_locale_facet_vector_dtor, 8)
164 #define call_locale_facet_vector_dtor(this, flags) CALL_VTBL_FUNC(this, 0, \
165 locale_facet*, (locale_facet*, unsigned int), (this, flags))
166 locale_facet* __thiscall MSVCP_locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
168 TRACE("(%p %x)\n", this, flags);
169 if(flags & 2) {
170 /* we have an array, with the number of elements stored before the first object */
171 int i, *ptr = (int *)this-1;
173 for(i=*ptr-1; i>=0; i--)
174 locale_facet_dtor(this+i);
175 MSVCRT_operator_delete(ptr);
176 } else {
177 locale_facet_dtor(this);
178 if(flags & 1)
179 MSVCRT_operator_delete(this);
182 return this;
185 typedef struct
187 locale_facet *fac;
188 struct list entry;
189 } facets_elem;
190 static struct list lazy_facets = LIST_INIT(lazy_facets);
192 /* Not exported from msvcp90 */
193 /* ?facet_Register@facet@locale@std@@CAXPAV123@@Z */
194 /* ?facet_Register@facet@locale@std@@CAXPEAV123@@Z */
195 void __cdecl locale_facet_register(locale_facet *add)
197 facets_elem *head = MSVCRT_operator_new(sizeof(*head));
198 if(!head) {
199 ERR("Out of memory\n");
200 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
203 head->fac = add;
204 list_add_head(&lazy_facets, &head->entry);
207 /* Not exported from msvcp90 */
208 /* ??_7facet@locale@std@@6B@ */
209 extern const vtable_ptr MSVCP_locale_facet_vtable;
211 /* ??0id@locale@std@@QAE@I@Z */
212 /* ??0id@locale@std@@QEAA@_K@Z */
213 DEFINE_THISCALL_WRAPPER(locale_id_ctor_id, 8)
214 locale_id* __thiscall locale_id_ctor_id(locale_id *this, MSVCP_size_t id)
216 TRACE("(%p %lu)\n", this, id);
218 this->id = id;
219 return this;
222 /* ??_Fid@locale@std@@QAEXXZ */
223 /* ??_Fid@locale@std@@QEAAXXZ */
224 DEFINE_THISCALL_WRAPPER(locale_id_ctor, 4)
225 locale_id* __thiscall locale_id_ctor(locale_id *this)
227 TRACE("(%p)\n", this);
229 this->id = 0;
230 return this;
233 /* ??Bid@locale@std@@QAEIXZ */
234 /* ??Bid@locale@std@@QEAA_KXZ */
235 DEFINE_THISCALL_WRAPPER(locale_id_operator_size_t, 4)
236 MSVCP_size_t __thiscall locale_id_operator_size_t(locale_id *this)
238 _Lockit lock;
240 TRACE("(%p)\n", this);
242 if(!this->id) {
243 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
244 this->id = ++locale_id__Id_cnt;
245 _Lockit_dtor(&lock);
248 return this->id;
251 /* ?_Id_cnt_func@id@locale@std@@CAAAHXZ */
252 /* ?_Id_cnt_func@id@locale@std@@CAAEAHXZ */
253 int* __cdecl locale_id__Id_cnt_func(void)
255 TRACE("\n");
256 return &locale_id__Id_cnt;
259 /* ??_Ffacet@locale@std@@QAEXXZ */
260 /* ??_Ffacet@locale@std@@QEAAXXZ */
261 DEFINE_THISCALL_WRAPPER(locale_facet_ctor, 4)
262 locale_facet* __thiscall locale_facet_ctor(locale_facet *this)
264 TRACE("(%p)\n", this);
265 this->vtable = &MSVCP_locale_facet_vtable;
266 this->refs = 0;
267 return this;
270 /* ??0facet@locale@std@@IAE@I@Z */
271 /* ??0facet@locale@std@@IEAA@_K@Z */
272 DEFINE_THISCALL_WRAPPER(locale_facet_ctor_refs, 8)
273 locale_facet* __thiscall locale_facet_ctor_refs(locale_facet *this, MSVCP_size_t refs)
275 TRACE("(%p %lu)\n", this, refs);
276 this->vtable = &MSVCP_locale_facet_vtable;
277 this->refs = refs;
278 return this;
281 /* ?_Incref@facet@locale@std@@QAEXXZ */
282 /* ?_Incref@facet@locale@std@@QEAAXXZ */
283 DEFINE_THISCALL_WRAPPER(locale_facet__Incref, 4)
284 void __thiscall locale_facet__Incref(locale_facet *this)
286 _Lockit lock;
288 TRACE("(%p)\n", this);
290 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
291 this->refs++;
292 _Lockit_dtor(&lock);
295 /* ?_Decref@facet@locale@std@@QAEPAV123@XZ */
296 /* ?_Decref@facet@locale@std@@QEAAPEAV123@XZ */
297 DEFINE_THISCALL_WRAPPER(locale_facet__Decref, 4)
298 locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
300 _Lockit lock;
301 locale_facet *ret;
303 TRACE("(%p)\n", this);
305 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
306 if(this->refs)
307 this->refs--;
309 ret = this->refs ? NULL : this;
310 _Lockit_dtor(&lock);
312 return ret;
315 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z */
316 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z */
317 MSVCP_size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const locale *loc)
319 TRACE("(%p %p)\n", facet, loc);
320 return -1;
323 /* ??0_Timevec@std@@QAE@ABV01@@Z */
324 /* ??0_Timevec@std@@QEAA@AEBV01@@Z */
325 /* This copy constructor modifies copied object */
326 DEFINE_THISCALL_WRAPPER(_Timevec_copy_ctor, 8)
327 _Timevec* __thiscall _Timevec_copy_ctor(_Timevec *this, _Timevec *copy)
329 TRACE("(%p %p)\n", this, copy);
330 this->timeptr = copy->timeptr;
331 copy->timeptr = NULL;
332 return this;
335 /* ??0_Timevec@std@@QAE@PAX@Z */
336 /* ??0_Timevec@std@@QEAA@PEAX@Z */
337 DEFINE_THISCALL_WRAPPER(_Timevec_ctor_timeptr, 8)
338 _Timevec* __thiscall _Timevec_ctor_timeptr(_Timevec *this, void *timeptr)
340 TRACE("(%p %p)\n", this, timeptr);
341 this->timeptr = timeptr;
342 return this;
345 /* ??_F_Timevec@std@@QAEXXZ */
346 /* ??_F_Timevec@std@@QEAAXXZ */
347 DEFINE_THISCALL_WRAPPER(_Timevec_ctor, 4)
348 _Timevec* __thiscall _Timevec_ctor(_Timevec *this)
350 TRACE("(%p)\n", this);
351 this->timeptr = NULL;
352 return this;
355 /* ??1_Timevec@std@@QAE@XZ */
356 /* ??1_Timevec@std@@QEAA@XZ */
357 DEFINE_THISCALL_WRAPPER(_Timevec_dtor, 4)
358 void __thiscall _Timevec_dtor(_Timevec *this)
360 TRACE("(%p)\n", this);
361 free(this->timeptr);
364 /* ??4_Timevec@std@@QAEAAV01@ABV01@@Z */
365 /* ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z */
366 DEFINE_THISCALL_WRAPPER(_Timevec_op_assign, 8)
367 _Timevec* __thiscall _Timevec_op_assign(_Timevec *this, _Timevec *right)
369 TRACE("(%p %p)\n", this, right);
370 this->timeptr = right->timeptr;
371 right->timeptr = NULL;
372 return this;
375 /* ?_Getptr@_Timevec@std@@QBEPAXXZ */
376 /* ?_Getptr@_Timevec@std@@QEBAPEAXXZ */
377 DEFINE_THISCALL_WRAPPER(_Timevec__Getptr, 4)
378 void* __thiscall _Timevec__Getptr(_Timevec *this)
380 TRACE("(%p)\n", this);
381 return this->timeptr;
384 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z */
385 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z */
386 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
388 const char *locale = NULL;
390 /* This function is probably modifying more global objects */
391 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
393 if(!locstr)
394 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
396 _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
397 MSVCP_basic_string_char_ctor_cstr(&locinfo->days, "");
398 MSVCP_basic_string_char_ctor_cstr(&locinfo->months, "");
399 MSVCP_basic_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
401 if(category)
402 locale = setlocale(LC_ALL, locstr);
403 else
404 locale = setlocale(LC_ALL, NULL);
406 if(locale)
407 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
408 else
409 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
411 return locinfo;
414 /* ??0_Locinfo@std@@QAE@HPBD@Z */
415 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
416 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
417 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
419 return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
422 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
423 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
424 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
426 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
429 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
430 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
431 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
432 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
434 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
437 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
438 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
439 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
441 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
444 /* ??0_Locinfo@std@@QAE@PBD@Z */
445 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
446 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
447 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
449 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
452 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
453 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
454 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
456 TRACE("(%p)\n", locinfo);
458 setlocale(LC_ALL, MSVCP_basic_string_char_c_str(&locinfo->oldlocname));
459 MSVCP_basic_string_char_dtor(&locinfo->days);
460 MSVCP_basic_string_char_dtor(&locinfo->months);
461 MSVCP_basic_string_char_dtor(&locinfo->oldlocname);
462 MSVCP_basic_string_char_dtor(&locinfo->newlocname);
463 _Lockit_dtor(&locinfo->lock);
466 /* ??_F_Locinfo@std@@QAEXXZ */
467 /* ??_F_Locinfo@std@@QEAAXXZ */
468 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
469 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
471 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
474 /* ??1_Locinfo@std@@QAE@XZ */
475 /* ??1_Locinfo@std@@QEAA@XZ */
476 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
477 void __thiscall _Locinfo_dtor(_Locinfo *this)
479 _Locinfo__Locinfo_dtor(this);
482 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
483 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
484 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
486 const char *locale = NULL;
488 /* This function is probably modifying more global objects */
489 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
490 if(!locstr)
491 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
493 MSVCP_basic_string_char_dtor(&locinfo->newlocname);
495 if(category)
496 locale = setlocale(LC_ALL, locstr);
497 else
498 locale = setlocale(LC_ALL, NULL);
500 if(locale)
501 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, locale);
502 else
503 MSVCP_basic_string_char_ctor_cstr(&locinfo->newlocname, "*");
505 return locinfo;
508 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
509 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
510 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
511 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
513 return _Locinfo__Locinfo_Addcats(this, category, locstr);
516 /* _Getcoll */
517 _Collvec __cdecl _Getcoll(void)
519 _Collvec ret;
520 _locale_t locale = _get_current_locale();
522 TRACE("\n");
524 ret.page = locale->locinfo->lc_collate_cp;
525 ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
526 _free_locale(locale);
527 return ret;
530 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
531 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
532 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
533 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
535 *ret = _Getcoll();
536 return ret;
539 /* _Getctype */
540 _Ctypevec __cdecl _Getctype(void)
542 _Ctypevec ret;
543 _locale_t locale = _get_current_locale();
544 short *table;
546 TRACE("\n");
548 ret.page = locale->locinfo->lc_codepage;
549 ret.handle = locale->locinfo->lc_handle[LC_COLLATE];
550 ret.delfl = TRUE;
551 table = malloc(sizeof(short[256]));
552 if(!table) {
553 _free_locale(locale);
554 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
556 memcpy(table, locale->locinfo->pctype, sizeof(short[256]));
557 ret.table = table;
558 _free_locale(locale);
559 return ret;
562 /* ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ */
563 /* ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ */
564 DEFINE_THISCALL_WRAPPER(_Locinfo__Getctype, 8)
565 _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
567 *ret = _Getctype();
568 return ret;
571 /* _Getcvt */
572 _Cvtvec __cdecl _Getcvt(void)
574 _Cvtvec ret;
575 _locale_t locale = _get_current_locale();
577 TRACE("\n");
579 ret.page = locale->locinfo->lc_codepage;
580 ret.handle = locale->locinfo->lc_handle[LC_CTYPE];
581 _free_locale(locale);
582 return ret;
585 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
586 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
587 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
588 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
590 *ret = _Getcvt();
591 return ret;
594 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
595 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
596 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
597 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
599 FIXME("(%p) stub\n", this);
600 return 0;
603 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
604 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
605 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
606 const char* __thiscall _Locinfo__Getdays(_Locinfo *this)
608 char *days = _Getdays();
610 TRACE("(%p)\n", this);
612 if(days) {
613 MSVCP_basic_string_char_dtor(&this->days);
614 MSVCP_basic_string_char_ctor_cstr(&this->days, days);
615 free(days);
618 return this->days.size ? MSVCP_basic_string_char_c_str(&this->days) :
619 ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
622 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
623 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
624 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
625 const char* __thiscall _Locinfo__Getmonths(_Locinfo *this)
627 char *months = _Getmonths();
629 TRACE("(%p)\n", this);
631 if(months) {
632 MSVCP_basic_string_char_dtor(&this->months);
633 MSVCP_basic_string_char_ctor_cstr(&this->months, months);
634 free(months);
637 return this->months.size ? MSVCP_basic_string_char_c_str(&this->months) :
638 ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
639 ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
642 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
643 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
644 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
645 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
647 TRACE("(%p)\n", this);
648 return "false";
651 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
652 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
653 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
654 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
656 TRACE("(%p)\n", this);
657 return "true";
660 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
661 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
662 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
663 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
665 TRACE("(%p)\n", this);
666 return localeconv();
669 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
670 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
671 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
672 basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
674 TRACE("(%p)\n", this);
676 MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
677 return ret;
680 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
681 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
682 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
683 _Timevec*__thiscall _Locinfo__Gettnames(const _Locinfo *this, _Timevec *ret)
685 TRACE("(%p)\n", this);
687 _Timevec_ctor_timeptr(ret, _Gettnames());
688 return ret;
691 /* ?id@?$collate@D@std@@2V0locale@2@A */
692 locale_id collate_char_id = {0};
694 /* ??_7?$collate@D@std@@6B@ */
695 extern const vtable_ptr MSVCP_collate_char_vtable;
697 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
698 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
699 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
700 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
702 TRACE("(%p %p)\n", this, locinfo);
703 _Locinfo__Getcoll(locinfo, &this->coll);
706 /* ??0?$collate@D@std@@IAE@PBDI@Z */
707 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
708 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
709 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
711 _Locinfo locinfo;
713 TRACE("(%p %s %lu)\n", this, name, refs);
715 locale_facet_ctor_refs(&this->facet, refs);
716 this->facet.vtable = &MSVCP_collate_char_vtable;
718 _Locinfo_ctor_cstr(&locinfo, name);
719 collate_char__Init(this, &locinfo);
720 _Locinfo_dtor(&locinfo);
721 return this;
724 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
725 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
726 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
727 collate* __thiscall collate_char_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
729 TRACE("(%p %p %lu)\n", this, locinfo, refs);
731 locale_facet_ctor_refs(&this->facet, refs);
732 this->facet.vtable = &MSVCP_collate_char_vtable;
733 collate_char__Init(this, locinfo);
734 return this;
737 /* ??0?$collate@D@std@@QAE@I@Z */
738 /* ??0?$collate@D@std@@QEAA@_K@Z */
739 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
740 collate* __thiscall collate_char_ctor_refs(collate *this, MSVCP_size_t refs)
742 return collate_char_ctor_name(this, "C", refs);
745 /* ??1?$collate@D@std@@MAE@XZ */
746 /* ??1?$collate@D@std@@MEAA@XZ */
747 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
748 void __thiscall collate_char_dtor(collate *this)
750 TRACE("(%p)\n", this);
753 DEFINE_THISCALL_WRAPPER(MSVCP_collate_char_vector_dtor, 8)
754 collate* __thiscall MSVCP_collate_char_vector_dtor(collate *this, unsigned int flags)
756 TRACE("(%p %x)\n", this, flags);
757 if(flags & 2) {
758 /* we have an array, with the number of elements stored before the first object */
759 int i, *ptr = (int *)this-1;
761 for(i=*ptr-1; i>=0; i--)
762 collate_char_dtor(this+i);
763 MSVCRT_operator_delete(ptr);
764 } else {
765 collate_char_dtor(this);
766 if(flags & 1)
767 MSVCRT_operator_delete(this);
770 return this;
773 /* ??_F?$collate@D@std@@QAEXXZ */
774 /* ??_F?$collate@D@std@@QEAAXXZ */
775 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
776 collate* __thiscall collate_char_ctor(collate *this)
778 return collate_char_ctor_name(this, "C", 0);
781 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
782 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
783 MSVCP_size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale *loc)
785 TRACE("(%p %p)\n", facet, loc);
787 if(facet && !*facet) {
788 *facet = MSVCRT_operator_new(sizeof(collate));
789 if(!*facet) {
790 ERR("Out of memory\n");
791 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
792 return 0;
794 collate_char_ctor_name((collate*)*facet,
795 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0);
798 return LC_COLLATE;
801 /* _Strcoll */
802 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
803 const char *last2, const _Collvec *coll)
805 LCID lcid;
807 TRACE("(%s %s)\n", debugstr_an(first1, last1-first1), debugstr_an(first2, last2-first2));
809 if(coll)
810 lcid = coll->handle;
811 else
812 lcid = ___lc_handle_func()[LC_COLLATE];
813 return CompareStringA(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
816 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
817 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
818 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
819 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
820 (const collate*, const char*, const char*, const char*, const char*), \
821 (this, first1, last1, first2, last2))
822 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
823 const char *last1, const char *first2, const char *last2)
825 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
826 return _Strcoll(first1, last1, first2, last2, &this->coll);
829 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
830 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
831 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
832 int __thiscall collate_char_compare(const collate *this, const char *first1,
833 const char *last1, const char *first2, const char *last2)
835 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
836 return call_collate_char_do_compare(this, first1, last1, first2, last2);
839 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
840 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
841 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
842 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
843 (const collate*, const char*, const char*), (this, first, last))
844 LONG __thiscall collate_char_do_hash(const collate *this,
845 const char *first, const char *last)
847 ULONG ret = 0;
849 TRACE("(%p %p %p)\n", this, first, last);
851 for(; first<last; first++)
852 ret = (ret<<8 | ret>>24) + *first;
853 return ret;
856 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
857 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
858 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
859 LONG __thiscall collate_char_hash(const collate *this,
860 const char *first, const char *last)
862 TRACE("(%p %p %p)\n", this, first, last);
863 return call_collate_char_do_hash(this, first, last);
866 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
867 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
868 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
869 basic_string_char* __thiscall collate_char_do_transform(const collate *this,
870 basic_string_char *ret, const char *first, const char *last)
872 FIXME("(%p %p %p) stub\n", this, first, last);
873 return ret;
876 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
877 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
878 DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
879 basic_string_char* __thiscall collate_char_transform(const collate *this,
880 basic_string_char *ret, const char *first, const char *last)
882 FIXME("(%p %p %p) stub\n", this, first, last);
883 return ret;
886 /* ?id@?$collate@_W@std@@2V0locale@2@A */
887 locale_id collate_wchar_id = {0};
888 /* ?id@?$collate@G@std@@2V0locale@2@A */
889 locale_id collate_short_id = {0};
891 /* ??_7?$collate@_W@std@@6B@ */
892 extern const vtable_ptr MSVCP_collate_wchar_vtable;
893 /* ??_7?$collate@G@std@@6B@ */
894 extern const vtable_ptr MSVCP_collate_short_vtable;
896 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
897 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
898 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
899 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
900 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
901 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
903 TRACE("(%p %p)\n", this, locinfo);
904 _Locinfo__Getcoll(locinfo, &this->coll);
907 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
908 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
909 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
910 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
912 _Locinfo locinfo;
914 TRACE("(%p %s %lu)\n", this, name, refs);
916 locale_facet_ctor_refs(&this->facet, refs);
917 this->facet.vtable = &MSVCP_collate_wchar_vtable;
919 _Locinfo_ctor_cstr(&locinfo, name);
920 collate_wchar__Init(this, &locinfo);
921 _Locinfo_dtor(&locinfo);
922 return this;
925 /* ??0?$collate@G@std@@IAE@PBDI@Z */
926 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
927 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
928 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
930 collate *ret = collate_wchar_ctor_name(this, name, refs);
931 ret->facet.vtable = &MSVCP_collate_short_vtable;
932 return ret;
935 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
936 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
937 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
938 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
940 TRACE("(%p %p %lu)\n", this, locinfo, refs);
942 locale_facet_ctor_refs(&this->facet, refs);
943 this->facet.vtable = &MSVCP_collate_wchar_vtable;
944 collate_wchar__Init(this, locinfo);
945 return this;
948 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
949 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
950 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
951 collate* __thiscall collate_short_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
953 collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
954 ret->facet.vtable = &MSVCP_collate_short_vtable;
955 return ret;
958 /* ??0?$collate@_W@std@@QAE@I@Z */
959 /* ??0?$collate@_W@std@@QEAA@_K@Z */
960 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
961 collate* __thiscall collate_wchar_ctor_refs(collate *this, MSVCP_size_t refs)
963 return collate_wchar_ctor_name(this, "C", refs);
966 /* ??0?$collate@G@std@@QAE@I@Z */
967 /* ??0?$collate@G@std@@QEAA@_K@Z */
968 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
969 collate* __thiscall collate_short_ctor_refs(collate *this, MSVCP_size_t refs)
971 collate *ret = collate_wchar_ctor_refs(this, refs);
972 ret->facet.vtable = &MSVCP_collate_short_vtable;
973 return ret;
976 /* ??1?$collate@_W@std@@MAE@XZ */
977 /* ??1?$collate@_W@std@@MEAA@XZ */
978 /* ??1?$collate@G@std@@MAE@XZ */
979 /* ??1?$collate@G@std@@MEAA@XZ */
980 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
981 void __thiscall collate_wchar_dtor(collate *this)
983 TRACE("(%p)\n", this);
986 DEFINE_THISCALL_WRAPPER(MSVCP_collate_wchar_vector_dtor, 8)
987 collate* __thiscall MSVCP_collate_wchar_vector_dtor(collate *this, unsigned int flags)
989 TRACE("(%p %x)\n", this, flags);
990 if(flags & 2) {
991 /* we have an array, with the number of elements stored before the first object */
992 int i, *ptr = (int *)this-1;
994 for(i=*ptr-1; i>=0; i--)
995 collate_wchar_dtor(this+i);
996 MSVCRT_operator_delete(ptr);
997 } else {
998 collate_wchar_dtor(this);
999 if(flags & 1)
1000 MSVCRT_operator_delete(this);
1003 return this;
1006 DEFINE_THISCALL_WRAPPER(MSVCP_collate_short_vector_dtor, 8)
1007 collate* __thiscall MSVCP_collate_short_vector_dtor(collate *this, unsigned int flags)
1009 return MSVCP_collate_wchar_vector_dtor(this, flags);
1012 /* ??_F?$collate@_W@std@@QAEXXZ */
1013 /* ??_F?$collate@_W@std@@QEAAXXZ */
1014 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
1015 collate* __thiscall collate_wchar_ctor(collate *this)
1017 return collate_wchar_ctor_name(this, "C", 0);
1020 /* ??_F?$collate@G@std@@QAEXXZ */
1021 /* ??_F?$collate@G@std@@QEAAXXZ */
1022 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
1023 collate* __thiscall collate_short_ctor(collate *this)
1025 collate *ret = collate_wchar_ctor(this);
1026 ret->facet.vtable = &MSVCP_collate_short_vtable;
1027 return ret;
1030 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1031 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1032 MSVCP_size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale *loc)
1034 TRACE("(%p %p)\n", facet, loc);
1036 if(facet && !*facet) {
1037 *facet = MSVCRT_operator_new(sizeof(collate));
1038 if(!*facet) {
1039 ERR("Out of memory\n");
1040 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1041 return 0;
1043 collate_wchar_ctor_name((collate*)*facet,
1044 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0);
1047 return LC_COLLATE;
1050 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1051 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1052 MSVCP_size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
1054 if(facet && !*facet) {
1055 collate_wchar__Getcat(facet, loc);
1056 (*(locale_facet**)facet)->vtable = &MSVCP_collate_short_vtable;
1059 return LC_COLLATE;
1062 /* _Wcscoll */
1063 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
1064 const wchar_t *last2, const _Collvec *coll)
1066 LCID lcid;
1068 TRACE("(%s %s)\n", debugstr_wn(first1, last1-first1), debugstr_wn(first2, last2-first2));
1070 if(coll)
1071 lcid = coll->handle;
1072 else
1073 lcid = ___lc_handle_func()[LC_COLLATE];
1074 return CompareStringW(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1077 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
1078 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
1079 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
1080 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
1081 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
1082 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1083 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1084 (this, first1, last1, first2, last2))
1085 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
1086 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1088 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1089 return _Wcscoll(first1, last1, first2, last2, &this->coll);
1092 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
1093 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
1094 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
1095 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
1096 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
1097 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
1098 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1100 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1101 return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
1104 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
1105 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
1106 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
1107 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
1108 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
1109 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1110 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1111 LONG __thiscall collate_wchar_do_hash(const collate *this,
1112 const wchar_t *first, const wchar_t *last)
1114 ULONG ret = 0;
1116 TRACE("(%p %p %p)\n", this, first, last);
1118 for(; first<last; first++)
1119 ret = (ret<<8 | ret>>24) + *first;
1120 return ret;
1123 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
1124 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
1125 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
1126 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
1127 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
1128 LONG __thiscall collate_wchar_hash(const collate *this,
1129 const wchar_t *first, const wchar_t *last)
1131 TRACE("(%p %p %p)\n", this, first, last);
1132 return call_collate_wchar_do_hash(this, first, last);
1135 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1136 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1137 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1138 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1139 DEFINE_THISCALL_WRAPPER(collate_wchar_do_transform, 16)
1140 basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
1141 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1143 FIXME("(%p %p %p) stub\n", this, first, last);
1144 return ret;
1147 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1148 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1149 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1150 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1151 DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
1152 basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
1153 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1155 FIXME("(%p %p %p) stub\n", this, first, last);
1156 return ret;
1159 /* ??_7ctype_base@std@@6B@ */
1160 extern const vtable_ptr MSVCP_ctype_base_vtable;
1162 /* ??0ctype_base@std@@QAE@I@Z */
1163 /* ??0ctype_base@std@@QEAA@_K@Z */
1164 DEFINE_THISCALL_WRAPPER(ctype_base_ctor_refs, 8)
1165 ctype_base* __thiscall ctype_base_ctor_refs(ctype_base *this, MSVCP_size_t refs)
1167 TRACE("(%p %lu)\n", this, refs);
1168 locale_facet_ctor_refs(&this->facet, refs);
1169 this->facet.vtable = &MSVCP_ctype_base_vtable;
1170 return this;
1173 /* ??_Fctype_base@std@@QAEXXZ */
1174 /* ??_Fctype_base@std@@QEAAXXZ */
1175 DEFINE_THISCALL_WRAPPER(ctype_base_ctor, 4)
1176 ctype_base* __thiscall ctype_base_ctor(ctype_base *this)
1178 TRACE("(%p)\n", this);
1179 locale_facet_ctor_refs(&this->facet, 0);
1180 this->facet.vtable = &MSVCP_ctype_base_vtable;
1181 return this;
1184 /* ??1ctype_base@std@@UAE@XZ */
1185 /* ??1ctype_base@std@@UEAA@XZ */
1186 DEFINE_THISCALL_WRAPPER(ctype_base_dtor, 4)
1187 void __thiscall ctype_base_dtor(ctype_base *this)
1189 TRACE("(%p)\n", this);
1192 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_base_vector_dtor, 8)
1193 ctype_base* __thiscall MSVCP_ctype_base_vector_dtor(ctype_base *this, unsigned int flags)
1195 TRACE("(%p %x)\n", this, flags);
1196 if(flags & 2) {
1197 /* we have an array, with the number of elements stored before the first object */
1198 int i, *ptr = (int *)this-1;
1200 for(i=*ptr-1; i>=0; i--)
1201 ctype_base_dtor(this+i);
1202 MSVCRT_operator_delete(ptr);
1203 } else {
1204 ctype_base_dtor(this);
1205 if(flags & 1)
1206 MSVCRT_operator_delete(this);
1209 return this;
1212 /* ?_Xran@ctype_base@std@@KAXXZ */
1213 void __cdecl ctype_base__Xran(void)
1215 throw_exception(EXCEPTION_OUT_OF_RANGE, "out of range in ctype<T>");
1218 /* ?id@?$ctype@D@std@@2V0locale@2@A */
1219 locale_id ctype_char_id = {0};
1220 /* ?table_size@?$ctype@D@std@@2IB */
1221 /* ?table_size@?$ctype@D@std@@2_KB */
1222 MSVCP_size_t ctype_char_table_size = 256;
1224 /* ??_7?$ctype@D@std@@6B@ */
1225 extern const vtable_ptr MSVCP_ctype_char_vtable;
1227 /* ?_Id_func@?$ctype@D@std@@SAAAVid@locale@2@XZ */
1228 /* ?_Id_func@?$ctype@D@std@@SAAEAVid@locale@2@XZ */
1229 locale_id* __cdecl ctype_char__Id_func(void)
1231 TRACE("()\n");
1232 return &ctype_char_id;
1235 /* ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z */
1236 /* ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z */
1237 DEFINE_THISCALL_WRAPPER(ctype_char__Init, 8)
1238 void __thiscall ctype_char__Init(ctype_char *this, _Locinfo *locinfo)
1240 TRACE("(%p %p)\n", this, locinfo);
1241 _Locinfo__Getctype(locinfo, &this->ctype);
1244 /* ?_Tidy@?$ctype@D@std@@IAEXXZ */
1245 /* ?_Tidy@?$ctype@D@std@@IEAAXXZ */
1246 DEFINE_THISCALL_WRAPPER(ctype_char__Tidy, 4)
1247 void __thiscall ctype_char__Tidy(ctype_char *this)
1249 TRACE("(%p)\n", this);
1251 if(this->ctype.delfl)
1252 free((short*)this->ctype.table);
1255 /* ?classic_table@?$ctype@D@std@@KAPBFXZ */
1256 /* ?classic_table@?$ctype@D@std@@KAPEBFXZ */
1257 const short* __cdecl ctype_char_classic_table(void)
1259 TRACE("()\n");
1260 return &((short*)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "_ctype"))[1];
1263 /* ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z */
1264 /* ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1265 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_locinfo, 12)
1266 ctype_char* __thiscall ctype_char_ctor_locinfo(ctype_char *this,
1267 _Locinfo *locinfo, MSVCP_size_t refs)
1269 TRACE("(%p %p %lu)\n", this, locinfo, refs);
1270 ctype_base_ctor_refs(&this->base, refs);
1271 this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1272 ctype_char__Init(this, locinfo);
1273 return this;
1276 /* ??0?$ctype@D@std@@QAE@PBF_NI@Z */
1277 /* ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z */
1278 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_table, 16)
1279 ctype_char* __thiscall ctype_char_ctor_table(ctype_char *this,
1280 const short *table, MSVCP_bool delete, MSVCP_size_t refs)
1282 _Locinfo locinfo;
1284 TRACE("(%p %p %d %lu)\n", this, table, delete, refs);
1286 ctype_base_ctor_refs(&this->base, refs);
1287 this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1289 _Locinfo_ctor(&locinfo);
1290 ctype_char__Init(this, &locinfo);
1291 _Locinfo_dtor(&locinfo);
1293 if(table) {
1294 ctype_char__Tidy(this);
1295 this->ctype.table = table;
1296 this->ctype.delfl = delete;
1298 return this;
1301 /* ??_F?$ctype@D@std@@QAEXXZ */
1302 /* ??_F?$ctype@D@std@@QEAAXXZ */
1303 DEFINE_THISCALL_WRAPPER(ctype_char_ctor, 4)
1304 ctype_char* __thiscall ctype_char_ctor(ctype_char *this)
1306 return ctype_char_ctor_table(this, NULL, FALSE, 0);
1309 /* ??1?$ctype@D@std@@MAE@XZ */
1310 /* ??1?$ctype@D@std@@MEAA@XZ */
1311 DEFINE_THISCALL_WRAPPER(ctype_char_dtor, 4)
1312 void __thiscall ctype_char_dtor(ctype_char *this)
1314 TRACE("(%p)\n", this);
1315 ctype_char__Tidy(this);
1318 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_char_vector_dtor, 8)
1319 ctype_char* __thiscall MSVCP_ctype_char_vector_dtor(ctype_char *this, unsigned int flags)
1321 TRACE("(%p %x)\n", this, flags);
1322 if(flags & 2) {
1323 /* we have an array, with the number of elements stored before the first object */
1324 int i, *ptr = (int *)this-1;
1326 for(i=*ptr-1; i>=0; i--)
1327 ctype_char_dtor(this+i);
1328 MSVCRT_operator_delete(ptr);
1329 } else {
1330 ctype_char_dtor(this);
1331 if(flags & 1)
1332 MSVCRT_operator_delete(this);
1335 return this;
1338 /* ?do_narrow@?$ctype@D@std@@MBEDDD@Z */
1339 /* ?do_narrow@?$ctype@D@std@@MEBADDD@Z */
1340 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow_ch, 12)
1341 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 36, \
1342 char, (const ctype_char*, char, char), (this, ch, unused))
1343 char __thiscall ctype_char_do_narrow_ch(const ctype_char *this, char ch, char unused)
1345 TRACE("(%p %c %c)\n", this, ch, unused);
1346 return ch;
1349 /* ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z */
1350 /* ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z */
1351 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow, 20)
1352 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 32, \
1353 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1354 (this, first, last, unused, dest))
1355 const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
1356 const char *first, const char *last, char unused, char *dest)
1358 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1359 memcpy(dest, first, last-first);
1360 return last;
1363 /* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
1364 /* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
1365 DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
1366 #define call_ctype_char__Do_narrow_s(this, first, last, unused, dest, size) CALL_VTBL_FUNC(this, 40, \
1367 const char*, (const ctype_char*, const char*, const char*, char, char*, MSVCP_size_t), \
1368 (this, first, last, unused, dest, size))
1369 const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
1370 const char *last, char unused, char *dest, MSVCP_size_t size)
1372 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1373 memcpy_s(dest, size, first, last-first);
1374 return last;
1377 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
1378 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
1379 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
1380 char __thiscall ctype_char_narrow_ch(const ctype_char *this, char ch, char dflt)
1382 TRACE("(%p %c %c)\n", this, ch, dflt);
1383 return call_ctype_char_do_narrow_ch(this, ch, dflt);
1386 /* ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z */
1387 /* ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z */
1388 DEFINE_THISCALL_WRAPPER(ctype_char_narrow, 20)
1389 const char* __thiscall ctype_char_narrow(const ctype_char *this,
1390 const char *first, const char *last, char dflt, char *dest)
1392 TRACE("(%p %p %p %c %p)\n", this, first, last, dflt, dest);
1393 return call_ctype_char_do_narrow(this, first, last, dflt, dest);
1396 /* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
1397 /* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
1398 DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
1399 const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
1400 const char *last, char dflt, char *dest, MSVCP_size_t size)
1402 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1403 return call_ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
1406 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
1407 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
1408 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
1409 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
1410 char, (const ctype_char*, char), (this, ch))
1411 char __thiscall ctype_char_do_widen_ch(const ctype_char *this, char ch)
1413 TRACE("(%p %c)\n", this, ch);
1414 return ch;
1417 /* ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z */
1418 /* ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z */
1419 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen, 16)
1420 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 20, \
1421 const char*, (const ctype_char*, const char*, const char*, char*), \
1422 (this, first, last, dest))
1423 const char* __thiscall ctype_char_do_widen(const ctype_char *this,
1424 const char *first, const char *last, char *dest)
1426 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1427 memcpy(dest, first, last-first);
1428 return last;
1431 /* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
1432 /* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
1433 DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
1434 #define call_ctype_char__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 28, \
1435 const char*, (const ctype_char*, const char*, const char*, char*, MSVCP_size_t), \
1436 (this, first, last, dest, size))
1437 const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
1438 const char *first, const char *last, char *dest, MSVCP_size_t size)
1440 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1441 memcpy_s(dest, size, first, last-first);
1442 return last;
1445 /* ?widen@?$ctype@D@std@@QBEDD@Z */
1446 /* ?widen@?$ctype@D@std@@QEBADD@Z */
1447 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
1448 char __thiscall ctype_char_widen_ch(const ctype_char *this, char ch)
1450 TRACE("(%p %c)\n", this, ch);
1451 return call_ctype_char_do_widen_ch(this, ch);
1454 /* ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z */
1455 /* ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z */
1456 DEFINE_THISCALL_WRAPPER(ctype_char_widen, 16)
1457 const char* __thiscall ctype_char_widen(const ctype_char *this,
1458 const char *first, const char *last, char *dest)
1460 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1461 return call_ctype_char_do_widen(this, first, last, dest);
1464 /* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
1465 /* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
1466 DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
1467 const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
1468 const char *first, const char *last, char *dest, MSVCP_size_t size)
1470 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1471 return call_ctype_char__Do_widen_s(this, first, last, dest, size);
1474 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1475 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1476 MSVCP_size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
1478 TRACE("(%p %p)\n", facet, loc);
1480 if(facet && !*facet) {
1481 _Locinfo locinfo;
1483 *facet = MSVCRT_operator_new(sizeof(ctype_char));
1484 if(!*facet) {
1485 ERR("Out of memory\n");
1486 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1487 return 0;
1490 _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
1491 ctype_char_ctor_locinfo((ctype_char*)*facet, &locinfo, 0);
1492 _Locinfo_dtor(&locinfo);
1495 return LC_CTYPE;
1498 ctype_char* ctype_char_use_facet(const locale *loc)
1500 static ctype_char *obj = NULL;
1502 _Lockit lock;
1503 const locale_facet *fac;
1505 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1506 fac = locale__Getfacet(loc, ctype_char_id.id);
1507 if(fac) {
1508 _Lockit_dtor(&lock);
1509 return (ctype_char*)fac;
1512 if(obj)
1513 return obj;
1515 ctype_char__Getcat(&fac, loc);
1516 obj = (ctype_char*)fac;
1517 locale_facet__Incref(&obj->base.facet);
1518 locale_facet_register(&obj->base.facet);
1519 _Lockit_dtor(&lock);
1521 return obj;
1524 /* _Tolower */
1525 int __cdecl _Tolower(int ch, const _Ctypevec *ctype)
1527 unsigned int cp;
1529 TRACE("%d %p\n", ch, ctype);
1531 if(ctype)
1532 cp = ctype->page;
1533 else
1534 cp = ___lc_codepage_func();
1536 /* Don't convert to unicode in case of C locale */
1537 if(!cp) {
1538 if(ch>='A' && ch<='Z')
1539 ch = ch-'A'+'a';
1540 return ch;
1541 } else {
1542 WCHAR wide, lower;
1543 char str[2];
1544 int size;
1546 if(ch > 255) {
1547 str[0] = (ch>>8) & 255;
1548 str[1] = ch & 255;
1549 size = 2;
1550 } else {
1551 str[0] = ch & 255;
1552 size = 1;
1555 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1556 return ch;
1558 lower = tolowerW(wide);
1559 if(lower == wide)
1560 return ch;
1562 WideCharToMultiByte(cp, 0, &lower, 1, str, 2, NULL, NULL);
1564 return str[0] + (str[1]<<8);
1568 /* ?do_tolower@?$ctype@D@std@@MBEDD@Z */
1569 /* ?do_tolower@?$ctype@D@std@@MEBADD@Z */
1570 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 8, \
1571 char, (const ctype_char*, char), (this, ch))
1572 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower_ch, 8)
1573 char __thiscall ctype_char_do_tolower_ch(const ctype_char *this, char ch)
1575 TRACE("(%p %c)\n", this, ch);
1576 return _Tolower(ch, &this->ctype);
1579 /* ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z */
1580 /* ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
1581 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 4, \
1582 const char*, (const ctype_char*, char*, const char*), (this, first, last))
1583 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower, 12)
1584 const char* __thiscall ctype_char_do_tolower(const ctype_char *this, char *first, const char *last)
1586 TRACE("(%p %p %p)\n", this, first, last);
1587 for(; first<last; first++)
1588 *first = _Tolower(*first, &this->ctype);
1589 return last;
1592 /* ?tolower@?$ctype@D@std@@QBEDD@Z */
1593 /* ?tolower@?$ctype@D@std@@QEBADD@Z */
1594 DEFINE_THISCALL_WRAPPER(ctype_char_tolower_ch, 8)
1595 char __thiscall ctype_char_tolower_ch(const ctype_char *this, char ch)
1597 TRACE("(%p %c)\n", this, ch);
1598 return call_ctype_char_do_tolower_ch(this, ch);
1601 /* ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z */
1602 /* ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
1603 DEFINE_THISCALL_WRAPPER(ctype_char_tolower, 12)
1604 const char* __thiscall ctype_char_tolower(const ctype_char *this, char *first, const char *last)
1606 TRACE("(%p %p %p)\n", this, first, last);
1607 return call_ctype_char_do_tolower(this, first, last);
1610 /* _Toupper */
1611 int __cdecl _Toupper(int ch, const _Ctypevec *ctype)
1613 unsigned int cp;
1615 TRACE("%d %p\n", ch, ctype);
1617 if(ctype)
1618 cp = ctype->page;
1619 else
1620 cp = ___lc_codepage_func();
1622 /* Don't convert to unicode in case of C locale */
1623 if(!cp) {
1624 if(ch>='a' && ch<='z')
1625 ch = ch-'a'+'A';
1626 return ch;
1627 } else {
1628 WCHAR wide, upper;
1629 char str[2];
1630 int size;
1632 if(ch > 255) {
1633 str[0] = (ch>>8) & 255;
1634 str[1] = ch & 255;
1635 size = 2;
1636 } else {
1637 str[0] = ch & 255;
1638 size = 1;
1641 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1642 return ch;
1644 upper = toupperW(wide);
1645 if(upper == wide)
1646 return ch;
1648 WideCharToMultiByte(cp, 0, &upper, 1, str, 2, NULL, NULL);
1650 return str[0] + (str[1]<<8);
1654 /* ?do_toupper@?$ctype@D@std@@MBEDD@Z */
1655 /* ?do_toupper@?$ctype@D@std@@MEBADD@Z */
1656 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
1657 char, (const ctype_char*, char), (this, ch))
1658 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper_ch, 8)
1659 char __thiscall ctype_char_do_toupper_ch(const ctype_char *this, char ch)
1661 TRACE("(%p %c)\n", this, ch);
1662 return _Toupper(ch, &this->ctype);
1665 /* ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z */
1666 /* ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
1667 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 12, \
1668 const char*, (const ctype_char*, char*, const char*), (this, first, last))
1669 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper, 12)
1670 const char* __thiscall ctype_char_do_toupper(const ctype_char *this,
1671 char *first, const char *last)
1673 TRACE("(%p %p %p)\n", this, first, last);
1674 for(; first<last; first++)
1675 *first = _Toupper(*first, &this->ctype);
1676 return last;
1679 /* ?toupper@?$ctype@D@std@@QBEDD@Z */
1680 /* ?toupper@?$ctype@D@std@@QEBADD@Z */
1681 DEFINE_THISCALL_WRAPPER(ctype_char_toupper_ch, 8)
1682 char __thiscall ctype_char_toupper_ch(const ctype_char *this, char ch)
1684 TRACE("(%p %c)\n", this, ch);
1685 return call_ctype_char_do_toupper_ch(this, ch);
1688 /* ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z */
1689 /* ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
1690 DEFINE_THISCALL_WRAPPER(ctype_char_toupper, 12)
1691 const char* __thiscall ctype_char_toupper(const ctype_char *this, char *first, const char *last)
1693 TRACE("(%p %p %p)\n", this, first, last);
1694 return call_ctype_char_do_toupper(this, first, last);
1697 /* ?is@?$ctype@D@std@@QBE_NFD@Z */
1698 /* ?is@?$ctype@D@std@@QEBA_NFD@Z */
1699 DEFINE_THISCALL_WRAPPER(ctype_char_is_ch, 12)
1700 MSVCP_bool __thiscall ctype_char_is_ch(const ctype_char *this, short mask, char ch)
1702 TRACE("(%p %x %c)\n", this, mask, ch);
1703 return (this->ctype.table[(unsigned char)ch] & mask) != 0;
1706 /* ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z */
1707 /* ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z */
1708 DEFINE_THISCALL_WRAPPER(ctype_char_is, 16)
1709 const char* __thiscall ctype_char_is(const ctype_char *this, const char *first, const char *last, short *dest)
1711 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1712 for(; first<last; first++)
1713 *dest++ = this->ctype.table[(unsigned char)*first];
1714 return last;
1717 /* ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z */
1718 /* ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
1719 DEFINE_THISCALL_WRAPPER(ctype_char_scan_is, 16)
1720 const char* __thiscall ctype_char_scan_is(const ctype_char *this, short mask, const char *first, const char *last)
1722 TRACE("(%p %x %p %p)\n", this, mask, first, last);
1723 for(; first<last; first++)
1724 if(!ctype_char_is_ch(this, mask, *first))
1725 break;
1726 return first;
1729 /* ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z */
1730 /* ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
1731 DEFINE_THISCALL_WRAPPER(ctype_char_scan_not, 16)
1732 const char* __thiscall ctype_char_scan_not(const ctype_char *this, short mask, const char *first, const char *last)
1734 TRACE("(%p %x %p %p)\n", this, mask, first, last);
1735 for(; first<last; first++)
1736 if(ctype_char_is_ch(this, mask, *first))
1737 break;
1738 return first;
1741 /* ?table@?$ctype@D@std@@IBEPBFXZ */
1742 /* ?table@?$ctype@D@std@@IEBAPEBFXZ */
1743 DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
1744 const short* __thiscall ctype_char_table(const ctype_char *this)
1746 TRACE("(%p)\n", this);
1747 return this->ctype.table;
1750 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
1751 locale_id ctype_wchar_id = {0};
1752 /* ?id@?$ctype@G@std@@2V0locale@2@A */
1753 locale_id ctype_short_id = {0};
1755 /* ??_7?$ctype@_W@std@@6B@ */
1756 extern const vtable_ptr MSVCP_ctype_wchar_vtable;
1757 /* ??_7?$ctype@G@std@@6B@ */
1758 extern const vtable_ptr MSVCP_ctype_short_vtable;
1760 /* ?_Id_func@?$ctype@_W@std@@SAAAVid@locale@2@XZ */
1761 /* ?_Id_func@?$ctype@_W@std@@SAAEAVid@locale@2@XZ */
1762 locale_id* __cdecl ctype_wchar__Id_func(void)
1764 TRACE("()\n");
1765 return &ctype_wchar_id;
1768 /* ?_Id_func@?$ctype@G@std@@SAAAVid@locale@2@XZ */
1769 /* ?_Id_func@?$ctype@G@std@@SAAEAVid@locale@2@XZ */
1770 locale_id* __cdecl ctype_short__Id_func(void)
1772 TRACE("()\n");
1773 return &ctype_short_id;
1776 /* ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z */
1777 /* ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
1778 /* ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z */
1779 /* ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z */
1780 DEFINE_THISCALL_WRAPPER(ctype_wchar__Init, 8)
1781 void __thiscall ctype_wchar__Init(ctype_wchar *this, _Locinfo *locinfo)
1783 TRACE("(%p %p)\n", this, locinfo);
1784 _Locinfo__Getctype(locinfo, &this->ctype);
1785 _Locinfo__Getcvt(locinfo, &this->cvt);
1788 /* ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z */
1789 /* ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1790 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_locinfo, 12)
1791 ctype_wchar* __thiscall ctype_wchar_ctor_locinfo(ctype_wchar *this,
1792 _Locinfo *locinfo, MSVCP_size_t refs)
1794 TRACE("(%p %p %lu)\n", this, locinfo, refs);
1795 ctype_base_ctor_refs(&this->base, refs);
1796 this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
1797 ctype_wchar__Init(this, locinfo);
1798 return this;
1801 /* ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z */
1802 /* ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1803 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_locinfo, 12)
1804 ctype_wchar* __thiscall ctype_short_ctor_locinfo(ctype_wchar *this,
1805 _Locinfo *locinfo, MSVCP_size_t refs)
1807 ctype_wchar *ret = ctype_wchar_ctor_locinfo(this, locinfo, refs);
1808 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1809 return ret;
1812 /* ??0?$ctype@_W@std@@QAE@I@Z */
1813 /* ??0?$ctype@_W@std@@QEAA@_K@Z */
1814 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_refs, 8)
1815 ctype_wchar* __thiscall ctype_wchar_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
1817 _Locinfo locinfo;
1819 TRACE("(%p %lu)\n", this, refs);
1821 ctype_base_ctor_refs(&this->base, refs);
1822 this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
1824 _Locinfo_ctor(&locinfo);
1825 ctype_wchar__Init(this, &locinfo);
1826 _Locinfo_dtor(&locinfo);
1827 return this;
1830 /* ??0?$ctype@G@std@@QAE@I@Z */
1831 /* ??0?$ctype@G@std@@QEAA@_K@Z */
1832 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_refs, 8)
1833 ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
1835 ctype_wchar *ret = ctype_wchar_ctor_refs(this, refs);
1836 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1837 return ret;
1840 /* ??0?$ctype@G@std@@IAE@PBDI@Z */
1841 /* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
1842 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
1843 ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
1844 const char *name, MSVCP_size_t refs)
1846 _Locinfo locinfo;
1848 TRACE("(%p %s %lu)\n", this, debugstr_a(name), refs);
1850 ctype_base_ctor_refs(&this->base, refs);
1851 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1853 _Locinfo_ctor_cstr(&locinfo, name);
1854 ctype_wchar__Init(this, &locinfo);
1855 _Locinfo_dtor(&locinfo);
1856 return this;
1859 /* ??_F?$ctype@_W@std@@QAEXXZ */
1860 /* ??_F?$ctype@_W@std@@QEAAXXZ */
1861 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
1862 ctype_wchar* __thiscall ctype_wchar_ctor(ctype_wchar *this)
1864 TRACE("(%p)\n", this);
1865 return ctype_short_ctor_refs(this, 0);
1868 /* ??_F?$ctype@G@std@@QAEXXZ */
1869 /* ??_F?$ctype@G@std@@QEAAXXZ */
1870 DEFINE_THISCALL_WRAPPER(ctype_short_ctor, 4)
1871 ctype_wchar* __thiscall ctype_short_ctor(ctype_wchar *this)
1873 ctype_wchar *ret = ctype_wchar_ctor(this);
1874 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
1875 return ret;
1878 /* ??1?$ctype@_W@std@@MAE@XZ */
1879 /* ??1?$ctype@_W@std@@MEAA@XZ */
1880 /* ??1?$ctype@G@std@@MAE@XZ */
1881 /* ??1?$ctype@G@std@@MEAA@XZ */
1882 DEFINE_THISCALL_WRAPPER(ctype_wchar_dtor, 4)
1883 void __thiscall ctype_wchar_dtor(ctype_wchar *this)
1885 TRACE("(%p)\n", this);
1886 if(this->ctype.delfl)
1887 free((void*)this->ctype.table);
1890 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_wchar_vector_dtor, 8)
1891 ctype_wchar* __thiscall MSVCP_ctype_wchar_vector_dtor(ctype_wchar *this, unsigned int flags)
1893 TRACE("(%p %x)\n", this, flags);
1894 if(flags & 2) {
1895 /* we have an array, with the number of elements stored before the first object */
1896 int i, *ptr = (int *)this-1;
1898 for(i=*ptr-1; i>=0; i--)
1899 ctype_wchar_dtor(this+i);
1900 MSVCRT_operator_delete(ptr);
1901 } else {
1902 ctype_wchar_dtor(this);
1903 if(flags & 1)
1904 MSVCRT_operator_delete(this);
1907 return this;
1910 DEFINE_THISCALL_WRAPPER(MSVCP_ctype_short_vector_dtor, 8)
1911 ctype_wchar* __thiscall MSVCP_ctype_short_vector_dtor(ctype_wchar *this, unsigned int flags)
1913 return MSVCP_ctype_wchar_vector_dtor(this, flags);
1916 /* _Wcrtomb */
1917 int __cdecl _Wcrtomb(char *s, wchar_t wch, int *state, const _Cvtvec *cvt)
1919 int cp, size;
1920 BOOL def;
1922 TRACE("%p %d %p %p\n", s, wch, state, cvt);
1924 if(cvt)
1925 cp = cvt->page;
1926 else
1927 cp = ___lc_codepage_func();
1929 if(!cp) {
1930 if(wch > 255) {
1931 *_errno() = EILSEQ;
1932 return -1;
1935 *s = wch & 255;
1936 return 1;
1939 size = WideCharToMultiByte(cp, 0, &wch, 1, s, MB_LEN_MAX, NULL, &def);
1940 if(!size || def) {
1941 *_errno() = EILSEQ;
1942 return -1;
1945 return size;
1948 /* ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z */
1949 /* ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z */
1950 /* ?_Donarrow@?$ctype@G@std@@IBEDGD@Z */
1951 /* ?_Donarrow@?$ctype@G@std@@IEBADGD@Z */
1952 DEFINE_THISCALL_WRAPPER(ctype_wchar__Donarrow, 12)
1953 char __thiscall ctype_wchar__Donarrow(const ctype_wchar *this, wchar_t ch, char dflt)
1955 char buf[MB_LEN_MAX];
1957 TRACE("(%p %d %d)\n", this, ch, dflt);
1959 return _Wcrtomb(buf, ch, NULL, &this->cvt)==1 ? buf[0] : dflt;
1962 /* ?do_narrow@?$ctype@_W@std@@MBED_WD@Z */
1963 /* ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z */
1964 /* ?do_narrow@?$ctype@G@std@@MBEDGD@Z */
1965 /* ?do_narrow@?$ctype@G@std@@MEBADGD@Z */
1966 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow_ch, 12)
1967 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 52, \
1968 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
1969 char __thiscall ctype_wchar_do_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
1971 return ctype_wchar__Donarrow(this, ch, dflt);
1974 /* ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z */
1975 /* ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z */
1976 /* ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z */
1977 /* ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z */
1978 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow, 20)
1979 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 48, \
1980 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
1981 (this, first, last, dflt, dest))
1982 const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
1983 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
1985 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
1986 for(; first<last; first++)
1987 *dest++ = ctype_wchar__Donarrow(this, *first, dflt);
1988 return last;
1991 /* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
1992 /* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
1993 /* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
1994 /* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
1995 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
1996 #define call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size) CALL_VTBL_FUNC(this, 56, \
1997 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*, MSVCP_size_t), \
1998 (this, first, last, dflt, dest, size))
1999 const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
2000 const wchar_t *first, const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
2002 TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
2003 /* This function converts all multi-byte characters to dflt,
2004 * thanks to it result size is known before converting */
2005 if(last-first > size)
2006 ctype_base__Xran();
2007 return ctype_wchar_do_narrow(this, first, last, dflt, dest);
2010 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
2011 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
2012 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
2013 /* ?narrow@?$ctype@G@std@@QEBADGD@Z */
2014 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow_ch, 12)
2015 char __thiscall ctype_wchar_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2017 TRACE("(%p %d %d)\n", this, ch, dflt);
2018 return call_ctype_wchar_do_narrow_ch(this, ch, dflt);
2021 /* ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z */
2022 /* ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z */
2023 /* ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z */
2024 /* ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z */
2025 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow, 20)
2026 const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
2027 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2029 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2030 return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
2033 /* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
2034 /* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
2035 /* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
2036 /* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
2037 DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
2038 const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
2039 const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
2041 TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
2042 return call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
2045 /* _Mbrtowc */
2046 int __cdecl _Mbrtowc(wchar_t *out, const char *in, MSVCP_size_t len, int *state, const _Cvtvec *cvt)
2048 int i, cp;
2049 CPINFO cp_info;
2050 BOOL is_lead;
2052 TRACE("(%p %p %lu %p %p)\n", out, in, len, state, cvt);
2054 if(!len)
2055 return 0;
2057 if(cvt)
2058 cp = cvt->page;
2059 else
2060 cp = ___lc_codepage_func();
2062 if(!cp) {
2063 if(out)
2064 *out = (unsigned char)*in;
2066 *state = 0;
2067 return *in ? 1 : 0;
2070 if(*state) {
2071 ((char*)state)[1] = *in;
2073 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, (char*)state, 2, out, out ? 1 : 0)) {
2074 *state = 0;
2075 *_errno() = EILSEQ;
2076 return -1;
2079 *state = 0;
2080 return 2;
2083 GetCPInfo(cp, &cp_info);
2084 is_lead = FALSE;
2085 for(i=0; i<MAX_LEADBYTES; i+=2) {
2086 if(!cp_info.LeadByte[i+1])
2087 break;
2088 if((unsigned char)*in>=cp_info.LeadByte[i] && (unsigned char)*in<=cp_info.LeadByte[i+1]) {
2089 is_lead = TRUE;
2090 break;
2094 if(is_lead) {
2095 if(len == 1) {
2096 *state = (unsigned char)*in;
2097 return -2;
2100 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 2, out, out ? 1 : 0)) {
2101 *_errno() = EILSEQ;
2102 return -1;
2104 return 2;
2107 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 1, out, out ? 1 : 0)) {
2108 *_errno() = EILSEQ;
2109 return -1;
2111 return 1;
2114 /* ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z */
2115 /* ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z */
2116 /* ?_Dowiden@?$ctype@G@std@@IBEGD@Z */
2117 /* ?_Dowiden@?$ctype@G@std@@IEBAGD@Z */
2118 DEFINE_THISCALL_WRAPPER(ctype_wchar__Dowiden, 8)
2119 wchar_t __thiscall ctype_wchar__Dowiden(const ctype_wchar *this, char ch)
2121 wchar_t ret;
2122 int state = 0;
2123 TRACE("(%p %d)\n", this, ch);
2124 return _Mbrtowc(&ret, &ch, 1, &state, &this->cvt)<0 ? WEOF : ret;
2127 /* ?do_widen@?$ctype@_W@std@@MBE_WD@Z */
2128 /* ?do_widen@?$ctype@_W@std@@MEBA_WD@Z */
2129 /* ?do_widen@?$ctype@G@std@@MBEGD@Z */
2130 /* ?do_widen@?$ctype@G@std@@MEBAGD@Z */
2131 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen_ch, 8)
2132 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2133 wchar_t, (const ctype_wchar*, char), (this, ch))
2134 wchar_t __thiscall ctype_wchar_do_widen_ch(const ctype_wchar *this, char ch)
2136 return ctype_wchar__Dowiden(this, ch);
2139 /* ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z */
2140 /* ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z */
2141 /* ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z */
2142 /* ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z */
2143 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen, 16)
2144 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 36, \
2145 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2146 (this, first, last, dest))
2147 const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
2148 const char *first, const char *last, wchar_t *dest)
2150 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2151 for(; first<last; first++)
2152 *dest++ = ctype_wchar__Dowiden(this, *first);
2153 return last;
2156 /* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
2157 /* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
2158 /* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
2159 /* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
2160 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
2161 #define call_ctype_wchar__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 44, \
2162 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*, MSVCP_size_t), \
2163 (this, first, last, dest, size))
2164 const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
2165 const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2167 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2168 /* This function converts all multi-byte characters to WEOF,
2169 * thanks to it result size is known before converting */
2170 if(size < last-first)
2171 ctype_base__Xran();
2172 return ctype_wchar_do_widen(this, first, last, dest);
2175 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
2176 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
2177 /* ?widen@?$ctype@G@std@@QBEGD@Z */
2178 /* ?widen@?$ctype@G@std@@QEBAGD@Z */
2179 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen_ch, 8)
2180 wchar_t __thiscall ctype_wchar_widen_ch(const ctype_wchar *this, char ch)
2182 TRACE("(%p %d)\n", this, ch);
2183 return call_ctype_wchar_do_widen_ch(this, ch);
2186 /* ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z */
2187 /* ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z */
2188 /* ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z */
2189 /* ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z */
2190 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen, 16)
2191 const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
2192 const char *first, const char *last, wchar_t *dest)
2194 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2195 return call_ctype_wchar_do_widen(this, first, last, dest);
2198 /* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
2199 /* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
2200 /* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
2201 /* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
2202 DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
2203 const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
2204 const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2206 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2207 return call_ctype_wchar__Do_widen_s(this, first, last, dest, size);
2210 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2211 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2212 MSVCP_size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
2214 TRACE("(%p %p)\n", facet, loc);
2216 if(facet && !*facet) {
2217 _Locinfo locinfo;
2219 *facet = MSVCRT_operator_new(sizeof(ctype_wchar));
2220 if(!*facet) {
2221 ERR("Out of memory\n");
2222 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2223 return 0;
2226 _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
2227 ctype_wchar_ctor_locinfo((ctype_wchar*)*facet, &locinfo, 0);
2228 _Locinfo_dtor(&locinfo);
2231 return LC_CTYPE;
2234 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2235 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2236 MSVCP_size_t __cdecl ctype_short__Getcat(const locale_facet **facet, const locale *loc)
2238 if(facet && !*facet) {
2239 ctype_wchar__Getcat(facet, loc);
2240 (*(locale_facet**)facet)->vtable = &MSVCP_ctype_short_vtable;
2243 return LC_CTYPE;
2246 /* _Towlower */
2247 wchar_t __cdecl _Towlower(wchar_t ch, const _Ctypevec *ctype)
2249 TRACE("(%d %p)\n", ch, ctype);
2250 return tolowerW(ch);
2253 ctype_wchar* ctype_wchar_use_facet(const locale *loc)
2255 static ctype_wchar *obj = NULL;
2257 _Lockit lock;
2258 const locale_facet *fac;
2260 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2261 fac = locale__Getfacet(loc, ctype_wchar_id.id);
2262 if(fac) {
2263 _Lockit_dtor(&lock);
2264 return (ctype_wchar*)fac;
2267 if(obj)
2268 return obj;
2270 ctype_wchar__Getcat(&fac, loc);
2271 obj = (ctype_wchar*)fac;
2272 locale_facet__Incref(&obj->base.facet);
2273 locale_facet_register(&obj->base.facet);
2274 _Lockit_dtor(&lock);
2276 return obj;
2279 /* ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z */
2280 /* ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z */
2281 /* ?do_tolower@?$ctype@G@std@@MBEGG@Z */
2282 /* ?do_tolower@?$ctype@G@std@@MEBAGG@Z */
2283 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower_ch, 8)
2284 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2285 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2286 wchar_t __thiscall ctype_wchar_do_tolower_ch(const ctype_wchar *this, wchar_t ch)
2288 return _Towlower(ch, &this->ctype);
2291 /* ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2292 /* ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2293 /* ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2294 /* ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2295 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower, 12)
2296 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 20, \
2297 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2298 (this, first, last))
2299 const wchar_t* __thiscall ctype_wchar_do_tolower(const ctype_wchar *this,
2300 wchar_t *first, const wchar_t *last)
2302 TRACE("(%p %p %p)\n", this, first, last);
2303 for(; first<last; first++)
2304 *first = _Towlower(*first, &this->ctype);
2305 return last;
2308 /* ?tolower@?$ctype@_W@std@@QBE_W_W@Z */
2309 /* ?tolower@?$ctype@_W@std@@QEBA_W_W@Z */
2310 /* ?tolower@?$ctype@G@std@@QBEGG@Z */
2311 /* ?tolower@?$ctype@G@std@@QEBAGG@Z */
2312 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower_ch, 8)
2313 wchar_t __thiscall ctype_wchar_tolower_ch(const ctype_wchar *this, wchar_t ch)
2315 TRACE("(%p %d)\n", this, ch);
2316 return call_ctype_wchar_do_tolower_ch(this, ch);
2319 /* ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2320 /* ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2321 /* ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2322 /* ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2323 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower, 12)
2324 const wchar_t* __thiscall ctype_wchar_tolower(const ctype_wchar *this,
2325 wchar_t *first, const wchar_t *last)
2327 TRACE("(%p %p %p)\n", this, first, last);
2328 return call_ctype_wchar_do_tolower(this, first, last);
2331 /* _Towupper */
2332 wchar_t __cdecl _Towupper(wchar_t ch, const _Ctypevec *ctype)
2334 TRACE("(%d %p)\n", ch, ctype);
2335 return toupperW(ch);
2338 /* ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z */
2339 /* ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z */
2340 /* ?do_toupper@?$ctype@G@std@@MBEGG@Z */
2341 /* ?do_toupper@?$ctype@G@std@@MEBAGG@Z */
2342 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper_ch, 8)
2343 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2344 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2345 wchar_t __thiscall ctype_wchar_do_toupper_ch(const ctype_wchar *this, wchar_t ch)
2347 return _Towupper(ch, &this->ctype);
2350 /* ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2351 /* ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2352 /* ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2353 /* ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2354 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper, 12)
2355 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 28, \
2356 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2357 (this, first, last))
2358 const wchar_t* __thiscall ctype_wchar_do_toupper(const ctype_wchar *this,
2359 wchar_t *first, const wchar_t *last)
2361 TRACE("(%p %p %p)\n", this, first, last);
2362 for(; first<last; first++)
2363 *first = _Towupper(*first, &this->ctype);
2364 return last;
2367 /* ?toupper@?$ctype@_W@std@@QBE_W_W@Z */
2368 /* ?toupper@?$ctype@_W@std@@QEBA_W_W@Z */
2369 /* ?toupper@?$ctype@G@std@@QBEGG@Z */
2370 /* ?toupper@?$ctype@G@std@@QEBAGG@Z */
2371 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper_ch, 8)
2372 wchar_t __thiscall ctype_wchar_toupper_ch(const ctype_wchar *this, wchar_t ch)
2374 TRACE("(%p %d)\n", this, ch);
2375 return call_ctype_wchar_do_toupper_ch(this, ch);
2378 /* ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2379 /* ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2380 /* ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2381 /* ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2382 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper, 12)
2383 const wchar_t* __thiscall ctype_wchar_toupper(const ctype_wchar *this,
2384 wchar_t *first, const wchar_t *last)
2386 TRACE("(%p %p %p)\n", this, first, last);
2387 return call_ctype_wchar_do_toupper(this, first, last);
2390 /* _Getwctypes */
2391 const wchar_t* __cdecl _Getwctypes(const wchar_t *first, const wchar_t *last,
2392 short *mask, const _Ctypevec *ctype)
2394 TRACE("(%p %p %p %p)\n", first, last, mask, ctype);
2395 GetStringTypeW(CT_CTYPE1, first, last-first, (WORD*)mask);
2396 return last;
2399 /* _Getwctype */
2400 short __cdecl _Getwctype(wchar_t ch, const _Ctypevec *ctype)
2402 short mask = 0;
2403 _Getwctypes(&ch, &ch+1, &mask, ctype);
2404 return mask;
2407 /* ?do_is@?$ctype@_W@std@@MBE_NF_W@Z */
2408 /* ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z */
2409 /* ?do_is@?$ctype@G@std@@MBE_NFG@Z */
2410 /* ?do_is@?$ctype@G@std@@MEBA_NFG@Z */
2411 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is_ch, 12)
2412 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 8, \
2413 MSVCP_bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2414 MSVCP_bool __thiscall ctype_wchar_do_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2416 TRACE("(%p %x %d)\n", this, mask, ch);
2417 return (_Getwctype(ch, &this->ctype) & mask) != 0;
2420 /* ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z */
2421 /* ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z */
2422 /* ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z */
2423 /* ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z */
2424 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is, 16)
2425 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 4, \
2426 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
2427 (this, first, last, dest))
2428 const wchar_t* __thiscall ctype_wchar_do_is(const ctype_wchar *this,
2429 const wchar_t *first, const wchar_t *last, short *dest)
2431 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2432 return _Getwctypes(first, last, dest, &this->ctype);
2435 /* ?is@?$ctype@_W@std@@QBE_NF_W@Z */
2436 /* ?is@?$ctype@_W@std@@QEBA_NF_W@Z */
2437 /* ?is@?$ctype@G@std@@QBE_NFG@Z */
2438 /* ?is@?$ctype@G@std@@QEBA_NFG@Z */
2439 DEFINE_THISCALL_WRAPPER(ctype_wchar_is_ch, 12)
2440 MSVCP_bool __thiscall ctype_wchar_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2442 TRACE("(%p %x %d)\n", this, mask, ch);
2443 return call_ctype_wchar_do_is_ch(this, mask, ch);
2446 /* ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z */
2447 /* ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z */
2448 /* ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z */
2449 /* ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z */
2450 DEFINE_THISCALL_WRAPPER(ctype_wchar_is, 16)
2451 const wchar_t* __thiscall ctype_wchar_is(const ctype_wchar *this,
2452 const wchar_t *first, const wchar_t *last, short *dest)
2454 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2455 return call_ctype_wchar_do_is(this, first, last, dest);
2458 /* ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
2459 /* ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
2460 /* ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z */
2461 /* ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
2462 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_is, 16)
2463 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 12, \
2464 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
2465 (this, mask, first, last))
2466 const wchar_t* __thiscall ctype_wchar_do_scan_is(const ctype_wchar *this,
2467 short mask, const wchar_t *first, const wchar_t *last)
2469 TRACE("(%p %d %p %p)\n", this, mask, first, last);
2470 for(; first<last; first++)
2471 if(!ctype_wchar_is_ch(this, mask, *first))
2472 break;
2473 return first;
2476 /* ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
2477 /* ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
2478 /* ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z */
2479 /* ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
2480 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_is, 16)
2481 const wchar_t* __thiscall ctype_wchar_scan_is(const ctype_wchar *this,
2482 short mask, const wchar_t *first, const wchar_t *last)
2484 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2485 return call_ctype_wchar_do_scan_is(this, mask, first, last);
2488 /* ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
2489 /* ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
2490 /* ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z */
2491 /* ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
2492 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_not, 16)
2493 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 16, \
2494 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
2495 (this, mask, first, last))
2496 const wchar_t* __thiscall ctype_wchar_do_scan_not(const ctype_wchar *this,
2497 short mask, const wchar_t *first, const wchar_t *last)
2499 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2500 for(; first<last; first++)
2501 if(ctype_wchar_is_ch(this, mask, *first))
2502 break;
2503 return first;
2506 /* ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
2507 /* ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
2508 /* ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z */
2509 /* ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
2510 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_not, 16)
2511 const wchar_t* __thiscall ctype_wchar_scan_not(const ctype_wchar *this,
2512 short mask, const wchar_t *first, const wchar_t *last)
2514 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2515 return call_ctype_wchar_do_scan_not(this, mask, first, last);
2518 /* ??_7codecvt_base@std@@6B@ */
2519 extern const vtable_ptr MSVCP_codecvt_base_vtable;
2521 /* ??0codecvt_base@std@@QAE@I@Z */
2522 /* ??0codecvt_base@std@@QEAA@_K@Z */
2523 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor_refs, 8)
2524 codecvt_base* __thiscall codecvt_base_ctor_refs(codecvt_base *this, MSVCP_size_t refs)
2526 TRACE("(%p %lu)\n", this, refs);
2527 locale_facet_ctor_refs(&this->facet, refs);
2528 this->facet.vtable = &MSVCP_codecvt_base_vtable;
2529 return this;
2532 /* ??_Fcodecvt_base@std@@QAEXXZ */
2533 /* ??_Fcodecvt_base@std@@QEAAXXZ */
2534 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor, 4)
2535 codecvt_base* __thiscall codecvt_base_ctor(codecvt_base *this)
2537 return codecvt_base_ctor_refs(this, 0);
2540 /* ??1codecvt_base@std@@UAE@XZ */
2541 /* ??1codecvt_base@std@@UEAA@XZ */
2542 DEFINE_THISCALL_WRAPPER(codecvt_base_dtor, 4)
2543 void __thiscall codecvt_base_dtor(codecvt_base *this)
2545 TRACE("(%p)\n", this);
2546 locale_facet_dtor(&this->facet);
2549 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_base_vector_dtor, 8)
2550 codecvt_base* __thiscall MSVCP_codecvt_base_vector_dtor(codecvt_base *this, unsigned int flags)
2552 TRACE("(%p %x)\n", this, flags);
2553 if(flags & 2) {
2554 /* we have an array, with the number of elements stored before the first object */
2555 int i, *ptr = (int *)this-1;
2557 for(i=*ptr-1; i>=0; i--)
2558 codecvt_base_dtor(this+i);
2559 MSVCRT_operator_delete(ptr);
2560 } else {
2561 codecvt_base_dtor(this);
2562 if(flags & 1)
2563 MSVCRT_operator_delete(this);
2566 return this;
2569 /* ?do_always_noconv@codecvt_base@std@@MBE_NXZ */
2570 /* ?do_always_noconv@codecvt_base@std@@MEBA_NXZ */
2571 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 4, \
2572 MSVCP_bool, (const codecvt_base*), (this))
2573 DEFINE_THISCALL_WRAPPER(codecvt_base_do_always_noconv, 4)
2574 MSVCP_bool __thiscall codecvt_base_do_always_noconv(const codecvt_base *this)
2576 TRACE("(%p)\n", this);
2577 return TRUE;
2580 /* ?always_noconv@codecvt_base@std@@QBE_NXZ */
2581 /* ?always_noconv@codecvt_base@std@@QEBA_NXZ */
2582 DEFINE_THISCALL_WRAPPER(codecvt_base_always_noconv, 4)
2583 MSVCP_bool __thiscall codecvt_base_always_noconv(const codecvt_base *this)
2585 TRACE("(%p)\n", this);
2586 return call_codecvt_base_do_always_noconv(this);
2589 /* ?do_max_length@codecvt_base@std@@MBEHXZ */
2590 /* ?do_max_length@codecvt_base@std@@MEBAHXZ */
2591 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 8, \
2592 int, (const codecvt_base*), (this))
2593 DEFINE_THISCALL_WRAPPER(codecvt_base_do_max_length, 4)
2594 int __thiscall codecvt_base_do_max_length(const codecvt_base *this)
2596 TRACE("(%p)\n", this);
2597 return 1;
2600 /* ?max_length@codecvt_base@std@@QBEHXZ */
2601 /* ?max_length@codecvt_base@std@@QEBAHXZ */
2602 DEFINE_THISCALL_WRAPPER(codecvt_base_max_length, 4)
2603 int __thiscall codecvt_base_max_length(const codecvt_base *this)
2605 TRACE("(%p)\n", this);
2606 return call_codecvt_base_do_max_length(this);
2609 /* ?do_encoding@codecvt_base@std@@MBEHXZ */
2610 /* ?do_encoding@codecvt_base@std@@MEBAHXZ */
2611 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 12, \
2612 int, (const codecvt_base*), (this))
2613 DEFINE_THISCALL_WRAPPER(codecvt_base_do_encoding, 4)
2614 int __thiscall codecvt_base_do_encoding(const codecvt_base *this)
2616 TRACE("(%p)\n", this);
2617 return 1;
2620 /* ?encoding@codecvt_base@std@@QBEHXZ */
2621 /* ?encoding@codecvt_base@std@@QEBAHXZ */
2622 DEFINE_THISCALL_WRAPPER(codecvt_base_encoding, 4)
2623 int __thiscall codecvt_base_encoding(const codecvt_base *this)
2625 TRACE("(%p)\n", this);
2626 return call_codecvt_base_do_encoding(this);
2629 /* ?id@?$codecvt@DDH@std@@2V0locale@2@A */
2630 locale_id codecvt_char_id = {0};
2632 /* ??_7?$codecvt@DDH@std@@6B@ */
2633 extern const vtable_ptr MSVCP_codecvt_char_vtable;
2635 /* ?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z */
2636 /* ?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z */
2637 DEFINE_THISCALL_WRAPPER(codecvt_char__Init, 8)
2638 void __thiscall codecvt_char__Init(codecvt_char *this, const _Locinfo *locinfo)
2640 TRACE("(%p %p)\n", this, locinfo);
2643 /* ??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z */
2644 /* ??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2645 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_locinfo, 12)
2646 codecvt_char* __thiscall codecvt_char_ctor_locinfo(codecvt_char *this, const _Locinfo *locinfo, MSVCP_size_t refs)
2648 TRACE("(%p %p %lu)\n", this, locinfo, refs);
2649 codecvt_base_ctor_refs(&this->base, refs);
2650 this->base.facet.vtable = &MSVCP_codecvt_char_vtable;
2651 return this;
2654 /* ??0?$codecvt@DDH@std@@QAE@I@Z */
2655 /* ??0?$codecvt@DDH@std@@QEAA@_K@Z */
2656 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_refs, 8)
2657 codecvt_char* __thiscall codecvt_char_ctor_refs(codecvt_char *this, MSVCP_size_t refs)
2659 return codecvt_char_ctor_locinfo(this, NULL, refs);
2662 /* ??_F?$codecvt@DDH@std@@QAEXXZ */
2663 /* ??_F?$codecvt@DDH@std@@QEAAXXZ */
2664 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor, 4)
2665 codecvt_char* __thiscall codecvt_char_ctor(codecvt_char *this)
2667 return codecvt_char_ctor_locinfo(this, NULL, 0);
2670 /* ??1?$codecvt@DDH@std@@MAE@XZ */
2671 /* ??1?$codecvt@DDH@std@@MEAA@XZ */
2672 DEFINE_THISCALL_WRAPPER(codecvt_char_dtor, 4)
2673 void __thiscall codecvt_char_dtor(codecvt_char *this)
2675 TRACE("(%p)\n", this);
2676 codecvt_base_dtor(&this->base);
2679 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_char_vector_dtor, 8)
2680 codecvt_char* __thiscall MSVCP_codecvt_char_vector_dtor(codecvt_char *this, unsigned int flags)
2682 TRACE("(%p %x)\n", this, flags);
2683 if(flags & 2) {
2684 /* we have an array, with the number of elements stored before the first object */
2685 int i, *ptr = (int *)this-1;
2687 for(i=*ptr-1; i>=0; i--)
2688 codecvt_char_dtor(this+i);
2689 MSVCRT_operator_delete(ptr);
2690 } else {
2691 codecvt_char_dtor(this);
2692 if(flags & 1)
2693 MSVCRT_operator_delete(this);
2696 return this;
2699 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2700 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2701 MSVCP_size_t __cdecl codecvt_char__Getcat(const locale_facet **facet, const locale *loc)
2703 TRACE("(%p %p)\n", facet, loc);
2705 if(facet && !*facet) {
2706 *facet = MSVCRT_operator_new(sizeof(codecvt_char));
2707 if(!*facet) {
2708 ERR("Out of memory\n");
2709 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2710 return 0;
2712 codecvt_char_ctor((codecvt_char*)*facet);
2715 return LC_CTYPE;
2718 codecvt_char* codecvt_char_use_facet(const locale *loc)
2720 static codecvt_char *obj = NULL;
2722 _Lockit lock;
2723 const locale_facet *fac;
2725 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2726 fac = locale__Getfacet(loc, codecvt_char_id.id);
2727 if(fac) {
2728 _Lockit_dtor(&lock);
2729 return (codecvt_char*)fac;
2732 if(obj)
2733 return obj;
2735 codecvt_char__Getcat(&fac, loc);
2736 obj = (codecvt_char*)fac;
2737 locale_facet__Incref(&obj->base.facet);
2738 locale_facet_register(&obj->base.facet);
2739 _Lockit_dtor(&lock);
2741 return obj;
2744 /* ?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2745 /* ?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2746 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
2747 CALL_VTBL_FUNC(this, 16, int, \
2748 (const codecvt_char*, int*, const char*, const char*, const char**, char*, char*, char**), \
2749 (this, state, from, from_end, from_next, to, to_end, to_next))
2750 DEFINE_THISCALL_WRAPPER(codecvt_char_do_in, 32)
2751 int __thiscall codecvt_char_do_in(const codecvt_char *this, int *state,
2752 const char *from, const char *from_end, const char **from_next,
2753 char *to, char *to_end, char **to_next)
2755 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
2756 from_next, to, to_end, to_next);
2757 *from_next = from;
2758 *to_next = to;
2759 return CODECVT_noconv;
2762 /* ?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2763 /* ?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2764 DEFINE_THISCALL_WRAPPER(codecvt_char_in, 32)
2765 int __thiscall codecvt_char_in(const codecvt_char *this, int *state,
2766 const char *from, const char *from_end, const char **from_next,
2767 char *to, char *to_end, char **to_next)
2769 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
2770 from_next, to, to_end, to_next);
2771 return call_codecvt_char_do_in(this, state, from, from_end, from_next,
2772 to, to_end, to_next);
2775 /* ?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2776 /* ?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2777 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
2778 CALL_VTBL_FUNC(this, 20, int, \
2779 (const codecvt_char*, int*, const char*, const char*, const char**, char*, char*, char**), \
2780 (this, state, from, from_end, from_next, to, to_end, to_next))
2781 DEFINE_THISCALL_WRAPPER(codecvt_char_do_out, 32)
2782 int __thiscall codecvt_char_do_out(const codecvt_char *this, int *state,
2783 const char *from, const char *from_end, const char **from_next,
2784 char *to, char *to_end, char **to_next)
2786 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
2787 from_end, from_next, to, to_end, to_next);
2788 *from_next = from;
2789 *to_next = to;
2790 return CODECVT_noconv;
2793 /* ?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
2794 /* ?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
2795 DEFINE_THISCALL_WRAPPER(codecvt_char_out, 32)
2796 int __thiscall codecvt_char_out(const codecvt_char *this, int *state,
2797 const char *from, const char *from_end, const char **from_next,
2798 char *to, char *to_end, char **to_next)
2800 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
2801 from_next, to, to_end, to_next);
2802 return call_codecvt_char_do_out(this, state, from, from_end, from_next,
2803 to, to_end, to_next);
2806 /* ?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z */
2807 /* ?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
2808 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
2809 int, (const codecvt_char*, int*, char*, char*, char**), (this, state, to, to_end, to_next))
2810 DEFINE_THISCALL_WRAPPER(codecvt_char_do_unshift, 20)
2811 int __thiscall codecvt_char_do_unshift(const codecvt_char *this,
2812 int *state, char *to, char *to_end, char **to_next)
2814 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
2815 *to_next = to;
2816 return CODECVT_noconv;
2819 /* ?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z */
2820 /* ?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
2821 DEFINE_THISCALL_WRAPPER(codecvt_char_unshift, 20)
2822 int __thiscall codecvt_char_unshift(const codecvt_char *this,
2823 int *state, char *to, char *to_end, char **to_next)
2825 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
2826 return call_codecvt_char_do_unshift(this, state, to, to_end, to_next);
2829 /* ?do_length@?$codecvt@DDH@std@@MBEHABHPBD1I@Z */
2830 /* ?do_length@?$codecvt@DDH@std@@MEBAHAEBHPEBD1_K@Z */
2831 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
2832 int, (const codecvt_char*, const int*, const char*, const char*, MSVCP_size_t), \
2833 (this, state, from, from_end, max))
2834 DEFINE_THISCALL_WRAPPER(codecvt_char_do_length, 20)
2835 int __thiscall codecvt_char_do_length(const codecvt_char *this, const int *state,
2836 const char *from, const char *from_end, MSVCP_size_t max)
2838 TRACE("(%p %p %p %p %lu)\n", this, state, from, from_end, max);
2839 return (from_end-from > max ? max : from_end-from);
2842 /* ?length@?$codecvt@DDH@std@@QBEHABHPBD1I@Z */
2843 /* ?length@?$codecvt@DDH@std@@QEBAHAEBHPEBD1_K@Z */
2844 DEFINE_THISCALL_WRAPPER(codecvt_char_length, 20)
2845 int __thiscall codecvt_char_length(const codecvt_char *this, const int *state,
2846 const char *from, const char *from_end, MSVCP_size_t max)
2848 TRACE("(%p %p %p %p %lu)\n", this, state, from, from_end, max);
2849 return call_codecvt_char_do_length(this, state, from, from_end, max);
2852 /* ?id@?$codecvt@_WDH@std@@2V0locale@2@A */
2853 locale_id codecvt_wchar_id = {0};
2854 /* ?id@?$codecvt@GDH@std@@2V0locale@2@A */
2855 locale_id codecvt_short_id = {0};
2857 /* ??_7?$codecvt@_WDH@std@@6B@ */
2858 extern const vtable_ptr MSVCP_codecvt_wchar_vtable;
2859 /* ??_7?$codecvt@GDH@std@@6B@ */
2860 extern const vtable_ptr MSVCP_codecvt_short_vtable;
2862 /* ?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z */
2863 /* ?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z */
2864 /* ?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z */
2865 /* ?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z */
2866 DEFINE_THISCALL_WRAPPER(codecvt_wchar__Init, 8)
2867 void __thiscall codecvt_wchar__Init(codecvt_wchar *this, const _Locinfo *locinfo)
2869 TRACE("(%p %p)\n", this, locinfo);
2870 _Locinfo__Getcvt(locinfo, &this->cvt);
2873 /* ??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z */
2874 /* ??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2875 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_locinfo, 12)
2876 codecvt_wchar* __thiscall codecvt_wchar_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, MSVCP_size_t refs)
2878 TRACE("(%p %p %ld)\n", this, locinfo, refs);
2880 codecvt_base_ctor_refs(&this->base, refs);
2881 this->base.facet.vtable = &MSVCP_codecvt_wchar_vtable;
2883 codecvt_wchar__Init(this, locinfo);
2884 return this;
2887 /* ??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z */
2888 /* ??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2889 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_locinfo, 12)
2890 codecvt_wchar* __thiscall codecvt_short_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, MSVCP_size_t refs)
2892 TRACE("(%p %p %ld)\n", this, locinfo, refs);
2894 codecvt_wchar_ctor_locinfo(this, locinfo, refs);
2895 this->base.facet.vtable = &MSVCP_codecvt_short_vtable;
2896 return this;
2899 /* ??0?$codecvt@_WDH@std@@QAE@I@Z */
2900 /* ??0?$codecvt@_WDH@std@@QEAA@_K@Z */
2901 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_refs, 8)
2902 codecvt_wchar* __thiscall codecvt_wchar_ctor_refs(codecvt_wchar *this, MSVCP_size_t refs)
2904 _Locinfo locinfo;
2906 TRACE("(%p %ld)\n", this, refs);
2908 _Locinfo_ctor(&locinfo);
2909 codecvt_wchar_ctor_locinfo(this, &locinfo, refs);
2910 _Locinfo_dtor(&locinfo);
2911 return this;
2914 /* ??0?$codecvt@GDH@std@@QAE@I@Z */
2915 /* ??0?$codecvt@GDH@std@@QEAA@_K@Z */
2916 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_refs, 8)
2917 codecvt_wchar* __thiscall codecvt_short_ctor_refs(codecvt_wchar *this, MSVCP_size_t refs)
2919 _Locinfo locinfo;
2921 TRACE("(%p %ld)\n", this, refs);
2923 _Locinfo_ctor(&locinfo);
2924 codecvt_short_ctor_locinfo(this, &locinfo, refs);
2925 _Locinfo_dtor(&locinfo);
2926 return this;
2929 /* ??0?$codecvt@GDH@std@@IAE@PBDI@Z */
2930 /* ??0?$codecvt@GDH@std@@IEAA@PEBD_K@Z */
2931 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_name, 12)
2932 codecvt_wchar* __thiscall codecvt_short_ctor_name(codecvt_wchar *this, const char *name, MSVCP_size_t refs)
2934 _Locinfo locinfo;
2936 TRACE("(%p %s %ld)\n", this, name, refs);
2938 _Locinfo_ctor_cstr(&locinfo, name);
2939 codecvt_short_ctor_locinfo(this, &locinfo, refs);
2940 _Locinfo_dtor(&locinfo);
2941 return this;
2944 /* ??_F?$codecvt@_WDH@std@@QAEXXZ */
2945 /* ??_F?$codecvt@_WDH@std@@QEAAXXZ */
2946 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor, 4)
2947 codecvt_wchar* __thiscall codecvt_wchar_ctor(codecvt_wchar *this)
2949 return codecvt_wchar_ctor_refs(this, 0);
2952 /* ??_F?$codecvt@GDH@std@@QAEXXZ */
2953 /* ??_F?$codecvt@GDH@std@@QEAAXXZ */
2954 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor, 4)
2955 codecvt_wchar* __thiscall codecvt_short_ctor(codecvt_wchar *this)
2957 return codecvt_short_ctor_refs(this, 0);
2960 /* ??1?$codecvt@GDH@std@@MAE@XZ */
2961 /* ??1?$codecvt@GDH@std@@MEAA@XZ */
2962 /* ??1?$codecvt@_WDH@std@@MAE@XZ */
2963 /* ??1?$codecvt@_WDH@std@@MEAA@XZ */
2964 DEFINE_THISCALL_WRAPPER(codecvt_wchar_dtor, 4)
2965 void __thiscall codecvt_wchar_dtor(codecvt_wchar *this)
2967 TRACE("(%p)\n", this);
2968 codecvt_base_dtor(&this->base);
2971 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_wchar_vector_dtor, 8)
2972 codecvt_wchar* __thiscall MSVCP_codecvt_wchar_vector_dtor(codecvt_wchar *this, unsigned int flags)
2974 TRACE("(%p %x)\n", this, flags);
2975 if(flags & 2) {
2976 /* we have an array, with the number of elements stored before the first object */
2977 int i, *ptr = (int *)this-1;
2979 for(i=*ptr-1; i>=0; i--)
2980 codecvt_wchar_dtor(this+i);
2981 MSVCRT_operator_delete(ptr);
2982 } else {
2983 codecvt_wchar_dtor(this);
2984 if(flags & 1)
2985 MSVCRT_operator_delete(this);
2988 return this;
2991 DEFINE_THISCALL_WRAPPER(MSVCP_codecvt_short_vector_dtor, 8)
2992 codecvt_wchar* __thiscall MSVCP_codecvt_short_vector_dtor(codecvt_wchar *this, unsigned int flags)
2994 return MSVCP_codecvt_wchar_vector_dtor(this, flags);
2997 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2998 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2999 unsigned int __cdecl codecvt_wchar__Getcat(const locale_facet **facet, const locale *loc)
3001 TRACE("(%p %p)\n", facet, loc);
3003 if(facet && !*facet) {
3004 _Locinfo locinfo;
3006 *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
3007 if(!*facet) {
3008 ERR("Out of memory\n");
3009 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3010 return 0;
3013 _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
3014 codecvt_wchar_ctor_locinfo((codecvt_wchar*)*facet, &locinfo, 0);
3015 _Locinfo_dtor(&locinfo);
3018 return LC_CTYPE;
3021 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3022 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3023 unsigned int __cdecl codecvt_short__Getcat(const locale_facet **facet, const locale *loc)
3025 TRACE("(%p %p)\n", facet, loc);
3027 if(facet && !*facet) {
3028 _Locinfo locinfo;
3030 *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
3031 if(!*facet) {
3032 ERR("Out of memory\n");
3033 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3034 return 0;
3037 _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
3038 codecvt_short_ctor((codecvt_wchar*)*facet);
3039 _Locinfo_dtor(&locinfo);
3042 return LC_CTYPE;
3045 /* ?_Id_func@?$codecvt@_WDH@std@@SAAAVid@locale@2@XZ */
3046 /* ?_Id_func@?$codecvt@_WDH@std@@SAAEAVid@locale@2@XZ */
3047 locale_id* __cdecl codecvt_wchar__Id_func(void)
3049 TRACE("()\n");
3050 return &codecvt_wchar_id;
3053 /* ?_Id_func@?$codecvt@GDH@std@@SAAAVid@locale@2@XZ */
3054 /* ?_Id_func@?$codecvt@GDH@std@@SAAEAVid@locale@2@XZ */
3055 locale_id* __cdecl codecvt_short__Id_func(void)
3057 TRACE("()\n");
3058 return &codecvt_short_id;
3061 /* ?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ */
3062 /* ?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ */
3063 /* ?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ */
3064 /* ?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ */
3065 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_always_noconv, 4)
3066 MSVCP_bool __thiscall codecvt_wchar_do_always_noconv(const codecvt_wchar *this)
3068 TRACE("(%p)\n", this);
3069 return FALSE;
3072 /* ?do_max_length@?$codecvt@GDH@std@@MBEHXZ */
3073 /* ?do_max_length@?$codecvt@GDH@std@@MEBAHXZ */
3074 /* ?do_max_length@?$codecvt@_WDH@std@@MBEHXZ */
3075 /* ?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ */
3076 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_max_length, 4)
3077 int __thiscall codecvt_wchar_do_max_length(const codecvt_wchar *this)
3079 TRACE("(%p)\n", this);
3080 return MB_LEN_MAX;
3083 /* ?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3084 /* ?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3085 /* ?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3086 /* ?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3087 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3088 CALL_VTBL_FUNC(this, 16, int, \
3089 (const codecvt_wchar*, int*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3090 (this, state, from, from_end, from_next, to, to_end, to_next))
3091 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_in, 32)
3092 int __thiscall codecvt_wchar_do_in(const codecvt_wchar *this, int *state,
3093 const char *from, const char *from_end, const char **from_next,
3094 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3096 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3097 from_end, from_next, to, to_end, to_next);
3099 *from_next = from;
3100 *to_next = to;
3102 while(*from_next!=from_end && *to_next!=to_end) {
3103 switch(_Mbrtowc(*to_next, *from_next, from_end-*from_next, state, &this->cvt)) {
3104 case -2:
3105 *from_next = from_end;
3106 return CODECVT_partial;
3107 case -1:
3108 return CODECVT_error;
3109 case 2:
3110 (*from_next)++;
3111 /* fall through */
3112 case 0:
3113 case 1:
3114 (*from_next)++;
3115 (*to_next)++;
3119 return CODECVT_ok;
3122 /* ?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3123 /* ?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3124 /* ?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3125 /* ?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3126 DEFINE_THISCALL_WRAPPER(codecvt_wchar_in, 32)
3127 int __thiscall codecvt_wchar_in(const codecvt_wchar *this, int *state,
3128 const char *from, const char *from_end, const char **from_next,
3129 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3131 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3132 from_end, from_next, to, to_end, to_next);
3133 return call_codecvt_wchar_do_in(this, state, from,
3134 from_end, from_next, to, to_end, to_next);
3137 /* ?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3138 /* ?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3139 /* ?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3140 /* ?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3141 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3142 CALL_VTBL_FUNC(this, 20, int, \
3143 (const codecvt_wchar*, int*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3144 (this, state, from, from_end, from_next, to, to_end, to_next))
3145 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_out, 32)
3146 int __thiscall codecvt_wchar_do_out(const codecvt_wchar *this, int *state,
3147 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3148 char *to, char *to_end, char **to_next)
3150 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3151 from_end, from_next, to, to_end, to_next);
3153 *from_next = from;
3154 *to_next = to;
3156 while(*from_next!=from_end && *to_next!=to_end) {
3157 int old_state = *state, size;
3158 char buf[MB_LEN_MAX];
3160 switch((size = _Wcrtomb(buf, **from_next, state, &this->cvt))) {
3161 case -1:
3162 return CODECVT_error;
3163 default:
3164 if(size > from_end-*from_next) {
3165 *state = old_state;
3166 return CODECVT_partial;
3169 (*from_next)++;
3170 (*to_next) += size;
3174 return CODECVT_ok;
3177 /* ?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3178 /* ?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3179 /* ?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3180 /* ?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3181 DEFINE_THISCALL_WRAPPER(codecvt_wchar_out, 32)
3182 int __thiscall codecvt_wchar_out(const codecvt_wchar *this, int *state,
3183 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3184 char *to, char *to_end, char **to_next)
3186 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3187 from_end, from_next, to, to_end, to_next);
3188 return call_codecvt_wchar_do_out(this, state, from,
3189 from_end, from_next, to, to_end, to_next);
3192 /* ?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z */
3193 /* ?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3194 /* ?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z */
3195 /* ?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3196 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3197 int, (const codecvt_wchar*, int*, char*, char*, char**), (this, state, to, to_end, to_next))
3198 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_unshift, 20)
3199 int __thiscall codecvt_wchar_do_unshift(const codecvt_wchar *this,
3200 int *state, char *to, char *to_end, char **to_next)
3202 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3203 if(*state)
3204 WARN("unexpected state: %x\n", *state);
3206 *to_next = to;
3207 return CODECVT_ok;
3210 /* ?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z */
3211 /* ?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3212 /* ?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z */
3213 /* ?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3214 DEFINE_THISCALL_WRAPPER(codecvt_wchar_unshift, 20)
3215 int __thiscall codecvt_wchar_unshift(const codecvt_wchar *this,
3216 int *state, char *to, char *to_end, char **to_next)
3218 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3219 return call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next);
3222 /* ?do_length@?$codecvt@GDH@std@@MBEHABHPBD1I@Z */
3223 /* ?do_length@?$codecvt@GDH@std@@MEBAHAEBHPEBD1_K@Z */
3224 /* ?do_length@?$codecvt@_WDH@std@@MBEHABHPBD1I@Z */
3225 /* ?do_length@?$codecvt@_WDH@std@@MEBAHAEBHPEBD1_K@Z */
3226 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3227 int, (const codecvt_wchar*, const int*, const char*, const char*, MSVCP_size_t), \
3228 (this, state, from, from_end, max))
3229 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_length, 20)
3230 int __thiscall codecvt_wchar_do_length(const codecvt_wchar *this, const int *state,
3231 const char *from, const char *from_end, MSVCP_size_t max)
3233 int tmp_state = *state, ret=0;
3235 TRACE("(%p %p %p %p %ld)\n", this, state, from, from_end, max);
3237 while(ret<max && from!=from_end) {
3238 switch(_Mbrtowc(NULL, from, from_end-from, &tmp_state, &this->cvt)) {
3239 case -2:
3240 case -1:
3241 return ret;
3242 case 2:
3243 from++;
3244 /* fall through */
3245 case 0:
3246 case 1:
3247 from++;
3248 ret++;
3252 return ret;
3255 /* ?length@?$codecvt@GDH@std@@QBEHABHPBD1I@Z */
3256 /* ?length@?$codecvt@GDH@std@@QEBAHAEBHPEBD1_K@Z */
3257 /* ?length@?$codecvt@_WDH@std@@QBEHABHPBD1I@Z */
3258 /* ?length@?$codecvt@_WDH@std@@QEBAHAEBHPEBD1_K@Z */
3259 DEFINE_THISCALL_WRAPPER(codecvt_wchar_length, 20)
3260 int __thiscall codecvt_wchar_length(const codecvt_wchar *this, const int *state,
3261 const char *from, const char *from_end, MSVCP_size_t max)
3263 TRACE("(%p %p %p %p %ld)\n", this, state, from, from_end, max);
3264 return call_codecvt_wchar_do_length(this, state, from, from_end, max);
3267 /* ?id@?$numpunct@D@std@@2V0locale@2@A */
3268 locale_id numpunct_char_id = {0};
3270 /* ??_7?$numpunct@D@std@@6B@ */
3271 extern const vtable_ptr MSVCP_numpunct_char_vtable;
3273 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
3274 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
3275 DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
3276 void __thiscall numpunct_char__Init(numpunct_char *this, _Locinfo *locinfo, MSVCP_bool isdef)
3278 int len;
3280 TRACE("(%p %p %d)\n", this, locinfo, isdef);
3282 len = strlen(_Locinfo__Getfalse(locinfo))+1;
3283 this->false_name = MSVCRT_operator_new(len);
3284 if(this->false_name)
3285 memcpy((char*)this->false_name, _Locinfo__Getfalse(locinfo), len);
3287 len = strlen(_Locinfo__Gettrue(locinfo))+1;
3288 this->true_name = MSVCRT_operator_new(len);
3289 if(this->true_name)
3290 memcpy((char*)this->true_name, _Locinfo__Gettrue(locinfo), len);
3292 if(isdef) {
3293 this->grouping = MSVCRT_operator_new(1);
3294 if(this->grouping)
3295 *(char*)this->grouping = 0;
3297 this->dp = '.';
3298 this->sep = ',';
3299 } else {
3300 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
3302 len = strlen(lc->grouping)+1;
3303 this->grouping = MSVCRT_operator_new(len);
3304 if(this->grouping)
3305 memcpy((char*)this->grouping, lc->grouping, len);
3307 this->dp = lc->decimal_point[0];
3308 this->sep = lc->thousands_sep[0];
3311 if(!this->false_name || !this->true_name || !this->grouping) {
3312 MSVCRT_operator_delete((char*)this->grouping);
3313 MSVCRT_operator_delete((char*)this->false_name);
3314 MSVCRT_operator_delete((char*)this->true_name);
3316 ERR("Out of memory\n");
3317 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3321 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
3322 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
3323 DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
3324 void __thiscall numpunct_char__Tidy(numpunct_char *this)
3326 TRACE("(%p)\n", this);
3328 MSVCRT_operator_delete((char*)this->grouping);
3329 MSVCRT_operator_delete((char*)this->false_name);
3330 MSVCRT_operator_delete((char*)this->true_name);
3333 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
3334 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
3335 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
3336 numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
3337 _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
3339 TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
3340 locale_facet_ctor_refs(&this->facet, refs);
3341 this->facet.vtable = &MSVCP_numpunct_char_vtable;
3342 numpunct_char__Init(this, locinfo, usedef);
3343 return this;
3346 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
3347 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
3348 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
3349 numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
3350 const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
3352 _Locinfo locinfo;
3354 TRACE("(%p %s %lu %d)\n", this, debugstr_a(name), refs, usedef);
3355 locale_facet_ctor_refs(&this->facet, refs);
3356 this->facet.vtable = &MSVCP_numpunct_char_vtable;
3358 _Locinfo_ctor_cstr(&locinfo, name);
3359 numpunct_char__Init(this, &locinfo, usedef);
3360 _Locinfo_dtor(&locinfo);
3361 return this;
3364 /* ??0?$numpunct@D@std@@QAE@I@Z */
3365 /* ??0?$numpunct@D@std@@QEAA@_K@Z */
3366 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
3367 numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, MSVCP_size_t refs)
3369 TRACE("(%p %lu)\n", this, refs);
3370 return numpunct_char_ctor_name(this, "C", refs, FALSE);
3373 /* ??_F?$numpunct@D@std@@QAEXXZ */
3374 /* ??_F?$numpunct@D@std@@QEAAXXZ */
3375 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
3376 numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
3378 return numpunct_char_ctor_refs(this, 0);
3381 /* ??1?$numpunct@D@std@@MAE@XZ */
3382 /* ??1?$numpunct@D@std@@MEAA@XZ */
3383 DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
3384 void __thiscall numpunct_char_dtor(numpunct_char *this)
3386 TRACE("(%p)\n", this);
3387 numpunct_char__Tidy(this);
3390 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_char_vector_dtor, 8)
3391 numpunct_char* __thiscall MSVCP_numpunct_char_vector_dtor(numpunct_char *this, unsigned int flags)
3393 TRACE("(%p %x)\n", this, flags);
3394 if(flags & 2) {
3395 /* we have an array, with the number of elements stored before the first object */
3396 int i, *ptr = (int *)this-1;
3398 for(i=*ptr-1; i>=0; i--)
3399 numpunct_char_dtor(this+i);
3400 MSVCRT_operator_delete(ptr);
3401 } else {
3402 numpunct_char_dtor(this);
3403 if(flags & 1)
3404 MSVCRT_operator_delete(this);
3407 return this;
3410 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3411 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3412 MSVCP_size_t __cdecl numpunct_char__Getcat(const locale_facet **facet, const locale *loc)
3414 TRACE("(%p %p)\n", facet, loc);
3416 if(facet && !*facet) {
3417 *facet = MSVCRT_operator_new(sizeof(numpunct_char));
3418 if(!*facet) {
3419 ERR("Out of memory\n");
3420 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3421 return 0;
3423 numpunct_char_ctor_name((numpunct_char*)*facet,
3424 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0, TRUE);
3427 return LC_NUMERIC;
3430 numpunct_char* numpunct_char_use_facet(const locale *loc)
3432 static numpunct_char *obj = NULL;
3434 _Lockit lock;
3435 const locale_facet *fac;
3437 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3438 fac = locale__Getfacet(loc, numpunct_char_id.id);
3439 if(fac) {
3440 _Lockit_dtor(&lock);
3441 return (numpunct_char*)fac;
3444 if(obj)
3445 return obj;
3447 numpunct_char__Getcat(&fac, loc);
3448 obj = (numpunct_char*)fac;
3449 locale_facet__Incref(&obj->facet);
3450 locale_facet_register(&obj->facet);
3451 _Lockit_dtor(&lock);
3453 return obj;
3456 /* ?do_decimal_point@?$numpunct@D@std@@MBEDXZ */
3457 /* ?do_decimal_point@?$numpunct@D@std@@MEBADXZ */
3458 DEFINE_THISCALL_WRAPPER(numpunct_char_do_decimal_point, 4)
3459 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
3460 char, (const numpunct_char *this), (this))
3461 char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
3463 TRACE("(%p)\n", this);
3464 return this->dp;
3467 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
3468 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
3469 DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
3470 char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
3472 TRACE("(%p)\n", this);
3473 return call_numpunct_char_do_decimal_point(this);
3476 /* ?do_thousands_sep@?$numpunct@D@std@@MBEDXZ */
3477 /* ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ */
3478 DEFINE_THISCALL_WRAPPER(numpunct_char_do_thousands_sep, 4)
3479 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
3480 char, (const numpunct_char*), (this))
3481 char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
3483 TRACE("(%p)\n", this);
3484 return this->sep;
3487 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
3488 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
3489 DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
3490 char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
3492 TRACE("(%p)\n", this);
3493 return call_numpunct_char_do_thousands_sep(this);
3496 /* ?do_grouping@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3497 /* ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3498 DEFINE_THISCALL_WRAPPER(numpunct_char_do_grouping, 8)
3499 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
3500 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
3501 basic_string_char* __thiscall numpunct_char_do_grouping(
3502 const numpunct_char *this, basic_string_char *ret)
3504 TRACE("(%p)\n", this);
3505 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
3508 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3509 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3510 DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
3511 basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
3513 TRACE("(%p)\n", this);
3514 return call_numpunct_char_do_grouping(this, ret);
3517 /* ?do_falsename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3518 /* ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3519 DEFINE_THISCALL_WRAPPER(numpunct_char_do_falsename, 8)
3520 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
3521 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
3522 basic_string_char* __thiscall numpunct_char_do_falsename(
3523 const numpunct_char *this, basic_string_char *ret)
3525 TRACE("(%p)\n", this);
3526 return MSVCP_basic_string_char_ctor_cstr(ret, this->false_name);
3529 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3530 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3531 DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
3532 basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
3534 TRACE("(%p)\n", this);
3535 return call_numpunct_char_do_falsename(this, ret);
3538 /* ?do_truename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3539 /* ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3540 DEFINE_THISCALL_WRAPPER(numpunct_char_do_truename, 8)
3541 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
3542 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
3543 basic_string_char* __thiscall numpunct_char_do_truename(
3544 const numpunct_char *this, basic_string_char *ret)
3546 TRACE("(%p)\n", this);
3547 return MSVCP_basic_string_char_ctor_cstr(ret, this->true_name);
3550 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3551 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3552 DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
3553 basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
3555 TRACE("(%p)\n", this);
3556 return call_numpunct_char_do_truename(this, ret);
3559 /* ?id@?$numpunct@_W@std@@2V0locale@2@A */
3560 locale_id numpunct_wchar_id = {0};
3561 /* ?id@?$numpunct@G@std@@2V0locale@2@A */
3562 locale_id numpunct_short_id = {0};
3564 /* ??_7?$numpunct@_W@std@@6B@ */
3565 extern const vtable_ptr MSVCP_numpunct_wchar_vtable;
3566 /* ??_7?$numpunct@G@std@@6B@ */
3567 extern const vtable_ptr MSVCP_numpunct_short_vtable;
3569 /* ?_Init@?$numpunct@_W@std@@IAEXABV_Locinfo@2@_N@Z */
3570 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
3571 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
3572 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
3573 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
3574 void __thiscall numpunct_wchar__Init(numpunct_wchar *this, _Locinfo *locinfo, MSVCP_bool isdef)
3576 const char *to_convert;
3577 _Cvtvec cvt;
3578 int len;
3580 TRACE("(%p %p %d)\n", this, locinfo, isdef);
3582 _Locinfo__Getcvt(locinfo, &cvt);
3584 to_convert = _Locinfo__Getfalse(locinfo);
3585 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
3586 this->false_name = MSVCRT_operator_new(len*sizeof(WCHAR));
3587 if(this->false_name)
3588 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
3589 (wchar_t*)this->false_name, len);
3591 to_convert = _Locinfo__Gettrue(locinfo);
3592 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
3593 this->true_name = MSVCRT_operator_new(len*sizeof(WCHAR));
3594 if(this->true_name)
3595 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
3596 (wchar_t*)this->true_name, len);
3598 if(isdef) {
3599 this->grouping = MSVCRT_operator_new(1);
3600 if(this->grouping)
3601 *(char*)this->grouping = 0;
3603 this->dp = '.';
3604 this->sep = ',';
3605 } else {
3606 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
3608 len = strlen(lc->grouping)+1;
3609 this->grouping = MSVCRT_operator_new(len);
3610 if(this->grouping)
3611 memcpy((char*)this->grouping, lc->grouping, len);
3613 this->dp = lc->decimal_point[0];
3614 this->sep = lc->thousands_sep[0];
3617 if(!this->false_name || !this->true_name || !this->grouping) {
3618 MSVCRT_operator_delete((char*)this->grouping);
3619 MSVCRT_operator_delete((wchar_t*)this->false_name);
3620 MSVCRT_operator_delete((wchar_t*)this->true_name);
3622 ERR("Out of memory\n");
3623 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3627 /* ?_Tidy@?$numpunct@_W@std@@AAEXXZ */
3628 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
3629 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
3630 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
3631 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
3632 void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
3634 TRACE("(%p)\n", this);
3636 MSVCRT_operator_delete((char*)this->grouping);
3637 MSVCRT_operator_delete((wchar_t*)this->false_name);
3638 MSVCRT_operator_delete((wchar_t*)this->true_name);
3641 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
3642 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
3643 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
3644 numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
3645 _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
3647 TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
3648 locale_facet_ctor_refs(&this->facet, refs);
3649 this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
3650 numpunct_wchar__Init(this, locinfo, usedef);
3651 return this;
3654 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
3655 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
3656 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
3657 numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
3658 _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
3660 numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
3661 this->facet.vtable = &MSVCP_numpunct_short_vtable;
3662 return this;
3665 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
3666 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
3667 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
3668 numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
3669 const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
3671 _Locinfo locinfo;
3673 TRACE("(%p %s %lu %d)\n", this, debugstr_a(name), refs, usedef);
3674 locale_facet_ctor_refs(&this->facet, refs);
3675 this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
3677 _Locinfo_ctor_cstr(&locinfo, name);
3678 numpunct_wchar__Init(this, &locinfo, usedef);
3679 _Locinfo_dtor(&locinfo);
3680 return this;
3683 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
3684 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
3685 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
3686 numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
3687 const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
3689 numpunct_wchar_ctor_name(this, name, refs, usedef);
3690 this->facet.vtable = &MSVCP_numpunct_short_vtable;
3691 return this;
3694 /* ??0?$numpunct@_W@std@@QAE@I@Z */
3695 /* ??0?$numpunct@_W@std@@QEAA@_K@Z */
3696 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
3697 numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
3699 TRACE("(%p %lu)\n", this, refs);
3700 return numpunct_wchar_ctor_name(this, "C", refs, FALSE);
3703 /* ??0?$numpunct@G@std@@QAE@I@Z */
3704 /* ??0?$numpunct@G@std@@QEAA@_K@Z */
3705 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
3706 numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
3708 numpunct_wchar_ctor_refs(this, refs);
3709 this->facet.vtable = &MSVCP_numpunct_short_vtable;
3710 return this;
3713 /* ??_F?$numpunct@_W@std@@QAEXXZ */
3714 /* ??_F?$numpunct@_W@std@@QEAAXXZ */
3715 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
3716 numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
3718 return numpunct_wchar_ctor_refs(this, 0);
3721 /* ??_F?$numpunct@G@std@@QAEXXZ */
3722 /* ??_F?$numpunct@G@std@@QEAAXXZ */
3723 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
3724 numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
3726 return numpunct_short_ctor_refs(this, 0);
3729 /* ??1?$numpunct@_W@std@@MAE@XZ */
3730 /* ??1?$numpunct@_W@std@@MEAA@XZ */
3731 /* ??1?$numpunct@G@std@@MAE@XZ */
3732 /* ??1?$numpunct@G@std@@MEAA@XZ */
3733 DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
3734 void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
3736 TRACE("(%p)\n", this);
3737 numpunct_wchar__Tidy(this);
3740 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_wchar_vector_dtor, 8)
3741 numpunct_wchar* __thiscall MSVCP_numpunct_wchar_vector_dtor(numpunct_wchar *this, unsigned int flags)
3743 TRACE("(%p %x)\n", this, flags);
3744 if(flags & 2) {
3745 /* we have an array, with the number of elements stored before the first object */
3746 int i, *ptr = (int *)this-1;
3748 for(i=*ptr-1; i>=0; i--)
3749 numpunct_wchar_dtor(this+i);
3750 MSVCRT_operator_delete(ptr);
3751 } else {
3752 numpunct_wchar_dtor(this);
3753 if(flags & 1)
3754 MSVCRT_operator_delete(this);
3757 return this;
3760 DEFINE_THISCALL_WRAPPER(MSVCP_numpunct_short_vector_dtor, 8)
3761 numpunct_wchar* __thiscall MSVCP_numpunct_short_vector_dtor(numpunct_wchar *this, unsigned int flags)
3763 return MSVCP_numpunct_wchar_vector_dtor(this, flags);
3766 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3767 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3768 MSVCP_size_t __cdecl numpunct_wchar__Getcat(const locale_facet **facet, const locale *loc)
3770 TRACE("(%p %p)\n", facet, loc);
3772 if(facet && !*facet) {
3773 *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
3774 if(!*facet) {
3775 ERR("Out of memory\n");
3776 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3777 return 0;
3779 numpunct_wchar_ctor_name((numpunct_wchar*)*facet,
3780 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0, TRUE);
3783 return LC_NUMERIC;
3786 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3787 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3788 MSVCP_size_t __cdecl numpunct_short__Getcat(const locale_facet **facet, const locale *loc)
3790 TRACE("(%p %p)\n", facet, loc);
3792 if(facet && !*facet) {
3793 *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
3794 if(!*facet) {
3795 ERR("Out of memory\n");
3796 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3797 return 0;
3799 numpunct_short_ctor_name((numpunct_wchar*)*facet,
3800 MSVCP_basic_string_char_c_str(&loc->ptr->name), 0, TRUE);
3803 return LC_NUMERIC;
3806 /* ?do_decimal_point@?$numpunct@_W@std@@MBE_WXZ */
3807 /* ?do_decimal_point@?$numpunct@_W@std@@MEBA_WXZ */
3808 /* ?do_decimal_point@?$numpunct@G@std@@MBEGXZ */
3809 /* ?do_decimal_point@?$numpunct@G@std@@MEBAGXZ */
3810 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_decimal_point, 4)
3811 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
3812 wchar_t, (const numpunct_wchar *this), (this))
3813 wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
3815 TRACE("(%p)\n", this);
3816 return this->dp;
3819 /* ?decimal_point@?$numpunct@_W@std@@QBE_WXZ */
3820 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
3821 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
3822 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
3823 DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
3824 wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
3826 TRACE("(%p)\n", this);
3827 return call_numpunct_wchar_do_decimal_point(this);
3830 /* ?do_thousands_sep@?$numpunct@_W@std@@MBE_WXZ */
3831 /* ?do_thousands_sep@?$numpunct@_W@std@@MEBA_WXZ */
3832 /* ?do_thousands_sep@?$numpunct@G@std@@MBEGXZ */
3833 /* ?do_thousands_sep@?$numpunct@G@std@@MEBAGXZ */
3834 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_thousands_sep, 4)
3835 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
3836 wchar_t, (const numpunct_wchar *this), (this))
3837 wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
3839 TRACE("(%p)\n", this);
3840 return this->sep;
3843 /* ?thousands_sep@?$numpunct@_W@std@@QBE_WXZ */
3844 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
3845 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
3846 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
3847 DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
3848 wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
3850 TRACE("(%p)\n", this);
3851 return call_numpunct_wchar_do_thousands_sep(this);
3854 /* ?do_grouping@?$numpunct@_W@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3855 /* ?do_grouping@?$numpunct@_W@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3856 /* ?do_grouping@?$numpunct@G@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3857 /* ?do_grouping@?$numpunct@G@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3858 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_grouping, 8)
3859 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
3860 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
3861 basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *this, basic_string_char *ret)
3863 TRACE("(%p)\n", this);
3864 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
3867 /* ?grouping@?$numpunct@_W@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3868 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3869 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3870 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3871 DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
3872 basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
3874 TRACE("(%p)\n", this);
3875 return call_numpunct_wchar_do_grouping(this, ret);
3878 /* ?do_falsename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3879 /* ?do_falsename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3880 /* ?do_falsename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3881 /* ?do_falsename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3882 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_falsename, 8)
3883 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
3884 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
3885 basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
3887 TRACE("(%p)\n", this);
3888 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->false_name);
3891 /* ?falsename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3892 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3893 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3894 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3895 DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
3896 basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
3898 TRACE("(%p)\n", this);
3899 return call_numpunct_wchar_do_falsename(this, ret);
3902 /* ?do_truename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3903 /* ?do_truename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3904 /* ?do_truename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3905 /* ?do_truename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3906 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_truename, 8)
3907 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
3908 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
3909 basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *this, basic_string_wchar *ret)
3911 TRACE("(%p)\n", this);
3912 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->true_name);
3915 /* ?truename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3916 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
3917 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3918 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
3919 DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
3920 basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
3922 TRACE("(%p)\n", this);
3923 return call_numpunct_wchar_do_truename(this, ret);
3926 double __cdecl _Stod(const char *buf, char **buf_end, LONG exp)
3928 double ret = strtod(buf, buf_end);
3930 if(exp)
3931 ret *= pow(10, exp);
3932 return ret;
3935 double __cdecl _Stodx(const char *buf, char **buf_end, LONG exp, int *err)
3937 double ret;
3939 *err = *_errno();
3940 *_errno() = 0;
3941 ret = _Stod(buf, buf_end, exp);
3942 if(*_errno()) {
3943 *err = *_errno();
3944 }else {
3945 *_errno() = *err;
3946 *err = 0;
3948 return ret;
3951 float __cdecl _Stof(const char *buf, char **buf_end, LONG exp)
3953 return _Stod(buf, buf_end, exp);
3956 float __cdecl _Stofx(const char *buf, char **buf_end, LONG exp, int *err)
3958 return _Stodx(buf, buf_end, exp, err);
3961 __int64 __cdecl _Stoll(const char *buf, char **buf_end, int base)
3963 return _strtoi64(buf, buf_end, base);
3966 __int64 __cdecl _Stollx(const char *buf, char **buf_end, int base, int *err)
3968 __int64 ret;
3970 *err = *_errno();
3971 *_errno() = 0;
3972 ret = _strtoi64(buf, buf_end, base);
3973 if(*_errno()) {
3974 *err = *_errno();
3975 }else {
3976 *_errno() = *err;
3977 *err = 0;
3979 return ret;
3982 LONG __cdecl _Stolx(const char *buf, char **buf_end, int base, int *err)
3984 __int64 i = _Stollx(buf, buf_end, base, err);
3985 if(!*err && i!=(__int64)((LONG)i))
3986 *err = ERANGE;
3987 return i;
3990 unsigned __int64 __cdecl _Stoull(const char *buf, char **buf_end, int base)
3992 return _strtoui64(buf, buf_end, base);
3995 unsigned __int64 __cdecl _Stoullx(const char *buf, char **buf_end, int base, int *err)
3997 unsigned __int64 ret;
3999 *err = *_errno();
4000 *_errno() = 0;
4001 ret = _strtoui64(buf, buf_end, base);
4002 if(*_errno()) {
4003 *err = *_errno();
4004 }else {
4005 *_errno() = *err;
4006 *err = 0;
4008 return ret;
4011 ULONG __cdecl _Stoul(const char *buf, char **buf_end, int base)
4013 int err;
4014 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, &err);
4015 if(!err && i!=(unsigned __int64)((ULONG)i))
4016 *_errno() = ERANGE;
4017 return buf[0]=='-' ? -i : i;
4020 ULONG __cdecl _Stoulx(const char *buf, char **buf_end, int base, int *err)
4022 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, err);
4023 if(!*err && i!=(unsigned __int64)((ULONG)i))
4024 *err = ERANGE;
4025 return buf[0]=='-' ? -i : i;
4028 /* ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
4029 locale_id num_get_wchar_id = {0};
4030 /* ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
4031 locale_id num_get_short_id = {0};
4033 /* ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
4034 extern const vtable_ptr MSVCP_num_get_wchar_vtable;
4035 /* ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
4036 extern const vtable_ptr MSVCP_num_get_short_vtable;
4038 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4039 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4040 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4041 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4042 DEFINE_THISCALL_WRAPPER(num_get_wchar__Init, 8)
4043 void __thiscall num_get_wchar__Init(num_get *this, const _Locinfo *locinfo)
4045 FIXME("(%p %p) stub\n", this, locinfo);
4048 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4049 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4050 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_locinfo, 12)
4051 num_get* __thiscall num_get_wchar_ctor_locinfo(num_get *this,
4052 _Locinfo *locinfo, MSVCP_size_t refs)
4054 FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
4055 return NULL;
4058 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4059 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4060 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_locinfo, 12)
4061 num_get* __thiscall num_get_short_ctor_locinfo(num_get *this,
4062 _Locinfo *locinfo, MSVCP_size_t refs)
4064 FIXME("(%p %p %lu) stub\n", this, locinfo, refs);
4065 return NULL;
4068 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
4069 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
4070 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_refs, 8)
4071 num_get* __thiscall num_get_wchar_ctor_refs(num_get *this, MSVCP_size_t refs)
4073 FIXME("(%p %lu) stub\n", this, refs);
4074 return NULL;
4077 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
4078 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
4079 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_refs, 8)
4080 num_get* __thiscall num_get_short_ctor_refs(num_get *this, MSVCP_size_t refs)
4082 FIXME("(%p %lu) stub\n", this, refs);
4083 return NULL;
4086 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4087 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4088 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor, 4)
4089 num_get* __thiscall num_get_wchar_ctor(num_get *this)
4091 FIXME("(%p) stub\n", this);
4092 return NULL;
4095 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4096 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4097 DEFINE_THISCALL_WRAPPER(num_get_short_ctor, 4)
4098 num_get* __thiscall num_get_short_ctor(num_get *this)
4100 FIXME("(%p) stub\n", this);
4101 return NULL;
4104 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
4105 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
4106 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
4107 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
4108 DEFINE_THISCALL_WRAPPER(num_get_wchar_dtor, 4)
4109 void __thiscall num_get_wchar_dtor(num_get *this)
4111 FIXME("(%p) stub\n", this);
4114 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar_vector_dtor, 8)
4115 num_get* __thiscall MSVCP_num_get_wchar_vector_dtor(num_get *this, unsigned int flags)
4117 TRACE("(%p %x)\n", this, flags);
4118 if(flags & 2) {
4119 /* we have an array, with the number of elements stored before the first object */
4120 int i, *ptr = (int *)this-1;
4122 for(i=*ptr-1; i>=0; i--)
4123 num_get_wchar_dtor(this+i);
4124 MSVCRT_operator_delete(ptr);
4125 } else {
4126 num_get_wchar_dtor(this);
4127 if(flags & 1)
4128 MSVCRT_operator_delete(this);
4131 return this;
4134 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_short_vector_dtor, 8)
4135 num_get* __thiscall MSVCP_num_get_short_vector_dtor(num_get *this, unsigned int flags)
4137 return MSVCP_num_get_wchar_vector_dtor(this, flags);
4140 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4141 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4142 MSVCP_size_t __cdecl num_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
4144 FIXME("(%p %p) stub\n", facet, loc);
4145 return -1;
4148 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4149 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4150 MSVCP_size_t __cdecl num_get_short__Getcat(const locale_facet **facet, const locale *loc)
4152 FIXME("(%p %p) stub\n", facet, loc);
4153 return -1;
4156 /* ?_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 */
4157 /* ?_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 */
4158 /* ?_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 */
4159 /* ?_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 */
4160 int __cdecl num_get_wchar__Getffld(num_get *this, char *dest, istreambuf_iterator_wchar *first,
4161 istreambuf_iterator_wchar *last, const locale *loc)
4163 FIXME("(%p %p %p %p) stub\n", dest, first, last, loc);
4164 return -1;
4167 /* ?_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 */
4168 /* ?_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 */
4169 /* ?_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 */
4170 /* ?_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 */
4171 int __cdecl num_get_wchar__Getffldx(num_get *this, char *dest, istreambuf_iterator_wchar *first,
4172 istreambuf_iterator_wchar *last, ios_base *ios, int *phexexp)
4174 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
4175 return -1;
4178 /* ?_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 */
4179 /* ?_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 */
4180 /* ?_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 */
4181 /* ?_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 */
4182 int __cdecl num_get_wchar__Getifld(num_get *this, char *dest, istreambuf_iterator_wchar *first,
4183 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
4185 FIXME("(%p %p %p %04x %p) stub\n", dest, first, last, fmtflags, loc);
4186 return -1;
4189 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABEH_W000@Z */
4190 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAH_W000@Z */
4191 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABEHGGGG@Z */
4192 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHGGGG@Z */
4193 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar__Hexdig, 20)
4194 int __thiscall MSVCP_num_get_wchar__Hexdig(num_get *this, wchar_t dig, wchar_t e0, wchar_t al, wchar_t au)
4196 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
4197 return -1;
4200 /* ?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 */
4201 /* ?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 */
4202 /* ?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 */
4203 /* ?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 */
4204 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_void,36)
4205 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
4206 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
4208 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4209 return ret;
4212 /* ?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 */
4213 /* ?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 */
4214 /* ?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 */
4215 /* ?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 */
4216 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_void,36)
4217 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
4218 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
4220 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4221 return ret;
4224 /* ?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 */
4225 /* ?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 */
4226 /* ?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 */
4227 /* ?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 */
4228 /* ?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 */
4229 /* ?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 */
4230 /* ?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 */
4231 /* ?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 */
4232 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_double,36)
4233 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
4234 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
4236 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4237 return ret;
4240 /* ?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 */
4241 /* ?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 */
4242 /* ?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 */
4243 /* ?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 */
4244 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ldouble,36)
4245 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ldouble(const num_get *this, istreambuf_iterator_wchar *ret,
4246 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
4248 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4249 return ret;
4252 /* ?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 */
4253 /* ?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 */
4254 /* ?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 */
4255 /* ?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 */
4256 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_double,36)
4257 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
4258 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
4260 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4261 return ret;
4264 /* ?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 */
4265 /* ?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 */
4266 /* ?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 */
4267 /* ?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 */
4268 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_float,36)
4269 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
4270 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
4272 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4273 return ret;
4276 /* ?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 */
4277 /* ?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 */
4278 /* ?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 */
4279 /* ?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 */
4280 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_float,36)
4281 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
4282 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
4284 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4285 return ret;
4288 /* ?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 */
4289 /* ?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 */
4290 /* ?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 */
4291 /* ?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 */
4292 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint64,36)
4293 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
4294 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
4296 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4297 return ret;
4300 /* ?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 */
4301 /* ?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 */
4302 /* ?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 */
4303 /* ?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 */
4304 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint64,36)
4305 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
4306 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
4308 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4309 return ret;
4312 /* ?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 */
4313 /* ?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 */
4314 /* ?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 */
4315 /* ?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 */
4316 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_int64,36)
4317 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
4318 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
4320 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4321 return ret;
4324 /* ?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 */
4325 /* ?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 */
4326 /* ?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 */
4327 /* ?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 */
4328 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_int64,36)
4329 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
4330 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
4332 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4333 return ret;
4336 /* ?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 */
4337 /* ?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 */
4338 /* ?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 */
4339 /* ?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 */
4340 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ulong,36)
4341 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
4342 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
4344 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4345 return ret;
4348 /* ?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 */
4349 /* ?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 */
4350 /* ?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 */
4351 /* ?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 */
4352 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ulong,36)
4353 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
4354 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
4356 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4357 return ret;
4360 /* ?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 */
4361 /* ?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 */
4362 /* ?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 */
4363 /* ?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 */
4364 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_long,36)
4365 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
4366 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
4368 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4369 return ret;
4372 /* ?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 */
4373 /* ?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 */
4374 /* ?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 */
4375 /* ?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 */
4376 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_long,36)
4377 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
4378 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
4380 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4381 return ret;
4384 /* ?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 */
4385 /* ?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 */
4386 /* ?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 */
4387 /* ?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 */
4388 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint,36)
4389 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
4390 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
4392 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4393 return ret;
4396 /* ?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 */
4397 /* ?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 */
4398 /* ?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 */
4399 /* ?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 */
4400 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint,36)
4401 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
4402 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
4404 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4405 return ret;
4408 /* ?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 */
4409 /* ?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 */
4410 /* ?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 */
4411 /* ?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 */
4412 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ushort,36)
4413 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
4414 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
4416 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4417 return ret;
4420 /* ?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 */
4421 /* ?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 */
4422 /* ?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@ */
4423 /* ?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 */
4424 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ushort,36)
4425 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
4426 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
4428 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4429 return ret;
4432 /* ?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 */
4433 /* ?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 */
4434 /* ?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 */
4435 /* ?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 */
4436 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_bool,36)
4437 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
4438 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, MSVCP_bool *pval)
4440 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4441 return ret;
4444 /* ?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 */
4445 /* ?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 */
4446 /* ?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 */
4447 /* ?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 */
4448 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_bool,36)
4449 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
4450 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, MSVCP_bool *pval)
4452 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4453 return ret;
4456 /* ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
4457 locale_id num_get_char_id = {0};
4459 /* ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
4460 extern const vtable_ptr MSVCP_num_get_char_vtable;
4462 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4463 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4464 DEFINE_THISCALL_WRAPPER(num_get_char__Init, 8)
4465 void __thiscall num_get_char__Init(num_get *this, const _Locinfo *locinfo)
4467 TRACE("(%p %p)\n", this, locinfo);
4468 _Locinfo__Getcvt(locinfo, &this->cvt);
4471 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4472 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4473 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_locinfo, 12)
4474 num_get* __thiscall num_get_char_ctor_locinfo(num_get *this,
4475 _Locinfo *locinfo, MSVCP_size_t refs)
4477 TRACE("(%p %p %lu)\n", this, locinfo, refs);
4479 locale_facet_ctor_refs(&this->facet, refs);
4480 this->facet.vtable = &MSVCP_num_get_char_vtable;
4482 num_get_char__Init(this, locinfo);
4483 return this;
4486 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
4487 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
4488 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_refs, 8)
4489 num_get* __thiscall num_get_char_ctor_refs(num_get *this, MSVCP_size_t refs)
4491 _Locinfo locinfo;
4493 TRACE("(%p %lu)\n", this, refs);
4495 _Locinfo_ctor(&locinfo);
4496 num_get_char_ctor_locinfo(this, &locinfo, refs);
4497 _Locinfo_dtor(&locinfo);
4498 return this;
4501 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
4502 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
4503 DEFINE_THISCALL_WRAPPER(num_get_char_ctor, 4)
4504 num_get* __thiscall num_get_char_ctor(num_get *this)
4506 return num_get_char_ctor_refs(this, 0);
4509 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
4510 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
4511 DEFINE_THISCALL_WRAPPER(num_get_char_dtor, 4)
4512 void __thiscall num_get_char_dtor(num_get *this)
4514 TRACE("(%p)\n", this);
4515 locale_facet_dtor(&this->facet);
4518 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char_vector_dtor, 8)
4519 num_get* __thiscall MSVCP_num_get_char_vector_dtor(num_get *this, unsigned int flags)
4521 TRACE("(%p %x)\n", this, flags);
4522 if(flags & 2) {
4523 /* we have an array, with the number of elements stored before the first object */
4524 int i, *ptr = (int *)this-1;
4526 for(i=*ptr-1; i>=0; i--)
4527 num_get_char_dtor(this+i);
4528 MSVCRT_operator_delete(ptr);
4529 } else {
4530 num_get_char_dtor(this);
4531 if(flags & 1)
4532 MSVCRT_operator_delete(this);
4535 return this;
4538 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4539 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4540 MSVCP_size_t __cdecl num_get_char__Getcat(const locale_facet **facet, const locale *loc)
4542 TRACE("(%p %p)\n", facet, loc);
4544 if(facet && !*facet) {
4545 _Locinfo locinfo;
4547 *facet = MSVCRT_operator_new(sizeof(num_get));
4548 if(!*facet) {
4549 ERR("Out of memory\n");
4550 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4551 return 0;
4554 _Locinfo_ctor_cstr(&locinfo, MSVCP_basic_string_char_c_str(&loc->ptr->name));
4555 num_get_char_ctor_locinfo((num_get*)*facet, &locinfo, 0);
4556 _Locinfo_dtor(&locinfo);
4559 return LC_NUMERIC;
4562 /* ?_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 */
4563 /* ?_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 */
4564 /* Copies number to dest buffer, validates grouping and skips separators.
4565 * Updates first so it points past the number, all digits are skipped.
4566 * Returns how exponent needs to changed.
4567 * Size of dest buffer is not specified, assuming it's not smaller then 32:
4568 * strlen(+0.e+) + 22(digits) + 4(expontent) + 1(nullbyte)
4570 int __cdecl num_get_char__Getffld(const num_get *this, char *dest, istreambuf_iterator_char *first,
4571 istreambuf_iterator_char *last, const locale *loc)
4573 numpunct_char *numpunct = numpunct_char_use_facet(loc);
4574 basic_string_char grouping_bstr;
4575 int groups_no = 0, cur_group = 0, exp = 0;
4576 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31, *groups = NULL, sep;
4577 const char *grouping;
4578 BOOL error = TRUE, dest_empty = TRUE;
4580 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
4582 numpunct_char_grouping(numpunct, &grouping_bstr);
4583 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
4584 sep = grouping[0] ? numpunct_char_thousands_sep(numpunct) : '\0';
4586 istreambuf_iterator_char_val(first);
4587 if(first->strbuf && (first->val=='-' || first->val=='+')) {
4588 *dest++ = first->val;
4589 istreambuf_iterator_char_inc(first);
4592 if(sep) {
4593 groups_no = strlen(grouping)+2;
4594 groups = calloc(groups_no, sizeof(char));
4597 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
4598 if(first->val<'0' || first->val>'9') {
4599 if(sep && first->val==sep) {
4600 if(cur_group == groups_no+1) {
4601 if(groups[1] != groups[2]) {
4602 error = TRUE;
4603 break;
4604 }else {
4605 memmove(groups+1, groups+2, groups_no);
4606 groups[cur_group] = 0;
4608 }else {
4609 cur_group++;
4611 }else {
4612 break;
4614 }else {
4615 error = FALSE;
4616 if(dest_empty && first->val == '0')
4617 continue;
4618 dest_empty = FALSE;
4619 if(dest < num_end)
4620 *dest++ = first->val;
4621 else
4622 exp++;
4623 if(sep && groups[cur_group]<CHAR_MAX)
4624 groups[cur_group]++;
4628 if(cur_group && !groups[cur_group])
4629 error = TRUE;
4630 else if(!cur_group)
4631 cur_group--;
4633 for(; cur_group>=0 && !error; cur_group--) {
4634 if(*grouping == CHAR_MAX) {
4635 if(cur_group)
4636 error = TRUE;
4637 break;
4638 }else if((cur_group && *grouping!=groups[cur_group])
4639 || (!cur_group && *grouping<groups[cur_group])) {
4640 error = TRUE;
4641 break;
4642 }else if(grouping[1]) {
4643 grouping++;
4646 MSVCP_basic_string_char_dtor(&grouping_bstr);
4647 free(groups);
4649 if(error) {
4650 *dest_beg = '\0';
4651 return 0;
4652 }else if(dest_empty) {
4653 *dest++ = '0';
4656 if(first->strbuf && first->val==numpunct_char_decimal_point(numpunct)) {
4657 if(dest < num_end)
4658 *dest++ = *localeconv()->decimal_point;
4659 istreambuf_iterator_char_inc(first);
4661 if(dest_empty) {
4662 for(; first->strbuf && first->val=='0'; istreambuf_iterator_char_inc(first))
4663 exp--;
4665 if(!first->strbuf || first->val<'1' || first->val>'9')
4666 dest--;
4670 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
4671 if(first->val<'0' || first->val>'9')
4672 break;
4673 else if(dest<num_end)
4674 *dest++ = first->val;
4675 else
4676 exp--;
4679 if(first->strbuf && (first->val=='e' || first->val=='E')) {
4680 *dest++ = first->val;
4681 istreambuf_iterator_char_inc(first);
4683 if(first->strbuf && (first->val=='-' || first->val=='+')) {
4684 *dest++ = first->val;
4685 istreambuf_iterator_char_inc(first);
4688 error = dest_empty = TRUE;
4689 for(; first->strbuf && first->val=='0'; istreambuf_iterator_char_inc(first))
4690 error = FALSE;
4692 for(; first->strbuf && first->val>='0' && first->val<='9'; istreambuf_iterator_char_inc(first)) {
4693 error = dest_empty = FALSE;
4694 if(dest<exp_end)
4695 *dest++ = first->val;
4698 if(error) {
4699 *dest_beg = '\0';
4700 return 0;
4701 }else if(dest_empty) {
4702 *dest++ = '0';
4706 *dest++ = '\0';
4707 return exp;
4710 /* ?_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 */
4711 /* ?_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 */
4712 int __cdecl num_get_char__Getffldx(const num_get *this, char *dest, istreambuf_iterator_char *first,
4713 istreambuf_iterator_char *last, ios_base *ios, int *phexexp)
4715 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
4716 return -1;
4719 /* ?_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 */
4720 /* ?_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 */
4721 /* Copies number to dest buffer, validates grouping and skips separators.
4722 * Updates first so it points past the number, all digits are skipped.
4723 * Returns number base (8, 10 or 16).
4724 * Size of dest buffer is not specified, assuming it's not smaller then 25:
4725 * 22(8^22>2^64)+1(detect overflows)+1(sign)+1(nullbyte) = 25
4727 int __cdecl num_get_char__Getifld(const num_get *this, char *dest, istreambuf_iterator_char *first,
4728 istreambuf_iterator_char *last, int fmtflags, const locale *loc)
4730 static const char digits[] = "0123456789abcdefABCDEF";
4732 numpunct_char *numpunct = numpunct_char_use_facet(loc);
4733 basic_string_char grouping_bstr;
4734 int basefield, base, groups_no = 0, cur_group = 0;
4735 char *dest_beg = dest, *dest_end = dest+24, *groups = NULL, sep;
4736 const char *grouping;
4737 BOOL error = TRUE, dest_empty = TRUE;
4739 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
4741 numpunct_char_grouping(numpunct, &grouping_bstr);
4742 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
4743 sep = grouping[0] ? numpunct_char_thousands_sep(numpunct) : '\0';
4745 basefield = fmtflags & FMTFLAG_basefield;
4746 if(basefield == FMTFLAG_oct)
4747 base = 8;
4748 else if(basefield == FMTFLAG_hex)
4749 base = 22; /* equal to the size of digits buffer */
4750 else if(!basefield)
4751 base = 0;
4752 else
4753 base = 10;
4755 istreambuf_iterator_char_val(first);
4756 if(first->strbuf && (first->val=='-' || first->val=='+')) {
4757 *dest++ = first->val;
4758 istreambuf_iterator_char_inc(first);
4761 if(!base && first->strbuf && first->val=='0') {
4762 istreambuf_iterator_char_inc(first);
4763 if(first->strbuf && (first->val=='x' || first->val=='X')) {
4764 istreambuf_iterator_char_inc(first);
4765 base = 22;
4766 }else {
4767 error = FALSE;
4768 base = 8;
4770 }else {
4771 base = 10;
4774 if(sep) {
4775 groups_no = strlen(grouping)+2;
4776 groups = calloc(groups_no, sizeof(char));
4779 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
4780 if(!memchr(digits, first->val, base)) {
4781 if(sep && first->val==sep) {
4782 if(cur_group == groups_no+1) {
4783 if(groups[1] != groups[2]) {
4784 error = TRUE;
4785 break;
4786 }else {
4787 memmove(groups+1, groups+2, groups_no);
4788 groups[cur_group] = 0;
4790 }else {
4791 cur_group++;
4793 }else {
4794 break;
4796 }else {
4797 error = FALSE;
4798 if(dest_empty && first->val == '0')
4799 continue;
4800 dest_empty = FALSE;
4801 /* skip digits that can't be copied to dest buffer, other
4802 * functions are responsible for detecting overflows */
4803 if(dest < dest_end)
4804 *dest++ = first->val;
4805 if(sep && groups[cur_group]<CHAR_MAX)
4806 groups[cur_group]++;
4810 if(cur_group && !groups[cur_group])
4811 error = TRUE;
4812 else if(!cur_group)
4813 cur_group--;
4815 for(; cur_group>=0 && !error; cur_group--) {
4816 if(*grouping == CHAR_MAX) {
4817 if(cur_group)
4818 error = TRUE;
4819 break;
4820 }else if((cur_group && *grouping!=groups[cur_group])
4821 || (!cur_group && *grouping<groups[cur_group])) {
4822 error = TRUE;
4823 break;
4824 }else if(grouping[1]) {
4825 grouping++;
4828 MSVCP_basic_string_char_dtor(&grouping_bstr);
4829 free(groups);
4831 if(error)
4832 dest = dest_beg;
4833 else if(dest_empty)
4834 *dest++ = '0';
4835 *dest = '\0';
4837 return (base==22 ? 16 : base);
4840 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABEHD000@Z */
4841 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHD000@Z */
4842 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char__Hexdig, 20)
4843 int __thiscall MSVCP_num_get_char__Hexdig(num_get *this, char dig, char e0, char al, char au)
4845 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
4846 return -1;
4849 /* ?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 */
4850 /* ?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 */
4851 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_char*, \
4852 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
4853 (this, ret, first, last, base, state, pval))
4854 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_void,36)
4855 istreambuf_iterator_char *__thiscall num_get_char_do_get_void(const num_get *this, istreambuf_iterator_char *ret,
4856 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
4858 unsigned __int64 v;
4859 char tmp[25], *end;
4860 int err;
4862 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
4864 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
4865 &first, &last, FMTFLAG_hex, base->loc), &err);
4866 if(v!=(unsigned __int64)((INT_PTR)v))
4867 *state |= IOSTATE_failbit;
4868 else if(end!=tmp && !err)
4869 *pval = (void*)((INT_PTR)v);
4870 else
4871 *state |= IOSTATE_failbit;
4873 if(!first.strbuf)
4874 *state |= IOSTATE_eofbit;
4876 *ret = first;
4877 return ret;
4880 /* ?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 */
4881 /* ?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 */
4882 DEFINE_THISCALL_WRAPPER(num_get_char_get_void,36)
4883 istreambuf_iterator_char *__thiscall num_get_char_get_void(const num_get *this, istreambuf_iterator_char *ret,
4884 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
4886 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
4887 return call_num_get_char_do_get_void(this, ret, first, last, base, state, pval);
4890 /* ?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 */
4891 /* ?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 */
4892 /* ?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 */
4893 /* ?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 */
4894 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
4895 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
4896 (this, ret, first, last, base, state, pval))
4897 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
4898 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
4899 (this, ret, first, last, base, state, pval))
4900 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_double,36)
4901 istreambuf_iterator_char *__thiscall num_get_char_do_get_double(const num_get *this, istreambuf_iterator_char *ret,
4902 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
4904 double v;
4905 char tmp[32], *end;
4906 int err;
4908 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
4910 v = _Stodx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, base->loc), &err);
4911 if(end!=tmp && !err)
4912 *pval = v;
4913 else
4914 *state |= IOSTATE_failbit;
4916 if(!first.strbuf)
4917 *state |= IOSTATE_eofbit;
4919 *ret = first;
4920 return ret;
4923 /* ?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 */
4924 /* ?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 */
4925 DEFINE_THISCALL_WRAPPER(num_get_char_get_ldouble,36)
4926 istreambuf_iterator_char *__thiscall num_get_char_get_ldouble(const num_get *this, istreambuf_iterator_char *ret,
4927 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
4929 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
4930 return ret;
4933 /* ?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 */
4934 /* ?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 */
4935 DEFINE_THISCALL_WRAPPER(num_get_char_get_double,36)
4936 istreambuf_iterator_char *__thiscall num_get_char_get_double(const num_get *this, istreambuf_iterator_char *ret,
4937 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
4939 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
4940 return call_num_get_char_do_get_double(this, ret, first, last, base, state, pval);
4943 /* ?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 */
4944 /* ?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 */
4945 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
4946 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
4947 (this, ret, first, last, base, state, pval))
4948 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_float,36)
4949 istreambuf_iterator_char *__thiscall num_get_char_do_get_float(const num_get *this, istreambuf_iterator_char *ret,
4950 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
4952 float v;
4953 char tmp[32], *end;
4954 int err;
4956 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
4958 v = _Stofx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, base->loc), &err);
4959 if(end!=tmp && !err)
4960 *pval = v;
4961 else
4962 *state |= IOSTATE_failbit;
4964 if(!first.strbuf)
4965 *state |= IOSTATE_eofbit;
4967 *ret = first;
4968 return ret;
4971 /* ?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 */
4972 /* ?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 */
4973 DEFINE_THISCALL_WRAPPER(num_get_char_get_float,36)
4974 istreambuf_iterator_char *__thiscall num_get_char_get_float(const num_get *this, istreambuf_iterator_char *ret,
4975 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
4977 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
4978 return call_num_get_char_do_get_float(this, ret, first, last, base, state, pval);
4981 /* ?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 */
4982 /* ?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 */
4983 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
4984 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
4985 (this, ret, first, last, base, state, pval))
4986 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint64,36)
4987 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
4988 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
4990 unsigned __int64 v;
4991 char tmp[25], *end;
4992 int err;
4994 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
4996 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
4997 &first, &last, base->fmtfl, base->loc), &err);
4998 if(end!=tmp && !err)
4999 *pval = v;
5000 else
5001 *state |= IOSTATE_failbit;
5003 if(!first.strbuf)
5004 *state |= IOSTATE_eofbit;
5006 *ret = first;
5007 return ret;
5010 /* ?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 */
5011 /* ?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 */
5012 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint64,36)
5013 istreambuf_iterator_char *__thiscall num_get_char_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
5014 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
5016 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5017 return call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval);
5020 /* ?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 */
5021 /* ?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 */
5022 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
5023 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
5024 (this, ret, first, last, base, state, pval))
5025 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_int64,36)
5026 istreambuf_iterator_char *__thiscall num_get_char_do_get_int64(const num_get *this, istreambuf_iterator_char *ret,
5027 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
5029 __int64 v;
5030 char tmp[25], *end;
5031 int err;
5033 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5035 v = _Stollx(tmp, &end, num_get_char__Getifld(this, tmp,
5036 &first, &last, base->fmtfl, base->loc), &err);
5037 if(end!=tmp && !err)
5038 *pval = v;
5039 else
5040 *state |= IOSTATE_failbit;
5042 if(!first.strbuf)
5043 *state |= IOSTATE_eofbit;
5045 *ret = first;
5046 return ret;
5049 /* ?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 */
5050 /* ?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 */
5051 DEFINE_THISCALL_WRAPPER(num_get_char_get_int64,36)
5052 istreambuf_iterator_char *__thiscall num_get_char_get_int64(const num_get *this, istreambuf_iterator_char *ret,
5053 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
5055 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5056 return call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval);
5059 /* ?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 */
5060 /* ?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 */
5061 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
5062 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
5063 (this, ret, first, last, base, state, pval))
5064 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ulong,36)
5065 istreambuf_iterator_char *__thiscall num_get_char_do_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
5066 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
5068 ULONG v;
5069 char tmp[25], *end;
5070 int err;
5072 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5074 v = _Stoulx(tmp, &end, num_get_char__Getifld(this, tmp,
5075 &first, &last, base->fmtfl, base->loc), &err);
5076 if(end!=tmp && !err)
5077 *pval = v;
5078 else
5079 *state |= IOSTATE_failbit;
5081 if(!first.strbuf)
5082 *state |= IOSTATE_eofbit;
5084 *ret = first;
5085 return ret;
5088 /* ?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 */
5089 /* ?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 */
5090 DEFINE_THISCALL_WRAPPER(num_get_char_get_ulong,36)
5091 istreambuf_iterator_char *__thiscall num_get_char_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
5092 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
5094 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5095 return call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
5098 /* ?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 */
5099 /* ?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 */
5100 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
5101 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
5102 (this, ret, first, last, base, state, pval))
5103 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_long,36)
5104 istreambuf_iterator_char *__thiscall num_get_char_do_get_long(const num_get *this, istreambuf_iterator_char *ret,
5105 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
5107 LONG v;
5108 char tmp[25], *end;
5109 int err;
5111 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5113 v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
5114 &first, &last, base->fmtfl, base->loc), &err);
5115 if(end!=tmp && !err)
5116 *pval = v;
5117 else
5118 *state |= IOSTATE_failbit;
5120 if(!first.strbuf)
5121 *state |= IOSTATE_eofbit;
5123 *ret = first;
5124 return ret;
5127 /* ?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 */
5128 /* ?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 */
5129 DEFINE_THISCALL_WRAPPER(num_get_char_get_long,36)
5130 istreambuf_iterator_char *__thiscall num_get_char_get_long(const num_get *this, istreambuf_iterator_char *ret,
5131 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
5133 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5134 return call_num_get_char_do_get_long(this, ret, first, last, base, state, pval);
5137 /* ?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 */
5138 /* ?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 */
5139 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
5140 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
5141 (this, ret, first, last, base, state, pval))
5142 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint,36)
5143 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint(const num_get *this, istreambuf_iterator_char *ret,
5144 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
5146 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5147 return num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
5150 /* ?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 */
5151 /* ?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 */
5152 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint,36)
5153 istreambuf_iterator_char *__thiscall num_get_char_get_uint(const num_get *this, istreambuf_iterator_char *ret,
5154 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
5156 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5157 return call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval);
5160 /* ?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 */
5161 /* ?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 */
5162 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
5163 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
5164 (this, ret, first, last, base, state, pval))
5165 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ushort,36)
5166 istreambuf_iterator_char *__thiscall num_get_char_do_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
5167 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
5169 ULONG v;
5170 char tmp[25], *beg, *end;
5171 int err, b;
5173 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5175 b = num_get_char__Getifld(this, tmp,
5176 &first, &last, base->fmtfl, base->loc);
5177 beg = tmp + (tmp[0]=='-' ? 1 : 0);
5178 v = _Stoulx(beg, &end, b, &err);
5180 if(v != (ULONG)((unsigned short)v))
5181 *state |= IOSTATE_failbit;
5182 else if(end!=beg && !err)
5183 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
5184 else
5185 *state |= IOSTATE_failbit;
5187 if(!first.strbuf)
5188 *state |= IOSTATE_eofbit;
5190 *ret = first;
5191 return ret;
5194 /* ?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 */
5195 /* ?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 */
5196 DEFINE_THISCALL_WRAPPER(num_get_char_get_ushort,36)
5197 istreambuf_iterator_char *__thiscall num_get_char_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
5198 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
5200 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5201 return call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval);
5204 /* ?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 */
5205 /* ?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 */
5206 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
5207 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, MSVCP_bool*), \
5208 (this, ret, first, last, base, state, pval))
5209 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_bool,36)
5210 istreambuf_iterator_char *__thiscall num_get_char_do_get_bool(const num_get *this, istreambuf_iterator_char *ret,
5211 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, MSVCP_bool *pval)
5213 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5215 if(base->fmtfl & FMTFLAG_boolalpha) {
5216 numpunct_char *numpunct = numpunct_char_use_facet(base->loc);
5217 basic_string_char false_bstr, true_bstr;
5218 const char *pfalse, *ptrue;
5220 numpunct_char_falsename(numpunct, &false_bstr);
5221 numpunct_char_truename(numpunct, &true_bstr);
5222 pfalse = MSVCP_basic_string_char_c_str(&false_bstr);
5223 ptrue = MSVCP_basic_string_char_c_str(&true_bstr);
5225 for(istreambuf_iterator_char_val(&first); first.strbuf;
5226 istreambuf_iterator_char_inc(&first)) {
5227 if(pfalse && *pfalse && first.val!=*pfalse)
5228 pfalse = NULL;
5229 if(ptrue && *ptrue && first.val!=*ptrue)
5230 ptrue = NULL;
5232 if(pfalse && *pfalse && ptrue && !*ptrue)
5233 ptrue = NULL;
5234 if(ptrue && *ptrue && pfalse && !*pfalse)
5235 pfalse = NULL;
5237 if(pfalse)
5238 pfalse++;
5239 if(ptrue)
5240 ptrue++;
5242 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
5243 break;
5246 if(ptrue)
5247 *pval = TRUE;
5248 else if(pfalse)
5249 *pval = FALSE;
5250 else
5251 *state |= IOSTATE_failbit;
5253 MSVCP_basic_string_char_dtor(&false_bstr);
5254 MSVCP_basic_string_char_dtor(&true_bstr);
5255 }else {
5256 char tmp[25], *end;
5257 int err;
5258 LONG v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
5259 &first, &last, base->fmtfl, base->loc), &err);
5261 if(end!=tmp && err==0 && (v==0 || v==1))
5262 *pval = v;
5263 else
5264 *state |= IOSTATE_failbit;
5267 if(!first.strbuf)
5268 *state |= IOSTATE_eofbit;
5269 memcpy(ret, &first, sizeof(first));
5270 return ret;
5273 /* ?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 */
5274 /* ?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 */
5275 DEFINE_THISCALL_WRAPPER(num_get_char_get_bool,36)
5276 istreambuf_iterator_char *__thiscall num_get_char_get_bool(const num_get *this, istreambuf_iterator_char *ret,
5277 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, MSVCP_bool *pval)
5279 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5280 return call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval);
5283 /* ??0_Locimp@locale@std@@AAE@_N@Z */
5284 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
5285 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
5286 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, MSVCP_bool transparent)
5288 TRACE("(%p %d)\n", this, transparent);
5290 memset(this, 0, sizeof(locale__Locimp));
5291 locale_facet_ctor_refs(&this->facet, 1);
5292 this->transparent = transparent;
5293 MSVCP_basic_string_char_ctor_cstr(&this->name, "*");
5294 return this;
5297 /* ??_F_Locimp@locale@std@@QAEXXZ */
5298 /* ??_F_Locimp@locale@std@@QEAAXXZ */
5299 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
5300 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
5302 return locale__Locimp_ctor_transparent(this, FALSE);
5305 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
5306 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
5307 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
5308 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
5310 _Lockit lock;
5311 MSVCP_size_t i;
5313 TRACE("(%p %p)\n", this, copy);
5315 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5316 memcpy(this, copy, sizeof(locale__Locimp));
5317 locale_facet_ctor_refs(&this->facet, 1);
5318 if(copy->facetvec) {
5319 this->facetvec = MSVCRT_operator_new(copy->facet_cnt*sizeof(locale_facet*));
5320 if(!this->facetvec) {
5321 _Lockit_dtor(&lock);
5322 ERR("Out of memory\n");
5323 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
5324 return NULL;
5326 for(i=0; i<this->facet_cnt; i++)
5327 if(this->facetvec[i])
5328 locale_facet__Incref(this->facetvec[i]);
5330 MSVCP_basic_string_char_copy_ctor(&this->name, &copy->name);
5331 _Lockit_dtor(&lock);
5332 return this;
5335 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
5336 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
5337 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
5339 return locale__Locimp_copy_ctor(this, copy);
5342 /* ??1_Locimp@locale@std@@MAE@XZ */
5343 /* ??1_Locimp@locale@std@@MEAA@XZ */
5344 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
5345 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
5347 TRACE("(%p)\n", this);
5349 if(locale_facet__Decref(&this->facet)) {
5350 MSVCP_size_t i;
5351 for(i=0; i<this->facet_cnt; i++)
5352 if(this->facetvec[i] && locale_facet__Decref(this->facetvec[i]))
5353 call_locale_facet_vector_dtor(this->facetvec[i], 0);
5355 MSVCRT_operator_delete(this->facetvec);
5356 MSVCP_basic_string_char_dtor(&this->name);
5360 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
5361 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
5362 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
5364 locale__Locimp_dtor(this);
5367 DEFINE_THISCALL_WRAPPER(MSVCP_locale__Locimp_vector_dtor, 8)
5368 locale__Locimp* __thiscall MSVCP_locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
5370 TRACE("(%p %x)\n", this, flags);
5371 if(flags & 2) {
5372 /* we have an array, with the number of elements stored before the first object */
5373 int i, *ptr = (int *)this-1;
5375 for(i=*ptr-1; i>=0; i--)
5376 locale__Locimp_dtor(this+i);
5377 MSVCRT_operator_delete(ptr);
5378 } else {
5379 locale__Locimp_dtor(this);
5380 if(flags & 1)
5381 MSVCRT_operator_delete(this);
5384 return this;
5387 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
5388 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
5389 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, MSVCP_size_t id)
5391 _Lockit lock;
5393 TRACE("(%p %p %lu)\n", locimp, facet, id);
5395 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5396 if(id >= locimp->facet_cnt) {
5397 MSVCP_size_t new_size = id+1;
5398 locale_facet **new_facetvec;
5400 if(new_size < locale_id__Id_cnt+1)
5401 new_size = locale_id__Id_cnt+1;
5403 new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
5404 if(!new_facetvec) {
5405 _Lockit_dtor(&lock);
5406 ERR("Out of memory\n");
5407 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
5408 return;
5411 memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
5412 memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
5413 MSVCRT_operator_delete(locimp->facetvec);
5414 locimp->facetvec = new_facetvec;
5415 locimp->facet_cnt = new_size;
5418 if(locimp->facetvec[id] && locale_facet__Decref(locimp->facetvec[id]))
5419 call_locale_facet_vector_dtor(locimp->facetvec[id], 0);
5421 locimp->facetvec[id] = facet;
5422 if(facet)
5423 locale_facet__Incref(facet);
5424 _Lockit_dtor(&lock);
5427 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
5428 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
5429 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
5430 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, MSVCP_size_t id)
5432 locale__Locimp__Locimp_Addfac(this, facet, id);
5435 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
5436 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
5437 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
5439 FIXME("stub\n");
5440 return NULL;
5443 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
5444 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
5445 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
5447 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
5448 return NULL;
5451 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
5452 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
5453 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
5455 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
5458 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
5459 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
5460 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
5462 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
5465 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
5466 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
5467 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
5469 FIXME("(%p %d %p %p) stub\n", locinfo, cat, locimp, loc);
5472 /* ??_7_Locimp@locale@std@@6B@ */
5473 const vtable_ptr MSVCP_locale__Locimp_vtable[] = {
5474 (vtable_ptr)THISCALL_NAME(MSVCP_locale__Locimp_vector_dtor)
5477 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
5478 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
5479 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
5480 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
5482 TRACE("(%p %p)\n", this, locimp);
5483 /* Don't change locimp reference counter */
5484 this->ptr = locimp;
5485 return this;
5488 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
5489 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
5490 locale__Locimp* __cdecl locale__Init(void)
5492 _Lockit lock;
5494 TRACE("\n");
5496 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5497 if(global_locale) {
5498 _Lockit_dtor(&lock);
5499 return global_locale;
5502 global_locale = MSVCRT_operator_new(sizeof(locale__Locimp));
5503 if(!global_locale) {
5504 _Lockit_dtor(&lock);
5505 ERR("Out of memory\n");
5506 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
5507 return NULL;
5510 locale__Locimp_ctor(global_locale);
5511 global_locale->catmask = (1<<(LC_MAX+1))-1;
5512 MSVCP_basic_string_char_dtor(&global_locale->name);
5513 MSVCP_basic_string_char_ctor_cstr(&global_locale->name, "C");
5515 locale__Locimp__Clocptr = global_locale;
5516 global_locale->facet.refs++;
5517 locale_ctor_locimp(&classic_locale, locale__Locimp__Clocptr);
5518 _Lockit_dtor(&lock);
5520 return global_locale;
5523 /* ??0locale@std@@QAE@ABV01@0H@Z */
5524 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
5525 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
5526 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
5528 FIXME("(%p %p %p %d) stub\n", this, loc, other, cat);
5529 return NULL;
5532 /* ??0locale@std@@QAE@ABV01@@Z */
5533 /* ??0locale@std@@QEAA@AEBV01@@Z */
5534 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
5535 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
5537 TRACE("(%p %p)\n", this, copy);
5538 this->ptr = copy->ptr;
5539 locale_facet__Incref(&this->ptr->facet);
5540 return this;
5543 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
5544 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
5545 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
5546 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
5548 FIXME("(%p %p %s %d) stub\n", this, loc, locname, cat);
5549 return NULL;
5552 /* ??0locale@std@@QAE@PBDH@Z */
5553 /* ??0locale@std@@QEAA@PEBDH@Z */
5554 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
5555 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
5557 FIXME("(%p %s %d) stub\n", this, locname, cat);
5558 return NULL;
5561 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
5562 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
5563 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
5564 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
5566 TRACE("(%p)\n", this);
5567 this->ptr = NULL;
5568 return this;
5571 /* ??0locale@std@@QAE@XZ */
5572 /* ??0locale@std@@QEAA@XZ */
5573 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
5574 locale* __thiscall locale_ctor(locale *this)
5576 TRACE("(%p)\n", this);
5577 this->ptr = locale__Init();
5578 locale_facet__Incref(&this->ptr->facet);
5579 return this;
5582 /* ??1locale@std@@QAE@XZ */
5583 /* ??1locale@std@@QEAA@XZ */
5584 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
5585 void __thiscall locale_dtor(locale *this)
5587 TRACE("(%p)\n", this);
5588 if(this->ptr)
5589 locale__Locimp_dtor(this->ptr);
5592 DEFINE_THISCALL_WRAPPER(MSVCP_locale_vector_dtor, 8)
5593 locale* __thiscall MSVCP_locale_vector_dtor(locale *this, unsigned int flags)
5595 TRACE("(%p %x)\n", this, flags);
5596 if(flags & 2) {
5597 /* we have an array, with the number of elements stored before the first object */
5598 int i, *ptr = (int *)this-1;
5600 for(i=*ptr-1; i>=0; i--)
5601 locale_dtor(this+i);
5602 MSVCRT_operator_delete(ptr);
5603 } else {
5604 locale_dtor(this);
5605 if(flags & 1)
5606 MSVCRT_operator_delete(this);
5609 return this;
5612 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
5613 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
5614 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
5615 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
5617 FIXME("(%p %p) stub\n", this, loc);
5618 return NULL;
5621 /* ??8locale@std@@QBE_NABV01@@Z */
5622 /* ??8locale@std@@QEBA_NAEBV01@@Z */
5623 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
5624 MSVCP_bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
5626 FIXME("(%p %p) stub\n", this, loc);
5627 return 0;
5630 /* ??9locale@std@@QBE_NABV01@@Z */
5631 /* ??9locale@std@@QEBA_NAEBV01@@Z */
5632 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
5633 MSVCP_bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
5635 FIXME("(%p %p) stub\n", this, loc);
5636 return 0;
5639 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
5640 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
5641 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
5642 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, MSVCP_size_t id, MSVCP_size_t catmask)
5644 TRACE("(%p %p %lu %lu)\n", this, facet, id, catmask);
5646 if(this->ptr->facet.refs > 1) {
5647 locale__Locimp *new_ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
5648 if(!new_ptr) {
5649 ERR("Out of memory\n");
5650 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
5651 return NULL;
5653 locale__Locimp_copy_ctor(new_ptr, this->ptr);
5654 locale_facet__Decref(&this->ptr->facet);
5655 this->ptr = new_ptr;
5658 locale__Locimp__Addfac(this->ptr, facet, id);
5660 if(catmask) {
5661 MSVCP_basic_string_char_dtor(&this->ptr->name);
5662 MSVCP_basic_string_char_ctor_cstr(&this->ptr->name, "*");
5664 return this;
5667 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
5668 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
5669 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
5670 const locale_facet* __thiscall locale__Getfacet(const locale *this, MSVCP_size_t id)
5672 locale_facet *fac;
5674 TRACE("(%p %lu)\n", this, id);
5676 fac = id < this->ptr->facet_cnt ? this->ptr->facetvec[id] : NULL;
5677 if(fac || !this->ptr->transparent)
5678 return fac;
5680 return id < global_locale->facet_cnt ? global_locale->facetvec[id] : NULL;
5683 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
5684 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
5685 locale__Locimp* __cdecl locale__Getgloballocale(void)
5687 TRACE("\n");
5688 return global_locale;
5691 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
5692 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
5693 void __cdecl locale__Setgloballocale(void *locimp)
5695 TRACE("(%p)\n", locimp);
5696 global_locale = locimp;
5699 /* ?classic@locale@std@@SAABV12@XZ */
5700 /* ?classic@locale@std@@SAAEBV12@XZ */
5701 const locale* __cdecl locale_classic(void)
5703 TRACE("\n");
5704 locale__Init();
5705 return &classic_locale;
5708 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
5709 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
5710 DEFINE_THISCALL_WRAPPER(locale_name, 8)
5711 basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
5713 TRACE( "(%p)\n", this);
5714 MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
5715 return ret;
5718 /* ?global@locale@std@@SA?AV12@ABV12@@Z */
5719 /* ?global@locale@std@@SA?AV12@AEBV12@@Z */
5720 locale* __cdecl locale_global(locale *ret, const locale *loc)
5722 _Lockit lock;
5723 int i;
5725 TRACE("(%p %p)\n", loc, ret);
5727 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5728 locale_ctor(ret);
5730 if(loc->ptr != global_locale) {
5731 locale_facet__Decref(&global_locale->facet);
5732 global_locale = loc->ptr;
5733 locale_facet__Incref(&global_locale->facet);
5735 for(i=LC_ALL+1; i<=LC_MAX; i++) {
5736 if((global_locale->catmask & (1<<(i-1))) == 0)
5737 continue;
5738 setlocale(i, MSVCP_basic_string_char_c_str(&global_locale->name));
5741 _Lockit_dtor(&lock);
5742 return ret;
5745 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@");
5746 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@");
5747 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@");
5748 DEFINE_RTTI_DATA1(collate_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@G@std@@");
5749 DEFINE_RTTI_DATA1(ctype_base, 0, &locale_facet_rtti_base_descriptor, ".?AUctype_base@std@@");
5750 DEFINE_RTTI_DATA2(ctype_char, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@D@std@@");
5751 DEFINE_RTTI_DATA2(ctype_wchar, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@_W@std@@");
5752 DEFINE_RTTI_DATA2(ctype_short, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@G@std@@");
5753 DEFINE_RTTI_DATA1(codecvt_base, 0, &locale_facet_rtti_base_descriptor, ".?AVcodecvt_base@std@@");
5754 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDH@std@@");
5755 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDH@std@@");
5756 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDH@std@@");
5757 DEFINE_RTTI_DATA1(numpunct_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@D@std@@");
5758 DEFINE_RTTI_DATA1(numpunct_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@_W@std@@");
5759 DEFINE_RTTI_DATA1(numpunct_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@G@std@@");
5760 DEFINE_RTTI_DATA1(num_get_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@");
5761 DEFINE_RTTI_DATA1(num_get_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@");
5762 DEFINE_RTTI_DATA1(num_get_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@");
5764 #ifndef __GNUC__
5765 void __asm_dummy_vtables(void) {
5766 #endif
5767 __ASM_VTABLE(locale_facet, "");
5768 __ASM_VTABLE(collate_char,
5769 VTABLE_ADD_FUNC(collate_char_do_compare)
5770 VTABLE_ADD_FUNC(collate_char_do_transform)
5771 VTABLE_ADD_FUNC(collate_char_do_hash));
5772 __ASM_VTABLE(collate_wchar,
5773 VTABLE_ADD_FUNC(collate_wchar_do_compare)
5774 VTABLE_ADD_FUNC(collate_wchar_do_transform)
5775 VTABLE_ADD_FUNC(collate_wchar_do_hash));
5776 __ASM_VTABLE(collate_short,
5777 VTABLE_ADD_FUNC(collate_wchar_do_compare)
5778 VTABLE_ADD_FUNC(collate_wchar_do_transform)
5779 VTABLE_ADD_FUNC(collate_wchar_do_hash));
5780 __ASM_VTABLE(ctype_base, "");
5781 __ASM_VTABLE(ctype_char,
5782 VTABLE_ADD_FUNC(ctype_char_do_tolower)
5783 VTABLE_ADD_FUNC(ctype_char_do_tolower_ch)
5784 VTABLE_ADD_FUNC(ctype_char_do_toupper)
5785 VTABLE_ADD_FUNC(ctype_char_do_toupper_ch)
5786 VTABLE_ADD_FUNC(ctype_char_do_widen)
5787 VTABLE_ADD_FUNC(ctype_char_do_widen_ch)
5788 VTABLE_ADD_FUNC(ctype_char__Do_widen_s)
5789 VTABLE_ADD_FUNC(ctype_char_do_narrow)
5790 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
5791 VTABLE_ADD_FUNC(ctype_char__Do_narrow_s));
5792 __ASM_VTABLE(ctype_wchar,
5793 VTABLE_ADD_FUNC(ctype_wchar_do_is)
5794 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
5795 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
5796 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
5797 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
5798 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
5799 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
5800 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
5801 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
5802 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
5803 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
5804 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
5805 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
5806 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s));
5807 __ASM_VTABLE(ctype_short,
5808 VTABLE_ADD_FUNC(ctype_wchar_do_is)
5809 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
5810 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
5811 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
5812 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
5813 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
5814 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
5815 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
5816 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
5817 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
5818 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
5819 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
5820 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
5821 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s));
5822 __ASM_VTABLE(codecvt_base,
5823 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
5824 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
5825 VTABLE_ADD_FUNC(codecvt_base_do_encoding));
5826 __ASM_VTABLE(codecvt_char,
5827 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
5828 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
5829 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
5830 VTABLE_ADD_FUNC(codecvt_char_do_in)
5831 VTABLE_ADD_FUNC(codecvt_char_do_out)
5832 VTABLE_ADD_FUNC(codecvt_char_do_unshift)
5833 VTABLE_ADD_FUNC(codecvt_char_do_length));
5834 __ASM_VTABLE(codecvt_wchar,
5835 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
5836 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
5837 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
5838 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
5839 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
5840 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
5841 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
5842 __ASM_VTABLE(codecvt_short,
5843 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
5844 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
5845 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
5846 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
5847 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
5848 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
5849 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
5850 __ASM_VTABLE(numpunct_char,
5851 VTABLE_ADD_FUNC(numpunct_char_do_decimal_point)
5852 VTABLE_ADD_FUNC(numpunct_char_do_thousands_sep)
5853 VTABLE_ADD_FUNC(numpunct_char_do_grouping)
5854 VTABLE_ADD_FUNC(numpunct_char_do_falsename)
5855 VTABLE_ADD_FUNC(numpunct_char_do_truename));
5856 __ASM_VTABLE(numpunct_wchar,
5857 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
5858 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
5859 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
5860 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
5861 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
5862 __ASM_VTABLE(numpunct_short,
5863 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
5864 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
5865 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
5866 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
5867 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
5868 __ASM_VTABLE(num_get_char,
5869 VTABLE_ADD_FUNC(num_get_char_do_get_void)
5870 VTABLE_ADD_FUNC(num_get_char_do_get_double)
5871 VTABLE_ADD_FUNC(num_get_char_do_get_double)
5872 VTABLE_ADD_FUNC(num_get_char_do_get_float)
5873 VTABLE_ADD_FUNC(num_get_char_do_get_uint64)
5874 VTABLE_ADD_FUNC(num_get_char_do_get_int64)
5875 VTABLE_ADD_FUNC(num_get_char_do_get_ulong)
5876 VTABLE_ADD_FUNC(num_get_char_do_get_long)
5877 VTABLE_ADD_FUNC(num_get_char_do_get_uint)
5878 VTABLE_ADD_FUNC(num_get_char_do_get_ushort)
5879 VTABLE_ADD_FUNC(num_get_char_do_get_bool));
5880 __ASM_VTABLE(num_get_short,
5881 VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
5882 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5883 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5884 VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
5885 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
5886 VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
5887 VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
5888 VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
5889 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
5890 VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
5891 VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
5892 __ASM_VTABLE(num_get_wchar,
5893 VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
5894 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5895 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
5896 VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
5897 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
5898 VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
5899 VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
5900 VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
5901 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
5902 VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
5903 VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
5904 #ifndef __GNUC__
5906 #endif
5908 void free_locale(void)
5910 facets_elem *iter, *safe;
5912 if(global_locale) {
5913 locale__Locimp_dtor(global_locale);
5914 locale_dtor(&classic_locale);
5917 LIST_FOR_EACH_ENTRY_SAFE(iter, safe, &lazy_facets, facets_elem, entry) {
5918 list_remove(&iter->entry);
5919 if(locale_facet__Decref(iter->fac))
5920 call_locale_facet_vector_dtor(iter->fac, 1);
5921 MSVCRT_operator_delete(iter);