d3d10/effect: Add support for 'imul' instruction.
[wine.git] / dlls / msvcp90 / locale.c
blob6f2288bce1c9ae4c37d78693d5783d89a9d4a1b4
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 <stdarg.h>
21 #include "assert.h"
22 #include "locale.h"
23 #include "errno.h"
24 #include "limits.h"
25 #include "math.h"
26 #include "mbctype.h"
27 #include "stdio.h"
28 #include "wchar.h"
29 #include "wctype.h"
30 #include "time.h"
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winnls.h"
34 #include "msvcp90.h"
35 #include "wine/heap.h"
36 #include "wine/list.h"
37 #include "wine/debug.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
41 typedef enum {
42 DATEORDER_no_order,
43 DATEORDER_dmy,
44 DATEORDER_mdy,
45 DATEORDER_ymd,
46 DATEORDER_ydm
47 } dateorder;
49 char* __cdecl _Getdays(void);
50 wchar_t* __cdecl _W_Getdays(void);
51 char* __cdecl _Getmonths(void);
52 wchar_t* __cdecl _W_Getmonths(void);
53 void* __cdecl _Gettnames(void);
54 unsigned int __cdecl ___lc_codepage_func(void);
55 int __cdecl ___lc_collate_cp_func(void);
56 const unsigned short* __cdecl __pctype_func(void);
57 const locale_facet* __thiscall locale__Getfacet(const locale*, size_t);
58 const locale* __cdecl locale_classic(void);
60 #if _MSVCP_VER >= 110
61 wchar_t ** __cdecl ___lc_locale_name_func(void);
62 #else
63 LCID* __cdecl ___lc_handle_func(void);
64 #endif
66 #if _MSVCP_VER < 100
67 #define locale_string basic_string_char
68 #define locale_string_char_ctor(this) MSVCP_basic_string_char_ctor(this)
69 #define locale_string_char_ctor_cstr(this,str) MSVCP_basic_string_char_ctor_cstr(this,str)
70 #define locale_string_char_copy_ctor(this,copy) MSVCP_basic_string_char_copy_ctor(this,copy)
71 #define locale_string_char_dtor(this) MSVCP_basic_string_char_dtor(this)
72 #define locale_string_char_c_str(this) MSVCP_basic_string_char_c_str(this)
73 #define locale_string_char_assign(this,assign) MSVCP_basic_string_char_assign(this,assign)
74 #else
75 #define locale_string _Yarn_char
76 #define locale_string_char_ctor(this) _Yarn_char_ctor(this)
77 #define locale_string_char_ctor_cstr(this,str) _Yarn_char_ctor_cstr(this,str)
78 #define locale_string_char_copy_ctor(this,copy) _Yarn_char_copy_ctor(this,copy)
79 #define locale_string_char_dtor(this) _Yarn_char_dtor(this)
80 #define locale_string_char_c_str(this) _Yarn_char_c_str(this)
81 #define locale_string_char_assign(this,assign) _Yarn_char_op_assign(this,assign)
83 #define locale_string_wchar _Yarn_wchar
84 #define locale_string_wchar_ctor(this) _Yarn_wchar_ctor(this)
85 #define locale_string_wchar_dtor(this) _Yarn_wchar_dtor(this)
86 #define locale_string_wchar_c_str(this) _Yarn_wchar__C_str(this)
87 #define locale_string_wchar_assign(this,str) _Yarn_wchar_op_assign_cstr(this,str)
88 #endif
90 typedef int category;
92 typedef struct {
93 size_t id;
94 } locale_id;
96 typedef struct _locale__Locimp {
97 locale_facet facet;
98 locale_facet **facetvec;
99 size_t facet_cnt;
100 category catmask;
101 bool transparent;
102 locale_string name;
103 } locale__Locimp;
105 typedef struct {
106 void *timeptr;
107 } _Timevec;
109 typedef struct {
110 _Lockit lock;
111 locale_string days;
112 locale_string months;
113 #if _MSVCP_VER >= 110
114 locale_string_wchar wdays;
115 locale_string_wchar wmonths;
116 #endif
117 locale_string oldlocname;
118 locale_string newlocname;
119 } _Locinfo;
121 typedef struct {
122 #if _MSVCP_VER < 110
123 LCID handle;
124 #endif
125 unsigned page;
126 #if _MSVCP_VER >= 110
127 wchar_t *lc_name;
128 #endif
129 } _Collvec;
131 typedef struct {
132 locale_facet facet;
133 _Collvec coll;
134 } collate;
136 typedef struct {
137 locale_facet facet;
138 const char *grouping;
139 char dp;
140 char sep;
141 const char *false_name;
142 const char *true_name;
143 } numpunct_char;
145 typedef struct {
146 locale_facet facet;
147 const char *grouping;
148 wchar_t dp;
149 wchar_t sep;
150 const wchar_t *false_name;
151 const wchar_t *true_name;
152 } numpunct_wchar;
154 typedef struct {
155 locale_facet facet;
156 _Timevec time;
157 #if _MSVCP_VER <= 100
158 _Cvtvec cvt;
159 #endif
160 } time_put;
162 typedef struct {
163 locale_facet facet;
164 const char *days;
165 const char *months;
166 dateorder dateorder;
167 _Cvtvec cvt;
168 } time_get_char;
170 typedef struct {
171 locale_facet facet;
172 const wchar_t *days;
173 const wchar_t *months;
174 dateorder dateorder;
175 _Cvtvec cvt;
176 } time_get_wchar;
178 /* ?_Id_cnt@id@locale@std@@0HA */
179 int locale_id__Id_cnt = 0;
181 static locale classic_locale;
183 /* ?_Global@_Locimp@locale@std@@0PAV123@A */
184 /* ?_Global@_Locimp@locale@std@@0PEAV123@EA */
185 locale__Locimp *global_locale = NULL;
187 /* ?_Clocptr@_Locimp@locale@std@@0PAV123@A */
188 /* ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA */
189 locale__Locimp *locale__Locimp__Clocptr = NULL;
191 static char istreambuf_iterator_char_val(istreambuf_iterator_char *this)
193 if(this->strbuf && !this->got) {
194 int c = basic_streambuf_char_sgetc(this->strbuf);
195 if(c == EOF)
196 this->strbuf = NULL;
197 else
198 this->val = c;
201 this->got = TRUE;
202 return this->val;
205 static wchar_t istreambuf_iterator_wchar_val(istreambuf_iterator_wchar *this)
207 if(this->strbuf && !this->got) {
208 unsigned short c = basic_streambuf_wchar_sgetc(this->strbuf);
209 if(c == WEOF)
210 this->strbuf = NULL;
211 else
212 this->val = c;
215 this->got = TRUE;
216 return this->val;
219 static void istreambuf_iterator_char_inc(istreambuf_iterator_char *this)
221 if(!this->strbuf || basic_streambuf_char_sbumpc(this->strbuf)==EOF) {
222 this->strbuf = NULL;
223 this->got = TRUE;
224 }else {
225 this->got = FALSE;
226 istreambuf_iterator_char_val(this);
230 static void istreambuf_iterator_wchar_inc(istreambuf_iterator_wchar *this)
232 if(!this->strbuf || basic_streambuf_wchar_sbumpc(this->strbuf)==WEOF) {
233 this->strbuf = NULL;
234 this->got = TRUE;
235 }else {
236 this->got = FALSE;
237 istreambuf_iterator_wchar_val(this);
241 static void ostreambuf_iterator_char_put(ostreambuf_iterator_char *this, char ch)
243 if(this->failed || basic_streambuf_char_sputc(this->strbuf, ch)==EOF)
244 this->failed = TRUE;
247 static void ostreambuf_iterator_wchar_put(ostreambuf_iterator_wchar *this, wchar_t ch)
249 if(this->failed || basic_streambuf_wchar_sputc(this->strbuf, ch)==WEOF)
250 this->failed = TRUE;
253 /* ??1facet@locale@std@@UAE@XZ */
254 /* ??1facet@locale@std@@UEAA@XZ */
255 /* ??1facet@locale@std@@MAA@XZ */
256 /* ??1facet@locale@std@@MAE@XZ */
257 /* ??1facet@locale@std@@MEAA@XZ */
258 DEFINE_THISCALL_WRAPPER(locale_facet_dtor, 4)
259 void __thiscall locale_facet_dtor(locale_facet *this)
261 TRACE("(%p)\n", this);
264 DEFINE_THISCALL_WRAPPER(locale_facet_vector_dtor, 8)
265 #define call_locale_facet_vector_dtor(this, flags) CALL_VTBL_FUNC(this, 0, \
266 locale_facet*, (locale_facet*, unsigned int), (this, flags))
267 locale_facet* __thiscall locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
269 TRACE("(%p %x)\n", this, flags);
270 if(flags & 2) {
271 /* we have an array, with the number of elements stored before the first object */
272 INT_PTR i, *ptr = (INT_PTR *)this-1;
274 for(i=*ptr-1; i>=0; i--)
275 locale_facet_dtor(this+i);
276 operator_delete(ptr);
277 } else {
278 locale_facet_dtor(this);
279 if(flags & 1)
280 operator_delete(this);
283 return this;
286 typedef struct
288 locale_facet *fac;
289 struct list entry;
290 } facets_elem;
291 static struct list lazy_facets = LIST_INIT(lazy_facets);
293 /* Not exported from msvcp90 */
294 /* ?facet_Register@facet@locale@std@@CAXPAV123@@Z */
295 /* ?facet_Register@facet@locale@std@@CAXPEAV123@@Z */
296 void __cdecl locale_facet_register(locale_facet *add)
298 facets_elem *head = operator_new(sizeof(*head));
299 head->fac = add;
300 list_add_head(&lazy_facets, &head->entry);
303 /* Not exported from msvcp90 */
304 /* ?_Register@facet@locale@std@@QAEXXZ */
305 /* ?_Register@facet@locale@std@@QEAAXXZ */
306 DEFINE_THISCALL_WRAPPER(locale_facet__Register, 4)
307 void __thiscall locale_facet__Register(locale_facet *this)
309 TRACE("(%p)\n", this);
310 locale_facet_register(this);
313 /* Not exported from msvcp90 */
314 /* ??_7facet@locale@std@@6B@ */
315 extern const vtable_ptr locale_facet_vtable;
317 /* ??0id@locale@std@@QAE@I@Z */
318 /* ??0id@locale@std@@QEAA@_K@Z */
319 DEFINE_THISCALL_WRAPPER(locale_id_ctor_id, 8)
320 locale_id* __thiscall locale_id_ctor_id(locale_id *this, size_t id)
322 TRACE("(%p %Iu)\n", this, id);
324 this->id = id;
325 return this;
328 /* ??_Fid@locale@std@@QAEXXZ */
329 /* ??_Fid@locale@std@@QEAAXXZ */
330 DEFINE_THISCALL_WRAPPER(locale_id_ctor, 4)
331 locale_id* __thiscall locale_id_ctor(locale_id *this)
333 TRACE("(%p)\n", this);
335 this->id = 0;
336 return this;
339 /* ??Bid@locale@std@@QAEIXZ */
340 /* ??Bid@locale@std@@QEAA_KXZ */
341 DEFINE_THISCALL_WRAPPER(locale_id_operator_size_t, 4)
342 size_t __thiscall locale_id_operator_size_t(locale_id *this)
344 _Lockit lock;
346 TRACE("(%p)\n", this);
348 if(!this->id) {
349 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
350 this->id = ++locale_id__Id_cnt;
351 _Lockit_dtor(&lock);
354 return this->id;
357 /* ?_Id_cnt_func@id@locale@std@@CAAAHXZ */
358 /* ?_Id_cnt_func@id@locale@std@@CAAEAHXZ */
359 int* __cdecl locale_id__Id_cnt_func(void)
361 TRACE("\n");
362 return &locale_id__Id_cnt;
365 /* ??_Ffacet@locale@std@@QAEXXZ */
366 /* ??_Ffacet@locale@std@@QEAAXXZ */
367 DEFINE_THISCALL_WRAPPER(locale_facet_ctor, 4)
368 locale_facet* __thiscall locale_facet_ctor(locale_facet *this)
370 TRACE("(%p)\n", this);
371 this->vtable = &locale_facet_vtable;
372 this->refs = 0;
373 return this;
376 /* ??0facet@locale@std@@IAE@I@Z */
377 /* ??0facet@locale@std@@IEAA@_K@Z */
378 DEFINE_THISCALL_WRAPPER(locale_facet_ctor_refs, 8)
379 locale_facet* __thiscall locale_facet_ctor_refs(locale_facet *this, size_t refs)
381 TRACE("(%p %Iu)\n", this, refs);
382 this->vtable = &locale_facet_vtable;
383 this->refs = refs;
384 return this;
387 /* ?_Incref@facet@locale@std@@QAEXXZ */
388 /* ?_Incref@facet@locale@std@@QEAAXXZ */
389 /* ?_Incref@facet@locale@std@@UAEXXZ */
390 /* ?_Incref@facet@locale@std@@UEAAXXZ */
391 #if _MSVCP_VER >= 110
392 #define call_locale_facet__Incref(this) CALL_VTBL_FUNC(this, 4, void, (locale_facet*), (this))
393 #else
394 #define call_locale_facet__Incref locale_facet__Incref
395 #endif
396 DEFINE_THISCALL_WRAPPER(locale_facet__Incref, 4)
397 void __thiscall locale_facet__Incref(locale_facet *this)
399 _Lockit lock;
401 TRACE("(%p)\n", this);
403 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
404 this->refs++;
405 _Lockit_dtor(&lock);
408 /* ?_Decref@facet@locale@std@@QAEPAV123@XZ */
409 /* ?_Decref@facet@locale@std@@QEAAPEAV123@XZ */
410 /* ?_Decref@facet@locale@std@@UAEPAV_Facet_base@3@XZ */
411 /* ?_Decref@facet@locale@std@@UEAAPEAV_Facet_base@3@XZ */
412 #if _MSVCP_VER >= 110
413 #define call_locale_facet__Decref(this) CALL_VTBL_FUNC(this, 8, \
414 locale_facet*, (locale_facet*), (this))
415 #else
416 #define call_locale_facet__Decref locale_facet__Decref
417 #endif
418 DEFINE_THISCALL_WRAPPER(locale_facet__Decref, 4)
419 locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
421 _Lockit lock;
422 locale_facet *ret;
424 TRACE("(%p)\n", this);
426 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
427 if(this->refs)
428 this->refs--;
430 ret = this->refs ? NULL : this;
431 _Lockit_dtor(&lock);
433 return ret;
436 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z */
437 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z */
438 size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const locale *loc)
440 TRACE("(%p %p)\n", facet, loc);
441 return -1;
444 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@@Z */
445 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@@Z */
446 size_t __cdecl locale_facet__Getcat_old(const locale_facet **facet)
448 TRACE("(%p)\n", facet);
449 return -1;
452 /* ??0_Timevec@std@@QAE@ABV01@@Z */
453 /* ??0_Timevec@std@@QEAA@AEBV01@@Z */
454 /* This copy constructor modifies copied object */
455 DEFINE_THISCALL_WRAPPER(_Timevec_copy_ctor, 8)
456 _Timevec* __thiscall _Timevec_copy_ctor(_Timevec *this, _Timevec *copy)
458 TRACE("(%p %p)\n", this, copy);
459 this->timeptr = copy->timeptr;
460 copy->timeptr = NULL;
461 return this;
464 /* ??0_Timevec@std@@QAE@PAX@Z */
465 /* ??0_Timevec@std@@QEAA@PEAX@Z */
466 DEFINE_THISCALL_WRAPPER(_Timevec_ctor_timeptr, 8)
467 _Timevec* __thiscall _Timevec_ctor_timeptr(_Timevec *this, void *timeptr)
469 TRACE("(%p %p)\n", this, timeptr);
470 this->timeptr = timeptr;
471 return this;
474 /* ??_F_Timevec@std@@QAEXXZ */
475 /* ??_F_Timevec@std@@QEAAXXZ */
476 DEFINE_THISCALL_WRAPPER(_Timevec_ctor, 4)
477 _Timevec* __thiscall _Timevec_ctor(_Timevec *this)
479 TRACE("(%p)\n", this);
480 this->timeptr = NULL;
481 return this;
484 /* ??1_Timevec@std@@QAE@XZ */
485 /* ??1_Timevec@std@@QEAA@XZ */
486 DEFINE_THISCALL_WRAPPER(_Timevec_dtor, 4)
487 void __thiscall _Timevec_dtor(_Timevec *this)
489 TRACE("(%p)\n", this);
490 free(this->timeptr);
493 /* ??4_Timevec@std@@QAEAAV01@ABV01@@Z */
494 /* ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z */
495 DEFINE_THISCALL_WRAPPER(_Timevec_op_assign, 8)
496 _Timevec* __thiscall _Timevec_op_assign(_Timevec *this, _Timevec *right)
498 TRACE("(%p %p)\n", this, right);
499 this->timeptr = right->timeptr;
500 right->timeptr = NULL;
501 return this;
504 /* ?_Getptr@_Timevec@std@@QBEPAXXZ */
505 /* ?_Getptr@_Timevec@std@@QEBAPEAXXZ */
506 DEFINE_THISCALL_WRAPPER(_Timevec__Getptr, 4)
507 void* __thiscall _Timevec__Getptr(_Timevec *this)
509 TRACE("(%p)\n", this);
510 return this->timeptr;
513 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z */
514 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z */
515 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
517 const char *locale = NULL;
519 TRACE("(%p %d %s)\n", locinfo, category, locstr);
521 if(!locstr)
522 _Xruntime_error("bad locale name");
524 _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
525 locale_string_char_ctor(&locinfo->days);
526 locale_string_char_ctor(&locinfo->months);
527 #if _MSVCP_VER >= 110
528 locale_string_wchar_ctor(&locinfo->wdays);
529 locale_string_wchar_ctor(&locinfo->wmonths);
530 #endif
531 locale_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
533 if(category)
534 locale = setlocale(LC_ALL, locstr);
535 else
536 locale = setlocale(LC_ALL, NULL);
538 if(locale)
539 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
540 else
541 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
543 return locinfo;
546 /* ??0_Locinfo@std@@QAE@HPBD@Z */
547 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
548 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
549 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
551 return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
554 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
555 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
556 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
558 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
561 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
562 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
563 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
564 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
566 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
569 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
570 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
571 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
573 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
576 /* ??0_Locinfo@std@@QAE@PBD@Z */
577 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
578 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
579 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
581 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
584 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
585 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
586 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
588 TRACE("(%p)\n", locinfo);
590 setlocale(LC_ALL, locale_string_char_c_str(&locinfo->oldlocname));
591 locale_string_char_dtor(&locinfo->days);
592 locale_string_char_dtor(&locinfo->months);
593 #if _MSVCP_VER >= 110
594 locale_string_wchar_dtor(&locinfo->wdays);
595 locale_string_wchar_dtor(&locinfo->wmonths);
596 #endif
597 locale_string_char_dtor(&locinfo->oldlocname);
598 locale_string_char_dtor(&locinfo->newlocname);
599 _Lockit_dtor(&locinfo->lock);
602 /* ??_F_Locinfo@std@@QAEXXZ */
603 /* ??_F_Locinfo@std@@QEAAXXZ */
604 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
605 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
607 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
610 /* ??1_Locinfo@std@@QAE@XZ */
611 /* ??1_Locinfo@std@@QEAA@XZ */
612 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
613 void __thiscall _Locinfo_dtor(_Locinfo *this)
615 _Locinfo__Locinfo_dtor(this);
618 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
619 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
620 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
622 const char *locale = NULL;
624 TRACE("(%p %d %s)\n", locinfo, category, locstr);
625 if(!locstr)
626 _Xruntime_error("bad locale name");
628 locale_string_char_dtor(&locinfo->newlocname);
630 if(category)
631 locale = setlocale(LC_ALL, locstr);
632 else
633 locale = setlocale(LC_ALL, NULL);
635 if(locale)
636 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
637 else
638 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
640 return locinfo;
643 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
644 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
645 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
646 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
648 return _Locinfo__Locinfo_Addcats(this, category, locstr);
651 static _Collvec* getcoll(_Collvec *ret)
653 TRACE("\n");
655 ret->page = ___lc_collate_cp_func();
656 #if _MSVCP_VER < 110
657 ret->handle = ___lc_handle_func()[LC_COLLATE];
658 #else
659 ret->lc_name = ___lc_locale_name_func()[LC_COLLATE];
660 #endif
661 return ret;
664 /* _Getcoll */
665 #if defined(__i386__)
666 /* Work around a gcc bug */
667 ULONGLONG __cdecl _Getcoll(void)
669 C_ASSERT(sizeof(_Collvec) == sizeof(ULONGLONG));
670 ULONGLONG ret;
672 getcoll((_Collvec*)&ret);
673 return ret;
675 #else
676 _Collvec __cdecl _Getcoll(void)
678 _Collvec ret;
680 getcoll(&ret);
681 return ret;
683 #endif
685 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
686 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
687 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
688 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
690 return getcoll(ret);
693 /* _Getctype */
694 _Ctypevec __cdecl _Getctype(void)
696 _Ctypevec ret;
697 short *table;
698 #if _MSVCP_VER >= 110
699 wchar_t *name;
700 size_t size;
701 #endif
703 TRACE("\n");
705 ret.page = ___lc_codepage_func();
706 #if _MSVCP_VER < 110
707 ret.handle = ___lc_handle_func()[LC_COLLATE];
708 #else
709 if((name = ___lc_locale_name_func()[LC_COLLATE])) {
710 size = wcslen(name)+1;
711 ret.name = operator_new(size*sizeof(*name));
712 memcpy(ret.name, name, size*sizeof(*name));
713 } else {
714 ret.name = NULL;
716 #endif
717 ret.delfl = TRUE;
718 table = operator_new(sizeof(short[256]));
719 memcpy(table, __pctype_func(), sizeof(short[256]));
720 ret.table = table;
721 return ret;
724 /* ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ */
725 /* ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ */
726 DEFINE_THISCALL_WRAPPER(_Locinfo__Getctype, 8)
727 _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
729 *ret = _Getctype();
730 return ret;
733 /* _Getcvt */
734 #if _MSVCP_VER < 110 && defined(__i386__)
735 /* Work around a gcc bug */
736 ULONGLONG __cdecl _Getcvt(void)
738 C_ASSERT(sizeof(_Cvtvec) == sizeof(ULONGLONG));
739 union {
740 _Cvtvec cvtvec;
741 ULONGLONG ull;
742 } ret;
744 TRACE("\n");
746 ret.cvtvec.page = ___lc_codepage_func();
747 ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
748 return ret.ull;
750 #elif _MSVCP_VER < 110
751 _Cvtvec __cdecl _Getcvt(void)
753 _Cvtvec ret;
755 TRACE("\n");
757 ret.page = ___lc_codepage_func();
758 ret.handle = ___lc_handle_func()[LC_CTYPE];
759 return ret;
761 #else
762 _Cvtvec __cdecl _Getcvt(void)
764 _Cvtvec ret;
765 int i;
767 TRACE("\n");
769 memset(&ret, 0, sizeof(ret));
770 ret.page = ___lc_codepage_func();
771 ret.mb_max = ___mb_cur_max_func();
773 if(ret.mb_max > 1) {
774 for(i=0; i<256; i++)
775 if(_ismbblead(i)) ret.isleadbyte[i/8] |= 1 << (i&7);
777 return ret;
779 #endif
781 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
782 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
783 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
784 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
786 #if _MSVCP_VER < 110 && defined(__i386__)
787 ULONGLONG cvtvec;
788 #else
789 _Cvtvec cvtvec;
790 #endif
792 cvtvec = _Getcvt();
793 memcpy(ret, &cvtvec, sizeof(cvtvec));
794 return ret;
797 int __cdecl _Getdateorder(void)
799 WCHAR date_fmt[2];
801 #if _MSVCP_VER < 110
802 if(!GetLocaleInfoW(___lc_handle_func()[LC_TIME], LOCALE_ILDATE,
803 date_fmt, ARRAY_SIZE(date_fmt)))
804 return DATEORDER_no_order;
805 #else
806 if(!GetLocaleInfoEx(___lc_locale_name_func()[LC_TIME], LOCALE_ILDATE,
807 date_fmt, ARRAY_SIZE(date_fmt)))
808 return DATEORDER_no_order;
809 #endif
811 if(*date_fmt == '0') return DATEORDER_mdy;
812 if(*date_fmt == '1') return DATEORDER_dmy;
813 if(*date_fmt == '2') return DATEORDER_ymd;
814 return DATEORDER_no_order;
817 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
818 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
819 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
820 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
822 TRACE("(%p)\n", this);
823 return _Getdateorder();
826 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
827 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
828 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
829 const char* __thiscall _Locinfo__Getdays(const _Locinfo *this)
831 char *days = _Getdays();
832 const char *ret;
834 TRACE("(%p)\n", this);
836 if(days) {
837 locale_string_char_dtor((locale_string *)&this->days);
838 locale_string_char_ctor_cstr((locale_string *)&this->days, days);
839 free(days);
842 ret = locale_string_char_c_str(&this->days);
843 if (!ret[0]) ret = ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
844 return ret;
847 #if _MSVCP_VER >= 110
848 /* ?_W_Getdays@_Locinfo@std@@QBEPBGXZ */
849 /* ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ */
850 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getdays, 4)
851 const wchar_t* __thiscall _Locinfo__W_Getdays(const _Locinfo *this)
853 static const wchar_t defdays[] =
855 ':','S','u','n',':','S','u','n','d','a','y',
856 ':','M','o','n',':','M','o','n','d','a','y',
857 ':','T','u','e',':','T','u','e','s','d','a','y',
858 ':','W','e','d',':','W','e','d','n','e','s','d','a','y',
859 ':','T','h','u',':','T','h','u','r','s','d','a','y',
860 ':','F','r','i',':','F','r','i','d','a','y',
861 ':','S','a','t',':','S','a','t','u','r','d','a','y'
863 wchar_t *wdays = _W_Getdays();
864 const wchar_t *ret;
866 TRACE("(%p)\n", this);
868 if(wdays) {
869 locale_string_wchar_assign((locale_string_wchar *)&this->wdays, wdays);
870 free(wdays);
873 ret = locale_string_wchar_c_str(&this->wdays);
874 if (!ret[0]) ret = defdays;
875 return ret;
878 /* ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ */
879 /* ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ */
880 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getmonths, 4)
881 const wchar_t* __thiscall _Locinfo__W_Getmonths(const _Locinfo *this)
883 static const wchar_t defmonths[] =
885 ':','J','a','n',':','J','a','n','u','a','r','y',
886 ':','F','e','b',':','F','e','b','r','u','a','r','y',
887 ':','M','a','r',':','M','a','r','c','h',
888 ':','A','p','r',':','A','p','r','i','l',
889 ':','M','a','y',':','M','a','y',
890 ':','J','u','n',':','J','u','n','e',
891 ':','J','u','l',':','J','u','l','y',
892 ':','A','u','g',':','A','u','g','u','s','t',
893 ':','S','e','p',':','S','e','p','t','e','m','b','e','r',
894 ':','O','c','t',':','O','c','t','o','b','e','r',
895 ':','N','o','v',':','N','o','v','e','m','b','e','r',
896 ':','D','e','c',':','D','e','c','e','m','b','e','r'
898 wchar_t *wmonths = _W_Getmonths();
899 const wchar_t *ret;
901 TRACE("(%p)\n", this);
903 if(wmonths) {
904 locale_string_wchar_assign((locale_string_wchar *)&this->wmonths, wmonths);
905 free(wmonths);
908 ret = locale_string_wchar_c_str(&this->wmonths);
909 if (!ret[0]) ret = defmonths;
910 return ret;
912 #endif
914 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
915 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
916 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
917 const char* __thiscall _Locinfo__Getmonths(const _Locinfo *this)
919 char *months = _Getmonths();
920 const char *ret;
922 TRACE("(%p)\n", this);
924 if(months) {
925 locale_string_char_dtor((locale_string *)&this->months);
926 locale_string_char_ctor_cstr((locale_string *)&this->months, months);
927 free(months);
930 ret = locale_string_char_c_str(&this->months);
931 if (!ret[0]) ret = ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
932 ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
933 return ret;
936 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
937 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
938 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
939 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
941 TRACE("(%p)\n", this);
942 return "false";
945 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
946 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
947 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
948 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
950 TRACE("(%p)\n", this);
951 return "true";
954 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
955 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
956 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
957 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
959 TRACE("(%p)\n", this);
960 return localeconv();
963 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
964 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
965 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
966 _Timevec*__thiscall _Locinfo__Gettnames(const _Locinfo *this, _Timevec *ret)
968 TRACE("(%p)\n", this);
970 _Timevec_ctor_timeptr(ret, _Gettnames());
971 return ret;
974 /* ?id@?$collate@D@std@@2V0locale@2@A */
975 locale_id collate_char_id = {0};
977 /* ??_7?$collate@D@std@@6B@ */
978 extern const vtable_ptr collate_char_vtable;
980 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
981 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
982 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
983 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
985 TRACE("(%p %p)\n", this, locinfo);
986 _Locinfo__Getcoll(locinfo, &this->coll);
989 /* ??0?$collate@D@std@@IAE@PBDI@Z */
990 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
991 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
992 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, size_t refs)
994 _Locinfo locinfo;
996 TRACE("(%p %s %Iu)\n", this, name, refs);
998 locale_facet_ctor_refs(&this->facet, refs);
999 this->facet.vtable = &collate_char_vtable;
1001 _Locinfo_ctor_cstr(&locinfo, name);
1002 collate_char__Init(this, &locinfo);
1003 _Locinfo_dtor(&locinfo);
1004 return this;
1007 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
1008 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1009 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
1010 collate* __thiscall collate_char_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1012 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1014 locale_facet_ctor_refs(&this->facet, refs);
1015 this->facet.vtable = &collate_char_vtable;
1016 collate_char__Init(this, locinfo);
1017 return this;
1020 /* ??0?$collate@D@std@@QAE@I@Z */
1021 /* ??0?$collate@D@std@@QEAA@_K@Z */
1022 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
1023 collate* __thiscall collate_char_ctor_refs(collate *this, size_t refs)
1025 return collate_char_ctor_name(this, "C", refs);
1028 /* ??1?$collate@D@std@@UAE@XZ */
1029 /* ??1?$collate@D@std@@UEAA@XZ */
1030 /* ??1?$collate@D@std@@MAE@XZ */
1031 /* ??1?$collate@D@std@@MEAA@XZ */
1032 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
1033 void __thiscall collate_char_dtor(collate *this)
1035 TRACE("(%p)\n", this);
1038 DEFINE_THISCALL_WRAPPER(collate_char_vector_dtor, 8)
1039 collate* __thiscall collate_char_vector_dtor(collate *this, unsigned int flags)
1041 TRACE("(%p %x)\n", this, flags);
1042 if(flags & 2) {
1043 /* we have an array, with the number of elements stored before the first object */
1044 INT_PTR i, *ptr = (INT_PTR *)this-1;
1046 for(i=*ptr-1; i>=0; i--)
1047 collate_char_dtor(this+i);
1048 operator_delete(ptr);
1049 } else {
1050 collate_char_dtor(this);
1051 if(flags & 1)
1052 operator_delete(this);
1055 return this;
1058 /* ??_F?$collate@D@std@@QAEXXZ */
1059 /* ??_F?$collate@D@std@@QEAAXXZ */
1060 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
1061 collate* __thiscall collate_char_ctor(collate *this)
1063 return collate_char_ctor_name(this, "C", 0);
1066 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1067 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1068 size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale *loc)
1070 TRACE("(%p %p)\n", facet, loc);
1072 if(facet && !*facet) {
1073 *facet = operator_new(sizeof(collate));
1074 collate_char_ctor_name((collate*)*facet,
1075 locale_string_char_c_str(&loc->ptr->name), 0);
1078 return LC_COLLATE;
1081 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@@Z */
1082 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1083 size_t __cdecl collate_char__Getcat_old(const locale_facet **facet)
1085 return collate_char__Getcat(facet, locale_classic());
1088 static collate* collate_char_use_facet(const locale *loc)
1090 static collate *obj = NULL;
1092 _Lockit lock;
1093 const locale_facet *fac;
1095 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1096 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_char_id));
1097 if(fac) {
1098 _Lockit_dtor(&lock);
1099 return (collate*)fac;
1102 if(obj) {
1103 _Lockit_dtor(&lock);
1104 return obj;
1107 collate_char__Getcat(&fac, loc);
1108 obj = (collate*)fac;
1109 call_locale_facet__Incref(&obj->facet);
1110 locale_facet_register(&obj->facet);
1111 _Lockit_dtor(&lock);
1113 return obj;
1116 /* _Strcoll */
1117 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
1118 const char *last2, const _Collvec *coll)
1120 LCID lcid;
1122 TRACE("(%s %s)\n", debugstr_an(first1, last1-first1), debugstr_an(first2, last2-first2));
1124 #if _MSVCP_VER < 110
1125 lcid = (coll ? coll->handle : ___lc_handle_func()[LC_COLLATE]);
1126 #else
1127 lcid = LocaleNameToLCID(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE], 0);
1128 #endif
1129 return CompareStringA(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1132 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
1133 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
1134 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
1135 #if _MSVCP_VER <= 100
1136 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1137 (const collate*, const char*, const char*, const char*, const char*), \
1138 (this, first1, last1, first2, last2))
1139 #else
1140 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1141 (const collate*, const char*, const char*, const char*, const char*), \
1142 (this, first1, last1, first2, last2))
1143 #endif
1144 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
1145 const char *last1, const char *first2, const char *last2)
1147 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1148 return _Strcoll(first1, last1, first2, last2, &this->coll);
1151 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
1152 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
1153 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
1154 int __thiscall collate_char_compare(const collate *this, const char *first1,
1155 const char *last1, const char *first2, const char *last2)
1157 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1158 return call_collate_char_do_compare(this, first1, last1, first2, last2);
1161 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
1162 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
1163 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
1164 #if _MSVCP_VER <= 100
1165 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1166 (const collate*, const char*, const char*), (this, first, last))
1167 #else
1168 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1169 (const collate*, const char*, const char*), (this, first, last))
1170 #endif
1171 LONG __thiscall collate_char_do_hash(const collate *this,
1172 const char *first, const char *last)
1174 ULONG ret = 0;
1176 TRACE("(%p %p %p)\n", this, first, last);
1178 for(; first<last; first++)
1179 ret = (ret<<8 | ret>>24) + *first;
1180 return ret;
1183 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
1184 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
1185 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
1186 LONG __thiscall collate_char_hash(const collate *this,
1187 const char *first, const char *last)
1189 TRACE("(%p %p %p)\n", this, first, last);
1190 return call_collate_char_do_hash(this, first, last);
1193 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1194 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1195 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
1196 basic_string_char* __thiscall collate_char_do_transform(const collate *this,
1197 basic_string_char *ret, const char *first, const char *last)
1199 FIXME("(%p %p %p) stub\n", this, first, last);
1200 return ret;
1203 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1204 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1205 DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
1206 basic_string_char* __thiscall collate_char_transform(const collate *this,
1207 basic_string_char *ret, const char *first, const char *last)
1209 FIXME("(%p %p %p) stub\n", this, first, last);
1210 return ret;
1213 /* ?id@?$collate@_W@std@@2V0locale@2@A */
1214 locale_id collate_wchar_id = {0};
1215 /* ?id@?$collate@G@std@@2V0locale@2@A */
1216 locale_id collate_short_id = {0};
1218 /* ??_7?$collate@_W@std@@6B@ */
1219 extern const vtable_ptr collate_wchar_vtable;
1220 /* ??_7?$collate@G@std@@6B@ */
1221 extern const vtable_ptr collate_short_vtable;
1223 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
1224 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
1225 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
1226 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
1227 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
1228 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
1230 TRACE("(%p %p)\n", this, locinfo);
1231 _Locinfo__Getcoll(locinfo, &this->coll);
1234 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
1235 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
1236 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
1237 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, size_t refs)
1239 _Locinfo locinfo;
1241 TRACE("(%p %s %Iu)\n", this, name, refs);
1243 locale_facet_ctor_refs(&this->facet, refs);
1244 this->facet.vtable = &collate_wchar_vtable;
1246 _Locinfo_ctor_cstr(&locinfo, name);
1247 collate_wchar__Init(this, &locinfo);
1248 _Locinfo_dtor(&locinfo);
1249 return this;
1252 /* ??0?$collate@G@std@@IAE@PBDI@Z */
1253 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
1254 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
1255 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, size_t refs)
1257 collate *ret = collate_wchar_ctor_name(this, name, refs);
1258 ret->facet.vtable = &collate_short_vtable;
1259 return ret;
1262 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
1263 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1264 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
1265 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1267 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1269 locale_facet_ctor_refs(&this->facet, refs);
1270 this->facet.vtable = &collate_wchar_vtable;
1271 collate_wchar__Init(this, locinfo);
1272 return this;
1275 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
1276 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1277 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
1278 collate* __thiscall collate_short_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1280 collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
1281 ret->facet.vtable = &collate_short_vtable;
1282 return ret;
1285 /* ??0?$collate@_W@std@@QAE@I@Z */
1286 /* ??0?$collate@_W@std@@QEAA@_K@Z */
1287 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
1288 collate* __thiscall collate_wchar_ctor_refs(collate *this, size_t refs)
1290 return collate_wchar_ctor_name(this, "C", refs);
1293 /* ??0?$collate@G@std@@QAE@I@Z */
1294 /* ??0?$collate@G@std@@QEAA@_K@Z */
1295 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
1296 collate* __thiscall collate_short_ctor_refs(collate *this, size_t refs)
1298 collate *ret = collate_wchar_ctor_refs(this, refs);
1299 ret->facet.vtable = &collate_short_vtable;
1300 return ret;
1303 /* ??1?$collate@G@std@@UAE@XZ */
1304 /* ??1?$collate@G@std@@UEAA@XZ */
1305 /* ??1?$collate@_W@std@@MAE@XZ */
1306 /* ??1?$collate@_W@std@@MEAA@XZ */
1307 /* ??1?$collate@G@std@@MAE@XZ */
1308 /* ??1?$collate@G@std@@MEAA@XZ */
1309 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
1310 void __thiscall collate_wchar_dtor(collate *this)
1312 TRACE("(%p)\n", this);
1315 DEFINE_THISCALL_WRAPPER(collate_wchar_vector_dtor, 8)
1316 collate* __thiscall collate_wchar_vector_dtor(collate *this, unsigned int flags)
1318 TRACE("(%p %x)\n", this, flags);
1319 if(flags & 2) {
1320 /* we have an array, with the number of elements stored before the first object */
1321 INT_PTR i, *ptr = (INT_PTR *)this-1;
1323 for(i=*ptr-1; i>=0; i--)
1324 collate_wchar_dtor(this+i);
1325 operator_delete(ptr);
1326 } else {
1327 collate_wchar_dtor(this);
1328 if(flags & 1)
1329 operator_delete(this);
1332 return this;
1335 /* ??_F?$collate@_W@std@@QAEXXZ */
1336 /* ??_F?$collate@_W@std@@QEAAXXZ */
1337 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
1338 collate* __thiscall collate_wchar_ctor(collate *this)
1340 return collate_wchar_ctor_name(this, "C", 0);
1343 /* ??_F?$collate@G@std@@QAEXXZ */
1344 /* ??_F?$collate@G@std@@QEAAXXZ */
1345 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
1346 collate* __thiscall collate_short_ctor(collate *this)
1348 collate *ret = collate_wchar_ctor(this);
1349 ret->facet.vtable = &collate_short_vtable;
1350 return ret;
1353 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1354 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1355 size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale *loc)
1357 TRACE("(%p %p)\n", facet, loc);
1359 if(facet && !*facet) {
1360 *facet = operator_new(sizeof(collate));
1361 collate_wchar_ctor_name((collate*)*facet,
1362 locale_string_char_c_str(&loc->ptr->name), 0);
1365 return LC_COLLATE;
1368 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@@Z */
1369 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1370 size_t __cdecl collate_wchar__Getcat_old(const locale_facet **facet)
1372 return collate_wchar__Getcat(facet, locale_classic());
1375 static collate* collate_wchar_use_facet(const locale *loc)
1377 static collate *obj = NULL;
1379 _Lockit lock;
1380 const locale_facet *fac;
1382 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1383 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_wchar_id));
1384 if(fac) {
1385 _Lockit_dtor(&lock);
1386 return (collate*)fac;
1389 if(obj) {
1390 _Lockit_dtor(&lock);
1391 return obj;
1394 collate_wchar__Getcat(&fac, loc);
1395 obj = (collate*)fac;
1396 call_locale_facet__Incref(&obj->facet);
1397 locale_facet_register(&obj->facet);
1398 _Lockit_dtor(&lock);
1400 return obj;
1403 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1404 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1405 size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
1407 if(facet && !*facet) {
1408 collate_wchar__Getcat(facet, loc);
1409 (*(locale_facet**)facet)->vtable = &collate_short_vtable;
1412 return LC_COLLATE;
1415 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@@Z */
1416 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1417 size_t __cdecl collate_short__Getcat_old(const locale_facet **facet)
1419 return collate_short__Getcat(facet, locale_classic());
1422 static collate* collate_short_use_facet(const locale *loc)
1424 static collate *obj = NULL;
1426 _Lockit lock;
1427 const locale_facet *fac;
1429 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1430 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_short_id));
1431 if(fac) {
1432 _Lockit_dtor(&lock);
1433 return (collate*)fac;
1436 if(obj) {
1437 _Lockit_dtor(&lock);
1438 return obj;
1441 collate_short__Getcat(&fac, loc);
1442 obj = (collate*)fac;
1443 call_locale_facet__Incref(&obj->facet);
1444 locale_facet_register(&obj->facet);
1445 _Lockit_dtor(&lock);
1447 return obj;
1450 /* _Wcscoll */
1451 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
1452 const wchar_t *last2, const _Collvec *coll)
1454 TRACE("(%s %s)\n", debugstr_wn(first1, last1-first1), debugstr_wn(first2, last2-first2));
1456 #if _MSVCP_VER < 110
1457 return CompareStringW(coll ? coll->handle : ___lc_handle_func()[LC_COLLATE],
1458 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1459 #else
1460 return CompareStringEx(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE],
1461 0, first1, last1-first1, first2, last2-first2, NULL, NULL, 0)-CSTR_EQUAL;
1462 #endif
1465 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
1466 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
1467 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
1468 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
1469 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
1470 #if _MSVCP_VER <= 100
1471 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1472 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1473 (this, first1, last1, first2, last2))
1474 #else
1475 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1476 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1477 (this, first1, last1, first2, last2))
1478 #endif
1479 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
1480 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1482 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1483 return _Wcscoll(first1, last1, first2, last2, &this->coll);
1486 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
1487 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
1488 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
1489 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
1490 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
1491 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
1492 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1494 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1495 return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
1498 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
1499 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
1500 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
1501 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
1502 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
1503 #if _MSVCP_VER <= 100
1504 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1505 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1506 #else
1507 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1508 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1509 #endif
1510 LONG __thiscall collate_wchar_do_hash(const collate *this,
1511 const wchar_t *first, const wchar_t *last)
1513 ULONG ret = 0;
1515 TRACE("(%p %p %p)\n", this, first, last);
1517 for(; first<last; first++)
1518 ret = (ret<<8 | ret>>24) + *first;
1519 return ret;
1522 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
1523 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
1524 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
1525 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
1526 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
1527 LONG __thiscall collate_wchar_hash(const collate *this,
1528 const wchar_t *first, const wchar_t *last)
1530 TRACE("(%p %p %p)\n", this, first, last);
1531 return call_collate_wchar_do_hash(this, first, last);
1534 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1535 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1536 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1537 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1538 DEFINE_THISCALL_WRAPPER(collate_wchar_do_transform, 16)
1539 basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
1540 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1542 FIXME("(%p %p %p) stub\n", this, first, last);
1543 return ret;
1546 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1547 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1548 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1549 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1550 DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
1551 basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
1552 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1554 FIXME("(%p %p %p) stub\n", this, first, last);
1555 return ret;
1558 /* ??_7ctype_base@std@@6B@ */
1559 extern const vtable_ptr ctype_base_vtable;
1561 /* ??0ctype_base@std@@QAE@I@Z */
1562 /* ??0ctype_base@std@@QEAA@_K@Z */
1563 DEFINE_THISCALL_WRAPPER(ctype_base_ctor_refs, 8)
1564 ctype_base* __thiscall ctype_base_ctor_refs(ctype_base *this, size_t refs)
1566 TRACE("(%p %Iu)\n", this, refs);
1567 locale_facet_ctor_refs(&this->facet, refs);
1568 this->facet.vtable = &ctype_base_vtable;
1569 return this;
1572 /* ??_Fctype_base@std@@QAEXXZ */
1573 /* ??_Fctype_base@std@@QEAAXXZ */
1574 DEFINE_THISCALL_WRAPPER(ctype_base_ctor, 4)
1575 ctype_base* __thiscall ctype_base_ctor(ctype_base *this)
1577 TRACE("(%p)\n", this);
1578 locale_facet_ctor_refs(&this->facet, 0);
1579 this->facet.vtable = &ctype_base_vtable;
1580 return this;
1583 /* ??1ctype_base@std@@UAE@XZ */
1584 /* ??1ctype_base@std@@UEAA@XZ */
1585 DEFINE_THISCALL_WRAPPER(ctype_base_dtor, 4)
1586 void __thiscall ctype_base_dtor(ctype_base *this)
1588 TRACE("(%p)\n", this);
1591 DEFINE_THISCALL_WRAPPER(ctype_base_vector_dtor, 8)
1592 ctype_base* __thiscall ctype_base_vector_dtor(ctype_base *this, unsigned int flags)
1594 TRACE("(%p %x)\n", this, flags);
1595 if(flags & 2) {
1596 /* we have an array, with the number of elements stored before the first object */
1597 INT_PTR i, *ptr = (INT_PTR *)this-1;
1599 for(i=*ptr-1; i>=0; i--)
1600 ctype_base_dtor(this+i);
1601 operator_delete(ptr);
1602 } else {
1603 ctype_base_dtor(this);
1604 if(flags & 1)
1605 operator_delete(this);
1608 return this;
1611 /* ?_Xran@ctype_base@std@@KAXXZ */
1612 void __cdecl ctype_base__Xran(void)
1614 _Xout_of_range("out of range in ctype<T>");
1617 /* ?id@?$ctype@D@std@@2V0locale@2@A */
1618 locale_id ctype_char_id = {0};
1619 /* ?table_size@?$ctype@D@std@@2IB */
1620 /* ?table_size@?$ctype@D@std@@2_KB */
1621 size_t ctype_char_table_size = 256;
1623 /* ??_7?$ctype@D@std@@6B@ */
1624 extern const vtable_ptr ctype_char_vtable;
1626 /* ?_Id_func@?$ctype@D@std@@SAAAVid@locale@2@XZ */
1627 /* ?_Id_func@?$ctype@D@std@@SAAEAVid@locale@2@XZ */
1628 locale_id* __cdecl ctype_char__Id_func(void)
1630 TRACE("()\n");
1631 return &ctype_char_id;
1634 /* ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z */
1635 /* ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z */
1636 DEFINE_THISCALL_WRAPPER(ctype_char__Init, 8)
1637 void __thiscall ctype_char__Init(ctype_char *this, const _Locinfo *locinfo)
1639 TRACE("(%p %p)\n", this, locinfo);
1640 _Locinfo__Getctype(locinfo, &this->ctype);
1643 /* ?_Tidy@?$ctype@D@std@@IAEXXZ */
1644 /* ?_Tidy@?$ctype@D@std@@IEAAXXZ */
1645 DEFINE_THISCALL_WRAPPER(ctype_char__Tidy, 4)
1646 void __thiscall ctype_char__Tidy(ctype_char *this)
1648 TRACE("(%p)\n", this);
1650 if(this->ctype.delfl)
1651 free((short*)this->ctype.table);
1652 #if _MSVCP_VER >= 110
1653 free(this->ctype.name);
1654 #endif
1657 /* ?classic_table@?$ctype@D@std@@KAPBFXZ */
1658 /* ?classic_table@?$ctype@D@std@@KAPEBFXZ */
1659 const short* __cdecl ctype_char_classic_table(void)
1661 ctype_char *ctype;
1663 TRACE("()\n");
1664 ctype = ctype_char_use_facet( locale_classic() );
1665 return ctype->ctype.table;
1668 /* ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z */
1669 /* ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1670 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_locinfo, 12)
1671 ctype_char* __thiscall ctype_char_ctor_locinfo(ctype_char *this,
1672 const _Locinfo *locinfo, size_t refs)
1674 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1675 ctype_base_ctor_refs(&this->base, refs);
1676 this->base.facet.vtable = &ctype_char_vtable;
1677 ctype_char__Init(this, locinfo);
1678 return this;
1681 /* ??0?$ctype@D@std@@QAE@PBF_NI@Z */
1682 /* ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z */
1683 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_table, 16)
1684 ctype_char* __thiscall ctype_char_ctor_table(ctype_char *this,
1685 const short *table, bool delete, size_t refs)
1687 _Locinfo locinfo;
1689 TRACE("(%p %p %d %Iu)\n", this, table, delete, refs);
1691 ctype_base_ctor_refs(&this->base, refs);
1692 this->base.facet.vtable = &ctype_char_vtable;
1694 _Locinfo_ctor(&locinfo);
1695 ctype_char__Init(this, &locinfo);
1696 _Locinfo_dtor(&locinfo);
1698 if(table) {
1699 ctype_char__Tidy(this);
1700 this->ctype.table = table;
1701 this->ctype.delfl = delete;
1703 return this;
1706 /* ??_F?$ctype@D@std@@QAEXXZ */
1707 /* ??_F?$ctype@D@std@@QEAAXXZ */
1708 DEFINE_THISCALL_WRAPPER(ctype_char_ctor, 4)
1709 ctype_char* __thiscall ctype_char_ctor(ctype_char *this)
1711 return ctype_char_ctor_table(this, NULL, FALSE, 0);
1714 /* ??1?$ctype@D@std@@UAE@XZ */
1715 /* ??1?$ctype@D@std@@UEAA@XZ */
1716 /* ??1?$ctype@D@std@@MAE@XZ */
1717 /* ??1?$ctype@D@std@@MEAA@XZ */
1718 DEFINE_THISCALL_WRAPPER(ctype_char_dtor, 4)
1719 void __thiscall ctype_char_dtor(ctype_char *this)
1721 TRACE("(%p)\n", this);
1722 ctype_char__Tidy(this);
1725 DEFINE_THISCALL_WRAPPER(ctype_char_vector_dtor, 8)
1726 ctype_char* __thiscall ctype_char_vector_dtor(ctype_char *this, unsigned int flags)
1728 TRACE("(%p %x)\n", this, flags);
1729 if(flags & 2) {
1730 /* we have an array, with the number of elements stored before the first object */
1731 INT_PTR i, *ptr = (INT_PTR *)this-1;
1733 for(i=*ptr-1; i>=0; i--)
1734 ctype_char_dtor(this+i);
1735 operator_delete(ptr);
1736 } else {
1737 ctype_char_dtor(this);
1738 if(flags & 1)
1739 operator_delete(this);
1742 return this;
1745 /* ?do_narrow@?$ctype@D@std@@MBEDDD@Z */
1746 /* ?do_narrow@?$ctype@D@std@@MEBADDD@Z */
1747 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow_ch, 12)
1748 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1749 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 36, \
1750 char, (const ctype_char*, char, char), (this, ch, unused))
1751 #elif _MSVCP_VER <= 100
1752 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 32, \
1753 char, (const ctype_char*, char, char), (this, ch, unused))
1754 #else
1755 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 40, \
1756 char, (const ctype_char*, char, char), (this, ch, unused))
1757 #endif
1758 char __thiscall ctype_char_do_narrow_ch(const ctype_char *this, char ch, char unused)
1760 TRACE("(%p %c %c)\n", this, ch, unused);
1761 return ch;
1764 /* ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z */
1765 /* ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z */
1766 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow, 20)
1767 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1768 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 32, \
1769 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1770 (this, first, last, unused, dest))
1771 #elif _MSVCP_VER <= 100
1772 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 28, \
1773 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1774 (this, first, last, unused, dest))
1775 #else
1776 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 36, \
1777 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1778 (this, first, last, unused, dest))
1779 #endif
1780 const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
1781 const char *first, const char *last, char unused, char *dest)
1783 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1784 memcpy(dest, first, last-first);
1785 return last;
1788 /* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
1789 /* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
1790 DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
1791 #define call_ctype_char__Do_narrow_s(this, first, last, unused, dest, size) CALL_VTBL_FUNC(this, 40, \
1792 const char*, (const ctype_char*, const char*, const char*, char, char*, size_t), \
1793 (this, first, last, unused, dest, size))
1794 const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
1795 const char *last, char unused, char *dest, size_t size)
1797 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1798 memcpy_s(dest, size, first, last-first);
1799 return last;
1802 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
1803 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
1804 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
1805 char __thiscall ctype_char_narrow_ch(const ctype_char *this, char ch, char dflt)
1807 TRACE("(%p %c %c)\n", this, ch, dflt);
1808 return call_ctype_char_do_narrow_ch(this, ch, dflt);
1811 /* ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z */
1812 /* ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z */
1813 DEFINE_THISCALL_WRAPPER(ctype_char_narrow, 20)
1814 const char* __thiscall ctype_char_narrow(const ctype_char *this,
1815 const char *first, const char *last, char dflt, char *dest)
1817 TRACE("(%p %p %p %c %p)\n", this, first, last, dflt, dest);
1818 return call_ctype_char_do_narrow(this, first, last, dflt, dest);
1821 /* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
1822 /* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
1823 DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
1824 const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
1825 const char *last, char dflt, char *dest, size_t size)
1827 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1828 return call_ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
1831 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
1832 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
1833 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
1834 #if _MSVCP_VER <= 100
1835 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
1836 char, (const ctype_char*, char), (this, ch))
1837 #else
1838 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
1839 char, (const ctype_char*, char), (this, ch))
1840 #endif
1841 char __thiscall ctype_char_do_widen_ch(const ctype_char *this, char ch)
1843 TRACE("(%p %c)\n", this, ch);
1844 return ch;
1847 /* ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z */
1848 /* ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z */
1849 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen, 16)
1850 #if _MSVCP_VER <= 100
1851 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 20, \
1852 const char*, (const ctype_char*, const char*, const char*, char*), \
1853 (this, first, last, dest))
1854 #else
1855 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 28, \
1856 const char*, (const ctype_char*, const char*, const char*, char*), \
1857 (this, first, last, dest))
1858 #endif
1859 const char* __thiscall ctype_char_do_widen(const ctype_char *this,
1860 const char *first, const char *last, char *dest)
1862 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1863 memcpy(dest, first, last-first);
1864 return last;
1867 /* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
1868 /* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
1869 DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
1870 #define call_ctype_char__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 28, \
1871 const char*, (const ctype_char*, const char*, const char*, char*, size_t), \
1872 (this, first, last, dest, size))
1873 const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
1874 const char *first, const char *last, char *dest, size_t size)
1876 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1877 memcpy_s(dest, size, first, last-first);
1878 return last;
1881 /* ?widen@?$ctype@D@std@@QBEDD@Z */
1882 /* ?widen@?$ctype@D@std@@QEBADD@Z */
1883 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
1884 char __thiscall ctype_char_widen_ch(const ctype_char *this, char ch)
1886 TRACE("(%p %c)\n", this, ch);
1887 return call_ctype_char_do_widen_ch(this, ch);
1890 /* ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z */
1891 /* ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z */
1892 DEFINE_THISCALL_WRAPPER(ctype_char_widen, 16)
1893 const char* __thiscall ctype_char_widen(const ctype_char *this,
1894 const char *first, const char *last, char *dest)
1896 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1897 return call_ctype_char_do_widen(this, first, last, dest);
1900 /* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
1901 /* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
1902 DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
1903 const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
1904 const char *first, const char *last, char *dest, size_t size)
1906 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1907 return call_ctype_char__Do_widen_s(this, first, last, dest, size);
1910 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1911 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1912 size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
1914 TRACE("(%p %p)\n", facet, loc);
1916 if(facet && !*facet) {
1917 _Locinfo locinfo;
1919 *facet = operator_new(sizeof(ctype_char));
1920 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
1921 ctype_char_ctor_locinfo((ctype_char*)*facet, &locinfo, 0);
1922 _Locinfo_dtor(&locinfo);
1925 return LC_CTYPE;
1928 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@@Z */
1929 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1930 size_t __cdecl ctype_char__Getcat_old(const locale_facet **facet)
1932 return ctype_char__Getcat(facet, locale_classic());
1935 ctype_char* ctype_char_use_facet(const locale *loc)
1937 static ctype_char *obj = NULL;
1939 _Lockit lock;
1940 const locale_facet *fac;
1942 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1943 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_char_id));
1944 if(fac) {
1945 _Lockit_dtor(&lock);
1946 return (ctype_char*)fac;
1949 if(obj) {
1950 _Lockit_dtor(&lock);
1951 return obj;
1954 ctype_char__Getcat(&fac, loc);
1955 obj = (ctype_char*)fac;
1956 call_locale_facet__Incref(&obj->base.facet);
1957 locale_facet_register(&obj->base.facet);
1958 _Lockit_dtor(&lock);
1960 return obj;
1963 /* _Tolower */
1964 int __cdecl _Tolower(int ch, const _Ctypevec *ctype)
1966 unsigned int cp;
1968 TRACE("%d %p\n", ch, ctype);
1970 if(ctype)
1971 cp = ctype->page;
1972 else
1973 cp = ___lc_codepage_func();
1975 /* Don't convert to unicode in case of C locale */
1976 if(!cp) {
1977 if(ch>='A' && ch<='Z')
1978 ch = ch-'A'+'a';
1979 return ch;
1980 } else {
1981 WCHAR wide, lower;
1982 char str[2];
1983 int size;
1985 if(ch > 255) {
1986 str[0] = (ch>>8) & 255;
1987 str[1] = ch & 255;
1988 size = 2;
1989 } else {
1990 str[0] = ch & 255;
1991 size = 1;
1994 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1995 return ch;
1997 lower = towlower(wide);
1998 if(lower == wide)
1999 return ch;
2001 WideCharToMultiByte(cp, 0, &lower, 1, str, 2, NULL, NULL);
2003 return str[0] + (str[1]<<8);
2007 /* ?do_tolower@?$ctype@D@std@@MBEDD@Z */
2008 /* ?do_tolower@?$ctype@D@std@@MEBADD@Z */
2009 #if _MSVCP_VER <= 100
2010 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 8, \
2011 char, (const ctype_char*, char), (this, ch))
2012 #else
2013 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2014 char, (const ctype_char*, char), (this, ch))
2015 #endif
2016 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower_ch, 8)
2017 char __thiscall ctype_char_do_tolower_ch(const ctype_char *this, char ch)
2019 TRACE("(%p %c)\n", this, ch);
2020 return _Tolower(ch, &this->ctype);
2023 /* ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z */
2024 /* ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2025 #if _MSVCP_VER <= 100
2026 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 4, \
2027 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2028 #else
2029 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 12, \
2030 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2031 #endif
2032 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower, 12)
2033 const char* __thiscall ctype_char_do_tolower(const ctype_char *this, char *first, const char *last)
2035 TRACE("(%p %p %p)\n", this, first, last);
2036 for(; first<last; first++)
2037 *first = _Tolower(*first, &this->ctype);
2038 return last;
2041 /* ?tolower@?$ctype@D@std@@QBEDD@Z */
2042 /* ?tolower@?$ctype@D@std@@QEBADD@Z */
2043 DEFINE_THISCALL_WRAPPER(ctype_char_tolower_ch, 8)
2044 char __thiscall ctype_char_tolower_ch(const ctype_char *this, char ch)
2046 TRACE("(%p %c)\n", this, ch);
2047 return call_ctype_char_do_tolower_ch(this, ch);
2050 /* ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z */
2051 /* ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2052 DEFINE_THISCALL_WRAPPER(ctype_char_tolower, 12)
2053 const char* __thiscall ctype_char_tolower(const ctype_char *this, char *first, const char *last)
2055 TRACE("(%p %p %p)\n", this, first, last);
2056 return call_ctype_char_do_tolower(this, first, last);
2059 /* _Toupper */
2060 int __cdecl _Toupper(int ch, const _Ctypevec *ctype)
2062 unsigned int cp;
2064 TRACE("%d %p\n", ch, ctype);
2066 if(ctype)
2067 cp = ctype->page;
2068 else
2069 cp = ___lc_codepage_func();
2071 /* Don't convert to unicode in case of C locale */
2072 if(!cp) {
2073 if(ch>='a' && ch<='z')
2074 ch = ch-'a'+'A';
2075 return ch;
2076 } else {
2077 WCHAR wide, upper;
2078 char str[2];
2079 int size;
2081 if(ch > 255) {
2082 str[0] = (ch>>8) & 255;
2083 str[1] = ch & 255;
2084 size = 2;
2085 } else {
2086 str[0] = ch & 255;
2087 size = 1;
2090 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
2091 return ch;
2093 upper = towupper(wide);
2094 if(upper == wide)
2095 return ch;
2097 WideCharToMultiByte(cp, 0, &upper, 1, str, 2, NULL, NULL);
2099 return str[0] + (str[1]<<8);
2103 /* ?do_toupper@?$ctype@D@std@@MBEDD@Z */
2104 /* ?do_toupper@?$ctype@D@std@@MEBADD@Z */
2105 #if _MSVCP_VER <= 100
2106 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2107 char, (const ctype_char*, char), (this, ch))
2108 #else
2109 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2110 char, (const ctype_char*, char), (this, ch))
2111 #endif
2112 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper_ch, 8)
2113 char __thiscall ctype_char_do_toupper_ch(const ctype_char *this, char ch)
2115 TRACE("(%p %c)\n", this, ch);
2116 return _Toupper(ch, &this->ctype);
2119 /* ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z */
2120 /* ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2121 #if _MSVCP_VER <= 100
2122 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 12, \
2123 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2124 #else
2125 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 20, \
2126 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2127 #endif
2128 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper, 12)
2129 const char* __thiscall ctype_char_do_toupper(const ctype_char *this,
2130 char *first, const char *last)
2132 TRACE("(%p %p %p)\n", this, first, last);
2133 for(; first<last; first++)
2134 *first = _Toupper(*first, &this->ctype);
2135 return last;
2138 /* ?toupper@?$ctype@D@std@@QBEDD@Z */
2139 /* ?toupper@?$ctype@D@std@@QEBADD@Z */
2140 DEFINE_THISCALL_WRAPPER(ctype_char_toupper_ch, 8)
2141 char __thiscall ctype_char_toupper_ch(const ctype_char *this, char ch)
2143 TRACE("(%p %c)\n", this, ch);
2144 return call_ctype_char_do_toupper_ch(this, ch);
2147 /* ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z */
2148 /* ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2149 DEFINE_THISCALL_WRAPPER(ctype_char_toupper, 12)
2150 const char* __thiscall ctype_char_toupper(const ctype_char *this, char *first, const char *last)
2152 TRACE("(%p %p %p)\n", this, first, last);
2153 return call_ctype_char_do_toupper(this, first, last);
2156 /* ?is@?$ctype@D@std@@QBE_NFD@Z */
2157 /* ?is@?$ctype@D@std@@QEBA_NFD@Z */
2158 DEFINE_THISCALL_WRAPPER(ctype_char_is_ch, 12)
2159 bool __thiscall ctype_char_is_ch(const ctype_char *this, short mask, char ch)
2161 TRACE("(%p %x %c)\n", this, mask, ch);
2162 return (this->ctype.table[(unsigned char)ch] & mask) != 0;
2165 /* ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z */
2166 /* ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z */
2167 DEFINE_THISCALL_WRAPPER(ctype_char_is, 16)
2168 const char* __thiscall ctype_char_is(const ctype_char *this, const char *first, const char *last, short *dest)
2170 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2171 for(; first<last; first++)
2172 *dest++ = this->ctype.table[(unsigned char)*first];
2173 return last;
2176 /* ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z */
2177 /* ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2178 DEFINE_THISCALL_WRAPPER(ctype_char_scan_is, 16)
2179 const char* __thiscall ctype_char_scan_is(const ctype_char *this, short mask, const char *first, const char *last)
2181 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2182 for(; first<last; first++)
2183 if(!ctype_char_is_ch(this, mask, *first))
2184 break;
2185 return first;
2188 /* ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z */
2189 /* ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2190 DEFINE_THISCALL_WRAPPER(ctype_char_scan_not, 16)
2191 const char* __thiscall ctype_char_scan_not(const ctype_char *this, short mask, const char *first, const char *last)
2193 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2194 for(; first<last; first++)
2195 if(ctype_char_is_ch(this, mask, *first))
2196 break;
2197 return first;
2200 /* ?table@?$ctype@D@std@@IBEPBFXZ */
2201 /* ?table@?$ctype@D@std@@IEBAPEBFXZ */
2202 DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
2203 const short* __thiscall ctype_char_table(const ctype_char *this)
2205 TRACE("(%p)\n", this);
2206 return this->ctype.table;
2209 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
2210 locale_id ctype_wchar_id = {0};
2211 /* ?id@?$ctype@G@std@@2V0locale@2@A */
2212 locale_id ctype_short_id = {0};
2214 /* ??_7?$ctype@_W@std@@6B@ */
2215 extern const vtable_ptr ctype_wchar_vtable;
2216 /* ??_7?$ctype@G@std@@6B@ */
2217 extern const vtable_ptr ctype_short_vtable;
2219 /* ?_Id_func@?$ctype@_W@std@@SAAAVid@locale@2@XZ */
2220 /* ?_Id_func@?$ctype@_W@std@@SAAEAVid@locale@2@XZ */
2221 locale_id* __cdecl ctype_wchar__Id_func(void)
2223 TRACE("()\n");
2224 return &ctype_wchar_id;
2227 /* ?_Id_func@?$ctype@G@std@@SAAAVid@locale@2@XZ */
2228 /* ?_Id_func@?$ctype@G@std@@SAAEAVid@locale@2@XZ */
2229 locale_id* __cdecl ctype_short__Id_func(void)
2231 TRACE("()\n");
2232 return &ctype_short_id;
2235 /* ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z */
2236 /* ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
2237 /* ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z */
2238 /* ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z */
2239 DEFINE_THISCALL_WRAPPER(ctype_wchar__Init, 8)
2240 void __thiscall ctype_wchar__Init(ctype_wchar *this, const _Locinfo *locinfo)
2242 TRACE("(%p %p)\n", this, locinfo);
2243 _Locinfo__Getctype(locinfo, &this->ctype);
2244 _Locinfo__Getcvt(locinfo, &this->cvt);
2247 /* ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z */
2248 /* ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2249 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_locinfo, 12)
2250 ctype_wchar* __thiscall ctype_wchar_ctor_locinfo(ctype_wchar *this,
2251 const _Locinfo *locinfo, size_t refs)
2253 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
2254 ctype_base_ctor_refs(&this->base, refs);
2255 this->base.facet.vtable = &ctype_wchar_vtable;
2256 ctype_wchar__Init(this, locinfo);
2257 return this;
2260 /* ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z */
2261 /* ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2262 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_locinfo, 12)
2263 ctype_wchar* __thiscall ctype_short_ctor_locinfo(ctype_wchar *this,
2264 const _Locinfo *locinfo, size_t refs)
2266 ctype_wchar *ret = ctype_wchar_ctor_locinfo(this, locinfo, refs);
2267 this->base.facet.vtable = &ctype_short_vtable;
2268 return ret;
2271 /* ??0?$ctype@_W@std@@QAE@I@Z */
2272 /* ??0?$ctype@_W@std@@QEAA@_K@Z */
2273 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_refs, 8)
2274 ctype_wchar* __thiscall ctype_wchar_ctor_refs(ctype_wchar *this, size_t refs)
2276 _Locinfo locinfo;
2278 TRACE("(%p %Iu)\n", this, refs);
2280 ctype_base_ctor_refs(&this->base, refs);
2281 this->base.facet.vtable = &ctype_wchar_vtable;
2283 _Locinfo_ctor(&locinfo);
2284 ctype_wchar__Init(this, &locinfo);
2285 _Locinfo_dtor(&locinfo);
2286 return this;
2289 /* ??0?$ctype@G@std@@QAE@I@Z */
2290 /* ??0?$ctype@G@std@@QEAA@_K@Z */
2291 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_refs, 8)
2292 ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, size_t refs)
2294 ctype_wchar *ret = ctype_wchar_ctor_refs(this, refs);
2295 this->base.facet.vtable = &ctype_short_vtable;
2296 return ret;
2299 /* ??0?$ctype@G@std@@IAE@PBDI@Z */
2300 /* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
2301 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
2302 ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
2303 const char *name, size_t refs)
2305 _Locinfo locinfo;
2307 TRACE("(%p %s %Iu)\n", this, debugstr_a(name), refs);
2309 ctype_base_ctor_refs(&this->base, refs);
2310 this->base.facet.vtable = &ctype_short_vtable;
2312 _Locinfo_ctor_cstr(&locinfo, name);
2313 ctype_wchar__Init(this, &locinfo);
2314 _Locinfo_dtor(&locinfo);
2315 return this;
2318 /* ??_F?$ctype@_W@std@@QAEXXZ */
2319 /* ??_F?$ctype@_W@std@@QEAAXXZ */
2320 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
2321 ctype_wchar* __thiscall ctype_wchar_ctor(ctype_wchar *this)
2323 TRACE("(%p)\n", this);
2324 return ctype_short_ctor_refs(this, 0);
2327 /* ??_F?$ctype@G@std@@QAEXXZ */
2328 /* ??_F?$ctype@G@std@@QEAAXXZ */
2329 DEFINE_THISCALL_WRAPPER(ctype_short_ctor, 4)
2330 ctype_wchar* __thiscall ctype_short_ctor(ctype_wchar *this)
2332 ctype_wchar *ret = ctype_wchar_ctor(this);
2333 this->base.facet.vtable = &ctype_short_vtable;
2334 return ret;
2337 /* ??1?$ctype@G@std@@UAE@XZ */
2338 /* ??1?$ctype@G@std@@UEAA@XZ */
2339 /* ??1?$ctype@_W@std@@MAE@XZ */
2340 /* ??1?$ctype@_W@std@@MEAA@XZ */
2341 /* ??1?$ctype@G@std@@MAE@XZ */
2342 /* ??1?$ctype@G@std@@MEAA@XZ */
2343 DEFINE_THISCALL_WRAPPER(ctype_wchar_dtor, 4)
2344 void __thiscall ctype_wchar_dtor(ctype_wchar *this)
2346 TRACE("(%p)\n", this);
2347 if(this->ctype.delfl)
2348 free((void*)this->ctype.table);
2349 #if _MSVCP_VER >= 110
2350 free(this->ctype.name);
2351 #endif
2354 DEFINE_THISCALL_WRAPPER(ctype_wchar_vector_dtor, 8)
2355 ctype_wchar* __thiscall ctype_wchar_vector_dtor(ctype_wchar *this, unsigned int flags)
2357 TRACE("(%p %x)\n", this, flags);
2358 if(flags & 2) {
2359 /* we have an array, with the number of elements stored before the first object */
2360 INT_PTR i, *ptr = (INT_PTR *)this-1;
2362 for(i=*ptr-1; i>=0; i--)
2363 ctype_wchar_dtor(this+i);
2364 operator_delete(ptr);
2365 } else {
2366 ctype_wchar_dtor(this);
2367 if(flags & 1)
2368 operator_delete(this);
2371 return this;
2374 /* _Wcrtomb */
2375 int __cdecl _Wcrtomb(char *s, wchar_t wch, _Mbstatet *state, const _Cvtvec *cvt)
2377 int cp, size;
2378 BOOL def;
2380 TRACE("%p %d %p %p\n", s, wch, state, cvt);
2382 if(cvt)
2383 cp = cvt->page;
2384 else
2385 cp = ___lc_codepage_func();
2387 if(!cp) {
2388 if(wch > 255) {
2389 *_errno() = EILSEQ;
2390 return -1;
2393 *s = wch & 255;
2394 return 1;
2397 size = WideCharToMultiByte(cp, 0, &wch, 1, s, MB_LEN_MAX, NULL, &def);
2398 if(!size || def) {
2399 *_errno() = EILSEQ;
2400 return -1;
2403 return size;
2406 /* ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z */
2407 /* ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z */
2408 /* ?_Donarrow@?$ctype@G@std@@IBEDGD@Z */
2409 /* ?_Donarrow@?$ctype@G@std@@IEBADGD@Z */
2410 DEFINE_THISCALL_WRAPPER(ctype_wchar__Donarrow, 12)
2411 char __thiscall ctype_wchar__Donarrow(const ctype_wchar *this, wchar_t ch, char dflt)
2413 char buf[MB_LEN_MAX];
2415 TRACE("(%p %d %d)\n", this, ch, dflt);
2417 return _Wcrtomb(buf, ch, NULL, &this->cvt)==1 ? buf[0] : dflt;
2420 /* ?do_narrow@?$ctype@_W@std@@MBED_WD@Z */
2421 /* ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z */
2422 /* ?do_narrow@?$ctype@G@std@@MBEDGD@Z */
2423 /* ?do_narrow@?$ctype@G@std@@MEBADGD@Z */
2424 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow_ch, 12)
2425 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2426 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 52, \
2427 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2428 #elif _MSVCP_VER <= 100
2429 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 48, \
2430 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2431 #else
2432 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 56, \
2433 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2434 #endif
2435 char __thiscall ctype_wchar_do_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2437 return ctype_wchar__Donarrow(this, ch, dflt);
2440 /* ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z */
2441 /* ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z */
2442 /* ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z */
2443 /* ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z */
2444 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow, 20)
2445 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2446 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 48, \
2447 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2448 (this, first, last, dflt, dest))
2449 #elif _MSVCP_VER <= 100
2450 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 44, \
2451 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2452 (this, first, last, dflt, dest))
2453 #else
2454 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 52, \
2455 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2456 (this, first, last, dflt, dest))
2457 #endif
2458 const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
2459 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2461 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2462 for(; first<last; first++)
2463 *dest++ = ctype_wchar__Donarrow(this, *first, dflt);
2464 return last;
2467 /* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
2468 /* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
2469 /* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
2470 /* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
2471 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
2472 #define call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size) CALL_VTBL_FUNC(this, 56, \
2473 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*, size_t), \
2474 (this, first, last, dflt, dest, size))
2475 const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
2476 const wchar_t *first, const wchar_t *last, char dflt, char *dest, size_t size)
2478 TRACE("(%p %p %p %d %p %Iu)\n", this, first, last, dflt, dest, size);
2479 /* This function converts all multi-byte characters to dflt,
2480 * thanks to it result size is known before converting */
2481 if(last-first > size)
2482 ctype_base__Xran();
2483 return ctype_wchar_do_narrow(this, first, last, dflt, dest);
2486 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
2487 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
2488 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
2489 /* ?narrow@?$ctype@G@std@@QEBADGD@Z */
2490 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow_ch, 12)
2491 char __thiscall ctype_wchar_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2493 TRACE("(%p %d %d)\n", this, ch, dflt);
2494 return call_ctype_wchar_do_narrow_ch(this, ch, dflt);
2497 /* ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z */
2498 /* ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z */
2499 /* ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z */
2500 /* ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z */
2501 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow, 20)
2502 const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
2503 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2505 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2506 return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
2509 /* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
2510 /* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
2511 /* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
2512 /* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
2513 DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
2514 const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
2515 const wchar_t *last, char dflt, char *dest, size_t size)
2517 TRACE("(%p %p %p %d %p %Iu)\n", this, first, last, dflt, dest, size);
2518 return call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
2521 /* _Mbrtowc */
2522 int __cdecl _Mbrtowc(wchar_t *out, const char *in, size_t len, _Mbstatet *state, const _Cvtvec *cvt)
2524 int i, cp;
2525 CPINFO cp_info;
2526 BOOL is_lead;
2528 TRACE("(%p %p %Iu %p %p)\n", out, in, len, state, cvt);
2530 if(!len)
2531 return 0;
2533 if(cvt)
2534 cp = cvt->page;
2535 else
2536 cp = ___lc_codepage_func();
2538 if(!cp) {
2539 if(out)
2540 *out = (unsigned char)*in;
2542 memset(state, 0, sizeof(*state));
2543 return *in ? 1 : 0;
2546 if(MBSTATET_TO_INT(state)) {
2547 ((char*)&MBSTATET_TO_INT(state))[1] = *in;
2549 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, (char*)&MBSTATET_TO_INT(state), 2, out, out ? 1 : 0)) {
2550 memset(state, 0, sizeof(*state));
2551 *_errno() = EILSEQ;
2552 return -1;
2555 memset(state, 0, sizeof(*state));
2556 return 2;
2559 GetCPInfo(cp, &cp_info);
2560 is_lead = FALSE;
2561 for(i=0; i<MAX_LEADBYTES; i+=2) {
2562 if(!cp_info.LeadByte[i+1])
2563 break;
2564 if((unsigned char)*in>=cp_info.LeadByte[i] && (unsigned char)*in<=cp_info.LeadByte[i+1]) {
2565 is_lead = TRUE;
2566 break;
2570 if(is_lead) {
2571 if(len == 1) {
2572 MBSTATET_TO_INT(state) = (unsigned char)*in;
2573 return -2;
2576 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 2, out, out ? 1 : 0)) {
2577 *_errno() = EILSEQ;
2578 return -1;
2580 return 2;
2583 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 1, out, out ? 1 : 0)) {
2584 *_errno() = EILSEQ;
2585 return -1;
2587 return 1;
2590 static inline wchar_t mb_to_wc(char ch, const _Cvtvec *cvt)
2592 _Mbstatet state;
2593 wchar_t ret;
2595 memset(&state, 0, sizeof(state));
2596 return _Mbrtowc(&ret, &ch, 1, &state, cvt) == 1 ? ret : 0;
2599 /* ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z */
2600 /* ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z */
2601 /* ?_Dowiden@?$ctype@G@std@@IBEGD@Z */
2602 /* ?_Dowiden@?$ctype@G@std@@IEBAGD@Z */
2603 DEFINE_THISCALL_WRAPPER(ctype_wchar__Dowiden, 8)
2604 wchar_t __thiscall ctype_wchar__Dowiden(const ctype_wchar *this, char ch)
2606 _Mbstatet state;
2607 wchar_t ret;
2609 TRACE("(%p %d)\n", this, ch);
2611 memset(&state, 0, sizeof(state));
2612 return _Mbrtowc(&ret, &ch, 1, &state, &this->cvt)<0 ? WEOF : ret;
2615 /* ?do_widen@?$ctype@_W@std@@MBE_WD@Z */
2616 /* ?do_widen@?$ctype@_W@std@@MEBA_WD@Z */
2617 /* ?do_widen@?$ctype@G@std@@MBEGD@Z */
2618 /* ?do_widen@?$ctype@G@std@@MEBAGD@Z */
2619 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen_ch, 8)
2620 #if _MSVCP_VER <= 100
2621 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2622 wchar_t, (const ctype_wchar*, char), (this, ch))
2623 #else
2624 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 48, \
2625 wchar_t, (const ctype_wchar*, char), (this, ch))
2626 #endif
2627 wchar_t __thiscall ctype_wchar_do_widen_ch(const ctype_wchar *this, char ch)
2629 return ctype_wchar__Dowiden(this, ch);
2632 /* ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z */
2633 /* ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z */
2634 /* ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z */
2635 /* ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z */
2636 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen, 16)
2637 #if _MSVCP_VER <= 100
2638 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 36, \
2639 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2640 (this, first, last, dest))
2641 #else
2642 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 44, \
2643 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2644 (this, first, last, dest))
2645 #endif
2646 const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
2647 const char *first, const char *last, wchar_t *dest)
2649 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2650 for(; first<last; first++)
2651 *dest++ = ctype_wchar__Dowiden(this, *first);
2652 return last;
2655 /* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
2656 /* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
2657 /* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
2658 /* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
2659 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
2660 #define call_ctype_wchar__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 44, \
2661 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*, size_t), \
2662 (this, first, last, dest, size))
2663 const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
2664 const char *first, const char *last, wchar_t *dest, size_t size)
2666 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
2667 /* This function converts all multi-byte characters to WEOF,
2668 * thanks to it result size is known before converting */
2669 if(size < last-first)
2670 ctype_base__Xran();
2671 return ctype_wchar_do_widen(this, first, last, dest);
2674 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
2675 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
2676 /* ?widen@?$ctype@G@std@@QBEGD@Z */
2677 /* ?widen@?$ctype@G@std@@QEBAGD@Z */
2678 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen_ch, 8)
2679 wchar_t __thiscall ctype_wchar_widen_ch(const ctype_wchar *this, char ch)
2681 TRACE("(%p %d)\n", this, ch);
2682 return call_ctype_wchar_do_widen_ch(this, ch);
2685 /* ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z */
2686 /* ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z */
2687 /* ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z */
2688 /* ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z */
2689 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen, 16)
2690 const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
2691 const char *first, const char *last, wchar_t *dest)
2693 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2694 return call_ctype_wchar_do_widen(this, first, last, dest);
2697 /* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
2698 /* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
2699 /* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
2700 /* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
2701 DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
2702 const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
2703 const char *first, const char *last, wchar_t *dest, size_t size)
2705 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
2706 return call_ctype_wchar__Do_widen_s(this, first, last, dest, size);
2709 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2710 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2711 size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
2713 TRACE("(%p %p)\n", facet, loc);
2715 if(facet && !*facet) {
2716 _Locinfo locinfo;
2718 *facet = operator_new(sizeof(ctype_wchar));
2719 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
2720 ctype_wchar_ctor_locinfo((ctype_wchar*)*facet, &locinfo, 0);
2721 _Locinfo_dtor(&locinfo);
2724 return LC_CTYPE;
2727 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@@Z */
2728 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2729 size_t __cdecl ctype_wchar__Getcat_old(const locale_facet **facet)
2731 return ctype_wchar__Getcat(facet, locale_classic());
2734 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2735 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2736 size_t __cdecl ctype_short__Getcat(const locale_facet **facet, const locale *loc)
2738 if(facet && !*facet) {
2739 ctype_wchar__Getcat(facet, loc);
2740 (*(locale_facet**)facet)->vtable = &ctype_short_vtable;
2743 return LC_CTYPE;
2746 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@@Z */
2747 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2748 size_t __cdecl ctype_short__Getcat_old(const locale_facet **facet)
2750 return ctype_short__Getcat(facet, locale_classic());
2753 /* _Towlower */
2754 wchar_t __cdecl _Towlower(wchar_t ch, const _Ctypevec *ctype)
2756 TRACE("(%d %p)\n", ch, ctype);
2757 return towlower(ch);
2760 ctype_wchar* ctype_wchar_use_facet(const locale *loc)
2762 static ctype_wchar *obj = NULL;
2764 _Lockit lock;
2765 const locale_facet *fac;
2767 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2768 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_wchar_id));
2769 if(fac) {
2770 _Lockit_dtor(&lock);
2771 return (ctype_wchar*)fac;
2774 if(obj) {
2775 _Lockit_dtor(&lock);
2776 return obj;
2779 ctype_wchar__Getcat(&fac, loc);
2780 obj = (ctype_wchar*)fac;
2781 call_locale_facet__Incref(&obj->base.facet);
2782 locale_facet_register(&obj->base.facet);
2783 _Lockit_dtor(&lock);
2785 return obj;
2788 ctype_wchar* ctype_short_use_facet(const locale *loc)
2790 static ctype_wchar *obj = NULL;
2792 _Lockit lock;
2793 const locale_facet *fac;
2795 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2796 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_short_id));
2797 if(fac) {
2798 _Lockit_dtor(&lock);
2799 return (ctype_wchar*)fac;
2802 if(obj) {
2803 _Lockit_dtor(&lock);
2804 return obj;
2807 ctype_short__Getcat(&fac, loc);
2808 obj = (ctype_wchar*)fac;
2809 call_locale_facet__Incref(&obj->base.facet);
2810 locale_facet_register(&obj->base.facet);
2811 _Lockit_dtor(&lock);
2813 return obj;
2816 /* ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z */
2817 /* ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z */
2818 /* ?do_tolower@?$ctype@G@std@@MBEGG@Z */
2819 /* ?do_tolower@?$ctype@G@std@@MEBAGG@Z */
2820 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower_ch, 8)
2821 #if _MSVCP_VER <= 100
2822 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2823 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2824 #else
2825 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2826 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2827 #endif
2828 wchar_t __thiscall ctype_wchar_do_tolower_ch(const ctype_wchar *this, wchar_t ch)
2830 return _Towlower(ch, &this->ctype);
2833 /* ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2834 /* ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2835 /* ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2836 /* ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2837 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower, 12)
2838 #if _MSVCP_VER <= 100
2839 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 20, \
2840 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2841 (this, first, last))
2842 #else
2843 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 28, \
2844 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2845 (this, first, last))
2846 #endif
2847 const wchar_t* __thiscall ctype_wchar_do_tolower(const ctype_wchar *this,
2848 wchar_t *first, const wchar_t *last)
2850 TRACE("(%p %p %p)\n", this, first, last);
2851 for(; first<last; first++)
2852 *first = _Towlower(*first, &this->ctype);
2853 return last;
2856 /* ?tolower@?$ctype@_W@std@@QBE_W_W@Z */
2857 /* ?tolower@?$ctype@_W@std@@QEBA_W_W@Z */
2858 /* ?tolower@?$ctype@G@std@@QBEGG@Z */
2859 /* ?tolower@?$ctype@G@std@@QEBAGG@Z */
2860 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower_ch, 8)
2861 wchar_t __thiscall ctype_wchar_tolower_ch(const ctype_wchar *this, wchar_t ch)
2863 TRACE("(%p %d)\n", this, ch);
2864 return call_ctype_wchar_do_tolower_ch(this, ch);
2867 /* ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2868 /* ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2869 /* ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2870 /* ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2871 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower, 12)
2872 const wchar_t* __thiscall ctype_wchar_tolower(const ctype_wchar *this,
2873 wchar_t *first, const wchar_t *last)
2875 TRACE("(%p %p %p)\n", this, first, last);
2876 return call_ctype_wchar_do_tolower(this, first, last);
2879 /* _Towupper */
2880 wchar_t __cdecl _Towupper(wchar_t ch, const _Ctypevec *ctype)
2882 TRACE("(%d %p)\n", ch, ctype);
2883 return towupper(ch);
2886 /* ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z */
2887 /* ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z */
2888 /* ?do_toupper@?$ctype@G@std@@MBEGG@Z */
2889 /* ?do_toupper@?$ctype@G@std@@MEBAGG@Z */
2890 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper_ch, 8)
2891 #if _MSVCP_VER <= 100
2892 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2893 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2894 #else
2895 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2896 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2897 #endif
2898 wchar_t __thiscall ctype_wchar_do_toupper_ch(const ctype_wchar *this, wchar_t ch)
2900 return _Towupper(ch, &this->ctype);
2903 /* ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2904 /* ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2905 /* ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2906 /* ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2907 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper, 12)
2908 #if _MSVCP_VER <= 100
2909 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 28, \
2910 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2911 (this, first, last))
2912 #else
2913 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 36, \
2914 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2915 (this, first, last))
2916 #endif
2917 const wchar_t* __thiscall ctype_wchar_do_toupper(const ctype_wchar *this,
2918 wchar_t *first, const wchar_t *last)
2920 TRACE("(%p %p %p)\n", this, first, last);
2921 for(; first<last; first++)
2922 *first = _Towupper(*first, &this->ctype);
2923 return last;
2926 /* ?toupper@?$ctype@_W@std@@QBE_W_W@Z */
2927 /* ?toupper@?$ctype@_W@std@@QEBA_W_W@Z */
2928 /* ?toupper@?$ctype@G@std@@QBEGG@Z */
2929 /* ?toupper@?$ctype@G@std@@QEBAGG@Z */
2930 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper_ch, 8)
2931 wchar_t __thiscall ctype_wchar_toupper_ch(const ctype_wchar *this, wchar_t ch)
2933 TRACE("(%p %d)\n", this, ch);
2934 return call_ctype_wchar_do_toupper_ch(this, ch);
2937 /* ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2938 /* ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2939 /* ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2940 /* ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2941 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper, 12)
2942 const wchar_t* __thiscall ctype_wchar_toupper(const ctype_wchar *this,
2943 wchar_t *first, const wchar_t *last)
2945 TRACE("(%p %p %p)\n", this, first, last);
2946 return call_ctype_wchar_do_toupper(this, first, last);
2949 /* _Getwctypes */
2950 const wchar_t* __cdecl _Getwctypes(const wchar_t *first, const wchar_t *last,
2951 short *mask, const _Ctypevec *ctype)
2953 TRACE("(%p %p %p %p)\n", first, last, mask, ctype);
2954 GetStringTypeW(CT_CTYPE1, first, last-first, (WORD*)mask);
2955 return last;
2958 /* _Getwctype */
2959 short __cdecl _Getwctype(wchar_t ch, const _Ctypevec *ctype)
2961 short mask = 0;
2962 _Getwctypes(&ch, &ch+1, &mask, ctype);
2963 return mask;
2966 /* ?do_is@?$ctype@_W@std@@MBE_NF_W@Z */
2967 /* ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z */
2968 /* ?do_is@?$ctype@G@std@@MBE_NFG@Z */
2969 /* ?do_is@?$ctype@G@std@@MEBA_NFG@Z */
2970 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is_ch, 12)
2971 #if _MSVCP_VER <= 100
2972 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 8, \
2973 bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2974 #else
2975 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 16, \
2976 bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2977 #endif
2978 bool __thiscall ctype_wchar_do_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2980 TRACE("(%p %x %d)\n", this, mask, ch);
2981 return (_Getwctype(ch, &this->ctype) & mask) != 0;
2984 /* ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z */
2985 /* ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z */
2986 /* ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z */
2987 /* ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z */
2988 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is, 16)
2989 #if _MSVCP_VER <= 100
2990 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 4, \
2991 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
2992 (this, first, last, dest))
2993 #else
2994 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 12, \
2995 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
2996 (this, first, last, dest))
2997 #endif
2998 const wchar_t* __thiscall ctype_wchar_do_is(const ctype_wchar *this,
2999 const wchar_t *first, const wchar_t *last, short *dest)
3001 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3002 return _Getwctypes(first, last, dest, &this->ctype);
3005 /* ?is@?$ctype@_W@std@@QBE_NF_W@Z */
3006 /* ?is@?$ctype@_W@std@@QEBA_NF_W@Z */
3007 /* ?is@?$ctype@G@std@@QBE_NFG@Z */
3008 /* ?is@?$ctype@G@std@@QEBA_NFG@Z */
3009 DEFINE_THISCALL_WRAPPER(ctype_wchar_is_ch, 12)
3010 bool __thiscall ctype_wchar_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
3012 TRACE("(%p %x %d)\n", this, mask, ch);
3013 return call_ctype_wchar_do_is_ch(this, mask, ch);
3016 /* ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z */
3017 /* ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z */
3018 /* ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z */
3019 /* ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z */
3020 DEFINE_THISCALL_WRAPPER(ctype_wchar_is, 16)
3021 const wchar_t* __thiscall ctype_wchar_is(const ctype_wchar *this,
3022 const wchar_t *first, const wchar_t *last, short *dest)
3024 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3025 return call_ctype_wchar_do_is(this, first, last, dest);
3028 /* ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3029 /* ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3030 /* ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z */
3031 /* ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3032 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_is, 16)
3033 #if _MSVCP_VER <= 100
3034 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 12, \
3035 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3036 (this, mask, first, last))
3037 #else
3038 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 20, \
3039 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3040 (this, mask, first, last))
3041 #endif
3042 const wchar_t* __thiscall ctype_wchar_do_scan_is(const ctype_wchar *this,
3043 short mask, const wchar_t *first, const wchar_t *last)
3045 TRACE("(%p %d %p %p)\n", this, mask, first, last);
3046 for(; first<last; first++)
3047 if(!ctype_wchar_is_ch(this, mask, *first))
3048 break;
3049 return first;
3052 /* ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3053 /* ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3054 /* ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z */
3055 /* ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3056 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_is, 16)
3057 const wchar_t* __thiscall ctype_wchar_scan_is(const ctype_wchar *this,
3058 short mask, const wchar_t *first, const wchar_t *last)
3060 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3061 return call_ctype_wchar_do_scan_is(this, mask, first, last);
3064 /* ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3065 /* ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3066 /* ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z */
3067 /* ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3068 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_not, 16)
3069 #if _MSVCP_VER <= 100
3070 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 16, \
3071 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3072 (this, mask, first, last))
3073 #else
3074 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 24, \
3075 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3076 (this, mask, first, last))
3077 #endif
3078 const wchar_t* __thiscall ctype_wchar_do_scan_not(const ctype_wchar *this,
3079 short mask, const wchar_t *first, const wchar_t *last)
3081 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3082 for(; first<last; first++)
3083 if(ctype_wchar_is_ch(this, mask, *first))
3084 break;
3085 return first;
3088 /* ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3089 /* ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3090 /* ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z */
3091 /* ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3092 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_not, 16)
3093 const wchar_t* __thiscall ctype_wchar_scan_not(const ctype_wchar *this,
3094 short mask, const wchar_t *first, const wchar_t *last)
3096 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3097 return call_ctype_wchar_do_scan_not(this, mask, first, last);
3100 /* ??_7codecvt_base@std@@6B@ */
3101 extern const vtable_ptr codecvt_base_vtable;
3103 /* ??0codecvt_base@std@@QAE@I@Z */
3104 /* ??0codecvt_base@std@@QEAA@_K@Z */
3105 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor_refs, 8)
3106 codecvt_base* __thiscall codecvt_base_ctor_refs(codecvt_base *this, size_t refs)
3108 TRACE("(%p %Iu)\n", this, refs);
3109 locale_facet_ctor_refs(&this->facet, refs);
3110 this->facet.vtable = &codecvt_base_vtable;
3111 return this;
3114 /* ??_Fcodecvt_base@std@@QAEXXZ */
3115 /* ??_Fcodecvt_base@std@@QEAAXXZ */
3116 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor, 4)
3117 codecvt_base* __thiscall codecvt_base_ctor(codecvt_base *this)
3119 return codecvt_base_ctor_refs(this, 0);
3122 /* ??1codecvt_base@std@@UAE@XZ */
3123 /* ??1codecvt_base@std@@UEAA@XZ */
3124 DEFINE_THISCALL_WRAPPER(codecvt_base_dtor, 4)
3125 void __thiscall codecvt_base_dtor(codecvt_base *this)
3127 TRACE("(%p)\n", this);
3128 locale_facet_dtor(&this->facet);
3131 DEFINE_THISCALL_WRAPPER(codecvt_base_vector_dtor, 8)
3132 codecvt_base* __thiscall codecvt_base_vector_dtor(codecvt_base *this, unsigned int flags)
3134 TRACE("(%p %x)\n", this, flags);
3135 if(flags & 2) {
3136 /* we have an array, with the number of elements stored before the first object */
3137 INT_PTR i, *ptr = (INT_PTR *)this-1;
3139 for(i=*ptr-1; i>=0; i--)
3140 codecvt_base_dtor(this+i);
3141 operator_delete(ptr);
3142 } else {
3143 codecvt_base_dtor(this);
3144 if(flags & 1)
3145 operator_delete(this);
3148 return this;
3151 /* ?do_always_noconv@codecvt_base@std@@MBE_NXZ */
3152 /* ?do_always_noconv@codecvt_base@std@@MEBA_NXZ */
3153 #if _MSVCP_VER <= 100
3154 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 4, \
3155 bool, (const codecvt_base*), (this))
3156 #else
3157 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 12, \
3158 bool, (const codecvt_base*), (this))
3159 #endif
3160 DEFINE_THISCALL_WRAPPER(codecvt_base_do_always_noconv, 4)
3161 bool __thiscall codecvt_base_do_always_noconv(const codecvt_base *this)
3163 TRACE("(%p)\n", this);
3164 return _MSVCP_VER <= 100;
3167 /* ?always_noconv@codecvt_base@std@@QBE_NXZ */
3168 /* ?always_noconv@codecvt_base@std@@QEBA_NXZ */
3169 DEFINE_THISCALL_WRAPPER(codecvt_base_always_noconv, 4)
3170 bool __thiscall codecvt_base_always_noconv(const codecvt_base *this)
3172 TRACE("(%p)\n", this);
3173 return call_codecvt_base_do_always_noconv(this);
3176 /* ?do_max_length@codecvt_base@std@@MBEHXZ */
3177 /* ?do_max_length@codecvt_base@std@@MEBAHXZ */
3178 #if _MSVCP_VER <= 100
3179 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 8, \
3180 int, (const codecvt_base*), (this))
3181 #else
3182 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 16, \
3183 int, (const codecvt_base*), (this))
3184 #endif
3185 DEFINE_THISCALL_WRAPPER(codecvt_base_do_max_length, 4)
3186 int __thiscall codecvt_base_do_max_length(const codecvt_base *this)
3188 TRACE("(%p)\n", this);
3189 return 1;
3192 /* ?max_length@codecvt_base@std@@QBEHXZ */
3193 /* ?max_length@codecvt_base@std@@QEBAHXZ */
3194 DEFINE_THISCALL_WRAPPER(codecvt_base_max_length, 4)
3195 int __thiscall codecvt_base_max_length(const codecvt_base *this)
3197 TRACE("(%p)\n", this);
3198 return call_codecvt_base_do_max_length(this);
3201 /* ?do_encoding@codecvt_base@std@@MBEHXZ */
3202 /* ?do_encoding@codecvt_base@std@@MEBAHXZ */
3203 #if _MSVCP_VER <= 100
3204 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 12, \
3205 int, (const codecvt_base*), (this))
3206 #else
3207 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 20, \
3208 int, (const codecvt_base*), (this))
3209 #endif
3210 DEFINE_THISCALL_WRAPPER(codecvt_base_do_encoding, 4)
3211 int __thiscall codecvt_base_do_encoding(const codecvt_base *this)
3213 TRACE("(%p)\n", this);
3214 return 1;
3217 /* ?encoding@codecvt_base@std@@QBEHXZ */
3218 /* ?encoding@codecvt_base@std@@QEBAHXZ */
3219 DEFINE_THISCALL_WRAPPER(codecvt_base_encoding, 4)
3220 int __thiscall codecvt_base_encoding(const codecvt_base *this)
3222 TRACE("(%p)\n", this);
3223 return call_codecvt_base_do_encoding(this);
3226 /* ?id@?$codecvt@DDH@std@@2V0locale@2@A */
3227 locale_id codecvt_char_id = {0};
3229 /* ??_7?$codecvt@DDH@std@@6B@ */
3230 extern const vtable_ptr codecvt_char_vtable;
3232 /* ?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z */
3233 /* ?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3234 DEFINE_THISCALL_WRAPPER(codecvt_char__Init, 8)
3235 void __thiscall codecvt_char__Init(codecvt_char *this, const _Locinfo *locinfo)
3237 TRACE("(%p %p)\n", this, locinfo);
3240 /* ??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z */
3241 /* ??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3242 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_locinfo, 12)
3243 codecvt_char* __thiscall codecvt_char_ctor_locinfo(codecvt_char *this, const _Locinfo *locinfo, size_t refs)
3245 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3246 codecvt_base_ctor_refs(&this->base, refs);
3247 this->base.facet.vtable = &codecvt_char_vtable;
3248 return this;
3251 /* ??0?$codecvt@DDH@std@@QAE@I@Z */
3252 /* ??0?$codecvt@DDH@std@@QEAA@_K@Z */
3253 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_refs, 8)
3254 codecvt_char* __thiscall codecvt_char_ctor_refs(codecvt_char *this, size_t refs)
3256 return codecvt_char_ctor_locinfo(this, NULL, refs);
3259 /* ??_F?$codecvt@DDH@std@@QAEXXZ */
3260 /* ??_F?$codecvt@DDH@std@@QEAAXXZ */
3261 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor, 4)
3262 codecvt_char* __thiscall codecvt_char_ctor(codecvt_char *this)
3264 return codecvt_char_ctor_locinfo(this, NULL, 0);
3267 /* ??1?$codecvt@DDH@std@@UAE@XZ */
3268 /* ??1?$codecvt@DDH@std@@UEAA@XZ */
3269 /* ??1?$codecvt@DDH@std@@MAE@XZ */
3270 /* ??1?$codecvt@DDH@std@@MEAA@XZ */
3271 DEFINE_THISCALL_WRAPPER(codecvt_char_dtor, 4)
3272 void __thiscall codecvt_char_dtor(codecvt_char *this)
3274 TRACE("(%p)\n", this);
3275 codecvt_base_dtor(&this->base);
3278 DEFINE_THISCALL_WRAPPER(codecvt_char_vector_dtor, 8)
3279 codecvt_char* __thiscall codecvt_char_vector_dtor(codecvt_char *this, unsigned int flags)
3281 TRACE("(%p %x)\n", this, flags);
3282 if(flags & 2) {
3283 /* we have an array, with the number of elements stored before the first object */
3284 INT_PTR i, *ptr = (INT_PTR *)this-1;
3286 for(i=*ptr-1; i>=0; i--)
3287 codecvt_char_dtor(this+i);
3288 operator_delete(ptr);
3289 } else {
3290 codecvt_char_dtor(this);
3291 if(flags & 1)
3292 operator_delete(this);
3295 return this;
3298 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3299 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3300 size_t __cdecl codecvt_char__Getcat(const locale_facet **facet, const locale *loc)
3302 TRACE("(%p %p)\n", facet, loc);
3304 if(facet && !*facet) {
3305 *facet = operator_new(sizeof(codecvt_char));
3306 codecvt_char_ctor((codecvt_char*)*facet);
3309 return LC_CTYPE;
3312 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@@Z */
3313 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3314 size_t __cdecl codecvt_char__Getcat_old(const locale_facet **facet)
3316 return codecvt_char__Getcat(facet, locale_classic());
3319 codecvt_char* codecvt_char_use_facet(const locale *loc)
3321 static codecvt_char *obj = NULL;
3323 _Lockit lock;
3324 const locale_facet *fac;
3326 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3327 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_char_id));
3328 if(fac) {
3329 _Lockit_dtor(&lock);
3330 return (codecvt_char*)fac;
3333 if(obj) {
3334 _Lockit_dtor(&lock);
3335 return obj;
3338 codecvt_char__Getcat(&fac, loc);
3339 obj = (codecvt_char*)fac;
3340 call_locale_facet__Incref(&obj->base.facet);
3341 locale_facet_register(&obj->base.facet);
3342 _Lockit_dtor(&lock);
3344 return obj;
3347 /* ?do_always_noconv@?$codecvt@DDH@std@@MBE_NXZ */
3348 /* ?do_always_noconv@?$codecvt@DDH@std@@MEBA_NXZ */
3349 DEFINE_THISCALL_WRAPPER(codecvt_char_do_always_noconv, 4)
3350 bool __thiscall codecvt_char_do_always_noconv(const codecvt_char *this)
3352 TRACE("(%p)\n", this);
3353 return TRUE;
3356 /* ?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3357 /* ?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3358 #if _MSVCP_VER <= 100
3359 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3360 CALL_VTBL_FUNC(this, 16, int, \
3361 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3362 (this, state, from, from_end, from_next, to, to_end, to_next))
3363 #else
3364 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3365 CALL_VTBL_FUNC(this, 24, int, \
3366 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3367 (this, state, from, from_end, from_next, to, to_end, to_next))
3368 #endif
3369 DEFINE_THISCALL_WRAPPER(codecvt_char_do_in, 32)
3370 int __thiscall codecvt_char_do_in(const codecvt_char *this, _Mbstatet *state,
3371 const char *from, const char *from_end, const char **from_next,
3372 char *to, char *to_end, char **to_next)
3374 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3375 from_next, to, to_end, to_next);
3376 *from_next = from;
3377 *to_next = to;
3378 return CODECVT_noconv;
3381 /* ?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3382 /* ?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3383 DEFINE_THISCALL_WRAPPER(codecvt_char_in, 32)
3384 int __thiscall codecvt_char_in(const codecvt_char *this, _Mbstatet *state,
3385 const char *from, const char *from_end, const char **from_next,
3386 char *to, char *to_end, char **to_next)
3388 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3389 from_next, to, to_end, to_next);
3390 return call_codecvt_char_do_in(this, state, from, from_end, from_next,
3391 to, to_end, to_next);
3394 /* ?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3395 /* ?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3396 #if _MSVCP_VER <= 100
3397 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3398 CALL_VTBL_FUNC(this, 20, int, \
3399 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3400 (this, state, from, from_end, from_next, to, to_end, to_next))
3401 #else
3402 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3403 CALL_VTBL_FUNC(this, 28, int, \
3404 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3405 (this, state, from, from_end, from_next, to, to_end, to_next))
3406 #endif
3407 DEFINE_THISCALL_WRAPPER(codecvt_char_do_out, 32)
3408 int __thiscall codecvt_char_do_out(const codecvt_char *this, _Mbstatet *state,
3409 const char *from, const char *from_end, const char **from_next,
3410 char *to, char *to_end, char **to_next)
3412 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3413 from_end, from_next, to, to_end, to_next);
3414 *from_next = from;
3415 *to_next = to;
3416 return CODECVT_noconv;
3419 /* ?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3420 /* ?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3421 DEFINE_THISCALL_WRAPPER(codecvt_char_out, 32)
3422 int __thiscall codecvt_char_out(const codecvt_char *this, _Mbstatet *state,
3423 const char *from, const char *from_end, const char **from_next,
3424 char *to, char *to_end, char **to_next)
3426 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3427 from_next, to, to_end, to_next);
3428 return call_codecvt_char_do_out(this, state, from, from_end, from_next,
3429 to, to_end, to_next);
3432 /* ?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z */
3433 /* ?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3434 #if _MSVCP_VER <= 100
3435 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3436 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3437 #else
3438 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3439 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3440 #endif
3441 DEFINE_THISCALL_WRAPPER(codecvt_char_do_unshift, 20)
3442 int __thiscall codecvt_char_do_unshift(const codecvt_char *this,
3443 _Mbstatet *state, char *to, char *to_end, char **to_next)
3445 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3446 *to_next = to;
3447 return CODECVT_noconv;
3450 /* ?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z */
3451 /* ?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3452 DEFINE_THISCALL_WRAPPER(codecvt_char_unshift, 20)
3453 int __thiscall codecvt_char_unshift(const codecvt_char *this,
3454 _Mbstatet *state, char *to, char *to_end, char **to_next)
3456 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3457 return call_codecvt_char_do_unshift(this, state, to, to_end, to_next);
3460 /* ?do_length@?$codecvt@DDH@std@@MBEHABHPBD1I@Z */
3461 /* ?do_length@?$codecvt@DDH@std@@MEBAHAEBHPEBD1_K@Z */
3462 #if _MSVCP_VER <= 100
3463 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3464 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, size_t), \
3465 (this, state, from, from_end, max))
3466 #else
3467 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
3468 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, size_t), \
3469 (this, state, from, from_end, max))
3470 #endif
3471 DEFINE_THISCALL_WRAPPER(codecvt_char_do_length, 20)
3472 int __thiscall codecvt_char_do_length(const codecvt_char *this, const _Mbstatet *state,
3473 const char *from, const char *from_end, size_t max)
3475 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3476 return (from_end-from > max ? max : from_end-from);
3479 /* ?length@?$codecvt@DDH@std@@QBEHABHPBD1I@Z */
3480 /* ?length@?$codecvt@DDH@std@@QEBAHAEBHPEBD1_K@Z */
3481 DEFINE_THISCALL_WRAPPER(codecvt_char_length, 20)
3482 int __thiscall codecvt_char_length(const codecvt_char *this, const _Mbstatet *state,
3483 const char *from, const char *from_end, size_t max)
3485 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3486 return call_codecvt_char_do_length(this, state, from, from_end, max);
3489 /* ?id@?$codecvt@_WDH@std@@2V0locale@2@A */
3490 locale_id codecvt_wchar_id = {0};
3491 /* ?id@?$codecvt@GDH@std@@2V0locale@2@A */
3492 locale_id codecvt_short_id = {0};
3494 /* ??_7?$codecvt@_WDH@std@@6B@ */
3495 extern const vtable_ptr codecvt_wchar_vtable;
3496 /* ??_7?$codecvt@GDH@std@@6B@ */
3497 extern const vtable_ptr codecvt_short_vtable;
3499 /* ?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z */
3500 /* ?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3501 /* ?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z */
3502 /* ?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3503 DEFINE_THISCALL_WRAPPER(codecvt_wchar__Init, 8)
3504 void __thiscall codecvt_wchar__Init(codecvt_wchar *this, const _Locinfo *locinfo)
3506 TRACE("(%p %p)\n", this, locinfo);
3507 _Locinfo__Getcvt(locinfo, &this->cvt);
3510 /* ??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z */
3511 /* ??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3512 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_locinfo, 12)
3513 codecvt_wchar* __thiscall codecvt_wchar_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, size_t refs)
3515 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3517 codecvt_base_ctor_refs(&this->base, refs);
3518 this->base.facet.vtable = &codecvt_wchar_vtable;
3520 codecvt_wchar__Init(this, locinfo);
3521 return this;
3524 /* ??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z */
3525 /* ??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3526 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_locinfo, 12)
3527 codecvt_wchar* __thiscall codecvt_short_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, size_t refs)
3529 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3531 codecvt_wchar_ctor_locinfo(this, locinfo, refs);
3532 this->base.facet.vtable = &codecvt_short_vtable;
3533 return this;
3536 /* ??0?$codecvt@_WDH@std@@QAE@I@Z */
3537 /* ??0?$codecvt@_WDH@std@@QEAA@_K@Z */
3538 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_refs, 8)
3539 codecvt_wchar* __thiscall codecvt_wchar_ctor_refs(codecvt_wchar *this, size_t refs)
3541 _Locinfo locinfo;
3543 TRACE("(%p %Iu)\n", this, refs);
3545 _Locinfo_ctor(&locinfo);
3546 codecvt_wchar_ctor_locinfo(this, &locinfo, refs);
3547 _Locinfo_dtor(&locinfo);
3548 return this;
3551 /* ??0?$codecvt@GDH@std@@QAE@I@Z */
3552 /* ??0?$codecvt@GDH@std@@QEAA@_K@Z */
3553 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_refs, 8)
3554 codecvt_wchar* __thiscall codecvt_short_ctor_refs(codecvt_wchar *this, size_t refs)
3556 _Locinfo locinfo;
3558 TRACE("(%p %Iu)\n", this, refs);
3560 _Locinfo_ctor(&locinfo);
3561 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3562 _Locinfo_dtor(&locinfo);
3563 return this;
3566 /* ??0?$codecvt@GDH@std@@IAE@PBDI@Z */
3567 /* ??0?$codecvt@GDH@std@@IEAA@PEBD_K@Z */
3568 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_name, 12)
3569 codecvt_wchar* __thiscall codecvt_short_ctor_name(codecvt_wchar *this, const char *name, size_t refs)
3571 _Locinfo locinfo;
3573 TRACE("(%p %s %Iu)\n", this, name, refs);
3575 _Locinfo_ctor_cstr(&locinfo, name);
3576 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3577 _Locinfo_dtor(&locinfo);
3578 return this;
3581 /* ??_F?$codecvt@_WDH@std@@QAEXXZ */
3582 /* ??_F?$codecvt@_WDH@std@@QEAAXXZ */
3583 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor, 4)
3584 codecvt_wchar* __thiscall codecvt_wchar_ctor(codecvt_wchar *this)
3586 return codecvt_wchar_ctor_refs(this, 0);
3589 /* ??_F?$codecvt@GDH@std@@QAEXXZ */
3590 /* ??_F?$codecvt@GDH@std@@QEAAXXZ */
3591 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor, 4)
3592 codecvt_wchar* __thiscall codecvt_short_ctor(codecvt_wchar *this)
3594 return codecvt_short_ctor_refs(this, 0);
3597 /* ??1?$codecvt@GDH@std@@UAE@XZ */
3598 /* ??1?$codecvt@GDH@std@@UEAA@XZ */
3599 /* ??1?$codecvt@GDH@std@@MAE@XZ */
3600 /* ??1?$codecvt@GDH@std@@MEAA@XZ */
3601 /* ??1?$codecvt@_WDH@std@@MAE@XZ */
3602 /* ??1?$codecvt@_WDH@std@@MEAA@XZ */
3603 DEFINE_THISCALL_WRAPPER(codecvt_wchar_dtor, 4)
3604 void __thiscall codecvt_wchar_dtor(codecvt_wchar *this)
3606 TRACE("(%p)\n", this);
3607 codecvt_base_dtor(&this->base);
3610 DEFINE_THISCALL_WRAPPER(codecvt_wchar_vector_dtor, 8)
3611 codecvt_wchar* __thiscall codecvt_wchar_vector_dtor(codecvt_wchar *this, unsigned int flags)
3613 TRACE("(%p %x)\n", this, flags);
3614 if(flags & 2) {
3615 /* we have an array, with the number of elements stored before the first object */
3616 INT_PTR i, *ptr = (INT_PTR *)this-1;
3618 for(i=*ptr-1; i>=0; i--)
3619 codecvt_wchar_dtor(this+i);
3620 operator_delete(ptr);
3621 } else {
3622 codecvt_wchar_dtor(this);
3623 if(flags & 1)
3624 operator_delete(this);
3627 return this;
3630 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3631 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3632 size_t __cdecl codecvt_wchar__Getcat(const locale_facet **facet, const locale *loc)
3634 TRACE("(%p %p)\n", facet, loc);
3636 if(facet && !*facet) {
3637 _Locinfo locinfo;
3639 *facet = operator_new(sizeof(codecvt_wchar));
3640 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3641 codecvt_wchar_ctor_locinfo((codecvt_wchar*)*facet, &locinfo, 0);
3642 _Locinfo_dtor(&locinfo);
3645 return LC_CTYPE;
3648 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@@Z */
3649 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3650 size_t __cdecl codecvt_wchar__Getcat_old(const locale_facet **facet)
3652 return codecvt_wchar__Getcat(facet, locale_classic());
3655 codecvt_wchar* codecvt_wchar_use_facet(const locale *loc)
3657 static codecvt_wchar *obj = NULL;
3659 _Lockit lock;
3660 const locale_facet *fac;
3662 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3663 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_wchar_id));
3664 if(fac) {
3665 _Lockit_dtor(&lock);
3666 return (codecvt_wchar*)fac;
3669 if(obj) {
3670 _Lockit_dtor(&lock);
3671 return obj;
3674 codecvt_wchar__Getcat(&fac, loc);
3675 obj = (codecvt_wchar*)fac;
3676 call_locale_facet__Incref(&obj->base.facet);
3677 locale_facet_register(&obj->base.facet);
3678 _Lockit_dtor(&lock);
3680 return obj;
3683 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3684 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3685 size_t __cdecl codecvt_short__Getcat(const locale_facet **facet, const locale *loc)
3687 TRACE("(%p %p)\n", facet, loc);
3689 if(facet && !*facet) {
3690 _Locinfo locinfo;
3692 *facet = operator_new(sizeof(codecvt_wchar));
3693 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3694 codecvt_short_ctor((codecvt_wchar*)*facet);
3695 _Locinfo_dtor(&locinfo);
3698 return LC_CTYPE;
3701 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@@Z */
3702 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3703 size_t __cdecl codecvt_short__Getcat_old(const locale_facet **facet)
3705 return codecvt_short__Getcat(facet, locale_classic());
3708 codecvt_wchar* codecvt_short_use_facet(const locale *loc)
3710 static codecvt_wchar *obj = NULL;
3712 _Lockit lock;
3713 const locale_facet *fac;
3715 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3716 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_short_id));
3717 if(fac) {
3718 _Lockit_dtor(&lock);
3719 return (codecvt_wchar*)fac;
3722 if(obj) {
3723 _Lockit_dtor(&lock);
3724 return obj;
3727 codecvt_short__Getcat(&fac, loc);
3728 obj = (codecvt_wchar*)fac;
3729 call_locale_facet__Incref(&obj->base.facet);
3730 locale_facet_register(&obj->base.facet);
3731 _Lockit_dtor(&lock);
3733 return obj;
3736 /* ?_Id_func@?$codecvt@_WDH@std@@SAAAVid@locale@2@XZ */
3737 /* ?_Id_func@?$codecvt@_WDH@std@@SAAEAVid@locale@2@XZ */
3738 locale_id* __cdecl codecvt_wchar__Id_func(void)
3740 TRACE("()\n");
3741 return &codecvt_wchar_id;
3744 /* ?_Id_func@?$codecvt@GDH@std@@SAAAVid@locale@2@XZ */
3745 /* ?_Id_func@?$codecvt@GDH@std@@SAAEAVid@locale@2@XZ */
3746 locale_id* __cdecl codecvt_short__Id_func(void)
3748 TRACE("()\n");
3749 return &codecvt_short_id;
3752 /* ?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ */
3753 /* ?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ */
3754 /* ?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ */
3755 /* ?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ */
3756 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_always_noconv, 4)
3757 bool __thiscall codecvt_wchar_do_always_noconv(const codecvt_wchar *this)
3759 TRACE("(%p)\n", this);
3760 return FALSE;
3763 /* ?do_max_length@?$codecvt@GDH@std@@MBEHXZ */
3764 /* ?do_max_length@?$codecvt@GDH@std@@MEBAHXZ */
3765 /* ?do_max_length@?$codecvt@_WDH@std@@MBEHXZ */
3766 /* ?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ */
3767 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_max_length, 4)
3768 int __thiscall codecvt_wchar_do_max_length(const codecvt_wchar *this)
3770 TRACE("(%p)\n", this);
3771 return MB_LEN_MAX;
3774 /* ?do_encoding@?$codecvt@GDH@std@@MBEHXZ */
3775 /* ?do_encoding@?$codecvt@GDH@std@@MEBAHXZ */
3776 /* ?do_encoding@?$codecvt@_WDH@std@@MBEHXZ */
3777 /* ?do_encoding@?$codecvt@_WDH@std@@MEBAHXZ */
3778 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_encoding, 4)
3779 int __thiscall codecvt_wchar_do_encoding(const codecvt_wchar *this)
3781 TRACE("(%p)\n", this);
3782 return 0;
3785 /* ?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3786 /* ?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3787 /* ?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3788 /* ?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3789 #if _MSVCP_VER <= 100
3790 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3791 CALL_VTBL_FUNC(this, 16, int, \
3792 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3793 (this, state, from, from_end, from_next, to, to_end, to_next))
3794 #else
3795 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3796 CALL_VTBL_FUNC(this, 24, int, \
3797 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3798 (this, state, from, from_end, from_next, to, to_end, to_next))
3799 #endif
3800 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_in, 32)
3801 int __thiscall codecvt_wchar_do_in(const codecvt_wchar *this, _Mbstatet *state,
3802 const char *from, const char *from_end, const char **from_next,
3803 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3805 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3806 from_end, from_next, to, to_end, to_next);
3808 *from_next = from;
3809 *to_next = to;
3811 while(*from_next!=from_end && *to_next!=to_end) {
3812 switch(_Mbrtowc(*to_next, *from_next, from_end-*from_next, state, &this->cvt)) {
3813 case -2:
3814 *from_next = from_end;
3815 return CODECVT_partial;
3816 case -1:
3817 return CODECVT_error;
3818 case 2:
3819 (*from_next)++;
3820 /* fall through */
3821 case 0:
3822 case 1:
3823 (*from_next)++;
3824 (*to_next)++;
3828 return CODECVT_ok;
3831 /* ?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3832 /* ?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3833 /* ?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3834 /* ?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3835 DEFINE_THISCALL_WRAPPER(codecvt_wchar_in, 32)
3836 int __thiscall codecvt_wchar_in(const codecvt_wchar *this, _Mbstatet *state,
3837 const char *from, const char *from_end, const char **from_next,
3838 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3840 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3841 from_end, from_next, to, to_end, to_next);
3842 return call_codecvt_wchar_do_in(this, state, from,
3843 from_end, from_next, to, to_end, to_next);
3846 /* ?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3847 /* ?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3848 /* ?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3849 /* ?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3850 #if _MSVCP_VER <= 100
3851 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3852 CALL_VTBL_FUNC(this, 20, int, \
3853 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3854 (this, state, from, from_end, from_next, to, to_end, to_next))
3855 #else
3856 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3857 CALL_VTBL_FUNC(this, 28, int, \
3858 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3859 (this, state, from, from_end, from_next, to, to_end, to_next))
3860 #endif
3861 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_out, 32)
3862 int __thiscall codecvt_wchar_do_out(const codecvt_wchar *this, _Mbstatet *state,
3863 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3864 char *to, char *to_end, char **to_next)
3866 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3867 from_end, from_next, to, to_end, to_next);
3869 *from_next = from;
3870 *to_next = to;
3872 while(*from_next!=from_end && *to_next!=to_end) {
3873 _Mbstatet old_state = *state;
3874 int size;
3875 char buf[MB_LEN_MAX];
3877 switch((size = _Wcrtomb(buf, **from_next, state, &this->cvt))) {
3878 case -1:
3879 return CODECVT_error;
3880 default:
3881 if(size > from_end-*from_next) {
3882 *state = old_state;
3883 return CODECVT_partial;
3886 (*from_next)++;
3887 memcpy_s(*to_next, to_end-*to_next, buf, size);
3888 (*to_next) += size;
3892 return CODECVT_ok;
3895 /* ?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3896 /* ?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3897 /* ?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3898 /* ?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3899 DEFINE_THISCALL_WRAPPER(codecvt_wchar_out, 32)
3900 int __thiscall codecvt_wchar_out(const codecvt_wchar *this, _Mbstatet *state,
3901 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3902 char *to, char *to_end, char **to_next)
3904 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3905 from_end, from_next, to, to_end, to_next);
3906 return call_codecvt_wchar_do_out(this, state, from,
3907 from_end, from_next, to, to_end, to_next);
3910 /* ?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z */
3911 /* ?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3912 /* ?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z */
3913 /* ?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3914 #if _MSVCP_VER <= 100
3915 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3916 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3917 #else
3918 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3919 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3920 #endif
3921 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_unshift, 20)
3922 int __thiscall codecvt_wchar_do_unshift(const codecvt_wchar *this,
3923 _Mbstatet *state, char *to, char *to_end, char **to_next)
3925 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3926 if(MBSTATET_TO_INT(state))
3927 WARN("unexpected state: %x\n", MBSTATET_TO_INT(state));
3929 *to_next = to;
3930 return CODECVT_ok;
3933 /* ?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z */
3934 /* ?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3935 /* ?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z */
3936 /* ?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3937 DEFINE_THISCALL_WRAPPER(codecvt_wchar_unshift, 20)
3938 int __thiscall codecvt_wchar_unshift(const codecvt_wchar *this,
3939 _Mbstatet *state, char *to, char *to_end, char **to_next)
3941 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3942 return call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next);
3945 /* ?do_length@?$codecvt@GDH@std@@MBEHABHPBD1I@Z */
3946 /* ?do_length@?$codecvt@GDH@std@@MEBAHAEBHPEBD1_K@Z */
3947 /* ?do_length@?$codecvt@_WDH@std@@MBEHABHPBD1I@Z */
3948 /* ?do_length@?$codecvt@_WDH@std@@MEBAHAEBHPEBD1_K@Z */
3949 #if _MSVCP_VER <= 100
3950 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3951 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, size_t), \
3952 (this, state, from, from_end, max))
3953 #else
3954 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
3955 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, size_t), \
3956 (this, state, from, from_end, max))
3957 #endif
3958 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_length, 20)
3959 int __thiscall codecvt_wchar_do_length(const codecvt_wchar *this, const _Mbstatet *state,
3960 const char *from, const char *from_end, size_t max)
3962 _Mbstatet tmp_state = *state;
3963 int ret=0;
3965 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3967 while(ret<max && from!=from_end) {
3968 switch(_Mbrtowc(NULL, from, from_end-from, &tmp_state, &this->cvt)) {
3969 case -2:
3970 case -1:
3971 return ret;
3972 case 2:
3973 from++;
3974 /* fall through */
3975 case 0:
3976 case 1:
3977 from++;
3978 ret++;
3982 return ret;
3985 /* ?length@?$codecvt@GDH@std@@QBEHABHPBD1I@Z */
3986 /* ?length@?$codecvt@GDH@std@@QEBAHAEBHPEBD1_K@Z */
3987 /* ?length@?$codecvt@_WDH@std@@QBEHABHPBD1I@Z */
3988 /* ?length@?$codecvt@_WDH@std@@QEBAHAEBHPEBD1_K@Z */
3989 DEFINE_THISCALL_WRAPPER(codecvt_wchar_length, 20)
3990 int __thiscall codecvt_wchar_length(const codecvt_wchar *this, const _Mbstatet *state,
3991 const char *from, const char *from_end, size_t max)
3993 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3994 return call_codecvt_wchar_do_length(this, state, from, from_end, max);
3997 /* ?id@?$numpunct@D@std@@2V0locale@2@A */
3998 locale_id numpunct_char_id = {0};
4000 /* ??_7?$numpunct@D@std@@6B@ */
4001 extern const vtable_ptr numpunct_char_vtable;
4003 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
4004 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4005 DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
4006 void __thiscall numpunct_char__Init(numpunct_char *this, const _Locinfo *locinfo, bool isdef)
4008 int len;
4010 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4012 len = strlen(_Locinfo__Getfalse(locinfo))+1;
4013 this->false_name = operator_new(len);
4014 memcpy((char*)this->false_name, _Locinfo__Getfalse(locinfo), len);
4016 len = strlen(_Locinfo__Gettrue(locinfo))+1;
4017 this->true_name = operator_new(len);
4018 memcpy((char*)this->true_name, _Locinfo__Gettrue(locinfo), len);
4020 if(isdef) {
4021 this->grouping = operator_new(1);
4022 *(char*)this->grouping = 0;
4024 this->dp = '.';
4025 this->sep = ',';
4026 } else {
4027 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4029 len = strlen(lc->grouping)+1;
4030 this->grouping = operator_new(len);
4031 memcpy((char*)this->grouping, lc->grouping, len);
4033 this->dp = lc->decimal_point[0];
4034 this->sep = lc->thousands_sep[0];
4038 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
4039 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
4040 DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
4041 void __thiscall numpunct_char__Tidy(numpunct_char *this)
4043 TRACE("(%p)\n", this);
4045 operator_delete((char*)this->grouping);
4046 operator_delete((char*)this->false_name);
4047 operator_delete((char*)this->true_name);
4050 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
4051 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4052 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
4053 numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
4054 const _Locinfo *locinfo, size_t refs, bool usedef)
4056 TRACE("(%p %p %Iu %d)\n", this, locinfo, refs, usedef);
4057 locale_facet_ctor_refs(&this->facet, refs);
4058 this->facet.vtable = &numpunct_char_vtable;
4059 numpunct_char__Init(this, locinfo, usedef);
4060 return this;
4063 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
4064 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
4065 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
4066 numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
4067 const char *name, size_t refs, bool usedef)
4069 _Locinfo locinfo;
4071 TRACE("(%p %s %Iu %d)\n", this, debugstr_a(name), refs, usedef);
4072 locale_facet_ctor_refs(&this->facet, refs);
4073 this->facet.vtable = &numpunct_char_vtable;
4075 _Locinfo_ctor_cstr(&locinfo, name);
4076 numpunct_char__Init(this, &locinfo, usedef);
4077 _Locinfo_dtor(&locinfo);
4078 return this;
4081 /* ??0?$numpunct@D@std@@QAE@I@Z */
4082 /* ??0?$numpunct@D@std@@QEAA@_K@Z */
4083 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
4084 numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, size_t refs)
4086 TRACE("(%p %Iu)\n", this, refs);
4087 return numpunct_char_ctor_name(this, "C", refs, FALSE);
4090 /* ??_F?$numpunct@D@std@@QAEXXZ */
4091 /* ??_F?$numpunct@D@std@@QEAAXXZ */
4092 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
4093 numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
4095 return numpunct_char_ctor_refs(this, 0);
4098 /* ??1?$numpunct@D@std@@UAE@XZ */
4099 /* ??1?$numpunct@D@std@@UEAA@XZ */
4100 /* ??1?$numpunct@D@std@@MAE@XZ */
4101 /* ??1?$numpunct@D@std@@MEAA@XZ */
4102 DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
4103 void __thiscall numpunct_char_dtor(numpunct_char *this)
4105 TRACE("(%p)\n", this);
4106 numpunct_char__Tidy(this);
4109 DEFINE_THISCALL_WRAPPER(numpunct_char_vector_dtor, 8)
4110 numpunct_char* __thiscall numpunct_char_vector_dtor(numpunct_char *this, unsigned int flags)
4112 TRACE("(%p %x)\n", this, flags);
4113 if(flags & 2) {
4114 /* we have an array, with the number of elements stored before the first object */
4115 INT_PTR i, *ptr = (INT_PTR *)this-1;
4117 for(i=*ptr-1; i>=0; i--)
4118 numpunct_char_dtor(this+i);
4119 operator_delete(ptr);
4120 } else {
4121 numpunct_char_dtor(this);
4122 if(flags & 1)
4123 operator_delete(this);
4126 return this;
4129 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4130 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4131 size_t __cdecl numpunct_char__Getcat(const locale_facet **facet, const locale *loc)
4133 TRACE("(%p %p)\n", facet, loc);
4135 if(facet && !*facet) {
4136 *facet = operator_new(sizeof(numpunct_char));
4137 numpunct_char_ctor_name((numpunct_char*)*facet,
4138 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4141 return LC_NUMERIC;
4144 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@@Z */
4145 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4146 size_t __cdecl numpunct_char__Getcat_old(const locale_facet **facet)
4148 return numpunct_char__Getcat(facet, locale_classic());
4151 static numpunct_char* numpunct_char_use_facet(const locale *loc)
4153 static numpunct_char *obj = NULL;
4155 _Lockit lock;
4156 const locale_facet *fac;
4158 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4159 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_char_id));
4160 if(fac) {
4161 _Lockit_dtor(&lock);
4162 return (numpunct_char*)fac;
4165 if(obj) {
4166 _Lockit_dtor(&lock);
4167 return obj;
4170 numpunct_char__Getcat(&fac, loc);
4171 obj = (numpunct_char*)fac;
4172 call_locale_facet__Incref(&obj->facet);
4173 locale_facet_register(&obj->facet);
4174 _Lockit_dtor(&lock);
4176 return obj;
4179 /* ?do_decimal_point@?$numpunct@D@std@@MBEDXZ */
4180 /* ?do_decimal_point@?$numpunct@D@std@@MEBADXZ */
4181 DEFINE_THISCALL_WRAPPER(numpunct_char_do_decimal_point, 4)
4182 #if _MSVCP_VER <= 100
4183 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4184 char, (const numpunct_char *this), (this))
4185 #else
4186 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4187 char, (const numpunct_char *this), (this))
4188 #endif
4189 char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
4191 TRACE("(%p)\n", this);
4192 return this->dp;
4195 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
4196 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
4197 DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
4198 char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
4200 TRACE("(%p)\n", this);
4201 return call_numpunct_char_do_decimal_point(this);
4204 /* ?do_thousands_sep@?$numpunct@D@std@@MBEDXZ */
4205 /* ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ */
4206 DEFINE_THISCALL_WRAPPER(numpunct_char_do_thousands_sep, 4)
4207 #if _MSVCP_VER <= 100
4208 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4209 char, (const numpunct_char*), (this))
4210 #else
4211 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4212 char, (const numpunct_char*), (this))
4213 #endif
4214 char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
4216 TRACE("(%p)\n", this);
4217 return this->sep;
4220 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
4221 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
4222 DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
4223 char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
4225 TRACE("(%p)\n", this);
4226 return call_numpunct_char_do_thousands_sep(this);
4229 /* ?do_grouping@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4230 /* ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4231 DEFINE_THISCALL_WRAPPER(numpunct_char_do_grouping, 8)
4232 #if _MSVCP_VER <= 100
4233 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4234 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4235 #else
4236 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4237 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4238 #endif
4239 basic_string_char* __thiscall numpunct_char_do_grouping(
4240 const numpunct_char *this, basic_string_char *ret)
4242 TRACE("(%p)\n", this);
4243 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4246 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4247 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4248 DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
4249 basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
4251 TRACE("(%p)\n", this);
4252 return call_numpunct_char_do_grouping(this, ret);
4255 /* ?do_falsename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4256 /* ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4257 DEFINE_THISCALL_WRAPPER(numpunct_char_do_falsename, 8)
4258 #if _MSVCP_VER <= 100
4259 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4260 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4261 #else
4262 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4263 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4264 #endif
4265 basic_string_char* __thiscall numpunct_char_do_falsename(
4266 const numpunct_char *this, basic_string_char *ret)
4268 TRACE("(%p)\n", this);
4269 return MSVCP_basic_string_char_ctor_cstr(ret, this->false_name);
4272 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4273 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4274 DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
4275 basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
4277 TRACE("(%p)\n", this);
4278 return call_numpunct_char_do_falsename(this, ret);
4281 /* ?do_truename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4282 /* ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4283 DEFINE_THISCALL_WRAPPER(numpunct_char_do_truename, 8)
4284 #if _MSVCP_VER <= 100
4285 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4286 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4287 #else
4288 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4289 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4290 #endif
4291 basic_string_char* __thiscall numpunct_char_do_truename(
4292 const numpunct_char *this, basic_string_char *ret)
4294 TRACE("(%p)\n", this);
4295 return MSVCP_basic_string_char_ctor_cstr(ret, this->true_name);
4298 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4299 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4300 DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
4301 basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
4303 TRACE("(%p)\n", this);
4304 return call_numpunct_char_do_truename(this, ret);
4307 /* ?id@?$numpunct@_W@std@@2V0locale@2@A */
4308 locale_id numpunct_wchar_id = {0};
4309 /* ?id@?$numpunct@G@std@@2V0locale@2@A */
4310 locale_id numpunct_short_id = {0};
4312 /* ??_7?$numpunct@_W@std@@6B@ */
4313 extern const vtable_ptr numpunct_wchar_vtable;
4314 /* ??_7?$numpunct@G@std@@6B@ */
4315 extern const vtable_ptr numpunct_short_vtable;
4317 /* ?_Init@?$numpunct@_W@std@@IAEXABV_Locinfo@2@_N@Z */
4318 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4319 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
4320 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4321 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
4322 void __thiscall numpunct_wchar__Init(numpunct_wchar *this,
4323 const _Locinfo *locinfo, bool isdef)
4325 const char *to_convert;
4326 _Cvtvec cvt;
4327 int len;
4329 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4331 _Locinfo__Getcvt(locinfo, &cvt);
4333 to_convert = _Locinfo__Getfalse(locinfo);
4334 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4335 this->false_name = operator_new(len*sizeof(WCHAR));
4336 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4337 (wchar_t*)this->false_name, len);
4339 to_convert = _Locinfo__Gettrue(locinfo);
4340 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4341 this->true_name = operator_new(len*sizeof(WCHAR));
4342 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4343 (wchar_t*)this->true_name, len);
4345 if(isdef) {
4346 this->grouping = operator_new(1);
4347 *(char*)this->grouping = 0;
4349 this->dp = '.';
4350 this->sep = ',';
4351 } else {
4352 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4354 len = strlen(lc->grouping)+1;
4355 this->grouping = operator_new(len);
4356 memcpy((char*)this->grouping, lc->grouping, len);
4358 this->dp = mb_to_wc(lc->decimal_point[0], &cvt);
4359 this->sep = mb_to_wc(lc->thousands_sep[0], &cvt);
4363 /* ?_Tidy@?$numpunct@_W@std@@AAEXXZ */
4364 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
4365 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
4366 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
4367 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
4368 void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
4370 TRACE("(%p)\n", this);
4372 operator_delete((char*)this->grouping);
4373 operator_delete((wchar_t*)this->false_name);
4374 operator_delete((wchar_t*)this->true_name);
4377 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
4378 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4379 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
4380 numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
4381 const _Locinfo *locinfo, size_t refs, bool usedef)
4383 TRACE("(%p %p %Iu %d)\n", this, locinfo, refs, usedef);
4384 locale_facet_ctor_refs(&this->facet, refs);
4385 this->facet.vtable = &numpunct_wchar_vtable;
4386 numpunct_wchar__Init(this, locinfo, usedef);
4387 return this;
4390 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
4391 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4392 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
4393 numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
4394 const _Locinfo *locinfo, size_t refs, bool usedef)
4396 numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
4397 this->facet.vtable = &numpunct_short_vtable;
4398 return this;
4401 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
4402 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
4403 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
4404 numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
4405 const char *name, size_t refs, bool usedef)
4407 _Locinfo locinfo;
4409 TRACE("(%p %s %Iu %d)\n", this, debugstr_a(name), refs, usedef);
4410 locale_facet_ctor_refs(&this->facet, refs);
4411 this->facet.vtable = &numpunct_wchar_vtable;
4413 _Locinfo_ctor_cstr(&locinfo, name);
4414 numpunct_wchar__Init(this, &locinfo, usedef);
4415 _Locinfo_dtor(&locinfo);
4416 return this;
4419 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
4420 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
4421 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
4422 numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
4423 const char *name, size_t refs, bool usedef)
4425 numpunct_wchar_ctor_name(this, name, refs, usedef);
4426 this->facet.vtable = &numpunct_short_vtable;
4427 return this;
4430 /* ??0?$numpunct@_W@std@@QAE@I@Z */
4431 /* ??0?$numpunct@_W@std@@QEAA@_K@Z */
4432 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
4433 numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, size_t refs)
4435 TRACE("(%p %Iu)\n", this, refs);
4436 return numpunct_wchar_ctor_name(this, "C", refs, FALSE);
4439 /* ??0?$numpunct@G@std@@QAE@I@Z */
4440 /* ??0?$numpunct@G@std@@QEAA@_K@Z */
4441 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
4442 numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, size_t refs)
4444 numpunct_wchar_ctor_refs(this, refs);
4445 this->facet.vtable = &numpunct_short_vtable;
4446 return this;
4449 /* ??_F?$numpunct@_W@std@@QAEXXZ */
4450 /* ??_F?$numpunct@_W@std@@QEAAXXZ */
4451 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
4452 numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
4454 return numpunct_wchar_ctor_refs(this, 0);
4457 /* ??_F?$numpunct@G@std@@QAEXXZ */
4458 /* ??_F?$numpunct@G@std@@QEAAXXZ */
4459 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
4460 numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
4462 return numpunct_short_ctor_refs(this, 0);
4465 /* ??1?$numpunct@G@std@@UAE@XZ */
4466 /* ??1?$numpunct@G@std@@UEAA@XZ */
4467 /* ??1?$numpunct@_W@std@@MAE@XZ */
4468 /* ??1?$numpunct@_W@std@@MEAA@XZ */
4469 /* ??1?$numpunct@G@std@@MAE@XZ */
4470 /* ??1?$numpunct@G@std@@MEAA@XZ */
4471 DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
4472 void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
4474 TRACE("(%p)\n", this);
4475 numpunct_wchar__Tidy(this);
4478 DEFINE_THISCALL_WRAPPER(numpunct_wchar_vector_dtor, 8)
4479 numpunct_wchar* __thiscall numpunct_wchar_vector_dtor(numpunct_wchar *this, unsigned int flags)
4481 TRACE("(%p %x)\n", this, flags);
4482 if(flags & 2) {
4483 /* we have an array, with the number of elements stored before the first object */
4484 INT_PTR i, *ptr = (INT_PTR *)this-1;
4486 for(i=*ptr-1; i>=0; i--)
4487 numpunct_wchar_dtor(this+i);
4488 operator_delete(ptr);
4489 } else {
4490 numpunct_wchar_dtor(this);
4491 if(flags & 1)
4492 operator_delete(this);
4495 return this;
4498 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4499 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4500 size_t __cdecl numpunct_wchar__Getcat(const locale_facet **facet, const locale *loc)
4502 TRACE("(%p %p)\n", facet, loc);
4504 if(facet && !*facet) {
4505 *facet = operator_new(sizeof(numpunct_wchar));
4506 numpunct_wchar_ctor_name((numpunct_wchar*)*facet,
4507 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4510 return LC_NUMERIC;
4513 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@@Z */
4514 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4515 size_t __cdecl numpunct_wchar__Getcat_old(const locale_facet **facet)
4517 return numpunct_wchar__Getcat(facet, locale_classic());
4520 static numpunct_wchar* numpunct_wchar_use_facet(const locale *loc)
4522 static numpunct_wchar *obj = NULL;
4524 _Lockit lock;
4525 const locale_facet *fac;
4527 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4528 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_wchar_id));
4529 if(fac) {
4530 _Lockit_dtor(&lock);
4531 return (numpunct_wchar*)fac;
4534 if(obj) {
4535 _Lockit_dtor(&lock);
4536 return obj;
4539 numpunct_wchar__Getcat(&fac, loc);
4540 obj = (numpunct_wchar*)fac;
4541 call_locale_facet__Incref(&obj->facet);
4542 locale_facet_register(&obj->facet);
4543 _Lockit_dtor(&lock);
4545 return obj;
4548 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4549 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4550 size_t __cdecl numpunct_short__Getcat(const locale_facet **facet, const locale *loc)
4552 TRACE("(%p %p)\n", facet, loc);
4554 if(facet && !*facet) {
4555 *facet = operator_new(sizeof(numpunct_wchar));
4556 numpunct_short_ctor_name((numpunct_wchar*)*facet,
4557 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4560 return LC_NUMERIC;
4563 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@@Z */
4564 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4565 size_t __cdecl numpunct_short__Getcat_old(const locale_facet **facet)
4567 return numpunct_short__Getcat(facet, locale_classic());
4570 static numpunct_wchar* numpunct_short_use_facet(const locale *loc)
4572 static numpunct_wchar *obj = NULL;
4574 _Lockit lock;
4575 const locale_facet *fac;
4577 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4578 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_short_id));
4579 if(fac) {
4580 _Lockit_dtor(&lock);
4581 return (numpunct_wchar*)fac;
4584 if(obj) {
4585 _Lockit_dtor(&lock);
4586 return obj;
4589 numpunct_short__Getcat(&fac, loc);
4590 obj = (numpunct_wchar*)fac;
4591 call_locale_facet__Incref(&obj->facet);
4592 locale_facet_register(&obj->facet);
4593 _Lockit_dtor(&lock);
4595 return obj;
4598 /* ?do_decimal_point@?$numpunct@_W@std@@MBE_WXZ */
4599 /* ?do_decimal_point@?$numpunct@_W@std@@MEBA_WXZ */
4600 /* ?do_decimal_point@?$numpunct@G@std@@MBEGXZ */
4601 /* ?do_decimal_point@?$numpunct@G@std@@MEBAGXZ */
4602 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_decimal_point, 4)
4603 #if _MSVCP_VER <= 100
4604 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4605 wchar_t, (const numpunct_wchar *this), (this))
4606 #else
4607 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4608 wchar_t, (const numpunct_wchar *this), (this))
4609 #endif
4610 wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
4612 TRACE("(%p)\n", this);
4613 return this->dp;
4616 /* ?decimal_point@?$numpunct@_W@std@@QBE_WXZ */
4617 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
4618 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
4619 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
4620 DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
4621 wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
4623 TRACE("(%p)\n", this);
4624 return call_numpunct_wchar_do_decimal_point(this);
4627 /* ?do_thousands_sep@?$numpunct@_W@std@@MBE_WXZ */
4628 /* ?do_thousands_sep@?$numpunct@_W@std@@MEBA_WXZ */
4629 /* ?do_thousands_sep@?$numpunct@G@std@@MBEGXZ */
4630 /* ?do_thousands_sep@?$numpunct@G@std@@MEBAGXZ */
4631 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_thousands_sep, 4)
4632 #if _MSVCP_VER <= 100
4633 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4634 wchar_t, (const numpunct_wchar *this), (this))
4635 #else
4636 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4637 wchar_t, (const numpunct_wchar *this), (this))
4638 #endif
4639 wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
4641 TRACE("(%p)\n", this);
4642 return this->sep;
4645 /* ?thousands_sep@?$numpunct@_W@std@@QBE_WXZ */
4646 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
4647 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
4648 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
4649 DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
4650 wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
4652 TRACE("(%p)\n", this);
4653 return call_numpunct_wchar_do_thousands_sep(this);
4656 /* ?do_grouping@?$numpunct@_W@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4657 /* ?do_grouping@?$numpunct@_W@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4658 /* ?do_grouping@?$numpunct@G@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4659 /* ?do_grouping@?$numpunct@G@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4660 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_grouping, 8)
4661 #if _MSVCP_VER <= 100
4662 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4663 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4664 #else
4665 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4666 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4667 #endif
4668 basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *this, basic_string_char *ret)
4670 TRACE("(%p)\n", this);
4671 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4674 /* ?grouping@?$numpunct@_W@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4675 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4676 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4677 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4678 DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
4679 basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
4681 TRACE("(%p)\n", this);
4682 return call_numpunct_wchar_do_grouping(this, ret);
4685 /* ?do_falsename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4686 /* ?do_falsename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4687 /* ?do_falsename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4688 /* ?do_falsename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4689 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_falsename, 8)
4690 #if _MSVCP_VER <= 100
4691 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4692 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4693 #else
4694 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4695 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4696 #endif
4697 basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4699 TRACE("(%p)\n", this);
4700 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->false_name);
4703 /* ?falsename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4704 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4705 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4706 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4707 DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
4708 basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4710 TRACE("(%p)\n", this);
4711 return call_numpunct_wchar_do_falsename(this, ret);
4714 /* ?do_truename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4715 /* ?do_truename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4716 /* ?do_truename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4717 /* ?do_truename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4718 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_truename, 8)
4719 #if _MSVCP_VER <= 100
4720 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4721 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4722 #else
4723 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4724 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4725 #endif
4726 basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4728 TRACE("(%p)\n", this);
4729 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->true_name);
4732 /* ?truename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4733 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4734 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4735 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4736 DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
4737 basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4739 TRACE("(%p)\n", this);
4740 return call_numpunct_wchar_do_truename(this, ret);
4743 double __cdecl _Stod(const char *buf, char **buf_end, LONG exp)
4745 double ret = strtod(buf, buf_end);
4747 if(exp)
4748 ret *= pow(10, exp);
4749 return ret;
4752 double __cdecl _Stodx(const char *buf, char **buf_end, LONG exp, int *err)
4754 double ret;
4756 *err = *_errno();
4757 *_errno() = 0;
4758 ret = _Stod(buf, buf_end, exp);
4759 if(*_errno()) {
4760 *err = *_errno();
4761 }else {
4762 *_errno() = *err;
4763 *err = 0;
4765 return ret;
4768 float __cdecl _Stof(const char *buf, char **buf_end, LONG exp)
4770 return _Stod(buf, buf_end, exp);
4773 float __cdecl _Stofx(const char *buf, char **buf_end, LONG exp, int *err)
4775 return _Stodx(buf, buf_end, exp, err);
4778 __int64 __cdecl _Stoll(const char *buf, char **buf_end, int base)
4780 return _strtoi64(buf, buf_end, base);
4783 __int64 __cdecl _Stollx(const char *buf, char **buf_end, int base, int *err)
4785 __int64 ret;
4787 *err = *_errno();
4788 *_errno() = 0;
4789 ret = _strtoi64(buf, buf_end, base);
4790 if(*_errno()) {
4791 *err = *_errno();
4792 }else {
4793 *_errno() = *err;
4794 *err = 0;
4796 return ret;
4799 LONG __cdecl _Stolx(const char *buf, char **buf_end, int base, int *err)
4801 __int64 i = _Stollx(buf, buf_end, base, err);
4802 if(!*err && i!=(__int64)((LONG)i))
4803 *err = ERANGE;
4804 return i;
4807 unsigned __int64 __cdecl _Stoull(const char *buf, char **buf_end, int base)
4809 return _strtoui64(buf, buf_end, base);
4812 unsigned __int64 __cdecl _Stoullx(const char *buf, char **buf_end, int base, int *err)
4814 unsigned __int64 ret;
4816 *err = *_errno();
4817 *_errno() = 0;
4818 ret = _strtoui64(buf, buf_end, base);
4819 if(*_errno()) {
4820 *err = *_errno();
4821 }else {
4822 *_errno() = *err;
4823 *err = 0;
4825 return ret;
4828 ULONG __cdecl _Stoul(const char *buf, char **buf_end, int base)
4830 int err;
4831 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, &err);
4832 if(!err && i!=(unsigned __int64)((ULONG)i))
4833 *_errno() = ERANGE;
4834 return buf[0]=='-' ? -i : i;
4837 ULONG __cdecl _Stoulx(const char *buf, char **buf_end, int base, int *err)
4839 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, err);
4840 if(!*err && i!=(unsigned __int64)((ULONG)i))
4841 *err = ERANGE;
4842 return buf[0]=='-' ? -i : i;
4845 /* ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
4846 locale_id num_get_wchar_id = {0};
4847 /* ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
4848 locale_id num_get_short_id = {0};
4850 /* ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
4851 extern const vtable_ptr num_get_wchar_vtable;
4852 /* ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
4853 extern const vtable_ptr num_get_short_vtable;
4855 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4856 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4857 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4858 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4859 DEFINE_THISCALL_WRAPPER(num_get_wchar__Init, 8)
4860 void __thiscall num_get_wchar__Init(num_get *this, const _Locinfo *locinfo)
4862 TRACE("(%p %p)\n", this, locinfo);
4863 #if _MSVCP_VER <= 100
4864 _Locinfo__Getcvt(locinfo, &this->cvt);
4865 #endif
4868 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4869 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4870 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_locinfo, 12)
4871 num_get* __thiscall num_get_wchar_ctor_locinfo(num_get *this,
4872 const _Locinfo *locinfo, size_t refs)
4874 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
4876 locale_facet_ctor_refs(&this->facet, refs);
4877 this->facet.vtable = &num_get_wchar_vtable;
4879 num_get_wchar__Init(this, locinfo);
4880 return this;
4883 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4884 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4885 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_locinfo, 12)
4886 num_get* __thiscall num_get_short_ctor_locinfo(num_get *this,
4887 const _Locinfo *locinfo, size_t refs)
4889 num_get_wchar_ctor_locinfo(this, locinfo, refs);
4890 this->facet.vtable = &num_get_short_vtable;
4891 return this;
4894 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
4895 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
4896 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_refs, 8)
4897 num_get* __thiscall num_get_wchar_ctor_refs(num_get *this, size_t refs)
4899 _Locinfo locinfo;
4901 TRACE("(%p %Iu)\n", this, refs);
4903 _Locinfo_ctor(&locinfo);
4904 num_get_wchar_ctor_locinfo(this, &locinfo, refs);
4905 _Locinfo_dtor(&locinfo);
4906 return this;
4909 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
4910 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
4911 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_refs, 8)
4912 num_get* __thiscall num_get_short_ctor_refs(num_get *this, size_t refs)
4914 num_get_wchar_ctor_refs(this, refs);
4915 this->facet.vtable = &num_get_short_vtable;
4916 return this;
4919 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4920 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4921 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor, 4)
4922 num_get* __thiscall num_get_wchar_ctor(num_get *this)
4924 return num_get_wchar_ctor_refs(this, 0);
4927 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4928 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4929 DEFINE_THISCALL_WRAPPER(num_get_short_ctor, 4)
4930 num_get* __thiscall num_get_short_ctor(num_get *this)
4932 return num_get_short_ctor_refs(this, 0);
4935 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
4936 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
4937 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
4938 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
4939 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
4940 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
4941 DEFINE_THISCALL_WRAPPER(num_get_wchar_dtor, 4)
4942 void __thiscall num_get_wchar_dtor(num_get *this)
4944 TRACE("(%p)\n", this);
4945 locale_facet_dtor(&this->facet);
4948 DEFINE_THISCALL_WRAPPER(num_get_wchar_vector_dtor, 8)
4949 num_get* __thiscall num_get_wchar_vector_dtor(num_get *this, unsigned int flags)
4951 TRACE("(%p %x)\n", this, flags);
4952 if(flags & 2) {
4953 /* we have an array, with the number of elements stored before the first object */
4954 INT_PTR i, *ptr = (INT_PTR *)this-1;
4956 for(i=*ptr-1; i>=0; i--)
4957 num_get_wchar_dtor(this+i);
4958 operator_delete(ptr);
4959 } else {
4960 num_get_wchar_dtor(this);
4961 if(flags & 1)
4962 operator_delete(this);
4965 return this;
4968 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4969 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4970 size_t __cdecl num_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
4972 TRACE("(%p %p)\n", facet, loc);
4974 if(facet && !*facet) {
4975 _Locinfo locinfo;
4977 *facet = operator_new(sizeof(num_get));
4978 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
4979 num_get_wchar_ctor_locinfo((num_get*)*facet, &locinfo, 0);
4980 _Locinfo_dtor(&locinfo);
4983 return LC_NUMERIC;
4986 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
4987 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4988 size_t __cdecl num_get_wchar__Getcat_old(const locale_facet **facet)
4990 return num_get_wchar__Getcat(facet, locale_classic());
4993 num_get* num_get_wchar_use_facet(const locale *loc)
4995 static num_get *obj = NULL;
4997 _Lockit lock;
4998 const locale_facet *fac;
5000 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5001 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_wchar_id));
5002 if(fac) {
5003 _Lockit_dtor(&lock);
5004 return (num_get*)fac;
5007 if(obj) {
5008 _Lockit_dtor(&lock);
5009 return obj;
5012 num_get_wchar__Getcat(&fac, loc);
5013 obj = (num_get*)fac;
5014 call_locale_facet__Incref(&obj->facet);
5015 locale_facet_register(&obj->facet);
5016 _Lockit_dtor(&lock);
5018 return obj;
5021 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
5022 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
5023 size_t __cdecl num_get_short__Getcat(const locale_facet **facet, const locale *loc)
5025 if(facet && !*facet) {
5026 num_get_wchar__Getcat(facet, loc);
5027 (*(locale_facet**)facet)->vtable = &num_get_short_vtable;
5030 return LC_NUMERIC;
5033 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
5034 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
5035 size_t __cdecl num_get_short__Getcat_old(const locale_facet **facet)
5037 return num_get_short__Getcat(facet, locale_classic());
5040 num_get* num_get_short_use_facet(const locale *loc)
5042 static num_get *obj = NULL;
5044 _Lockit lock;
5045 const locale_facet *fac;
5047 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5048 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_short_id));
5049 if(fac) {
5050 _Lockit_dtor(&lock);
5051 return (num_get*)fac;
5054 if(obj) {
5055 _Lockit_dtor(&lock);
5056 return obj;
5059 num_get_short__Getcat(&fac, loc);
5060 obj = (num_get*)fac;
5061 call_locale_facet__Incref(&obj->facet);
5062 locale_facet_register(&obj->facet);
5063 _Lockit_dtor(&lock);
5065 return obj;
5068 static int num_get__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5069 istreambuf_iterator_wchar *last, const locale *loc, numpunct_wchar *numpunct)
5071 basic_string_char grouping_bstr;
5072 basic_string_char groups_found;
5073 int i, groups_no = 0, cur_group = 0, exp = 0;
5074 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31;
5075 wchar_t sep = 0, digits[11], *digits_pos;
5076 const char *grouping, *groups;
5077 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
5078 const _Cvtvec *cvt;
5080 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
5082 #if _MSVCP_VER <= 100
5083 cvt = &this->cvt;
5084 #else
5085 cvt = &ctype_wchar_use_facet(loc)->cvt;
5086 #endif
5088 for(i=0; i<10; i++)
5089 digits[i] = mb_to_wc('0'+i, cvt);
5090 digits[10] = 0;
5092 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5093 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5094 #if _MSVCP_VER >= 70
5095 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5096 #endif
5098 if(sep)
5099 MSVCP_basic_string_char_ctor(&groups_found);
5101 istreambuf_iterator_wchar_val(first);
5102 /* get sign */
5103 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5104 *dest++ = '-';
5105 istreambuf_iterator_wchar_inc(first);
5106 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5107 *dest++ = '+';
5108 istreambuf_iterator_wchar_inc(first);
5111 /* read possibly grouped numbers before decimal */
5112 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5113 if(!(digits_pos = wcschr(digits, first->val))) {
5114 if(sep && first->val==sep) {
5115 if(!groups_no) break; /* empty group - stop parsing */
5116 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5117 groups_no = 0;
5118 ++cur_group;
5119 }else {
5120 break;
5122 }else {
5123 got_digit = TRUE; /* found a digit, zero or non-zero */
5124 /* write digit to dest if not a leading zero (to not waste dest buffer) */
5125 if(!got_nonzero && first->val == digits[0])
5127 ++groups_no;
5128 continue;
5130 got_nonzero = TRUE;
5131 if(dest < num_end)
5132 *dest++ = '0'+digits_pos-digits;
5133 else
5134 exp++; /* too many digits, just multiply by 10 */
5135 if(sep && groups_no<CHAR_MAX)
5136 ++groups_no;
5140 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
5141 if(got_digit && !got_nonzero)
5142 *dest++ = '0';
5144 /* get decimal, if any */
5145 if(first->strbuf && first->val==numpunct_wchar_decimal_point(numpunct)) {
5146 if(dest < num_end)
5147 *dest++ = *localeconv()->decimal_point;
5148 istreambuf_iterator_wchar_inc(first);
5151 /* read non-grouped after decimal */
5152 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5153 if(!(digits_pos = wcschr(digits, first->val)))
5154 break;
5155 else if(dest<num_end) {
5156 got_digit = TRUE;
5157 *dest++ = '0'+digits_pos-digits;
5161 /* read exponent, if any */
5162 if(first->strbuf && (first->val==mb_to_wc('e', cvt) || first->val==mb_to_wc('E', cvt))) {
5163 *dest++ = 'e';
5164 istreambuf_iterator_wchar_inc(first);
5166 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5167 *dest++ = '-';
5168 istreambuf_iterator_wchar_inc(first);
5169 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5170 *dest++ = '+';
5171 istreambuf_iterator_wchar_inc(first);
5174 got_digit = got_nonzero = FALSE;
5175 error = TRUE;
5176 /* skip any leading zeroes */
5177 for(; first->strbuf && first->val==digits[0]; istreambuf_iterator_wchar_inc(first))
5178 error = FALSE;
5180 for(; first->strbuf && (digits_pos = wcschr(digits, first->val)); istreambuf_iterator_wchar_inc(first)) {
5181 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
5182 error = FALSE;
5183 if(dest<exp_end)
5184 *dest++ = '0'+digits_pos-digits;
5187 /* if just found zeroes for exponent, use that */
5188 if(got_digit && !got_nonzero)
5190 error = FALSE;
5191 if(dest<exp_end)
5192 *dest++ = '0';
5196 if(sep && groups_no)
5197 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5199 if(!cur_group) /* no groups, skip loop */
5200 cur_group--;
5201 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
5202 error = TRUE; /* trailing empty */
5204 for(; cur_group>=0 && !error; cur_group--) {
5205 if(*grouping == CHAR_MAX) {
5206 if(cur_group)
5207 error = TRUE;
5208 break;
5209 }else if((cur_group && *grouping!=groups[cur_group])
5210 || (!cur_group && *grouping<groups[cur_group])) {
5211 error = TRUE;
5212 break;
5213 }else if(grouping[1]) {
5214 grouping++;
5217 MSVCP_basic_string_char_dtor(&grouping_bstr);
5218 if(sep)
5219 MSVCP_basic_string_char_dtor(&groups_found);
5221 if(error) {
5222 *dest_beg = '\0';
5223 return 0;
5225 *dest++ = '\0';
5226 return exp;
5229 /* ?_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 */
5230 /* ?_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 */
5231 int __cdecl num_get_wchar__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5232 istreambuf_iterator_wchar *last, const locale *loc)
5234 return num_get__Getffld(this, dest, first, last, loc, numpunct_wchar_use_facet(loc));
5237 /* ?_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 */
5238 /* ?_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 */
5239 int __cdecl num_get_short__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5240 istreambuf_iterator_wchar *last, const locale *loc)
5242 return num_get__Getffld(this, dest, first, last, loc, numpunct_short_use_facet(loc));
5245 /* ?_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 */
5246 /* ?_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 */
5247 /* ?_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 */
5248 /* ?_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 */
5249 int __cdecl num_get_wchar__Getffldx(num_get *this, char *dest, istreambuf_iterator_wchar *first,
5250 istreambuf_iterator_wchar *last, ios_base *ios, int *phexexp)
5252 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
5253 return -1;
5256 static int num_get__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5257 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc, numpunct_wchar *numpunct)
5259 wchar_t digits[23], *digits_pos, sep = 0;
5260 basic_string_char grouping_bstr;
5261 basic_string_char groups_found;
5262 int i, basefield, base, groups_no = 0, cur_group = 0;
5263 char *dest_beg = dest, *dest_end = dest+24;
5264 const char *grouping, *groups;
5265 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
5266 const _Cvtvec *cvt;
5268 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
5270 #if _MSVCP_VER <= 100
5271 cvt = &this->cvt;
5272 #else
5273 cvt = &ctype_wchar_use_facet(loc)->cvt;
5274 #endif
5276 for(i=0; i<10; i++)
5277 digits[i] = mb_to_wc('0'+i, cvt);
5278 for(i=0; i<6; i++) {
5279 digits[10+i] = mb_to_wc('a'+i, cvt);
5280 digits[16+i] = mb_to_wc('A'+i, cvt);
5283 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5284 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5285 #if _MSVCP_VER >= 70
5286 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5287 #endif
5289 basefield = fmtflags & FMTFLAG_basefield;
5290 if(basefield == FMTFLAG_oct)
5291 base = 8;
5292 else if(basefield == FMTFLAG_hex)
5293 base = 22; /* equal to the size of digits buffer */
5294 else if(!basefield)
5295 base = 0;
5296 else
5297 base = 10;
5299 istreambuf_iterator_wchar_val(first);
5300 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5301 *dest++ = '-';
5302 istreambuf_iterator_wchar_inc(first);
5303 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5304 *dest++ = '+';
5305 istreambuf_iterator_wchar_inc(first);
5308 if(first->strbuf && first->val==digits[0]) {
5309 found_zero = TRUE;
5310 istreambuf_iterator_wchar_inc(first);
5311 if(first->strbuf && (first->val==mb_to_wc('x', cvt) || first->val==mb_to_wc('X', cvt))) {
5312 if(!base || base == 22) {
5313 found_zero = FALSE;
5314 istreambuf_iterator_wchar_inc(first);
5315 base = 22;
5316 }else {
5317 base = 10;
5319 }else {
5320 error = FALSE;
5321 if(!base) base = 8;
5323 }else {
5324 if(!base) base = 10;
5326 digits[base] = 0;
5328 if(sep) {
5329 MSVCP_basic_string_char_ctor(&groups_found);
5330 if(found_zero) ++groups_no;
5333 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5334 if(!(digits_pos = wcschr(digits, first->val))) {
5335 if(sep && first->val==sep) {
5336 if(!groups_no) break; /* empty group - stop parsing */
5337 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5338 groups_no = 0;
5339 ++cur_group;
5340 }else {
5341 break;
5343 }else {
5344 error = FALSE;
5345 if(dest_empty && first->val == digits[0]) {
5346 found_zero = TRUE;
5347 ++groups_no;
5348 continue;
5350 dest_empty = FALSE;
5351 /* skip digits that can't be copied to dest buffer, other
5352 * functions are responsible for detecting overflows */
5353 if(dest < dest_end)
5354 *dest++ = (digits_pos-digits<10 ? '0'+digits_pos-digits :
5355 (digits_pos-digits<16 ? 'a'+digits_pos-digits-10 :
5356 'A'+digits_pos-digits-16));
5357 if(sep && groups_no<CHAR_MAX)
5358 ++groups_no;
5362 if(sep && groups_no)
5363 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5365 if(!cur_group) { /* no groups, skip loop */
5366 cur_group--;
5367 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
5368 error = TRUE; /* trailing empty */
5369 found_zero = FALSE;
5372 for(; cur_group>=0 && !error; cur_group--) {
5373 if(*grouping == CHAR_MAX) {
5374 if(cur_group)
5375 error = TRUE;
5376 break;
5377 }else if((cur_group && *grouping!=groups[cur_group])
5378 || (!cur_group && *grouping<groups[cur_group])) {
5379 error = TRUE;
5380 break;
5381 }else if(grouping[1]) {
5382 grouping++;
5386 MSVCP_basic_string_char_dtor(&grouping_bstr);
5387 if(sep)
5388 MSVCP_basic_string_char_dtor(&groups_found);
5390 if(error) {
5391 if (found_zero)
5392 *dest++ = '0';
5393 else
5394 dest = dest_beg;
5395 }else if(dest_empty)
5396 *dest++ = '0';
5397 *dest = '\0';
5399 return (base==22 ? 16 : base);
5402 /* ?_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 */
5403 /* ?_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 */
5404 int __cdecl num_get_wchar__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5405 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5407 return num_get__Getifld(this, dest, first, last,
5408 fmtflags, loc, numpunct_wchar_use_facet(loc));
5411 /* ?_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 */
5412 /* ?_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 */
5413 int __cdecl num_get_short__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5414 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5416 return num_get__Getifld(this, dest, first, last,
5417 fmtflags, loc, numpunct_short_use_facet(loc));
5420 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABEH_W000@Z */
5421 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAH_W000@Z */
5422 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABEHGGGG@Z */
5423 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHGGGG@Z */
5424 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar__Hexdig, 20)
5425 int __thiscall MSVCP_num_get_wchar__Hexdig(num_get *this, wchar_t dig, wchar_t e0, wchar_t al, wchar_t au)
5427 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
5428 return -1;
5431 static istreambuf_iterator_wchar* num_get_do_get_void(const num_get *this,
5432 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5433 istreambuf_iterator_wchar last, ios_base *base, int *state,
5434 void **pval, numpunct_wchar *numpunct)
5436 unsigned __int64 v;
5437 char tmp[25], *end;
5438 int err;
5440 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5442 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5443 &last, FMTFLAG_hex, IOS_LOCALE(base), numpunct), &err);
5444 if(v!=(unsigned __int64)((INT_PTR)v))
5445 *state |= IOSTATE_failbit;
5446 else if(end!=tmp && !err)
5447 *pval = (void*)((INT_PTR)v);
5448 else
5449 *state |= IOSTATE_failbit;
5451 if(!first.strbuf)
5452 *state |= IOSTATE_eofbit;
5454 *ret = first;
5455 return ret;
5458 /* ?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 */
5459 /* ?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 */
5460 #if _MSVCP_VER <= 100
5461 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_wchar*, \
5462 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5463 (this, ret, first, last, base, state, pval))
5464 #else
5465 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5466 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5467 (this, ret, first, last, base, state, pval))
5468 #endif
5469 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_void,36)
5470 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5471 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5473 return num_get_do_get_void(this, ret, first, last, base,
5474 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5477 /* ?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 */
5478 /* ?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 */
5479 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_void,36)
5480 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5481 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5483 return num_get_do_get_void(this, ret, first, last, base,
5484 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5487 /* ?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 */
5488 /* ?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 */
5489 /* ?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 */
5490 /* ?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 */
5491 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_void,36)
5492 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5493 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5495 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5496 return call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval);
5499 static istreambuf_iterator_wchar* num_get_do_get_double(const num_get *this,
5500 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5501 istreambuf_iterator_wchar last, ios_base *base, int *state,
5502 double *pval, numpunct_wchar *numpunct)
5504 double v;
5505 char tmp[32], *end;
5506 int err;
5508 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5510 v = _Stodx(tmp, &end, num_get__Getffld(this, tmp, &first, &last, IOS_LOCALE(base), numpunct), &err);
5511 if(end!=tmp && !err)
5512 *pval = v;
5513 else
5514 *state |= IOSTATE_failbit;
5516 if(!first.strbuf)
5517 *state |= IOSTATE_eofbit;
5519 *ret = first;
5520 return ret;
5523 /* ?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 */
5524 /* ?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 */
5525 /* ?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 */
5526 /* ?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 */
5527 #if _MSVCP_VER <= 100
5528 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
5529 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5530 (this, ret, first, last, base, state, pval))
5531 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5532 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5533 (this, ret, first, last, base, state, pval))
5534 #else
5535 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5536 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5537 (this, ret, first, last, base, state, pval))
5538 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5539 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5540 (this, ret, first, last, base, state, pval))
5541 #endif
5542 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_double,36)
5543 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5544 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5546 return num_get_do_get_double(this, ret, first, last, base,
5547 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5550 /* ?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 */
5551 /* ?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 */
5552 /* ?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 */
5553 /* ?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 */
5554 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_double,36)
5555 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5556 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5558 return num_get_do_get_double(this, ret, first, last, base,
5559 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5562 /* ?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 */
5563 /* ?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 */
5564 /* ?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 */
5565 /* ?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 */
5566 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ldouble,36)
5567 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ldouble(const num_get *this, istreambuf_iterator_wchar *ret,
5568 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5570 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5571 return call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval);
5574 /* ?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 */
5575 /* ?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 */
5576 /* ?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 */
5577 /* ?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 */
5578 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_double,36)
5579 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5580 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5582 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5583 return call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval);
5586 static istreambuf_iterator_wchar* num_get_do_get_float(const num_get *this,
5587 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5588 istreambuf_iterator_wchar last, ios_base *base, int *state,
5589 float *pval, numpunct_wchar *numpunct)
5591 float v;
5592 char tmp[32], *end;
5593 int err;
5595 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5597 v = _Stofx(tmp, &end, num_get__Getffld(this, tmp, &first,
5598 &last, IOS_LOCALE(base), numpunct), &err);
5599 if(end!=tmp && !err)
5600 *pval = v;
5601 else
5602 *state |= IOSTATE_failbit;
5604 if(!first.strbuf)
5605 *state |= IOSTATE_eofbit;
5607 *ret = first;
5608 return ret;
5611 /* ?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 */
5612 /* ?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 */
5613 #if _MSVCP_VER <= 100
5614 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5615 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5616 (this, ret, first, last, base, state, pval))
5617 #else
5618 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5619 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5620 (this, ret, first, last, base, state, pval))
5621 #endif
5622 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_float,36)
5623 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5624 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5626 return num_get_do_get_float(this, ret, first, last, base,
5627 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5630 /* ?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 */
5631 /* ?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 */
5632 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_float,36)
5633 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5634 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5636 return num_get_do_get_float(this, ret, first, last, base,
5637 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5640 /* ?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 */
5641 /* ?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 */
5642 /* ?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 */
5643 /* ?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 */
5644 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_float,36)
5645 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5646 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5648 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5649 return call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval);
5652 static istreambuf_iterator_wchar* num_get_do_get_uint64(const num_get *this,
5653 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5654 istreambuf_iterator_wchar last, ios_base *base, int *state,
5655 ULONGLONG *pval, numpunct_wchar *numpunct)
5657 unsigned __int64 v;
5658 char tmp[25], *end;
5659 int err;
5661 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5663 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5664 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5665 if(end!=tmp && !err)
5666 *pval = v;
5667 else
5668 *state |= IOSTATE_failbit;
5670 if(!first.strbuf)
5671 *state |= IOSTATE_eofbit;
5673 *ret = first;
5674 return ret;
5677 /* ?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 */
5678 /* ?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 */
5679 #if _MSVCP_VER <= 100
5680 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5681 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5682 (this, ret, first, last, base, state, pval))
5683 #else
5684 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5685 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5686 (this, ret, first, last, base, state, pval))
5687 #endif
5688 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint64,36)
5689 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5690 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5692 return num_get_do_get_uint64(this, ret, first, last, base,
5693 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5696 /* ?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 */
5697 /* ?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 */
5698 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint64,36)
5699 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5700 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5702 return num_get_do_get_uint64(this, ret, first, last, base,
5703 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5706 /* ?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 */
5707 /* ?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 */
5708 /* ?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 */
5709 /* ?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 */
5710 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint64,36)
5711 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5712 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5714 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5715 return call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval);
5718 static istreambuf_iterator_wchar* num_get_do_get_int64(const num_get *this,
5719 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5720 istreambuf_iterator_wchar last, ios_base *base, int *state,
5721 LONGLONG *pval, numpunct_wchar *numpunct)
5723 __int64 v;
5724 char tmp[25], *end;
5725 int err;
5727 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5729 v = _Stollx(tmp, &end, num_get__Getifld(this, tmp, &first,
5730 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5731 if(end!=tmp && !err)
5732 *pval = v;
5733 else
5734 *state |= IOSTATE_failbit;
5736 if(!first.strbuf)
5737 *state |= IOSTATE_eofbit;
5739 *ret = first;
5740 return ret;
5743 /* ?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 */
5744 /* ?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 */
5745 #if _MSVCP_VER <= 100
5746 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5747 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5748 (this, ret, first, last, base, state, pval))
5749 #else
5750 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5751 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5752 (this, ret, first, last, base, state, pval))
5753 #endif
5754 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_int64,36)
5755 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5756 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5758 return num_get_do_get_int64(this, ret, first, last, base,
5759 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5762 /* ?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 */
5763 /* ?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 */
5764 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_int64,36)
5765 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5766 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5768 return num_get_do_get_int64(this, ret, first, last, base,
5769 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5772 /* ?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 */
5773 /* ?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 */
5774 /* ?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 */
5775 /* ?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 */
5776 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_int64,36)
5777 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5778 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5780 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5781 return call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval);
5784 static istreambuf_iterator_wchar* num_get_do_get_ulong(const num_get *this,
5785 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5786 istreambuf_iterator_wchar last, ios_base *base, int *state,
5787 ULONG *pval, numpunct_wchar *numpunct)
5789 ULONG v;
5790 char tmp[25], *end;
5791 int err;
5793 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5795 v = _Stoulx(tmp, &end, num_get__Getifld(this, tmp, &first,
5796 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5797 if(end!=tmp && !err)
5798 *pval = v;
5799 else
5800 *state |= IOSTATE_failbit;
5802 if(!first.strbuf)
5803 *state |= IOSTATE_eofbit;
5805 *ret = first;
5806 return ret;
5809 /* ?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 */
5810 /* ?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 */
5811 #if _MSVCP_VER <= 100
5812 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5813 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5814 (this, ret, first, last, base, state, pval))
5815 #else
5816 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
5817 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5818 (this, ret, first, last, base, state, pval))
5819 #endif
5820 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ulong,36)
5821 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5822 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5824 return num_get_do_get_ulong(this, ret, first, last, base,
5825 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5828 /* ?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 */
5829 /* ?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 */
5830 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ulong,36)
5831 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5832 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5834 return num_get_do_get_ulong(this, ret, first, last, base,
5835 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5838 /* ?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 */
5839 /* ?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 */
5840 /* ?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 */
5841 /* ?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 */
5842 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ulong,36)
5843 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5844 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5846 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5847 return call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval);
5850 static istreambuf_iterator_wchar* num_get_do_get_long(const num_get *this,
5851 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5852 istreambuf_iterator_wchar last, ios_base *base, int *state,
5853 LONG *pval, numpunct_wchar *numpunct)
5855 LONG v;
5856 char tmp[25], *end;
5857 int err;
5859 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5861 v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
5862 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5863 if(end!=tmp && !err)
5864 *pval = v;
5865 else
5866 *state |= IOSTATE_failbit;
5868 if(!first.strbuf)
5869 *state |= IOSTATE_eofbit;
5871 *ret = first;
5872 return ret;
5875 /* ?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 */
5876 /* ?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 */
5877 #if _MSVCP_VER <= 100
5878 #define call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5879 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONG*), \
5880 (this, ret, first, last, base, state, pval))
5881 #else
5882 #define call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_wchar*, \
5883 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONG*), \
5884 (this, ret, first, last, base, state, pval))
5885 #endif
5886 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_long,36)
5887 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5888 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5890 return num_get_do_get_long(this, ret, first, last, base,
5891 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5894 /* ?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 */
5895 /* ?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 */
5896 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_long,36)
5897 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5898 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5900 return num_get_do_get_long(this, ret, first, last, base,
5901 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5904 /* ?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 */
5905 /* ?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 */
5906 /* ?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 */
5907 /* ?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 */
5908 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_long,36)
5909 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5910 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5912 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5913 return call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval);
5916 /* ?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 */
5917 /* ?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 */
5918 #if _MSVCP_VER <= 100
5919 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
5920 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
5921 (this, ret, first, last, base, state, pval))
5922 #else
5923 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
5924 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
5925 (this, ret, first, last, base, state, pval))
5926 #endif
5927 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint,36)
5928 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
5929 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
5931 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5932 return num_get_wchar_do_get_ulong(this, ret, first, last, base, state, (ULONG*)pval);
5935 /* ?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 */
5936 /* ?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 */
5937 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint,36)
5938 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
5939 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
5941 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5942 return num_get_short_do_get_ulong(this, ret, first, last, base, state, (ULONG*)pval);
5945 /* ?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 */
5946 /* ?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 */
5947 /* ?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 */
5948 /* ?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 */
5949 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint,36)
5950 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
5951 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
5953 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5954 return call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval);
5957 /* ?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 */
5958 /* ?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 */
5959 #if _MSVCP_VER <= 100
5960 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_wchar*, \
5961 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
5962 (this, ret, first, last, base, state, pval))
5963 #else
5964 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_wchar*, \
5965 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
5966 (this, ret, first, last, base, state, pval))
5967 #endif
5968 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ushort,36)
5969 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
5970 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
5972 ULONG v;
5973 char tmp[25], *beg, *end;
5974 int err, b;
5976 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5978 b = num_get_wchar__Getifld(this, tmp,
5979 &first, &last, base->fmtfl, IOS_LOCALE(base));
5980 beg = tmp + (tmp[0]=='-' ? 1 : 0);
5981 v = _Stoulx(beg, &end, b, &err);
5983 if(v != (ULONG)((unsigned short)v))
5984 *state |= IOSTATE_failbit;
5985 else if(end!=beg && !err)
5986 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
5987 else
5988 *state |= IOSTATE_failbit;
5990 if(!first.strbuf)
5991 *state |= IOSTATE_eofbit;
5993 *ret = first;
5994 return ret;
5997 /* ?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 */
5998 /* ?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 */
5999 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ushort,36)
6000 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6001 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6003 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
6004 return ret;
6007 /* ?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 */
6008 /* ?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 */
6009 /* ?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@ */
6010 /* ?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 */
6011 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ushort,36)
6012 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6013 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6015 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6016 return call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval);
6019 static istreambuf_iterator_wchar* num_get_do_get_bool(const num_get *this,
6020 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
6021 istreambuf_iterator_wchar last, ios_base *base, int *state,
6022 bool *pval, numpunct_wchar *numpunct)
6024 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6026 if(base->fmtfl & FMTFLAG_boolalpha) {
6027 basic_string_wchar false_bstr, true_bstr;
6028 const wchar_t *pfalse, *ptrue;
6030 numpunct_wchar_falsename(numpunct, &false_bstr);
6031 numpunct_wchar_truename(numpunct, &true_bstr);
6032 pfalse = MSVCP_basic_string_wchar_c_str(&false_bstr);
6033 ptrue = MSVCP_basic_string_wchar_c_str(&true_bstr);
6035 for(istreambuf_iterator_wchar_val(&first); first.strbuf;) {
6036 if(pfalse && *pfalse && first.val!=*pfalse)
6037 pfalse = NULL;
6038 if(ptrue && *ptrue && first.val!=*ptrue)
6039 ptrue = NULL;
6041 if(pfalse && *pfalse && ptrue && !*ptrue)
6042 ptrue = NULL;
6043 if(ptrue && *ptrue && pfalse && !*pfalse)
6044 pfalse = NULL;
6046 if(pfalse)
6047 pfalse++;
6048 if(ptrue)
6049 ptrue++;
6051 if(pfalse || ptrue)
6052 istreambuf_iterator_wchar_inc(&first);
6054 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
6055 break;
6058 if(ptrue)
6059 *pval = TRUE;
6060 else if(pfalse)
6061 *pval = FALSE;
6062 else
6063 *state |= IOSTATE_failbit;
6065 MSVCP_basic_string_wchar_dtor(&false_bstr);
6066 MSVCP_basic_string_wchar_dtor(&true_bstr);
6067 }else {
6068 char tmp[25], *end;
6069 int err;
6070 LONG v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
6071 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
6073 if(end!=tmp && err==0 && (v==0 || v==1))
6074 *pval = v;
6075 else
6076 *state |= IOSTATE_failbit;
6079 if(!first.strbuf)
6080 *state |= IOSTATE_eofbit;
6081 memcpy(ret, &first, sizeof(first));
6082 return ret;
6085 /* ?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 */
6086 /* ?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 */
6087 #if _MSVCP_VER <= 100
6088 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
6089 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, bool*), \
6090 (this, ret, first, last, base, state, pval))
6091 #else
6092 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_wchar*, \
6093 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, bool*), \
6094 (this, ret, first, last, base, state, pval))
6095 #endif
6096 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_bool,36)
6097 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6098 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6100 return num_get_do_get_bool(this, ret, first, last, base,
6101 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
6104 /* ?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 */
6105 /* ?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 */
6106 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_bool,36)
6107 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6108 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6110 return num_get_do_get_bool(this, ret, first, last, base,
6111 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
6114 /* ?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 */
6115 /* ?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 */
6116 /* ?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 */
6117 /* ?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 */
6118 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_bool,36)
6119 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6120 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6122 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6123 return call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval);
6126 /* ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
6127 locale_id num_get_char_id = {0};
6129 /* ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
6130 extern const vtable_ptr num_get_char_vtable;
6132 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
6133 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
6134 DEFINE_THISCALL_WRAPPER(num_get_char__Init, 8)
6135 void __thiscall num_get_char__Init(num_get *this, const _Locinfo *locinfo)
6137 TRACE("(%p %p)\n", this, locinfo);
6138 #if _MSVCP_VER <= 100
6139 _Locinfo__Getcvt(locinfo, &this->cvt);
6140 #endif
6143 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
6144 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
6145 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_locinfo, 12)
6146 num_get* __thiscall num_get_char_ctor_locinfo(num_get *this,
6147 const _Locinfo *locinfo, size_t refs)
6149 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
6151 locale_facet_ctor_refs(&this->facet, refs);
6152 this->facet.vtable = &num_get_char_vtable;
6154 num_get_char__Init(this, locinfo);
6155 return this;
6158 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
6159 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
6160 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_refs, 8)
6161 num_get* __thiscall num_get_char_ctor_refs(num_get *this, size_t refs)
6163 _Locinfo locinfo;
6165 TRACE("(%p %Iu)\n", this, refs);
6167 _Locinfo_ctor(&locinfo);
6168 num_get_char_ctor_locinfo(this, &locinfo, refs);
6169 _Locinfo_dtor(&locinfo);
6170 return this;
6173 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
6174 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
6175 DEFINE_THISCALL_WRAPPER(num_get_char_ctor, 4)
6176 num_get* __thiscall num_get_char_ctor(num_get *this)
6178 return num_get_char_ctor_refs(this, 0);
6181 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
6182 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
6183 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
6184 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
6185 DEFINE_THISCALL_WRAPPER(num_get_char_dtor, 4)
6186 void __thiscall num_get_char_dtor(num_get *this)
6188 TRACE("(%p)\n", this);
6189 locale_facet_dtor(&this->facet);
6192 DEFINE_THISCALL_WRAPPER(num_get_char_vector_dtor, 8)
6193 num_get* __thiscall num_get_char_vector_dtor(num_get *this, unsigned int flags)
6195 TRACE("(%p %x)\n", this, flags);
6196 if(flags & 2) {
6197 /* we have an array, with the number of elements stored before the first object */
6198 INT_PTR i, *ptr = (INT_PTR *)this-1;
6200 for(i=*ptr-1; i>=0; i--)
6201 num_get_char_dtor(this+i);
6202 operator_delete(ptr);
6203 } else {
6204 num_get_char_dtor(this);
6205 if(flags & 1)
6206 operator_delete(this);
6209 return this;
6212 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
6213 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
6214 size_t __cdecl num_get_char__Getcat(const locale_facet **facet, const locale *loc)
6216 TRACE("(%p %p)\n", facet, loc);
6218 if(facet && !*facet) {
6219 _Locinfo locinfo;
6221 *facet = operator_new(sizeof(num_get));
6222 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
6223 num_get_char_ctor_locinfo((num_get*)*facet, &locinfo, 0);
6224 _Locinfo_dtor(&locinfo);
6227 return LC_NUMERIC;
6230 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
6231 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
6232 size_t __cdecl num_get_char__Getcat_old(const locale_facet **facet)
6234 return num_get_char__Getcat(facet, locale_classic());
6237 num_get* num_get_char_use_facet(const locale *loc)
6239 static num_get *obj = NULL;
6241 _Lockit lock;
6242 const locale_facet *fac;
6244 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
6245 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_char_id));
6246 if(fac) {
6247 _Lockit_dtor(&lock);
6248 return (num_get*)fac;
6251 if(obj) {
6252 _Lockit_dtor(&lock);
6253 return obj;
6256 num_get_char__Getcat(&fac, loc);
6257 obj = (num_get*)fac;
6258 call_locale_facet__Incref(&obj->facet);
6259 locale_facet_register(&obj->facet);
6260 _Lockit_dtor(&lock);
6262 return obj;
6265 /* ?_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 */
6266 /* ?_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 */
6267 /* Copies number to dest buffer, validates grouping and skips separators.
6268 * Updates first so it points past the number, all digits are skipped.
6269 * Returns how exponent needs to changed.
6270 * Size of dest buffer is not specified, assuming it's not smaller than 32:
6271 * strlen(+0.e+) + 22(digits) + 4(exponent) + 1(nullbyte)
6273 int __cdecl num_get_char__Getffld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6274 istreambuf_iterator_char *last, const locale *loc)
6276 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6277 basic_string_char grouping_bstr;
6278 basic_string_char groups_found;
6279 int groups_no = 0, cur_group = 0, exp = 0;
6280 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31, sep = 0;
6281 const char *grouping, *groups;
6282 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
6284 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
6286 numpunct_char_grouping(numpunct, &grouping_bstr);
6287 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6288 #if _MSVCP_VER >= 70
6289 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6290 #endif
6292 if(sep)
6293 MSVCP_basic_string_char_ctor(&groups_found);
6295 istreambuf_iterator_char_val(first);
6296 /* get sign */
6297 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6298 *dest++ = first->val;
6299 istreambuf_iterator_char_inc(first);
6302 /* read possibly grouped numbers before decimal */
6303 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6304 if(first->val<'0' || first->val>'9') {
6305 if(sep && first->val==sep) {
6306 if(!groups_no) break; /* empty group - stop parsing */
6307 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6308 groups_no = 0;
6309 ++cur_group;
6310 }else {
6311 break;
6313 }else {
6314 got_digit = TRUE; /* found a digit, zero or non-zero */
6315 /* write digit to dest if not a leading zero (to not waste dest buffer) */
6316 if(!got_nonzero && first->val == '0')
6318 ++groups_no;
6319 continue;
6321 got_nonzero = TRUE;
6322 if(dest < num_end)
6323 *dest++ = first->val;
6324 else
6325 exp++; /* too many digits, just multiply by 10 */
6326 if(sep && groups_no<CHAR_MAX)
6327 ++groups_no;
6331 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
6332 if(got_digit && !got_nonzero)
6333 *dest++ = '0';
6335 /* get decimal, if any */
6336 if(first->strbuf && first->val==numpunct_char_decimal_point(numpunct)) {
6337 if(dest < num_end)
6338 *dest++ = *localeconv()->decimal_point;
6339 istreambuf_iterator_char_inc(first);
6342 /* read non-grouped after decimal */
6343 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6344 if(first->val<'0' || first->val>'9')
6345 break;
6346 else if(dest<num_end) {
6347 got_digit = TRUE;
6348 *dest++ = first->val;
6352 /* read exponent, if any */
6353 if(first->strbuf && (first->val=='e' || first->val=='E')) {
6354 *dest++ = first->val;
6355 istreambuf_iterator_char_inc(first);
6357 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6358 *dest++ = first->val;
6359 istreambuf_iterator_char_inc(first);
6362 got_digit = got_nonzero = FALSE;
6363 error = TRUE;
6364 /* skip any leading zeroes */
6365 for(; first->strbuf && first->val=='0'; istreambuf_iterator_char_inc(first))
6366 got_digit = TRUE;
6368 for(; first->strbuf && first->val>='0' && first->val<='9'; istreambuf_iterator_char_inc(first)) {
6369 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
6370 error = FALSE;
6371 if(dest<exp_end)
6372 *dest++ = first->val;
6375 /* if just found zeroes for exponent, use that */
6376 if(got_digit && !got_nonzero)
6378 error = FALSE;
6379 if(dest<exp_end)
6380 *dest++ = '0';
6384 if(sep && groups_no)
6385 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6387 if(!cur_group) /* no groups, skip loop */
6388 cur_group--;
6389 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
6390 error = TRUE; /* trailing empty */
6392 for(; cur_group>=0 && !error; cur_group--) {
6393 if(*grouping == CHAR_MAX) {
6394 if(cur_group)
6395 error = TRUE;
6396 break;
6397 }else if((cur_group && *grouping!=groups[cur_group])
6398 || (!cur_group && *grouping<groups[cur_group])) {
6399 error = TRUE;
6400 break;
6401 }else if(grouping[1]) {
6402 grouping++;
6405 MSVCP_basic_string_char_dtor(&grouping_bstr);
6406 if(sep)
6407 MSVCP_basic_string_char_dtor(&groups_found);
6409 if(error) {
6410 *dest_beg = '\0';
6411 return 0;
6413 *dest++ = '\0';
6414 return exp;
6417 /* ?_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 */
6418 /* ?_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 */
6419 int __cdecl num_get_char__Getffldx(const num_get *this, char *dest, istreambuf_iterator_char *first,
6420 istreambuf_iterator_char *last, ios_base *ios, int *phexexp)
6422 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
6423 return -1;
6426 /* ?_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 */
6427 /* ?_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 */
6428 /* Copies number to dest buffer, validates grouping and skips separators.
6429 * Updates first so it points past the number, all digits are skipped.
6430 * Returns number base (8, 10 or 16).
6431 * Size of dest buffer is not specified, assuming it's not smaller than 25:
6432 * 22(8^22>2^64)+1(detect overflows)+1(sign)+1(nullbyte) = 25
6434 int __cdecl num_get_char__Getifld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6435 istreambuf_iterator_char *last, int fmtflags, const locale *loc)
6437 static const char digits[] = "0123456789abcdefABCDEF";
6439 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6440 basic_string_char grouping_bstr;
6441 basic_string_char groups_found;
6442 int basefield, base, groups_no = 0, cur_group = 0;
6443 char *dest_beg = dest, *dest_end = dest+24, sep = 0;
6444 const char *grouping, *groups;
6445 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
6447 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
6449 numpunct_char_grouping(numpunct, &grouping_bstr);
6450 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6451 #if _MSVCP_VER >= 70
6452 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6453 #endif
6455 basefield = fmtflags & FMTFLAG_basefield;
6456 if(basefield == FMTFLAG_oct)
6457 base = 8;
6458 else if(basefield == FMTFLAG_hex)
6459 base = 22; /* equal to the size of digits buffer */
6460 else if(!basefield)
6461 base = 0;
6462 else
6463 base = 10;
6465 istreambuf_iterator_char_val(first);
6466 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6467 *dest++ = first->val;
6468 istreambuf_iterator_char_inc(first);
6471 if(first->strbuf && first->val=='0') {
6472 found_zero = TRUE;
6473 istreambuf_iterator_char_inc(first);
6474 if(first->strbuf && (first->val=='x' || first->val=='X')) {
6475 if(!base || base == 22) {
6476 found_zero = FALSE;
6477 istreambuf_iterator_char_inc(first);
6478 base = 22;
6479 }else {
6480 base = 10;
6482 }else {
6483 error = FALSE;
6484 if(!base) base = 8;
6486 }else {
6487 if (!base) base = 10;
6490 if(sep)
6492 MSVCP_basic_string_char_ctor(&groups_found);
6493 if(found_zero) ++groups_no;
6496 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6497 if(!memchr(digits, first->val, base)) {
6498 if(sep && first->val==sep) {
6499 if(!groups_no) break; /* empty group - stop parsing */
6500 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6501 groups_no = 0;
6502 ++cur_group;
6503 }else {
6504 break;
6506 }else {
6507 error = FALSE;
6508 if(dest_empty && first->val == '0')
6510 found_zero = TRUE;
6511 ++groups_no;
6512 continue;
6514 dest_empty = FALSE;
6515 /* skip digits that can't be copied to dest buffer, other
6516 * functions are responsible for detecting overflows */
6517 if(dest < dest_end)
6518 *dest++ = first->val;
6519 if(sep && groups_no<CHAR_MAX)
6520 ++groups_no;
6524 if(sep && groups_no)
6525 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6527 if(!cur_group) { /* no groups, skip loop */
6528 cur_group--;
6529 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
6530 error = TRUE; /* trailing empty */
6531 found_zero = FALSE;
6534 for(; cur_group>=0 && !error; cur_group--) {
6535 if(*grouping == CHAR_MAX) {
6536 if(cur_group)
6537 error = TRUE;
6538 break;
6539 }else if((cur_group && *grouping!=groups[cur_group])
6540 || (!cur_group && *grouping<groups[cur_group])) {
6541 error = TRUE;
6542 break;
6543 }else if(grouping[1]) {
6544 grouping++;
6548 MSVCP_basic_string_char_dtor(&grouping_bstr);
6549 if(sep)
6550 MSVCP_basic_string_char_dtor(&groups_found);
6552 if(error) {
6553 if (found_zero)
6554 *dest++ = '0';
6555 else
6556 dest = dest_beg;
6557 }else if(dest_empty)
6558 *dest++ = '0';
6559 *dest = '\0';
6561 return (base==22 ? 16 : base);
6564 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABEHD000@Z */
6565 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHD000@Z */
6566 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char__Hexdig, 20)
6567 int __thiscall MSVCP_num_get_char__Hexdig(num_get *this, char dig, char e0, char al, char au)
6569 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
6570 return -1;
6573 /* ?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 */
6574 /* ?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 */
6575 #if _MSVCP_VER <= 100
6576 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_char*, \
6577 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6578 (this, ret, first, last, base, state, pval))
6579 #else
6580 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6581 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6582 (this, ret, first, last, base, state, pval))
6583 #endif
6584 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_void,36)
6585 istreambuf_iterator_char *__thiscall num_get_char_do_get_void(const num_get *this, istreambuf_iterator_char *ret,
6586 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6588 unsigned __int64 v;
6589 char tmp[25], *end;
6590 int err;
6592 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6594 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6595 &first, &last, FMTFLAG_hex, IOS_LOCALE(base)), &err);
6596 if(v!=(unsigned __int64)((INT_PTR)v))
6597 *state |= IOSTATE_failbit;
6598 else if(end!=tmp && !err)
6599 *pval = (void*)((INT_PTR)v);
6600 else
6601 *state |= IOSTATE_failbit;
6603 if(!first.strbuf)
6604 *state |= IOSTATE_eofbit;
6606 *ret = first;
6607 return ret;
6610 /* ?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 */
6611 /* ?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 */
6612 DEFINE_THISCALL_WRAPPER(num_get_char_get_void,36)
6613 istreambuf_iterator_char *__thiscall num_get_char_get_void(const num_get *this, istreambuf_iterator_char *ret,
6614 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6616 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6617 return call_num_get_char_do_get_void(this, ret, first, last, base, state, pval);
6620 /* ?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 */
6621 /* ?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 */
6622 /* ?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 */
6623 /* ?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 */
6624 #if _MSVCP_VER <= 100
6625 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
6626 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6627 (this, ret, first, last, base, state, pval))
6628 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6629 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6630 (this, ret, first, last, base, state, pval))
6631 #else
6632 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6633 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6634 (this, ret, first, last, base, state, pval))
6635 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6636 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6637 (this, ret, first, last, base, state, pval))
6638 #endif
6639 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_double,36)
6640 istreambuf_iterator_char *__thiscall num_get_char_do_get_double(const num_get *this, istreambuf_iterator_char *ret,
6641 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6643 double v;
6644 char tmp[32], *end;
6645 int err;
6647 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6649 v = _Stodx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6650 if(end!=tmp && !err)
6651 *pval = v;
6652 else
6653 *state |= IOSTATE_failbit;
6655 if(!first.strbuf)
6656 *state |= IOSTATE_eofbit;
6658 *ret = first;
6659 return ret;
6662 /* ?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 */
6663 /* ?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 */
6664 DEFINE_THISCALL_WRAPPER(num_get_char_get_ldouble,36)
6665 istreambuf_iterator_char *__thiscall num_get_char_get_ldouble(const num_get *this, istreambuf_iterator_char *ret,
6666 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6668 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6669 return call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval);
6672 /* ?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 */
6673 /* ?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 */
6674 DEFINE_THISCALL_WRAPPER(num_get_char_get_double,36)
6675 istreambuf_iterator_char *__thiscall num_get_char_get_double(const num_get *this, istreambuf_iterator_char *ret,
6676 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6678 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6679 return call_num_get_char_do_get_double(this, ret, first, last, base, state, pval);
6682 /* ?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 */
6683 /* ?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 */
6684 #if _MSVCP_VER <= 100
6685 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6686 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6687 (this, ret, first, last, base, state, pval))
6688 #else
6689 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6690 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6691 (this, ret, first, last, base, state, pval))
6692 #endif
6693 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_float,36)
6694 istreambuf_iterator_char *__thiscall num_get_char_do_get_float(const num_get *this, istreambuf_iterator_char *ret,
6695 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6697 float v;
6698 char tmp[32], *end;
6699 int err;
6701 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6703 v = _Stofx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6704 if(end!=tmp && !err)
6705 *pval = v;
6706 else
6707 *state |= IOSTATE_failbit;
6709 if(!first.strbuf)
6710 *state |= IOSTATE_eofbit;
6712 *ret = first;
6713 return ret;
6716 /* ?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 */
6717 /* ?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 */
6718 DEFINE_THISCALL_WRAPPER(num_get_char_get_float,36)
6719 istreambuf_iterator_char *__thiscall num_get_char_get_float(const num_get *this, istreambuf_iterator_char *ret,
6720 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6722 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6723 return call_num_get_char_do_get_float(this, ret, first, last, base, state, pval);
6726 /* ?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 */
6727 /* ?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 */
6728 #if _MSVCP_VER <= 100
6729 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6730 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6731 (this, ret, first, last, base, state, pval))
6732 #else
6733 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6734 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6735 (this, ret, first, last, base, state, pval))
6736 #endif
6737 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint64,36)
6738 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6739 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6741 unsigned __int64 v;
6742 char tmp[25], *end;
6743 int err;
6745 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6747 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6748 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6749 if(end!=tmp && !err)
6750 *pval = v;
6751 else
6752 *state |= IOSTATE_failbit;
6754 if(!first.strbuf)
6755 *state |= IOSTATE_eofbit;
6757 *ret = first;
6758 return ret;
6761 /* ?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 */
6762 /* ?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 */
6763 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint64,36)
6764 istreambuf_iterator_char *__thiscall num_get_char_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6765 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6767 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6768 return call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval);
6771 /* ?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 */
6772 /* ?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 */
6773 #if _MSVCP_VER <= 100
6774 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6775 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6776 (this, ret, first, last, base, state, pval))
6777 #else
6778 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6779 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6780 (this, ret, first, last, base, state, pval))
6781 #endif
6782 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_int64,36)
6783 istreambuf_iterator_char *__thiscall num_get_char_do_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6784 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6786 __int64 v;
6787 char tmp[25], *end;
6788 int err;
6790 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6792 v = _Stollx(tmp, &end, num_get_char__Getifld(this, tmp,
6793 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6794 if(end!=tmp && !err)
6795 *pval = v;
6796 else
6797 *state |= IOSTATE_failbit;
6799 if(!first.strbuf)
6800 *state |= IOSTATE_eofbit;
6802 *ret = first;
6803 return ret;
6806 /* ?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 */
6807 /* ?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 */
6808 DEFINE_THISCALL_WRAPPER(num_get_char_get_int64,36)
6809 istreambuf_iterator_char *__thiscall num_get_char_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6810 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6812 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6813 return call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval);
6816 /* ?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 */
6817 /* ?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 */
6818 #if _MSVCP_VER <= 100
6819 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6820 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6821 (this, ret, first, last, base, state, pval))
6822 #else
6823 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
6824 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6825 (this, ret, first, last, base, state, pval))
6826 #endif
6827 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ulong,36)
6828 istreambuf_iterator_char *__thiscall num_get_char_do_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6829 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6831 ULONG v;
6832 char tmp[25], *end;
6833 int err;
6835 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6837 v = _Stoulx(tmp, &end, num_get_char__Getifld(this, tmp,
6838 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6839 if(end!=tmp && !err)
6840 *pval = v;
6841 else
6842 *state |= IOSTATE_failbit;
6844 if(!first.strbuf)
6845 *state |= IOSTATE_eofbit;
6847 *ret = first;
6848 return ret;
6851 /* ?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 */
6852 /* ?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 */
6853 DEFINE_THISCALL_WRAPPER(num_get_char_get_ulong,36)
6854 istreambuf_iterator_char *__thiscall num_get_char_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6855 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6857 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6858 return call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
6861 /* ?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 */
6862 /* ?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 */
6863 #if _MSVCP_VER <= 100
6864 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6865 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6866 (this, ret, first, last, base, state, pval))
6867 #else
6868 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
6869 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6870 (this, ret, first, last, base, state, pval))
6871 #endif
6872 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_long,36)
6873 istreambuf_iterator_char *__thiscall num_get_char_do_get_long(const num_get *this, istreambuf_iterator_char *ret,
6874 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
6876 LONG v;
6877 char tmp[25], *end;
6878 int err;
6880 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6882 v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
6883 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6884 if(end!=tmp && !err)
6885 *pval = v;
6886 else
6887 *state |= IOSTATE_failbit;
6889 if(!first.strbuf)
6890 *state |= IOSTATE_eofbit;
6892 *ret = first;
6893 return ret;
6896 /* ?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 */
6897 /* ?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 */
6898 DEFINE_THISCALL_WRAPPER(num_get_char_get_long,36)
6899 istreambuf_iterator_char *__thiscall num_get_char_get_long(const num_get *this, istreambuf_iterator_char *ret,
6900 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
6902 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6903 return call_num_get_char_do_get_long(this, ret, first, last, base, state, pval);
6906 /* ?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 */
6907 /* ?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 */
6908 #if _MSVCP_VER <= 100
6909 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
6910 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
6911 (this, ret, first, last, base, state, pval))
6912 #else
6913 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
6914 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
6915 (this, ret, first, last, base, state, pval))
6916 #endif
6917 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint,36)
6918 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint(const num_get *this, istreambuf_iterator_char *ret,
6919 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
6921 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6922 return num_get_char_do_get_ulong(this, ret, first, last, base, state, (ULONG*)pval);
6925 /* ?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 */
6926 /* ?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 */
6927 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint,36)
6928 istreambuf_iterator_char *__thiscall num_get_char_get_uint(const num_get *this, istreambuf_iterator_char *ret,
6929 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
6931 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6932 return call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval);
6935 /* ?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 */
6936 /* ?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 */
6937 #if _MSVCP_VER <= 100
6938 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
6939 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
6940 (this, ret, first, last, base, state, pval))
6941 #else
6942 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_char*, \
6943 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
6944 (this, ret, first, last, base, state, pval))
6945 #endif
6946 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ushort,36)
6947 istreambuf_iterator_char *__thiscall num_get_char_do_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
6948 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
6950 ULONG v;
6951 char tmp[25], *beg, *end;
6952 int err, b;
6954 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6956 b = num_get_char__Getifld(this, tmp,
6957 &first, &last, base->fmtfl, IOS_LOCALE(base));
6958 beg = tmp + (tmp[0]=='-' ? 1 : 0);
6959 v = _Stoulx(beg, &end, b, &err);
6961 if(v != (ULONG)((unsigned short)v))
6962 *state |= IOSTATE_failbit;
6963 else if(end!=beg && !err)
6964 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
6965 else
6966 *state |= IOSTATE_failbit;
6968 if(!first.strbuf)
6969 *state |= IOSTATE_eofbit;
6971 *ret = first;
6972 return ret;
6975 /* ?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 */
6976 /* ?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 */
6977 DEFINE_THISCALL_WRAPPER(num_get_char_get_ushort,36)
6978 istreambuf_iterator_char *__thiscall num_get_char_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
6979 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
6981 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6982 return call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval);
6985 /* ?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 */
6986 /* ?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 */
6987 #if _MSVCP_VER <= 100
6988 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
6989 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, bool*), \
6990 (this, ret, first, last, base, state, pval))
6991 #else
6992 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_char*, \
6993 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, bool*), \
6994 (this, ret, first, last, base, state, pval))
6995 #endif
6996 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_bool,36)
6997 istreambuf_iterator_char *__thiscall num_get_char_do_get_bool(const num_get *this, istreambuf_iterator_char *ret,
6998 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, bool *pval)
7000 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7002 if(base->fmtfl & FMTFLAG_boolalpha) {
7003 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7004 basic_string_char false_bstr, true_bstr;
7005 const char *pfalse, *ptrue;
7007 numpunct_char_falsename(numpunct, &false_bstr);
7008 numpunct_char_truename(numpunct, &true_bstr);
7009 pfalse = MSVCP_basic_string_char_c_str(&false_bstr);
7010 ptrue = MSVCP_basic_string_char_c_str(&true_bstr);
7012 for(istreambuf_iterator_char_val(&first); first.strbuf;) {
7013 if(pfalse && *pfalse && first.val!=*pfalse)
7014 pfalse = NULL;
7015 if(ptrue && *ptrue && first.val!=*ptrue)
7016 ptrue = NULL;
7018 if(pfalse && *pfalse && ptrue && !*ptrue)
7019 ptrue = NULL;
7020 if(ptrue && *ptrue && pfalse && !*pfalse)
7021 pfalse = NULL;
7023 if(pfalse)
7024 pfalse++;
7025 if(ptrue)
7026 ptrue++;
7028 if(pfalse || ptrue)
7029 istreambuf_iterator_char_inc(&first);
7031 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
7032 break;
7035 if(ptrue)
7036 *pval = TRUE;
7037 else if(pfalse)
7038 *pval = FALSE;
7039 else
7040 *state |= IOSTATE_failbit;
7042 MSVCP_basic_string_char_dtor(&false_bstr);
7043 MSVCP_basic_string_char_dtor(&true_bstr);
7044 }else {
7045 char tmp[25], *end;
7046 int err;
7047 LONG v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
7048 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
7050 if(end!=tmp && err==0 && (v==0 || v==1))
7051 *pval = v;
7052 else
7053 *state |= IOSTATE_failbit;
7056 if(!first.strbuf)
7057 *state |= IOSTATE_eofbit;
7058 memcpy(ret, &first, sizeof(first));
7059 return ret;
7062 /* ?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 */
7063 /* ?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 */
7064 DEFINE_THISCALL_WRAPPER(num_get_char_get_bool,36)
7065 istreambuf_iterator_char *__thiscall num_get_char_get_bool(const num_get *this, istreambuf_iterator_char *ret,
7066 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, bool *pval)
7068 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7069 return call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval);
7072 /* ?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
7073 locale_id num_put_char_id = {0};
7075 /* num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
7076 extern const vtable_ptr num_put_char_vtable;
7078 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7079 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7080 DEFINE_THISCALL_WRAPPER(num_put_char__Init, 8)
7081 void __thiscall num_put_char__Init(num_put *this, const _Locinfo *locinfo)
7083 TRACE("(%p %p)\n", this, locinfo);
7084 #if _MSVCP_VER < 110
7085 _Locinfo__Getcvt(locinfo, &this->cvt);
7086 #endif
7089 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7090 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7091 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_locinfo, 12)
7092 num_put* __thiscall num_put_char_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7094 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
7096 locale_facet_ctor_refs(&this->facet, refs);
7097 this->facet.vtable = &num_put_char_vtable;
7099 num_put_char__Init(this, locinfo);
7100 return this;
7103 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
7104 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
7105 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_refs, 8)
7106 num_put* __thiscall num_put_char_ctor_refs(num_put *this, size_t refs)
7108 _Locinfo locinfo;
7110 TRACE("(%p %Iu)\n", this, refs);
7112 _Locinfo_ctor(&locinfo);
7113 num_put_char_ctor_locinfo(this, &locinfo, refs);
7114 _Locinfo_dtor(&locinfo);
7115 return this;
7118 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
7119 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
7120 DEFINE_THISCALL_WRAPPER(num_put_char_ctor, 4)
7121 num_put* __thiscall num_put_char_ctor(num_put *this)
7123 return num_put_char_ctor_refs(this, 0);
7126 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
7127 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
7128 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
7129 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
7130 DEFINE_THISCALL_WRAPPER(num_put_char_dtor, 4)
7131 void __thiscall num_put_char_dtor(num_put *this)
7133 TRACE("(%p)\n", this);
7134 locale_facet_dtor(&this->facet);
7137 DEFINE_THISCALL_WRAPPER(num_put_char_vector_dtor, 8)
7138 num_put* __thiscall num_put_char_vector_dtor(num_put *this, unsigned int flags)
7140 TRACE("(%p %x)\n", this, flags);
7141 if(flags & 2) {
7142 /* we have an array, with the number of elements stored before the first object */
7143 INT_PTR i, *ptr = (INT_PTR *)this-1;
7145 for(i=*ptr-1; i>=0; i--)
7146 num_put_char_dtor(this+i);
7147 operator_delete(ptr);
7148 } else {
7149 num_put_char_dtor(this);
7150 if(flags & 1)
7151 operator_delete(this);
7154 return this;
7157 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7158 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7159 size_t __cdecl num_put_char__Getcat(const locale_facet **facet, const locale *loc)
7161 TRACE("(%p %p)\n", facet, loc);
7163 if(facet && !*facet) {
7164 _Locinfo locinfo;
7166 *facet = operator_new(sizeof(num_put));
7167 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7168 num_put_char_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7169 _Locinfo_dtor(&locinfo);
7172 return LC_NUMERIC;
7175 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7176 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7177 size_t __cdecl num_put_char__Getcat_old(const locale_facet **facet)
7179 return num_put_char__Getcat(facet, locale_classic());
7182 num_put* num_put_char_use_facet(const locale *loc)
7184 static num_put *obj = NULL;
7186 _Lockit lock;
7187 const locale_facet *fac;
7189 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
7190 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_char_id));
7191 if(fac) {
7192 _Lockit_dtor(&lock);
7193 return (num_put*)fac;
7196 if(obj) {
7197 _Lockit_dtor(&lock);
7198 return obj;
7201 num_put_char__Getcat(&fac, loc);
7202 obj = (num_put*)fac;
7203 call_locale_facet__Incref(&obj->facet);
7204 locale_facet_register(&obj->facet);
7205 _Lockit_dtor(&lock);
7207 return obj;
7210 /* ?_Put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PBDI@Z */
7211 /* ?_Put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PEBD_K@Z */
7212 ostreambuf_iterator_char* __cdecl num_put_char__Put(const num_put *this, ostreambuf_iterator_char *ret,
7213 ostreambuf_iterator_char dest, const char *ptr, size_t count)
7215 TRACE("(%p %p %p %Iu)\n", this, ret, ptr, count);
7217 for(; count>0; count--)
7218 ostreambuf_iterator_char_put(&dest, *ptr++);
7220 *ret = dest;
7221 return ret;
7224 /* ?_Putc@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PBDI@Z */
7225 /* ?_Putc@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PEBD_K@Z */
7226 ostreambuf_iterator_char* __cdecl num_put_char__Putc(const num_put *this, ostreambuf_iterator_char *ret,
7227 ostreambuf_iterator_char dest, const char *ptr, size_t count)
7229 TRACE("(%p %p %p %Iu)\n", this, ret, ptr, count);
7231 for(; count>0; count--)
7232 ostreambuf_iterator_char_put(&dest, *ptr++);
7234 *ret = dest;
7235 return ret;
7238 /* ?_Putgrouped@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PBDID@Z */
7239 /* ?_Putgrouped@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PEBD_KD@Z */
7240 ostreambuf_iterator_char* __cdecl num_put_char__Putgrouped(const num_put *this, ostreambuf_iterator_char *ret,
7241 ostreambuf_iterator_char dest, const char *ptr, size_t count, char delim)
7243 FIXME("(%p %p %p %Iu %d) stub\n", this, ret, ptr, count, delim);
7244 return NULL;
7247 /* ?_Rep@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@DI@Z */
7248 /* ?_Rep@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@D_K@Z */
7249 ostreambuf_iterator_char* __cdecl num_put_char__Rep(const num_put *this, ostreambuf_iterator_char *ret,
7250 ostreambuf_iterator_char dest, char c, size_t count)
7252 TRACE("(%p %p %d %Iu)\n", this, ret, c, count);
7254 for(; count>0; count--)
7255 ostreambuf_iterator_char_put(&dest, c);
7257 *ret = dest;
7258 return ret;
7261 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADDH@Z */
7262 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADDH@Z */
7263 char* __cdecl num_put_char__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
7265 int type = fmtfl & FMTFLAG_floatfield;
7266 char *p = fmt;
7268 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
7270 *p++ = '%';
7271 if(fmtfl & FMTFLAG_showpos)
7272 *p++ = '+';
7273 if(fmtfl & FMTFLAG_showpoint)
7274 *p++ = '#';
7275 *p++ = '.';
7276 *p++ = '*';
7277 if(spec)
7278 *p++ = spec;
7280 if(type == FMTFLAG_fixed)
7281 *p++ = 'f';
7282 else if(type == FMTFLAG_scientific)
7283 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
7284 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
7285 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
7286 else
7287 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
7289 *p++ = '\0';
7290 return fmt;
7293 /* ?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBDIIII@Z */
7294 /* ?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBD_K333@Z */
7295 ostreambuf_iterator_char* __cdecl num_put_char__Fput(const num_put *this, ostreambuf_iterator_char *ret,
7296 ostreambuf_iterator_char dest, ios_base *base, char fill, const char *buf, size_t bef_point,
7297 size_t aft_point, size_t trailing, size_t count)
7299 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
7300 fill, buf, bef_point, aft_point, trailing, count);
7301 return NULL;
7304 /* TODO: This function should be removed when num_put_char__Fput is implemented */
7305 static ostreambuf_iterator_char* num_put_char_fput(const num_put *this, ostreambuf_iterator_char *ret,
7306 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, size_t count)
7308 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7309 basic_string_char grouping_bstr;
7310 const char *grouping;
7311 char *p, sep = 0, dec_point = *localeconv()->decimal_point;
7312 int cur_group = 0, group_size = 0;
7313 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7314 size_t pad;
7316 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
7318 /* Change decimal point */
7319 for(p=buf; p<buf+count; p++) {
7320 if(*p == dec_point) {
7321 *p = numpunct_char_decimal_point(numpunct);
7322 break;
7325 p--;
7327 /* Add separators to number */
7328 numpunct_char_grouping(numpunct, &grouping_bstr);
7329 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7330 #if _MSVCP_VER >= 70
7331 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7332 #endif
7334 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7335 group_size++;
7336 if(group_size == grouping[cur_group]) {
7337 group_size = 0;
7338 if(grouping[cur_group+1])
7339 cur_group++;
7341 memmove(p+1, p, buf+count-p);
7342 *p = sep;
7343 count++;
7346 MSVCP_basic_string_char_dtor(&grouping_bstr);
7348 /* Display number with padding */
7349 if(count >= base->wide)
7350 pad = 0;
7351 else
7352 pad = base->wide-count;
7353 base->wide = 0;
7355 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7356 num_put_char__Putc(this, &dest, dest, buf, 1);
7357 buf++;
7359 if(adjustfield != FMTFLAG_left) {
7360 num_put_char__Rep(this, ret, dest, fill, pad);
7361 pad = 0;
7363 num_put_char__Putc(this, &dest, dest, buf, count);
7364 return num_put_char__Rep(this, ret, dest, fill, pad);
7367 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADPBDH@Z */
7368 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
7369 char* __cdecl num_put_char__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
7371 int base = fmtfl & FMTFLAG_basefield;
7372 char *p = fmt;
7374 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
7376 *p++ = '%';
7377 if(fmtfl & FMTFLAG_showpos)
7378 *p++ = '+';
7379 if(fmtfl & FMTFLAG_showbase)
7380 *p++ = '#';
7382 *p++ = *spec++;
7383 if(*spec == 'l')
7384 *p++ = *spec++;
7386 if(base == FMTFLAG_oct)
7387 *p++ = 'o';
7388 else if(base == FMTFLAG_hex)
7389 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
7390 else
7391 *p++ = *spec;
7393 *p++ = '\0';
7394 return fmt;
7397 /* ?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPADI@Z */
7398 /* ?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEAD_K@Z */
7399 ostreambuf_iterator_char* __cdecl num_put_char__Iput(const num_put *this, ostreambuf_iterator_char *ret,
7400 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, size_t count)
7402 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7403 basic_string_char grouping_bstr;
7404 const char *grouping;
7405 char *p, sep = 0;
7406 int cur_group = 0, group_size = 0;
7407 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7408 size_t pad;
7410 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
7412 /* Add separators to number */
7413 numpunct_char_grouping(numpunct, &grouping_bstr);
7414 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7415 #if _MSVCP_VER >= 70
7416 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7417 #endif
7419 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7420 group_size++;
7421 if(group_size == grouping[cur_group]) {
7422 group_size = 0;
7423 if(grouping[cur_group+1])
7424 cur_group++;
7426 memmove(p+1, p, buf+count-p);
7427 *p = sep;
7428 count++;
7431 MSVCP_basic_string_char_dtor(&grouping_bstr);
7433 /* Display number with padding */
7434 if(count >= base->wide)
7435 pad = 0;
7436 else
7437 pad = base->wide-count;
7438 base->wide = 0;
7440 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7441 num_put_char__Putc(this, &dest, dest, buf, 1);
7442 buf++;
7443 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
7444 num_put_char__Putc(this, &dest, dest, buf, 2);
7445 buf += 2;
7447 if(adjustfield != FMTFLAG_left) {
7448 num_put_char__Rep(this, ret, dest, fill, pad);
7449 pad = 0;
7451 num_put_char__Putc(this, &dest, dest, buf, count);
7452 return num_put_char__Rep(this, ret, dest, fill, pad);
7455 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z */
7456 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z */
7457 #if _MSVCP_VER <= 100
7458 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7459 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7460 (this, ret, dest, base, fill, v))
7461 #else
7462 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_char*, \
7463 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7464 (this, ret, dest, base, fill, v))
7465 #endif
7466 #if _MSVCP_VER != 80
7467 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 28)
7468 #else
7469 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 32)
7470 #endif
7471 ostreambuf_iterator_char* __thiscall num_put_char_do_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7472 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7474 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7475 char fmt[7]; /* strlen("%+#lld")+1 */
7477 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7479 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7480 sprintf(tmp, num_put_char__Ifmt(this, fmt, "ld", base->fmtfl), v));
7483 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z */
7484 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z */
7485 #if _MSVCP_VER != 80
7486 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 28)
7487 #else
7488 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 32)
7489 #endif
7490 ostreambuf_iterator_char* __thiscall num_put_char_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7491 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7493 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7494 return call_num_put_char_do_put_long(this, ret, dest, base, fill, v);
7497 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z */
7498 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z */
7499 #if _MSVCP_VER <= 100
7500 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7501 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7502 (this, ret, dest, base, fill, v))
7503 #else
7504 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7505 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7506 (this, ret, dest, base, fill, v))
7507 #endif
7508 #if _MSVCP_VER != 80
7509 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 28)
7510 #else
7511 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 32)
7512 #endif
7513 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7514 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7516 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7517 char fmt[7]; /* strlen("%+#lld")+1 */
7519 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7521 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7522 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lu", base->fmtfl), v));
7525 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z */
7526 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z */
7527 #if _MSVCP_VER != 80
7528 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 28)
7529 #else
7530 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 32)
7531 #endif
7532 ostreambuf_iterator_char* __thiscall num_put_char_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7533 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7535 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7536 return call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v);
7539 static inline unsigned get_precision(const ios_base *base)
7541 streamsize ret = base->prec <= 0 && !(base->fmtfl & FMTFLAG_fixed) ? 6 : base->prec;
7542 if(ret > UINT_MAX)
7543 ret = UINT_MAX;
7544 return ret;
7547 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z */
7548 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z */
7549 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z */
7550 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z */
7551 #if _MSVCP_VER <= 100
7552 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7553 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7554 (this, ret, dest, base, fill, v))
7555 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_char*, \
7556 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7557 (this, ret, dest, base, fill, v))
7558 #else
7559 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7560 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7561 (this, ret, dest, base, fill, v))
7562 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7563 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7564 (this, ret, dest, base, fill, v))
7565 #endif
7566 #if _MSVCP_VER != 80
7567 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 32)
7568 #else
7569 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 36)
7570 #endif
7571 ostreambuf_iterator_char* __thiscall num_put_char_do_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7572 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7574 char *tmp;
7575 char fmt[8]; /* strlen("%+#.*lg")+1 */
7576 int size;
7577 unsigned prec;
7579 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7581 num_put_char__Ffmt(this, fmt, '\0', base->fmtfl);
7582 prec = get_precision(base);
7583 size = _scprintf(fmt, prec, v);
7585 /* TODO: don't use dynamic allocation */
7586 tmp = operator_new(size*2);
7587 num_put_char_fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v));
7588 operator_delete(tmp);
7589 return ret;
7592 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z */
7593 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z */
7594 #if _MSVCP_VER != 80
7595 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 32)
7596 #else
7597 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 36)
7598 #endif
7599 ostreambuf_iterator_char* __thiscall num_put_char_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7600 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7602 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7603 return call_num_put_char_do_put_double(this, ret, dest, base, fill, v);
7606 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z */
7607 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z */
7608 #if _MSVCP_VER != 80
7609 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 32)
7610 #else
7611 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 36)
7612 #endif
7613 ostreambuf_iterator_char* __thiscall num_put_char_put_ldouble(const num_put *this, ostreambuf_iterator_char *ret,
7614 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7616 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7617 return call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v);
7620 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z */
7621 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z */
7622 #if _MSVCP_VER <= 100
7623 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
7624 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7625 (this, ret, dest, base, fill, v))
7626 #else
7627 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7628 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7629 (this, ret, dest, base, fill, v))
7630 #endif
7631 #if _MSVCP_VER != 80
7632 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 28)
7633 #else
7634 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 32)
7635 #endif
7636 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7637 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7639 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
7641 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7643 return num_put_char__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
7646 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z */
7647 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z */
7648 #if _MSVCP_VER != 80
7649 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 28)
7650 #else
7651 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 32)
7652 #endif
7653 ostreambuf_iterator_char* __thiscall num_put_char_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7654 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7656 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7657 return call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v);
7660 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z */
7661 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z */
7662 #if _MSVCP_VER <= 100
7663 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7664 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7665 (this, ret, dest, base, fill, v))
7666 #else
7667 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7668 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7669 (this, ret, dest, base, fill, v))
7670 #endif
7671 #if _MSVCP_VER != 80
7672 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 32)
7673 #else
7674 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 36)
7675 #endif
7676 ostreambuf_iterator_char* __thiscall num_put_char_do_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7677 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7679 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7680 char fmt[7]; /* strlen("%+#lld")+1 */
7682 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7684 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7685 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lld", base->fmtfl), v));
7688 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z */
7689 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z */
7690 #if _MSVCP_VER != 80
7691 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 32)
7692 #else
7693 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 36)
7694 #endif
7695 ostreambuf_iterator_char* __thiscall num_put_char_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7696 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7698 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7699 return call_num_put_char_do_put_int64(this, ret, dest, base, fill, v);
7702 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z */
7703 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z */
7704 #if _MSVCP_VER <= 100
7705 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7706 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7707 (this, ret, dest, base, fill, v))
7708 #else
7709 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7710 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7711 (this, ret, dest, base, fill, v))
7712 #endif
7713 #if _MSVCP_VER != 80
7714 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 32)
7715 #else
7716 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 36)
7717 #endif
7718 ostreambuf_iterator_char* __thiscall num_put_char_do_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7719 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7721 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7722 char fmt[7]; /* strlen("%+#lld")+1 */
7724 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7726 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7727 sprintf(tmp, num_put_char__Ifmt(this, fmt, "llu", base->fmtfl), v));
7730 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z */
7731 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z */
7732 #if _MSVCP_VER != 80
7733 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 32)
7734 #else
7735 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 36)
7736 #endif
7737 ostreambuf_iterator_char* __thiscall num_put_char_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7738 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7740 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7741 return call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v);
7744 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z */
7745 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z */
7746 #if _MSVCP_VER <= 100
7747 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7748 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, bool), \
7749 (this, ret, dest, base, fill, v))
7750 #else
7751 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_char*, \
7752 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, bool), \
7753 (this, ret, dest, base, fill, v))
7754 #endif
7755 #if _MSVCP_VER != 80
7756 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 28)
7757 #else
7758 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 32)
7759 #endif
7760 ostreambuf_iterator_char* __thiscall num_put_char_do_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7761 ostreambuf_iterator_char dest, ios_base *base, char fill, bool v)
7763 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7765 if(base->fmtfl & FMTFLAG_boolalpha) {
7766 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7767 basic_string_char str;
7768 size_t pad, len;
7770 if(v)
7771 numpunct_char_truename(numpunct, &str);
7772 else
7773 numpunct_char_falsename(numpunct, &str);
7775 len = MSVCP_basic_string_char_length(&str);
7776 pad = (len>base->wide ? 0 : base->wide-len);
7777 base->wide = 0;
7779 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
7780 num_put_char__Rep(this, &dest, dest, fill, pad);
7781 pad = 0;
7783 num_put_char__Putc(this, &dest, dest, MSVCP_basic_string_char_c_str(&str), len);
7784 MSVCP_basic_string_char_dtor(&str);
7785 return num_put_char__Rep(this, ret, dest, fill, pad);
7788 return num_put_char_put_long(this, ret, dest, base, fill, v);
7791 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z */
7792 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z */
7793 #if _MSVCP_VER != 80
7794 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 28)
7795 #else
7796 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 32)
7797 #endif
7798 ostreambuf_iterator_char* __thiscall num_put_char_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7799 ostreambuf_iterator_char dest, ios_base *base, char fill, bool v)
7801 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7802 return call_num_put_char_do_put_bool(this, ret, dest, base, fill, v);
7805 /* ?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
7806 locale_id num_put_wchar_id = {0};
7807 /* ?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
7808 locale_id num_put_short_id = {0};
7810 /* num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
7811 extern const vtable_ptr num_put_wchar_vtable;
7812 /* num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
7813 extern const vtable_ptr num_put_short_vtable;
7815 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7816 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7817 DEFINE_THISCALL_WRAPPER(num_put_wchar__Init, 8)
7818 void __thiscall num_put_wchar__Init(num_put *this, const _Locinfo *locinfo)
7820 TRACE("(%p %p)\n", this, locinfo);
7821 #if _MSVCP_VER < 110
7822 _Locinfo__Getcvt(locinfo, &this->cvt);
7823 #endif
7826 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7827 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7828 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_locinfo, 12)
7829 num_put* __thiscall num_put_wchar_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7831 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
7833 locale_facet_ctor_refs(&this->facet, refs);
7834 this->facet.vtable = &num_put_wchar_vtable;
7836 num_put_wchar__Init(this, locinfo);
7837 return this;
7840 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7841 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7842 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_locinfo, 12)
7843 num_put* __thiscall num_put_short_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7845 num_put_wchar_ctor_locinfo(this, locinfo, refs);
7846 this->facet.vtable = &num_put_short_vtable;
7847 return this;
7850 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
7851 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
7852 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_refs, 8)
7853 num_put* __thiscall num_put_wchar_ctor_refs(num_put *this, size_t refs)
7855 _Locinfo locinfo;
7857 TRACE("(%p %Iu)\n", this, refs);
7859 _Locinfo_ctor(&locinfo);
7860 num_put_wchar_ctor_locinfo(this, &locinfo, refs);
7861 _Locinfo_dtor(&locinfo);
7862 return this;
7865 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
7866 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
7867 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_refs, 8)
7868 num_put* __thiscall num_put_short_ctor_refs(num_put *this, size_t refs)
7870 num_put_wchar_ctor_refs(this, refs);
7871 this->facet.vtable = &num_put_short_vtable;
7872 return this;
7875 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
7876 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
7877 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor, 4)
7878 num_put* __thiscall num_put_wchar_ctor(num_put *this)
7880 return num_put_wchar_ctor_refs(this, 0);
7883 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
7884 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
7885 DEFINE_THISCALL_WRAPPER(num_put_short_ctor, 4)
7886 num_put* __thiscall num_put_short_ctor(num_put *this)
7888 return num_put_short_ctor_refs(this, 0);
7891 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
7892 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
7893 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
7894 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
7895 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
7896 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
7897 DEFINE_THISCALL_WRAPPER(num_put_wchar_dtor, 4)
7898 void __thiscall num_put_wchar_dtor(num_put *this)
7900 TRACE("(%p)\n", this);
7901 locale_facet_dtor(&this->facet);
7904 DEFINE_THISCALL_WRAPPER(num_put_wchar_vector_dtor, 8)
7905 num_put* __thiscall num_put_wchar_vector_dtor(num_put *this, unsigned int flags)
7907 TRACE("(%p %x)\n", this, flags);
7908 if(flags & 2) {
7909 /* we have an array, with the number of elements stored before the first object */
7910 INT_PTR i, *ptr = (INT_PTR *)this-1;
7912 for(i=*ptr-1; i>=0; i--)
7913 num_put_wchar_dtor(this+i);
7914 operator_delete(ptr);
7915 } else {
7916 num_put_wchar_dtor(this);
7917 if(flags & 1)
7918 operator_delete(this);
7921 return this;
7924 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7925 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7926 size_t __cdecl num_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
7928 TRACE("(%p %p)\n", facet, loc);
7930 if(facet && !*facet) {
7931 _Locinfo locinfo;
7933 *facet = operator_new(sizeof(num_put));
7934 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7935 num_put_wchar_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7936 _Locinfo_dtor(&locinfo);
7939 return LC_NUMERIC;
7942 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7943 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7944 size_t __cdecl num_put_wchar__Getcat_old(const locale_facet **facet)
7946 return num_put_wchar__Getcat(facet, locale_classic());
7949 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7950 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7951 size_t __cdecl num_put_short__Getcat(const locale_facet **facet, const locale *loc)
7953 TRACE("(%p %p)\n", facet, loc);
7955 if(facet && !*facet) {
7956 _Locinfo locinfo;
7958 *facet = operator_new(sizeof(num_put));
7959 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7960 num_put_short_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7961 _Locinfo_dtor(&locinfo);
7964 return LC_NUMERIC;
7967 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7968 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7969 size_t __cdecl num_put_short__Getcat_old(const locale_facet **facet)
7971 return num_put_short__Getcat(facet, locale_classic());
7974 num_put* num_put_wchar_use_facet(const locale *loc)
7976 static num_put *obj = NULL;
7978 _Lockit lock;
7979 const locale_facet *fac;
7981 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
7982 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_wchar_id));
7983 if(fac) {
7984 _Lockit_dtor(&lock);
7985 return (num_put*)fac;
7988 if(obj) {
7989 _Lockit_dtor(&lock);
7990 return obj;
7993 num_put_wchar__Getcat(&fac, loc);
7994 obj = (num_put*)fac;
7995 call_locale_facet__Incref(&obj->facet);
7996 locale_facet_register(&obj->facet);
7997 _Lockit_dtor(&lock);
7999 return obj;
8002 num_put* num_put_short_use_facet(const locale *loc)
8004 static num_put *obj = NULL;
8006 _Lockit lock;
8007 const locale_facet *fac;
8009 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8010 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_short_id));
8011 if(fac) {
8012 _Lockit_dtor(&lock);
8013 return (num_put*)fac;
8016 if(obj) {
8017 _Lockit_dtor(&lock);
8018 return obj;
8021 num_put_short__Getcat(&fac, loc);
8022 obj = (num_put*)fac;
8023 call_locale_facet__Incref(&obj->facet);
8024 locale_facet_register(&obj->facet);
8025 _Lockit_dtor(&lock);
8027 return obj;
8030 /* ?_Put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PB_WI@Z */
8031 /* ?_Put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PEB_W_K@Z */
8032 /* ?_Put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PBGI@Z */
8033 /* ?_Put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PEBG_K@Z */
8034 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Put(const num_put *this, ostreambuf_iterator_wchar *ret,
8035 ostreambuf_iterator_wchar dest, const wchar_t *ptr, size_t count)
8037 TRACE("(%p %p %s %Iu)\n", this, ret, debugstr_wn(ptr, count), count);
8039 for(; count>0; count--)
8040 ostreambuf_iterator_wchar_put(&dest, *ptr++);
8042 *ret = dest;
8043 return ret;
8046 #if _MSVCP_VER < 110
8047 /* ?_Putc@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PBDI@Z */
8048 /* ?_Putc@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PEBD_K@Z */
8049 /* ?_Putc@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PBDI@Z */
8050 /* ?_Putc@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PEBD_K@Z */
8051 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putc(const num_put *this, ostreambuf_iterator_wchar *ret,
8052 ostreambuf_iterator_wchar dest, const char *ptr, size_t count)
8054 _Mbstatet state;
8055 wchar_t ch;
8057 TRACE("(%p %p %s %Iu)\n", this, ret, debugstr_an(ptr, count), count);
8059 memset(&state, 0, sizeof(state));
8060 for(; count>0; count--) {
8061 if(_Mbrtowc(&ch, ptr++, 1, &state, &this->cvt) == 1)
8062 ostreambuf_iterator_wchar_put(&dest, ch);
8065 *ret = dest;
8066 return ret;
8068 #endif
8070 /* ?_Putgrouped@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PBDI_W@Z */
8071 /* ?_Putgrouped@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PEBD_K_W@Z */
8072 /* ?_Putgrouped@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PBDIG@Z */
8073 /* ?_Putgrouped@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PEBD_KG@Z */
8074 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putgrouped(const num_put *this, ostreambuf_iterator_wchar *ret,
8075 ostreambuf_iterator_wchar dest, const char *ptr, size_t count, wchar_t delim)
8077 FIXME("(%p %p %p %Iu %d) stub\n", this, ret, ptr, count, delim);
8078 return NULL;
8081 /* ?_Rep@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@_WI@Z */
8082 /* ?_Rep@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@_W_K@Z */
8083 /* ?_Rep@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@GI@Z */
8084 /* ?_Rep@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@G_K@Z */
8085 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Rep(const num_put *this, ostreambuf_iterator_wchar *ret,
8086 ostreambuf_iterator_wchar dest, wchar_t c, size_t count)
8088 TRACE("(%p %p %d %Iu)\n", this, ret, c, count);
8090 for(; count>0; count--)
8091 ostreambuf_iterator_wchar_put(&dest, c);
8093 *ret = dest;
8094 return ret;
8097 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADDH@Z */
8098 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8099 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADDH@Z */
8100 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8101 char* __cdecl num_put_wchar__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
8103 int type = fmtfl & FMTFLAG_floatfield;
8104 char *p = fmt;
8106 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
8108 *p++ = '%';
8109 if(fmtfl & FMTFLAG_showpos)
8110 *p++ = '+';
8111 if(fmtfl & FMTFLAG_showbase)
8112 *p++ = '#';
8113 *p++ = '.';
8114 *p++ = '*';
8115 if(spec)
8116 *p++ = spec;
8118 if(type == FMTFLAG_fixed)
8119 *p++ = 'f';
8120 else if(type == FMTFLAG_scientific)
8121 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
8122 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
8123 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
8124 else
8125 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
8127 *p++ = '\0';
8128 return fmt;
8131 /* ?_Fput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBDIIII@Z */
8132 /* ?_Fput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBD_K444@Z */
8133 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8134 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, size_t bef_point,
8135 size_t aft_point, size_t trailing, size_t count)
8137 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
8138 fill, buf, bef_point, aft_point, trailing, count);
8139 return NULL;
8142 /* ?_Fput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBDIIII@Z */
8143 /* ?_Fput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBD_K333@Z */
8144 ostreambuf_iterator_wchar* __cdecl num_put_short__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8145 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, size_t bef_point,
8146 size_t aft_point, size_t trailing, size_t count)
8148 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
8149 fill, buf, bef_point, aft_point, trailing, count);
8150 return NULL;
8153 #if _MSVCP_VER < 110
8154 static void num_put_wchar_wide_put(const num_put *this,
8155 ostreambuf_iterator_wchar *dest, ios_base *base,
8156 const char *buf, size_t count)
8158 num_put_wchar__Putc(this, dest, *dest, buf, count);
8160 #else
8161 static void num_put_wchar_wide_put(const num_put *this,
8162 ostreambuf_iterator_wchar *dest, ios_base *base,
8163 const char *buf, size_t count)
8165 ctype_wchar *ctype;
8166 size_t i;
8168 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
8169 for(i=0; i<count; i++)
8170 ostreambuf_iterator_wchar_put(dest, ctype_wchar_widen_ch(ctype, buf[i]));
8172 #endif
8174 /* TODO: This function should be removed when num_put_wchar__Fput is implemented */
8175 static ostreambuf_iterator_wchar* num_put__fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8176 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8177 size_t count, numpunct_wchar *numpunct)
8179 basic_string_char grouping_bstr;
8180 const char *grouping;
8181 char *p, dec_point = *localeconv()->decimal_point;
8182 wchar_t sep = 0;
8183 int cur_group = 0, group_size = 0;
8184 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8185 size_t i, pad;
8187 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
8189 for(p=buf; p<buf+count; p++) {
8190 if(*p == dec_point)
8191 break;
8193 p--;
8195 /* Add separators to number */
8196 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8197 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8198 #if _MSVCP_VER >= 70
8199 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
8200 #endif
8202 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8203 group_size++;
8204 if(group_size == grouping[cur_group]) {
8205 group_size = 0;
8206 if(grouping[cur_group+1])
8207 cur_group++;
8209 memmove(p+1, p, buf+count-p);
8210 *p = '\0'; /* mark thousands separator positions */
8211 count++;
8214 MSVCP_basic_string_char_dtor(&grouping_bstr);
8216 /* Display number with padding */
8217 if(count >= base->wide)
8218 pad = 0;
8219 else
8220 pad = base->wide-count;
8221 base->wide = 0;
8223 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8224 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8225 buf++;
8227 if(adjustfield != FMTFLAG_left) {
8228 num_put_wchar__Rep(this, ret, dest, fill, pad);
8229 pad = 0;
8232 for(i=0; i<count; i++) {
8233 if(buf[i] == dec_point)
8234 num_put_wchar__Rep(this, &dest, dest, numpunct_wchar_decimal_point(numpunct), 1);
8235 else if(!buf[i])
8236 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8237 else
8238 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8241 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8244 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADPBDH@Z */
8245 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8246 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADPBDH@Z */
8247 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8248 char* __cdecl num_put_wchar__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
8250 int base = fmtfl & FMTFLAG_basefield;
8251 char *p = fmt;
8253 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
8255 *p++ = '%';
8256 if(fmtfl & FMTFLAG_showpos)
8257 *p++ = '+';
8258 if(fmtfl & FMTFLAG_showbase)
8259 *p++ = '#';
8261 *p++ = *spec++;
8262 if(*spec == 'l')
8263 *p++ = *spec++;
8265 if(base == FMTFLAG_oct)
8266 *p++ = 'o';
8267 else if(base == FMTFLAG_hex)
8268 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
8269 else
8270 *p++ = *spec;
8272 *p++ = '\0';
8273 return fmt;
8276 static ostreambuf_iterator_wchar* num_put__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8277 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8278 size_t count, numpunct_wchar *numpunct)
8280 basic_string_char grouping_bstr;
8281 const char *grouping;
8282 char *p;
8283 wchar_t sep;
8284 int cur_group = 0, group_size = 0;
8285 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8286 size_t i, pad;
8288 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
8290 /* Add separators to number */
8291 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8292 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8293 sep = grouping[0] ? numpunct_wchar_thousands_sep(numpunct) : '\0';
8295 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8296 group_size++;
8297 if(group_size == grouping[cur_group]) {
8298 group_size = 0;
8299 if(grouping[cur_group+1])
8300 cur_group++;
8302 memmove(p+1, p, buf+count-p);
8303 *p = '\0'; /* mark thousands separator positions */
8304 count++;
8307 MSVCP_basic_string_char_dtor(&grouping_bstr);
8309 /* Display number with padding */
8310 if(count >= base->wide)
8311 pad = 0;
8312 else
8313 pad = base->wide-count;
8314 base->wide = 0;
8316 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8317 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8318 buf++;
8319 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
8320 num_put_wchar_wide_put(this, &dest, base, buf, 2);
8321 buf += 2;
8323 if(adjustfield != FMTFLAG_left) {
8324 num_put_wchar__Rep(this, ret, dest, fill, pad);
8325 pad = 0;
8328 for(i=0; i<count; i++) {
8329 if(!buf[i])
8330 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8331 else
8332 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8335 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8338 /* ?_Iput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPADI@Z */
8339 /* ?_Iput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEAD_K@Z */
8340 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8341 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, size_t count)
8343 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_wchar_use_facet(IOS_LOCALE(base)));
8346 /* ?_Iput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPADI@Z */
8347 /* ?_Iput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEAD_K@Z */
8348 ostreambuf_iterator_wchar* __cdecl num_put_short__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8349 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, size_t count)
8351 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_short_use_facet(IOS_LOCALE(base)));
8354 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z */
8355 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z */
8356 #if _MSVCP_VER <= 100
8357 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8358 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8359 (this, ret, dest, base, fill, v))
8360 #else
8361 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_wchar*, \
8362 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8363 (this, ret, dest, base, fill, v))
8364 #endif
8365 #if _MSVCP_VER != 80
8366 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 28)
8367 #else
8368 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 32)
8369 #endif
8370 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8371 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8373 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8374 char fmt[7]; /* strlen("%+#lld")+1 */
8376 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8378 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8379 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8382 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z */
8383 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z */
8384 #if _MSVCP_VER != 80
8385 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 28)
8386 #else
8387 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 32)
8388 #endif
8389 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8390 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8392 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8393 char fmt[7]; /* strlen("%+#lld")+1 */
8395 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8397 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8398 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8401 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z */
8402 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z */
8403 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z */
8404 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z */
8405 #if _MSVCP_VER != 80
8406 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 28)
8407 #else
8408 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 32)
8409 #endif
8410 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8411 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8413 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8414 return call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v);
8417 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z */
8418 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z */
8419 #if _MSVCP_VER <= 100
8420 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8421 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8422 (this, ret, dest, base, fill, v))
8423 #else
8424 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8425 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8426 (this, ret, dest, base, fill, v))
8427 #endif
8428 #if _MSVCP_VER != 80
8429 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 28)
8430 #else
8431 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 32)
8432 #endif
8433 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8434 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8436 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8437 char fmt[7]; /* strlen("%+#lld")+1 */
8439 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8441 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8442 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8445 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z */
8446 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z */
8447 #if _MSVCP_VER != 80
8448 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 28)
8449 #else
8450 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 32)
8451 #endif
8452 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8453 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8455 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8456 char fmt[7]; /* strlen("%+#lld")+1 */
8458 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8460 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8461 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8464 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z */
8465 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z */
8466 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z */
8467 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z */
8468 #if _MSVCP_VER != 80
8469 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 28)
8470 #else
8471 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 32)
8472 #endif
8473 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8474 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8476 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8477 return call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v);
8480 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z */
8481 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z */
8482 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z */
8483 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z */
8484 #if _MSVCP_VER <= 100
8485 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8486 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8487 (this, ret, dest, base, fill, v))
8488 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_wchar*, \
8489 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8490 (this, ret, dest, base, fill, v))
8491 #else
8492 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8493 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8494 (this, ret, dest, base, fill, v))
8495 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8496 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8497 (this, ret, dest, base, fill, v))
8498 #endif
8499 #if _MSVCP_VER != 80
8500 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 32)
8501 #else
8502 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 36)
8503 #endif
8504 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8505 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8507 char *tmp;
8508 char fmt[8]; /* strlen("%+#.*lg")+1 */
8509 int size;
8510 unsigned prec;
8512 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8514 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8515 prec = get_precision(base);
8516 size = _scprintf(fmt, prec, v);
8518 /* TODO: don't use dynamic allocation */
8519 tmp = operator_new(size*2);
8520 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8521 numpunct_wchar_use_facet(IOS_LOCALE(base)));
8522 operator_delete(tmp);
8523 return ret;
8526 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z */
8527 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z */
8528 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z */
8529 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z */
8530 #if _MSVCP_VER != 80
8531 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 32)
8532 #else
8533 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 36)
8534 #endif
8535 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8536 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8538 char *tmp;
8539 char fmt[8]; /* strlen("%+#.*lg")+1 */
8540 int size;
8541 unsigned prec;
8543 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8545 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8546 prec = get_precision(base);
8547 size = _scprintf(fmt, prec, v);
8549 /* TODO: don't use dynamic allocation */
8550 tmp = operator_new(size*2);
8551 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8552 numpunct_short_use_facet(IOS_LOCALE(base)));
8553 operator_delete(tmp);
8554 return ret;
8557 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z */
8558 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z */
8559 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z */
8560 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z */
8561 #if _MSVCP_VER != 80
8562 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 32)
8563 #else
8564 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 36)
8565 #endif
8566 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8567 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8569 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8570 return call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v);
8573 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z */
8574 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z */
8575 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z */
8576 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z */
8577 #if _MSVCP_VER != 80
8578 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 32)
8579 #else
8580 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 36)
8581 #endif
8582 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ldouble(const num_put *this, ostreambuf_iterator_wchar *ret,
8583 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8585 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8586 return call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v);
8589 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z */
8590 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z */
8591 #if _MSVCP_VER <= 100
8592 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
8593 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8594 (this, ret, dest, base, fill, v))
8595 #else
8596 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8597 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8598 (this, ret, dest, base, fill, v))
8599 #endif
8600 #if _MSVCP_VER != 80
8601 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 28)
8602 #else
8603 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 32)
8604 #endif
8605 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8606 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8608 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8610 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8612 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8615 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z */
8616 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z */
8617 #if _MSVCP_VER != 80
8618 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 28)
8619 #else
8620 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 32)
8621 #endif
8622 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8623 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8625 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8627 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8629 return num_put_short__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8632 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z */
8633 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z */
8634 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z */
8635 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z */
8636 #if _MSVCP_VER != 80
8637 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 28)
8638 #else
8639 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 32)
8640 #endif
8641 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8642 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8644 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8645 return call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v);
8648 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z */
8649 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z */
8650 #if _MSVCP_VER <= 100
8651 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8652 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8653 (this, ret, dest, base, fill, v))
8654 #else
8655 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8656 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8657 (this, ret, dest, base, fill, v))
8658 #endif
8659 #if _MSVCP_VER != 80
8660 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 32)
8661 #else
8662 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 36)
8663 #endif
8664 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8665 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8667 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8668 char fmt[7]; /* strlen("%+#lld")+1 */
8670 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8672 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8673 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8676 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z */
8677 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z */
8678 #if _MSVCP_VER != 80
8679 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 32)
8680 #else
8681 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 36)
8682 #endif
8683 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8684 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8686 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8687 char fmt[7]; /* strlen("%+#lld")+1 */
8689 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8691 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8692 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8695 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z */
8696 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z */
8697 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z */
8698 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z */
8699 #if _MSVCP_VER != 80
8700 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 32)
8701 #else
8702 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 36)
8703 #endif
8704 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8705 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8707 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8708 return call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v);
8711 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z */
8712 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z */
8713 #if _MSVCP_VER <= 100
8714 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8715 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8716 (this, ret, dest, base, fill, v))
8717 #else
8718 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8719 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8720 (this, ret, dest, base, fill, v))
8721 #endif
8722 #if _MSVCP_VER != 80
8723 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 32)
8724 #else
8725 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 36)
8726 #endif
8727 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8728 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8730 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8731 char fmt[7]; /* strlen("%+#lld")+1 */
8733 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8735 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8736 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8739 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z */
8740 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z */
8741 #if _MSVCP_VER != 80
8742 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 32)
8743 #else
8744 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 36)
8745 #endif
8746 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8747 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8749 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8750 char fmt[7]; /* strlen("%+#lld")+1 */
8752 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8754 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8755 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8758 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z */
8759 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z */
8760 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z */
8761 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z */
8762 #if _MSVCP_VER != 80
8763 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 32)
8764 #else
8765 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 36)
8766 #endif
8767 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8768 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8770 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8771 return call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v);
8774 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z */
8775 /* ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z */
8776 #if _MSVCP_VER <= 100
8777 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8778 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, bool), \
8779 (this, ret, dest, base, fill, v))
8780 #else
8781 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_wchar*, \
8782 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, bool), \
8783 (this, ret, dest, base, fill, v))
8784 #endif
8785 #if _MSVCP_VER != 80
8786 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 28)
8787 #else
8788 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 32)
8789 #endif
8790 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8791 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8793 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8795 if(base->fmtfl & FMTFLAG_boolalpha) {
8796 numpunct_wchar *numpunct = numpunct_wchar_use_facet(IOS_LOCALE(base));
8797 basic_string_wchar str;
8798 size_t pad, len;
8800 if(v)
8801 numpunct_wchar_truename(numpunct, &str);
8802 else
8803 numpunct_wchar_falsename(numpunct, &str);
8805 len = MSVCP_basic_string_wchar_length(&str);
8806 pad = (len>base->wide ? 0 : base->wide-len);
8807 base->wide = 0;
8809 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8810 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8811 pad = 0;
8813 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8814 MSVCP_basic_string_wchar_dtor(&str);
8815 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8818 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8821 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z */
8822 /* ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z */
8823 #if _MSVCP_VER != 80
8824 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 28)
8825 #else
8826 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 32)
8827 #endif
8828 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8829 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8831 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8833 if(base->fmtfl & FMTFLAG_boolalpha) {
8834 numpunct_wchar *numpunct = numpunct_short_use_facet(IOS_LOCALE(base));
8835 basic_string_wchar str;
8836 size_t pad, len;
8838 if(v)
8839 numpunct_wchar_truename(numpunct, &str);
8840 else
8841 numpunct_wchar_falsename(numpunct, &str);
8843 len = MSVCP_basic_string_wchar_length(&str);
8844 pad = (len>base->wide ? 0 : base->wide-len);
8845 base->wide = 0;
8847 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8848 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8849 pad = 0;
8851 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8852 MSVCP_basic_string_wchar_dtor(&str);
8853 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8856 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8859 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z */
8860 /* ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z */
8861 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z */
8862 /* ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z */
8863 #if _MSVCP_VER != 80
8864 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 28)
8865 #else
8866 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 32)
8867 #endif
8868 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8869 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8871 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8872 return call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v);
8875 /* ?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
8876 locale_id time_put_char_id = {0};
8878 /* ??_7?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
8879 extern const vtable_ptr time_put_char_vtable;
8881 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
8882 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
8883 DEFINE_THISCALL_WRAPPER(time_put_char__Init, 8)
8884 void __thiscall time_put_char__Init(time_put *this, const _Locinfo *locinfo)
8886 TRACE("(%p %p)\n", this, locinfo);
8887 _Locinfo__Gettnames(locinfo, &this->time);
8888 #if _MSVCP_VER <= 100
8889 _Locinfo__Getcvt(locinfo, &this->cvt);
8890 #endif
8893 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
8894 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
8895 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_locinfo, 12)
8896 time_put* __thiscall time_put_char_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
8898 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
8899 locale_facet_ctor_refs(&this->facet, refs);
8900 this->facet.vtable = &time_put_char_vtable;
8901 time_put_char__Init(this, locinfo);
8902 return this;
8905 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
8906 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
8907 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_refs, 8)
8908 time_put* __thiscall time_put_char_ctor_refs(time_put *this, size_t refs)
8910 _Locinfo locinfo;
8912 TRACE("(%p %Iu)\n", this, refs);
8914 _Locinfo_ctor(&locinfo);
8915 time_put_char_ctor_locinfo(this, &locinfo, refs);
8916 _Locinfo_dtor(&locinfo);
8917 return this;
8920 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
8921 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
8922 DEFINE_THISCALL_WRAPPER(time_put_char_ctor, 4)
8923 time_put* __thiscall time_put_char_ctor(time_put *this)
8925 return time_put_char_ctor_refs(this, 0);
8928 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
8929 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
8930 DEFINE_THISCALL_WRAPPER(time_put_char_dtor, 4)
8931 void __thiscall time_put_char_dtor(time_put *this)
8933 TRACE("(%p)\n", this);
8934 _Timevec_dtor(&this->time);
8937 DEFINE_THISCALL_WRAPPER(time_put_char_vector_dtor, 8)
8938 time_put* __thiscall time_put_char_vector_dtor(time_put *this, unsigned int flags)
8940 TRACE("(%p %x)\n", this, flags);
8941 if(flags & 2) {
8942 /* we have an array, with the number of elements stored before the first object */
8943 INT_PTR i, *ptr = (INT_PTR *)this-1;
8945 for(i=*ptr-1; i>=0; i--)
8946 time_put_char_dtor(this+i);
8947 operator_delete(ptr);
8948 } else {
8949 time_put_char_dtor(this);
8950 if(flags & 1)
8951 operator_delete(this);
8954 return this;
8957 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
8958 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
8959 size_t __cdecl time_put_char__Getcat(const locale_facet **facet, const locale *loc)
8961 TRACE("(%p %p)\n", facet, loc);
8963 if(facet && !*facet) {
8964 _Locinfo locinfo;
8966 *facet = operator_new(sizeof(time_put));
8967 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
8968 time_put_char_ctor_locinfo((time_put*)*facet, &locinfo, 0);
8969 _Locinfo_dtor(&locinfo);
8972 return LC_TIME;
8975 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
8976 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
8977 size_t __cdecl time_put_char__Getcat_old(const locale_facet **facet)
8979 return time_put_char__Getcat(facet, locale_classic());
8982 static time_put* time_put_char_use_facet(const locale *loc)
8984 static time_put *obj = NULL;
8986 _Lockit lock;
8987 const locale_facet *fac;
8989 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8990 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_char_id));
8991 if(fac) {
8992 _Lockit_dtor(&lock);
8993 return (time_put*)fac;
8996 if(obj) {
8997 _Lockit_dtor(&lock);
8998 return obj;
9001 time_put_char__Getcat(&fac, loc);
9002 obj = (time_put*)fac;
9003 call_locale_facet__Incref(&obj->facet);
9004 locale_facet_register(&obj->facet);
9005 _Lockit_dtor(&lock);
9007 return obj;
9010 #if _MSVCP_VER >= 70
9012 /* ?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z */
9013 /* ?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z */
9014 #if _MSVCP_VER != 80
9015 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 36)
9016 #else
9017 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 40)
9018 #endif
9019 #if _MSVCP_VER <= 100
9020 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9021 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9022 (this, ret, dest, base, fill, t, spec, mod))
9023 #else
9024 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
9025 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9026 (this, ret, dest, base, fill, t, spec, mod))
9027 #endif
9028 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9029 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9031 char buf[64], fmt[4], *p = fmt;
9032 size_t i, len;
9034 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9036 *p++ = '%';
9037 if(mod)
9038 *p++ = mod;
9039 *p++ = spec;
9040 *p++ = 0;
9042 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9043 for(i=0; i<len; i++)
9044 ostreambuf_iterator_char_put(&dest, buf[i]);
9046 *ret = dest;
9047 return ret;
9050 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z */
9051 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z */
9052 #if _MSVCP_VER != 80
9053 DEFINE_THISCALL_WRAPPER(time_put_char_put, 36)
9054 #else
9055 DEFINE_THISCALL_WRAPPER(time_put_char_put, 40)
9056 #endif
9057 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9058 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9060 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9061 return call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod);
9064 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@PBD3@Z */
9065 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@PEBD3@Z */
9066 #if _MSVCP_VER != 80
9067 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 36)
9068 #else
9069 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 40)
9070 #endif
9071 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9072 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, const char *pat, const char *pat_end)
9074 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_an(pat, pat_end-pat));
9076 while(pat < pat_end) {
9077 if(*pat != '%') {
9078 ostreambuf_iterator_char_put(&dest, *pat++);
9079 }else if(++pat == pat_end) {
9080 ostreambuf_iterator_char_put(&dest, '%');
9081 }else if(*pat=='#' && pat+1==pat_end) {
9082 ostreambuf_iterator_char_put(&dest, '%');
9083 ostreambuf_iterator_char_put(&dest, *pat++);
9084 }else {
9085 char mod;
9087 if(*pat == '#') {
9088 mod = '#';
9089 pat++;
9090 }else {
9091 mod = 0;
9094 time_put_char_put(this, &dest, dest, base, fill, t, *pat++, mod);
9098 *ret = dest;
9099 return ret;
9102 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9104 /* ?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@PBUtm@@DD@Z */
9105 /* ?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@PEBUtm@@DD@Z */
9106 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 32)
9107 #define call_time_put_char_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9108 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, const struct tm*, char, char), \
9109 (this, ret, dest, base, t, spec, mod))
9110 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9111 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9113 char buf[64], fmt[4], *p = fmt;
9114 size_t i, len;
9116 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9118 *p++ = '%';
9119 if(mod)
9120 *p++ = mod;
9121 *p++ = spec;
9122 *p++ = 0;
9124 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9125 for(i=0; i<len; i++)
9126 ostreambuf_iterator_char_put(&dest, buf[i]);
9128 *ret = dest;
9129 return ret;
9132 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@PBUtm@@DD@Z */
9133 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@PEBUtm@@DD@Z */
9134 DEFINE_THISCALL_WRAPPER(time_put_char_put, 32)
9135 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9136 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9138 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9139 return call_time_put_char_do_put(this, ret, dest, base, t, spec, mod);
9142 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@PBUtm@@PBD3@Z */
9143 /* ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@PEBUtm@@PEBD3@Z */
9144 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 32)
9145 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9146 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, const char *pat, const char *pat_end)
9148 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_an(pat, pat_end-pat));
9150 while(pat < pat_end) {
9151 if(*pat != '%') {
9152 ostreambuf_iterator_char_put(&dest, *pat++);
9153 }else if(++pat == pat_end) {
9154 ostreambuf_iterator_char_put(&dest, '%');
9155 }else if(*pat=='#' && pat+1==pat_end) {
9156 ostreambuf_iterator_char_put(&dest, '%');
9157 ostreambuf_iterator_char_put(&dest, *pat++);
9158 }else {
9159 char mod;
9161 if(*pat == '#') {
9162 mod = '#';
9163 pat++;
9164 }else {
9165 mod = 0;
9168 time_put_char_put(this, &dest, dest, base, t, *pat++, mod);
9172 *ret = dest;
9173 return ret;
9176 #endif /* MSVCP_VER >= 70 */
9178 /* ?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
9179 locale_id time_put_wchar_id = {0};
9180 /* ?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
9181 locale_id time_put_short_id = {0};
9183 /* ??_7?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
9184 extern const vtable_ptr time_put_wchar_vtable;
9185 /* ??_7?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
9186 extern const vtable_ptr time_put_short_vtable;
9188 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9189 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9190 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9191 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9192 DEFINE_THISCALL_WRAPPER(time_put_wchar__Init, 8)
9193 void __thiscall time_put_wchar__Init(time_put *this, const _Locinfo *locinfo)
9195 TRACE("(%p %p)\n", this, locinfo);
9196 _Locinfo__Gettnames(locinfo, &this->time);
9197 #if _MSVCP_VER <= 100
9198 _Locinfo__Getcvt(locinfo, &this->cvt);
9199 #endif
9202 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9203 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9204 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_locinfo, 12)
9205 time_put* __thiscall time_put_wchar_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
9207 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
9208 locale_facet_ctor_refs(&this->facet, refs);
9209 this->facet.vtable = &time_put_wchar_vtable;
9210 time_put_wchar__Init(this, locinfo);
9211 return this;
9214 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9215 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9216 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_locinfo, 12)
9217 time_put* __thiscall time_put_short_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
9219 time_put_wchar_ctor_locinfo(this, locinfo, refs);
9220 this->facet.vtable = &time_put_short_vtable;
9221 return this;
9224 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
9225 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
9226 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_name, 12)
9227 time_put* __thiscall time_put_wchar_ctor_name(time_put *this, const char *name, size_t refs)
9229 _Locinfo locinfo;
9231 TRACE("(%p %s %Iu)\n", this, debugstr_a(name), refs);
9233 _Locinfo_ctor_cstr(&locinfo, name);
9234 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9235 _Locinfo_dtor(&locinfo);
9236 return this;
9239 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAE@PBDI@Z */
9240 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z */
9241 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_name, 12)
9242 time_put* __thiscall time_put_short_ctor_name(time_put *this, const char *name, size_t refs)
9244 time_put_wchar_ctor_name(this, name, refs);
9245 this->facet.vtable = &time_put_short_vtable;
9246 return this;
9249 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
9250 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
9251 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_refs, 8)
9252 time_put* __thiscall time_put_wchar_ctor_refs(time_put *this, size_t refs)
9254 _Locinfo locinfo;
9256 TRACE("(%p %Iu)\n", this, refs);
9258 _Locinfo_ctor(&locinfo);
9259 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9260 _Locinfo_dtor(&locinfo);
9261 return this;
9264 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
9265 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
9266 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_refs, 8)
9267 time_put* __thiscall time_put_short_ctor_refs(time_put *this, size_t refs)
9269 time_put_wchar_ctor_refs(this, refs);
9270 this->facet.vtable = &time_put_short_vtable;
9271 return this;
9274 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
9275 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
9276 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor, 4)
9277 time_put* __thiscall time_put_wchar_ctor(time_put *this)
9279 return time_put_wchar_ctor_refs(this, 0);
9282 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
9283 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
9284 DEFINE_THISCALL_WRAPPER(time_put_short_ctor, 4)
9285 time_put* __thiscall time_put_short_ctor(time_put *this)
9287 time_put_wchar_ctor(this);
9288 this->facet.vtable = &time_put_short_vtable;
9289 return this;
9292 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
9293 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
9294 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
9295 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
9296 DEFINE_THISCALL_WRAPPER(time_put_wchar_dtor, 4)
9297 void __thiscall time_put_wchar_dtor(time_put *this)
9299 TRACE("(%p)\n", this);
9300 _Timevec_dtor(&this->time);
9303 DEFINE_THISCALL_WRAPPER(time_put_wchar_vector_dtor, 8)
9304 time_put* __thiscall time_put_wchar_vector_dtor(time_put *this, unsigned int flags)
9306 TRACE("(%p %x)\n", this, flags);
9307 if(flags & 2) {
9308 /* we have an array, with the number of elements stored before the first object */
9309 INT_PTR i, *ptr = (INT_PTR *)this-1;
9311 for(i=*ptr-1; i>=0; i--)
9312 time_put_wchar_dtor(this+i);
9313 operator_delete(ptr);
9314 } else {
9315 time_put_wchar_dtor(this);
9316 if(flags & 1)
9317 operator_delete(this);
9320 return this;
9323 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9324 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9325 size_t __cdecl time_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
9327 TRACE("(%p %p)\n", facet, loc);
9329 if(facet && !*facet) {
9330 *facet = operator_new(sizeof(time_put));
9331 time_put_wchar_ctor_name((time_put*)*facet,
9332 locale_string_char_c_str(&loc->ptr->name), 0);
9335 return LC_TIME;
9338 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9339 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9340 size_t __cdecl time_put_wchar__Getcat_old(const locale_facet **facet)
9342 return time_put_wchar__Getcat(facet, locale_classic());
9345 static time_put* time_put_wchar_use_facet(const locale *loc)
9347 static time_put *obj = NULL;
9349 _Lockit lock;
9350 const locale_facet *fac;
9352 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9353 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_wchar_id));
9354 if(fac) {
9355 _Lockit_dtor(&lock);
9356 return (time_put*)fac;
9359 if(obj) {
9360 _Lockit_dtor(&lock);
9361 return obj;
9364 time_put_wchar__Getcat(&fac, loc);
9365 obj = (time_put*)fac;
9366 call_locale_facet__Incref(&obj->facet);
9367 locale_facet_register(&obj->facet);
9368 _Lockit_dtor(&lock);
9370 return obj;
9373 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9374 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9375 size_t __cdecl time_put_short__Getcat(const locale_facet **facet, const locale *loc)
9377 TRACE("(%p %p)\n", facet, loc);
9379 if(facet && !*facet) {
9380 *facet = operator_new(sizeof(time_put));
9381 time_put_short_ctor_name((time_put*)*facet,
9382 locale_string_char_c_str(&loc->ptr->name), 0);
9385 return LC_TIME;
9388 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9389 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9390 size_t __cdecl time_put_short__Getcat_old(const locale_facet **facet)
9392 return time_put_short__Getcat(facet, locale_classic());
9395 static time_put* time_put_short_use_facet(const locale *loc)
9397 static time_put *obj = NULL;
9399 _Lockit lock;
9400 const locale_facet *fac;
9402 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9403 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_short_id));
9404 if(fac) {
9405 _Lockit_dtor(&lock);
9406 return (time_put*)fac;
9409 if(obj) {
9410 _Lockit_dtor(&lock);
9411 return obj;
9414 time_put_short__Getcat(&fac, loc);
9415 obj = (time_put*)fac;
9416 call_locale_facet__Incref(&obj->facet);
9417 locale_facet_register(&obj->facet);
9418 _Lockit_dtor(&lock);
9420 return obj;
9423 #if _MSVCP_VER >= 70
9425 /* ?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z */
9426 /* ?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z */
9427 /* ?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z */
9428 /* ?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z */
9429 #if _MSVCP_VER != 80
9430 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 36)
9431 #else
9432 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 40)
9433 #endif
9434 #if _MSVCP_VER <= 100
9435 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9436 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9437 (this, ret, dest, base, fill, t, spec, mod))
9438 #else
9439 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
9440 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9441 (this, ret, dest, base, fill, t, spec, mod))
9442 #endif
9443 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9444 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9445 wchar_t fill, const struct tm *t, char spec, char mod)
9447 char buf[64], fmt[4], *p = fmt;
9448 size_t i, len;
9449 const _Cvtvec *cvt;
9450 wchar_t c;
9452 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9454 *p++ = '%';
9455 if(mod)
9456 *p++ = mod;
9457 *p++ = spec;
9458 *p++ = 0;
9460 #if _MSVCP_VER <= 100
9461 cvt = &this->cvt;
9462 #else
9463 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9464 #endif
9466 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9467 for(i=0; i<len; i++) {
9468 c = mb_to_wc(buf[i], cvt);
9469 ostreambuf_iterator_wchar_put(&dest, c);
9472 *ret = dest;
9473 return ret;
9476 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z */
9477 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z */
9478 /* ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z */
9479 /* ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z */
9480 #if _MSVCP_VER != 80
9481 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 36)
9482 #else
9483 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 40)
9484 #endif
9485 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9486 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9487 wchar_t fill, const struct tm *t, char spec, char mod)
9489 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9490 return call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod);
9493 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@PBG3@Z */
9494 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@PEBG3@Z */
9495 /* ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@PB_W4@Z */
9496 /* ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@PEB_W4@Z */
9497 #if _MSVCP_VER != 80
9498 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 36)
9499 #else
9500 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 40)
9501 #endif
9502 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9503 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9504 wchar_t fill, const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9506 wchar_t percent;
9507 char c[MB_LEN_MAX];
9508 const _Cvtvec *cvt;
9510 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_wn(pat, pat_end-pat));
9512 #if _MSVCP_VER <= 100
9513 cvt = &this->cvt;
9514 #else
9515 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9516 #endif
9518 percent = mb_to_wc('%', cvt);
9519 while(pat < pat_end) {
9520 if(*pat != percent) {
9521 ostreambuf_iterator_wchar_put(&dest, *pat++);
9522 }else if(++pat == pat_end) {
9523 ostreambuf_iterator_wchar_put(&dest, percent);
9524 }else if(_Wcrtomb(c, *pat, NULL, cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9525 ostreambuf_iterator_wchar_put(&dest, percent);
9526 ostreambuf_iterator_wchar_put(&dest, *pat++);
9527 }else {
9528 pat++;
9529 if(*c == '#') {
9530 if(_Wcrtomb(c, *pat++, NULL, cvt) != 1) {
9531 ostreambuf_iterator_wchar_put(&dest, percent);
9532 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9533 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9534 }else {
9535 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, '#');
9537 }else {
9538 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, 0);
9543 *ret = dest;
9544 return ret;
9547 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9549 /* ?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@PBUtm@@DD@Z */
9550 /* ?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@PEBUtm@@DD@Z */
9551 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 32)
9552 #define call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9553 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, const struct tm*, char, char), \
9554 (this, ret, dest, base, t, spec, mod))
9555 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9556 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9557 const struct tm *t, char spec, char mod)
9559 char buf[64], fmt[4], *p = fmt;
9560 size_t i, len;
9561 wchar_t c;
9563 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9565 *p++ = '%';
9566 if(mod)
9567 *p++ = mod;
9568 *p++ = spec;
9569 *p++ = 0;
9571 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9572 for(i=0; i<len; i++) {
9573 c = mb_to_wc(buf[i], &this->cvt);
9574 ostreambuf_iterator_wchar_put(&dest, c);
9577 *ret = dest;
9578 return ret;
9581 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@PBUtm@@DD@Z */
9582 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@PEBUtm@@DD@Z */
9583 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 32)
9584 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9585 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9586 const struct tm *t, char spec, char mod)
9588 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9589 return call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod);
9592 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@PBUtm@@PBG3@Z */
9593 /* ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@PEBUtm@@PEBG3@Z */
9594 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 32)
9595 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9596 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9597 const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9599 wchar_t percent = mb_to_wc('%', &this->cvt);
9600 char c[MB_LEN_MAX];
9602 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_wn(pat, pat_end-pat));
9604 while(pat < pat_end) {
9605 if(*pat != percent) {
9606 ostreambuf_iterator_wchar_put(&dest, *pat++);
9607 }else if(++pat == pat_end) {
9608 ostreambuf_iterator_wchar_put(&dest, percent);
9609 }else if(_Wcrtomb(c, *pat, NULL, &this->cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9610 ostreambuf_iterator_wchar_put(&dest, percent);
9611 ostreambuf_iterator_wchar_put(&dest, *pat++);
9612 }else {
9613 pat++;
9614 if(*c == '#') {
9615 if(_Wcrtomb(c, *pat++, NULL, &this->cvt) != 1) {
9616 ostreambuf_iterator_wchar_put(&dest, percent);
9617 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9618 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9619 }else {
9620 time_put_wchar_put(this, &dest, dest, base, t, *c, '#');
9622 }else {
9623 time_put_wchar_put(this, &dest, dest, base, t, *c, 0);
9628 *ret = dest;
9629 return ret;
9632 #endif /* _MSVCP_VER >= 70 */
9634 /* ?id@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
9635 locale_id time_get_char_id = {0};
9637 /* ??_7?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
9638 extern const vtable_ptr time_get_char_vtable;
9640 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9641 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9642 DEFINE_THISCALL_WRAPPER(time_get_char__Init, 8)
9643 void __thiscall time_get_char__Init(time_get_char *this, const _Locinfo *locinfo)
9645 const char *months;
9646 const char *days;
9647 int len;
9649 TRACE("(%p %p)\n", this, locinfo);
9651 days = _Locinfo__Getdays(locinfo);
9652 len = strlen(days)+1;
9653 this->days = operator_new(len);
9654 memcpy((char*)this->days, days, len);
9656 months = _Locinfo__Getmonths(locinfo);
9657 len = strlen(months)+1;
9658 this->months = operator_new(len);
9659 memcpy((char*)this->months, months, len);
9661 this->dateorder = _Locinfo__Getdateorder(locinfo);
9662 _Locinfo__Getcvt(locinfo, &this->cvt);
9665 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9666 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9667 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_locinfo, 12)
9668 time_get_char* __thiscall time_get_char_ctor_locinfo(time_get_char *this,
9669 const _Locinfo *locinfo, size_t refs)
9671 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
9672 locale_facet_ctor_refs(&this->facet, refs);
9673 this->facet.vtable = &time_get_char_vtable;
9674 time_get_char__Init(this, locinfo);
9675 return this;
9678 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAE@PBDI@Z */
9679 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAA@PEBD_K@Z */
9680 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_name, 12)
9681 time_get_char* __thiscall time_get_char_ctor_name(time_get_char *this, const char *name, size_t refs)
9683 _Locinfo locinfo;
9685 TRACE("(%p %s %Iu)\n", this, name, refs);
9687 _Locinfo_ctor_cstr(&locinfo, name);
9688 time_get_char_ctor_locinfo(this, &locinfo, refs);
9689 _Locinfo_dtor(&locinfo);
9690 return this;
9693 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
9694 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
9695 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_refs, 8)
9696 time_get_char* __thiscall time_get_char_ctor_refs(time_get_char *this, size_t refs)
9698 _Locinfo locinfo;
9700 TRACE("(%p %Iu)\n", this, refs);
9702 _Locinfo_ctor(&locinfo);
9703 time_get_char_ctor_locinfo(this, &locinfo, refs);
9704 _Locinfo_dtor(&locinfo);
9705 return this;
9708 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
9709 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
9710 DEFINE_THISCALL_WRAPPER(time_get_char_ctor, 4)
9711 time_get_char* __thiscall time_get_char_ctor(time_get_char *this)
9713 return time_get_char_ctor_refs(this, 0);
9716 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AAEXXZ */
9717 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEAAXXZ */
9718 DEFINE_THISCALL_WRAPPER(time_get_char__Tidy, 4)
9719 void __thiscall time_get_char__Tidy(time_get_char *this)
9721 TRACE("(%p)\n", this);
9723 operator_delete((char*)this->days);
9724 operator_delete((char*)this->months);
9727 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
9728 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
9729 DEFINE_THISCALL_WRAPPER(time_get_char_dtor, 4) /* virtual */
9730 void __thiscall time_get_char_dtor(time_get_char *this)
9732 TRACE("(%p)\n", this);
9734 time_get_char__Tidy(this);
9737 DEFINE_THISCALL_WRAPPER(time_get_char_vector_dtor, 8)
9738 time_get_char* __thiscall time_get_char_vector_dtor(time_get_char *this, unsigned int flags)
9740 TRACE("(%p %x)\n", this, flags);
9741 if(flags & 2) {
9742 /* we have an array, with the number of elements stored before the first object */
9743 INT_PTR i, *ptr = (INT_PTR *)this-1;
9745 for(i=*ptr-1; i>=0; i--)
9746 time_get_char_dtor(this+i);
9747 operator_delete(ptr);
9748 } else {
9749 time_get_char_dtor(this);
9750 if(flags & 1)
9751 operator_delete(this);
9754 return this;
9757 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9758 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9759 unsigned int __cdecl time_get_char__Getcat(const locale_facet **facet, const locale *loc)
9761 TRACE("(%p %p)\n", facet, loc);
9763 if(facet && !*facet) {
9764 _Locinfo locinfo;
9766 *facet = operator_new(sizeof(time_get_char));
9767 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
9768 time_get_char_ctor_locinfo((time_get_char*)*facet, &locinfo, 0);
9769 _Locinfo_dtor(&locinfo);
9772 return LC_TIME;
9775 static time_get_char* time_get_char_use_facet(const locale *loc)
9777 static time_get_char *obj = NULL;
9779 _Lockit lock;
9780 const locale_facet *fac;
9782 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9783 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_char_id));
9784 if(fac) {
9785 _Lockit_dtor(&lock);
9786 return (time_get_char*)fac;
9789 if(obj) {
9790 _Lockit_dtor(&lock);
9791 return obj;
9794 time_get_char__Getcat(&fac, loc);
9795 obj = (time_get_char*)fac;
9796 call_locale_facet__Incref(&obj->facet);
9797 locale_facet_register(&obj->facet);
9798 _Lockit_dtor(&lock);
9800 return obj;
9803 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAH@Z */
9804 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAEAH@Z */
9805 int __cdecl time_get_char__Getint(const time_get_char *this,
9806 istreambuf_iterator_char *b, istreambuf_iterator_char *e,
9807 int min_val, int max_val, int *val)
9809 BOOL got_digit = FALSE;
9810 int len = 0, ret = 0;
9811 char buf[16];
9813 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
9815 istreambuf_iterator_char_val(b);
9816 if(b->strbuf && (b->val == '-' || b->val == '+'))
9818 buf[len++] = b->val;
9819 istreambuf_iterator_char_inc(b);
9822 if (b->strbuf && b->val == '0')
9824 got_digit = TRUE;
9825 buf[len++] = '0';
9826 istreambuf_iterator_char_inc(b);
9828 while (b->strbuf && b->val == '0')
9829 istreambuf_iterator_char_inc(b);
9831 for (; b->strbuf && b->val >= '0' && b->val <= '9';
9832 istreambuf_iterator_char_inc(b))
9834 if(len < ARRAY_SIZE(buf)-1)
9835 buf[len] = b->val;
9836 got_digit = TRUE;
9837 len++;
9840 if (!b->strbuf)
9841 ret |= IOSTATE_eofbit;
9842 if (got_digit && len < ARRAY_SIZE(buf)-1)
9844 int v, err;
9846 buf[len] = 0;
9847 v = _Stolx(buf, NULL, 10, &err);
9848 if(err || v < min_val || v > max_val)
9849 ret |= IOSTATE_failbit;
9850 else
9851 *val = v;
9853 else
9854 ret |= IOSTATE_failbit;
9855 return ret;
9858 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
9859 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
9860 DEFINE_THISCALL_WRAPPER(time_get_char_do_date_order, 4) /* virtual */
9861 #if _MSVCP_VER <= 100
9862 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_char*), (this))
9863 #else
9864 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_char*), (this))
9865 #endif
9866 dateorder __thiscall time_get_char_do_date_order(const time_get_char *this)
9868 TRACE("(%p)\n", this);
9869 return this->dateorder;
9872 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
9873 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
9874 DEFINE_THISCALL_WRAPPER(time_get_char_date_order, 4)
9875 dateorder __thiscall time_get_char_date_order(const time_get_char *this)
9877 return call_time_get_char_do_date_order(this);
9880 static int find_longest_match_char(istreambuf_iterator_char *iter, const char *str)
9882 int i, len = 0, last_match = -1, match = -1;
9883 const char *p, *end;
9884 char buf[64];
9886 for(istreambuf_iterator_char_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
9887 istreambuf_iterator_char_inc(iter))
9889 BOOL got_prefix = FALSE;
9891 buf[len++] = iter->val;
9892 last_match = match;
9893 match = -1;
9894 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
9896 end = strchr(p, ':');
9897 if (!end)
9898 end = p + strlen(p);
9900 if (end-p >= len && !memcmp(p, buf, len))
9902 if (end-p == len)
9903 match = i;
9904 else
9905 got_prefix = TRUE;
9909 if (!got_prefix)
9911 if (match != -1)
9913 istreambuf_iterator_char_inc(iter);
9914 return match;
9916 break;
9919 if (len == ARRAY_SIZE(buf))
9920 FIXME("temporary buffer is too small\n");
9921 if (!iter->strbuf)
9922 return match;
9923 return last_match;
9926 /* ?do_get_monthname@?$time_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@AAHPAUtm@@@Z */
9927 /* ?do_get_monthname@?$time_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@AEAHPEAUtm@@@Z */
9928 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_monthname, 36) /* virtual */
9929 #if _MSVCP_VER <= 100
9930 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
9931 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9932 (this, ret, s, e, base, err, t))
9933 #else
9934 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
9935 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9936 (this, ret, s, e, base, err, t))
9937 #endif
9938 istreambuf_iterator_char* __thiscall time_get_char_do_get_monthname(const time_get_char *this,
9939 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
9940 ios_base *base, int *err, struct tm *t)
9942 int match;
9944 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
9946 if ((match = find_longest_match_char(&s, this->months)) != -1)
9947 t->tm_mon = match / 2;
9948 else
9949 *err |= IOSTATE_failbit;
9951 *ret = s;
9952 return ret;
9955 /* ?get_monthname@?$time_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@AAHPAUtm@@@Z */
9956 /* ?get_monthname@?$time_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@AEAHPEAUtm@@@Z */
9957 DEFINE_THISCALL_WRAPPER(time_get_char_get_monthname, 36)
9958 istreambuf_iterator_char* __thiscall time_get_char_get_monthname(const time_get_char *this,
9959 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
9960 ios_base *base, int *err, struct tm *t)
9962 return call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t);
9965 /* ?do_get_time@?$time_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@AAHPAUtm@@@Z */
9966 /* ?do_get_time@?$time_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@AEAHPEAUtm@@@Z */
9967 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_time, 36) /* virtual */
9968 #if _MSVCP_VER <= 100
9969 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
9970 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9971 (this, ret, s, e, base, err, t))
9972 #else
9973 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
9974 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9975 (this, ret, s, e, base, err, t))
9976 #endif
9977 istreambuf_iterator_char* __thiscall time_get_char_do_get_time(const time_get_char *this,
9978 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
9979 ios_base *base, int *err, struct tm *t)
9981 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
9983 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
9984 if (*err || istreambuf_iterator_char_val(&s)!=':')
9985 *err |= IOSTATE_failbit;
9987 if (!*err)
9989 istreambuf_iterator_char_inc(&s);
9990 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
9992 if (*err || istreambuf_iterator_char_val(&s)!=':')
9993 *err |= IOSTATE_failbit;
9995 if (!*err)
9997 istreambuf_iterator_char_inc(&s);
9998 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10001 *ret = s;
10002 return ret;
10005 /* ?get_time@?$time_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@AAHPAUtm@@@Z */
10006 /* ?get_time@?$time_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@AEAHPEAUtm@@@Z */
10007 DEFINE_THISCALL_WRAPPER(time_get_char_get_time, 36)
10008 istreambuf_iterator_char* __thiscall time_get_char_get_time(const time_get_char *this,
10009 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10010 ios_base *base, int *err, struct tm *t)
10012 return call_time_get_char_do_get_time(this, ret, s, e, base, err, t);
10015 /* ?do_get_weekday@?$time_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@AAHPAUtm@@@Z */
10016 /* ?do_get_weekday@?$time_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@AEAHPEAUtm@@@Z */
10017 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_weekday, 36) /* virtual */
10018 #if _MSVCP_VER <= 100
10019 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
10020 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10021 (this, ret, s, e, base, err, t))
10022 #else
10023 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10024 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10025 (this, ret, s, e, base, err, t))
10026 #endif
10027 istreambuf_iterator_char* __thiscall time_get_char_do_get_weekday(const time_get_char *this,
10028 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10029 ios_base *base, int *err, struct tm *t)
10031 int match;
10033 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10035 if ((match = find_longest_match_char(&s, this->days)) != -1)
10036 t->tm_wday = match / 2;
10037 else
10038 *err |= IOSTATE_failbit;
10040 *ret = s;
10041 return ret;
10044 /* ?get_weekday@?$time_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@AAHPAUtm@@@Z */
10045 /* ?get_weekday@?$time_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@AEAHPEAUtm@@@Z */
10046 DEFINE_THISCALL_WRAPPER(time_get_char_get_weekday, 36)
10047 istreambuf_iterator_char* __thiscall time_get_char_get_weekday(const time_get_char *this,
10048 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10049 ios_base *base, int *err, struct tm *t)
10051 return call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t);
10054 /* ?do_get_year@?$time_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@AAHPAUtm@@@Z */
10055 /* ?do_get_year@?$time_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@AEAHPEAUtm@@@Z */
10056 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_year, 36) /* virtual */
10057 #if _MSVCP_VER <= 100
10058 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10059 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10060 (this, ret, s, e, base, err, t))
10061 #else
10062 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
10063 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10064 (this, ret, s, e, base, err, t))
10065 #endif
10066 istreambuf_iterator_char* __thiscall time_get_char_do_get_year(const time_get_char *this,
10067 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10068 ios_base *base, int *err, struct tm *t)
10070 int year;
10072 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10074 /* The function supports only dates from [1900-2035] range */
10075 *err |= time_get_char__Getint(this, &s, &e, 0, 2035, &year);
10076 if (!(*err & IOSTATE_failbit))
10078 if (year >= 1900)
10079 year -= 1900;
10080 if (year > 135)
10081 *err |= IOSTATE_failbit;
10082 else
10083 t->tm_year = year;
10086 *ret = s;
10087 return ret;
10090 /* ?get_year@?$time_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@AAHPAUtm@@@Z */
10091 /* ?get_year@?$time_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@AEAHPEAUtm@@@Z */
10092 DEFINE_THISCALL_WRAPPER(time_get_char_get_year, 36)
10093 istreambuf_iterator_char* __thiscall time_get_char_get_year(const time_get_char *this,
10094 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10095 ios_base *base, int *err, struct tm *t)
10097 return call_time_get_char_do_get_year(this, ret, s, e, base, err, t);
10100 static void skip_ws_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10102 istreambuf_iterator_char_val(iter);
10103 while(iter->strbuf && ctype_char_is_ch(ctype, _SPACE, iter->val))
10104 istreambuf_iterator_char_inc(iter);
10107 static void skip_date_delim_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10109 skip_ws_char(ctype, iter);
10110 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
10111 istreambuf_iterator_char_inc(iter);
10112 skip_ws_char(ctype, iter);
10115 /* ?do_get_date@?$time_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@AAHPAUtm@@@Z */
10116 /* ?do_get_date@?$time_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@AEAHPEAUtm@@@Z */
10117 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_date, 36) /* virtual */
10118 #if _MSVCP_VER <= 100
10119 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
10120 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10121 (this, ret, s, e, base, err, t))
10122 #else
10123 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
10124 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10125 (this, ret, s, e, base, err, t))
10126 #endif
10127 istreambuf_iterator_char* __thiscall time_get_char_do_get_date(const time_get_char *this,
10128 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10129 ios_base *base, int *err, struct tm *t)
10131 ctype_char *ctype;
10132 dateorder order;
10134 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10136 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10138 order = time_get_char_date_order(this);
10139 if(order == DATEORDER_no_order)
10140 order = DATEORDER_mdy;
10142 switch(order) {
10143 case DATEORDER_dmy:
10144 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10145 skip_date_delim_char(ctype, &s);
10146 if(!s.strbuf) {
10147 *err |= IOSTATE_failbit;
10148 break;
10150 if(s.strbuf && ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10151 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10152 t->tm_mon--;
10153 } else {
10154 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10156 skip_date_delim_char(ctype, &s);
10157 if(!s.strbuf) {
10158 *err |= IOSTATE_failbit;
10159 break;
10161 time_get_char_get_year(this, &s, s, e, base, err, t);
10162 break;
10163 case DATEORDER_mdy:
10164 istreambuf_iterator_char_val(&s);
10165 if(s.strbuf && ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10166 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10167 t->tm_mon--;
10168 } else {
10169 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10171 skip_date_delim_char(ctype, &s);
10172 if(!s.strbuf) {
10173 *err |= IOSTATE_failbit;
10174 break;
10176 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10177 skip_date_delim_char(ctype, &s);
10178 if(!s.strbuf) {
10179 *err |= IOSTATE_failbit;
10180 break;
10182 time_get_char_get_year(this, &s, s, e, base, err, t);
10183 break;
10184 case DATEORDER_ymd:
10185 time_get_char_get_year(this, &s, s, e, base, err, t);
10186 skip_date_delim_char(ctype, &s);
10187 if(!s.strbuf) {
10188 *err |= IOSTATE_failbit;
10189 break;
10191 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10192 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10193 t->tm_mon--;
10194 } else {
10195 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10197 skip_date_delim_char(ctype, &s);
10198 if(!s.strbuf) {
10199 *err |= IOSTATE_failbit;
10200 break;
10202 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10203 break;
10204 case DATEORDER_ydm:
10205 time_get_char_get_year(this, &s, s, e, base, err, t);
10206 skip_date_delim_char(ctype, &s);
10207 if(!s.strbuf) {
10208 *err |= IOSTATE_failbit;
10209 break;
10211 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10212 skip_date_delim_char(ctype, &s);
10213 if(!s.strbuf) {
10214 *err |= IOSTATE_failbit;
10215 break;
10217 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10218 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10219 t->tm_mon--;
10220 } else {
10221 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10223 break;
10224 default:
10225 ERR("incorrect order value: %d\n", order);
10226 break;
10229 if(!s.strbuf)
10230 *err |= IOSTATE_eofbit;
10231 *ret = s;
10232 return ret;
10235 /* ?get_date@?$time_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@AAHPAUtm@@@Z */
10236 /* ?get_date@?$time_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@AEAHPEAUtm@@@Z */
10237 DEFINE_THISCALL_WRAPPER(time_get_char_get_date, 36)
10238 istreambuf_iterator_char* __thiscall time_get_char_get_date(const time_get_char *this,
10239 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10240 ios_base *base, int *err, struct tm *t)
10242 return call_time_get_char_do_get_date(this, ret, s, e, base, err, t);
10245 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char*,
10246 istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char,
10247 ios_base*, int*, struct tm*, char, char);
10249 /* ?_Getfmt@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z */
10250 /* ?_Getfmt@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z */
10251 DEFINE_THISCALL_WRAPPER(time_get_char__Getfmt, 40)
10252 istreambuf_iterator_char* __thiscall time_get_char__Getfmt(const time_get_char *this,
10253 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10254 ios_base *base, int *err, struct tm *t, const char *fmt)
10256 ctype_char *ctype;
10258 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
10260 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10261 istreambuf_iterator_char_val(&s);
10263 while(*fmt) {
10264 if(ctype_char_is_ch(ctype, _SPACE, *fmt)) {
10265 skip_ws_char(ctype, &s);
10266 fmt++;
10267 continue;
10270 if(!s.strbuf) {
10271 *err |= IOSTATE_failbit;
10272 break;
10275 if(*fmt == '%') {
10276 fmt++;
10277 time_get_char_get(this, &s, s, e, base, err, t, *fmt, 0);
10278 } else {
10279 if(s.val != *fmt)
10280 *err |= IOSTATE_failbit;
10281 else
10282 istreambuf_iterator_char_inc(&s);
10285 if(*err & IOSTATE_failbit)
10286 break;
10287 fmt++;
10290 if(!s.strbuf)
10291 *err |= IOSTATE_eofbit;
10292 *ret = s;
10293 return ret;
10296 /* ?do_get@?$time_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@AAHPAUtm@@DD@Z */
10297 /* ?do_get@?$time_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@AEAHPEAUtm@@DD@Z */
10298 DEFINE_THISCALL_WRAPPER(time_get_char_do_get, 44) /* virtual */
10299 #if _MSVCP_VER <= 100
10300 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
10301 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10302 (this, ret, s, e, base, err, t, fmt, mod))
10303 #else
10304 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
10305 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10306 (this, ret, s, e, base, err, t, fmt, mod))
10307 #endif
10308 istreambuf_iterator_char* __thiscall time_get_char_do_get(const time_get_char *this,
10309 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10310 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10312 ctype_char *ctype;
10314 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
10316 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10318 switch(fmt) {
10319 case 'a':
10320 case 'A':
10321 time_get_char_get_weekday(this, &s, s, e, base, err, t);
10322 break;
10323 case 'b':
10324 case 'B':
10325 case 'h':
10326 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10327 break;
10328 case 'c':
10329 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
10330 break;
10331 case 'C':
10332 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10333 if(!(*err & IOSTATE_failbit))
10334 t->tm_year = t->tm_year * 100 - 1900;
10335 break;
10336 case 'd':
10337 case 'e':
10338 if(fmt == 'e') skip_ws_char(ctype, &s);
10339 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10340 break;
10341 case 'D':
10342 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
10343 break;
10344 case 'F':
10345 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
10346 break;
10347 case 'H':
10348 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10349 break;
10350 case 'I':
10351 *err |= time_get_char__Getint(this, &s, &e, 0, 11, &t->tm_hour);
10352 break;
10353 case 'j':
10354 *err |= time_get_char__Getint(this, &s, &e, 1, 366, &t->tm_yday);
10355 break;
10356 case 'm':
10357 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10358 if(!(*err & IOSTATE_failbit))
10359 t->tm_mon--;
10360 break;
10361 case 'M':
10362 *err = time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
10363 break;
10364 case 'n':
10365 case 't':
10366 skip_ws_char(ctype, &s);
10367 break;
10368 case 'p': {
10369 BOOL pm = FALSE;
10371 istreambuf_iterator_char_val(&s);
10372 if(s.strbuf && (s.val=='P' || s.val=='p'))
10373 pm = TRUE;
10374 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
10375 *err |= IOSTATE_failbit;
10376 break;
10378 istreambuf_iterator_char_inc(&s);
10379 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
10380 *err |= IOSTATE_failbit;
10381 break;
10383 istreambuf_iterator_char_inc(&s);
10385 if(pm)
10386 t->tm_hour += 12;
10387 break;
10389 case 'r':
10390 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
10391 break;
10392 case 'R':
10393 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
10394 break;
10395 case 'S':
10396 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10397 break;
10398 case 'T':
10399 case 'X':
10400 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
10401 break;
10402 case 'u':
10403 *err |= time_get_char__Getint(this, &s, &e, 1, 7, &t->tm_wday);
10404 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
10405 t->tm_wday = 0;
10406 break;
10407 case 'w':
10408 *err |= time_get_char__Getint(this, &s, &e, 0, 6, &t->tm_wday);
10409 break;
10410 case 'x':
10411 time_get_char_get_date(this, &s, s, e, base, err, t);
10412 break;
10413 case 'y':
10414 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10415 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
10416 t->tm_year += 100;
10417 break;
10418 case 'Y':
10419 time_get_char_get_year(this, &s, s, e, base, err, t);
10420 break;
10421 default:
10422 FIXME("unrecognized format: %c\n", fmt);
10423 *err |= IOSTATE_failbit;
10426 if(!s.strbuf)
10427 *err |= IOSTATE_eofbit;
10428 *ret = s;
10429 return ret;
10432 /* ?get@?$time_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@AAHPAUtm@@DD@Z */
10433 /* ?get@?$time_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@AEAHPEAUtm@@DD@Z */
10434 DEFINE_THISCALL_WRAPPER(time_get_char_get, 44)
10435 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char *this,
10436 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10437 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10439 return call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod);
10442 /* ?get@?$time_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@AAHPAUtm@@PBD4@Z */
10443 /* ?get@?$time_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@AEAHPEAUtm@@PEBD4@Z */
10444 DEFINE_THISCALL_WRAPPER(time_get_char_get_fmt, 44)
10445 istreambuf_iterator_char* __thiscall time_get_char_get_fmt(const time_get_char *this,
10446 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10447 ios_base *base, int *err, struct tm *t, const char *fmtstart, const char *fmtend)
10449 ctype_char *ctype;
10451 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_an(fmtstart, fmtend-fmtstart));
10453 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10454 istreambuf_iterator_char_val(&s);
10456 while(fmtstart < fmtend) {
10457 if(ctype_char_is_ch(ctype, _SPACE, *fmtstart)) {
10458 skip_ws_char(ctype, &s);
10459 fmtstart++;
10460 continue;
10463 if(!s.strbuf) {
10464 *err |= IOSTATE_failbit;
10465 break;
10468 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
10469 if(s.val != *fmtstart)
10470 *err |= IOSTATE_failbit;
10471 else
10472 istreambuf_iterator_char_inc(&s);
10473 if(*fmtstart == '%')
10474 fmtstart++;
10475 } else {
10476 fmtstart++;
10477 time_get_char_get(this, &s, s, e, base, err, t, *fmtstart, 0);
10480 if(*err & IOSTATE_failbit)
10481 break;
10482 fmtstart++;
10485 if(!s.strbuf)
10486 *err |= IOSTATE_eofbit;
10487 *ret = s;
10488 return ret;
10491 /* ?id@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
10492 locale_id time_get_wchar_id = {0};
10494 /* ??_7?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
10495 extern const vtable_ptr time_get_wchar_vtable;
10497 #if _MSVCP_VER >=110
10498 static wchar_t* create_time_get_str(const wchar_t *str)
10500 wchar_t *ret;
10501 int len;
10503 len = lstrlenW(str)+1;
10504 ret = operator_new(len * sizeof(wchar_t));
10505 memcpy(ret, str, len*sizeof(wchar_t));
10506 return ret;
10508 #else
10509 static wchar_t* create_time_get_str(const char *str, const _Locinfo *locinfo)
10511 wchar_t *ret;
10512 _Cvtvec cvt;
10513 int len;
10515 _Locinfo__Getcvt(locinfo, &cvt);
10516 len = MultiByteToWideChar(cvt.page, 0, str, -1, NULL, 0);
10517 ret = operator_new(len*sizeof(WCHAR));
10518 MultiByteToWideChar(cvt.page, 0, str, -1, ret, len);
10519 return ret;
10521 #endif
10523 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
10524 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
10525 DEFINE_THISCALL_WRAPPER(time_get_wchar__Init, 8)
10526 void __thiscall time_get_wchar__Init(time_get_wchar *this, const _Locinfo *locinfo)
10528 TRACE("(%p %p)\n", this, locinfo);
10530 #if _MSVCP_VER >=110
10531 this->days = create_time_get_str(_Locinfo__W_Getdays(locinfo));
10532 #else
10533 this->days = create_time_get_str(_Locinfo__Getdays(locinfo), locinfo);
10534 #endif
10536 #if _MSVCP_VER >=110
10537 this->months = create_time_get_str(_Locinfo__W_Getmonths(locinfo));
10538 #else
10539 this->months = create_time_get_str(_Locinfo__Getmonths(locinfo), locinfo);
10540 #endif
10542 this->dateorder = _Locinfo__Getdateorder(locinfo);
10543 _Locinfo__Getcvt(locinfo, &this->cvt);
10546 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
10547 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
10548 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_locinfo, 12)
10549 time_get_wchar* __thiscall time_get_wchar_ctor_locinfo(time_get_wchar *this,
10550 const _Locinfo *locinfo, size_t refs)
10552 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
10553 locale_facet_ctor_refs(&this->facet, refs);
10554 this->facet.vtable = &time_get_wchar_vtable;
10555 time_get_wchar__Init(this, locinfo);
10556 return this;
10559 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
10560 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
10561 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_name, 12)
10562 time_get_wchar* __thiscall time_get_wchar_ctor_name(time_get_wchar *this, const char *name, size_t refs)
10564 _Locinfo locinfo;
10566 TRACE("(%p %s %Iu)\n", this, name, refs);
10568 _Locinfo_ctor_cstr(&locinfo, name);
10569 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10570 _Locinfo_dtor(&locinfo);
10571 return this;
10574 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
10575 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
10576 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_refs, 8)
10577 time_get_wchar* __thiscall time_get_wchar_ctor_refs(time_get_wchar *this, size_t refs)
10579 _Locinfo locinfo;
10581 TRACE("(%p %Iu)\n", this, refs);
10583 _Locinfo_ctor(&locinfo);
10584 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10585 _Locinfo_dtor(&locinfo);
10586 return this;
10589 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
10590 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
10591 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor, 4)
10592 time_get_wchar* __thiscall time_get_wchar_ctor(time_get_wchar *this)
10594 return time_get_wchar_ctor_refs(this, 0);
10597 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AAEXXZ */
10598 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEAAXXZ */
10599 DEFINE_THISCALL_WRAPPER(time_get_wchar__Tidy, 4)
10600 void __thiscall time_get_wchar__Tidy(time_get_wchar *this)
10602 TRACE("(%p)\n", this);
10604 operator_delete((wchar_t*)this->days);
10605 operator_delete((wchar_t*)this->months);
10608 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
10609 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
10610 DEFINE_THISCALL_WRAPPER(time_get_wchar_dtor, 4) /* virtual */
10611 void __thiscall time_get_wchar_dtor(time_get_wchar *this)
10613 TRACE("(%p)\n", this);
10615 time_get_wchar__Tidy(this);
10618 DEFINE_THISCALL_WRAPPER(time_get_wchar_vector_dtor, 8)
10619 time_get_wchar* __thiscall time_get_wchar_vector_dtor(time_get_wchar *this, unsigned int flags)
10621 TRACE("(%p %x)\n", this, flags);
10622 if(flags & 2) {
10623 /* we have an array, with the number of elements stored before the first object */
10624 INT_PTR i, *ptr = (INT_PTR *)this-1;
10626 for(i=*ptr-1; i>=0; i--)
10627 time_get_wchar_dtor(this+i);
10628 operator_delete(ptr);
10629 } else {
10630 time_get_wchar_dtor(this);
10631 if(flags & 1)
10632 operator_delete(this);
10635 return this;
10638 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
10639 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
10640 unsigned int __cdecl time_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
10642 TRACE("(%p %p)\n", facet, loc);
10644 if(facet && !*facet) {
10645 _Locinfo locinfo;
10647 *facet = operator_new(sizeof(time_get_wchar));
10648 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
10649 time_get_wchar_ctor_locinfo((time_get_wchar*)*facet, &locinfo, 0);
10650 _Locinfo_dtor(&locinfo);
10653 return LC_TIME;
10656 static time_get_wchar* time_get_wchar_use_facet(const locale *loc)
10658 static time_get_wchar *obj = NULL;
10660 _Lockit lock;
10661 const locale_facet *fac;
10663 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
10664 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_wchar_id));
10665 if(fac) {
10666 _Lockit_dtor(&lock);
10667 return (time_get_wchar*)fac;
10670 if(obj) {
10671 _Lockit_dtor(&lock);
10672 return obj;
10675 time_get_wchar__Getcat(&fac, loc);
10676 obj = (time_get_wchar*)fac;
10677 call_locale_facet__Incref(&obj->facet);
10678 locale_facet_register(&obj->facet);
10679 _Lockit_dtor(&lock);
10681 return obj;
10684 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAAH@Z */
10685 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAEAH@Z */
10686 int __cdecl time_get_wchar__Getint(const time_get_wchar *this,
10687 istreambuf_iterator_wchar *b, istreambuf_iterator_wchar *e,
10688 int min_val, int max_val, int *val)
10690 BOOL got_digit = FALSE;
10691 int len = 0, ret = 0;
10692 char buf[16];
10694 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
10696 istreambuf_iterator_wchar_val(b);
10697 if(b->strbuf && (b->val == '-' || b->val == '+'))
10699 buf[len++] = b->val;
10700 istreambuf_iterator_wchar_inc(b);
10703 if (b->strbuf && b->val == '0')
10705 got_digit = TRUE;
10706 buf[len++] = '0';
10707 istreambuf_iterator_wchar_inc(b);
10709 while (b->strbuf && b->val == '0')
10710 istreambuf_iterator_wchar_inc(b);
10712 for (; b->strbuf && b->val >= '0' && b->val <= '9';
10713 istreambuf_iterator_wchar_inc(b))
10715 if(len < ARRAY_SIZE(buf)-1)
10716 buf[len] = b->val;
10717 got_digit = TRUE;
10718 len++;
10721 if (!b->strbuf)
10722 ret |= IOSTATE_eofbit;
10723 if (got_digit && len < ARRAY_SIZE(buf)-1)
10725 int v, err;
10727 buf[len] = 0;
10728 v = _Stolx(buf, NULL, 10, &err);
10729 if(err || v < min_val || v > max_val)
10730 ret |= IOSTATE_failbit;
10731 else
10732 *val = v;
10734 else
10735 ret |= IOSTATE_failbit;
10736 return ret;
10739 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
10740 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
10741 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_date_order, 4) /* virtual */
10742 #if _MSVCP_VER <= 100
10743 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_wchar*), (this))
10744 #else
10745 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_wchar*), (this))
10746 #endif
10747 dateorder __thiscall time_get_wchar_do_date_order(const time_get_wchar *this)
10749 TRACE("(%p)\n", this);
10750 return this->dateorder;
10753 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
10754 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
10755 DEFINE_THISCALL_WRAPPER(time_get_wchar_date_order, 4)
10756 dateorder __thiscall time_get_wchar_date_order(const time_get_wchar *this)
10758 return call_time_get_wchar_do_date_order(this);
10761 static int find_longest_match_wchar(istreambuf_iterator_wchar *iter, const wchar_t *str)
10763 int i, len = 0, last_match = -1, match = -1;
10764 const wchar_t *p, *end;
10765 wchar_t buf[64];
10767 for(istreambuf_iterator_wchar_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
10768 istreambuf_iterator_wchar_inc(iter))
10770 BOOL got_prefix = FALSE;
10772 buf[len++] = iter->val;
10773 last_match = match;
10774 match = -1;
10775 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
10777 end = wcschr(p, ':');
10778 if (!end)
10779 end = p + lstrlenW(p);
10781 if (end-p >= len && !memcmp(p, buf, len*sizeof(wchar_t)))
10783 if (end-p == len)
10784 match = i;
10785 else
10786 got_prefix = TRUE;
10790 if (!got_prefix)
10792 if (match != -1)
10794 istreambuf_iterator_wchar_inc(iter);
10795 return match;
10797 break;
10800 if (len == ARRAY_SIZE(buf))
10801 FIXME("temporary buffer is too small\n");
10802 if (!iter->strbuf)
10803 return match;
10804 return last_match;
10807 /* ?do_get_monthname@?$time_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@AAHPAUtm@@@Z */
10808 /* ?do_get_monthname@?$time_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@AEAHPEAUtm@@@Z */
10809 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_monthname, 36) /* virtual */
10810 #if _MSVCP_VER <= 100
10811 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
10812 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10813 (this, ret, s, e, base, err, t))
10814 #else
10815 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
10816 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10817 (this, ret, s, e, base, err, t))
10818 #endif
10819 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_monthname(const time_get_wchar *this,
10820 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10821 ios_base *base, int *err, struct tm *t)
10823 int match;
10825 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10827 if ((match = find_longest_match_wchar(&s, this->months)) != -1)
10828 t->tm_mon = match / 2;
10829 else
10830 *err |= IOSTATE_failbit;
10832 *ret = s;
10833 return ret;
10836 /* ?get_monthname@?$time_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@AAHPAUtm@@@Z */
10837 /* ?get_monthname@?$time_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@AEAHPEAUtm@@@Z */
10838 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_monthname, 36)
10839 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_monthname(const time_get_wchar *this,
10840 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10841 ios_base *base, int *err, struct tm *t)
10843 return call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t);
10846 /* ?do_get_time@?$time_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@AAHPAUtm@@@Z */
10847 /* ?do_get_time@?$time_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@AEAHPEAUtm@@@Z */
10848 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_time, 36) /* virtual */
10849 #if _MSVCP_VER <= 100
10850 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
10851 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10852 (this, ret, s, e, base, err, t))
10853 #else
10854 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
10855 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10856 (this, ret, s, e, base, err, t))
10857 #endif
10858 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_time(const time_get_wchar *this,
10859 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10860 ios_base *base, int *err, struct tm *t)
10862 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10864 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10865 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
10866 *err |= IOSTATE_failbit;
10868 if (!*err)
10870 istreambuf_iterator_wchar_inc(&s);
10871 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
10873 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
10874 *err |= IOSTATE_failbit;
10876 if (!*err)
10878 istreambuf_iterator_wchar_inc(&s);
10879 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10882 *ret = s;
10883 return ret;
10886 /* ?get_time@?$time_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@AAHPAUtm@@@Z */
10887 /* ?get_time@?$time_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@AEAHPEAUtm@@@Z */
10888 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_time, 36)
10889 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_time(const time_get_wchar *this,
10890 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10891 ios_base *base, int *err, struct tm *t)
10893 return call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t);
10896 /* ?do_get_weekday@?$time_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@AAHPAUtm@@@Z */
10897 /* ?do_get_weekday@?$time_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@AEAHPEAUtm@@@Z */
10898 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_weekday, 36) /* virtual */
10899 #if _MSVCP_VER <= 100
10900 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
10901 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10902 (this, ret, s, e, base, err, t))
10903 #else
10904 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
10905 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10906 (this, ret, s, e, base, err, t))
10907 #endif
10908 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_weekday(const time_get_wchar *this,
10909 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10910 ios_base *base, int *err, struct tm *t)
10912 int match;
10914 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10916 if ((match = find_longest_match_wchar(&s, this->days)) != -1)
10917 t->tm_wday = match / 2;
10918 else
10919 *err |= IOSTATE_failbit;
10921 *ret = s;
10922 return ret;
10925 /* ?get_weekday@?$time_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@AAHPAUtm@@@Z */
10926 /* ?get_weekday@?$time_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@AEAHPEAUtm@@@Z */
10927 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_weekday, 36)
10928 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_weekday(const time_get_wchar *this,
10929 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10930 ios_base *base, int *err, struct tm *t)
10932 return call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t);
10935 /* ?do_get_year@?$time_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@AAHPAUtm@@@Z */
10936 /* ?do_get_year@?$time_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@AEAHPEAUtm@@@Z */
10937 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_year, 36) /* virtual */
10938 #if _MSVCP_VER <= 100
10939 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
10940 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10941 (this, ret, s, e, base, err, t))
10942 #else
10943 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
10944 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10945 (this, ret, s, e, base, err, t))
10946 #endif
10947 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_year(const time_get_wchar *this,
10948 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10949 ios_base *base, int *err, struct tm *t)
10951 int year;
10953 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10955 /* The function supports only dates from [1900-2035] range */
10956 *err |= time_get_wchar__Getint(this, &s, &e, 0, 2035, &year);
10957 if (!(*err & IOSTATE_failbit))
10959 if (year >= 1900)
10960 year -= 1900;
10961 if (year > 135)
10962 *err |= IOSTATE_failbit;
10963 else
10964 t->tm_year = year;
10967 *ret = s;
10968 return ret;
10971 /* ?get_year@?$time_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@AAHPAUtm@@@Z */
10972 /* ?get_year@?$time_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@AEAHPEAUtm@@@Z */
10973 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_year, 36)
10974 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_year(const time_get_wchar *this,
10975 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10976 ios_base *base, int *err, struct tm *t)
10978 return call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t);
10981 static void skip_ws_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
10983 istreambuf_iterator_wchar_val(iter);
10984 while(iter->strbuf && ctype_wchar_is_ch(ctype, _SPACE, iter->val))
10985 istreambuf_iterator_wchar_inc(iter);
10988 static void skip_date_delim_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
10990 skip_ws_wchar(ctype, iter);
10991 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
10992 istreambuf_iterator_wchar_inc(iter);
10993 skip_ws_wchar(ctype, iter);
10996 /* ?do_get_date@?$time_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@AAHPAUtm@@@Z */
10997 /* ?do_get_date@?$time_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@AEAHPEAUtm@@@Z */
10998 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_date, 36) /* virtual */
10999 #if _MSVCP_VER <= 100
11000 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
11001 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11002 (this, ret, s, e, base, err, t))
11003 #else
11004 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
11005 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11006 (this, ret, s, e, base, err, t))
11007 #endif
11008 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_date(const time_get_wchar *this,
11009 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11010 ios_base *base, int *err, struct tm *t)
11012 ctype_wchar *ctype;
11013 dateorder order;
11015 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11017 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11019 order = time_get_wchar_date_order(this);
11020 if(order == DATEORDER_no_order)
11021 order = DATEORDER_mdy;
11023 switch(order) {
11024 case DATEORDER_dmy:
11025 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11026 skip_date_delim_wchar(ctype, &s);
11027 if(!s.strbuf) {
11028 *err |= IOSTATE_failbit;
11029 break;
11031 if(s.strbuf && ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11032 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11033 t->tm_mon--;
11034 } else {
11035 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11037 skip_date_delim_wchar(ctype, &s);
11038 if(!s.strbuf) {
11039 *err |= IOSTATE_failbit;
11040 break;
11042 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11043 break;
11044 case DATEORDER_mdy:
11045 istreambuf_iterator_wchar_val(&s);
11046 if(s.strbuf && ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11047 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11048 t->tm_mon--;
11049 } else {
11050 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11052 skip_date_delim_wchar(ctype, &s);
11053 if(!s.strbuf) {
11054 *err |= IOSTATE_failbit;
11055 break;
11057 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11058 skip_date_delim_wchar(ctype, &s);
11059 if(!s.strbuf) {
11060 *err |= IOSTATE_failbit;
11061 break;
11063 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11064 break;
11065 case DATEORDER_ymd:
11066 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11067 skip_date_delim_wchar(ctype, &s);
11068 if(!s.strbuf) {
11069 *err |= IOSTATE_failbit;
11070 break;
11072 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11073 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11074 t->tm_mon--;
11075 } else {
11076 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11078 skip_date_delim_wchar(ctype, &s);
11079 if(!s.strbuf) {
11080 *err |= IOSTATE_failbit;
11081 break;
11083 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11084 break;
11085 case DATEORDER_ydm:
11086 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11087 skip_date_delim_wchar(ctype, &s);
11088 if(!s.strbuf) {
11089 *err |= IOSTATE_failbit;
11090 break;
11092 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11093 skip_date_delim_wchar(ctype, &s);
11094 if(!s.strbuf) {
11095 *err |= IOSTATE_failbit;
11096 break;
11098 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11099 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11100 t->tm_mon--;
11101 } else {
11102 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11104 break;
11105 default:
11106 ERR("incorrect order value: %d\n", order);
11107 break;
11110 if(!s.strbuf)
11111 *err |= IOSTATE_eofbit;
11112 *ret = s;
11113 return ret;
11116 /* ?get_date@?$time_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@AAHPAUtm@@@Z */
11117 /* ?get_date@?$time_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@AEAHPEAUtm@@@Z */
11118 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_date, 36)
11119 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_date(const time_get_wchar *this,
11120 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11121 ios_base *base, int *err, struct tm *t)
11123 return call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t);
11126 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar*,
11127 istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar,
11128 ios_base*, int*, struct tm*, char, char);
11130 /* ?_Getfmt@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z */
11131 /* ?_Getfmt@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z */
11132 DEFINE_THISCALL_WRAPPER(time_get_wchar__Getfmt, 40)
11133 istreambuf_iterator_wchar* __thiscall time_get_wchar__Getfmt(const time_get_wchar *this,
11134 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11135 ios_base *base, int *err, struct tm *t, const char *fmt)
11137 ctype_wchar *ctype;
11139 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
11141 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11142 istreambuf_iterator_wchar_val(&s);
11144 while(*fmt) {
11145 if(*fmt == ' ') {
11146 skip_ws_wchar(ctype, &s);
11147 fmt++;
11148 continue;
11151 if(!s.strbuf) {
11152 *err |= IOSTATE_failbit;
11153 break;
11156 if(*fmt == '%') {
11157 fmt++;
11158 time_get_wchar_get(this, &s, s, e, base, err, t, *fmt, 0);
11159 } else {
11160 if(s.val != *fmt)
11161 *err |= IOSTATE_failbit;
11162 else
11163 istreambuf_iterator_wchar_inc(&s);
11166 if(*err & IOSTATE_failbit)
11167 break;
11168 fmt++;
11171 if(!s.strbuf)
11172 *err |= IOSTATE_eofbit;
11173 *ret = s;
11174 return ret;
11177 /* ?do_get@?$time_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@AAHPAUtm@@DD@Z */
11178 /* ?do_get@?$time_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@AEAHPEAUtm@@DD@Z */
11179 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get, 44) /* virtual */
11180 #if _MSVCP_VER <= 100
11181 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
11182 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11183 (this, ret, s, e, base, err, t, fmt, mod))
11184 #else
11185 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
11186 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11187 (this, ret, s, e, base, err, t, fmt, mod))
11188 #endif
11189 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get(const time_get_wchar *this,
11190 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11191 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11193 ctype_wchar *ctype;
11195 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
11197 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11199 switch(fmt) {
11200 case 'a':
11201 case 'A':
11202 time_get_wchar_get_weekday(this, &s, s, e, base, err, t);
11203 break;
11204 case 'b':
11205 case 'B':
11206 case 'h':
11207 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11208 break;
11209 case 'c':
11210 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
11211 break;
11212 case 'C':
11213 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11214 if(!(*err & IOSTATE_failbit))
11215 t->tm_year = t->tm_year * 100 - 1900;
11216 break;
11217 case 'd':
11218 case 'e':
11219 if(fmt == 'e') skip_ws_wchar(ctype, &s);
11220 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11221 break;
11222 case 'D':
11223 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
11224 break;
11225 case 'F':
11226 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
11227 break;
11228 case 'H':
11229 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
11230 break;
11231 case 'I':
11232 *err |= time_get_wchar__Getint(this, &s, &e, 0, 11, &t->tm_hour);
11233 break;
11234 case 'j':
11235 *err |= time_get_wchar__Getint(this, &s, &e, 1, 366, &t->tm_yday);
11236 break;
11237 case 'm':
11238 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11239 if(!(*err & IOSTATE_failbit))
11240 t->tm_mon--;
11241 break;
11242 case 'M':
11243 *err = time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
11244 break;
11245 case 'n':
11246 case 't':
11247 skip_ws_wchar(ctype, &s);
11248 break;
11249 case 'p': {
11250 BOOL pm = FALSE;
11252 istreambuf_iterator_wchar_val(&s);
11253 if(s.strbuf && (s.val=='P' || s.val=='p'))
11254 pm = TRUE;
11255 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
11256 *err |= IOSTATE_failbit;
11257 break;
11259 istreambuf_iterator_wchar_inc(&s);
11260 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
11261 *err |= IOSTATE_failbit;
11262 break;
11264 istreambuf_iterator_wchar_inc(&s);
11266 if(pm)
11267 t->tm_hour += 12;
11268 break;
11270 case 'r':
11271 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
11272 break;
11273 case 'R':
11274 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
11275 break;
11276 case 'S':
11277 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
11278 break;
11279 case 'T':
11280 case 'X':
11281 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
11282 break;
11283 case 'u':
11284 *err |= time_get_wchar__Getint(this, &s, &e, 1, 7, &t->tm_wday);
11285 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
11286 t->tm_wday = 0;
11287 break;
11288 case 'w':
11289 *err |= time_get_wchar__Getint(this, &s, &e, 0, 6, &t->tm_wday);
11290 break;
11291 case 'x':
11292 time_get_wchar_get_date(this, &s, s, e, base, err, t);
11293 break;
11294 case 'y':
11295 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11296 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
11297 t->tm_year += 100;
11298 break;
11299 case 'Y':
11300 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11301 break;
11302 default:
11303 FIXME("unrecognized format: %c\n", fmt);
11304 *err |= IOSTATE_failbit;
11307 if(!s.strbuf)
11308 *err |= IOSTATE_eofbit;
11309 *ret = s;
11310 return ret;
11313 /* ?get@?$time_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@AAHPAUtm@@DD@Z */
11314 /* ?get@?$time_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@AEAHPEAUtm@@DD@Z */
11315 DEFINE_THISCALL_WRAPPER(time_get_wchar_get, 44)
11316 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar *this,
11317 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11318 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11320 return call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod);
11323 /* ?get@?$time_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@AAHPAUtm@@PB_W4@Z */
11324 /* ?get@?$time_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@AEAHPEAUtm@@PEB_W4@Z */
11325 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_fmt, 44)
11326 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_fmt(const time_get_wchar *this,
11327 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11328 ios_base *base, int *err, struct tm *t, const wchar_t *fmtstart, const wchar_t *fmtend)
11330 ctype_wchar *ctype;
11332 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_wn(fmtstart, fmtend-fmtstart));
11334 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11335 istreambuf_iterator_wchar_val(&s);
11337 while(fmtstart < fmtend) {
11338 if(ctype_wchar_is_ch(ctype, _SPACE, *fmtstart)) {
11339 skip_ws_wchar(ctype, &s);
11340 fmtstart++;
11341 continue;
11344 if(!s.strbuf) {
11345 *err |= IOSTATE_failbit;
11346 break;
11349 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
11350 if(s.val != *fmtstart)
11351 *err |= IOSTATE_failbit;
11352 else
11353 istreambuf_iterator_wchar_inc(&s);
11354 if(*fmtstart == '%')
11355 fmtstart++;
11356 } else {
11357 fmtstart++;
11358 time_get_wchar_get(this, &s, s, e, base, err, t, *fmtstart, 0);
11361 if(*err & IOSTATE_failbit)
11362 break;
11363 fmtstart++;
11366 if(!s.strbuf)
11367 *err |= IOSTATE_eofbit;
11368 *ret = s;
11369 return ret;
11372 /* ??_7_Locimp@locale@std@@6B@ */
11373 extern const vtable_ptr locale__Locimp_vtable;
11375 /* ??0_Locimp@locale@std@@AAE@_N@Z */
11376 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
11377 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
11378 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, bool transparent)
11380 TRACE("(%p %d)\n", this, transparent);
11382 memset(this, 0, sizeof(locale__Locimp));
11383 locale_facet_ctor_refs(&this->facet, 1);
11384 this->facet.vtable = &locale__Locimp_vtable;
11385 this->transparent = transparent;
11386 locale_string_char_ctor_cstr(&this->name, "*");
11387 return this;
11390 /* ??_F_Locimp@locale@std@@QAEXXZ */
11391 /* ??_F_Locimp@locale@std@@QEAAXXZ */
11392 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
11393 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
11395 return locale__Locimp_ctor_transparent(this, FALSE);
11398 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
11399 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
11400 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
11401 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
11403 _Lockit lock;
11404 size_t i;
11406 TRACE("(%p %p)\n", this, copy);
11408 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11409 memcpy(this, copy, sizeof(locale__Locimp));
11410 locale_facet_ctor_refs(&this->facet, 1);
11411 this->facet.vtable = &locale__Locimp_vtable;
11412 if(copy->facetvec) {
11413 this->facetvec = operator_new(copy->facet_cnt*sizeof(locale_facet*));
11414 for(i=0; i<this->facet_cnt; i++)
11416 this->facetvec[i] = copy->facetvec[i];
11417 if(this->facetvec[i])
11418 call_locale_facet__Incref(this->facetvec[i]);
11421 locale_string_char_copy_ctor(&this->name, &copy->name);
11422 _Lockit_dtor(&lock);
11423 return this;
11426 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
11427 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
11428 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
11430 return locale__Locimp_copy_ctor(this, copy);
11433 /* ??1_Locimp@locale@std@@MAE@XZ */
11434 /* ??1_Locimp@locale@std@@MEAA@XZ */
11435 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
11436 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
11438 size_t i;
11440 TRACE("(%p)\n", this);
11442 locale_facet_dtor(&this->facet);
11443 for(i=0; i<this->facet_cnt; i++)
11444 if(this->facetvec[i] && call_locale_facet__Decref(this->facetvec[i]))
11445 call_locale_facet_vector_dtor(this->facetvec[i], 1);
11447 operator_delete(this->facetvec);
11448 locale_string_char_dtor(&this->name);
11451 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
11452 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
11453 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
11455 locale__Locimp_dtor(this);
11458 DEFINE_THISCALL_WRAPPER(locale__Locimp_vector_dtor, 8)
11459 locale__Locimp* __thiscall locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
11461 TRACE("(%p %x)\n", this, flags);
11462 if(flags & 2) {
11463 /* we have an array, with the number of elements stored before the first object */
11464 INT_PTR i, *ptr = (INT_PTR *)this-1;
11466 for(i=*ptr-1; i>=0; i--)
11467 locale__Locimp_dtor(this+i);
11468 operator_delete(ptr);
11469 } else {
11470 locale__Locimp_dtor(this);
11471 if(flags & 1)
11472 operator_delete(this);
11475 return this;
11478 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@ABV123@@Z */
11479 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@AEBV123@@Z */
11480 locale__Locimp* __cdecl locale__Locimp__New_Locimp(const locale__Locimp *copy)
11482 locale__Locimp *ret;
11484 TRACE("(%p)\n", copy);
11486 ret = operator_new(sizeof(locale__Locimp));
11487 return locale__Locimp_copy_ctor(ret, copy);
11490 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@_N@Z */
11491 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z */
11492 locale__Locimp* __cdecl locale__Locimp__New_Locimp_transparent(bool transparent)
11494 locale__Locimp *ret;
11496 TRACE("(%x)\n", transparent);
11498 ret = operator_new(sizeof(locale__Locimp));
11499 return locale__Locimp_ctor_transparent(ret, transparent);
11502 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
11503 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
11504 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, size_t id)
11506 _Lockit lock;
11508 TRACE("(%p %p %Iu)\n", locimp, facet, id);
11510 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11511 if(id >= locimp->facet_cnt) {
11512 size_t new_size = id+1;
11513 locale_facet **new_facetvec;
11515 if(new_size < 40)
11516 new_size = 40;
11518 new_facetvec = operator_new(sizeof(locale_facet*)*new_size);
11519 memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
11520 memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
11521 operator_delete(locimp->facetvec);
11522 locimp->facetvec = new_facetvec;
11523 locimp->facet_cnt = new_size;
11526 if(locimp->facetvec[id] && call_locale_facet__Decref(locimp->facetvec[id]))
11527 call_locale_facet_vector_dtor(locimp->facetvec[id], 1);
11529 locimp->facetvec[id] = facet;
11530 if(facet)
11531 call_locale_facet__Incref(facet);
11532 _Lockit_dtor(&lock);
11535 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
11536 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
11537 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
11538 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, size_t id)
11540 locale__Locimp__Locimp_Addfac(this, facet, id);
11543 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
11544 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
11545 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
11547 FIXME("stub\n");
11548 return NULL;
11551 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11552 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11553 /* List of missing facets:
11554 * messages, money_get, money_put, moneypunct, moneypunct, time_get
11556 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11558 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11560 if(cat & (1<<(ctype_short__Getcat(NULL, NULL)-1))) {
11561 ctype_wchar *ctype;
11563 if(loc) {
11564 ctype = ctype_short_use_facet(loc);
11565 }else {
11566 ctype = operator_new(sizeof(ctype_wchar));
11567 ctype_short_ctor_locinfo(ctype, locinfo, 0);
11569 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_short_id));
11572 if(cat & (1<<(num_get_short__Getcat(NULL, NULL)-1))) {
11573 num_get *numget;
11575 if(loc) {
11576 numget = num_get_short_use_facet(loc);
11577 }else {
11578 numget = operator_new(sizeof(num_get));
11579 num_get_short_ctor_locinfo(numget, locinfo, 0);
11581 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_short_id));
11584 if(cat & (1<<(num_put_short__Getcat(NULL, NULL)-1))) {
11585 num_put *numput;
11587 if(loc) {
11588 numput = num_put_short_use_facet(loc);
11589 }else {
11590 numput = operator_new(sizeof(num_put));
11591 num_put_short_ctor_locinfo(numput, locinfo, 0);
11593 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_short_id));
11596 if(cat & (1<<(numpunct_short__Getcat(NULL, NULL)-1))) {
11597 numpunct_wchar *numpunct;
11599 if(loc) {
11600 numpunct = numpunct_short_use_facet(loc);
11601 }else {
11602 numpunct = operator_new(sizeof(numpunct_wchar));
11603 numpunct_short_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11605 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_short_id));
11608 if(cat & (1<<(collate_short__Getcat(NULL, NULL)-1))) {
11609 collate *c;
11611 if(loc) {
11612 c = collate_short_use_facet(loc);
11613 }else {
11614 c = operator_new(sizeof(collate));
11615 collate_short_ctor_locinfo(c, locinfo, 0);
11617 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_short_id));
11620 if(cat & (1<<(time_put_short__Getcat(NULL, NULL)-1))) {
11621 time_put *t;
11623 if(loc) {
11624 t = time_put_short_use_facet(loc);
11625 }else {
11626 t = operator_new(sizeof(time_put));
11627 time_put_short_ctor_locinfo(t, locinfo, 0);
11629 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_short_id));
11632 if(cat & (1<<(codecvt_short__Getcat(NULL, NULL)-1))) {
11633 codecvt_wchar *codecvt;
11635 if(loc) {
11636 codecvt = codecvt_short_use_facet(loc);
11637 }else {
11638 codecvt = operator_new(sizeof(codecvt_wchar));
11639 codecvt_short_ctor_locinfo(codecvt, locinfo, 0);
11641 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_short_id));
11645 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11646 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11647 /* List of missing facets:
11648 * messages, money_get, money_put, moneypunct, moneypunct
11650 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11652 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11654 if(cat & (1<<(ctype_wchar__Getcat(NULL, NULL)-1))) {
11655 ctype_wchar *ctype;
11657 if(loc) {
11658 ctype = ctype_wchar_use_facet(loc);
11659 }else {
11660 ctype = operator_new(sizeof(ctype_wchar));
11661 ctype_wchar_ctor_locinfo(ctype, locinfo, 0);
11663 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_wchar_id));
11666 if(cat & (1<<(num_get_wchar__Getcat(NULL, NULL)-1))) {
11667 num_get *numget;
11669 if(loc) {
11670 numget = num_get_wchar_use_facet(loc);
11671 }else {
11672 numget = operator_new(sizeof(num_get));
11673 num_get_wchar_ctor_locinfo(numget, locinfo, 0);
11675 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_wchar_id));
11678 if(cat & (1<<(num_put_wchar__Getcat(NULL, NULL)-1))) {
11679 num_put *numput;
11681 if(loc) {
11682 numput = num_put_wchar_use_facet(loc);
11683 }else {
11684 numput = operator_new(sizeof(num_put));
11685 num_put_wchar_ctor_locinfo(numput, locinfo, 0);
11687 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_wchar_id));
11690 if(cat & (1<<(numpunct_wchar__Getcat(NULL, NULL)-1))) {
11691 numpunct_wchar *numpunct;
11693 if(loc) {
11694 numpunct = numpunct_wchar_use_facet(loc);
11695 }else {
11696 numpunct = operator_new(sizeof(numpunct_wchar));
11697 numpunct_wchar_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11699 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_wchar_id));
11702 if(cat & (1<<(collate_wchar__Getcat(NULL, NULL)-1))) {
11703 collate *c;
11705 if(loc) {
11706 c = collate_wchar_use_facet(loc);
11707 }else {
11708 c = operator_new(sizeof(collate));
11709 collate_wchar_ctor_locinfo(c, locinfo, 0);
11711 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_wchar_id));
11714 if(cat & (1<<(time_get_wchar__Getcat(NULL, NULL)-1))) {
11715 time_get_wchar *t;
11717 if(loc) {
11718 t = time_get_wchar_use_facet(loc);
11719 }else {
11720 t = operator_new(sizeof(time_get_wchar));
11721 time_get_wchar_ctor_locinfo(t, locinfo, 0);
11723 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_wchar_id));
11726 if(cat & (1<<(time_put_wchar__Getcat(NULL, NULL)-1))) {
11727 time_put *t;
11729 if(loc) {
11730 t = time_put_wchar_use_facet(loc);
11731 }else {
11732 t = operator_new(sizeof(time_put));
11733 time_put_wchar_ctor_locinfo(t, locinfo, 0);
11735 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_wchar_id));
11738 if(cat & (1<<(codecvt_wchar__Getcat(NULL, NULL)-1))) {
11739 codecvt_wchar *codecvt;
11741 if(loc) {
11742 codecvt = codecvt_wchar_use_facet(loc);
11743 }else {
11744 codecvt = operator_new(sizeof(codecvt_wchar));
11745 codecvt_wchar_ctor_locinfo(codecvt, locinfo, 0);
11747 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_wchar_id));
11751 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11752 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11753 /* List of missing facets:
11754 * messages, money_get, money_put, moneypunct, moneypunct
11756 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11758 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11760 if(cat & (1<<(ctype_char__Getcat(NULL, NULL)-1))) {
11761 ctype_char *ctype;
11763 if(loc) {
11764 ctype = ctype_char_use_facet(loc);
11765 }else {
11766 ctype = operator_new(sizeof(ctype_char));
11767 ctype_char_ctor_locinfo(ctype, locinfo, 0);
11769 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_char_id));
11772 if(cat & (1<<(num_get_char__Getcat(NULL, NULL)-1))) {
11773 num_get *numget;
11775 if(loc) {
11776 numget = num_get_char_use_facet(loc);
11777 }else {
11778 numget = operator_new(sizeof(num_get));
11779 num_get_char_ctor_locinfo(numget, locinfo, 0);
11781 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_char_id));
11784 if(cat & (1<<(num_put_char__Getcat(NULL, NULL)-1))) {
11785 num_put *numput;
11787 if(loc) {
11788 numput = num_put_char_use_facet(loc);
11789 }else {
11790 numput = operator_new(sizeof(num_put));
11791 num_put_char_ctor_locinfo(numput, locinfo, 0);
11793 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_char_id));
11796 if(cat & (1<<(numpunct_char__Getcat(NULL, NULL)-1))) {
11797 numpunct_char *numpunct;
11799 if(loc) {
11800 numpunct = numpunct_char_use_facet(loc);
11801 }else {
11802 numpunct = operator_new(sizeof(numpunct_char));
11803 numpunct_char_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11805 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_char_id));
11808 if(cat & (1<<(collate_char__Getcat(NULL, NULL)-1))) {
11809 collate *c;
11811 if(loc) {
11812 c = collate_char_use_facet(loc);
11813 }else {
11814 c = operator_new(sizeof(collate));
11815 collate_char_ctor_locinfo(c, locinfo, 0);
11817 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_char_id));
11820 if(cat & (1<<(time_get_char__Getcat(NULL, NULL)-1))) {
11821 time_get_char *t;
11823 if(loc) {
11824 t = time_get_char_use_facet(loc);
11825 }else {
11826 t = operator_new(sizeof(time_get_char));
11827 time_get_char_ctor_locinfo(t, locinfo, 0);
11829 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_char_id));
11832 if(cat & (1<<(time_put_char__Getcat(NULL, NULL)-1))) {
11833 time_put *t;
11835 if(loc) {
11836 t = time_put_char_use_facet(loc);
11837 }else {
11838 t = operator_new(sizeof(time_put));
11839 time_put_char_ctor_locinfo(t, locinfo, 0);
11841 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_char_id));
11844 if(cat & (1<<(codecvt_char__Getcat(NULL, NULL)-1))) {
11845 codecvt_char *codecvt;
11847 if(loc) {
11848 codecvt = codecvt_char_use_facet(loc);
11849 }else {
11850 codecvt = operator_new(sizeof(codecvt_char));
11851 codecvt_char_ctor_locinfo(codecvt, locinfo, 0);
11853 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_char_id));
11857 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
11858 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11859 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11861 TRACE("(%p %d %p %p)\n", locinfo, cat, locimp, loc);
11863 locale__Locimp__Makexloc(locinfo, cat, locimp, loc);
11864 locale__Locimp__Makewloc(locinfo, cat, locimp, loc);
11865 locale__Locimp__Makeushloc(locinfo, cat, locimp, loc);
11867 locimp->catmask |= cat;
11868 locale_string_char_assign(&locimp->name, &locinfo->newlocname);
11869 return locimp;
11872 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
11873 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
11874 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
11875 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
11877 TRACE("(%p %p)\n", this, locimp);
11878 /* Don't change locimp reference counter */
11879 this->ptr = locimp;
11880 return this;
11883 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
11884 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
11885 locale__Locimp* __cdecl locale__Init(void)
11887 _Lockit lock;
11889 TRACE("\n");
11891 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11892 if(global_locale) {
11893 _Lockit_dtor(&lock);
11894 return global_locale;
11897 global_locale = operator_new(sizeof(locale__Locimp));
11898 locale__Locimp_ctor(global_locale);
11899 global_locale->catmask = (1<<(LC_MAX+1))-1;
11900 locale_string_char_dtor(&global_locale->name);
11901 locale_string_char_ctor_cstr(&global_locale->name, "C");
11903 locale__Locimp__Clocptr = global_locale;
11904 global_locale->facet.refs++;
11905 locale_ctor_locimp(&classic_locale, locale__Locimp__Clocptr);
11906 _Lockit_dtor(&lock);
11908 return global_locale;
11911 /* ?_Init@locale@std@@CAPAV_Locimp@12@_N@Z */
11912 /* ?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z */
11913 locale__Locimp* __cdecl locale__Init_ref(bool inc_ref)
11915 locale__Locimp *ret;
11916 _Lockit lock;
11918 TRACE("(%x)\n", inc_ref);
11920 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11921 if(inc_ref && global_locale) {
11922 call_locale_facet__Incref(&global_locale->facet);
11923 _Lockit_dtor(&lock);
11924 return global_locale;
11927 ret = locale__Init();
11928 _Lockit_dtor(&lock);
11929 return ret;
11932 /* ?_Iscloc@locale@std@@QBE_NXZ */
11933 /* ?_Iscloc@locale@std@@QEBA_NXZ */
11934 DEFINE_THISCALL_WRAPPER(locale__Iscloc, 4)
11935 bool __thiscall locale__Iscloc(const locale *this)
11937 TRACE("(%p)\n", this);
11938 return this->ptr == locale__Locimp__Clocptr;
11941 /* ??0locale@std@@QAE@ABV01@0H@Z */
11942 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
11943 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
11944 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
11946 _Locinfo locinfo;
11948 TRACE("(%p %p %p %d)\n", this, loc, other, cat);
11950 this->ptr = operator_new(sizeof(locale__Locimp));
11951 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
11953 _Locinfo_ctor_cat_cstr(&locinfo, loc->ptr->catmask, locale_string_char_c_str(&loc->ptr->name));
11954 _Locinfo__Addcats(&locinfo, cat & other->ptr->catmask, locale_string_char_c_str(&other->ptr->name));
11955 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, other);
11956 _Locinfo_dtor(&locinfo);
11958 return this;
11961 /* ??0locale@std@@QAE@ABV01@@Z */
11962 /* ??0locale@std@@QEAA@AEBV01@@Z */
11963 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
11964 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
11966 TRACE("(%p %p)\n", this, copy);
11967 this->ptr = copy->ptr;
11968 call_locale_facet__Incref(&this->ptr->facet);
11969 return this;
11972 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
11973 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
11974 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
11975 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
11977 _Locinfo locinfo;
11979 TRACE("(%p %p %s %d)\n", this, loc, locname, cat);
11981 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
11982 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
11983 _Locinfo_dtor(&locinfo);
11984 operator_delete(this->ptr);
11985 _Xruntime_error("bad locale name");
11988 this->ptr = operator_new(sizeof(locale__Locimp));
11989 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
11991 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
11992 _Locinfo_dtor(&locinfo);
11993 return this;
11996 /* ??0locale@std@@QAE@PBDH@Z */
11997 /* ??0locale@std@@QEAA@PEBDH@Z */
11998 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
11999 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
12001 _Locinfo locinfo;
12003 TRACE("(%p %s %d)\n", this, locname, cat);
12005 this->ptr = operator_new(sizeof(locale__Locimp));
12006 locale__Locimp_ctor(this->ptr);
12008 locale__Init();
12010 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
12011 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
12012 _Locinfo_dtor(&locinfo);
12013 operator_delete(this->ptr);
12014 _Xruntime_error("bad locale name");
12017 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
12018 _Locinfo_dtor(&locinfo);
12020 return this;
12023 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
12024 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
12025 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
12026 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
12028 TRACE("(%p)\n", this);
12029 this->ptr = NULL;
12030 return this;
12033 /* ??0locale@std@@QAE@XZ */
12034 /* ??0locale@std@@QEAA@XZ */
12035 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
12036 locale* __thiscall locale_ctor(locale *this)
12038 TRACE("(%p)\n", this);
12039 this->ptr = locale__Init();
12040 call_locale_facet__Incref(&this->ptr->facet);
12041 return this;
12044 /* ??1locale@std@@QAE@XZ */
12045 /* ??1locale@std@@QEAA@XZ */
12046 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
12047 void __thiscall locale_dtor(locale *this)
12049 TRACE("(%p)\n", this);
12050 if(this->ptr && call_locale_facet__Decref(&this->ptr->facet))
12052 locale__Locimp_dtor(this->ptr);
12053 operator_delete(this->ptr);
12057 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
12058 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
12059 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
12060 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
12062 FIXME("(%p %p) stub\n", this, loc);
12063 return NULL;
12066 /* ??8locale@std@@QBE_NABV01@@Z */
12067 /* ??8locale@std@@QEBA_NAEBV01@@Z */
12068 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
12069 bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
12071 FIXME("(%p %p) stub\n", this, loc);
12072 return 0;
12075 /* ??9locale@std@@QBE_NABV01@@Z */
12076 /* ??9locale@std@@QEBA_NAEBV01@@Z */
12077 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
12078 bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
12080 FIXME("(%p %p) stub\n", this, loc);
12081 return 0;
12084 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
12085 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
12086 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
12087 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, size_t id, size_t catmask)
12089 TRACE("(%p %p %Iu %Iu)\n", this, facet, id, catmask);
12091 if(this->ptr->facet.refs > 1) {
12092 locale__Locimp *new_ptr = operator_new(sizeof(locale__Locimp));
12093 locale__Locimp_copy_ctor(new_ptr, this->ptr);
12094 call_locale_facet__Decref(&this->ptr->facet);
12095 this->ptr = new_ptr;
12098 locale__Locimp__Addfac(this->ptr, facet, id);
12100 if(catmask) {
12101 locale_string_char_dtor(&this->ptr->name);
12102 locale_string_char_ctor_cstr(&this->ptr->name, "*");
12104 return this;
12107 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I_N@Z */
12108 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K_N@Z */
12109 DEFINE_THISCALL_WRAPPER(locale__Getfacet_bool, 12)
12110 const locale_facet* __thiscall locale__Getfacet_bool(const locale *this,
12111 size_t id, bool allow_transparent)
12113 locale_facet *fac;
12115 TRACE("(%p %Iu)\n", this, id);
12117 fac = id < this->ptr->facet_cnt ? this->ptr->facetvec[id] : NULL;
12118 if(fac || !this->ptr->transparent || !allow_transparent)
12119 return fac;
12121 return id < global_locale->facet_cnt ? global_locale->facetvec[id] : NULL;
12124 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
12125 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
12126 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
12127 const locale_facet* __thiscall locale__Getfacet(const locale *this, size_t id)
12129 return locale__Getfacet_bool( this, id, TRUE );
12132 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
12133 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
12134 locale__Locimp* __cdecl locale__Getgloballocale(void)
12136 TRACE("\n");
12137 return global_locale;
12140 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
12141 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
12142 void __cdecl locale__Setgloballocale(void *locimp)
12144 TRACE("(%p)\n", locimp);
12145 global_locale = locimp;
12148 /* ?classic@locale@std@@SAABV12@XZ */
12149 /* ?classic@locale@std@@SAAEBV12@XZ */
12150 const locale* __cdecl locale_classic(void)
12152 TRACE("\n");
12153 locale__Init();
12154 return &classic_locale;
12157 /* ?empty@locale@std@@SA?AV12@XZ */
12158 locale* __cdecl locale_empty(locale *ret)
12160 TRACE("\n");
12162 locale__Init();
12164 ret->ptr = operator_new(sizeof(locale__Locimp));
12165 locale__Locimp_ctor_transparent(ret->ptr, TRUE);
12166 return ret;
12169 /* ?global@locale@std@@SA?AV12@ABV12@@Z */
12170 /* ?global@locale@std@@SA?AV12@AEBV12@@Z */
12171 locale* __cdecl locale_global(locale *ret, const locale *loc)
12173 _Lockit lock;
12174 int i;
12176 TRACE("(%p %p)\n", loc, ret);
12178 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12179 locale_ctor(ret);
12181 if(loc->ptr != global_locale) {
12182 call_locale_facet__Decref(&global_locale->facet);
12183 global_locale = loc->ptr;
12184 call_locale_facet__Incref(&global_locale->facet);
12186 for(i=LC_ALL+1; i<=LC_MAX; i++) {
12187 if((global_locale->catmask & (1<<(i-1))) == 0)
12188 continue;
12189 setlocale(i, locale_string_char_c_str(&global_locale->name));
12192 _Lockit_dtor(&lock);
12193 return ret;
12196 #if _MSVCP_VER < 100
12198 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12199 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12200 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
12201 basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
12203 TRACE("(%p)\n", this);
12205 MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
12206 return ret;
12209 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12210 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12211 DEFINE_THISCALL_WRAPPER(locale_name, 8)
12212 basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
12214 TRACE( "(%p)\n", this);
12215 MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
12216 return ret;
12219 #else
12221 /* ?_Getname@_Locinfo@std@@QBEPBDXZ */
12222 /* ?_Getname@_Locinfo@std@@QEBAPEBDXZ */
12223 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 4)
12224 const char * __thiscall _Locinfo__Getname( const _Locinfo *this )
12226 return locale_string_char_c_str( &this->newlocname );
12229 #endif /* _MSVCP_VER < 100 */
12231 /* wctrans */
12232 wctrans_t __cdecl wctrans(const char *property)
12234 static const char str_tolower[] = "tolower";
12235 static const char str_toupper[] = "toupper";
12237 if(!strcmp(property, str_tolower))
12238 return 2;
12239 if(!strcmp(property, str_toupper))
12240 return 1;
12241 return 0;
12244 /* towctrans */
12245 wint_t __cdecl towctrans(wint_t c, wctrans_t category)
12247 if(category == 1)
12248 return towupper(c);
12249 return towlower(c);
12252 #if _MSVCP_VER <= 71
12253 /* btowc */
12254 wint_t __cdecl btowc(int c)
12256 wchar_t ret;
12257 int state = 0;
12258 char ch = c;
12260 if (c == EOF || _Mbrtowc( &ret, &ch, 1, &state, NULL ) != 1) return WEOF;
12261 return ret;
12264 /* mbrlen */
12265 size_t __cdecl mbrlen(const char *str, size_t n, mbstate_t *state)
12267 static int local_state;
12269 if (!state) state = &local_state;
12270 return _Mbrtowc( NULL, str, n, state, NULL );
12273 /* mbrtowc */
12274 size_t __cdecl mbrtowc(wchar_t *dst, const char *str, size_t n, mbstate_t *state)
12276 static int local_state;
12278 if (!state) state = &local_state;
12279 return _Mbrtowc( dst, str, n, state, NULL );
12282 /* mbsrtowcs */
12283 size_t __cdecl mbsrtowcs(wchar_t *dst, const char **pstr, size_t n, mbstate_t *state)
12285 static int local_state;
12286 size_t ret = 0;
12287 wchar_t wc;
12288 const char *src;
12290 src = *pstr;
12291 if (!state) state = &local_state;
12293 while (!dst || n > ret)
12295 int len = _Mbrtowc( &wc, src, 2, state, NULL );
12296 if (len < 0) return -1;
12297 if (!len) break;
12298 if (dst) dst[ret] = wc;
12299 ret++;
12300 if (!wc) break;
12301 src += len;
12303 return ret;
12306 /* wctob */
12307 int __cdecl wctob(wint_t wc)
12309 char ret[MB_LEN_MAX];
12311 if (wc == WEOF || _Wcrtomb( ret, wc, NULL, NULL ) != 1) return EOF;
12312 return ret[0];
12315 /* wcrtomb */
12316 size_t __cdecl wcrtomb(char *dst, wchar_t wc, mbstate_t *state)
12318 return _Wcrtomb( dst, wc, state, NULL );
12321 /* wcsrtombs */
12322 size_t __cdecl wcsrtombs(char *dst, const wchar_t **pstr, size_t n, mbstate_t *state)
12324 const wchar_t *src;
12325 char buffer[MB_LEN_MAX];
12326 size_t ret = 0;
12328 src = *pstr;
12330 while (!dst || n > ret)
12332 int len = _Wcrtomb( buffer, *src, state, NULL );
12333 if (len <= 0) return -1;
12334 if (n < ret + len) break;
12335 memcpy( dst + ret, buffer, len );
12336 ret += len;
12337 if (!buffer[0]) break;
12338 src++;
12340 return ret;
12342 #endif
12344 int __cdecl _To_byte(const wchar_t *src, char *dst)
12346 TRACE("(%s %p)\n", debugstr_w(src), dst);
12347 return WideCharToMultiByte(CP_ACP, 0, src, -1, dst, MAX_PATH, NULL, NULL);
12350 int __cdecl _To_wide(const char *src, wchar_t *dst)
12352 TRACE("(%s %p)\n", debugstr_a(src), dst);
12353 return MultiByteToWideChar(CP_ACP, 0, src, -1, dst, MAX_PATH);
12356 size_t __cdecl _Strxfrm(char *dest, char *dest_end,
12357 const char *src, const char *src_end, _Collvec *coll)
12359 size_t dest_len = dest_end - dest;
12360 size_t src_len = src_end - src;
12361 _Collvec cv;
12362 WCHAR *buf;
12363 LCID lcid;
12364 int len;
12366 TRACE("(%p %p %p %p %p)\n", dest, dest_end, src, src_end, coll);
12368 if (coll) cv = *coll;
12369 else getcoll(&cv);
12371 #if _MSVCP_VER < 110
12372 lcid = cv.handle;
12373 #else
12374 lcid = LocaleNameToLCID(cv.lc_name, 0);
12375 #endif
12377 if (!lcid && !cv.page)
12379 if (src_len > dest_len) return src_len;
12380 memcpy(dest, src, src_len);
12381 return src_len;
12384 len = MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, NULL, 0);
12385 if (!len) return INT_MAX;
12386 buf = heap_alloc(len * sizeof(WCHAR));
12387 if (!buf) return INT_MAX;
12388 MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, buf, len);
12390 len = LCMapStringW(lcid, LCMAP_SORTKEY, buf, len, NULL, 0);
12391 if (len <= dest_len)
12392 LCMapStringW(lcid, LCMAP_SORTKEY, buf, len, (WCHAR*)dest, dest_len);
12393 heap_free(buf);
12394 return len;
12397 size_t __cdecl _Wcsxfrm(wchar_t *dest, wchar_t *dest_end,
12398 const wchar_t *src, const wchar_t *src_end, _Collvec *coll)
12400 size_t dest_len = dest_end - dest;
12401 size_t src_len = src_end - src;
12402 _Collvec cv;
12403 LCID lcid;
12404 int i, len;
12406 TRACE("(%p %p %p %p %p)\n", dest, dest_end, src, src_end, coll);
12408 if (coll) cv = *coll;
12409 else getcoll(&cv);
12411 #if _MSVCP_VER < 110
12412 lcid = cv.handle;
12413 #else
12414 lcid = LocaleNameToLCID(cv.lc_name, 0);
12415 #endif
12417 if (!lcid)
12419 if (src_len > dest_len) return src_len;
12420 memcpy(dest, src, src_len * sizeof(wchar_t));
12421 return src_len;
12424 len = LCMapStringW(lcid, LCMAP_SORTKEY, src, src_len, NULL, 0);
12425 if (!len) return INT_MAX;
12426 if (len > dest_len) return len;
12428 LCMapStringW(lcid, LCMAP_SORTKEY, src, src_len, dest, dest_len);
12429 for (i = len - 1; i >= 0; i--)
12430 dest[i] = ((BYTE*)dest)[i];
12431 return len;
12434 DEFINE_RTTI_DATA0(_Facet_base, 0, ".?AV_Facet_base@std@@")
12435 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@")
12436 DEFINE_RTTI_DATA1(locale__Locimp, 0, &locale_facet_rtti_base_descriptor, ".?AV_Locimp@locale@std@@")
12437 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@")
12438 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@")
12439 DEFINE_RTTI_DATA1(collate_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@G@std@@")
12440 DEFINE_RTTI_DATA1(ctype_base, 0, &locale_facet_rtti_base_descriptor, ".?AUctype_base@std@@")
12441 DEFINE_RTTI_DATA2(ctype_char, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@D@std@@")
12442 DEFINE_RTTI_DATA2(ctype_wchar, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@_W@std@@")
12443 DEFINE_RTTI_DATA2(ctype_short, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@G@std@@")
12444 DEFINE_RTTI_DATA1(codecvt_base, 0, &locale_facet_rtti_base_descriptor, ".?AVcodecvt_base@std@@")
12445 #if _MSVCP_VER >= 140
12446 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDU_Mbstatet@@@std@@")
12447 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDU_Mbstatet@@@std@@")
12448 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDU_Mbstatet@@@std@@")
12449 #else
12450 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDH@std@@")
12451 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDH@std@@")
12452 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDH@std@@")
12453 #endif
12454 DEFINE_RTTI_DATA1(numpunct_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@D@std@@")
12455 DEFINE_RTTI_DATA1(numpunct_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@_W@std@@")
12456 DEFINE_RTTI_DATA1(numpunct_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@G@std@@")
12457 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@@")
12458 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@@")
12459 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@@")
12460 DEFINE_RTTI_DATA1(num_put_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@")
12461 DEFINE_RTTI_DATA1(num_put_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@")
12462 DEFINE_RTTI_DATA1(num_put_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@")
12463 DEFINE_RTTI_DATA1(time_put_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@")
12464 DEFINE_RTTI_DATA1(time_put_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@")
12465 DEFINE_RTTI_DATA1(time_put_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@")
12466 DEFINE_RTTI_DATA1(time_base, 0, &locale_facet_rtti_base_descriptor, ".?AUtime_base@std@@")
12467 DEFINE_RTTI_DATA2(time_get_char, 0, &time_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@")
12468 DEFINE_RTTI_DATA2(time_get_wchar, 0, &time_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@")
12470 __ASM_BLOCK_BEGIN(locale_vtables)
12471 __ASM_VTABLE(_Facet_base,
12472 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12473 VTABLE_ADD_FUNC(locale_facet__Incref)
12474 VTABLE_ADD_FUNC(locale_facet__Incref)
12476 __ASM_VTABLE(locale_facet,
12477 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12478 #if _MSVCP_VER >= 110
12479 VTABLE_ADD_FUNC(locale_facet__Incref)
12480 VTABLE_ADD_FUNC(locale_facet__Decref)
12481 #endif
12483 __ASM_VTABLE(locale__Locimp,
12484 VTABLE_ADD_FUNC(locale__Locimp_vector_dtor)
12485 #if _MSVCP_VER >= 110
12486 VTABLE_ADD_FUNC(locale_facet__Incref)
12487 VTABLE_ADD_FUNC(locale_facet__Decref)
12488 #endif
12490 __ASM_VTABLE(collate_char,
12491 VTABLE_ADD_FUNC(collate_char_vector_dtor)
12492 #if _MSVCP_VER >= 110
12493 VTABLE_ADD_FUNC(locale_facet__Incref)
12494 VTABLE_ADD_FUNC(locale_facet__Decref)
12495 #endif
12496 VTABLE_ADD_FUNC(collate_char_do_compare)
12497 VTABLE_ADD_FUNC(collate_char_do_transform)
12498 VTABLE_ADD_FUNC(collate_char_do_hash));
12499 __ASM_VTABLE(collate_wchar,
12500 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12501 #if _MSVCP_VER >= 110
12502 VTABLE_ADD_FUNC(locale_facet__Incref)
12503 VTABLE_ADD_FUNC(locale_facet__Decref)
12504 #endif
12505 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12506 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12507 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12508 __ASM_VTABLE(collate_short,
12509 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12510 #if _MSVCP_VER >= 110
12511 VTABLE_ADD_FUNC(locale_facet__Incref)
12512 VTABLE_ADD_FUNC(locale_facet__Decref)
12513 #endif
12514 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12515 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12516 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12517 __ASM_VTABLE(ctype_base,
12518 VTABLE_ADD_FUNC(ctype_base_vector_dtor)
12519 #if _MSVCP_VER >= 110
12520 VTABLE_ADD_FUNC(locale_facet__Incref)
12521 VTABLE_ADD_FUNC(locale_facet__Decref)
12522 #endif
12524 __ASM_VTABLE(ctype_char,
12525 VTABLE_ADD_FUNC(ctype_char_vector_dtor)
12526 #if _MSVCP_VER >= 110
12527 VTABLE_ADD_FUNC(locale_facet__Incref)
12528 VTABLE_ADD_FUNC(locale_facet__Decref)
12529 #endif
12530 VTABLE_ADD_FUNC(ctype_char_do_tolower)
12531 VTABLE_ADD_FUNC(ctype_char_do_tolower_ch)
12532 VTABLE_ADD_FUNC(ctype_char_do_toupper)
12533 VTABLE_ADD_FUNC(ctype_char_do_toupper_ch)
12534 VTABLE_ADD_FUNC(ctype_char_do_widen)
12535 VTABLE_ADD_FUNC(ctype_char_do_widen_ch)
12536 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12537 VTABLE_ADD_FUNC(ctype_char__Do_widen_s)
12538 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12539 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12540 VTABLE_ADD_FUNC(ctype_char__Do_narrow_s)
12541 #else
12542 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12543 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12544 #endif
12546 __ASM_VTABLE(ctype_wchar,
12547 VTABLE_ADD_FUNC(ctype_wchar_vector_dtor)
12548 #if _MSVCP_VER >= 110
12549 VTABLE_ADD_FUNC(locale_facet__Incref)
12550 VTABLE_ADD_FUNC(locale_facet__Decref)
12551 #endif
12552 VTABLE_ADD_FUNC(ctype_wchar_do_is)
12553 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12554 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12555 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12556 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12557 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12558 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12559 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12560 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12561 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12562 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12563 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12564 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12565 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12566 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12567 #else
12568 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12569 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12570 #endif
12572 __ASM_VTABLE(ctype_short,
12573 VTABLE_ADD_FUNC(ctype_wchar_vector_dtor)
12574 #if _MSVCP_VER >= 110
12575 VTABLE_ADD_FUNC(locale_facet__Incref)
12576 VTABLE_ADD_FUNC(locale_facet__Decref)
12577 #endif
12578 VTABLE_ADD_FUNC(ctype_wchar_do_is)
12579 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12580 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12581 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12582 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12583 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12584 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12585 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12586 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12587 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12588 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12589 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12590 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12591 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12592 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12593 #else
12594 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12595 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12596 #endif
12598 __ASM_VTABLE(codecvt_base,
12599 VTABLE_ADD_FUNC(codecvt_base_vector_dtor)
12600 #if _MSVCP_VER >= 110
12601 VTABLE_ADD_FUNC(locale_facet__Incref)
12602 VTABLE_ADD_FUNC(locale_facet__Decref)
12603 #endif
12604 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
12605 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12606 VTABLE_ADD_FUNC(codecvt_base_do_encoding));
12607 __ASM_VTABLE(codecvt_char,
12608 VTABLE_ADD_FUNC(codecvt_char_vector_dtor)
12609 #if _MSVCP_VER >= 110
12610 VTABLE_ADD_FUNC(locale_facet__Incref)
12611 VTABLE_ADD_FUNC(locale_facet__Decref)
12612 VTABLE_ADD_FUNC(codecvt_char_do_always_noconv)
12613 #else
12614 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
12615 #endif
12616 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12617 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12618 VTABLE_ADD_FUNC(codecvt_char_do_in)
12619 VTABLE_ADD_FUNC(codecvt_char_do_out)
12620 VTABLE_ADD_FUNC(codecvt_char_do_unshift)
12621 VTABLE_ADD_FUNC(codecvt_char_do_length));
12622 __ASM_VTABLE(codecvt_wchar,
12623 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12624 #if _MSVCP_VER >= 110
12625 VTABLE_ADD_FUNC(locale_facet__Incref)
12626 VTABLE_ADD_FUNC(locale_facet__Decref)
12627 #endif
12628 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12629 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12630 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12631 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12632 #else
12633 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12634 #endif
12635 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12636 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12637 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12638 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12639 __ASM_VTABLE(codecvt_short,
12640 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12641 #if _MSVCP_VER >= 110
12642 VTABLE_ADD_FUNC(locale_facet__Incref)
12643 VTABLE_ADD_FUNC(locale_facet__Decref)
12644 #endif
12645 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12646 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12647 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12648 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12649 #else
12650 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12651 #endif
12652 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12653 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12654 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12655 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12656 __ASM_VTABLE(numpunct_char,
12657 VTABLE_ADD_FUNC(numpunct_char_vector_dtor)
12658 #if _MSVCP_VER >= 110
12659 VTABLE_ADD_FUNC(locale_facet__Incref)
12660 VTABLE_ADD_FUNC(locale_facet__Decref)
12661 #endif
12662 VTABLE_ADD_FUNC(numpunct_char_do_decimal_point)
12663 VTABLE_ADD_FUNC(numpunct_char_do_thousands_sep)
12664 VTABLE_ADD_FUNC(numpunct_char_do_grouping)
12665 VTABLE_ADD_FUNC(numpunct_char_do_falsename)
12666 VTABLE_ADD_FUNC(numpunct_char_do_truename));
12667 __ASM_VTABLE(numpunct_wchar,
12668 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
12669 #if _MSVCP_VER >= 110
12670 VTABLE_ADD_FUNC(locale_facet__Incref)
12671 VTABLE_ADD_FUNC(locale_facet__Decref)
12672 #endif
12673 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
12674 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
12675 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
12676 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
12677 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
12678 __ASM_VTABLE(numpunct_short,
12679 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
12680 #if _MSVCP_VER >= 110
12681 VTABLE_ADD_FUNC(locale_facet__Incref)
12682 VTABLE_ADD_FUNC(locale_facet__Decref)
12683 #endif
12684 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
12685 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
12686 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
12687 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
12688 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
12689 __ASM_VTABLE(num_get_char,
12690 VTABLE_ADD_FUNC(num_get_char_vector_dtor)
12691 #if _MSVCP_VER >= 110
12692 VTABLE_ADD_FUNC(locale_facet__Incref)
12693 VTABLE_ADD_FUNC(locale_facet__Decref)
12694 #endif
12695 VTABLE_ADD_FUNC(num_get_char_do_get_void)
12696 VTABLE_ADD_FUNC(num_get_char_do_get_double)
12697 VTABLE_ADD_FUNC(num_get_char_do_get_double)
12698 VTABLE_ADD_FUNC(num_get_char_do_get_float)
12699 VTABLE_ADD_FUNC(num_get_char_do_get_uint64)
12700 VTABLE_ADD_FUNC(num_get_char_do_get_int64)
12701 VTABLE_ADD_FUNC(num_get_char_do_get_ulong)
12702 VTABLE_ADD_FUNC(num_get_char_do_get_long)
12703 VTABLE_ADD_FUNC(num_get_char_do_get_uint)
12704 VTABLE_ADD_FUNC(num_get_char_do_get_ushort)
12705 VTABLE_ADD_FUNC(num_get_char_do_get_bool));
12706 __ASM_VTABLE(num_get_short,
12707 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
12708 #if _MSVCP_VER >= 110
12709 VTABLE_ADD_FUNC(locale_facet__Incref)
12710 VTABLE_ADD_FUNC(locale_facet__Decref)
12711 #endif
12712 VTABLE_ADD_FUNC(num_get_short_do_get_void)
12713 VTABLE_ADD_FUNC(num_get_short_do_get_double)
12714 VTABLE_ADD_FUNC(num_get_short_do_get_double)
12715 VTABLE_ADD_FUNC(num_get_short_do_get_float)
12716 VTABLE_ADD_FUNC(num_get_short_do_get_uint64)
12717 VTABLE_ADD_FUNC(num_get_short_do_get_int64)
12718 VTABLE_ADD_FUNC(num_get_short_do_get_ulong)
12719 VTABLE_ADD_FUNC(num_get_short_do_get_long)
12720 VTABLE_ADD_FUNC(num_get_short_do_get_uint)
12721 VTABLE_ADD_FUNC(num_get_short_do_get_ushort)
12722 VTABLE_ADD_FUNC(num_get_short_do_get_bool));
12723 __ASM_VTABLE(num_get_wchar,
12724 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
12725 #if _MSVCP_VER >= 110
12726 VTABLE_ADD_FUNC(locale_facet__Incref)
12727 VTABLE_ADD_FUNC(locale_facet__Decref)
12728 #endif
12729 VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
12730 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
12731 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
12732 VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
12733 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
12734 VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
12735 VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
12736 VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
12737 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
12738 VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
12739 VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
12740 __ASM_VTABLE(num_put_char,
12741 VTABLE_ADD_FUNC(num_put_char_vector_dtor)
12742 #if _MSVCP_VER >= 110
12743 VTABLE_ADD_FUNC(locale_facet__Incref)
12744 VTABLE_ADD_FUNC(locale_facet__Decref)
12745 #endif
12746 VTABLE_ADD_FUNC(num_put_char_do_put_ptr)
12747 VTABLE_ADD_FUNC(num_put_char_do_put_double)
12748 VTABLE_ADD_FUNC(num_put_char_do_put_double)
12749 VTABLE_ADD_FUNC(num_put_char_do_put_uint64)
12750 VTABLE_ADD_FUNC(num_put_char_do_put_int64)
12751 VTABLE_ADD_FUNC(num_put_char_do_put_ulong)
12752 VTABLE_ADD_FUNC(num_put_char_do_put_long)
12753 VTABLE_ADD_FUNC(num_put_char_do_put_bool));
12754 __ASM_VTABLE(num_put_wchar,
12755 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
12756 #if _MSVCP_VER >= 110
12757 VTABLE_ADD_FUNC(locale_facet__Incref)
12758 VTABLE_ADD_FUNC(locale_facet__Decref)
12759 #endif
12760 VTABLE_ADD_FUNC(num_put_wchar_do_put_ptr)
12761 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
12762 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
12763 VTABLE_ADD_FUNC(num_put_wchar_do_put_uint64)
12764 VTABLE_ADD_FUNC(num_put_wchar_do_put_int64)
12765 VTABLE_ADD_FUNC(num_put_wchar_do_put_ulong)
12766 VTABLE_ADD_FUNC(num_put_wchar_do_put_long)
12767 VTABLE_ADD_FUNC(num_put_wchar_do_put_bool));
12768 __ASM_VTABLE(num_put_short,
12769 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
12770 #if _MSVCP_VER >= 110
12771 VTABLE_ADD_FUNC(locale_facet__Incref)
12772 VTABLE_ADD_FUNC(locale_facet__Decref)
12773 #endif
12774 VTABLE_ADD_FUNC(num_put_short_do_put_ptr)
12775 VTABLE_ADD_FUNC(num_put_short_do_put_double)
12776 VTABLE_ADD_FUNC(num_put_short_do_put_double)
12777 VTABLE_ADD_FUNC(num_put_short_do_put_uint64)
12778 VTABLE_ADD_FUNC(num_put_short_do_put_int64)
12779 VTABLE_ADD_FUNC(num_put_short_do_put_ulong)
12780 VTABLE_ADD_FUNC(num_put_short_do_put_long)
12781 VTABLE_ADD_FUNC(num_put_short_do_put_bool));
12782 __ASM_VTABLE(time_put_char,
12783 VTABLE_ADD_FUNC(time_put_char_vector_dtor)
12784 #if _MSVCP_VER >= 110
12785 VTABLE_ADD_FUNC(locale_facet__Incref)
12786 VTABLE_ADD_FUNC(locale_facet__Decref)
12787 #endif
12788 VTABLE_ADD_FUNC(time_put_char_do_put));
12789 __ASM_VTABLE(time_put_wchar,
12790 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
12791 #if _MSVCP_VER >= 110
12792 VTABLE_ADD_FUNC(locale_facet__Incref)
12793 VTABLE_ADD_FUNC(locale_facet__Decref)
12794 #endif
12795 VTABLE_ADD_FUNC(time_put_wchar_do_put));
12796 __ASM_VTABLE(time_put_short,
12797 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
12798 #if _MSVCP_VER >= 110
12799 VTABLE_ADD_FUNC(locale_facet__Incref)
12800 VTABLE_ADD_FUNC(locale_facet__Decref)
12801 #endif
12802 VTABLE_ADD_FUNC(time_put_wchar_do_put));
12803 __ASM_VTABLE(time_get_char,
12804 VTABLE_ADD_FUNC(time_get_char_vector_dtor)
12805 #if _MSVCP_VER >= 110
12806 VTABLE_ADD_FUNC(locale_facet__Incref)
12807 VTABLE_ADD_FUNC(locale_facet__Decref)
12808 #endif
12809 VTABLE_ADD_FUNC(time_get_char_do_date_order)
12810 VTABLE_ADD_FUNC(time_get_char_do_get_time)
12811 VTABLE_ADD_FUNC(time_get_char_do_get_date)
12812 VTABLE_ADD_FUNC(time_get_char_do_get_weekday)
12813 VTABLE_ADD_FUNC(time_get_char_do_get_monthname)
12814 VTABLE_ADD_FUNC(time_get_char_do_get_year)
12815 #if _MSVCP_VER >= 100
12816 VTABLE_ADD_FUNC(time_get_char_do_get)
12817 #endif
12819 __ASM_VTABLE(time_get_wchar,
12820 VTABLE_ADD_FUNC(time_get_wchar_vector_dtor)
12821 #if _MSVCP_VER >= 110
12822 VTABLE_ADD_FUNC(locale_facet__Incref)
12823 VTABLE_ADD_FUNC(locale_facet__Decref)
12824 #endif
12825 VTABLE_ADD_FUNC(time_get_wchar_do_date_order)
12826 VTABLE_ADD_FUNC(time_get_wchar_do_get_time)
12827 VTABLE_ADD_FUNC(time_get_wchar_do_get_date)
12828 VTABLE_ADD_FUNC(time_get_wchar_do_get_weekday)
12829 VTABLE_ADD_FUNC(time_get_wchar_do_get_monthname)
12830 VTABLE_ADD_FUNC(time_get_wchar_do_get_year)
12831 #if _MSVCP_VER >= 100
12832 VTABLE_ADD_FUNC(time_get_wchar_do_get)
12833 #endif
12835 __ASM_BLOCK_END
12837 void init_locale(void *base)
12839 #ifdef __x86_64__
12840 init__Facet_base_rtti(base);
12841 init_locale_facet_rtti(base);
12842 init_locale__Locimp_rtti(base);
12843 init_collate_char_rtti(base);
12844 init_collate_wchar_rtti(base);
12845 init_collate_short_rtti(base);
12846 init_ctype_base_rtti(base);
12847 init_ctype_char_rtti(base);
12848 init_ctype_wchar_rtti(base);
12849 init_ctype_short_rtti(base);
12850 init_codecvt_base_rtti(base);
12851 init_codecvt_char_rtti(base);
12852 init_codecvt_wchar_rtti(base);
12853 init_codecvt_short_rtti(base);
12854 init_numpunct_char_rtti(base);
12855 init_numpunct_wchar_rtti(base);
12856 init_numpunct_short_rtti(base);
12857 init_num_get_char_rtti(base);
12858 init_num_get_wchar_rtti(base);
12859 init_num_get_short_rtti(base);
12860 init_num_put_char_rtti(base);
12861 init_num_put_wchar_rtti(base);
12862 init_num_put_short_rtti(base);
12863 init_time_put_char_rtti(base);
12864 init_time_put_wchar_rtti(base);
12865 init_time_put_short_rtti(base);
12866 init_time_base_rtti(base);
12867 init_time_get_char_rtti(base);
12868 init_time_get_wchar_rtti(base);
12869 #endif
12872 void free_locale(void)
12874 facets_elem *iter, *safe;
12876 if(global_locale) {
12877 locale_dtor(&classic_locale);
12878 locale__Locimp_dtor(global_locale);
12879 operator_delete(global_locale);
12882 LIST_FOR_EACH_ENTRY_SAFE(iter, safe, &lazy_facets, facets_elem, entry) {
12883 list_remove(&iter->entry);
12884 if(call_locale_facet__Decref(iter->fac))
12885 call_locale_facet_vector_dtor(iter->fac, 1);
12886 operator_delete(iter);