winex11: Use NtUserBuildHwndList for has_owned_popup implementation.
[wine.git] / dlls / msvcp90 / locale.c
blob6be2bad1a383af86895c72ad559d72bb75d26ab1
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 /* This function is probably modifying more global objects */
520 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
522 if(!locstr)
523 _Xruntime_error("bad locale name");
525 _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
526 locale_string_char_ctor(&locinfo->days);
527 locale_string_char_ctor(&locinfo->months);
528 #if _MSVCP_VER >= 110
529 locale_string_wchar_ctor(&locinfo->wdays);
530 locale_string_wchar_ctor(&locinfo->wmonths);
531 #endif
532 locale_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
534 if(category)
535 locale = setlocale(LC_ALL, locstr);
536 else
537 locale = setlocale(LC_ALL, NULL);
539 if(locale)
540 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
541 else
542 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
544 return locinfo;
547 /* ??0_Locinfo@std@@QAE@HPBD@Z */
548 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
549 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
550 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
552 return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
555 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
556 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
557 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
559 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
562 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
563 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
564 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
565 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
567 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
570 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
571 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
572 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
574 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
577 /* ??0_Locinfo@std@@QAE@PBD@Z */
578 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
579 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
580 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
582 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
585 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
586 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
587 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
589 TRACE("(%p)\n", locinfo);
591 setlocale(LC_ALL, locale_string_char_c_str(&locinfo->oldlocname));
592 locale_string_char_dtor(&locinfo->days);
593 locale_string_char_dtor(&locinfo->months);
594 #if _MSVCP_VER >= 110
595 locale_string_wchar_dtor(&locinfo->wdays);
596 locale_string_wchar_dtor(&locinfo->wmonths);
597 #endif
598 locale_string_char_dtor(&locinfo->oldlocname);
599 locale_string_char_dtor(&locinfo->newlocname);
600 _Lockit_dtor(&locinfo->lock);
603 /* ??_F_Locinfo@std@@QAEXXZ */
604 /* ??_F_Locinfo@std@@QEAAXXZ */
605 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
606 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
608 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
611 /* ??1_Locinfo@std@@QAE@XZ */
612 /* ??1_Locinfo@std@@QEAA@XZ */
613 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
614 void __thiscall _Locinfo_dtor(_Locinfo *this)
616 _Locinfo__Locinfo_dtor(this);
619 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
620 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
621 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
623 const char *locale = NULL;
625 /* This function is probably modifying more global objects */
626 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
627 if(!locstr)
628 _Xruntime_error("bad locale name");
630 locale_string_char_dtor(&locinfo->newlocname);
632 if(category)
633 locale = setlocale(LC_ALL, locstr);
634 else
635 locale = setlocale(LC_ALL, NULL);
637 if(locale)
638 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
639 else
640 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
642 return locinfo;
645 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
646 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
647 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
648 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
650 return _Locinfo__Locinfo_Addcats(this, category, locstr);
653 static _Collvec* getcoll(_Collvec *ret)
655 TRACE("\n");
657 ret->page = ___lc_collate_cp_func();
658 #if _MSVCP_VER < 110
659 ret->handle = ___lc_handle_func()[LC_COLLATE];
660 #else
661 ret->lc_name = ___lc_locale_name_func()[LC_COLLATE];
662 #endif
663 return ret;
666 /* _Getcoll */
667 #if defined(__i386__)
668 /* Work around a gcc bug */
669 ULONGLONG __cdecl _Getcoll(void)
671 C_ASSERT(sizeof(_Collvec) == sizeof(ULONGLONG));
672 ULONGLONG ret;
674 getcoll((_Collvec*)&ret);
675 return ret;
677 #else
678 _Collvec __cdecl _Getcoll(void)
680 _Collvec ret;
682 getcoll(&ret);
683 return ret;
685 #endif
687 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
688 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
689 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
690 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
692 return getcoll(ret);
695 /* _Getctype */
696 _Ctypevec __cdecl _Getctype(void)
698 _Ctypevec ret;
699 short *table;
700 #if _MSVCP_VER >= 110
701 wchar_t *name;
702 size_t size;
703 #endif
705 TRACE("\n");
707 ret.page = ___lc_codepage_func();
708 #if _MSVCP_VER < 110
709 ret.handle = ___lc_handle_func()[LC_COLLATE];
710 #else
711 if((name = ___lc_locale_name_func()[LC_COLLATE])) {
712 size = wcslen(name)+1;
713 ret.name = operator_new(size*sizeof(*name));
714 memcpy(ret.name, name, size*sizeof(*name));
715 } else {
716 ret.name = NULL;
718 #endif
719 ret.delfl = TRUE;
720 table = operator_new(sizeof(short[256]));
721 memcpy(table, __pctype_func(), sizeof(short[256]));
722 ret.table = table;
723 return ret;
726 /* ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ */
727 /* ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ */
728 DEFINE_THISCALL_WRAPPER(_Locinfo__Getctype, 8)
729 _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
731 *ret = _Getctype();
732 return ret;
735 /* _Getcvt */
736 #if _MSVCP_VER < 110 && defined(__i386__)
737 /* Work around a gcc bug */
738 ULONGLONG __cdecl _Getcvt(void)
740 C_ASSERT(sizeof(_Cvtvec) == sizeof(ULONGLONG));
741 union {
742 _Cvtvec cvtvec;
743 ULONGLONG ull;
744 } ret;
746 TRACE("\n");
748 ret.cvtvec.page = ___lc_codepage_func();
749 ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
750 return ret.ull;
752 #elif _MSVCP_VER < 110
753 _Cvtvec __cdecl _Getcvt(void)
755 _Cvtvec ret;
757 TRACE("\n");
759 ret.page = ___lc_codepage_func();
760 ret.handle = ___lc_handle_func()[LC_CTYPE];
761 return ret;
763 #else
764 _Cvtvec __cdecl _Getcvt(void)
766 _Cvtvec ret;
767 int i;
769 TRACE("\n");
771 memset(&ret, 0, sizeof(ret));
772 ret.page = ___lc_codepage_func();
773 ret.mb_max = ___mb_cur_max_func();
775 if(ret.mb_max > 1) {
776 for(i=0; i<256; i++)
777 if(_ismbblead(i)) ret.isleadbyte[i/8] |= 1 << (i&7);
779 return ret;
781 #endif
783 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
784 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
785 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
786 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
788 #if _MSVCP_VER < 110 && defined(__i386__)
789 ULONGLONG cvtvec;
790 #else
791 _Cvtvec cvtvec;
792 #endif
794 cvtvec = _Getcvt();
795 memcpy(ret, &cvtvec, sizeof(cvtvec));
796 return ret;
799 int __cdecl _Getdateorder(void)
801 WCHAR date_fmt[2];
803 #if _MSVCP_VER < 110
804 if(!GetLocaleInfoW(___lc_handle_func()[LC_TIME], LOCALE_ILDATE,
805 date_fmt, ARRAY_SIZE(date_fmt)))
806 return DATEORDER_no_order;
807 #else
808 if(!GetLocaleInfoEx(___lc_locale_name_func()[LC_TIME], LOCALE_ILDATE,
809 date_fmt, ARRAY_SIZE(date_fmt)))
810 return DATEORDER_no_order;
811 #endif
813 if(*date_fmt == '0') return DATEORDER_mdy;
814 if(*date_fmt == '1') return DATEORDER_dmy;
815 if(*date_fmt == '2') return DATEORDER_ymd;
816 return DATEORDER_no_order;
819 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
820 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
821 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
822 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
824 TRACE("(%p)\n", this);
825 return _Getdateorder();
828 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
829 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
830 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
831 const char* __thiscall _Locinfo__Getdays(const _Locinfo *this)
833 char *days = _Getdays();
834 const char *ret;
836 TRACE("(%p)\n", this);
838 if(days) {
839 locale_string_char_dtor((locale_string *)&this->days);
840 locale_string_char_ctor_cstr((locale_string *)&this->days, days);
841 free(days);
844 ret = locale_string_char_c_str(&this->days);
845 if (!ret[0]) ret = ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
846 return ret;
849 #if _MSVCP_VER >= 110
850 /* ?_W_Getdays@_Locinfo@std@@QBEPBGXZ */
851 /* ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ */
852 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getdays, 4)
853 const wchar_t* __thiscall _Locinfo__W_Getdays(const _Locinfo *this)
855 static const wchar_t defdays[] =
857 ':','S','u','n',':','S','u','n','d','a','y',
858 ':','M','o','n',':','M','o','n','d','a','y',
859 ':','T','u','e',':','T','u','e','s','d','a','y',
860 ':','W','e','d',':','W','e','d','n','e','s','d','a','y',
861 ':','T','h','u',':','T','h','u','r','s','d','a','y',
862 ':','F','r','i',':','F','r','i','d','a','y',
863 ':','S','a','t',':','S','a','t','u','r','d','a','y'
865 wchar_t *wdays = _W_Getdays();
866 const wchar_t *ret;
868 TRACE("(%p)\n", this);
870 if(wdays) {
871 locale_string_wchar_assign((locale_string_wchar *)&this->wdays, wdays);
872 free(wdays);
875 ret = locale_string_wchar_c_str(&this->wdays);
876 if (!ret[0]) ret = defdays;
877 return ret;
880 /* ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ */
881 /* ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ */
882 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getmonths, 4)
883 const wchar_t* __thiscall _Locinfo__W_Getmonths(const _Locinfo *this)
885 static const wchar_t defmonths[] =
887 ':','J','a','n',':','J','a','n','u','a','r','y',
888 ':','F','e','b',':','F','e','b','r','u','a','r','y',
889 ':','M','a','r',':','M','a','r','c','h',
890 ':','A','p','r',':','A','p','r','i','l',
891 ':','M','a','y',':','M','a','y',
892 ':','J','u','n',':','J','u','n','e',
893 ':','J','u','l',':','J','u','l','y',
894 ':','A','u','g',':','A','u','g','u','s','t',
895 ':','S','e','p',':','S','e','p','t','e','m','b','e','r',
896 ':','O','c','t',':','O','c','t','o','b','e','r',
897 ':','N','o','v',':','N','o','v','e','m','b','e','r',
898 ':','D','e','c',':','D','e','c','e','m','b','e','r'
900 wchar_t *wmonths = _W_Getmonths();
901 const wchar_t *ret;
903 TRACE("(%p)\n", this);
905 if(wmonths) {
906 locale_string_wchar_assign((locale_string_wchar *)&this->wmonths, wmonths);
907 free(wmonths);
910 ret = locale_string_wchar_c_str(&this->wmonths);
911 if (!ret[0]) ret = defmonths;
912 return ret;
914 #endif
916 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
917 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
918 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
919 const char* __thiscall _Locinfo__Getmonths(const _Locinfo *this)
921 char *months = _Getmonths();
922 const char *ret;
924 TRACE("(%p)\n", this);
926 if(months) {
927 locale_string_char_dtor((locale_string *)&this->months);
928 locale_string_char_ctor_cstr((locale_string *)&this->months, months);
929 free(months);
932 ret = locale_string_char_c_str(&this->months);
933 if (!ret[0]) ret = ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
934 ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
935 return ret;
938 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
939 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
940 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
941 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
943 TRACE("(%p)\n", this);
944 return "false";
947 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
948 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
949 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
950 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
952 TRACE("(%p)\n", this);
953 return "true";
956 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
957 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
958 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
959 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
961 TRACE("(%p)\n", this);
962 return localeconv();
965 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
966 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
967 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
968 _Timevec*__thiscall _Locinfo__Gettnames(const _Locinfo *this, _Timevec *ret)
970 TRACE("(%p)\n", this);
972 _Timevec_ctor_timeptr(ret, _Gettnames());
973 return ret;
976 /* ?id@?$collate@D@std@@2V0locale@2@A */
977 locale_id collate_char_id = {0};
979 /* ??_7?$collate@D@std@@6B@ */
980 extern const vtable_ptr collate_char_vtable;
982 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
983 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
984 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
985 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
987 TRACE("(%p %p)\n", this, locinfo);
988 _Locinfo__Getcoll(locinfo, &this->coll);
991 /* ??0?$collate@D@std@@IAE@PBDI@Z */
992 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
993 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
994 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, size_t refs)
996 _Locinfo locinfo;
998 TRACE("(%p %s %Iu)\n", this, name, refs);
1000 locale_facet_ctor_refs(&this->facet, refs);
1001 this->facet.vtable = &collate_char_vtable;
1003 _Locinfo_ctor_cstr(&locinfo, name);
1004 collate_char__Init(this, &locinfo);
1005 _Locinfo_dtor(&locinfo);
1006 return this;
1009 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
1010 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1011 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
1012 collate* __thiscall collate_char_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1014 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1016 locale_facet_ctor_refs(&this->facet, refs);
1017 this->facet.vtable = &collate_char_vtable;
1018 collate_char__Init(this, locinfo);
1019 return this;
1022 /* ??0?$collate@D@std@@QAE@I@Z */
1023 /* ??0?$collate@D@std@@QEAA@_K@Z */
1024 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
1025 collate* __thiscall collate_char_ctor_refs(collate *this, size_t refs)
1027 return collate_char_ctor_name(this, "C", refs);
1030 /* ??1?$collate@D@std@@UAE@XZ */
1031 /* ??1?$collate@D@std@@UEAA@XZ */
1032 /* ??1?$collate@D@std@@MAE@XZ */
1033 /* ??1?$collate@D@std@@MEAA@XZ */
1034 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
1035 void __thiscall collate_char_dtor(collate *this)
1037 TRACE("(%p)\n", this);
1040 DEFINE_THISCALL_WRAPPER(collate_char_vector_dtor, 8)
1041 collate* __thiscall collate_char_vector_dtor(collate *this, unsigned int flags)
1043 TRACE("(%p %x)\n", this, flags);
1044 if(flags & 2) {
1045 /* we have an array, with the number of elements stored before the first object */
1046 INT_PTR i, *ptr = (INT_PTR *)this-1;
1048 for(i=*ptr-1; i>=0; i--)
1049 collate_char_dtor(this+i);
1050 operator_delete(ptr);
1051 } else {
1052 collate_char_dtor(this);
1053 if(flags & 1)
1054 operator_delete(this);
1057 return this;
1060 /* ??_F?$collate@D@std@@QAEXXZ */
1061 /* ??_F?$collate@D@std@@QEAAXXZ */
1062 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
1063 collate* __thiscall collate_char_ctor(collate *this)
1065 return collate_char_ctor_name(this, "C", 0);
1068 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1069 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1070 size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale *loc)
1072 TRACE("(%p %p)\n", facet, loc);
1074 if(facet && !*facet) {
1075 *facet = operator_new(sizeof(collate));
1076 collate_char_ctor_name((collate*)*facet,
1077 locale_string_char_c_str(&loc->ptr->name), 0);
1080 return LC_COLLATE;
1083 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@@Z */
1084 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1085 size_t __cdecl collate_char__Getcat_old(const locale_facet **facet)
1087 return collate_char__Getcat(facet, locale_classic());
1090 static collate* collate_char_use_facet(const locale *loc)
1092 static collate *obj = NULL;
1094 _Lockit lock;
1095 const locale_facet *fac;
1097 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1098 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_char_id));
1099 if(fac) {
1100 _Lockit_dtor(&lock);
1101 return (collate*)fac;
1104 if(obj) {
1105 _Lockit_dtor(&lock);
1106 return obj;
1109 collate_char__Getcat(&fac, loc);
1110 obj = (collate*)fac;
1111 call_locale_facet__Incref(&obj->facet);
1112 locale_facet_register(&obj->facet);
1113 _Lockit_dtor(&lock);
1115 return obj;
1118 /* _Strcoll */
1119 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
1120 const char *last2, const _Collvec *coll)
1122 LCID lcid;
1124 TRACE("(%s %s)\n", debugstr_an(first1, last1-first1), debugstr_an(first2, last2-first2));
1126 #if _MSVCP_VER < 110
1127 lcid = (coll ? coll->handle : ___lc_handle_func()[LC_COLLATE]);
1128 #else
1129 lcid = LocaleNameToLCID(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE], 0);
1130 #endif
1131 return CompareStringA(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1134 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
1135 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
1136 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
1137 #if _MSVCP_VER <= 100
1138 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1139 (const collate*, const char*, const char*, const char*, const char*), \
1140 (this, first1, last1, first2, last2))
1141 #else
1142 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1143 (const collate*, const char*, const char*, const char*, const char*), \
1144 (this, first1, last1, first2, last2))
1145 #endif
1146 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
1147 const char *last1, const char *first2, const char *last2)
1149 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1150 return _Strcoll(first1, last1, first2, last2, &this->coll);
1153 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
1154 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
1155 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
1156 int __thiscall collate_char_compare(const collate *this, const char *first1,
1157 const char *last1, const char *first2, const char *last2)
1159 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1160 return call_collate_char_do_compare(this, first1, last1, first2, last2);
1163 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
1164 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
1165 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
1166 #if _MSVCP_VER <= 100
1167 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1168 (const collate*, const char*, const char*), (this, first, last))
1169 #else
1170 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1171 (const collate*, const char*, const char*), (this, first, last))
1172 #endif
1173 LONG __thiscall collate_char_do_hash(const collate *this,
1174 const char *first, const char *last)
1176 ULONG ret = 0;
1178 TRACE("(%p %p %p)\n", this, first, last);
1180 for(; first<last; first++)
1181 ret = (ret<<8 | ret>>24) + *first;
1182 return ret;
1185 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
1186 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
1187 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
1188 LONG __thiscall collate_char_hash(const collate *this,
1189 const char *first, const char *last)
1191 TRACE("(%p %p %p)\n", this, first, last);
1192 return call_collate_char_do_hash(this, first, last);
1195 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1196 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1197 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
1198 basic_string_char* __thiscall collate_char_do_transform(const collate *this,
1199 basic_string_char *ret, const char *first, const char *last)
1201 FIXME("(%p %p %p) stub\n", this, first, last);
1202 return ret;
1205 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1206 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1207 DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
1208 basic_string_char* __thiscall collate_char_transform(const collate *this,
1209 basic_string_char *ret, const char *first, const char *last)
1211 FIXME("(%p %p %p) stub\n", this, first, last);
1212 return ret;
1215 /* ?id@?$collate@_W@std@@2V0locale@2@A */
1216 locale_id collate_wchar_id = {0};
1217 /* ?id@?$collate@G@std@@2V0locale@2@A */
1218 locale_id collate_short_id = {0};
1220 /* ??_7?$collate@_W@std@@6B@ */
1221 extern const vtable_ptr collate_wchar_vtable;
1222 /* ??_7?$collate@G@std@@6B@ */
1223 extern const vtable_ptr collate_short_vtable;
1225 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
1226 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
1227 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
1228 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
1229 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
1230 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
1232 TRACE("(%p %p)\n", this, locinfo);
1233 _Locinfo__Getcoll(locinfo, &this->coll);
1236 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
1237 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
1238 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
1239 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, size_t refs)
1241 _Locinfo locinfo;
1243 TRACE("(%p %s %Iu)\n", this, name, refs);
1245 locale_facet_ctor_refs(&this->facet, refs);
1246 this->facet.vtable = &collate_wchar_vtable;
1248 _Locinfo_ctor_cstr(&locinfo, name);
1249 collate_wchar__Init(this, &locinfo);
1250 _Locinfo_dtor(&locinfo);
1251 return this;
1254 /* ??0?$collate@G@std@@IAE@PBDI@Z */
1255 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
1256 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
1257 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, size_t refs)
1259 collate *ret = collate_wchar_ctor_name(this, name, refs);
1260 ret->facet.vtable = &collate_short_vtable;
1261 return ret;
1264 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
1265 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1266 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
1267 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1269 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1271 locale_facet_ctor_refs(&this->facet, refs);
1272 this->facet.vtable = &collate_wchar_vtable;
1273 collate_wchar__Init(this, locinfo);
1274 return this;
1277 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
1278 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1279 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
1280 collate* __thiscall collate_short_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1282 collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
1283 ret->facet.vtable = &collate_short_vtable;
1284 return ret;
1287 /* ??0?$collate@_W@std@@QAE@I@Z */
1288 /* ??0?$collate@_W@std@@QEAA@_K@Z */
1289 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
1290 collate* __thiscall collate_wchar_ctor_refs(collate *this, size_t refs)
1292 return collate_wchar_ctor_name(this, "C", refs);
1295 /* ??0?$collate@G@std@@QAE@I@Z */
1296 /* ??0?$collate@G@std@@QEAA@_K@Z */
1297 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
1298 collate* __thiscall collate_short_ctor_refs(collate *this, size_t refs)
1300 collate *ret = collate_wchar_ctor_refs(this, refs);
1301 ret->facet.vtable = &collate_short_vtable;
1302 return ret;
1305 /* ??1?$collate@G@std@@UAE@XZ */
1306 /* ??1?$collate@G@std@@UEAA@XZ */
1307 /* ??1?$collate@_W@std@@MAE@XZ */
1308 /* ??1?$collate@_W@std@@MEAA@XZ */
1309 /* ??1?$collate@G@std@@MAE@XZ */
1310 /* ??1?$collate@G@std@@MEAA@XZ */
1311 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
1312 void __thiscall collate_wchar_dtor(collate *this)
1314 TRACE("(%p)\n", this);
1317 DEFINE_THISCALL_WRAPPER(collate_wchar_vector_dtor, 8)
1318 collate* __thiscall collate_wchar_vector_dtor(collate *this, unsigned int flags)
1320 TRACE("(%p %x)\n", this, flags);
1321 if(flags & 2) {
1322 /* we have an array, with the number of elements stored before the first object */
1323 INT_PTR i, *ptr = (INT_PTR *)this-1;
1325 for(i=*ptr-1; i>=0; i--)
1326 collate_wchar_dtor(this+i);
1327 operator_delete(ptr);
1328 } else {
1329 collate_wchar_dtor(this);
1330 if(flags & 1)
1331 operator_delete(this);
1334 return this;
1337 /* ??_F?$collate@_W@std@@QAEXXZ */
1338 /* ??_F?$collate@_W@std@@QEAAXXZ */
1339 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
1340 collate* __thiscall collate_wchar_ctor(collate *this)
1342 return collate_wchar_ctor_name(this, "C", 0);
1345 /* ??_F?$collate@G@std@@QAEXXZ */
1346 /* ??_F?$collate@G@std@@QEAAXXZ */
1347 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
1348 collate* __thiscall collate_short_ctor(collate *this)
1350 collate *ret = collate_wchar_ctor(this);
1351 ret->facet.vtable = &collate_short_vtable;
1352 return ret;
1355 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1356 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1357 size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale *loc)
1359 TRACE("(%p %p)\n", facet, loc);
1361 if(facet && !*facet) {
1362 *facet = operator_new(sizeof(collate));
1363 collate_wchar_ctor_name((collate*)*facet,
1364 locale_string_char_c_str(&loc->ptr->name), 0);
1367 return LC_COLLATE;
1370 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@@Z */
1371 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1372 size_t __cdecl collate_wchar__Getcat_old(const locale_facet **facet)
1374 return collate_wchar__Getcat(facet, locale_classic());
1377 static collate* collate_wchar_use_facet(const locale *loc)
1379 static collate *obj = NULL;
1381 _Lockit lock;
1382 const locale_facet *fac;
1384 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1385 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_wchar_id));
1386 if(fac) {
1387 _Lockit_dtor(&lock);
1388 return (collate*)fac;
1391 if(obj) {
1392 _Lockit_dtor(&lock);
1393 return obj;
1396 collate_wchar__Getcat(&fac, loc);
1397 obj = (collate*)fac;
1398 call_locale_facet__Incref(&obj->facet);
1399 locale_facet_register(&obj->facet);
1400 _Lockit_dtor(&lock);
1402 return obj;
1405 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1406 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1407 size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
1409 if(facet && !*facet) {
1410 collate_wchar__Getcat(facet, loc);
1411 (*(locale_facet**)facet)->vtable = &collate_short_vtable;
1414 return LC_COLLATE;
1417 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@@Z */
1418 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1419 size_t __cdecl collate_short__Getcat_old(const locale_facet **facet)
1421 return collate_short__Getcat(facet, locale_classic());
1424 static collate* collate_short_use_facet(const locale *loc)
1426 static collate *obj = NULL;
1428 _Lockit lock;
1429 const locale_facet *fac;
1431 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1432 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_short_id));
1433 if(fac) {
1434 _Lockit_dtor(&lock);
1435 return (collate*)fac;
1438 if(obj) {
1439 _Lockit_dtor(&lock);
1440 return obj;
1443 collate_short__Getcat(&fac, loc);
1444 obj = (collate*)fac;
1445 call_locale_facet__Incref(&obj->facet);
1446 locale_facet_register(&obj->facet);
1447 _Lockit_dtor(&lock);
1449 return obj;
1452 /* _Wcscoll */
1453 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
1454 const wchar_t *last2, const _Collvec *coll)
1456 TRACE("(%s %s)\n", debugstr_wn(first1, last1-first1), debugstr_wn(first2, last2-first2));
1458 #if _MSVCP_VER < 110
1459 return CompareStringW(coll ? coll->handle : ___lc_handle_func()[LC_COLLATE],
1460 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1461 #else
1462 return CompareStringEx(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE],
1463 0, first1, last1-first1, first2, last2-first2, NULL, NULL, 0)-CSTR_EQUAL;
1464 #endif
1467 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
1468 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
1469 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
1470 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
1471 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
1472 #if _MSVCP_VER <= 100
1473 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1474 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1475 (this, first1, last1, first2, last2))
1476 #else
1477 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1478 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1479 (this, first1, last1, first2, last2))
1480 #endif
1481 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
1482 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1484 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1485 return _Wcscoll(first1, last1, first2, last2, &this->coll);
1488 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
1489 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
1490 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
1491 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
1492 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
1493 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
1494 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1496 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1497 return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
1500 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
1501 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
1502 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
1503 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
1504 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
1505 #if _MSVCP_VER <= 100
1506 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1507 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1508 #else
1509 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1510 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1511 #endif
1512 LONG __thiscall collate_wchar_do_hash(const collate *this,
1513 const wchar_t *first, const wchar_t *last)
1515 ULONG ret = 0;
1517 TRACE("(%p %p %p)\n", this, first, last);
1519 for(; first<last; first++)
1520 ret = (ret<<8 | ret>>24) + *first;
1521 return ret;
1524 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
1525 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
1526 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
1527 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
1528 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
1529 LONG __thiscall collate_wchar_hash(const collate *this,
1530 const wchar_t *first, const wchar_t *last)
1532 TRACE("(%p %p %p)\n", this, first, last);
1533 return call_collate_wchar_do_hash(this, first, last);
1536 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1537 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1538 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1539 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1540 DEFINE_THISCALL_WRAPPER(collate_wchar_do_transform, 16)
1541 basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
1542 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1544 FIXME("(%p %p %p) stub\n", this, first, last);
1545 return ret;
1548 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1549 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1550 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1551 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1552 DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
1553 basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
1554 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1556 FIXME("(%p %p %p) stub\n", this, first, last);
1557 return ret;
1560 /* ??_7ctype_base@std@@6B@ */
1561 extern const vtable_ptr ctype_base_vtable;
1563 /* ??0ctype_base@std@@QAE@I@Z */
1564 /* ??0ctype_base@std@@QEAA@_K@Z */
1565 DEFINE_THISCALL_WRAPPER(ctype_base_ctor_refs, 8)
1566 ctype_base* __thiscall ctype_base_ctor_refs(ctype_base *this, size_t refs)
1568 TRACE("(%p %Iu)\n", this, refs);
1569 locale_facet_ctor_refs(&this->facet, refs);
1570 this->facet.vtable = &ctype_base_vtable;
1571 return this;
1574 /* ??_Fctype_base@std@@QAEXXZ */
1575 /* ??_Fctype_base@std@@QEAAXXZ */
1576 DEFINE_THISCALL_WRAPPER(ctype_base_ctor, 4)
1577 ctype_base* __thiscall ctype_base_ctor(ctype_base *this)
1579 TRACE("(%p)\n", this);
1580 locale_facet_ctor_refs(&this->facet, 0);
1581 this->facet.vtable = &ctype_base_vtable;
1582 return this;
1585 /* ??1ctype_base@std@@UAE@XZ */
1586 /* ??1ctype_base@std@@UEAA@XZ */
1587 DEFINE_THISCALL_WRAPPER(ctype_base_dtor, 4)
1588 void __thiscall ctype_base_dtor(ctype_base *this)
1590 TRACE("(%p)\n", this);
1593 DEFINE_THISCALL_WRAPPER(ctype_base_vector_dtor, 8)
1594 ctype_base* __thiscall ctype_base_vector_dtor(ctype_base *this, unsigned int flags)
1596 TRACE("(%p %x)\n", this, flags);
1597 if(flags & 2) {
1598 /* we have an array, with the number of elements stored before the first object */
1599 INT_PTR i, *ptr = (INT_PTR *)this-1;
1601 for(i=*ptr-1; i>=0; i--)
1602 ctype_base_dtor(this+i);
1603 operator_delete(ptr);
1604 } else {
1605 ctype_base_dtor(this);
1606 if(flags & 1)
1607 operator_delete(this);
1610 return this;
1613 /* ?_Xran@ctype_base@std@@KAXXZ */
1614 void __cdecl ctype_base__Xran(void)
1616 _Xout_of_range("out of range in ctype<T>");
1619 /* ?id@?$ctype@D@std@@2V0locale@2@A */
1620 locale_id ctype_char_id = {0};
1621 /* ?table_size@?$ctype@D@std@@2IB */
1622 /* ?table_size@?$ctype@D@std@@2_KB */
1623 size_t ctype_char_table_size = 256;
1625 /* ??_7?$ctype@D@std@@6B@ */
1626 extern const vtable_ptr ctype_char_vtable;
1628 /* ?_Id_func@?$ctype@D@std@@SAAAVid@locale@2@XZ */
1629 /* ?_Id_func@?$ctype@D@std@@SAAEAVid@locale@2@XZ */
1630 locale_id* __cdecl ctype_char__Id_func(void)
1632 TRACE("()\n");
1633 return &ctype_char_id;
1636 /* ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z */
1637 /* ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z */
1638 DEFINE_THISCALL_WRAPPER(ctype_char__Init, 8)
1639 void __thiscall ctype_char__Init(ctype_char *this, const _Locinfo *locinfo)
1641 TRACE("(%p %p)\n", this, locinfo);
1642 _Locinfo__Getctype(locinfo, &this->ctype);
1645 /* ?_Tidy@?$ctype@D@std@@IAEXXZ */
1646 /* ?_Tidy@?$ctype@D@std@@IEAAXXZ */
1647 DEFINE_THISCALL_WRAPPER(ctype_char__Tidy, 4)
1648 void __thiscall ctype_char__Tidy(ctype_char *this)
1650 TRACE("(%p)\n", this);
1652 if(this->ctype.delfl)
1653 free((short*)this->ctype.table);
1654 #if _MSVCP_VER >= 110
1655 free(this->ctype.name);
1656 #endif
1659 /* ?classic_table@?$ctype@D@std@@KAPBFXZ */
1660 /* ?classic_table@?$ctype@D@std@@KAPEBFXZ */
1661 const short* __cdecl ctype_char_classic_table(void)
1663 ctype_char *ctype;
1665 TRACE("()\n");
1666 ctype = ctype_char_use_facet( locale_classic() );
1667 return ctype->ctype.table;
1670 /* ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z */
1671 /* ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1672 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_locinfo, 12)
1673 ctype_char* __thiscall ctype_char_ctor_locinfo(ctype_char *this,
1674 const _Locinfo *locinfo, size_t refs)
1676 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1677 ctype_base_ctor_refs(&this->base, refs);
1678 this->base.facet.vtable = &ctype_char_vtable;
1679 ctype_char__Init(this, locinfo);
1680 return this;
1683 /* ??0?$ctype@D@std@@QAE@PBF_NI@Z */
1684 /* ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z */
1685 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_table, 16)
1686 ctype_char* __thiscall ctype_char_ctor_table(ctype_char *this,
1687 const short *table, bool delete, size_t refs)
1689 _Locinfo locinfo;
1691 TRACE("(%p %p %d %Iu)\n", this, table, delete, refs);
1693 ctype_base_ctor_refs(&this->base, refs);
1694 this->base.facet.vtable = &ctype_char_vtable;
1696 _Locinfo_ctor(&locinfo);
1697 ctype_char__Init(this, &locinfo);
1698 _Locinfo_dtor(&locinfo);
1700 if(table) {
1701 ctype_char__Tidy(this);
1702 this->ctype.table = table;
1703 this->ctype.delfl = delete;
1705 return this;
1708 /* ??_F?$ctype@D@std@@QAEXXZ */
1709 /* ??_F?$ctype@D@std@@QEAAXXZ */
1710 DEFINE_THISCALL_WRAPPER(ctype_char_ctor, 4)
1711 ctype_char* __thiscall ctype_char_ctor(ctype_char *this)
1713 return ctype_char_ctor_table(this, NULL, FALSE, 0);
1716 /* ??1?$ctype@D@std@@UAE@XZ */
1717 /* ??1?$ctype@D@std@@UEAA@XZ */
1718 /* ??1?$ctype@D@std@@MAE@XZ */
1719 /* ??1?$ctype@D@std@@MEAA@XZ */
1720 DEFINE_THISCALL_WRAPPER(ctype_char_dtor, 4)
1721 void __thiscall ctype_char_dtor(ctype_char *this)
1723 TRACE("(%p)\n", this);
1724 ctype_char__Tidy(this);
1727 DEFINE_THISCALL_WRAPPER(ctype_char_vector_dtor, 8)
1728 ctype_char* __thiscall ctype_char_vector_dtor(ctype_char *this, unsigned int flags)
1730 TRACE("(%p %x)\n", this, flags);
1731 if(flags & 2) {
1732 /* we have an array, with the number of elements stored before the first object */
1733 INT_PTR i, *ptr = (INT_PTR *)this-1;
1735 for(i=*ptr-1; i>=0; i--)
1736 ctype_char_dtor(this+i);
1737 operator_delete(ptr);
1738 } else {
1739 ctype_char_dtor(this);
1740 if(flags & 1)
1741 operator_delete(this);
1744 return this;
1747 /* ?do_narrow@?$ctype@D@std@@MBEDDD@Z */
1748 /* ?do_narrow@?$ctype@D@std@@MEBADDD@Z */
1749 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow_ch, 12)
1750 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1751 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 36, \
1752 char, (const ctype_char*, char, char), (this, ch, unused))
1753 #elif _MSVCP_VER <= 100
1754 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 32, \
1755 char, (const ctype_char*, char, char), (this, ch, unused))
1756 #else
1757 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 40, \
1758 char, (const ctype_char*, char, char), (this, ch, unused))
1759 #endif
1760 char __thiscall ctype_char_do_narrow_ch(const ctype_char *this, char ch, char unused)
1762 TRACE("(%p %c %c)\n", this, ch, unused);
1763 return ch;
1766 /* ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z */
1767 /* ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z */
1768 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow, 20)
1769 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1770 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 32, \
1771 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1772 (this, first, last, unused, dest))
1773 #elif _MSVCP_VER <= 100
1774 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 28, \
1775 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1776 (this, first, last, unused, dest))
1777 #else
1778 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 36, \
1779 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1780 (this, first, last, unused, dest))
1781 #endif
1782 const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
1783 const char *first, const char *last, char unused, char *dest)
1785 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1786 memcpy(dest, first, last-first);
1787 return last;
1790 /* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
1791 /* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
1792 DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
1793 #define call_ctype_char__Do_narrow_s(this, first, last, unused, dest, size) CALL_VTBL_FUNC(this, 40, \
1794 const char*, (const ctype_char*, const char*, const char*, char, char*, size_t), \
1795 (this, first, last, unused, dest, size))
1796 const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
1797 const char *last, char unused, char *dest, size_t size)
1799 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1800 memcpy_s(dest, size, first, last-first);
1801 return last;
1804 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
1805 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
1806 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
1807 char __thiscall ctype_char_narrow_ch(const ctype_char *this, char ch, char dflt)
1809 TRACE("(%p %c %c)\n", this, ch, dflt);
1810 return call_ctype_char_do_narrow_ch(this, ch, dflt);
1813 /* ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z */
1814 /* ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z */
1815 DEFINE_THISCALL_WRAPPER(ctype_char_narrow, 20)
1816 const char* __thiscall ctype_char_narrow(const ctype_char *this,
1817 const char *first, const char *last, char dflt, char *dest)
1819 TRACE("(%p %p %p %c %p)\n", this, first, last, dflt, dest);
1820 return call_ctype_char_do_narrow(this, first, last, dflt, dest);
1823 /* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
1824 /* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
1825 DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
1826 const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
1827 const char *last, char dflt, char *dest, size_t size)
1829 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1830 return call_ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
1833 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
1834 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
1835 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
1836 #if _MSVCP_VER <= 100
1837 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
1838 char, (const ctype_char*, char), (this, ch))
1839 #else
1840 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
1841 char, (const ctype_char*, char), (this, ch))
1842 #endif
1843 char __thiscall ctype_char_do_widen_ch(const ctype_char *this, char ch)
1845 TRACE("(%p %c)\n", this, ch);
1846 return ch;
1849 /* ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z */
1850 /* ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z */
1851 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen, 16)
1852 #if _MSVCP_VER <= 100
1853 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 20, \
1854 const char*, (const ctype_char*, const char*, const char*, char*), \
1855 (this, first, last, dest))
1856 #else
1857 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 28, \
1858 const char*, (const ctype_char*, const char*, const char*, char*), \
1859 (this, first, last, dest))
1860 #endif
1861 const char* __thiscall ctype_char_do_widen(const ctype_char *this,
1862 const char *first, const char *last, char *dest)
1864 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1865 memcpy(dest, first, last-first);
1866 return last;
1869 /* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
1870 /* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
1871 DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
1872 #define call_ctype_char__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 28, \
1873 const char*, (const ctype_char*, const char*, const char*, char*, size_t), \
1874 (this, first, last, dest, size))
1875 const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
1876 const char *first, const char *last, char *dest, size_t size)
1878 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1879 memcpy_s(dest, size, first, last-first);
1880 return last;
1883 /* ?widen@?$ctype@D@std@@QBEDD@Z */
1884 /* ?widen@?$ctype@D@std@@QEBADD@Z */
1885 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
1886 char __thiscall ctype_char_widen_ch(const ctype_char *this, char ch)
1888 TRACE("(%p %c)\n", this, ch);
1889 return call_ctype_char_do_widen_ch(this, ch);
1892 /* ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z */
1893 /* ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z */
1894 DEFINE_THISCALL_WRAPPER(ctype_char_widen, 16)
1895 const char* __thiscall ctype_char_widen(const ctype_char *this,
1896 const char *first, const char *last, char *dest)
1898 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1899 return call_ctype_char_do_widen(this, first, last, dest);
1902 /* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
1903 /* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
1904 DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
1905 const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
1906 const char *first, const char *last, char *dest, size_t size)
1908 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1909 return call_ctype_char__Do_widen_s(this, first, last, dest, size);
1912 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1913 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1914 size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
1916 TRACE("(%p %p)\n", facet, loc);
1918 if(facet && !*facet) {
1919 _Locinfo locinfo;
1921 *facet = operator_new(sizeof(ctype_char));
1922 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
1923 ctype_char_ctor_locinfo((ctype_char*)*facet, &locinfo, 0);
1924 _Locinfo_dtor(&locinfo);
1927 return LC_CTYPE;
1930 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@@Z */
1931 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1932 size_t __cdecl ctype_char__Getcat_old(const locale_facet **facet)
1934 return ctype_char__Getcat(facet, locale_classic());
1937 ctype_char* ctype_char_use_facet(const locale *loc)
1939 static ctype_char *obj = NULL;
1941 _Lockit lock;
1942 const locale_facet *fac;
1944 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1945 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_char_id));
1946 if(fac) {
1947 _Lockit_dtor(&lock);
1948 return (ctype_char*)fac;
1951 if(obj) {
1952 _Lockit_dtor(&lock);
1953 return obj;
1956 ctype_char__Getcat(&fac, loc);
1957 obj = (ctype_char*)fac;
1958 call_locale_facet__Incref(&obj->base.facet);
1959 locale_facet_register(&obj->base.facet);
1960 _Lockit_dtor(&lock);
1962 return obj;
1965 /* _Tolower */
1966 int __cdecl _Tolower(int ch, const _Ctypevec *ctype)
1968 unsigned int cp;
1970 TRACE("%d %p\n", ch, ctype);
1972 if(ctype)
1973 cp = ctype->page;
1974 else
1975 cp = ___lc_codepage_func();
1977 /* Don't convert to unicode in case of C locale */
1978 if(!cp) {
1979 if(ch>='A' && ch<='Z')
1980 ch = ch-'A'+'a';
1981 return ch;
1982 } else {
1983 WCHAR wide, lower;
1984 char str[2];
1985 int size;
1987 if(ch > 255) {
1988 str[0] = (ch>>8) & 255;
1989 str[1] = ch & 255;
1990 size = 2;
1991 } else {
1992 str[0] = ch & 255;
1993 size = 1;
1996 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
1997 return ch;
1999 lower = towlower(wide);
2000 if(lower == wide)
2001 return ch;
2003 WideCharToMultiByte(cp, 0, &lower, 1, str, 2, NULL, NULL);
2005 return str[0] + (str[1]<<8);
2009 /* ?do_tolower@?$ctype@D@std@@MBEDD@Z */
2010 /* ?do_tolower@?$ctype@D@std@@MEBADD@Z */
2011 #if _MSVCP_VER <= 100
2012 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 8, \
2013 char, (const ctype_char*, char), (this, ch))
2014 #else
2015 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2016 char, (const ctype_char*, char), (this, ch))
2017 #endif
2018 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower_ch, 8)
2019 char __thiscall ctype_char_do_tolower_ch(const ctype_char *this, char ch)
2021 TRACE("(%p %c)\n", this, ch);
2022 return _Tolower(ch, &this->ctype);
2025 /* ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z */
2026 /* ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2027 #if _MSVCP_VER <= 100
2028 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 4, \
2029 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2030 #else
2031 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 12, \
2032 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2033 #endif
2034 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower, 12)
2035 const char* __thiscall ctype_char_do_tolower(const ctype_char *this, char *first, const char *last)
2037 TRACE("(%p %p %p)\n", this, first, last);
2038 for(; first<last; first++)
2039 *first = _Tolower(*first, &this->ctype);
2040 return last;
2043 /* ?tolower@?$ctype@D@std@@QBEDD@Z */
2044 /* ?tolower@?$ctype@D@std@@QEBADD@Z */
2045 DEFINE_THISCALL_WRAPPER(ctype_char_tolower_ch, 8)
2046 char __thiscall ctype_char_tolower_ch(const ctype_char *this, char ch)
2048 TRACE("(%p %c)\n", this, ch);
2049 return call_ctype_char_do_tolower_ch(this, ch);
2052 /* ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z */
2053 /* ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2054 DEFINE_THISCALL_WRAPPER(ctype_char_tolower, 12)
2055 const char* __thiscall ctype_char_tolower(const ctype_char *this, char *first, const char *last)
2057 TRACE("(%p %p %p)\n", this, first, last);
2058 return call_ctype_char_do_tolower(this, first, last);
2061 /* _Toupper */
2062 int __cdecl _Toupper(int ch, const _Ctypevec *ctype)
2064 unsigned int cp;
2066 TRACE("%d %p\n", ch, ctype);
2068 if(ctype)
2069 cp = ctype->page;
2070 else
2071 cp = ___lc_codepage_func();
2073 /* Don't convert to unicode in case of C locale */
2074 if(!cp) {
2075 if(ch>='a' && ch<='z')
2076 ch = ch-'a'+'A';
2077 return ch;
2078 } else {
2079 WCHAR wide, upper;
2080 char str[2];
2081 int size;
2083 if(ch > 255) {
2084 str[0] = (ch>>8) & 255;
2085 str[1] = ch & 255;
2086 size = 2;
2087 } else {
2088 str[0] = ch & 255;
2089 size = 1;
2092 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
2093 return ch;
2095 upper = towupper(wide);
2096 if(upper == wide)
2097 return ch;
2099 WideCharToMultiByte(cp, 0, &upper, 1, str, 2, NULL, NULL);
2101 return str[0] + (str[1]<<8);
2105 /* ?do_toupper@?$ctype@D@std@@MBEDD@Z */
2106 /* ?do_toupper@?$ctype@D@std@@MEBADD@Z */
2107 #if _MSVCP_VER <= 100
2108 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2109 char, (const ctype_char*, char), (this, ch))
2110 #else
2111 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2112 char, (const ctype_char*, char), (this, ch))
2113 #endif
2114 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper_ch, 8)
2115 char __thiscall ctype_char_do_toupper_ch(const ctype_char *this, char ch)
2117 TRACE("(%p %c)\n", this, ch);
2118 return _Toupper(ch, &this->ctype);
2121 /* ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z */
2122 /* ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2123 #if _MSVCP_VER <= 100
2124 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 12, \
2125 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2126 #else
2127 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 20, \
2128 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2129 #endif
2130 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper, 12)
2131 const char* __thiscall ctype_char_do_toupper(const ctype_char *this,
2132 char *first, const char *last)
2134 TRACE("(%p %p %p)\n", this, first, last);
2135 for(; first<last; first++)
2136 *first = _Toupper(*first, &this->ctype);
2137 return last;
2140 /* ?toupper@?$ctype@D@std@@QBEDD@Z */
2141 /* ?toupper@?$ctype@D@std@@QEBADD@Z */
2142 DEFINE_THISCALL_WRAPPER(ctype_char_toupper_ch, 8)
2143 char __thiscall ctype_char_toupper_ch(const ctype_char *this, char ch)
2145 TRACE("(%p %c)\n", this, ch);
2146 return call_ctype_char_do_toupper_ch(this, ch);
2149 /* ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z */
2150 /* ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2151 DEFINE_THISCALL_WRAPPER(ctype_char_toupper, 12)
2152 const char* __thiscall ctype_char_toupper(const ctype_char *this, char *first, const char *last)
2154 TRACE("(%p %p %p)\n", this, first, last);
2155 return call_ctype_char_do_toupper(this, first, last);
2158 /* ?is@?$ctype@D@std@@QBE_NFD@Z */
2159 /* ?is@?$ctype@D@std@@QEBA_NFD@Z */
2160 DEFINE_THISCALL_WRAPPER(ctype_char_is_ch, 12)
2161 bool __thiscall ctype_char_is_ch(const ctype_char *this, short mask, char ch)
2163 TRACE("(%p %x %c)\n", this, mask, ch);
2164 return (this->ctype.table[(unsigned char)ch] & mask) != 0;
2167 /* ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z */
2168 /* ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z */
2169 DEFINE_THISCALL_WRAPPER(ctype_char_is, 16)
2170 const char* __thiscall ctype_char_is(const ctype_char *this, const char *first, const char *last, short *dest)
2172 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2173 for(; first<last; first++)
2174 *dest++ = this->ctype.table[(unsigned char)*first];
2175 return last;
2178 /* ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z */
2179 /* ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2180 DEFINE_THISCALL_WRAPPER(ctype_char_scan_is, 16)
2181 const char* __thiscall ctype_char_scan_is(const ctype_char *this, short mask, const char *first, const char *last)
2183 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2184 for(; first<last; first++)
2185 if(!ctype_char_is_ch(this, mask, *first))
2186 break;
2187 return first;
2190 /* ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z */
2191 /* ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2192 DEFINE_THISCALL_WRAPPER(ctype_char_scan_not, 16)
2193 const char* __thiscall ctype_char_scan_not(const ctype_char *this, short mask, const char *first, const char *last)
2195 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2196 for(; first<last; first++)
2197 if(ctype_char_is_ch(this, mask, *first))
2198 break;
2199 return first;
2202 /* ?table@?$ctype@D@std@@IBEPBFXZ */
2203 /* ?table@?$ctype@D@std@@IEBAPEBFXZ */
2204 DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
2205 const short* __thiscall ctype_char_table(const ctype_char *this)
2207 TRACE("(%p)\n", this);
2208 return this->ctype.table;
2211 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
2212 locale_id ctype_wchar_id = {0};
2213 /* ?id@?$ctype@G@std@@2V0locale@2@A */
2214 locale_id ctype_short_id = {0};
2216 /* ??_7?$ctype@_W@std@@6B@ */
2217 extern const vtable_ptr ctype_wchar_vtable;
2218 /* ??_7?$ctype@G@std@@6B@ */
2219 extern const vtable_ptr ctype_short_vtable;
2221 /* ?_Id_func@?$ctype@_W@std@@SAAAVid@locale@2@XZ */
2222 /* ?_Id_func@?$ctype@_W@std@@SAAEAVid@locale@2@XZ */
2223 locale_id* __cdecl ctype_wchar__Id_func(void)
2225 TRACE("()\n");
2226 return &ctype_wchar_id;
2229 /* ?_Id_func@?$ctype@G@std@@SAAAVid@locale@2@XZ */
2230 /* ?_Id_func@?$ctype@G@std@@SAAEAVid@locale@2@XZ */
2231 locale_id* __cdecl ctype_short__Id_func(void)
2233 TRACE("()\n");
2234 return &ctype_short_id;
2237 /* ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z */
2238 /* ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
2239 /* ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z */
2240 /* ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z */
2241 DEFINE_THISCALL_WRAPPER(ctype_wchar__Init, 8)
2242 void __thiscall ctype_wchar__Init(ctype_wchar *this, const _Locinfo *locinfo)
2244 TRACE("(%p %p)\n", this, locinfo);
2245 _Locinfo__Getctype(locinfo, &this->ctype);
2246 _Locinfo__Getcvt(locinfo, &this->cvt);
2249 /* ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z */
2250 /* ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2251 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_locinfo, 12)
2252 ctype_wchar* __thiscall ctype_wchar_ctor_locinfo(ctype_wchar *this,
2253 const _Locinfo *locinfo, size_t refs)
2255 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
2256 ctype_base_ctor_refs(&this->base, refs);
2257 this->base.facet.vtable = &ctype_wchar_vtable;
2258 ctype_wchar__Init(this, locinfo);
2259 return this;
2262 /* ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z */
2263 /* ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2264 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_locinfo, 12)
2265 ctype_wchar* __thiscall ctype_short_ctor_locinfo(ctype_wchar *this,
2266 const _Locinfo *locinfo, size_t refs)
2268 ctype_wchar *ret = ctype_wchar_ctor_locinfo(this, locinfo, refs);
2269 this->base.facet.vtable = &ctype_short_vtable;
2270 return ret;
2273 /* ??0?$ctype@_W@std@@QAE@I@Z */
2274 /* ??0?$ctype@_W@std@@QEAA@_K@Z */
2275 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_refs, 8)
2276 ctype_wchar* __thiscall ctype_wchar_ctor_refs(ctype_wchar *this, size_t refs)
2278 _Locinfo locinfo;
2280 TRACE("(%p %Iu)\n", this, refs);
2282 ctype_base_ctor_refs(&this->base, refs);
2283 this->base.facet.vtable = &ctype_wchar_vtable;
2285 _Locinfo_ctor(&locinfo);
2286 ctype_wchar__Init(this, &locinfo);
2287 _Locinfo_dtor(&locinfo);
2288 return this;
2291 /* ??0?$ctype@G@std@@QAE@I@Z */
2292 /* ??0?$ctype@G@std@@QEAA@_K@Z */
2293 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_refs, 8)
2294 ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, size_t refs)
2296 ctype_wchar *ret = ctype_wchar_ctor_refs(this, refs);
2297 this->base.facet.vtable = &ctype_short_vtable;
2298 return ret;
2301 /* ??0?$ctype@G@std@@IAE@PBDI@Z */
2302 /* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
2303 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
2304 ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
2305 const char *name, size_t refs)
2307 _Locinfo locinfo;
2309 TRACE("(%p %s %Iu)\n", this, debugstr_a(name), refs);
2311 ctype_base_ctor_refs(&this->base, refs);
2312 this->base.facet.vtable = &ctype_short_vtable;
2314 _Locinfo_ctor_cstr(&locinfo, name);
2315 ctype_wchar__Init(this, &locinfo);
2316 _Locinfo_dtor(&locinfo);
2317 return this;
2320 /* ??_F?$ctype@_W@std@@QAEXXZ */
2321 /* ??_F?$ctype@_W@std@@QEAAXXZ */
2322 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
2323 ctype_wchar* __thiscall ctype_wchar_ctor(ctype_wchar *this)
2325 TRACE("(%p)\n", this);
2326 return ctype_short_ctor_refs(this, 0);
2329 /* ??_F?$ctype@G@std@@QAEXXZ */
2330 /* ??_F?$ctype@G@std@@QEAAXXZ */
2331 DEFINE_THISCALL_WRAPPER(ctype_short_ctor, 4)
2332 ctype_wchar* __thiscall ctype_short_ctor(ctype_wchar *this)
2334 ctype_wchar *ret = ctype_wchar_ctor(this);
2335 this->base.facet.vtable = &ctype_short_vtable;
2336 return ret;
2339 /* ??1?$ctype@G@std@@UAE@XZ */
2340 /* ??1?$ctype@G@std@@UEAA@XZ */
2341 /* ??1?$ctype@_W@std@@MAE@XZ */
2342 /* ??1?$ctype@_W@std@@MEAA@XZ */
2343 /* ??1?$ctype@G@std@@MAE@XZ */
2344 /* ??1?$ctype@G@std@@MEAA@XZ */
2345 DEFINE_THISCALL_WRAPPER(ctype_wchar_dtor, 4)
2346 void __thiscall ctype_wchar_dtor(ctype_wchar *this)
2348 TRACE("(%p)\n", this);
2349 if(this->ctype.delfl)
2350 free((void*)this->ctype.table);
2351 #if _MSVCP_VER >= 110
2352 free(this->ctype.name);
2353 #endif
2356 DEFINE_THISCALL_WRAPPER(ctype_wchar_vector_dtor, 8)
2357 ctype_wchar* __thiscall ctype_wchar_vector_dtor(ctype_wchar *this, unsigned int flags)
2359 TRACE("(%p %x)\n", this, flags);
2360 if(flags & 2) {
2361 /* we have an array, with the number of elements stored before the first object */
2362 INT_PTR i, *ptr = (INT_PTR *)this-1;
2364 for(i=*ptr-1; i>=0; i--)
2365 ctype_wchar_dtor(this+i);
2366 operator_delete(ptr);
2367 } else {
2368 ctype_wchar_dtor(this);
2369 if(flags & 1)
2370 operator_delete(this);
2373 return this;
2376 /* _Wcrtomb */
2377 int __cdecl _Wcrtomb(char *s, wchar_t wch, _Mbstatet *state, const _Cvtvec *cvt)
2379 int cp, size;
2380 BOOL def;
2382 TRACE("%p %d %p %p\n", s, wch, state, cvt);
2384 if(cvt)
2385 cp = cvt->page;
2386 else
2387 cp = ___lc_codepage_func();
2389 if(!cp) {
2390 if(wch > 255) {
2391 *_errno() = EILSEQ;
2392 return -1;
2395 *s = wch & 255;
2396 return 1;
2399 size = WideCharToMultiByte(cp, 0, &wch, 1, s, MB_LEN_MAX, NULL, &def);
2400 if(!size || def) {
2401 *_errno() = EILSEQ;
2402 return -1;
2405 return size;
2408 /* ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z */
2409 /* ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z */
2410 /* ?_Donarrow@?$ctype@G@std@@IBEDGD@Z */
2411 /* ?_Donarrow@?$ctype@G@std@@IEBADGD@Z */
2412 DEFINE_THISCALL_WRAPPER(ctype_wchar__Donarrow, 12)
2413 char __thiscall ctype_wchar__Donarrow(const ctype_wchar *this, wchar_t ch, char dflt)
2415 char buf[MB_LEN_MAX];
2417 TRACE("(%p %d %d)\n", this, ch, dflt);
2419 return _Wcrtomb(buf, ch, NULL, &this->cvt)==1 ? buf[0] : dflt;
2422 /* ?do_narrow@?$ctype@_W@std@@MBED_WD@Z */
2423 /* ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z */
2424 /* ?do_narrow@?$ctype@G@std@@MBEDGD@Z */
2425 /* ?do_narrow@?$ctype@G@std@@MEBADGD@Z */
2426 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow_ch, 12)
2427 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2428 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 52, \
2429 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2430 #elif _MSVCP_VER <= 100
2431 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 48, \
2432 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2433 #else
2434 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 56, \
2435 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2436 #endif
2437 char __thiscall ctype_wchar_do_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2439 return ctype_wchar__Donarrow(this, ch, dflt);
2442 /* ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z */
2443 /* ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z */
2444 /* ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z */
2445 /* ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z */
2446 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow, 20)
2447 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2448 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 48, \
2449 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2450 (this, first, last, dflt, dest))
2451 #elif _MSVCP_VER <= 100
2452 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 44, \
2453 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2454 (this, first, last, dflt, dest))
2455 #else
2456 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 52, \
2457 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2458 (this, first, last, dflt, dest))
2459 #endif
2460 const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
2461 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2463 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2464 for(; first<last; first++)
2465 *dest++ = ctype_wchar__Donarrow(this, *first, dflt);
2466 return last;
2469 /* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
2470 /* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
2471 /* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
2472 /* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
2473 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
2474 #define call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size) CALL_VTBL_FUNC(this, 56, \
2475 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*, size_t), \
2476 (this, first, last, dflt, dest, size))
2477 const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
2478 const wchar_t *first, const wchar_t *last, char dflt, char *dest, size_t size)
2480 TRACE("(%p %p %p %d %p %Iu)\n", this, first, last, dflt, dest, size);
2481 /* This function converts all multi-byte characters to dflt,
2482 * thanks to it result size is known before converting */
2483 if(last-first > size)
2484 ctype_base__Xran();
2485 return ctype_wchar_do_narrow(this, first, last, dflt, dest);
2488 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
2489 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
2490 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
2491 /* ?narrow@?$ctype@G@std@@QEBADGD@Z */
2492 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow_ch, 12)
2493 char __thiscall ctype_wchar_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2495 TRACE("(%p %d %d)\n", this, ch, dflt);
2496 return call_ctype_wchar_do_narrow_ch(this, ch, dflt);
2499 /* ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z */
2500 /* ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z */
2501 /* ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z */
2502 /* ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z */
2503 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow, 20)
2504 const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
2505 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2507 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2508 return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
2511 /* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
2512 /* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
2513 /* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
2514 /* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
2515 DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
2516 const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
2517 const wchar_t *last, char dflt, char *dest, size_t size)
2519 TRACE("(%p %p %p %d %p %Iu)\n", this, first, last, dflt, dest, size);
2520 return call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
2523 /* _Mbrtowc */
2524 int __cdecl _Mbrtowc(wchar_t *out, const char *in, size_t len, _Mbstatet *state, const _Cvtvec *cvt)
2526 int i, cp;
2527 CPINFO cp_info;
2528 BOOL is_lead;
2530 TRACE("(%p %p %Iu %p %p)\n", out, in, len, state, cvt);
2532 if(!len)
2533 return 0;
2535 if(cvt)
2536 cp = cvt->page;
2537 else
2538 cp = ___lc_codepage_func();
2540 if(!cp) {
2541 if(out)
2542 *out = (unsigned char)*in;
2544 memset(state, 0, sizeof(*state));
2545 return *in ? 1 : 0;
2548 if(MBSTATET_TO_INT(state)) {
2549 ((char*)&MBSTATET_TO_INT(state))[1] = *in;
2551 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, (char*)&MBSTATET_TO_INT(state), 2, out, out ? 1 : 0)) {
2552 memset(state, 0, sizeof(*state));
2553 *_errno() = EILSEQ;
2554 return -1;
2557 memset(state, 0, sizeof(*state));
2558 return 2;
2561 GetCPInfo(cp, &cp_info);
2562 is_lead = FALSE;
2563 for(i=0; i<MAX_LEADBYTES; i+=2) {
2564 if(!cp_info.LeadByte[i+1])
2565 break;
2566 if((unsigned char)*in>=cp_info.LeadByte[i] && (unsigned char)*in<=cp_info.LeadByte[i+1]) {
2567 is_lead = TRUE;
2568 break;
2572 if(is_lead) {
2573 if(len == 1) {
2574 MBSTATET_TO_INT(state) = (unsigned char)*in;
2575 return -2;
2578 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 2, out, out ? 1 : 0)) {
2579 *_errno() = EILSEQ;
2580 return -1;
2582 return 2;
2585 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 1, out, out ? 1 : 0)) {
2586 *_errno() = EILSEQ;
2587 return -1;
2589 return 1;
2592 static inline wchar_t mb_to_wc(char ch, const _Cvtvec *cvt)
2594 _Mbstatet state;
2595 wchar_t ret;
2597 memset(&state, 0, sizeof(state));
2598 return _Mbrtowc(&ret, &ch, 1, &state, cvt) == 1 ? ret : 0;
2601 /* ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z */
2602 /* ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z */
2603 /* ?_Dowiden@?$ctype@G@std@@IBEGD@Z */
2604 /* ?_Dowiden@?$ctype@G@std@@IEBAGD@Z */
2605 DEFINE_THISCALL_WRAPPER(ctype_wchar__Dowiden, 8)
2606 wchar_t __thiscall ctype_wchar__Dowiden(const ctype_wchar *this, char ch)
2608 _Mbstatet state;
2609 wchar_t ret;
2611 TRACE("(%p %d)\n", this, ch);
2613 memset(&state, 0, sizeof(state));
2614 return _Mbrtowc(&ret, &ch, 1, &state, &this->cvt)<0 ? WEOF : ret;
2617 /* ?do_widen@?$ctype@_W@std@@MBE_WD@Z */
2618 /* ?do_widen@?$ctype@_W@std@@MEBA_WD@Z */
2619 /* ?do_widen@?$ctype@G@std@@MBEGD@Z */
2620 /* ?do_widen@?$ctype@G@std@@MEBAGD@Z */
2621 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen_ch, 8)
2622 #if _MSVCP_VER <= 100
2623 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2624 wchar_t, (const ctype_wchar*, char), (this, ch))
2625 #else
2626 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 48, \
2627 wchar_t, (const ctype_wchar*, char), (this, ch))
2628 #endif
2629 wchar_t __thiscall ctype_wchar_do_widen_ch(const ctype_wchar *this, char ch)
2631 return ctype_wchar__Dowiden(this, ch);
2634 /* ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z */
2635 /* ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z */
2636 /* ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z */
2637 /* ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z */
2638 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen, 16)
2639 #if _MSVCP_VER <= 100
2640 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 36, \
2641 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2642 (this, first, last, dest))
2643 #else
2644 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 44, \
2645 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2646 (this, first, last, dest))
2647 #endif
2648 const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
2649 const char *first, const char *last, wchar_t *dest)
2651 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2652 for(; first<last; first++)
2653 *dest++ = ctype_wchar__Dowiden(this, *first);
2654 return last;
2657 /* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
2658 /* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
2659 /* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
2660 /* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
2661 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
2662 #define call_ctype_wchar__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 44, \
2663 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*, size_t), \
2664 (this, first, last, dest, size))
2665 const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
2666 const char *first, const char *last, wchar_t *dest, size_t size)
2668 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
2669 /* This function converts all multi-byte characters to WEOF,
2670 * thanks to it result size is known before converting */
2671 if(size < last-first)
2672 ctype_base__Xran();
2673 return ctype_wchar_do_widen(this, first, last, dest);
2676 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
2677 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
2678 /* ?widen@?$ctype@G@std@@QBEGD@Z */
2679 /* ?widen@?$ctype@G@std@@QEBAGD@Z */
2680 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen_ch, 8)
2681 wchar_t __thiscall ctype_wchar_widen_ch(const ctype_wchar *this, char ch)
2683 TRACE("(%p %d)\n", this, ch);
2684 return call_ctype_wchar_do_widen_ch(this, ch);
2687 /* ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z */
2688 /* ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z */
2689 /* ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z */
2690 /* ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z */
2691 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen, 16)
2692 const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
2693 const char *first, const char *last, wchar_t *dest)
2695 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2696 return call_ctype_wchar_do_widen(this, first, last, dest);
2699 /* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
2700 /* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
2701 /* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
2702 /* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
2703 DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
2704 const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
2705 const char *first, const char *last, wchar_t *dest, size_t size)
2707 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
2708 return call_ctype_wchar__Do_widen_s(this, first, last, dest, size);
2711 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2712 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2713 size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
2715 TRACE("(%p %p)\n", facet, loc);
2717 if(facet && !*facet) {
2718 _Locinfo locinfo;
2720 *facet = operator_new(sizeof(ctype_wchar));
2721 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
2722 ctype_wchar_ctor_locinfo((ctype_wchar*)*facet, &locinfo, 0);
2723 _Locinfo_dtor(&locinfo);
2726 return LC_CTYPE;
2729 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@@Z */
2730 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2731 size_t __cdecl ctype_wchar__Getcat_old(const locale_facet **facet)
2733 return ctype_wchar__Getcat(facet, locale_classic());
2736 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2737 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2738 size_t __cdecl ctype_short__Getcat(const locale_facet **facet, const locale *loc)
2740 if(facet && !*facet) {
2741 ctype_wchar__Getcat(facet, loc);
2742 (*(locale_facet**)facet)->vtable = &ctype_short_vtable;
2745 return LC_CTYPE;
2748 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@@Z */
2749 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2750 size_t __cdecl ctype_short__Getcat_old(const locale_facet **facet)
2752 return ctype_short__Getcat(facet, locale_classic());
2755 /* _Towlower */
2756 wchar_t __cdecl _Towlower(wchar_t ch, const _Ctypevec *ctype)
2758 TRACE("(%d %p)\n", ch, ctype);
2759 return towlower(ch);
2762 ctype_wchar* ctype_wchar_use_facet(const locale *loc)
2764 static ctype_wchar *obj = NULL;
2766 _Lockit lock;
2767 const locale_facet *fac;
2769 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2770 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_wchar_id));
2771 if(fac) {
2772 _Lockit_dtor(&lock);
2773 return (ctype_wchar*)fac;
2776 if(obj) {
2777 _Lockit_dtor(&lock);
2778 return obj;
2781 ctype_wchar__Getcat(&fac, loc);
2782 obj = (ctype_wchar*)fac;
2783 call_locale_facet__Incref(&obj->base.facet);
2784 locale_facet_register(&obj->base.facet);
2785 _Lockit_dtor(&lock);
2787 return obj;
2790 ctype_wchar* ctype_short_use_facet(const locale *loc)
2792 static ctype_wchar *obj = NULL;
2794 _Lockit lock;
2795 const locale_facet *fac;
2797 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2798 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_short_id));
2799 if(fac) {
2800 _Lockit_dtor(&lock);
2801 return (ctype_wchar*)fac;
2804 if(obj) {
2805 _Lockit_dtor(&lock);
2806 return obj;
2809 ctype_short__Getcat(&fac, loc);
2810 obj = (ctype_wchar*)fac;
2811 call_locale_facet__Incref(&obj->base.facet);
2812 locale_facet_register(&obj->base.facet);
2813 _Lockit_dtor(&lock);
2815 return obj;
2818 /* ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z */
2819 /* ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z */
2820 /* ?do_tolower@?$ctype@G@std@@MBEGG@Z */
2821 /* ?do_tolower@?$ctype@G@std@@MEBAGG@Z */
2822 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower_ch, 8)
2823 #if _MSVCP_VER <= 100
2824 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2825 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2826 #else
2827 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2828 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2829 #endif
2830 wchar_t __thiscall ctype_wchar_do_tolower_ch(const ctype_wchar *this, wchar_t ch)
2832 return _Towlower(ch, &this->ctype);
2835 /* ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2836 /* ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2837 /* ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2838 /* ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2839 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower, 12)
2840 #if _MSVCP_VER <= 100
2841 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 20, \
2842 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2843 (this, first, last))
2844 #else
2845 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 28, \
2846 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2847 (this, first, last))
2848 #endif
2849 const wchar_t* __thiscall ctype_wchar_do_tolower(const ctype_wchar *this,
2850 wchar_t *first, const wchar_t *last)
2852 TRACE("(%p %p %p)\n", this, first, last);
2853 for(; first<last; first++)
2854 *first = _Towlower(*first, &this->ctype);
2855 return last;
2858 /* ?tolower@?$ctype@_W@std@@QBE_W_W@Z */
2859 /* ?tolower@?$ctype@_W@std@@QEBA_W_W@Z */
2860 /* ?tolower@?$ctype@G@std@@QBEGG@Z */
2861 /* ?tolower@?$ctype@G@std@@QEBAGG@Z */
2862 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower_ch, 8)
2863 wchar_t __thiscall ctype_wchar_tolower_ch(const ctype_wchar *this, wchar_t ch)
2865 TRACE("(%p %d)\n", this, ch);
2866 return call_ctype_wchar_do_tolower_ch(this, ch);
2869 /* ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2870 /* ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2871 /* ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2872 /* ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2873 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower, 12)
2874 const wchar_t* __thiscall ctype_wchar_tolower(const ctype_wchar *this,
2875 wchar_t *first, const wchar_t *last)
2877 TRACE("(%p %p %p)\n", this, first, last);
2878 return call_ctype_wchar_do_tolower(this, first, last);
2881 /* _Towupper */
2882 wchar_t __cdecl _Towupper(wchar_t ch, const _Ctypevec *ctype)
2884 TRACE("(%d %p)\n", ch, ctype);
2885 return towupper(ch);
2888 /* ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z */
2889 /* ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z */
2890 /* ?do_toupper@?$ctype@G@std@@MBEGG@Z */
2891 /* ?do_toupper@?$ctype@G@std@@MEBAGG@Z */
2892 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper_ch, 8)
2893 #if _MSVCP_VER <= 100
2894 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2895 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2896 #else
2897 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2898 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2899 #endif
2900 wchar_t __thiscall ctype_wchar_do_toupper_ch(const ctype_wchar *this, wchar_t ch)
2902 return _Towupper(ch, &this->ctype);
2905 /* ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2906 /* ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2907 /* ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2908 /* ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2909 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper, 12)
2910 #if _MSVCP_VER <= 100
2911 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 28, \
2912 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2913 (this, first, last))
2914 #else
2915 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 36, \
2916 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2917 (this, first, last))
2918 #endif
2919 const wchar_t* __thiscall ctype_wchar_do_toupper(const ctype_wchar *this,
2920 wchar_t *first, const wchar_t *last)
2922 TRACE("(%p %p %p)\n", this, first, last);
2923 for(; first<last; first++)
2924 *first = _Towupper(*first, &this->ctype);
2925 return last;
2928 /* ?toupper@?$ctype@_W@std@@QBE_W_W@Z */
2929 /* ?toupper@?$ctype@_W@std@@QEBA_W_W@Z */
2930 /* ?toupper@?$ctype@G@std@@QBEGG@Z */
2931 /* ?toupper@?$ctype@G@std@@QEBAGG@Z */
2932 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper_ch, 8)
2933 wchar_t __thiscall ctype_wchar_toupper_ch(const ctype_wchar *this, wchar_t ch)
2935 TRACE("(%p %d)\n", this, ch);
2936 return call_ctype_wchar_do_toupper_ch(this, ch);
2939 /* ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2940 /* ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2941 /* ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2942 /* ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2943 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper, 12)
2944 const wchar_t* __thiscall ctype_wchar_toupper(const ctype_wchar *this,
2945 wchar_t *first, const wchar_t *last)
2947 TRACE("(%p %p %p)\n", this, first, last);
2948 return call_ctype_wchar_do_toupper(this, first, last);
2951 /* _Getwctypes */
2952 const wchar_t* __cdecl _Getwctypes(const wchar_t *first, const wchar_t *last,
2953 short *mask, const _Ctypevec *ctype)
2955 TRACE("(%p %p %p %p)\n", first, last, mask, ctype);
2956 GetStringTypeW(CT_CTYPE1, first, last-first, (WORD*)mask);
2957 return last;
2960 /* _Getwctype */
2961 short __cdecl _Getwctype(wchar_t ch, const _Ctypevec *ctype)
2963 short mask = 0;
2964 _Getwctypes(&ch, &ch+1, &mask, ctype);
2965 return mask;
2968 /* ?do_is@?$ctype@_W@std@@MBE_NF_W@Z */
2969 /* ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z */
2970 /* ?do_is@?$ctype@G@std@@MBE_NFG@Z */
2971 /* ?do_is@?$ctype@G@std@@MEBA_NFG@Z */
2972 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is_ch, 12)
2973 #if _MSVCP_VER <= 100
2974 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 8, \
2975 bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2976 #else
2977 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 16, \
2978 bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2979 #endif
2980 bool __thiscall ctype_wchar_do_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2982 TRACE("(%p %x %d)\n", this, mask, ch);
2983 return (_Getwctype(ch, &this->ctype) & mask) != 0;
2986 /* ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z */
2987 /* ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z */
2988 /* ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z */
2989 /* ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z */
2990 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is, 16)
2991 #if _MSVCP_VER <= 100
2992 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 4, \
2993 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
2994 (this, first, last, dest))
2995 #else
2996 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 12, \
2997 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
2998 (this, first, last, dest))
2999 #endif
3000 const wchar_t* __thiscall ctype_wchar_do_is(const ctype_wchar *this,
3001 const wchar_t *first, const wchar_t *last, short *dest)
3003 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3004 return _Getwctypes(first, last, dest, &this->ctype);
3007 /* ?is@?$ctype@_W@std@@QBE_NF_W@Z */
3008 /* ?is@?$ctype@_W@std@@QEBA_NF_W@Z */
3009 /* ?is@?$ctype@G@std@@QBE_NFG@Z */
3010 /* ?is@?$ctype@G@std@@QEBA_NFG@Z */
3011 DEFINE_THISCALL_WRAPPER(ctype_wchar_is_ch, 12)
3012 bool __thiscall ctype_wchar_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
3014 TRACE("(%p %x %d)\n", this, mask, ch);
3015 return call_ctype_wchar_do_is_ch(this, mask, ch);
3018 /* ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z */
3019 /* ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z */
3020 /* ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z */
3021 /* ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z */
3022 DEFINE_THISCALL_WRAPPER(ctype_wchar_is, 16)
3023 const wchar_t* __thiscall ctype_wchar_is(const ctype_wchar *this,
3024 const wchar_t *first, const wchar_t *last, short *dest)
3026 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3027 return call_ctype_wchar_do_is(this, first, last, dest);
3030 /* ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3031 /* ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3032 /* ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z */
3033 /* ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3034 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_is, 16)
3035 #if _MSVCP_VER <= 100
3036 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 12, \
3037 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3038 (this, mask, first, last))
3039 #else
3040 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 20, \
3041 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3042 (this, mask, first, last))
3043 #endif
3044 const wchar_t* __thiscall ctype_wchar_do_scan_is(const ctype_wchar *this,
3045 short mask, const wchar_t *first, const wchar_t *last)
3047 TRACE("(%p %d %p %p)\n", this, mask, first, last);
3048 for(; first<last; first++)
3049 if(!ctype_wchar_is_ch(this, mask, *first))
3050 break;
3051 return first;
3054 /* ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3055 /* ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3056 /* ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z */
3057 /* ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3058 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_is, 16)
3059 const wchar_t* __thiscall ctype_wchar_scan_is(const ctype_wchar *this,
3060 short mask, const wchar_t *first, const wchar_t *last)
3062 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3063 return call_ctype_wchar_do_scan_is(this, mask, first, last);
3066 /* ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3067 /* ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3068 /* ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z */
3069 /* ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3070 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_not, 16)
3071 #if _MSVCP_VER <= 100
3072 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 16, \
3073 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3074 (this, mask, first, last))
3075 #else
3076 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 24, \
3077 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3078 (this, mask, first, last))
3079 #endif
3080 const wchar_t* __thiscall ctype_wchar_do_scan_not(const ctype_wchar *this,
3081 short mask, const wchar_t *first, const wchar_t *last)
3083 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3084 for(; first<last; first++)
3085 if(ctype_wchar_is_ch(this, mask, *first))
3086 break;
3087 return first;
3090 /* ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3091 /* ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3092 /* ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z */
3093 /* ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3094 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_not, 16)
3095 const wchar_t* __thiscall ctype_wchar_scan_not(const ctype_wchar *this,
3096 short mask, const wchar_t *first, const wchar_t *last)
3098 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3099 return call_ctype_wchar_do_scan_not(this, mask, first, last);
3102 /* ??_7codecvt_base@std@@6B@ */
3103 extern const vtable_ptr codecvt_base_vtable;
3105 /* ??0codecvt_base@std@@QAE@I@Z */
3106 /* ??0codecvt_base@std@@QEAA@_K@Z */
3107 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor_refs, 8)
3108 codecvt_base* __thiscall codecvt_base_ctor_refs(codecvt_base *this, size_t refs)
3110 TRACE("(%p %Iu)\n", this, refs);
3111 locale_facet_ctor_refs(&this->facet, refs);
3112 this->facet.vtable = &codecvt_base_vtable;
3113 return this;
3116 /* ??_Fcodecvt_base@std@@QAEXXZ */
3117 /* ??_Fcodecvt_base@std@@QEAAXXZ */
3118 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor, 4)
3119 codecvt_base* __thiscall codecvt_base_ctor(codecvt_base *this)
3121 return codecvt_base_ctor_refs(this, 0);
3124 /* ??1codecvt_base@std@@UAE@XZ */
3125 /* ??1codecvt_base@std@@UEAA@XZ */
3126 DEFINE_THISCALL_WRAPPER(codecvt_base_dtor, 4)
3127 void __thiscall codecvt_base_dtor(codecvt_base *this)
3129 TRACE("(%p)\n", this);
3130 locale_facet_dtor(&this->facet);
3133 DEFINE_THISCALL_WRAPPER(codecvt_base_vector_dtor, 8)
3134 codecvt_base* __thiscall codecvt_base_vector_dtor(codecvt_base *this, unsigned int flags)
3136 TRACE("(%p %x)\n", this, flags);
3137 if(flags & 2) {
3138 /* we have an array, with the number of elements stored before the first object */
3139 INT_PTR i, *ptr = (INT_PTR *)this-1;
3141 for(i=*ptr-1; i>=0; i--)
3142 codecvt_base_dtor(this+i);
3143 operator_delete(ptr);
3144 } else {
3145 codecvt_base_dtor(this);
3146 if(flags & 1)
3147 operator_delete(this);
3150 return this;
3153 /* ?do_always_noconv@codecvt_base@std@@MBE_NXZ */
3154 /* ?do_always_noconv@codecvt_base@std@@MEBA_NXZ */
3155 #if _MSVCP_VER <= 100
3156 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 4, \
3157 bool, (const codecvt_base*), (this))
3158 #else
3159 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 12, \
3160 bool, (const codecvt_base*), (this))
3161 #endif
3162 DEFINE_THISCALL_WRAPPER(codecvt_base_do_always_noconv, 4)
3163 bool __thiscall codecvt_base_do_always_noconv(const codecvt_base *this)
3165 TRACE("(%p)\n", this);
3166 return _MSVCP_VER <= 100;
3169 /* ?always_noconv@codecvt_base@std@@QBE_NXZ */
3170 /* ?always_noconv@codecvt_base@std@@QEBA_NXZ */
3171 DEFINE_THISCALL_WRAPPER(codecvt_base_always_noconv, 4)
3172 bool __thiscall codecvt_base_always_noconv(const codecvt_base *this)
3174 TRACE("(%p)\n", this);
3175 return call_codecvt_base_do_always_noconv(this);
3178 /* ?do_max_length@codecvt_base@std@@MBEHXZ */
3179 /* ?do_max_length@codecvt_base@std@@MEBAHXZ */
3180 #if _MSVCP_VER <= 100
3181 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 8, \
3182 int, (const codecvt_base*), (this))
3183 #else
3184 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 16, \
3185 int, (const codecvt_base*), (this))
3186 #endif
3187 DEFINE_THISCALL_WRAPPER(codecvt_base_do_max_length, 4)
3188 int __thiscall codecvt_base_do_max_length(const codecvt_base *this)
3190 TRACE("(%p)\n", this);
3191 return 1;
3194 /* ?max_length@codecvt_base@std@@QBEHXZ */
3195 /* ?max_length@codecvt_base@std@@QEBAHXZ */
3196 DEFINE_THISCALL_WRAPPER(codecvt_base_max_length, 4)
3197 int __thiscall codecvt_base_max_length(const codecvt_base *this)
3199 TRACE("(%p)\n", this);
3200 return call_codecvt_base_do_max_length(this);
3203 /* ?do_encoding@codecvt_base@std@@MBEHXZ */
3204 /* ?do_encoding@codecvt_base@std@@MEBAHXZ */
3205 #if _MSVCP_VER <= 100
3206 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 12, \
3207 int, (const codecvt_base*), (this))
3208 #else
3209 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 20, \
3210 int, (const codecvt_base*), (this))
3211 #endif
3212 DEFINE_THISCALL_WRAPPER(codecvt_base_do_encoding, 4)
3213 int __thiscall codecvt_base_do_encoding(const codecvt_base *this)
3215 TRACE("(%p)\n", this);
3216 return 1;
3219 /* ?encoding@codecvt_base@std@@QBEHXZ */
3220 /* ?encoding@codecvt_base@std@@QEBAHXZ */
3221 DEFINE_THISCALL_WRAPPER(codecvt_base_encoding, 4)
3222 int __thiscall codecvt_base_encoding(const codecvt_base *this)
3224 TRACE("(%p)\n", this);
3225 return call_codecvt_base_do_encoding(this);
3228 /* ?id@?$codecvt@DDH@std@@2V0locale@2@A */
3229 locale_id codecvt_char_id = {0};
3231 /* ??_7?$codecvt@DDH@std@@6B@ */
3232 extern const vtable_ptr codecvt_char_vtable;
3234 /* ?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z */
3235 /* ?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3236 DEFINE_THISCALL_WRAPPER(codecvt_char__Init, 8)
3237 void __thiscall codecvt_char__Init(codecvt_char *this, const _Locinfo *locinfo)
3239 TRACE("(%p %p)\n", this, locinfo);
3242 /* ??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z */
3243 /* ??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3244 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_locinfo, 12)
3245 codecvt_char* __thiscall codecvt_char_ctor_locinfo(codecvt_char *this, const _Locinfo *locinfo, size_t refs)
3247 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3248 codecvt_base_ctor_refs(&this->base, refs);
3249 this->base.facet.vtable = &codecvt_char_vtable;
3250 return this;
3253 /* ??0?$codecvt@DDH@std@@QAE@I@Z */
3254 /* ??0?$codecvt@DDH@std@@QEAA@_K@Z */
3255 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_refs, 8)
3256 codecvt_char* __thiscall codecvt_char_ctor_refs(codecvt_char *this, size_t refs)
3258 return codecvt_char_ctor_locinfo(this, NULL, refs);
3261 /* ??_F?$codecvt@DDH@std@@QAEXXZ */
3262 /* ??_F?$codecvt@DDH@std@@QEAAXXZ */
3263 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor, 4)
3264 codecvt_char* __thiscall codecvt_char_ctor(codecvt_char *this)
3266 return codecvt_char_ctor_locinfo(this, NULL, 0);
3269 /* ??1?$codecvt@DDH@std@@UAE@XZ */
3270 /* ??1?$codecvt@DDH@std@@UEAA@XZ */
3271 /* ??1?$codecvt@DDH@std@@MAE@XZ */
3272 /* ??1?$codecvt@DDH@std@@MEAA@XZ */
3273 DEFINE_THISCALL_WRAPPER(codecvt_char_dtor, 4)
3274 void __thiscall codecvt_char_dtor(codecvt_char *this)
3276 TRACE("(%p)\n", this);
3277 codecvt_base_dtor(&this->base);
3280 DEFINE_THISCALL_WRAPPER(codecvt_char_vector_dtor, 8)
3281 codecvt_char* __thiscall codecvt_char_vector_dtor(codecvt_char *this, unsigned int flags)
3283 TRACE("(%p %x)\n", this, flags);
3284 if(flags & 2) {
3285 /* we have an array, with the number of elements stored before the first object */
3286 INT_PTR i, *ptr = (INT_PTR *)this-1;
3288 for(i=*ptr-1; i>=0; i--)
3289 codecvt_char_dtor(this+i);
3290 operator_delete(ptr);
3291 } else {
3292 codecvt_char_dtor(this);
3293 if(flags & 1)
3294 operator_delete(this);
3297 return this;
3300 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3301 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3302 size_t __cdecl codecvt_char__Getcat(const locale_facet **facet, const locale *loc)
3304 TRACE("(%p %p)\n", facet, loc);
3306 if(facet && !*facet) {
3307 *facet = operator_new(sizeof(codecvt_char));
3308 codecvt_char_ctor((codecvt_char*)*facet);
3311 return LC_CTYPE;
3314 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@@Z */
3315 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3316 size_t __cdecl codecvt_char__Getcat_old(const locale_facet **facet)
3318 return codecvt_char__Getcat(facet, locale_classic());
3321 codecvt_char* codecvt_char_use_facet(const locale *loc)
3323 static codecvt_char *obj = NULL;
3325 _Lockit lock;
3326 const locale_facet *fac;
3328 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3329 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_char_id));
3330 if(fac) {
3331 _Lockit_dtor(&lock);
3332 return (codecvt_char*)fac;
3335 if(obj) {
3336 _Lockit_dtor(&lock);
3337 return obj;
3340 codecvt_char__Getcat(&fac, loc);
3341 obj = (codecvt_char*)fac;
3342 call_locale_facet__Incref(&obj->base.facet);
3343 locale_facet_register(&obj->base.facet);
3344 _Lockit_dtor(&lock);
3346 return obj;
3349 /* ?do_always_noconv@?$codecvt@DDH@std@@MBE_NXZ */
3350 /* ?do_always_noconv@?$codecvt@DDH@std@@MEBA_NXZ */
3351 DEFINE_THISCALL_WRAPPER(codecvt_char_do_always_noconv, 4)
3352 bool __thiscall codecvt_char_do_always_noconv(const codecvt_char *this)
3354 TRACE("(%p)\n", this);
3355 return TRUE;
3358 /* ?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3359 /* ?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3360 #if _MSVCP_VER <= 100
3361 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3362 CALL_VTBL_FUNC(this, 16, int, \
3363 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3364 (this, state, from, from_end, from_next, to, to_end, to_next))
3365 #else
3366 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3367 CALL_VTBL_FUNC(this, 24, int, \
3368 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3369 (this, state, from, from_end, from_next, to, to_end, to_next))
3370 #endif
3371 DEFINE_THISCALL_WRAPPER(codecvt_char_do_in, 32)
3372 int __thiscall codecvt_char_do_in(const codecvt_char *this, _Mbstatet *state,
3373 const char *from, const char *from_end, const char **from_next,
3374 char *to, char *to_end, char **to_next)
3376 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3377 from_next, to, to_end, to_next);
3378 *from_next = from;
3379 *to_next = to;
3380 return CODECVT_noconv;
3383 /* ?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3384 /* ?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3385 DEFINE_THISCALL_WRAPPER(codecvt_char_in, 32)
3386 int __thiscall codecvt_char_in(const codecvt_char *this, _Mbstatet *state,
3387 const char *from, const char *from_end, const char **from_next,
3388 char *to, char *to_end, char **to_next)
3390 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3391 from_next, to, to_end, to_next);
3392 return call_codecvt_char_do_in(this, state, from, from_end, from_next,
3393 to, to_end, to_next);
3396 /* ?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3397 /* ?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3398 #if _MSVCP_VER <= 100
3399 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3400 CALL_VTBL_FUNC(this, 20, int, \
3401 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3402 (this, state, from, from_end, from_next, to, to_end, to_next))
3403 #else
3404 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3405 CALL_VTBL_FUNC(this, 28, int, \
3406 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3407 (this, state, from, from_end, from_next, to, to_end, to_next))
3408 #endif
3409 DEFINE_THISCALL_WRAPPER(codecvt_char_do_out, 32)
3410 int __thiscall codecvt_char_do_out(const codecvt_char *this, _Mbstatet *state,
3411 const char *from, const char *from_end, const char **from_next,
3412 char *to, char *to_end, char **to_next)
3414 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3415 from_end, from_next, to, to_end, to_next);
3416 *from_next = from;
3417 *to_next = to;
3418 return CODECVT_noconv;
3421 /* ?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3422 /* ?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3423 DEFINE_THISCALL_WRAPPER(codecvt_char_out, 32)
3424 int __thiscall codecvt_char_out(const codecvt_char *this, _Mbstatet *state,
3425 const char *from, const char *from_end, const char **from_next,
3426 char *to, char *to_end, char **to_next)
3428 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3429 from_next, to, to_end, to_next);
3430 return call_codecvt_char_do_out(this, state, from, from_end, from_next,
3431 to, to_end, to_next);
3434 /* ?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z */
3435 /* ?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3436 #if _MSVCP_VER <= 100
3437 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3438 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3439 #else
3440 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3441 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3442 #endif
3443 DEFINE_THISCALL_WRAPPER(codecvt_char_do_unshift, 20)
3444 int __thiscall codecvt_char_do_unshift(const codecvt_char *this,
3445 _Mbstatet *state, char *to, char *to_end, char **to_next)
3447 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3448 *to_next = to;
3449 return CODECVT_noconv;
3452 /* ?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z */
3453 /* ?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3454 DEFINE_THISCALL_WRAPPER(codecvt_char_unshift, 20)
3455 int __thiscall codecvt_char_unshift(const codecvt_char *this,
3456 _Mbstatet *state, char *to, char *to_end, char **to_next)
3458 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3459 return call_codecvt_char_do_unshift(this, state, to, to_end, to_next);
3462 /* ?do_length@?$codecvt@DDH@std@@MBEHABHPBD1I@Z */
3463 /* ?do_length@?$codecvt@DDH@std@@MEBAHAEBHPEBD1_K@Z */
3464 #if _MSVCP_VER <= 100
3465 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3466 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, size_t), \
3467 (this, state, from, from_end, max))
3468 #else
3469 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
3470 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, size_t), \
3471 (this, state, from, from_end, max))
3472 #endif
3473 DEFINE_THISCALL_WRAPPER(codecvt_char_do_length, 20)
3474 int __thiscall codecvt_char_do_length(const codecvt_char *this, const _Mbstatet *state,
3475 const char *from, const char *from_end, size_t max)
3477 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3478 return (from_end-from > max ? max : from_end-from);
3481 /* ?length@?$codecvt@DDH@std@@QBEHABHPBD1I@Z */
3482 /* ?length@?$codecvt@DDH@std@@QEBAHAEBHPEBD1_K@Z */
3483 DEFINE_THISCALL_WRAPPER(codecvt_char_length, 20)
3484 int __thiscall codecvt_char_length(const codecvt_char *this, const _Mbstatet *state,
3485 const char *from, const char *from_end, size_t max)
3487 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3488 return call_codecvt_char_do_length(this, state, from, from_end, max);
3491 /* ?id@?$codecvt@_WDH@std@@2V0locale@2@A */
3492 locale_id codecvt_wchar_id = {0};
3493 /* ?id@?$codecvt@GDH@std@@2V0locale@2@A */
3494 locale_id codecvt_short_id = {0};
3496 /* ??_7?$codecvt@_WDH@std@@6B@ */
3497 extern const vtable_ptr codecvt_wchar_vtable;
3498 /* ??_7?$codecvt@GDH@std@@6B@ */
3499 extern const vtable_ptr codecvt_short_vtable;
3501 /* ?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z */
3502 /* ?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3503 /* ?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z */
3504 /* ?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3505 DEFINE_THISCALL_WRAPPER(codecvt_wchar__Init, 8)
3506 void __thiscall codecvt_wchar__Init(codecvt_wchar *this, const _Locinfo *locinfo)
3508 TRACE("(%p %p)\n", this, locinfo);
3509 _Locinfo__Getcvt(locinfo, &this->cvt);
3512 /* ??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z */
3513 /* ??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3514 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_locinfo, 12)
3515 codecvt_wchar* __thiscall codecvt_wchar_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, size_t refs)
3517 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3519 codecvt_base_ctor_refs(&this->base, refs);
3520 this->base.facet.vtable = &codecvt_wchar_vtable;
3522 codecvt_wchar__Init(this, locinfo);
3523 return this;
3526 /* ??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z */
3527 /* ??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3528 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_locinfo, 12)
3529 codecvt_wchar* __thiscall codecvt_short_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, size_t refs)
3531 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3533 codecvt_wchar_ctor_locinfo(this, locinfo, refs);
3534 this->base.facet.vtable = &codecvt_short_vtable;
3535 return this;
3538 /* ??0?$codecvt@_WDH@std@@QAE@I@Z */
3539 /* ??0?$codecvt@_WDH@std@@QEAA@_K@Z */
3540 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_refs, 8)
3541 codecvt_wchar* __thiscall codecvt_wchar_ctor_refs(codecvt_wchar *this, size_t refs)
3543 _Locinfo locinfo;
3545 TRACE("(%p %Iu)\n", this, refs);
3547 _Locinfo_ctor(&locinfo);
3548 codecvt_wchar_ctor_locinfo(this, &locinfo, refs);
3549 _Locinfo_dtor(&locinfo);
3550 return this;
3553 /* ??0?$codecvt@GDH@std@@QAE@I@Z */
3554 /* ??0?$codecvt@GDH@std@@QEAA@_K@Z */
3555 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_refs, 8)
3556 codecvt_wchar* __thiscall codecvt_short_ctor_refs(codecvt_wchar *this, size_t refs)
3558 _Locinfo locinfo;
3560 TRACE("(%p %Iu)\n", this, refs);
3562 _Locinfo_ctor(&locinfo);
3563 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3564 _Locinfo_dtor(&locinfo);
3565 return this;
3568 /* ??0?$codecvt@GDH@std@@IAE@PBDI@Z */
3569 /* ??0?$codecvt@GDH@std@@IEAA@PEBD_K@Z */
3570 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_name, 12)
3571 codecvt_wchar* __thiscall codecvt_short_ctor_name(codecvt_wchar *this, const char *name, size_t refs)
3573 _Locinfo locinfo;
3575 TRACE("(%p %s %Iu)\n", this, name, refs);
3577 _Locinfo_ctor_cstr(&locinfo, name);
3578 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3579 _Locinfo_dtor(&locinfo);
3580 return this;
3583 /* ??_F?$codecvt@_WDH@std@@QAEXXZ */
3584 /* ??_F?$codecvt@_WDH@std@@QEAAXXZ */
3585 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor, 4)
3586 codecvt_wchar* __thiscall codecvt_wchar_ctor(codecvt_wchar *this)
3588 return codecvt_wchar_ctor_refs(this, 0);
3591 /* ??_F?$codecvt@GDH@std@@QAEXXZ */
3592 /* ??_F?$codecvt@GDH@std@@QEAAXXZ */
3593 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor, 4)
3594 codecvt_wchar* __thiscall codecvt_short_ctor(codecvt_wchar *this)
3596 return codecvt_short_ctor_refs(this, 0);
3599 /* ??1?$codecvt@GDH@std@@UAE@XZ */
3600 /* ??1?$codecvt@GDH@std@@UEAA@XZ */
3601 /* ??1?$codecvt@GDH@std@@MAE@XZ */
3602 /* ??1?$codecvt@GDH@std@@MEAA@XZ */
3603 /* ??1?$codecvt@_WDH@std@@MAE@XZ */
3604 /* ??1?$codecvt@_WDH@std@@MEAA@XZ */
3605 DEFINE_THISCALL_WRAPPER(codecvt_wchar_dtor, 4)
3606 void __thiscall codecvt_wchar_dtor(codecvt_wchar *this)
3608 TRACE("(%p)\n", this);
3609 codecvt_base_dtor(&this->base);
3612 DEFINE_THISCALL_WRAPPER(codecvt_wchar_vector_dtor, 8)
3613 codecvt_wchar* __thiscall codecvt_wchar_vector_dtor(codecvt_wchar *this, unsigned int flags)
3615 TRACE("(%p %x)\n", this, flags);
3616 if(flags & 2) {
3617 /* we have an array, with the number of elements stored before the first object */
3618 INT_PTR i, *ptr = (INT_PTR *)this-1;
3620 for(i=*ptr-1; i>=0; i--)
3621 codecvt_wchar_dtor(this+i);
3622 operator_delete(ptr);
3623 } else {
3624 codecvt_wchar_dtor(this);
3625 if(flags & 1)
3626 operator_delete(this);
3629 return this;
3632 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3633 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3634 size_t __cdecl codecvt_wchar__Getcat(const locale_facet **facet, const locale *loc)
3636 TRACE("(%p %p)\n", facet, loc);
3638 if(facet && !*facet) {
3639 _Locinfo locinfo;
3641 *facet = operator_new(sizeof(codecvt_wchar));
3642 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3643 codecvt_wchar_ctor_locinfo((codecvt_wchar*)*facet, &locinfo, 0);
3644 _Locinfo_dtor(&locinfo);
3647 return LC_CTYPE;
3650 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@@Z */
3651 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3652 size_t __cdecl codecvt_wchar__Getcat_old(const locale_facet **facet)
3654 return codecvt_wchar__Getcat(facet, locale_classic());
3657 codecvt_wchar* codecvt_wchar_use_facet(const locale *loc)
3659 static codecvt_wchar *obj = NULL;
3661 _Lockit lock;
3662 const locale_facet *fac;
3664 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3665 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_wchar_id));
3666 if(fac) {
3667 _Lockit_dtor(&lock);
3668 return (codecvt_wchar*)fac;
3671 if(obj) {
3672 _Lockit_dtor(&lock);
3673 return obj;
3676 codecvt_wchar__Getcat(&fac, loc);
3677 obj = (codecvt_wchar*)fac;
3678 call_locale_facet__Incref(&obj->base.facet);
3679 locale_facet_register(&obj->base.facet);
3680 _Lockit_dtor(&lock);
3682 return obj;
3685 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3686 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3687 size_t __cdecl codecvt_short__Getcat(const locale_facet **facet, const locale *loc)
3689 TRACE("(%p %p)\n", facet, loc);
3691 if(facet && !*facet) {
3692 _Locinfo locinfo;
3694 *facet = operator_new(sizeof(codecvt_wchar));
3695 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3696 codecvt_short_ctor((codecvt_wchar*)*facet);
3697 _Locinfo_dtor(&locinfo);
3700 return LC_CTYPE;
3703 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@@Z */
3704 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3705 size_t __cdecl codecvt_short__Getcat_old(const locale_facet **facet)
3707 return codecvt_short__Getcat(facet, locale_classic());
3710 codecvt_wchar* codecvt_short_use_facet(const locale *loc)
3712 static codecvt_wchar *obj = NULL;
3714 _Lockit lock;
3715 const locale_facet *fac;
3717 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3718 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_short_id));
3719 if(fac) {
3720 _Lockit_dtor(&lock);
3721 return (codecvt_wchar*)fac;
3724 if(obj) {
3725 _Lockit_dtor(&lock);
3726 return obj;
3729 codecvt_short__Getcat(&fac, loc);
3730 obj = (codecvt_wchar*)fac;
3731 call_locale_facet__Incref(&obj->base.facet);
3732 locale_facet_register(&obj->base.facet);
3733 _Lockit_dtor(&lock);
3735 return obj;
3738 /* ?_Id_func@?$codecvt@_WDH@std@@SAAAVid@locale@2@XZ */
3739 /* ?_Id_func@?$codecvt@_WDH@std@@SAAEAVid@locale@2@XZ */
3740 locale_id* __cdecl codecvt_wchar__Id_func(void)
3742 TRACE("()\n");
3743 return &codecvt_wchar_id;
3746 /* ?_Id_func@?$codecvt@GDH@std@@SAAAVid@locale@2@XZ */
3747 /* ?_Id_func@?$codecvt@GDH@std@@SAAEAVid@locale@2@XZ */
3748 locale_id* __cdecl codecvt_short__Id_func(void)
3750 TRACE("()\n");
3751 return &codecvt_short_id;
3754 /* ?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ */
3755 /* ?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ */
3756 /* ?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ */
3757 /* ?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ */
3758 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_always_noconv, 4)
3759 bool __thiscall codecvt_wchar_do_always_noconv(const codecvt_wchar *this)
3761 TRACE("(%p)\n", this);
3762 return FALSE;
3765 /* ?do_max_length@?$codecvt@GDH@std@@MBEHXZ */
3766 /* ?do_max_length@?$codecvt@GDH@std@@MEBAHXZ */
3767 /* ?do_max_length@?$codecvt@_WDH@std@@MBEHXZ */
3768 /* ?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ */
3769 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_max_length, 4)
3770 int __thiscall codecvt_wchar_do_max_length(const codecvt_wchar *this)
3772 TRACE("(%p)\n", this);
3773 return MB_LEN_MAX;
3776 /* ?do_encoding@?$codecvt@GDH@std@@MBEHXZ */
3777 /* ?do_encoding@?$codecvt@GDH@std@@MEBAHXZ */
3778 /* ?do_encoding@?$codecvt@_WDH@std@@MBEHXZ */
3779 /* ?do_encoding@?$codecvt@_WDH@std@@MEBAHXZ */
3780 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_encoding, 4)
3781 int __thiscall codecvt_wchar_do_encoding(const codecvt_wchar *this)
3783 TRACE("(%p)\n", this);
3784 return 0;
3787 /* ?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3788 /* ?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3789 /* ?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3790 /* ?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3791 #if _MSVCP_VER <= 100
3792 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3793 CALL_VTBL_FUNC(this, 16, int, \
3794 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3795 (this, state, from, from_end, from_next, to, to_end, to_next))
3796 #else
3797 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3798 CALL_VTBL_FUNC(this, 24, int, \
3799 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3800 (this, state, from, from_end, from_next, to, to_end, to_next))
3801 #endif
3802 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_in, 32)
3803 int __thiscall codecvt_wchar_do_in(const codecvt_wchar *this, _Mbstatet *state,
3804 const char *from, const char *from_end, const char **from_next,
3805 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3807 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3808 from_end, from_next, to, to_end, to_next);
3810 *from_next = from;
3811 *to_next = to;
3813 while(*from_next!=from_end && *to_next!=to_end) {
3814 switch(_Mbrtowc(*to_next, *from_next, from_end-*from_next, state, &this->cvt)) {
3815 case -2:
3816 *from_next = from_end;
3817 return CODECVT_partial;
3818 case -1:
3819 return CODECVT_error;
3820 case 2:
3821 (*from_next)++;
3822 /* fall through */
3823 case 0:
3824 case 1:
3825 (*from_next)++;
3826 (*to_next)++;
3830 return CODECVT_ok;
3833 /* ?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3834 /* ?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3835 /* ?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3836 /* ?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3837 DEFINE_THISCALL_WRAPPER(codecvt_wchar_in, 32)
3838 int __thiscall codecvt_wchar_in(const codecvt_wchar *this, _Mbstatet *state,
3839 const char *from, const char *from_end, const char **from_next,
3840 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3842 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3843 from_end, from_next, to, to_end, to_next);
3844 return call_codecvt_wchar_do_in(this, state, from,
3845 from_end, from_next, to, to_end, to_next);
3848 /* ?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3849 /* ?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3850 /* ?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3851 /* ?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3852 #if _MSVCP_VER <= 100
3853 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3854 CALL_VTBL_FUNC(this, 20, int, \
3855 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3856 (this, state, from, from_end, from_next, to, to_end, to_next))
3857 #else
3858 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3859 CALL_VTBL_FUNC(this, 28, int, \
3860 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3861 (this, state, from, from_end, from_next, to, to_end, to_next))
3862 #endif
3863 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_out, 32)
3864 int __thiscall codecvt_wchar_do_out(const codecvt_wchar *this, _Mbstatet *state,
3865 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3866 char *to, char *to_end, char **to_next)
3868 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3869 from_end, from_next, to, to_end, to_next);
3871 *from_next = from;
3872 *to_next = to;
3874 while(*from_next!=from_end && *to_next!=to_end) {
3875 _Mbstatet old_state = *state;
3876 int size;
3877 char buf[MB_LEN_MAX];
3879 switch((size = _Wcrtomb(buf, **from_next, state, &this->cvt))) {
3880 case -1:
3881 return CODECVT_error;
3882 default:
3883 if(size > from_end-*from_next) {
3884 *state = old_state;
3885 return CODECVT_partial;
3888 (*from_next)++;
3889 memcpy_s(*to_next, to_end-*to_next, buf, size);
3890 (*to_next) += size;
3894 return CODECVT_ok;
3897 /* ?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3898 /* ?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3899 /* ?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3900 /* ?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3901 DEFINE_THISCALL_WRAPPER(codecvt_wchar_out, 32)
3902 int __thiscall codecvt_wchar_out(const codecvt_wchar *this, _Mbstatet *state,
3903 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3904 char *to, char *to_end, char **to_next)
3906 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3907 from_end, from_next, to, to_end, to_next);
3908 return call_codecvt_wchar_do_out(this, state, from,
3909 from_end, from_next, to, to_end, to_next);
3912 /* ?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z */
3913 /* ?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3914 /* ?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z */
3915 /* ?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3916 #if _MSVCP_VER <= 100
3917 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3918 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3919 #else
3920 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3921 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3922 #endif
3923 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_unshift, 20)
3924 int __thiscall codecvt_wchar_do_unshift(const codecvt_wchar *this,
3925 _Mbstatet *state, char *to, char *to_end, char **to_next)
3927 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3928 if(MBSTATET_TO_INT(state))
3929 WARN("unexpected state: %x\n", MBSTATET_TO_INT(state));
3931 *to_next = to;
3932 return CODECVT_ok;
3935 /* ?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z */
3936 /* ?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3937 /* ?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z */
3938 /* ?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3939 DEFINE_THISCALL_WRAPPER(codecvt_wchar_unshift, 20)
3940 int __thiscall codecvt_wchar_unshift(const codecvt_wchar *this,
3941 _Mbstatet *state, char *to, char *to_end, char **to_next)
3943 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3944 return call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next);
3947 /* ?do_length@?$codecvt@GDH@std@@MBEHABHPBD1I@Z */
3948 /* ?do_length@?$codecvt@GDH@std@@MEBAHAEBHPEBD1_K@Z */
3949 /* ?do_length@?$codecvt@_WDH@std@@MBEHABHPBD1I@Z */
3950 /* ?do_length@?$codecvt@_WDH@std@@MEBAHAEBHPEBD1_K@Z */
3951 #if _MSVCP_VER <= 100
3952 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3953 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, size_t), \
3954 (this, state, from, from_end, max))
3955 #else
3956 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
3957 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, size_t), \
3958 (this, state, from, from_end, max))
3959 #endif
3960 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_length, 20)
3961 int __thiscall codecvt_wchar_do_length(const codecvt_wchar *this, const _Mbstatet *state,
3962 const char *from, const char *from_end, size_t max)
3964 _Mbstatet tmp_state = *state;
3965 int ret=0;
3967 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3969 while(ret<max && from!=from_end) {
3970 switch(_Mbrtowc(NULL, from, from_end-from, &tmp_state, &this->cvt)) {
3971 case -2:
3972 case -1:
3973 return ret;
3974 case 2:
3975 from++;
3976 /* fall through */
3977 case 0:
3978 case 1:
3979 from++;
3980 ret++;
3984 return ret;
3987 /* ?length@?$codecvt@GDH@std@@QBEHABHPBD1I@Z */
3988 /* ?length@?$codecvt@GDH@std@@QEBAHAEBHPEBD1_K@Z */
3989 /* ?length@?$codecvt@_WDH@std@@QBEHABHPBD1I@Z */
3990 /* ?length@?$codecvt@_WDH@std@@QEBAHAEBHPEBD1_K@Z */
3991 DEFINE_THISCALL_WRAPPER(codecvt_wchar_length, 20)
3992 int __thiscall codecvt_wchar_length(const codecvt_wchar *this, const _Mbstatet *state,
3993 const char *from, const char *from_end, size_t max)
3995 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3996 return call_codecvt_wchar_do_length(this, state, from, from_end, max);
3999 /* ?id@?$numpunct@D@std@@2V0locale@2@A */
4000 locale_id numpunct_char_id = {0};
4002 /* ??_7?$numpunct@D@std@@6B@ */
4003 extern const vtable_ptr numpunct_char_vtable;
4005 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
4006 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4007 DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
4008 void __thiscall numpunct_char__Init(numpunct_char *this, const _Locinfo *locinfo, bool isdef)
4010 int len;
4012 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4014 len = strlen(_Locinfo__Getfalse(locinfo))+1;
4015 this->false_name = operator_new(len);
4016 memcpy((char*)this->false_name, _Locinfo__Getfalse(locinfo), len);
4018 len = strlen(_Locinfo__Gettrue(locinfo))+1;
4019 this->true_name = operator_new(len);
4020 memcpy((char*)this->true_name, _Locinfo__Gettrue(locinfo), len);
4022 if(isdef) {
4023 this->grouping = operator_new(1);
4024 *(char*)this->grouping = 0;
4026 this->dp = '.';
4027 this->sep = ',';
4028 } else {
4029 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4031 len = strlen(lc->grouping)+1;
4032 this->grouping = operator_new(len);
4033 memcpy((char*)this->grouping, lc->grouping, len);
4035 this->dp = lc->decimal_point[0];
4036 this->sep = lc->thousands_sep[0];
4040 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
4041 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
4042 DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
4043 void __thiscall numpunct_char__Tidy(numpunct_char *this)
4045 TRACE("(%p)\n", this);
4047 operator_delete((char*)this->grouping);
4048 operator_delete((char*)this->false_name);
4049 operator_delete((char*)this->true_name);
4052 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
4053 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4054 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
4055 numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
4056 const _Locinfo *locinfo, size_t refs, bool usedef)
4058 TRACE("(%p %p %Iu %d)\n", this, locinfo, refs, usedef);
4059 locale_facet_ctor_refs(&this->facet, refs);
4060 this->facet.vtable = &numpunct_char_vtable;
4061 numpunct_char__Init(this, locinfo, usedef);
4062 return this;
4065 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
4066 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
4067 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
4068 numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
4069 const char *name, size_t refs, bool usedef)
4071 _Locinfo locinfo;
4073 TRACE("(%p %s %Iu %d)\n", this, debugstr_a(name), refs, usedef);
4074 locale_facet_ctor_refs(&this->facet, refs);
4075 this->facet.vtable = &numpunct_char_vtable;
4077 _Locinfo_ctor_cstr(&locinfo, name);
4078 numpunct_char__Init(this, &locinfo, usedef);
4079 _Locinfo_dtor(&locinfo);
4080 return this;
4083 /* ??0?$numpunct@D@std@@QAE@I@Z */
4084 /* ??0?$numpunct@D@std@@QEAA@_K@Z */
4085 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
4086 numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, size_t refs)
4088 TRACE("(%p %Iu)\n", this, refs);
4089 return numpunct_char_ctor_name(this, "C", refs, FALSE);
4092 /* ??_F?$numpunct@D@std@@QAEXXZ */
4093 /* ??_F?$numpunct@D@std@@QEAAXXZ */
4094 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
4095 numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
4097 return numpunct_char_ctor_refs(this, 0);
4100 /* ??1?$numpunct@D@std@@UAE@XZ */
4101 /* ??1?$numpunct@D@std@@UEAA@XZ */
4102 /* ??1?$numpunct@D@std@@MAE@XZ */
4103 /* ??1?$numpunct@D@std@@MEAA@XZ */
4104 DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
4105 void __thiscall numpunct_char_dtor(numpunct_char *this)
4107 TRACE("(%p)\n", this);
4108 numpunct_char__Tidy(this);
4111 DEFINE_THISCALL_WRAPPER(numpunct_char_vector_dtor, 8)
4112 numpunct_char* __thiscall numpunct_char_vector_dtor(numpunct_char *this, unsigned int flags)
4114 TRACE("(%p %x)\n", this, flags);
4115 if(flags & 2) {
4116 /* we have an array, with the number of elements stored before the first object */
4117 INT_PTR i, *ptr = (INT_PTR *)this-1;
4119 for(i=*ptr-1; i>=0; i--)
4120 numpunct_char_dtor(this+i);
4121 operator_delete(ptr);
4122 } else {
4123 numpunct_char_dtor(this);
4124 if(flags & 1)
4125 operator_delete(this);
4128 return this;
4131 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4132 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4133 size_t __cdecl numpunct_char__Getcat(const locale_facet **facet, const locale *loc)
4135 TRACE("(%p %p)\n", facet, loc);
4137 if(facet && !*facet) {
4138 *facet = operator_new(sizeof(numpunct_char));
4139 numpunct_char_ctor_name((numpunct_char*)*facet,
4140 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4143 return LC_NUMERIC;
4146 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@@Z */
4147 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4148 size_t __cdecl numpunct_char__Getcat_old(const locale_facet **facet)
4150 return numpunct_char__Getcat(facet, locale_classic());
4153 static numpunct_char* numpunct_char_use_facet(const locale *loc)
4155 static numpunct_char *obj = NULL;
4157 _Lockit lock;
4158 const locale_facet *fac;
4160 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4161 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_char_id));
4162 if(fac) {
4163 _Lockit_dtor(&lock);
4164 return (numpunct_char*)fac;
4167 if(obj) {
4168 _Lockit_dtor(&lock);
4169 return obj;
4172 numpunct_char__Getcat(&fac, loc);
4173 obj = (numpunct_char*)fac;
4174 call_locale_facet__Incref(&obj->facet);
4175 locale_facet_register(&obj->facet);
4176 _Lockit_dtor(&lock);
4178 return obj;
4181 /* ?do_decimal_point@?$numpunct@D@std@@MBEDXZ */
4182 /* ?do_decimal_point@?$numpunct@D@std@@MEBADXZ */
4183 DEFINE_THISCALL_WRAPPER(numpunct_char_do_decimal_point, 4)
4184 #if _MSVCP_VER <= 100
4185 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4186 char, (const numpunct_char *this), (this))
4187 #else
4188 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4189 char, (const numpunct_char *this), (this))
4190 #endif
4191 char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
4193 TRACE("(%p)\n", this);
4194 return this->dp;
4197 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
4198 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
4199 DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
4200 char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
4202 TRACE("(%p)\n", this);
4203 return call_numpunct_char_do_decimal_point(this);
4206 /* ?do_thousands_sep@?$numpunct@D@std@@MBEDXZ */
4207 /* ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ */
4208 DEFINE_THISCALL_WRAPPER(numpunct_char_do_thousands_sep, 4)
4209 #if _MSVCP_VER <= 100
4210 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4211 char, (const numpunct_char*), (this))
4212 #else
4213 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4214 char, (const numpunct_char*), (this))
4215 #endif
4216 char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
4218 TRACE("(%p)\n", this);
4219 return this->sep;
4222 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
4223 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
4224 DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
4225 char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
4227 TRACE("(%p)\n", this);
4228 return call_numpunct_char_do_thousands_sep(this);
4231 /* ?do_grouping@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4232 /* ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4233 DEFINE_THISCALL_WRAPPER(numpunct_char_do_grouping, 8)
4234 #if _MSVCP_VER <= 100
4235 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4236 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4237 #else
4238 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4239 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4240 #endif
4241 basic_string_char* __thiscall numpunct_char_do_grouping(
4242 const numpunct_char *this, basic_string_char *ret)
4244 TRACE("(%p)\n", this);
4245 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4248 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4249 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4250 DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
4251 basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
4253 TRACE("(%p)\n", this);
4254 return call_numpunct_char_do_grouping(this, ret);
4257 /* ?do_falsename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4258 /* ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4259 DEFINE_THISCALL_WRAPPER(numpunct_char_do_falsename, 8)
4260 #if _MSVCP_VER <= 100
4261 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4262 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4263 #else
4264 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4265 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4266 #endif
4267 basic_string_char* __thiscall numpunct_char_do_falsename(
4268 const numpunct_char *this, basic_string_char *ret)
4270 TRACE("(%p)\n", this);
4271 return MSVCP_basic_string_char_ctor_cstr(ret, this->false_name);
4274 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4275 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4276 DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
4277 basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
4279 TRACE("(%p)\n", this);
4280 return call_numpunct_char_do_falsename(this, ret);
4283 /* ?do_truename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4284 /* ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4285 DEFINE_THISCALL_WRAPPER(numpunct_char_do_truename, 8)
4286 #if _MSVCP_VER <= 100
4287 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4288 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4289 #else
4290 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4291 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4292 #endif
4293 basic_string_char* __thiscall numpunct_char_do_truename(
4294 const numpunct_char *this, basic_string_char *ret)
4296 TRACE("(%p)\n", this);
4297 return MSVCP_basic_string_char_ctor_cstr(ret, this->true_name);
4300 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4301 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4302 DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
4303 basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
4305 TRACE("(%p)\n", this);
4306 return call_numpunct_char_do_truename(this, ret);
4309 /* ?id@?$numpunct@_W@std@@2V0locale@2@A */
4310 locale_id numpunct_wchar_id = {0};
4311 /* ?id@?$numpunct@G@std@@2V0locale@2@A */
4312 locale_id numpunct_short_id = {0};
4314 /* ??_7?$numpunct@_W@std@@6B@ */
4315 extern const vtable_ptr numpunct_wchar_vtable;
4316 /* ??_7?$numpunct@G@std@@6B@ */
4317 extern const vtable_ptr numpunct_short_vtable;
4319 /* ?_Init@?$numpunct@_W@std@@IAEXABV_Locinfo@2@_N@Z */
4320 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4321 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
4322 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4323 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
4324 void __thiscall numpunct_wchar__Init(numpunct_wchar *this,
4325 const _Locinfo *locinfo, bool isdef)
4327 const char *to_convert;
4328 _Cvtvec cvt;
4329 int len;
4331 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4333 _Locinfo__Getcvt(locinfo, &cvt);
4335 to_convert = _Locinfo__Getfalse(locinfo);
4336 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4337 this->false_name = operator_new(len*sizeof(WCHAR));
4338 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4339 (wchar_t*)this->false_name, len);
4341 to_convert = _Locinfo__Gettrue(locinfo);
4342 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4343 this->true_name = operator_new(len*sizeof(WCHAR));
4344 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4345 (wchar_t*)this->true_name, len);
4347 if(isdef) {
4348 this->grouping = operator_new(1);
4349 *(char*)this->grouping = 0;
4351 this->dp = '.';
4352 this->sep = ',';
4353 } else {
4354 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4356 len = strlen(lc->grouping)+1;
4357 this->grouping = operator_new(len);
4358 memcpy((char*)this->grouping, lc->grouping, len);
4360 this->dp = mb_to_wc(lc->decimal_point[0], &cvt);
4361 this->sep = mb_to_wc(lc->thousands_sep[0], &cvt);
4365 /* ?_Tidy@?$numpunct@_W@std@@AAEXXZ */
4366 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
4367 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
4368 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
4369 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
4370 void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
4372 TRACE("(%p)\n", this);
4374 operator_delete((char*)this->grouping);
4375 operator_delete((wchar_t*)this->false_name);
4376 operator_delete((wchar_t*)this->true_name);
4379 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
4380 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4381 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
4382 numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
4383 const _Locinfo *locinfo, size_t refs, bool usedef)
4385 TRACE("(%p %p %Iu %d)\n", this, locinfo, refs, usedef);
4386 locale_facet_ctor_refs(&this->facet, refs);
4387 this->facet.vtable = &numpunct_wchar_vtable;
4388 numpunct_wchar__Init(this, locinfo, usedef);
4389 return this;
4392 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
4393 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4394 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
4395 numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
4396 const _Locinfo *locinfo, size_t refs, bool usedef)
4398 numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
4399 this->facet.vtable = &numpunct_short_vtable;
4400 return this;
4403 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
4404 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
4405 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
4406 numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
4407 const char *name, size_t refs, bool usedef)
4409 _Locinfo locinfo;
4411 TRACE("(%p %s %Iu %d)\n", this, debugstr_a(name), refs, usedef);
4412 locale_facet_ctor_refs(&this->facet, refs);
4413 this->facet.vtable = &numpunct_wchar_vtable;
4415 _Locinfo_ctor_cstr(&locinfo, name);
4416 numpunct_wchar__Init(this, &locinfo, usedef);
4417 _Locinfo_dtor(&locinfo);
4418 return this;
4421 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
4422 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
4423 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
4424 numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
4425 const char *name, size_t refs, bool usedef)
4427 numpunct_wchar_ctor_name(this, name, refs, usedef);
4428 this->facet.vtable = &numpunct_short_vtable;
4429 return this;
4432 /* ??0?$numpunct@_W@std@@QAE@I@Z */
4433 /* ??0?$numpunct@_W@std@@QEAA@_K@Z */
4434 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
4435 numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, size_t refs)
4437 TRACE("(%p %Iu)\n", this, refs);
4438 return numpunct_wchar_ctor_name(this, "C", refs, FALSE);
4441 /* ??0?$numpunct@G@std@@QAE@I@Z */
4442 /* ??0?$numpunct@G@std@@QEAA@_K@Z */
4443 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
4444 numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, size_t refs)
4446 numpunct_wchar_ctor_refs(this, refs);
4447 this->facet.vtable = &numpunct_short_vtable;
4448 return this;
4451 /* ??_F?$numpunct@_W@std@@QAEXXZ */
4452 /* ??_F?$numpunct@_W@std@@QEAAXXZ */
4453 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
4454 numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
4456 return numpunct_wchar_ctor_refs(this, 0);
4459 /* ??_F?$numpunct@G@std@@QAEXXZ */
4460 /* ??_F?$numpunct@G@std@@QEAAXXZ */
4461 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
4462 numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
4464 return numpunct_short_ctor_refs(this, 0);
4467 /* ??1?$numpunct@G@std@@UAE@XZ */
4468 /* ??1?$numpunct@G@std@@UEAA@XZ */
4469 /* ??1?$numpunct@_W@std@@MAE@XZ */
4470 /* ??1?$numpunct@_W@std@@MEAA@XZ */
4471 /* ??1?$numpunct@G@std@@MAE@XZ */
4472 /* ??1?$numpunct@G@std@@MEAA@XZ */
4473 DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
4474 void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
4476 TRACE("(%p)\n", this);
4477 numpunct_wchar__Tidy(this);
4480 DEFINE_THISCALL_WRAPPER(numpunct_wchar_vector_dtor, 8)
4481 numpunct_wchar* __thiscall numpunct_wchar_vector_dtor(numpunct_wchar *this, unsigned int flags)
4483 TRACE("(%p %x)\n", this, flags);
4484 if(flags & 2) {
4485 /* we have an array, with the number of elements stored before the first object */
4486 INT_PTR i, *ptr = (INT_PTR *)this-1;
4488 for(i=*ptr-1; i>=0; i--)
4489 numpunct_wchar_dtor(this+i);
4490 operator_delete(ptr);
4491 } else {
4492 numpunct_wchar_dtor(this);
4493 if(flags & 1)
4494 operator_delete(this);
4497 return this;
4500 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4501 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4502 size_t __cdecl numpunct_wchar__Getcat(const locale_facet **facet, const locale *loc)
4504 TRACE("(%p %p)\n", facet, loc);
4506 if(facet && !*facet) {
4507 *facet = operator_new(sizeof(numpunct_wchar));
4508 numpunct_wchar_ctor_name((numpunct_wchar*)*facet,
4509 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4512 return LC_NUMERIC;
4515 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@@Z */
4516 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4517 size_t __cdecl numpunct_wchar__Getcat_old(const locale_facet **facet)
4519 return numpunct_wchar__Getcat(facet, locale_classic());
4522 static numpunct_wchar* numpunct_wchar_use_facet(const locale *loc)
4524 static numpunct_wchar *obj = NULL;
4526 _Lockit lock;
4527 const locale_facet *fac;
4529 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4530 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_wchar_id));
4531 if(fac) {
4532 _Lockit_dtor(&lock);
4533 return (numpunct_wchar*)fac;
4536 if(obj) {
4537 _Lockit_dtor(&lock);
4538 return obj;
4541 numpunct_wchar__Getcat(&fac, loc);
4542 obj = (numpunct_wchar*)fac;
4543 call_locale_facet__Incref(&obj->facet);
4544 locale_facet_register(&obj->facet);
4545 _Lockit_dtor(&lock);
4547 return obj;
4550 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4551 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4552 size_t __cdecl numpunct_short__Getcat(const locale_facet **facet, const locale *loc)
4554 TRACE("(%p %p)\n", facet, loc);
4556 if(facet && !*facet) {
4557 *facet = operator_new(sizeof(numpunct_wchar));
4558 numpunct_short_ctor_name((numpunct_wchar*)*facet,
4559 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4562 return LC_NUMERIC;
4565 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@@Z */
4566 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4567 size_t __cdecl numpunct_short__Getcat_old(const locale_facet **facet)
4569 return numpunct_short__Getcat(facet, locale_classic());
4572 static numpunct_wchar* numpunct_short_use_facet(const locale *loc)
4574 static numpunct_wchar *obj = NULL;
4576 _Lockit lock;
4577 const locale_facet *fac;
4579 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4580 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_short_id));
4581 if(fac) {
4582 _Lockit_dtor(&lock);
4583 return (numpunct_wchar*)fac;
4586 if(obj) {
4587 _Lockit_dtor(&lock);
4588 return obj;
4591 numpunct_short__Getcat(&fac, loc);
4592 obj = (numpunct_wchar*)fac;
4593 call_locale_facet__Incref(&obj->facet);
4594 locale_facet_register(&obj->facet);
4595 _Lockit_dtor(&lock);
4597 return obj;
4600 /* ?do_decimal_point@?$numpunct@_W@std@@MBE_WXZ */
4601 /* ?do_decimal_point@?$numpunct@_W@std@@MEBA_WXZ */
4602 /* ?do_decimal_point@?$numpunct@G@std@@MBEGXZ */
4603 /* ?do_decimal_point@?$numpunct@G@std@@MEBAGXZ */
4604 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_decimal_point, 4)
4605 #if _MSVCP_VER <= 100
4606 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4607 wchar_t, (const numpunct_wchar *this), (this))
4608 #else
4609 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4610 wchar_t, (const numpunct_wchar *this), (this))
4611 #endif
4612 wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
4614 TRACE("(%p)\n", this);
4615 return this->dp;
4618 /* ?decimal_point@?$numpunct@_W@std@@QBE_WXZ */
4619 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
4620 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
4621 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
4622 DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
4623 wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
4625 TRACE("(%p)\n", this);
4626 return call_numpunct_wchar_do_decimal_point(this);
4629 /* ?do_thousands_sep@?$numpunct@_W@std@@MBE_WXZ */
4630 /* ?do_thousands_sep@?$numpunct@_W@std@@MEBA_WXZ */
4631 /* ?do_thousands_sep@?$numpunct@G@std@@MBEGXZ */
4632 /* ?do_thousands_sep@?$numpunct@G@std@@MEBAGXZ */
4633 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_thousands_sep, 4)
4634 #if _MSVCP_VER <= 100
4635 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4636 wchar_t, (const numpunct_wchar *this), (this))
4637 #else
4638 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4639 wchar_t, (const numpunct_wchar *this), (this))
4640 #endif
4641 wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
4643 TRACE("(%p)\n", this);
4644 return this->sep;
4647 /* ?thousands_sep@?$numpunct@_W@std@@QBE_WXZ */
4648 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
4649 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
4650 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
4651 DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
4652 wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
4654 TRACE("(%p)\n", this);
4655 return call_numpunct_wchar_do_thousands_sep(this);
4658 /* ?do_grouping@?$numpunct@_W@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4659 /* ?do_grouping@?$numpunct@_W@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4660 /* ?do_grouping@?$numpunct@G@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4661 /* ?do_grouping@?$numpunct@G@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4662 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_grouping, 8)
4663 #if _MSVCP_VER <= 100
4664 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4665 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4666 #else
4667 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4668 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4669 #endif
4670 basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *this, basic_string_char *ret)
4672 TRACE("(%p)\n", this);
4673 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4676 /* ?grouping@?$numpunct@_W@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4677 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4678 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4679 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4680 DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
4681 basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
4683 TRACE("(%p)\n", this);
4684 return call_numpunct_wchar_do_grouping(this, ret);
4687 /* ?do_falsename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4688 /* ?do_falsename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4689 /* ?do_falsename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4690 /* ?do_falsename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4691 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_falsename, 8)
4692 #if _MSVCP_VER <= 100
4693 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4694 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4695 #else
4696 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4697 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4698 #endif
4699 basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4701 TRACE("(%p)\n", this);
4702 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->false_name);
4705 /* ?falsename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4706 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4707 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4708 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4709 DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
4710 basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4712 TRACE("(%p)\n", this);
4713 return call_numpunct_wchar_do_falsename(this, ret);
4716 /* ?do_truename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4717 /* ?do_truename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4718 /* ?do_truename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4719 /* ?do_truename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4720 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_truename, 8)
4721 #if _MSVCP_VER <= 100
4722 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4723 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4724 #else
4725 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4726 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4727 #endif
4728 basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4730 TRACE("(%p)\n", this);
4731 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->true_name);
4734 /* ?truename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4735 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4736 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4737 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4738 DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
4739 basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4741 TRACE("(%p)\n", this);
4742 return call_numpunct_wchar_do_truename(this, ret);
4745 double __cdecl _Stod(const char *buf, char **buf_end, LONG exp)
4747 double ret = strtod(buf, buf_end);
4749 if(exp)
4750 ret *= pow(10, exp);
4751 return ret;
4754 double __cdecl _Stodx(const char *buf, char **buf_end, LONG exp, int *err)
4756 double ret;
4758 *err = *_errno();
4759 *_errno() = 0;
4760 ret = _Stod(buf, buf_end, exp);
4761 if(*_errno()) {
4762 *err = *_errno();
4763 }else {
4764 *_errno() = *err;
4765 *err = 0;
4767 return ret;
4770 float __cdecl _Stof(const char *buf, char **buf_end, LONG exp)
4772 return _Stod(buf, buf_end, exp);
4775 float __cdecl _Stofx(const char *buf, char **buf_end, LONG exp, int *err)
4777 return _Stodx(buf, buf_end, exp, err);
4780 __int64 __cdecl _Stoll(const char *buf, char **buf_end, int base)
4782 return _strtoi64(buf, buf_end, base);
4785 __int64 __cdecl _Stollx(const char *buf, char **buf_end, int base, int *err)
4787 __int64 ret;
4789 *err = *_errno();
4790 *_errno() = 0;
4791 ret = _strtoi64(buf, buf_end, base);
4792 if(*_errno()) {
4793 *err = *_errno();
4794 }else {
4795 *_errno() = *err;
4796 *err = 0;
4798 return ret;
4801 LONG __cdecl _Stolx(const char *buf, char **buf_end, int base, int *err)
4803 __int64 i = _Stollx(buf, buf_end, base, err);
4804 if(!*err && i!=(__int64)((LONG)i))
4805 *err = ERANGE;
4806 return i;
4809 unsigned __int64 __cdecl _Stoull(const char *buf, char **buf_end, int base)
4811 return _strtoui64(buf, buf_end, base);
4814 unsigned __int64 __cdecl _Stoullx(const char *buf, char **buf_end, int base, int *err)
4816 unsigned __int64 ret;
4818 *err = *_errno();
4819 *_errno() = 0;
4820 ret = _strtoui64(buf, buf_end, base);
4821 if(*_errno()) {
4822 *err = *_errno();
4823 }else {
4824 *_errno() = *err;
4825 *err = 0;
4827 return ret;
4830 ULONG __cdecl _Stoul(const char *buf, char **buf_end, int base)
4832 int err;
4833 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, &err);
4834 if(!err && i!=(unsigned __int64)((ULONG)i))
4835 *_errno() = ERANGE;
4836 return buf[0]=='-' ? -i : i;
4839 ULONG __cdecl _Stoulx(const char *buf, char **buf_end, int base, int *err)
4841 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, err);
4842 if(!*err && i!=(unsigned __int64)((ULONG)i))
4843 *err = ERANGE;
4844 return buf[0]=='-' ? -i : i;
4847 /* ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
4848 locale_id num_get_wchar_id = {0};
4849 /* ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
4850 locale_id num_get_short_id = {0};
4852 /* ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
4853 extern const vtable_ptr num_get_wchar_vtable;
4854 /* ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
4855 extern const vtable_ptr num_get_short_vtable;
4857 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4858 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4859 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4860 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4861 DEFINE_THISCALL_WRAPPER(num_get_wchar__Init, 8)
4862 void __thiscall num_get_wchar__Init(num_get *this, const _Locinfo *locinfo)
4864 TRACE("(%p %p)\n", this, locinfo);
4865 #if _MSVCP_VER <= 100
4866 _Locinfo__Getcvt(locinfo, &this->cvt);
4867 #endif
4870 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4871 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4872 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_locinfo, 12)
4873 num_get* __thiscall num_get_wchar_ctor_locinfo(num_get *this,
4874 const _Locinfo *locinfo, size_t refs)
4876 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
4878 locale_facet_ctor_refs(&this->facet, refs);
4879 this->facet.vtable = &num_get_wchar_vtable;
4881 num_get_wchar__Init(this, locinfo);
4882 return this;
4885 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4886 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4887 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_locinfo, 12)
4888 num_get* __thiscall num_get_short_ctor_locinfo(num_get *this,
4889 const _Locinfo *locinfo, size_t refs)
4891 num_get_wchar_ctor_locinfo(this, locinfo, refs);
4892 this->facet.vtable = &num_get_short_vtable;
4893 return this;
4896 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
4897 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
4898 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_refs, 8)
4899 num_get* __thiscall num_get_wchar_ctor_refs(num_get *this, size_t refs)
4901 _Locinfo locinfo;
4903 TRACE("(%p %Iu)\n", this, refs);
4905 _Locinfo_ctor(&locinfo);
4906 num_get_wchar_ctor_locinfo(this, &locinfo, refs);
4907 _Locinfo_dtor(&locinfo);
4908 return this;
4911 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
4912 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
4913 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_refs, 8)
4914 num_get* __thiscall num_get_short_ctor_refs(num_get *this, size_t refs)
4916 num_get_wchar_ctor_refs(this, refs);
4917 this->facet.vtable = &num_get_short_vtable;
4918 return this;
4921 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4922 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4923 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor, 4)
4924 num_get* __thiscall num_get_wchar_ctor(num_get *this)
4926 return num_get_wchar_ctor_refs(this, 0);
4929 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4930 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4931 DEFINE_THISCALL_WRAPPER(num_get_short_ctor, 4)
4932 num_get* __thiscall num_get_short_ctor(num_get *this)
4934 return num_get_short_ctor_refs(this, 0);
4937 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
4938 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
4939 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
4940 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
4941 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
4942 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
4943 DEFINE_THISCALL_WRAPPER(num_get_wchar_dtor, 4)
4944 void __thiscall num_get_wchar_dtor(num_get *this)
4946 TRACE("(%p)\n", this);
4947 locale_facet_dtor(&this->facet);
4950 DEFINE_THISCALL_WRAPPER(num_get_wchar_vector_dtor, 8)
4951 num_get* __thiscall num_get_wchar_vector_dtor(num_get *this, unsigned int flags)
4953 TRACE("(%p %x)\n", this, flags);
4954 if(flags & 2) {
4955 /* we have an array, with the number of elements stored before the first object */
4956 INT_PTR i, *ptr = (INT_PTR *)this-1;
4958 for(i=*ptr-1; i>=0; i--)
4959 num_get_wchar_dtor(this+i);
4960 operator_delete(ptr);
4961 } else {
4962 num_get_wchar_dtor(this);
4963 if(flags & 1)
4964 operator_delete(this);
4967 return this;
4970 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4971 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4972 size_t __cdecl num_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
4974 TRACE("(%p %p)\n", facet, loc);
4976 if(facet && !*facet) {
4977 _Locinfo locinfo;
4979 *facet = operator_new(sizeof(num_get));
4980 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
4981 num_get_wchar_ctor_locinfo((num_get*)*facet, &locinfo, 0);
4982 _Locinfo_dtor(&locinfo);
4985 return LC_NUMERIC;
4988 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
4989 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4990 size_t __cdecl num_get_wchar__Getcat_old(const locale_facet **facet)
4992 return num_get_wchar__Getcat(facet, locale_classic());
4995 num_get* num_get_wchar_use_facet(const locale *loc)
4997 static num_get *obj = NULL;
4999 _Lockit lock;
5000 const locale_facet *fac;
5002 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5003 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_wchar_id));
5004 if(fac) {
5005 _Lockit_dtor(&lock);
5006 return (num_get*)fac;
5009 if(obj) {
5010 _Lockit_dtor(&lock);
5011 return obj;
5014 num_get_wchar__Getcat(&fac, loc);
5015 obj = (num_get*)fac;
5016 call_locale_facet__Incref(&obj->facet);
5017 locale_facet_register(&obj->facet);
5018 _Lockit_dtor(&lock);
5020 return obj;
5023 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
5024 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
5025 size_t __cdecl num_get_short__Getcat(const locale_facet **facet, const locale *loc)
5027 if(facet && !*facet) {
5028 num_get_wchar__Getcat(facet, loc);
5029 (*(locale_facet**)facet)->vtable = &num_get_short_vtable;
5032 return LC_NUMERIC;
5035 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
5036 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
5037 size_t __cdecl num_get_short__Getcat_old(const locale_facet **facet)
5039 return num_get_short__Getcat(facet, locale_classic());
5042 num_get* num_get_short_use_facet(const locale *loc)
5044 static num_get *obj = NULL;
5046 _Lockit lock;
5047 const locale_facet *fac;
5049 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5050 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_short_id));
5051 if(fac) {
5052 _Lockit_dtor(&lock);
5053 return (num_get*)fac;
5056 if(obj) {
5057 _Lockit_dtor(&lock);
5058 return obj;
5061 num_get_short__Getcat(&fac, loc);
5062 obj = (num_get*)fac;
5063 call_locale_facet__Incref(&obj->facet);
5064 locale_facet_register(&obj->facet);
5065 _Lockit_dtor(&lock);
5067 return obj;
5070 static int num_get__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5071 istreambuf_iterator_wchar *last, const locale *loc, numpunct_wchar *numpunct)
5073 basic_string_char grouping_bstr;
5074 basic_string_char groups_found;
5075 int i, groups_no = 0, cur_group = 0, exp = 0;
5076 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31;
5077 wchar_t sep = 0, digits[11], *digits_pos;
5078 const char *grouping, *groups;
5079 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
5080 const _Cvtvec *cvt;
5082 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
5084 #if _MSVCP_VER <= 100
5085 cvt = &this->cvt;
5086 #else
5087 cvt = &ctype_wchar_use_facet(loc)->cvt;
5088 #endif
5090 for(i=0; i<10; i++)
5091 digits[i] = mb_to_wc('0'+i, cvt);
5092 digits[10] = 0;
5094 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5095 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5096 #if _MSVCP_VER >= 70
5097 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5098 #endif
5100 if(sep)
5101 MSVCP_basic_string_char_ctor(&groups_found);
5103 istreambuf_iterator_wchar_val(first);
5104 /* get sign */
5105 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5106 *dest++ = '-';
5107 istreambuf_iterator_wchar_inc(first);
5108 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5109 *dest++ = '+';
5110 istreambuf_iterator_wchar_inc(first);
5113 /* read possibly grouped numbers before decimal */
5114 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5115 if(!(digits_pos = wcschr(digits, first->val))) {
5116 if(sep && first->val==sep) {
5117 if(!groups_no) break; /* empty group - stop parsing */
5118 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5119 groups_no = 0;
5120 ++cur_group;
5121 }else {
5122 break;
5124 }else {
5125 got_digit = TRUE; /* found a digit, zero or non-zero */
5126 /* write digit to dest if not a leading zero (to not waste dest buffer) */
5127 if(!got_nonzero && first->val == digits[0])
5129 ++groups_no;
5130 continue;
5132 got_nonzero = TRUE;
5133 if(dest < num_end)
5134 *dest++ = '0'+digits_pos-digits;
5135 else
5136 exp++; /* too many digits, just multiply by 10 */
5137 if(sep && groups_no<CHAR_MAX)
5138 ++groups_no;
5142 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
5143 if(got_digit && !got_nonzero)
5144 *dest++ = '0';
5146 /* get decimal, if any */
5147 if(first->strbuf && first->val==numpunct_wchar_decimal_point(numpunct)) {
5148 if(dest < num_end)
5149 *dest++ = *localeconv()->decimal_point;
5150 istreambuf_iterator_wchar_inc(first);
5153 /* read non-grouped after decimal */
5154 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5155 if(!(digits_pos = wcschr(digits, first->val)))
5156 break;
5157 else if(dest<num_end) {
5158 got_digit = TRUE;
5159 *dest++ = '0'+digits_pos-digits;
5163 /* read exponent, if any */
5164 if(first->strbuf && (first->val==mb_to_wc('e', cvt) || first->val==mb_to_wc('E', cvt))) {
5165 *dest++ = 'e';
5166 istreambuf_iterator_wchar_inc(first);
5168 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5169 *dest++ = '-';
5170 istreambuf_iterator_wchar_inc(first);
5171 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5172 *dest++ = '+';
5173 istreambuf_iterator_wchar_inc(first);
5176 got_digit = got_nonzero = FALSE;
5177 error = TRUE;
5178 /* skip any leading zeroes */
5179 for(; first->strbuf && first->val==digits[0]; istreambuf_iterator_wchar_inc(first))
5180 error = FALSE;
5182 for(; first->strbuf && (digits_pos = wcschr(digits, first->val)); istreambuf_iterator_wchar_inc(first)) {
5183 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
5184 error = FALSE;
5185 if(dest<exp_end)
5186 *dest++ = '0'+digits_pos-digits;
5189 /* if just found zeroes for exponent, use that */
5190 if(got_digit && !got_nonzero)
5192 error = FALSE;
5193 if(dest<exp_end)
5194 *dest++ = '0';
5198 if(sep && groups_no)
5199 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5201 if(!cur_group) /* no groups, skip loop */
5202 cur_group--;
5203 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
5204 error = TRUE; /* trailing empty */
5206 for(; cur_group>=0 && !error; cur_group--) {
5207 if(*grouping == CHAR_MAX) {
5208 if(cur_group)
5209 error = TRUE;
5210 break;
5211 }else if((cur_group && *grouping!=groups[cur_group])
5212 || (!cur_group && *grouping<groups[cur_group])) {
5213 error = TRUE;
5214 break;
5215 }else if(grouping[1]) {
5216 grouping++;
5219 MSVCP_basic_string_char_dtor(&grouping_bstr);
5220 if(sep)
5221 MSVCP_basic_string_char_dtor(&groups_found);
5223 if(error) {
5224 *dest_beg = '\0';
5225 return 0;
5227 *dest++ = '\0';
5228 return exp;
5231 /* ?_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 */
5232 /* ?_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 */
5233 int __cdecl num_get_wchar__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5234 istreambuf_iterator_wchar *last, const locale *loc)
5236 return num_get__Getffld(this, dest, first, last, loc, numpunct_wchar_use_facet(loc));
5239 /* ?_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 */
5240 /* ?_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 */
5241 int __cdecl num_get_short__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5242 istreambuf_iterator_wchar *last, const locale *loc)
5244 return num_get__Getffld(this, dest, first, last, loc, numpunct_short_use_facet(loc));
5247 /* ?_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 */
5248 /* ?_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 */
5249 /* ?_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 */
5250 /* ?_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 */
5251 int __cdecl num_get_wchar__Getffldx(num_get *this, char *dest, istreambuf_iterator_wchar *first,
5252 istreambuf_iterator_wchar *last, ios_base *ios, int *phexexp)
5254 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
5255 return -1;
5258 static int num_get__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5259 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc, numpunct_wchar *numpunct)
5261 wchar_t digits[23], *digits_pos, sep = 0;
5262 basic_string_char grouping_bstr;
5263 basic_string_char groups_found;
5264 int i, basefield, base, groups_no = 0, cur_group = 0;
5265 char *dest_beg = dest, *dest_end = dest+24;
5266 const char *grouping, *groups;
5267 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
5268 const _Cvtvec *cvt;
5270 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
5272 #if _MSVCP_VER <= 100
5273 cvt = &this->cvt;
5274 #else
5275 cvt = &ctype_wchar_use_facet(loc)->cvt;
5276 #endif
5278 for(i=0; i<10; i++)
5279 digits[i] = mb_to_wc('0'+i, cvt);
5280 for(i=0; i<6; i++) {
5281 digits[10+i] = mb_to_wc('a'+i, cvt);
5282 digits[16+i] = mb_to_wc('A'+i, cvt);
5285 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5286 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5287 #if _MSVCP_VER >= 70
5288 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5289 #endif
5291 basefield = fmtflags & FMTFLAG_basefield;
5292 if(basefield == FMTFLAG_oct)
5293 base = 8;
5294 else if(basefield == FMTFLAG_hex)
5295 base = 22; /* equal to the size of digits buffer */
5296 else if(!basefield)
5297 base = 0;
5298 else
5299 base = 10;
5301 istreambuf_iterator_wchar_val(first);
5302 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5303 *dest++ = '-';
5304 istreambuf_iterator_wchar_inc(first);
5305 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5306 *dest++ = '+';
5307 istreambuf_iterator_wchar_inc(first);
5310 if(first->strbuf && first->val==digits[0]) {
5311 found_zero = TRUE;
5312 istreambuf_iterator_wchar_inc(first);
5313 if(first->strbuf && (first->val==mb_to_wc('x', cvt) || first->val==mb_to_wc('X', cvt))) {
5314 if(!base || base == 22) {
5315 found_zero = FALSE;
5316 istreambuf_iterator_wchar_inc(first);
5317 base = 22;
5318 }else {
5319 base = 10;
5321 }else {
5322 error = FALSE;
5323 if(!base) base = 8;
5325 }else {
5326 if(!base) base = 10;
5328 digits[base] = 0;
5330 if(sep) {
5331 MSVCP_basic_string_char_ctor(&groups_found);
5332 if(found_zero) ++groups_no;
5335 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5336 if(!(digits_pos = wcschr(digits, first->val))) {
5337 if(sep && first->val==sep) {
5338 if(!groups_no) break; /* empty group - stop parsing */
5339 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5340 groups_no = 0;
5341 ++cur_group;
5342 }else {
5343 break;
5345 }else {
5346 error = FALSE;
5347 if(dest_empty && first->val == digits[0]) {
5348 found_zero = TRUE;
5349 ++groups_no;
5350 continue;
5352 dest_empty = FALSE;
5353 /* skip digits that can't be copied to dest buffer, other
5354 * functions are responsible for detecting overflows */
5355 if(dest < dest_end)
5356 *dest++ = (digits_pos-digits<10 ? '0'+digits_pos-digits :
5357 (digits_pos-digits<16 ? 'a'+digits_pos-digits-10 :
5358 'A'+digits_pos-digits-16));
5359 if(sep && groups_no<CHAR_MAX)
5360 ++groups_no;
5364 if(sep && groups_no)
5365 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5367 if(!cur_group) { /* no groups, skip loop */
5368 cur_group--;
5369 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
5370 error = TRUE; /* trailing empty */
5371 found_zero = FALSE;
5374 for(; cur_group>=0 && !error; cur_group--) {
5375 if(*grouping == CHAR_MAX) {
5376 if(cur_group)
5377 error = TRUE;
5378 break;
5379 }else if((cur_group && *grouping!=groups[cur_group])
5380 || (!cur_group && *grouping<groups[cur_group])) {
5381 error = TRUE;
5382 break;
5383 }else if(grouping[1]) {
5384 grouping++;
5388 MSVCP_basic_string_char_dtor(&grouping_bstr);
5389 if(sep)
5390 MSVCP_basic_string_char_dtor(&groups_found);
5392 if(error) {
5393 if (found_zero)
5394 *dest++ = '0';
5395 else
5396 dest = dest_beg;
5397 }else if(dest_empty)
5398 *dest++ = '0';
5399 *dest = '\0';
5401 return (base==22 ? 16 : base);
5404 /* ?_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 */
5405 /* ?_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 */
5406 int __cdecl num_get_wchar__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5407 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5409 return num_get__Getifld(this, dest, first, last,
5410 fmtflags, loc, numpunct_wchar_use_facet(loc));
5413 /* ?_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 */
5414 /* ?_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 */
5415 int __cdecl num_get_short__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5416 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5418 return num_get__Getifld(this, dest, first, last,
5419 fmtflags, loc, numpunct_short_use_facet(loc));
5422 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABEH_W000@Z */
5423 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAH_W000@Z */
5424 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABEHGGGG@Z */
5425 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHGGGG@Z */
5426 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar__Hexdig, 20)
5427 int __thiscall MSVCP_num_get_wchar__Hexdig(num_get *this, wchar_t dig, wchar_t e0, wchar_t al, wchar_t au)
5429 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
5430 return -1;
5433 static istreambuf_iterator_wchar* num_get_do_get_void(const num_get *this,
5434 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5435 istreambuf_iterator_wchar last, ios_base *base, int *state,
5436 void **pval, numpunct_wchar *numpunct)
5438 unsigned __int64 v;
5439 char tmp[25], *end;
5440 int err;
5442 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5444 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5445 &last, FMTFLAG_hex, IOS_LOCALE(base), numpunct), &err);
5446 if(v!=(unsigned __int64)((INT_PTR)v))
5447 *state |= IOSTATE_failbit;
5448 else if(end!=tmp && !err)
5449 *pval = (void*)((INT_PTR)v);
5450 else
5451 *state |= IOSTATE_failbit;
5453 if(!first.strbuf)
5454 *state |= IOSTATE_eofbit;
5456 *ret = first;
5457 return ret;
5460 /* ?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 */
5461 /* ?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 */
5462 #if _MSVCP_VER <= 100
5463 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_wchar*, \
5464 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5465 (this, ret, first, last, base, state, pval))
5466 #else
5467 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5468 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5469 (this, ret, first, last, base, state, pval))
5470 #endif
5471 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_void,36)
5472 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5473 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5475 return num_get_do_get_void(this, ret, first, last, base,
5476 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5479 /* ?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 */
5480 /* ?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 */
5481 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_void,36)
5482 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5483 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5485 return num_get_do_get_void(this, ret, first, last, base,
5486 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5489 /* ?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 */
5490 /* ?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 */
5491 /* ?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 */
5492 /* ?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 */
5493 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_void,36)
5494 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5495 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5497 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5498 return call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval);
5501 static istreambuf_iterator_wchar* num_get_do_get_double(const num_get *this,
5502 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5503 istreambuf_iterator_wchar last, ios_base *base, int *state,
5504 double *pval, numpunct_wchar *numpunct)
5506 double v;
5507 char tmp[32], *end;
5508 int err;
5510 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5512 v = _Stodx(tmp, &end, num_get__Getffld(this, tmp, &first, &last, IOS_LOCALE(base), numpunct), &err);
5513 if(end!=tmp && !err)
5514 *pval = v;
5515 else
5516 *state |= IOSTATE_failbit;
5518 if(!first.strbuf)
5519 *state |= IOSTATE_eofbit;
5521 *ret = first;
5522 return ret;
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@AAHAAO@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@AEAHAEAO@Z */
5527 /* ?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 */
5528 /* ?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 */
5529 #if _MSVCP_VER <= 100
5530 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
5531 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5532 (this, ret, first, last, base, state, pval))
5533 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5534 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5535 (this, ret, first, last, base, state, pval))
5536 #else
5537 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5538 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5539 (this, ret, first, last, base, state, pval))
5540 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5541 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5542 (this, ret, first, last, base, state, pval))
5543 #endif
5544 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_double,36)
5545 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5546 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5548 return num_get_do_get_double(this, ret, first, last, base,
5549 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
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@AAHAAO@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@AEAHAEAO@Z */
5554 /* ?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 */
5555 /* ?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 */
5556 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_double,36)
5557 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5558 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5560 return num_get_do_get_double(this, ret, first, last, base,
5561 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5564 /* ?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 */
5565 /* ?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 */
5566 /* ?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 */
5567 /* ?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 */
5568 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ldouble,36)
5569 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ldouble(const num_get *this, istreambuf_iterator_wchar *ret,
5570 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5572 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5573 return call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval);
5576 /* ?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 */
5577 /* ?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 */
5578 /* ?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 */
5579 /* ?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 */
5580 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_double,36)
5581 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5582 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5584 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5585 return call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval);
5588 static istreambuf_iterator_wchar* num_get_do_get_float(const num_get *this,
5589 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5590 istreambuf_iterator_wchar last, ios_base *base, int *state,
5591 float *pval, numpunct_wchar *numpunct)
5593 float v;
5594 char tmp[32], *end;
5595 int err;
5597 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5599 v = _Stofx(tmp, &end, num_get__Getffld(this, tmp, &first,
5600 &last, IOS_LOCALE(base), numpunct), &err);
5601 if(end!=tmp && !err)
5602 *pval = v;
5603 else
5604 *state |= IOSTATE_failbit;
5606 if(!first.strbuf)
5607 *state |= IOSTATE_eofbit;
5609 *ret = first;
5610 return ret;
5613 /* ?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 */
5614 /* ?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 */
5615 #if _MSVCP_VER <= 100
5616 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5617 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5618 (this, ret, first, last, base, state, pval))
5619 #else
5620 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5621 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5622 (this, ret, first, last, base, state, pval))
5623 #endif
5624 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_float,36)
5625 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5626 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5628 return num_get_do_get_float(this, ret, first, last, base,
5629 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5632 /* ?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 */
5633 /* ?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 */
5634 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_float,36)
5635 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5636 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5638 return num_get_do_get_float(this, ret, first, last, base,
5639 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5642 /* ?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 */
5643 /* ?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 */
5644 /* ?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 */
5645 /* ?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 */
5646 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_float,36)
5647 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5648 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5650 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5651 return call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval);
5654 static istreambuf_iterator_wchar* num_get_do_get_uint64(const num_get *this,
5655 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5656 istreambuf_iterator_wchar last, ios_base *base, int *state,
5657 ULONGLONG *pval, numpunct_wchar *numpunct)
5659 unsigned __int64 v;
5660 char tmp[25], *end;
5661 int err;
5663 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5665 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5666 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5667 if(end!=tmp && !err)
5668 *pval = v;
5669 else
5670 *state |= IOSTATE_failbit;
5672 if(!first.strbuf)
5673 *state |= IOSTATE_eofbit;
5675 *ret = first;
5676 return ret;
5679 /* ?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 */
5680 /* ?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 */
5681 #if _MSVCP_VER <= 100
5682 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5683 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5684 (this, ret, first, last, base, state, pval))
5685 #else
5686 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5687 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5688 (this, ret, first, last, base, state, pval))
5689 #endif
5690 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint64,36)
5691 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5692 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5694 return num_get_do_get_uint64(this, ret, first, last, base,
5695 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5698 /* ?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 */
5699 /* ?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 */
5700 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint64,36)
5701 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5702 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5704 return num_get_do_get_uint64(this, ret, first, last, base,
5705 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5708 /* ?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 */
5709 /* ?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 */
5710 /* ?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 */
5711 /* ?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 */
5712 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint64,36)
5713 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5714 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5716 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5717 return call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval);
5720 static istreambuf_iterator_wchar* num_get_do_get_int64(const num_get *this,
5721 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5722 istreambuf_iterator_wchar last, ios_base *base, int *state,
5723 LONGLONG *pval, numpunct_wchar *numpunct)
5725 __int64 v;
5726 char tmp[25], *end;
5727 int err;
5729 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5731 v = _Stollx(tmp, &end, num_get__Getifld(this, tmp, &first,
5732 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5733 if(end!=tmp && !err)
5734 *pval = v;
5735 else
5736 *state |= IOSTATE_failbit;
5738 if(!first.strbuf)
5739 *state |= IOSTATE_eofbit;
5741 *ret = first;
5742 return ret;
5745 /* ?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 */
5746 /* ?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 */
5747 #if _MSVCP_VER <= 100
5748 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5749 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5750 (this, ret, first, last, base, state, pval))
5751 #else
5752 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5753 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5754 (this, ret, first, last, base, state, pval))
5755 #endif
5756 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_int64,36)
5757 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5758 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5760 return num_get_do_get_int64(this, ret, first, last, base,
5761 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5764 /* ?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 */
5765 /* ?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 */
5766 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_int64,36)
5767 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5768 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5770 return num_get_do_get_int64(this, ret, first, last, base,
5771 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5774 /* ?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 */
5775 /* ?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 */
5776 /* ?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 */
5777 /* ?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 */
5778 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_int64,36)
5779 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5780 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5782 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5783 return call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval);
5786 static istreambuf_iterator_wchar* num_get_do_get_ulong(const num_get *this,
5787 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5788 istreambuf_iterator_wchar last, ios_base *base, int *state,
5789 ULONG *pval, numpunct_wchar *numpunct)
5791 ULONG v;
5792 char tmp[25], *end;
5793 int err;
5795 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5797 v = _Stoulx(tmp, &end, num_get__Getifld(this, tmp, &first,
5798 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5799 if(end!=tmp && !err)
5800 *pval = v;
5801 else
5802 *state |= IOSTATE_failbit;
5804 if(!first.strbuf)
5805 *state |= IOSTATE_eofbit;
5807 *ret = first;
5808 return ret;
5811 /* ?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 */
5812 /* ?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 */
5813 #if _MSVCP_VER <= 100
5814 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5815 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5816 (this, ret, first, last, base, state, pval))
5817 #else
5818 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
5819 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5820 (this, ret, first, last, base, state, pval))
5821 #endif
5822 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ulong,36)
5823 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5824 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5826 return num_get_do_get_ulong(this, ret, first, last, base,
5827 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5830 /* ?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 */
5831 /* ?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 */
5832 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ulong,36)
5833 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5834 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5836 return num_get_do_get_ulong(this, ret, first, last, base,
5837 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5840 /* ?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 */
5841 /* ?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 */
5842 /* ?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 */
5843 /* ?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 */
5844 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ulong,36)
5845 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5846 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5848 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5849 return call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval);
5852 static istreambuf_iterator_wchar* num_get_do_get_long(const num_get *this,
5853 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5854 istreambuf_iterator_wchar last, ios_base *base, int *state,
5855 LONG *pval, numpunct_wchar *numpunct)
5857 LONG v;
5858 char tmp[25], *end;
5859 int err;
5861 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5863 v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
5864 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5865 if(end!=tmp && !err)
5866 *pval = v;
5867 else
5868 *state |= IOSTATE_failbit;
5870 if(!first.strbuf)
5871 *state |= IOSTATE_eofbit;
5873 *ret = first;
5874 return ret;
5877 /* ?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 */
5878 /* ?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 */
5879 #if _MSVCP_VER <= 100
5880 #define call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5881 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONG*), \
5882 (this, ret, first, last, base, state, pval))
5883 #else
5884 #define call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_wchar*, \
5885 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONG*), \
5886 (this, ret, first, last, base, state, pval))
5887 #endif
5888 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_long,36)
5889 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5890 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5892 return num_get_do_get_long(this, ret, first, last, base,
5893 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5896 /* ?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 */
5897 /* ?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 */
5898 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_long,36)
5899 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5900 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5902 return num_get_do_get_long(this, ret, first, last, base,
5903 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5906 /* ?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 */
5907 /* ?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 */
5908 /* ?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 */
5909 /* ?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 */
5910 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_long,36)
5911 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5912 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5914 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5915 return call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval);
5918 /* ?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 */
5919 /* ?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 */
5920 #if _MSVCP_VER <= 100
5921 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
5922 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
5923 (this, ret, first, last, base, state, pval))
5924 #else
5925 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
5926 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
5927 (this, ret, first, last, base, state, pval))
5928 #endif
5929 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint,36)
5930 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
5931 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
5933 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5934 return num_get_wchar_do_get_ulong(this, ret, first, last, base, state, (ULONG*)pval);
5937 /* ?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 */
5938 /* ?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 */
5939 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint,36)
5940 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
5941 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
5943 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5944 return num_get_short_do_get_ulong(this, ret, first, last, base, state, (ULONG*)pval);
5947 /* ?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 */
5948 /* ?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 */
5949 /* ?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 */
5950 /* ?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 */
5951 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint,36)
5952 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
5953 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
5955 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5956 return call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval);
5959 /* ?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 */
5960 /* ?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 */
5961 #if _MSVCP_VER <= 100
5962 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_wchar*, \
5963 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
5964 (this, ret, first, last, base, state, pval))
5965 #else
5966 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_wchar*, \
5967 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
5968 (this, ret, first, last, base, state, pval))
5969 #endif
5970 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ushort,36)
5971 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
5972 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
5974 ULONG v;
5975 char tmp[25], *beg, *end;
5976 int err, b;
5978 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5980 b = num_get_wchar__Getifld(this, tmp,
5981 &first, &last, base->fmtfl, IOS_LOCALE(base));
5982 beg = tmp + (tmp[0]=='-' ? 1 : 0);
5983 v = _Stoulx(beg, &end, b, &err);
5985 if(v != (ULONG)((unsigned short)v))
5986 *state |= IOSTATE_failbit;
5987 else if(end!=beg && !err)
5988 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
5989 else
5990 *state |= IOSTATE_failbit;
5992 if(!first.strbuf)
5993 *state |= IOSTATE_eofbit;
5995 *ret = first;
5996 return ret;
5999 /* ?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 */
6000 /* ?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 */
6001 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ushort,36)
6002 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6003 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6005 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
6006 return ret;
6009 /* ?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 */
6010 /* ?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 */
6011 /* ?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@ */
6012 /* ?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 */
6013 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ushort,36)
6014 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6015 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6017 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6018 return call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval);
6021 static istreambuf_iterator_wchar* num_get_do_get_bool(const num_get *this,
6022 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
6023 istreambuf_iterator_wchar last, ios_base *base, int *state,
6024 bool *pval, numpunct_wchar *numpunct)
6026 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6028 if(base->fmtfl & FMTFLAG_boolalpha) {
6029 basic_string_wchar false_bstr, true_bstr;
6030 const wchar_t *pfalse, *ptrue;
6032 numpunct_wchar_falsename(numpunct, &false_bstr);
6033 numpunct_wchar_truename(numpunct, &true_bstr);
6034 pfalse = MSVCP_basic_string_wchar_c_str(&false_bstr);
6035 ptrue = MSVCP_basic_string_wchar_c_str(&true_bstr);
6037 for(istreambuf_iterator_wchar_val(&first); first.strbuf;) {
6038 if(pfalse && *pfalse && first.val!=*pfalse)
6039 pfalse = NULL;
6040 if(ptrue && *ptrue && first.val!=*ptrue)
6041 ptrue = NULL;
6043 if(pfalse && *pfalse && ptrue && !*ptrue)
6044 ptrue = NULL;
6045 if(ptrue && *ptrue && pfalse && !*pfalse)
6046 pfalse = NULL;
6048 if(pfalse)
6049 pfalse++;
6050 if(ptrue)
6051 ptrue++;
6053 if(pfalse || ptrue)
6054 istreambuf_iterator_wchar_inc(&first);
6056 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
6057 break;
6060 if(ptrue)
6061 *pval = TRUE;
6062 else if(pfalse)
6063 *pval = FALSE;
6064 else
6065 *state |= IOSTATE_failbit;
6067 MSVCP_basic_string_wchar_dtor(&false_bstr);
6068 MSVCP_basic_string_wchar_dtor(&true_bstr);
6069 }else {
6070 char tmp[25], *end;
6071 int err;
6072 LONG v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
6073 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
6075 if(end!=tmp && err==0 && (v==0 || v==1))
6076 *pval = v;
6077 else
6078 *state |= IOSTATE_failbit;
6081 if(!first.strbuf)
6082 *state |= IOSTATE_eofbit;
6083 memcpy(ret, &first, sizeof(first));
6084 return ret;
6087 /* ?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 */
6088 /* ?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 */
6089 #if _MSVCP_VER <= 100
6090 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
6091 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, bool*), \
6092 (this, ret, first, last, base, state, pval))
6093 #else
6094 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_wchar*, \
6095 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, bool*), \
6096 (this, ret, first, last, base, state, pval))
6097 #endif
6098 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_bool,36)
6099 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6100 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6102 return num_get_do_get_bool(this, ret, first, last, base,
6103 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
6106 /* ?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 */
6107 /* ?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 */
6108 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_bool,36)
6109 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6110 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6112 return num_get_do_get_bool(this, ret, first, last, base,
6113 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
6116 /* ?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 */
6117 /* ?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 */
6118 /* ?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 */
6119 /* ?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 */
6120 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_bool,36)
6121 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6122 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6124 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6125 return call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval);
6128 /* ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
6129 locale_id num_get_char_id = {0};
6131 /* ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
6132 extern const vtable_ptr num_get_char_vtable;
6134 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
6135 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
6136 DEFINE_THISCALL_WRAPPER(num_get_char__Init, 8)
6137 void __thiscall num_get_char__Init(num_get *this, const _Locinfo *locinfo)
6139 TRACE("(%p %p)\n", this, locinfo);
6140 #if _MSVCP_VER <= 100
6141 _Locinfo__Getcvt(locinfo, &this->cvt);
6142 #endif
6145 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
6146 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
6147 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_locinfo, 12)
6148 num_get* __thiscall num_get_char_ctor_locinfo(num_get *this,
6149 const _Locinfo *locinfo, size_t refs)
6151 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
6153 locale_facet_ctor_refs(&this->facet, refs);
6154 this->facet.vtable = &num_get_char_vtable;
6156 num_get_char__Init(this, locinfo);
6157 return this;
6160 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
6161 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
6162 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_refs, 8)
6163 num_get* __thiscall num_get_char_ctor_refs(num_get *this, size_t refs)
6165 _Locinfo locinfo;
6167 TRACE("(%p %Iu)\n", this, refs);
6169 _Locinfo_ctor(&locinfo);
6170 num_get_char_ctor_locinfo(this, &locinfo, refs);
6171 _Locinfo_dtor(&locinfo);
6172 return this;
6175 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
6176 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
6177 DEFINE_THISCALL_WRAPPER(num_get_char_ctor, 4)
6178 num_get* __thiscall num_get_char_ctor(num_get *this)
6180 return num_get_char_ctor_refs(this, 0);
6183 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
6184 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
6185 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
6186 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
6187 DEFINE_THISCALL_WRAPPER(num_get_char_dtor, 4)
6188 void __thiscall num_get_char_dtor(num_get *this)
6190 TRACE("(%p)\n", this);
6191 locale_facet_dtor(&this->facet);
6194 DEFINE_THISCALL_WRAPPER(num_get_char_vector_dtor, 8)
6195 num_get* __thiscall num_get_char_vector_dtor(num_get *this, unsigned int flags)
6197 TRACE("(%p %x)\n", this, flags);
6198 if(flags & 2) {
6199 /* we have an array, with the number of elements stored before the first object */
6200 INT_PTR i, *ptr = (INT_PTR *)this-1;
6202 for(i=*ptr-1; i>=0; i--)
6203 num_get_char_dtor(this+i);
6204 operator_delete(ptr);
6205 } else {
6206 num_get_char_dtor(this);
6207 if(flags & 1)
6208 operator_delete(this);
6211 return this;
6214 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
6215 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
6216 size_t __cdecl num_get_char__Getcat(const locale_facet **facet, const locale *loc)
6218 TRACE("(%p %p)\n", facet, loc);
6220 if(facet && !*facet) {
6221 _Locinfo locinfo;
6223 *facet = operator_new(sizeof(num_get));
6224 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
6225 num_get_char_ctor_locinfo((num_get*)*facet, &locinfo, 0);
6226 _Locinfo_dtor(&locinfo);
6229 return LC_NUMERIC;
6232 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
6233 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
6234 size_t __cdecl num_get_char__Getcat_old(const locale_facet **facet)
6236 return num_get_char__Getcat(facet, locale_classic());
6239 num_get* num_get_char_use_facet(const locale *loc)
6241 static num_get *obj = NULL;
6243 _Lockit lock;
6244 const locale_facet *fac;
6246 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
6247 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_char_id));
6248 if(fac) {
6249 _Lockit_dtor(&lock);
6250 return (num_get*)fac;
6253 if(obj) {
6254 _Lockit_dtor(&lock);
6255 return obj;
6258 num_get_char__Getcat(&fac, loc);
6259 obj = (num_get*)fac;
6260 call_locale_facet__Incref(&obj->facet);
6261 locale_facet_register(&obj->facet);
6262 _Lockit_dtor(&lock);
6264 return obj;
6267 /* ?_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 */
6268 /* ?_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 */
6269 /* Copies number to dest buffer, validates grouping and skips separators.
6270 * Updates first so it points past the number, all digits are skipped.
6271 * Returns how exponent needs to changed.
6272 * Size of dest buffer is not specified, assuming it's not smaller than 32:
6273 * strlen(+0.e+) + 22(digits) + 4(exponent) + 1(nullbyte)
6275 int __cdecl num_get_char__Getffld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6276 istreambuf_iterator_char *last, const locale *loc)
6278 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6279 basic_string_char grouping_bstr;
6280 basic_string_char groups_found;
6281 int groups_no = 0, cur_group = 0, exp = 0;
6282 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31, sep = 0;
6283 const char *grouping, *groups;
6284 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
6286 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
6288 numpunct_char_grouping(numpunct, &grouping_bstr);
6289 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6290 #if _MSVCP_VER >= 70
6291 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6292 #endif
6294 if(sep)
6295 MSVCP_basic_string_char_ctor(&groups_found);
6297 istreambuf_iterator_char_val(first);
6298 /* get sign */
6299 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6300 *dest++ = first->val;
6301 istreambuf_iterator_char_inc(first);
6304 /* read possibly grouped numbers before decimal */
6305 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6306 if(first->val<'0' || first->val>'9') {
6307 if(sep && first->val==sep) {
6308 if(!groups_no) break; /* empty group - stop parsing */
6309 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6310 groups_no = 0;
6311 ++cur_group;
6312 }else {
6313 break;
6315 }else {
6316 got_digit = TRUE; /* found a digit, zero or non-zero */
6317 /* write digit to dest if not a leading zero (to not waste dest buffer) */
6318 if(!got_nonzero && first->val == '0')
6320 ++groups_no;
6321 continue;
6323 got_nonzero = TRUE;
6324 if(dest < num_end)
6325 *dest++ = first->val;
6326 else
6327 exp++; /* too many digits, just multiply by 10 */
6328 if(sep && groups_no<CHAR_MAX)
6329 ++groups_no;
6333 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
6334 if(got_digit && !got_nonzero)
6335 *dest++ = '0';
6337 /* get decimal, if any */
6338 if(first->strbuf && first->val==numpunct_char_decimal_point(numpunct)) {
6339 if(dest < num_end)
6340 *dest++ = *localeconv()->decimal_point;
6341 istreambuf_iterator_char_inc(first);
6344 /* read non-grouped after decimal */
6345 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6346 if(first->val<'0' || first->val>'9')
6347 break;
6348 else if(dest<num_end) {
6349 got_digit = TRUE;
6350 *dest++ = first->val;
6354 /* read exponent, if any */
6355 if(first->strbuf && (first->val=='e' || first->val=='E')) {
6356 *dest++ = first->val;
6357 istreambuf_iterator_char_inc(first);
6359 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6360 *dest++ = first->val;
6361 istreambuf_iterator_char_inc(first);
6364 got_digit = got_nonzero = FALSE;
6365 error = TRUE;
6366 /* skip any leading zeroes */
6367 for(; first->strbuf && first->val=='0'; istreambuf_iterator_char_inc(first))
6368 got_digit = TRUE;
6370 for(; first->strbuf && first->val>='0' && first->val<='9'; istreambuf_iterator_char_inc(first)) {
6371 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
6372 error = FALSE;
6373 if(dest<exp_end)
6374 *dest++ = first->val;
6377 /* if just found zeroes for exponent, use that */
6378 if(got_digit && !got_nonzero)
6380 error = FALSE;
6381 if(dest<exp_end)
6382 *dest++ = '0';
6386 if(sep && groups_no)
6387 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6389 if(!cur_group) /* no groups, skip loop */
6390 cur_group--;
6391 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
6392 error = TRUE; /* trailing empty */
6394 for(; cur_group>=0 && !error; cur_group--) {
6395 if(*grouping == CHAR_MAX) {
6396 if(cur_group)
6397 error = TRUE;
6398 break;
6399 }else if((cur_group && *grouping!=groups[cur_group])
6400 || (!cur_group && *grouping<groups[cur_group])) {
6401 error = TRUE;
6402 break;
6403 }else if(grouping[1]) {
6404 grouping++;
6407 MSVCP_basic_string_char_dtor(&grouping_bstr);
6408 if(sep)
6409 MSVCP_basic_string_char_dtor(&groups_found);
6411 if(error) {
6412 *dest_beg = '\0';
6413 return 0;
6415 *dest++ = '\0';
6416 return exp;
6419 /* ?_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 */
6420 /* ?_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 */
6421 int __cdecl num_get_char__Getffldx(const num_get *this, char *dest, istreambuf_iterator_char *first,
6422 istreambuf_iterator_char *last, ios_base *ios, int *phexexp)
6424 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
6425 return -1;
6428 /* ?_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 */
6429 /* ?_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 */
6430 /* Copies number to dest buffer, validates grouping and skips separators.
6431 * Updates first so it points past the number, all digits are skipped.
6432 * Returns number base (8, 10 or 16).
6433 * Size of dest buffer is not specified, assuming it's not smaller than 25:
6434 * 22(8^22>2^64)+1(detect overflows)+1(sign)+1(nullbyte) = 25
6436 int __cdecl num_get_char__Getifld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6437 istreambuf_iterator_char *last, int fmtflags, const locale *loc)
6439 static const char digits[] = "0123456789abcdefABCDEF";
6441 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6442 basic_string_char grouping_bstr;
6443 basic_string_char groups_found;
6444 int basefield, base, groups_no = 0, cur_group = 0;
6445 char *dest_beg = dest, *dest_end = dest+24, sep = 0;
6446 const char *grouping, *groups;
6447 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
6449 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
6451 numpunct_char_grouping(numpunct, &grouping_bstr);
6452 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6453 #if _MSVCP_VER >= 70
6454 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6455 #endif
6457 basefield = fmtflags & FMTFLAG_basefield;
6458 if(basefield == FMTFLAG_oct)
6459 base = 8;
6460 else if(basefield == FMTFLAG_hex)
6461 base = 22; /* equal to the size of digits buffer */
6462 else if(!basefield)
6463 base = 0;
6464 else
6465 base = 10;
6467 istreambuf_iterator_char_val(first);
6468 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6469 *dest++ = first->val;
6470 istreambuf_iterator_char_inc(first);
6473 if(first->strbuf && first->val=='0') {
6474 found_zero = TRUE;
6475 istreambuf_iterator_char_inc(first);
6476 if(first->strbuf && (first->val=='x' || first->val=='X')) {
6477 if(!base || base == 22) {
6478 found_zero = FALSE;
6479 istreambuf_iterator_char_inc(first);
6480 base = 22;
6481 }else {
6482 base = 10;
6484 }else {
6485 error = FALSE;
6486 if(!base) base = 8;
6488 }else {
6489 if (!base) base = 10;
6492 if(sep)
6494 MSVCP_basic_string_char_ctor(&groups_found);
6495 if(found_zero) ++groups_no;
6498 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6499 if(!memchr(digits, first->val, base)) {
6500 if(sep && first->val==sep) {
6501 if(!groups_no) break; /* empty group - stop parsing */
6502 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6503 groups_no = 0;
6504 ++cur_group;
6505 }else {
6506 break;
6508 }else {
6509 error = FALSE;
6510 if(dest_empty && first->val == '0')
6512 found_zero = TRUE;
6513 ++groups_no;
6514 continue;
6516 dest_empty = FALSE;
6517 /* skip digits that can't be copied to dest buffer, other
6518 * functions are responsible for detecting overflows */
6519 if(dest < dest_end)
6520 *dest++ = first->val;
6521 if(sep && groups_no<CHAR_MAX)
6522 ++groups_no;
6526 if(sep && groups_no)
6527 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6529 if(!cur_group) { /* no groups, skip loop */
6530 cur_group--;
6531 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
6532 error = TRUE; /* trailing empty */
6533 found_zero = FALSE;
6536 for(; cur_group>=0 && !error; cur_group--) {
6537 if(*grouping == CHAR_MAX) {
6538 if(cur_group)
6539 error = TRUE;
6540 break;
6541 }else if((cur_group && *grouping!=groups[cur_group])
6542 || (!cur_group && *grouping<groups[cur_group])) {
6543 error = TRUE;
6544 break;
6545 }else if(grouping[1]) {
6546 grouping++;
6550 MSVCP_basic_string_char_dtor(&grouping_bstr);
6551 if(sep)
6552 MSVCP_basic_string_char_dtor(&groups_found);
6554 if(error) {
6555 if (found_zero)
6556 *dest++ = '0';
6557 else
6558 dest = dest_beg;
6559 }else if(dest_empty)
6560 *dest++ = '0';
6561 *dest = '\0';
6563 return (base==22 ? 16 : base);
6566 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABEHD000@Z */
6567 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHD000@Z */
6568 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char__Hexdig, 20)
6569 int __thiscall MSVCP_num_get_char__Hexdig(num_get *this, char dig, char e0, char al, char au)
6571 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
6572 return -1;
6575 /* ?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 */
6576 /* ?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 */
6577 #if _MSVCP_VER <= 100
6578 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_char*, \
6579 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6580 (this, ret, first, last, base, state, pval))
6581 #else
6582 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6583 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6584 (this, ret, first, last, base, state, pval))
6585 #endif
6586 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_void,36)
6587 istreambuf_iterator_char *__thiscall num_get_char_do_get_void(const num_get *this, istreambuf_iterator_char *ret,
6588 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6590 unsigned __int64 v;
6591 char tmp[25], *end;
6592 int err;
6594 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6596 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6597 &first, &last, FMTFLAG_hex, IOS_LOCALE(base)), &err);
6598 if(v!=(unsigned __int64)((INT_PTR)v))
6599 *state |= IOSTATE_failbit;
6600 else if(end!=tmp && !err)
6601 *pval = (void*)((INT_PTR)v);
6602 else
6603 *state |= IOSTATE_failbit;
6605 if(!first.strbuf)
6606 *state |= IOSTATE_eofbit;
6608 *ret = first;
6609 return ret;
6612 /* ?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 */
6613 /* ?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 */
6614 DEFINE_THISCALL_WRAPPER(num_get_char_get_void,36)
6615 istreambuf_iterator_char *__thiscall num_get_char_get_void(const num_get *this, istreambuf_iterator_char *ret,
6616 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6618 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6619 return call_num_get_char_do_get_void(this, ret, first, last, base, state, pval);
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@AAHAAO@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@AEAHAEAO@Z */
6624 /* ?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 */
6625 /* ?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 */
6626 #if _MSVCP_VER <= 100
6627 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
6628 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6629 (this, ret, first, last, base, state, pval))
6630 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6631 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6632 (this, ret, first, last, base, state, pval))
6633 #else
6634 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6635 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6636 (this, ret, first, last, base, state, pval))
6637 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6638 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6639 (this, ret, first, last, base, state, pval))
6640 #endif
6641 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_double,36)
6642 istreambuf_iterator_char *__thiscall num_get_char_do_get_double(const num_get *this, istreambuf_iterator_char *ret,
6643 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6645 double v;
6646 char tmp[32], *end;
6647 int err;
6649 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6651 v = _Stodx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6652 if(end!=tmp && !err)
6653 *pval = v;
6654 else
6655 *state |= IOSTATE_failbit;
6657 if(!first.strbuf)
6658 *state |= IOSTATE_eofbit;
6660 *ret = first;
6661 return ret;
6664 /* ?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 */
6665 /* ?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 */
6666 DEFINE_THISCALL_WRAPPER(num_get_char_get_ldouble,36)
6667 istreambuf_iterator_char *__thiscall num_get_char_get_ldouble(const num_get *this, istreambuf_iterator_char *ret,
6668 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6670 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6671 return call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval);
6674 /* ?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 */
6675 /* ?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 */
6676 DEFINE_THISCALL_WRAPPER(num_get_char_get_double,36)
6677 istreambuf_iterator_char *__thiscall num_get_char_get_double(const num_get *this, istreambuf_iterator_char *ret,
6678 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6680 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6681 return call_num_get_char_do_get_double(this, ret, first, last, base, state, pval);
6684 /* ?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 */
6685 /* ?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 */
6686 #if _MSVCP_VER <= 100
6687 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6688 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6689 (this, ret, first, last, base, state, pval))
6690 #else
6691 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6692 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6693 (this, ret, first, last, base, state, pval))
6694 #endif
6695 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_float,36)
6696 istreambuf_iterator_char *__thiscall num_get_char_do_get_float(const num_get *this, istreambuf_iterator_char *ret,
6697 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6699 float v;
6700 char tmp[32], *end;
6701 int err;
6703 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6705 v = _Stofx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6706 if(end!=tmp && !err)
6707 *pval = v;
6708 else
6709 *state |= IOSTATE_failbit;
6711 if(!first.strbuf)
6712 *state |= IOSTATE_eofbit;
6714 *ret = first;
6715 return ret;
6718 /* ?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 */
6719 /* ?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 */
6720 DEFINE_THISCALL_WRAPPER(num_get_char_get_float,36)
6721 istreambuf_iterator_char *__thiscall num_get_char_get_float(const num_get *this, istreambuf_iterator_char *ret,
6722 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6724 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6725 return call_num_get_char_do_get_float(this, ret, first, last, base, state, pval);
6728 /* ?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 */
6729 /* ?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 */
6730 #if _MSVCP_VER <= 100
6731 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6732 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6733 (this, ret, first, last, base, state, pval))
6734 #else
6735 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6736 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6737 (this, ret, first, last, base, state, pval))
6738 #endif
6739 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint64,36)
6740 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6741 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6743 unsigned __int64 v;
6744 char tmp[25], *end;
6745 int err;
6747 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6749 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6750 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6751 if(end!=tmp && !err)
6752 *pval = v;
6753 else
6754 *state |= IOSTATE_failbit;
6756 if(!first.strbuf)
6757 *state |= IOSTATE_eofbit;
6759 *ret = first;
6760 return ret;
6763 /* ?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 */
6764 /* ?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 */
6765 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint64,36)
6766 istreambuf_iterator_char *__thiscall num_get_char_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6767 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6769 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6770 return call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval);
6773 /* ?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 */
6774 /* ?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 */
6775 #if _MSVCP_VER <= 100
6776 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6777 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6778 (this, ret, first, last, base, state, pval))
6779 #else
6780 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6781 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6782 (this, ret, first, last, base, state, pval))
6783 #endif
6784 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_int64,36)
6785 istreambuf_iterator_char *__thiscall num_get_char_do_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6786 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6788 __int64 v;
6789 char tmp[25], *end;
6790 int err;
6792 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6794 v = _Stollx(tmp, &end, num_get_char__Getifld(this, tmp,
6795 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6796 if(end!=tmp && !err)
6797 *pval = v;
6798 else
6799 *state |= IOSTATE_failbit;
6801 if(!first.strbuf)
6802 *state |= IOSTATE_eofbit;
6804 *ret = first;
6805 return ret;
6808 /* ?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 */
6809 /* ?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 */
6810 DEFINE_THISCALL_WRAPPER(num_get_char_get_int64,36)
6811 istreambuf_iterator_char *__thiscall num_get_char_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6812 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6814 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6815 return call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval);
6818 /* ?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 */
6819 /* ?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 */
6820 #if _MSVCP_VER <= 100
6821 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6822 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6823 (this, ret, first, last, base, state, pval))
6824 #else
6825 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
6826 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6827 (this, ret, first, last, base, state, pval))
6828 #endif
6829 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ulong,36)
6830 istreambuf_iterator_char *__thiscall num_get_char_do_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6831 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6833 ULONG v;
6834 char tmp[25], *end;
6835 int err;
6837 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6839 v = _Stoulx(tmp, &end, num_get_char__Getifld(this, tmp,
6840 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6841 if(end!=tmp && !err)
6842 *pval = v;
6843 else
6844 *state |= IOSTATE_failbit;
6846 if(!first.strbuf)
6847 *state |= IOSTATE_eofbit;
6849 *ret = first;
6850 return ret;
6853 /* ?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 */
6854 /* ?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 */
6855 DEFINE_THISCALL_WRAPPER(num_get_char_get_ulong,36)
6856 istreambuf_iterator_char *__thiscall num_get_char_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6857 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6859 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6860 return call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
6863 /* ?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 */
6864 /* ?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 */
6865 #if _MSVCP_VER <= 100
6866 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6867 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6868 (this, ret, first, last, base, state, pval))
6869 #else
6870 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
6871 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6872 (this, ret, first, last, base, state, pval))
6873 #endif
6874 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_long,36)
6875 istreambuf_iterator_char *__thiscall num_get_char_do_get_long(const num_get *this, istreambuf_iterator_char *ret,
6876 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
6878 LONG v;
6879 char tmp[25], *end;
6880 int err;
6882 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6884 v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
6885 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6886 if(end!=tmp && !err)
6887 *pval = v;
6888 else
6889 *state |= IOSTATE_failbit;
6891 if(!first.strbuf)
6892 *state |= IOSTATE_eofbit;
6894 *ret = first;
6895 return ret;
6898 /* ?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 */
6899 /* ?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 */
6900 DEFINE_THISCALL_WRAPPER(num_get_char_get_long,36)
6901 istreambuf_iterator_char *__thiscall num_get_char_get_long(const num_get *this, istreambuf_iterator_char *ret,
6902 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
6904 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6905 return call_num_get_char_do_get_long(this, ret, first, last, base, state, pval);
6908 /* ?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 */
6909 /* ?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 */
6910 #if _MSVCP_VER <= 100
6911 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
6912 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
6913 (this, ret, first, last, base, state, pval))
6914 #else
6915 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
6916 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
6917 (this, ret, first, last, base, state, pval))
6918 #endif
6919 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint,36)
6920 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint(const num_get *this, istreambuf_iterator_char *ret,
6921 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
6923 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6924 return num_get_char_do_get_ulong(this, ret, first, last, base, state, (ULONG*)pval);
6927 /* ?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 */
6928 /* ?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 */
6929 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint,36)
6930 istreambuf_iterator_char *__thiscall num_get_char_get_uint(const num_get *this, istreambuf_iterator_char *ret,
6931 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
6933 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6934 return call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval);
6937 /* ?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 */
6938 /* ?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 */
6939 #if _MSVCP_VER <= 100
6940 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
6941 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
6942 (this, ret, first, last, base, state, pval))
6943 #else
6944 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_char*, \
6945 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
6946 (this, ret, first, last, base, state, pval))
6947 #endif
6948 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ushort,36)
6949 istreambuf_iterator_char *__thiscall num_get_char_do_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
6950 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
6952 ULONG v;
6953 char tmp[25], *beg, *end;
6954 int err, b;
6956 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6958 b = num_get_char__Getifld(this, tmp,
6959 &first, &last, base->fmtfl, IOS_LOCALE(base));
6960 beg = tmp + (tmp[0]=='-' ? 1 : 0);
6961 v = _Stoulx(beg, &end, b, &err);
6963 if(v != (ULONG)((unsigned short)v))
6964 *state |= IOSTATE_failbit;
6965 else if(end!=beg && !err)
6966 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
6967 else
6968 *state |= IOSTATE_failbit;
6970 if(!first.strbuf)
6971 *state |= IOSTATE_eofbit;
6973 *ret = first;
6974 return ret;
6977 /* ?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 */
6978 /* ?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 */
6979 DEFINE_THISCALL_WRAPPER(num_get_char_get_ushort,36)
6980 istreambuf_iterator_char *__thiscall num_get_char_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
6981 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
6983 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6984 return call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval);
6987 /* ?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 */
6988 /* ?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 */
6989 #if _MSVCP_VER <= 100
6990 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
6991 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, bool*), \
6992 (this, ret, first, last, base, state, pval))
6993 #else
6994 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_char*, \
6995 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, bool*), \
6996 (this, ret, first, last, base, state, pval))
6997 #endif
6998 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_bool,36)
6999 istreambuf_iterator_char *__thiscall num_get_char_do_get_bool(const num_get *this, istreambuf_iterator_char *ret,
7000 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, bool *pval)
7002 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7004 if(base->fmtfl & FMTFLAG_boolalpha) {
7005 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7006 basic_string_char false_bstr, true_bstr;
7007 const char *pfalse, *ptrue;
7009 numpunct_char_falsename(numpunct, &false_bstr);
7010 numpunct_char_truename(numpunct, &true_bstr);
7011 pfalse = MSVCP_basic_string_char_c_str(&false_bstr);
7012 ptrue = MSVCP_basic_string_char_c_str(&true_bstr);
7014 for(istreambuf_iterator_char_val(&first); first.strbuf;) {
7015 if(pfalse && *pfalse && first.val!=*pfalse)
7016 pfalse = NULL;
7017 if(ptrue && *ptrue && first.val!=*ptrue)
7018 ptrue = NULL;
7020 if(pfalse && *pfalse && ptrue && !*ptrue)
7021 ptrue = NULL;
7022 if(ptrue && *ptrue && pfalse && !*pfalse)
7023 pfalse = NULL;
7025 if(pfalse)
7026 pfalse++;
7027 if(ptrue)
7028 ptrue++;
7030 if(pfalse || ptrue)
7031 istreambuf_iterator_char_inc(&first);
7033 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
7034 break;
7037 if(ptrue)
7038 *pval = TRUE;
7039 else if(pfalse)
7040 *pval = FALSE;
7041 else
7042 *state |= IOSTATE_failbit;
7044 MSVCP_basic_string_char_dtor(&false_bstr);
7045 MSVCP_basic_string_char_dtor(&true_bstr);
7046 }else {
7047 char tmp[25], *end;
7048 int err;
7049 LONG v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
7050 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
7052 if(end!=tmp && err==0 && (v==0 || v==1))
7053 *pval = v;
7054 else
7055 *state |= IOSTATE_failbit;
7058 if(!first.strbuf)
7059 *state |= IOSTATE_eofbit;
7060 memcpy(ret, &first, sizeof(first));
7061 return ret;
7064 /* ?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 */
7065 /* ?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 */
7066 DEFINE_THISCALL_WRAPPER(num_get_char_get_bool,36)
7067 istreambuf_iterator_char *__thiscall num_get_char_get_bool(const num_get *this, istreambuf_iterator_char *ret,
7068 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, bool *pval)
7070 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7071 return call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval);
7074 /* ?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
7075 locale_id num_put_char_id = {0};
7077 /* num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
7078 extern const vtable_ptr num_put_char_vtable;
7080 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7081 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7082 DEFINE_THISCALL_WRAPPER(num_put_char__Init, 8)
7083 void __thiscall num_put_char__Init(num_put *this, const _Locinfo *locinfo)
7085 TRACE("(%p %p)\n", this, locinfo);
7086 #if _MSVCP_VER < 110
7087 _Locinfo__Getcvt(locinfo, &this->cvt);
7088 #endif
7091 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7092 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7093 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_locinfo, 12)
7094 num_put* __thiscall num_put_char_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7096 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
7098 locale_facet_ctor_refs(&this->facet, refs);
7099 this->facet.vtable = &num_put_char_vtable;
7101 num_put_char__Init(this, locinfo);
7102 return this;
7105 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
7106 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
7107 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_refs, 8)
7108 num_put* __thiscall num_put_char_ctor_refs(num_put *this, size_t refs)
7110 _Locinfo locinfo;
7112 TRACE("(%p %Iu)\n", this, refs);
7114 _Locinfo_ctor(&locinfo);
7115 num_put_char_ctor_locinfo(this, &locinfo, refs);
7116 _Locinfo_dtor(&locinfo);
7117 return this;
7120 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
7121 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
7122 DEFINE_THISCALL_WRAPPER(num_put_char_ctor, 4)
7123 num_put* __thiscall num_put_char_ctor(num_put *this)
7125 return num_put_char_ctor_refs(this, 0);
7128 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
7129 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
7130 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
7131 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
7132 DEFINE_THISCALL_WRAPPER(num_put_char_dtor, 4)
7133 void __thiscall num_put_char_dtor(num_put *this)
7135 TRACE("(%p)\n", this);
7136 locale_facet_dtor(&this->facet);
7139 DEFINE_THISCALL_WRAPPER(num_put_char_vector_dtor, 8)
7140 num_put* __thiscall num_put_char_vector_dtor(num_put *this, unsigned int flags)
7142 TRACE("(%p %x)\n", this, flags);
7143 if(flags & 2) {
7144 /* we have an array, with the number of elements stored before the first object */
7145 INT_PTR i, *ptr = (INT_PTR *)this-1;
7147 for(i=*ptr-1; i>=0; i--)
7148 num_put_char_dtor(this+i);
7149 operator_delete(ptr);
7150 } else {
7151 num_put_char_dtor(this);
7152 if(flags & 1)
7153 operator_delete(this);
7156 return this;
7159 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7160 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7161 size_t __cdecl num_put_char__Getcat(const locale_facet **facet, const locale *loc)
7163 TRACE("(%p %p)\n", facet, loc);
7165 if(facet && !*facet) {
7166 _Locinfo locinfo;
7168 *facet = operator_new(sizeof(num_put));
7169 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7170 num_put_char_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7171 _Locinfo_dtor(&locinfo);
7174 return LC_NUMERIC;
7177 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7178 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7179 size_t __cdecl num_put_char__Getcat_old(const locale_facet **facet)
7181 return num_put_char__Getcat(facet, locale_classic());
7184 num_put* num_put_char_use_facet(const locale *loc)
7186 static num_put *obj = NULL;
7188 _Lockit lock;
7189 const locale_facet *fac;
7191 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
7192 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_char_id));
7193 if(fac) {
7194 _Lockit_dtor(&lock);
7195 return (num_put*)fac;
7198 if(obj) {
7199 _Lockit_dtor(&lock);
7200 return obj;
7203 num_put_char__Getcat(&fac, loc);
7204 obj = (num_put*)fac;
7205 call_locale_facet__Incref(&obj->facet);
7206 locale_facet_register(&obj->facet);
7207 _Lockit_dtor(&lock);
7209 return obj;
7212 /* ?_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 */
7213 /* ?_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 */
7214 ostreambuf_iterator_char* __cdecl num_put_char__Put(const num_put *this, ostreambuf_iterator_char *ret,
7215 ostreambuf_iterator_char dest, const char *ptr, size_t count)
7217 TRACE("(%p %p %p %Iu)\n", this, ret, ptr, count);
7219 for(; count>0; count--)
7220 ostreambuf_iterator_char_put(&dest, *ptr++);
7222 *ret = dest;
7223 return ret;
7226 /* ?_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 */
7227 /* ?_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 */
7228 ostreambuf_iterator_char* __cdecl num_put_char__Putc(const num_put *this, ostreambuf_iterator_char *ret,
7229 ostreambuf_iterator_char dest, const char *ptr, size_t count)
7231 TRACE("(%p %p %p %Iu)\n", this, ret, ptr, count);
7233 for(; count>0; count--)
7234 ostreambuf_iterator_char_put(&dest, *ptr++);
7236 *ret = dest;
7237 return ret;
7240 /* ?_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 */
7241 /* ?_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 */
7242 ostreambuf_iterator_char* __cdecl num_put_char__Putgrouped(const num_put *this, ostreambuf_iterator_char *ret,
7243 ostreambuf_iterator_char dest, const char *ptr, size_t count, char delim)
7245 FIXME("(%p %p %p %Iu %d) stub\n", this, ret, ptr, count, delim);
7246 return NULL;
7249 /* ?_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 */
7250 /* ?_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 */
7251 ostreambuf_iterator_char* __cdecl num_put_char__Rep(const num_put *this, ostreambuf_iterator_char *ret,
7252 ostreambuf_iterator_char dest, char c, size_t count)
7254 TRACE("(%p %p %d %Iu)\n", this, ret, c, count);
7256 for(; count>0; count--)
7257 ostreambuf_iterator_char_put(&dest, c);
7259 *ret = dest;
7260 return ret;
7263 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADDH@Z */
7264 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADDH@Z */
7265 char* __cdecl num_put_char__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
7267 int type = fmtfl & FMTFLAG_floatfield;
7268 char *p = fmt;
7270 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
7272 *p++ = '%';
7273 if(fmtfl & FMTFLAG_showpos)
7274 *p++ = '+';
7275 if(fmtfl & FMTFLAG_showpoint)
7276 *p++ = '#';
7277 *p++ = '.';
7278 *p++ = '*';
7279 if(spec)
7280 *p++ = spec;
7282 if(type == FMTFLAG_fixed)
7283 *p++ = 'f';
7284 else if(type == FMTFLAG_scientific)
7285 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
7286 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
7287 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
7288 else
7289 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
7291 *p++ = '\0';
7292 return fmt;
7295 /* ?_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 */
7296 /* ?_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 */
7297 ostreambuf_iterator_char* __cdecl num_put_char__Fput(const num_put *this, ostreambuf_iterator_char *ret,
7298 ostreambuf_iterator_char dest, ios_base *base, char fill, const char *buf, size_t bef_point,
7299 size_t aft_point, size_t trailing, size_t count)
7301 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
7302 fill, buf, bef_point, aft_point, trailing, count);
7303 return NULL;
7306 /* TODO: This function should be removed when num_put_char__Fput is implemented */
7307 static ostreambuf_iterator_char* num_put_char_fput(const num_put *this, ostreambuf_iterator_char *ret,
7308 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, size_t count)
7310 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7311 basic_string_char grouping_bstr;
7312 const char *grouping;
7313 char *p, sep = 0, dec_point = *localeconv()->decimal_point;
7314 int cur_group = 0, group_size = 0;
7315 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7316 size_t pad;
7318 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
7320 /* Change decimal point */
7321 for(p=buf; p<buf+count; p++) {
7322 if(*p == dec_point) {
7323 *p = numpunct_char_decimal_point(numpunct);
7324 break;
7327 p--;
7329 /* Add separators to number */
7330 numpunct_char_grouping(numpunct, &grouping_bstr);
7331 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7332 #if _MSVCP_VER >= 70
7333 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7334 #endif
7336 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7337 group_size++;
7338 if(group_size == grouping[cur_group]) {
7339 group_size = 0;
7340 if(grouping[cur_group+1])
7341 cur_group++;
7343 memmove(p+1, p, buf+count-p);
7344 *p = sep;
7345 count++;
7348 MSVCP_basic_string_char_dtor(&grouping_bstr);
7350 /* Display number with padding */
7351 if(count >= base->wide)
7352 pad = 0;
7353 else
7354 pad = base->wide-count;
7355 base->wide = 0;
7357 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7358 num_put_char__Putc(this, &dest, dest, buf, 1);
7359 buf++;
7361 if(adjustfield != FMTFLAG_left) {
7362 num_put_char__Rep(this, ret, dest, fill, pad);
7363 pad = 0;
7365 num_put_char__Putc(this, &dest, dest, buf, count);
7366 return num_put_char__Rep(this, ret, dest, fill, pad);
7369 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADPBDH@Z */
7370 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
7371 char* __cdecl num_put_char__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
7373 int base = fmtfl & FMTFLAG_basefield;
7374 char *p = fmt;
7376 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
7378 *p++ = '%';
7379 if(fmtfl & FMTFLAG_showpos)
7380 *p++ = '+';
7381 if(fmtfl & FMTFLAG_showbase)
7382 *p++ = '#';
7384 *p++ = *spec++;
7385 if(*spec == 'l')
7386 *p++ = *spec++;
7388 if(base == FMTFLAG_oct)
7389 *p++ = 'o';
7390 else if(base == FMTFLAG_hex)
7391 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
7392 else
7393 *p++ = *spec;
7395 *p++ = '\0';
7396 return fmt;
7399 /* ?_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 */
7400 /* ?_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 */
7401 ostreambuf_iterator_char* __cdecl num_put_char__Iput(const num_put *this, ostreambuf_iterator_char *ret,
7402 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, size_t count)
7404 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7405 basic_string_char grouping_bstr;
7406 const char *grouping;
7407 char *p, sep = 0;
7408 int cur_group = 0, group_size = 0;
7409 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7410 size_t pad;
7412 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
7414 /* Add separators to number */
7415 numpunct_char_grouping(numpunct, &grouping_bstr);
7416 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7417 #if _MSVCP_VER >= 70
7418 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7419 #endif
7421 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7422 group_size++;
7423 if(group_size == grouping[cur_group]) {
7424 group_size = 0;
7425 if(grouping[cur_group+1])
7426 cur_group++;
7428 memmove(p+1, p, buf+count-p);
7429 *p = sep;
7430 count++;
7433 MSVCP_basic_string_char_dtor(&grouping_bstr);
7435 /* Display number with padding */
7436 if(count >= base->wide)
7437 pad = 0;
7438 else
7439 pad = base->wide-count;
7440 base->wide = 0;
7442 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7443 num_put_char__Putc(this, &dest, dest, buf, 1);
7444 buf++;
7445 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
7446 num_put_char__Putc(this, &dest, dest, buf, 2);
7447 buf += 2;
7449 if(adjustfield != FMTFLAG_left) {
7450 num_put_char__Rep(this, ret, dest, fill, pad);
7451 pad = 0;
7453 num_put_char__Putc(this, &dest, dest, buf, count);
7454 return num_put_char__Rep(this, ret, dest, fill, pad);
7457 /* ?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 */
7458 /* ?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 */
7459 #if _MSVCP_VER <= 100
7460 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7461 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7462 (this, ret, dest, base, fill, v))
7463 #else
7464 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_char*, \
7465 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7466 (this, ret, dest, base, fill, v))
7467 #endif
7468 #if _MSVCP_VER != 80
7469 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 28)
7470 #else
7471 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 32)
7472 #endif
7473 ostreambuf_iterator_char* __thiscall num_put_char_do_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7474 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7476 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7477 char fmt[7]; /* strlen("%+#lld")+1 */
7479 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7481 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7482 sprintf(tmp, num_put_char__Ifmt(this, fmt, "ld", base->fmtfl), v));
7485 /* ?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 */
7486 /* ?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 */
7487 #if _MSVCP_VER != 80
7488 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 28)
7489 #else
7490 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 32)
7491 #endif
7492 ostreambuf_iterator_char* __thiscall num_put_char_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7493 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7495 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7496 return call_num_put_char_do_put_long(this, ret, dest, base, fill, v);
7499 /* ?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 */
7500 /* ?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 */
7501 #if _MSVCP_VER <= 100
7502 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7503 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7504 (this, ret, dest, base, fill, v))
7505 #else
7506 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7507 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7508 (this, ret, dest, base, fill, v))
7509 #endif
7510 #if _MSVCP_VER != 80
7511 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 28)
7512 #else
7513 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 32)
7514 #endif
7515 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7516 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7518 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7519 char fmt[7]; /* strlen("%+#lld")+1 */
7521 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7523 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7524 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lu", base->fmtfl), v));
7527 /* ?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 */
7528 /* ?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 */
7529 #if _MSVCP_VER != 80
7530 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 28)
7531 #else
7532 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 32)
7533 #endif
7534 ostreambuf_iterator_char* __thiscall num_put_char_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7535 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7537 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
7538 return call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v);
7541 static inline unsigned get_precision(const ios_base *base)
7543 streamsize ret = base->prec <= 0 && !(base->fmtfl & FMTFLAG_fixed) ? 6 : base->prec;
7544 if(ret > UINT_MAX)
7545 ret = UINT_MAX;
7546 return ret;
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@DN@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@DN@Z */
7551 /* ?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 */
7552 /* ?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 */
7553 #if _MSVCP_VER <= 100
7554 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7555 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7556 (this, ret, dest, base, fill, v))
7557 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_char*, \
7558 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7559 (this, ret, dest, base, fill, v))
7560 #else
7561 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7562 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7563 (this, ret, dest, base, fill, v))
7564 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7565 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7566 (this, ret, dest, base, fill, v))
7567 #endif
7568 #if _MSVCP_VER != 80
7569 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 32)
7570 #else
7571 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 36)
7572 #endif
7573 ostreambuf_iterator_char* __thiscall num_put_char_do_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7574 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7576 char *tmp;
7577 char fmt[8]; /* strlen("%+#.*lg")+1 */
7578 int size;
7579 unsigned prec;
7581 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7583 num_put_char__Ffmt(this, fmt, '\0', base->fmtfl);
7584 prec = get_precision(base);
7585 size = _scprintf(fmt, prec, v);
7587 /* TODO: don't use dynamic allocation */
7588 tmp = operator_new(size*2);
7589 num_put_char_fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v));
7590 operator_delete(tmp);
7591 return ret;
7594 /* ?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 */
7595 /* ?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 */
7596 #if _MSVCP_VER != 80
7597 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 32)
7598 #else
7599 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 36)
7600 #endif
7601 ostreambuf_iterator_char* __thiscall num_put_char_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7602 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7604 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7605 return call_num_put_char_do_put_double(this, ret, dest, base, fill, v);
7608 /* ?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 */
7609 /* ?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 */
7610 #if _MSVCP_VER != 80
7611 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 32)
7612 #else
7613 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 36)
7614 #endif
7615 ostreambuf_iterator_char* __thiscall num_put_char_put_ldouble(const num_put *this, ostreambuf_iterator_char *ret,
7616 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7618 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7619 return call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v);
7622 /* ?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 */
7623 /* ?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 */
7624 #if _MSVCP_VER <= 100
7625 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
7626 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7627 (this, ret, dest, base, fill, v))
7628 #else
7629 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7630 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7631 (this, ret, dest, base, fill, v))
7632 #endif
7633 #if _MSVCP_VER != 80
7634 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 28)
7635 #else
7636 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 32)
7637 #endif
7638 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7639 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7641 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
7643 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7645 return num_put_char__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
7648 /* ?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 */
7649 /* ?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 */
7650 #if _MSVCP_VER != 80
7651 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 28)
7652 #else
7653 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 32)
7654 #endif
7655 ostreambuf_iterator_char* __thiscall num_put_char_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7656 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7658 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7659 return call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v);
7662 /* ?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 */
7663 /* ?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 */
7664 #if _MSVCP_VER <= 100
7665 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7666 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7667 (this, ret, dest, base, fill, v))
7668 #else
7669 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7670 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7671 (this, ret, dest, base, fill, v))
7672 #endif
7673 #if _MSVCP_VER != 80
7674 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 32)
7675 #else
7676 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 36)
7677 #endif
7678 ostreambuf_iterator_char* __thiscall num_put_char_do_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7679 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7681 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7682 char fmt[7]; /* strlen("%+#lld")+1 */
7684 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7686 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7687 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lld", base->fmtfl), v));
7690 /* ?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 */
7691 /* ?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 */
7692 #if _MSVCP_VER != 80
7693 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 32)
7694 #else
7695 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 36)
7696 #endif
7697 ostreambuf_iterator_char* __thiscall num_put_char_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7698 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7700 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7701 return call_num_put_char_do_put_int64(this, ret, dest, base, fill, v);
7704 /* ?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 */
7705 /* ?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 */
7706 #if _MSVCP_VER <= 100
7707 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7708 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7709 (this, ret, dest, base, fill, v))
7710 #else
7711 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7712 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7713 (this, ret, dest, base, fill, v))
7714 #endif
7715 #if _MSVCP_VER != 80
7716 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 32)
7717 #else
7718 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 36)
7719 #endif
7720 ostreambuf_iterator_char* __thiscall num_put_char_do_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7721 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7723 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7724 char fmt[7]; /* strlen("%+#lld")+1 */
7726 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7728 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7729 sprintf(tmp, num_put_char__Ifmt(this, fmt, "llu", base->fmtfl), v));
7732 /* ?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 */
7733 /* ?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 */
7734 #if _MSVCP_VER != 80
7735 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 32)
7736 #else
7737 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 36)
7738 #endif
7739 ostreambuf_iterator_char* __thiscall num_put_char_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7740 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7742 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7743 return call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v);
7746 /* ?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 */
7747 /* ?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 */
7748 #if _MSVCP_VER <= 100
7749 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7750 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, bool), \
7751 (this, ret, dest, base, fill, v))
7752 #else
7753 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_char*, \
7754 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, bool), \
7755 (this, ret, dest, base, fill, v))
7756 #endif
7757 #if _MSVCP_VER != 80
7758 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 28)
7759 #else
7760 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 32)
7761 #endif
7762 ostreambuf_iterator_char* __thiscall num_put_char_do_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7763 ostreambuf_iterator_char dest, ios_base *base, char fill, bool v)
7765 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7767 if(base->fmtfl & FMTFLAG_boolalpha) {
7768 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7769 basic_string_char str;
7770 size_t pad, len;
7772 if(v)
7773 numpunct_char_truename(numpunct, &str);
7774 else
7775 numpunct_char_falsename(numpunct, &str);
7777 len = MSVCP_basic_string_char_length(&str);
7778 pad = (len>base->wide ? 0 : base->wide-len);
7779 base->wide = 0;
7781 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
7782 num_put_char__Rep(this, &dest, dest, fill, pad);
7783 pad = 0;
7785 num_put_char__Putc(this, &dest, dest, MSVCP_basic_string_char_c_str(&str), len);
7786 MSVCP_basic_string_char_dtor(&str);
7787 return num_put_char__Rep(this, ret, dest, fill, pad);
7790 return num_put_char_put_long(this, ret, dest, base, fill, v);
7793 /* ?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 */
7794 /* ?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 */
7795 #if _MSVCP_VER != 80
7796 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 28)
7797 #else
7798 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 32)
7799 #endif
7800 ostreambuf_iterator_char* __thiscall num_put_char_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7801 ostreambuf_iterator_char dest, ios_base *base, char fill, bool v)
7803 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7804 return call_num_put_char_do_put_bool(this, ret, dest, base, fill, v);
7807 /* ?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
7808 locale_id num_put_wchar_id = {0};
7809 /* ?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
7810 locale_id num_put_short_id = {0};
7812 /* num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
7813 extern const vtable_ptr num_put_wchar_vtable;
7814 /* num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
7815 extern const vtable_ptr num_put_short_vtable;
7817 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7818 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7819 DEFINE_THISCALL_WRAPPER(num_put_wchar__Init, 8)
7820 void __thiscall num_put_wchar__Init(num_put *this, const _Locinfo *locinfo)
7822 TRACE("(%p %p)\n", this, locinfo);
7823 #if _MSVCP_VER < 110
7824 _Locinfo__Getcvt(locinfo, &this->cvt);
7825 #endif
7828 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7829 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7830 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_locinfo, 12)
7831 num_put* __thiscall num_put_wchar_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7833 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
7835 locale_facet_ctor_refs(&this->facet, refs);
7836 this->facet.vtable = &num_put_wchar_vtable;
7838 num_put_wchar__Init(this, locinfo);
7839 return this;
7842 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7843 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7844 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_locinfo, 12)
7845 num_put* __thiscall num_put_short_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7847 num_put_wchar_ctor_locinfo(this, locinfo, refs);
7848 this->facet.vtable = &num_put_short_vtable;
7849 return this;
7852 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
7853 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
7854 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_refs, 8)
7855 num_put* __thiscall num_put_wchar_ctor_refs(num_put *this, size_t refs)
7857 _Locinfo locinfo;
7859 TRACE("(%p %Iu)\n", this, refs);
7861 _Locinfo_ctor(&locinfo);
7862 num_put_wchar_ctor_locinfo(this, &locinfo, refs);
7863 _Locinfo_dtor(&locinfo);
7864 return this;
7867 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
7868 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
7869 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_refs, 8)
7870 num_put* __thiscall num_put_short_ctor_refs(num_put *this, size_t refs)
7872 num_put_wchar_ctor_refs(this, refs);
7873 this->facet.vtable = &num_put_short_vtable;
7874 return this;
7877 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
7878 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
7879 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor, 4)
7880 num_put* __thiscall num_put_wchar_ctor(num_put *this)
7882 return num_put_wchar_ctor_refs(this, 0);
7885 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
7886 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
7887 DEFINE_THISCALL_WRAPPER(num_put_short_ctor, 4)
7888 num_put* __thiscall num_put_short_ctor(num_put *this)
7890 return num_put_short_ctor_refs(this, 0);
7893 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
7894 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
7895 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
7896 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
7897 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
7898 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
7899 DEFINE_THISCALL_WRAPPER(num_put_wchar_dtor, 4)
7900 void __thiscall num_put_wchar_dtor(num_put *this)
7902 TRACE("(%p)\n", this);
7903 locale_facet_dtor(&this->facet);
7906 DEFINE_THISCALL_WRAPPER(num_put_wchar_vector_dtor, 8)
7907 num_put* __thiscall num_put_wchar_vector_dtor(num_put *this, unsigned int flags)
7909 TRACE("(%p %x)\n", this, flags);
7910 if(flags & 2) {
7911 /* we have an array, with the number of elements stored before the first object */
7912 INT_PTR i, *ptr = (INT_PTR *)this-1;
7914 for(i=*ptr-1; i>=0; i--)
7915 num_put_wchar_dtor(this+i);
7916 operator_delete(ptr);
7917 } else {
7918 num_put_wchar_dtor(this);
7919 if(flags & 1)
7920 operator_delete(this);
7923 return this;
7926 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7927 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7928 size_t __cdecl num_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
7930 TRACE("(%p %p)\n", facet, loc);
7932 if(facet && !*facet) {
7933 _Locinfo locinfo;
7935 *facet = operator_new(sizeof(num_put));
7936 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7937 num_put_wchar_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7938 _Locinfo_dtor(&locinfo);
7941 return LC_NUMERIC;
7944 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7945 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7946 size_t __cdecl num_put_wchar__Getcat_old(const locale_facet **facet)
7948 return num_put_wchar__Getcat(facet, locale_classic());
7951 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7952 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7953 size_t __cdecl num_put_short__Getcat(const locale_facet **facet, const locale *loc)
7955 TRACE("(%p %p)\n", facet, loc);
7957 if(facet && !*facet) {
7958 _Locinfo locinfo;
7960 *facet = operator_new(sizeof(num_put));
7961 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7962 num_put_short_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7963 _Locinfo_dtor(&locinfo);
7966 return LC_NUMERIC;
7969 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7970 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7971 size_t __cdecl num_put_short__Getcat_old(const locale_facet **facet)
7973 return num_put_short__Getcat(facet, locale_classic());
7976 num_put* num_put_wchar_use_facet(const locale *loc)
7978 static num_put *obj = NULL;
7980 _Lockit lock;
7981 const locale_facet *fac;
7983 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
7984 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_wchar_id));
7985 if(fac) {
7986 _Lockit_dtor(&lock);
7987 return (num_put*)fac;
7990 if(obj) {
7991 _Lockit_dtor(&lock);
7992 return obj;
7995 num_put_wchar__Getcat(&fac, loc);
7996 obj = (num_put*)fac;
7997 call_locale_facet__Incref(&obj->facet);
7998 locale_facet_register(&obj->facet);
7999 _Lockit_dtor(&lock);
8001 return obj;
8004 num_put* num_put_short_use_facet(const locale *loc)
8006 static num_put *obj = NULL;
8008 _Lockit lock;
8009 const locale_facet *fac;
8011 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8012 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_short_id));
8013 if(fac) {
8014 _Lockit_dtor(&lock);
8015 return (num_put*)fac;
8018 if(obj) {
8019 _Lockit_dtor(&lock);
8020 return obj;
8023 num_put_short__Getcat(&fac, loc);
8024 obj = (num_put*)fac;
8025 call_locale_facet__Incref(&obj->facet);
8026 locale_facet_register(&obj->facet);
8027 _Lockit_dtor(&lock);
8029 return obj;
8032 /* ?_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 */
8033 /* ?_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 */
8034 /* ?_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 */
8035 /* ?_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 */
8036 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Put(const num_put *this, ostreambuf_iterator_wchar *ret,
8037 ostreambuf_iterator_wchar dest, const wchar_t *ptr, size_t count)
8039 TRACE("(%p %p %s %Iu)\n", this, ret, debugstr_wn(ptr, count), count);
8041 for(; count>0; count--)
8042 ostreambuf_iterator_wchar_put(&dest, *ptr++);
8044 *ret = dest;
8045 return ret;
8048 #if _MSVCP_VER < 110
8049 /* ?_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 */
8050 /* ?_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 */
8051 /* ?_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 */
8052 /* ?_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 */
8053 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putc(const num_put *this, ostreambuf_iterator_wchar *ret,
8054 ostreambuf_iterator_wchar dest, const char *ptr, size_t count)
8056 _Mbstatet state;
8057 wchar_t ch;
8059 TRACE("(%p %p %s %Iu)\n", this, ret, debugstr_an(ptr, count), count);
8061 memset(&state, 0, sizeof(state));
8062 for(; count>0; count--) {
8063 if(_Mbrtowc(&ch, ptr++, 1, &state, &this->cvt) == 1)
8064 ostreambuf_iterator_wchar_put(&dest, ch);
8067 *ret = dest;
8068 return ret;
8070 #endif
8072 /* ?_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 */
8073 /* ?_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 */
8074 /* ?_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 */
8075 /* ?_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 */
8076 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putgrouped(const num_put *this, ostreambuf_iterator_wchar *ret,
8077 ostreambuf_iterator_wchar dest, const char *ptr, size_t count, wchar_t delim)
8079 FIXME("(%p %p %p %Iu %d) stub\n", this, ret, ptr, count, delim);
8080 return NULL;
8083 /* ?_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 */
8084 /* ?_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 */
8085 /* ?_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 */
8086 /* ?_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 */
8087 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Rep(const num_put *this, ostreambuf_iterator_wchar *ret,
8088 ostreambuf_iterator_wchar dest, wchar_t c, size_t count)
8090 TRACE("(%p %p %d %Iu)\n", this, ret, c, count);
8092 for(; count>0; count--)
8093 ostreambuf_iterator_wchar_put(&dest, c);
8095 *ret = dest;
8096 return ret;
8099 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADDH@Z */
8100 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8101 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADDH@Z */
8102 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8103 char* __cdecl num_put_wchar__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
8105 int type = fmtfl & FMTFLAG_floatfield;
8106 char *p = fmt;
8108 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
8110 *p++ = '%';
8111 if(fmtfl & FMTFLAG_showpos)
8112 *p++ = '+';
8113 if(fmtfl & FMTFLAG_showbase)
8114 *p++ = '#';
8115 *p++ = '.';
8116 *p++ = '*';
8117 if(spec)
8118 *p++ = spec;
8120 if(type == FMTFLAG_fixed)
8121 *p++ = 'f';
8122 else if(type == FMTFLAG_scientific)
8123 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
8124 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
8125 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
8126 else
8127 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
8129 *p++ = '\0';
8130 return fmt;
8133 /* ?_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 */
8134 /* ?_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 */
8135 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8136 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, size_t bef_point,
8137 size_t aft_point, size_t trailing, size_t count)
8139 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
8140 fill, buf, bef_point, aft_point, trailing, count);
8141 return NULL;
8144 /* ?_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 */
8145 /* ?_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 */
8146 ostreambuf_iterator_wchar* __cdecl num_put_short__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8147 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, size_t bef_point,
8148 size_t aft_point, size_t trailing, size_t count)
8150 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
8151 fill, buf, bef_point, aft_point, trailing, count);
8152 return NULL;
8155 #if _MSVCP_VER < 110
8156 static void num_put_wchar_wide_put(const num_put *this,
8157 ostreambuf_iterator_wchar *dest, ios_base *base,
8158 const char *buf, size_t count)
8160 num_put_wchar__Putc(this, dest, *dest, buf, count);
8162 #else
8163 static void num_put_wchar_wide_put(const num_put *this,
8164 ostreambuf_iterator_wchar *dest, ios_base *base,
8165 const char *buf, size_t count)
8167 ctype_wchar *ctype;
8168 size_t i;
8170 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
8171 for(i=0; i<count; i++)
8172 ostreambuf_iterator_wchar_put(dest, ctype_wchar_widen_ch(ctype, buf[i]));
8174 #endif
8176 /* TODO: This function should be removed when num_put_wchar__Fput is implemented */
8177 static ostreambuf_iterator_wchar* num_put__fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8178 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8179 size_t count, numpunct_wchar *numpunct)
8181 basic_string_char grouping_bstr;
8182 const char *grouping;
8183 char *p, dec_point = *localeconv()->decimal_point;
8184 wchar_t sep = 0;
8185 int cur_group = 0, group_size = 0;
8186 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8187 size_t i, pad;
8189 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
8191 for(p=buf; p<buf+count; p++) {
8192 if(*p == dec_point)
8193 break;
8195 p--;
8197 /* Add separators to number */
8198 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8199 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8200 #if _MSVCP_VER >= 70
8201 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
8202 #endif
8204 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8205 group_size++;
8206 if(group_size == grouping[cur_group]) {
8207 group_size = 0;
8208 if(grouping[cur_group+1])
8209 cur_group++;
8211 memmove(p+1, p, buf+count-p);
8212 *p = '\0'; /* mark thousands separator positions */
8213 count++;
8216 MSVCP_basic_string_char_dtor(&grouping_bstr);
8218 /* Display number with padding */
8219 if(count >= base->wide)
8220 pad = 0;
8221 else
8222 pad = base->wide-count;
8223 base->wide = 0;
8225 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8226 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8227 buf++;
8229 if(adjustfield != FMTFLAG_left) {
8230 num_put_wchar__Rep(this, ret, dest, fill, pad);
8231 pad = 0;
8234 for(i=0; i<count; i++) {
8235 if(buf[i] == dec_point)
8236 num_put_wchar__Rep(this, &dest, dest, numpunct_wchar_decimal_point(numpunct), 1);
8237 else if(!buf[i])
8238 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8239 else
8240 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8243 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8246 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADPBDH@Z */
8247 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8248 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADPBDH@Z */
8249 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8250 char* __cdecl num_put_wchar__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
8252 int base = fmtfl & FMTFLAG_basefield;
8253 char *p = fmt;
8255 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
8257 *p++ = '%';
8258 if(fmtfl & FMTFLAG_showpos)
8259 *p++ = '+';
8260 if(fmtfl & FMTFLAG_showbase)
8261 *p++ = '#';
8263 *p++ = *spec++;
8264 if(*spec == 'l')
8265 *p++ = *spec++;
8267 if(base == FMTFLAG_oct)
8268 *p++ = 'o';
8269 else if(base == FMTFLAG_hex)
8270 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
8271 else
8272 *p++ = *spec;
8274 *p++ = '\0';
8275 return fmt;
8278 static ostreambuf_iterator_wchar* num_put__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8279 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8280 size_t count, numpunct_wchar *numpunct)
8282 basic_string_char grouping_bstr;
8283 const char *grouping;
8284 char *p;
8285 wchar_t sep;
8286 int cur_group = 0, group_size = 0;
8287 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8288 size_t i, pad;
8290 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
8292 /* Add separators to number */
8293 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8294 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8295 sep = grouping[0] ? numpunct_wchar_thousands_sep(numpunct) : '\0';
8297 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8298 group_size++;
8299 if(group_size == grouping[cur_group]) {
8300 group_size = 0;
8301 if(grouping[cur_group+1])
8302 cur_group++;
8304 memmove(p+1, p, buf+count-p);
8305 *p = '\0'; /* mark thousands separator positions */
8306 count++;
8309 MSVCP_basic_string_char_dtor(&grouping_bstr);
8311 /* Display number with padding */
8312 if(count >= base->wide)
8313 pad = 0;
8314 else
8315 pad = base->wide-count;
8316 base->wide = 0;
8318 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8319 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8320 buf++;
8321 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
8322 num_put_wchar_wide_put(this, &dest, base, buf, 2);
8323 buf += 2;
8325 if(adjustfield != FMTFLAG_left) {
8326 num_put_wchar__Rep(this, ret, dest, fill, pad);
8327 pad = 0;
8330 for(i=0; i<count; i++) {
8331 if(!buf[i])
8332 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8333 else
8334 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8337 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8340 /* ?_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 */
8341 /* ?_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 */
8342 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8343 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, size_t count)
8345 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_wchar_use_facet(IOS_LOCALE(base)));
8348 /* ?_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 */
8349 /* ?_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 */
8350 ostreambuf_iterator_wchar* __cdecl num_put_short__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8351 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, size_t count)
8353 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_short_use_facet(IOS_LOCALE(base)));
8356 /* ?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 */
8357 /* ?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 */
8358 #if _MSVCP_VER <= 100
8359 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8360 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8361 (this, ret, dest, base, fill, v))
8362 #else
8363 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_wchar*, \
8364 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8365 (this, ret, dest, base, fill, v))
8366 #endif
8367 #if _MSVCP_VER != 80
8368 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 28)
8369 #else
8370 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 32)
8371 #endif
8372 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8373 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8375 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8376 char fmt[7]; /* strlen("%+#lld")+1 */
8378 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8380 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8381 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8384 /* ?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 */
8385 /* ?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 */
8386 #if _MSVCP_VER != 80
8387 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 28)
8388 #else
8389 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 32)
8390 #endif
8391 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8392 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8394 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8395 char fmt[7]; /* strlen("%+#lld")+1 */
8397 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8399 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8400 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8403 /* ?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 */
8404 /* ?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 */
8405 /* ?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 */
8406 /* ?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 */
8407 #if _MSVCP_VER != 80
8408 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 28)
8409 #else
8410 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 32)
8411 #endif
8412 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8413 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8415 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8416 return call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v);
8419 /* ?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 */
8420 /* ?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 */
8421 #if _MSVCP_VER <= 100
8422 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8423 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8424 (this, ret, dest, base, fill, v))
8425 #else
8426 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8427 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8428 (this, ret, dest, base, fill, v))
8429 #endif
8430 #if _MSVCP_VER != 80
8431 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 28)
8432 #else
8433 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 32)
8434 #endif
8435 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8436 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8438 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8439 char fmt[7]; /* strlen("%+#lld")+1 */
8441 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8443 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8444 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8447 /* ?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 */
8448 /* ?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 */
8449 #if _MSVCP_VER != 80
8450 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 28)
8451 #else
8452 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 32)
8453 #endif
8454 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8455 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8457 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8458 char fmt[7]; /* strlen("%+#lld")+1 */
8460 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8462 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8463 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8466 /* ?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 */
8467 /* ?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 */
8468 /* ?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 */
8469 /* ?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 */
8470 #if _MSVCP_VER != 80
8471 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 28)
8472 #else
8473 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 32)
8474 #endif
8475 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8476 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8478 TRACE("(%p %p %p %d %ld)\n", this, ret, base, fill, v);
8479 return call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v);
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@_WN@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@_WN@Z */
8484 /* ?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 */
8485 /* ?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 */
8486 #if _MSVCP_VER <= 100
8487 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8488 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8489 (this, ret, dest, base, fill, v))
8490 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_wchar*, \
8491 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8492 (this, ret, dest, base, fill, v))
8493 #else
8494 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8495 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8496 (this, ret, dest, base, fill, v))
8497 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8498 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8499 (this, ret, dest, base, fill, v))
8500 #endif
8501 #if _MSVCP_VER != 80
8502 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 32)
8503 #else
8504 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 36)
8505 #endif
8506 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8507 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8509 char *tmp;
8510 char fmt[8]; /* strlen("%+#.*lg")+1 */
8511 int size;
8512 unsigned prec;
8514 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8516 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8517 prec = get_precision(base);
8518 size = _scprintf(fmt, prec, v);
8520 /* TODO: don't use dynamic allocation */
8521 tmp = operator_new(size*2);
8522 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8523 numpunct_wchar_use_facet(IOS_LOCALE(base)));
8524 operator_delete(tmp);
8525 return ret;
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@GN@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@GN@Z */
8530 /* ?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 */
8531 /* ?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 */
8532 #if _MSVCP_VER != 80
8533 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 32)
8534 #else
8535 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 36)
8536 #endif
8537 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8538 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8540 char *tmp;
8541 char fmt[8]; /* strlen("%+#.*lg")+1 */
8542 int size;
8543 unsigned prec;
8545 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8547 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8548 prec = get_precision(base);
8549 size = _scprintf(fmt, prec, v);
8551 /* TODO: don't use dynamic allocation */
8552 tmp = operator_new(size*2);
8553 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8554 numpunct_short_use_facet(IOS_LOCALE(base)));
8555 operator_delete(tmp);
8556 return ret;
8559 /* ?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 */
8560 /* ?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 */
8561 /* ?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 */
8562 /* ?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 */
8563 #if _MSVCP_VER != 80
8564 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 32)
8565 #else
8566 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 36)
8567 #endif
8568 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8569 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8571 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8572 return call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v);
8575 /* ?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 */
8576 /* ?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 */
8577 /* ?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 */
8578 /* ?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 */
8579 #if _MSVCP_VER != 80
8580 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 32)
8581 #else
8582 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 36)
8583 #endif
8584 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ldouble(const num_put *this, ostreambuf_iterator_wchar *ret,
8585 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8587 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8588 return call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v);
8591 /* ?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 */
8592 /* ?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 */
8593 #if _MSVCP_VER <= 100
8594 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
8595 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8596 (this, ret, dest, base, fill, v))
8597 #else
8598 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8599 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8600 (this, ret, dest, base, fill, v))
8601 #endif
8602 #if _MSVCP_VER != 80
8603 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 28)
8604 #else
8605 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 32)
8606 #endif
8607 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8608 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8610 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8612 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8614 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8617 /* ?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 */
8618 /* ?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 */
8619 #if _MSVCP_VER != 80
8620 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 28)
8621 #else
8622 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 32)
8623 #endif
8624 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8625 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8627 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8629 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8631 return num_put_short__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8634 /* ?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 */
8635 /* ?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 */
8636 /* ?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 */
8637 /* ?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 */
8638 #if _MSVCP_VER != 80
8639 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 28)
8640 #else
8641 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 32)
8642 #endif
8643 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8644 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8646 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8647 return call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v);
8650 /* ?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 */
8651 /* ?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 */
8652 #if _MSVCP_VER <= 100
8653 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8654 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8655 (this, ret, dest, base, fill, v))
8656 #else
8657 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8658 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8659 (this, ret, dest, base, fill, v))
8660 #endif
8661 #if _MSVCP_VER != 80
8662 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 32)
8663 #else
8664 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 36)
8665 #endif
8666 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8667 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8669 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8670 char fmt[7]; /* strlen("%+#lld")+1 */
8672 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8674 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8675 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8678 /* ?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 */
8679 /* ?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 */
8680 #if _MSVCP_VER != 80
8681 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 32)
8682 #else
8683 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 36)
8684 #endif
8685 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8686 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8688 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8689 char fmt[7]; /* strlen("%+#lld")+1 */
8691 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8693 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8694 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8697 /* ?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 */
8698 /* ?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 */
8699 /* ?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 */
8700 /* ?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 */
8701 #if _MSVCP_VER != 80
8702 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 32)
8703 #else
8704 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 36)
8705 #endif
8706 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8707 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8709 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8710 return call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v);
8713 /* ?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 */
8714 /* ?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 */
8715 #if _MSVCP_VER <= 100
8716 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8717 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8718 (this, ret, dest, base, fill, v))
8719 #else
8720 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8721 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8722 (this, ret, dest, base, fill, v))
8723 #endif
8724 #if _MSVCP_VER != 80
8725 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 32)
8726 #else
8727 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 36)
8728 #endif
8729 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8730 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8732 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8733 char fmt[7]; /* strlen("%+#lld")+1 */
8735 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8737 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8738 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8741 /* ?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 */
8742 /* ?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 */
8743 #if _MSVCP_VER != 80
8744 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 32)
8745 #else
8746 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 36)
8747 #endif
8748 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8749 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8751 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8752 char fmt[7]; /* strlen("%+#lld")+1 */
8754 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8756 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8757 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8760 /* ?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 */
8761 /* ?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 */
8762 /* ?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 */
8763 /* ?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 */
8764 #if _MSVCP_VER != 80
8765 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 32)
8766 #else
8767 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 36)
8768 #endif
8769 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8770 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8772 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8773 return call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v);
8776 /* ?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 */
8777 /* ?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 */
8778 #if _MSVCP_VER <= 100
8779 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8780 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, bool), \
8781 (this, ret, dest, base, fill, v))
8782 #else
8783 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_wchar*, \
8784 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, bool), \
8785 (this, ret, dest, base, fill, v))
8786 #endif
8787 #if _MSVCP_VER != 80
8788 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 28)
8789 #else
8790 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 32)
8791 #endif
8792 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8793 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8795 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8797 if(base->fmtfl & FMTFLAG_boolalpha) {
8798 numpunct_wchar *numpunct = numpunct_wchar_use_facet(IOS_LOCALE(base));
8799 basic_string_wchar str;
8800 size_t pad, len;
8802 if(v)
8803 numpunct_wchar_truename(numpunct, &str);
8804 else
8805 numpunct_wchar_falsename(numpunct, &str);
8807 len = MSVCP_basic_string_wchar_length(&str);
8808 pad = (len>base->wide ? 0 : base->wide-len);
8809 base->wide = 0;
8811 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8812 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8813 pad = 0;
8815 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8816 MSVCP_basic_string_wchar_dtor(&str);
8817 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8820 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8823 /* ?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 */
8824 /* ?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 */
8825 #if _MSVCP_VER != 80
8826 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 28)
8827 #else
8828 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 32)
8829 #endif
8830 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8831 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8833 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8835 if(base->fmtfl & FMTFLAG_boolalpha) {
8836 numpunct_wchar *numpunct = numpunct_short_use_facet(IOS_LOCALE(base));
8837 basic_string_wchar str;
8838 size_t pad, len;
8840 if(v)
8841 numpunct_wchar_truename(numpunct, &str);
8842 else
8843 numpunct_wchar_falsename(numpunct, &str);
8845 len = MSVCP_basic_string_wchar_length(&str);
8846 pad = (len>base->wide ? 0 : base->wide-len);
8847 base->wide = 0;
8849 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8850 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8851 pad = 0;
8853 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8854 MSVCP_basic_string_wchar_dtor(&str);
8855 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8858 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8861 /* ?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 */
8862 /* ?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 */
8863 /* ?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 */
8864 /* ?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 */
8865 #if _MSVCP_VER != 80
8866 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 28)
8867 #else
8868 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 32)
8869 #endif
8870 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8871 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8873 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8874 return call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v);
8877 /* ?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
8878 locale_id time_put_char_id = {0};
8880 /* ??_7?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
8881 extern const vtable_ptr time_put_char_vtable;
8883 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
8884 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
8885 DEFINE_THISCALL_WRAPPER(time_put_char__Init, 8)
8886 void __thiscall time_put_char__Init(time_put *this, const _Locinfo *locinfo)
8888 TRACE("(%p %p)\n", this, locinfo);
8889 _Locinfo__Gettnames(locinfo, &this->time);
8890 #if _MSVCP_VER <= 100
8891 _Locinfo__Getcvt(locinfo, &this->cvt);
8892 #endif
8895 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
8896 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
8897 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_locinfo, 12)
8898 time_put* __thiscall time_put_char_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
8900 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
8901 locale_facet_ctor_refs(&this->facet, refs);
8902 this->facet.vtable = &time_put_char_vtable;
8903 time_put_char__Init(this, locinfo);
8904 return this;
8907 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
8908 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
8909 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_refs, 8)
8910 time_put* __thiscall time_put_char_ctor_refs(time_put *this, size_t refs)
8912 _Locinfo locinfo;
8914 TRACE("(%p %Iu)\n", this, refs);
8916 _Locinfo_ctor(&locinfo);
8917 time_put_char_ctor_locinfo(this, &locinfo, refs);
8918 _Locinfo_dtor(&locinfo);
8919 return this;
8922 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
8923 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
8924 DEFINE_THISCALL_WRAPPER(time_put_char_ctor, 4)
8925 time_put* __thiscall time_put_char_ctor(time_put *this)
8927 return time_put_char_ctor_refs(this, 0);
8930 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
8931 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
8932 DEFINE_THISCALL_WRAPPER(time_put_char_dtor, 4)
8933 void __thiscall time_put_char_dtor(time_put *this)
8935 TRACE("(%p)\n", this);
8936 _Timevec_dtor(&this->time);
8939 DEFINE_THISCALL_WRAPPER(time_put_char_vector_dtor, 8)
8940 time_put* __thiscall time_put_char_vector_dtor(time_put *this, unsigned int flags)
8942 TRACE("(%p %x)\n", this, flags);
8943 if(flags & 2) {
8944 /* we have an array, with the number of elements stored before the first object */
8945 INT_PTR i, *ptr = (INT_PTR *)this-1;
8947 for(i=*ptr-1; i>=0; i--)
8948 time_put_char_dtor(this+i);
8949 operator_delete(ptr);
8950 } else {
8951 time_put_char_dtor(this);
8952 if(flags & 1)
8953 operator_delete(this);
8956 return this;
8959 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
8960 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
8961 size_t __cdecl time_put_char__Getcat(const locale_facet **facet, const locale *loc)
8963 TRACE("(%p %p)\n", facet, loc);
8965 if(facet && !*facet) {
8966 _Locinfo locinfo;
8968 *facet = operator_new(sizeof(time_put));
8969 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
8970 time_put_char_ctor_locinfo((time_put*)*facet, &locinfo, 0);
8971 _Locinfo_dtor(&locinfo);
8974 return LC_TIME;
8977 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
8978 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
8979 size_t __cdecl time_put_char__Getcat_old(const locale_facet **facet)
8981 return time_put_char__Getcat(facet, locale_classic());
8984 static time_put* time_put_char_use_facet(const locale *loc)
8986 static time_put *obj = NULL;
8988 _Lockit lock;
8989 const locale_facet *fac;
8991 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8992 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_char_id));
8993 if(fac) {
8994 _Lockit_dtor(&lock);
8995 return (time_put*)fac;
8998 if(obj) {
8999 _Lockit_dtor(&lock);
9000 return obj;
9003 time_put_char__Getcat(&fac, loc);
9004 obj = (time_put*)fac;
9005 call_locale_facet__Incref(&obj->facet);
9006 locale_facet_register(&obj->facet);
9007 _Lockit_dtor(&lock);
9009 return obj;
9012 #if _MSVCP_VER >= 70
9014 /* ?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 */
9015 /* ?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 */
9016 #if _MSVCP_VER != 80
9017 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 36)
9018 #else
9019 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 40)
9020 #endif
9021 #if _MSVCP_VER <= 100
9022 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9023 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9024 (this, ret, dest, base, fill, t, spec, mod))
9025 #else
9026 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
9027 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9028 (this, ret, dest, base, fill, t, spec, mod))
9029 #endif
9030 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9031 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9033 char buf[64], fmt[4], *p = fmt;
9034 size_t i, len;
9036 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9038 *p++ = '%';
9039 if(mod)
9040 *p++ = mod;
9041 *p++ = spec;
9042 *p++ = 0;
9044 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9045 for(i=0; i<len; i++)
9046 ostreambuf_iterator_char_put(&dest, buf[i]);
9048 *ret = dest;
9049 return ret;
9052 /* ?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 */
9053 /* ?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 */
9054 #if _MSVCP_VER != 80
9055 DEFINE_THISCALL_WRAPPER(time_put_char_put, 36)
9056 #else
9057 DEFINE_THISCALL_WRAPPER(time_put_char_put, 40)
9058 #endif
9059 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9060 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9062 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9063 return call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod);
9066 /* ?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 */
9067 /* ?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 */
9068 #if _MSVCP_VER != 80
9069 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 36)
9070 #else
9071 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 40)
9072 #endif
9073 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9074 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, const char *pat, const char *pat_end)
9076 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_an(pat, pat_end-pat));
9078 while(pat < pat_end) {
9079 if(*pat != '%') {
9080 ostreambuf_iterator_char_put(&dest, *pat++);
9081 }else if(++pat == pat_end) {
9082 ostreambuf_iterator_char_put(&dest, '%');
9083 }else if(*pat=='#' && pat+1==pat_end) {
9084 ostreambuf_iterator_char_put(&dest, '%');
9085 ostreambuf_iterator_char_put(&dest, *pat++);
9086 }else {
9087 char mod;
9089 if(*pat == '#') {
9090 mod = '#';
9091 pat++;
9092 }else {
9093 mod = 0;
9096 time_put_char_put(this, &dest, dest, base, fill, t, *pat++, mod);
9100 *ret = dest;
9101 return ret;
9104 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9106 /* ?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 */
9107 /* ?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 */
9108 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 32)
9109 #define call_time_put_char_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9110 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, const struct tm*, char, char), \
9111 (this, ret, dest, base, t, spec, mod))
9112 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9113 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9115 char buf[64], fmt[4], *p = fmt;
9116 size_t i, len;
9118 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9120 *p++ = '%';
9121 if(mod)
9122 *p++ = mod;
9123 *p++ = spec;
9124 *p++ = 0;
9126 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9127 for(i=0; i<len; i++)
9128 ostreambuf_iterator_char_put(&dest, buf[i]);
9130 *ret = dest;
9131 return ret;
9134 /* ?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 */
9135 /* ?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 */
9136 DEFINE_THISCALL_WRAPPER(time_put_char_put, 32)
9137 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9138 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9140 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9141 return call_time_put_char_do_put(this, ret, dest, base, t, spec, mod);
9144 /* ?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 */
9145 /* ?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 */
9146 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 32)
9147 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9148 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, const char *pat, const char *pat_end)
9150 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_an(pat, pat_end-pat));
9152 while(pat < pat_end) {
9153 if(*pat != '%') {
9154 ostreambuf_iterator_char_put(&dest, *pat++);
9155 }else if(++pat == pat_end) {
9156 ostreambuf_iterator_char_put(&dest, '%');
9157 }else if(*pat=='#' && pat+1==pat_end) {
9158 ostreambuf_iterator_char_put(&dest, '%');
9159 ostreambuf_iterator_char_put(&dest, *pat++);
9160 }else {
9161 char mod;
9163 if(*pat == '#') {
9164 mod = '#';
9165 pat++;
9166 }else {
9167 mod = 0;
9170 time_put_char_put(this, &dest, dest, base, t, *pat++, mod);
9174 *ret = dest;
9175 return ret;
9178 #endif /* MSVCP_VER >= 70 */
9180 /* ?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
9181 locale_id time_put_wchar_id = {0};
9182 /* ?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
9183 locale_id time_put_short_id = {0};
9185 /* ??_7?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
9186 extern const vtable_ptr time_put_wchar_vtable;
9187 /* ??_7?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
9188 extern const vtable_ptr time_put_short_vtable;
9190 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9191 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9192 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9193 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9194 DEFINE_THISCALL_WRAPPER(time_put_wchar__Init, 8)
9195 void __thiscall time_put_wchar__Init(time_put *this, const _Locinfo *locinfo)
9197 TRACE("(%p %p)\n", this, locinfo);
9198 _Locinfo__Gettnames(locinfo, &this->time);
9199 #if _MSVCP_VER <= 100
9200 _Locinfo__Getcvt(locinfo, &this->cvt);
9201 #endif
9204 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9205 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9206 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_locinfo, 12)
9207 time_put* __thiscall time_put_wchar_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
9209 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
9210 locale_facet_ctor_refs(&this->facet, refs);
9211 this->facet.vtable = &time_put_wchar_vtable;
9212 time_put_wchar__Init(this, locinfo);
9213 return this;
9216 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9217 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9218 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_locinfo, 12)
9219 time_put* __thiscall time_put_short_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
9221 time_put_wchar_ctor_locinfo(this, locinfo, refs);
9222 this->facet.vtable = &time_put_short_vtable;
9223 return this;
9226 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
9227 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
9228 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_name, 12)
9229 time_put* __thiscall time_put_wchar_ctor_name(time_put *this, const char *name, size_t refs)
9231 _Locinfo locinfo;
9233 TRACE("(%p %s %Iu)\n", this, debugstr_a(name), refs);
9235 _Locinfo_ctor_cstr(&locinfo, name);
9236 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9237 _Locinfo_dtor(&locinfo);
9238 return this;
9241 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAE@PBDI@Z */
9242 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z */
9243 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_name, 12)
9244 time_put* __thiscall time_put_short_ctor_name(time_put *this, const char *name, size_t refs)
9246 time_put_wchar_ctor_name(this, name, refs);
9247 this->facet.vtable = &time_put_short_vtable;
9248 return this;
9251 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
9252 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
9253 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_refs, 8)
9254 time_put* __thiscall time_put_wchar_ctor_refs(time_put *this, size_t refs)
9256 _Locinfo locinfo;
9258 TRACE("(%p %Iu)\n", this, refs);
9260 _Locinfo_ctor(&locinfo);
9261 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9262 _Locinfo_dtor(&locinfo);
9263 return this;
9266 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
9267 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
9268 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_refs, 8)
9269 time_put* __thiscall time_put_short_ctor_refs(time_put *this, size_t refs)
9271 time_put_wchar_ctor_refs(this, refs);
9272 this->facet.vtable = &time_put_short_vtable;
9273 return this;
9276 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
9277 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
9278 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor, 4)
9279 time_put* __thiscall time_put_wchar_ctor(time_put *this)
9281 return time_put_wchar_ctor_refs(this, 0);
9284 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
9285 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
9286 DEFINE_THISCALL_WRAPPER(time_put_short_ctor, 4)
9287 time_put* __thiscall time_put_short_ctor(time_put *this)
9289 time_put_wchar_ctor(this);
9290 this->facet.vtable = &time_put_short_vtable;
9291 return this;
9294 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
9295 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
9296 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
9297 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
9298 DEFINE_THISCALL_WRAPPER(time_put_wchar_dtor, 4)
9299 void __thiscall time_put_wchar_dtor(time_put *this)
9301 TRACE("(%p)\n", this);
9302 _Timevec_dtor(&this->time);
9305 DEFINE_THISCALL_WRAPPER(time_put_wchar_vector_dtor, 8)
9306 time_put* __thiscall time_put_wchar_vector_dtor(time_put *this, unsigned int flags)
9308 TRACE("(%p %x)\n", this, flags);
9309 if(flags & 2) {
9310 /* we have an array, with the number of elements stored before the first object */
9311 INT_PTR i, *ptr = (INT_PTR *)this-1;
9313 for(i=*ptr-1; i>=0; i--)
9314 time_put_wchar_dtor(this+i);
9315 operator_delete(ptr);
9316 } else {
9317 time_put_wchar_dtor(this);
9318 if(flags & 1)
9319 operator_delete(this);
9322 return this;
9325 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9326 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9327 size_t __cdecl time_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
9329 TRACE("(%p %p)\n", facet, loc);
9331 if(facet && !*facet) {
9332 *facet = operator_new(sizeof(time_put));
9333 time_put_wchar_ctor_name((time_put*)*facet,
9334 locale_string_char_c_str(&loc->ptr->name), 0);
9337 return LC_TIME;
9340 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9341 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9342 size_t __cdecl time_put_wchar__Getcat_old(const locale_facet **facet)
9344 return time_put_wchar__Getcat(facet, locale_classic());
9347 static time_put* time_put_wchar_use_facet(const locale *loc)
9349 static time_put *obj = NULL;
9351 _Lockit lock;
9352 const locale_facet *fac;
9354 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9355 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_wchar_id));
9356 if(fac) {
9357 _Lockit_dtor(&lock);
9358 return (time_put*)fac;
9361 if(obj) {
9362 _Lockit_dtor(&lock);
9363 return obj;
9366 time_put_wchar__Getcat(&fac, loc);
9367 obj = (time_put*)fac;
9368 call_locale_facet__Incref(&obj->facet);
9369 locale_facet_register(&obj->facet);
9370 _Lockit_dtor(&lock);
9372 return obj;
9375 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9376 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9377 size_t __cdecl time_put_short__Getcat(const locale_facet **facet, const locale *loc)
9379 TRACE("(%p %p)\n", facet, loc);
9381 if(facet && !*facet) {
9382 *facet = operator_new(sizeof(time_put));
9383 time_put_short_ctor_name((time_put*)*facet,
9384 locale_string_char_c_str(&loc->ptr->name), 0);
9387 return LC_TIME;
9390 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9391 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9392 size_t __cdecl time_put_short__Getcat_old(const locale_facet **facet)
9394 return time_put_short__Getcat(facet, locale_classic());
9397 static time_put* time_put_short_use_facet(const locale *loc)
9399 static time_put *obj = NULL;
9401 _Lockit lock;
9402 const locale_facet *fac;
9404 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9405 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_short_id));
9406 if(fac) {
9407 _Lockit_dtor(&lock);
9408 return (time_put*)fac;
9411 if(obj) {
9412 _Lockit_dtor(&lock);
9413 return obj;
9416 time_put_short__Getcat(&fac, loc);
9417 obj = (time_put*)fac;
9418 call_locale_facet__Incref(&obj->facet);
9419 locale_facet_register(&obj->facet);
9420 _Lockit_dtor(&lock);
9422 return obj;
9425 #if _MSVCP_VER >= 70
9427 /* ?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 */
9428 /* ?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 */
9429 /* ?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 */
9430 /* ?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 */
9431 #if _MSVCP_VER != 80
9432 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 36)
9433 #else
9434 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 40)
9435 #endif
9436 #if _MSVCP_VER <= 100
9437 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9438 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9439 (this, ret, dest, base, fill, t, spec, mod))
9440 #else
9441 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
9442 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9443 (this, ret, dest, base, fill, t, spec, mod))
9444 #endif
9445 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9446 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9447 wchar_t fill, const struct tm *t, char spec, char mod)
9449 char buf[64], fmt[4], *p = fmt;
9450 size_t i, len;
9451 const _Cvtvec *cvt;
9452 wchar_t c;
9454 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9456 *p++ = '%';
9457 if(mod)
9458 *p++ = mod;
9459 *p++ = spec;
9460 *p++ = 0;
9462 #if _MSVCP_VER <= 100
9463 cvt = &this->cvt;
9464 #else
9465 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9466 #endif
9468 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9469 for(i=0; i<len; i++) {
9470 c = mb_to_wc(buf[i], cvt);
9471 ostreambuf_iterator_wchar_put(&dest, c);
9474 *ret = dest;
9475 return ret;
9478 /* ?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 */
9479 /* ?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 */
9480 /* ?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 */
9481 /* ?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 */
9482 #if _MSVCP_VER != 80
9483 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 36)
9484 #else
9485 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 40)
9486 #endif
9487 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9488 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9489 wchar_t fill, const struct tm *t, char spec, char mod)
9491 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9492 return call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod);
9495 /* ?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 */
9496 /* ?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 */
9497 /* ?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 */
9498 /* ?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 */
9499 #if _MSVCP_VER != 80
9500 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 36)
9501 #else
9502 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 40)
9503 #endif
9504 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9505 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9506 wchar_t fill, const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9508 wchar_t percent;
9509 char c[MB_LEN_MAX];
9510 const _Cvtvec *cvt;
9512 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_wn(pat, pat_end-pat));
9514 #if _MSVCP_VER <= 100
9515 cvt = &this->cvt;
9516 #else
9517 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9518 #endif
9520 percent = mb_to_wc('%', cvt);
9521 while(pat < pat_end) {
9522 if(*pat != percent) {
9523 ostreambuf_iterator_wchar_put(&dest, *pat++);
9524 }else if(++pat == pat_end) {
9525 ostreambuf_iterator_wchar_put(&dest, percent);
9526 }else if(_Wcrtomb(c, *pat, NULL, cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9527 ostreambuf_iterator_wchar_put(&dest, percent);
9528 ostreambuf_iterator_wchar_put(&dest, *pat++);
9529 }else {
9530 pat++;
9531 if(*c == '#') {
9532 if(_Wcrtomb(c, *pat++, NULL, cvt) != 1) {
9533 ostreambuf_iterator_wchar_put(&dest, percent);
9534 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9535 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9536 }else {
9537 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, '#');
9539 }else {
9540 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, 0);
9545 *ret = dest;
9546 return ret;
9549 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9551 /* ?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 */
9552 /* ?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 */
9553 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 32)
9554 #define call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9555 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, const struct tm*, char, char), \
9556 (this, ret, dest, base, t, spec, mod))
9557 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9558 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9559 const struct tm *t, char spec, char mod)
9561 char buf[64], fmt[4], *p = fmt;
9562 size_t i, len;
9563 wchar_t c;
9565 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9567 *p++ = '%';
9568 if(mod)
9569 *p++ = mod;
9570 *p++ = spec;
9571 *p++ = 0;
9573 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9574 for(i=0; i<len; i++) {
9575 c = mb_to_wc(buf[i], &this->cvt);
9576 ostreambuf_iterator_wchar_put(&dest, c);
9579 *ret = dest;
9580 return ret;
9583 /* ?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 */
9584 /* ?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 */
9585 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 32)
9586 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9587 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9588 const struct tm *t, char spec, char mod)
9590 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9591 return call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod);
9594 /* ?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 */
9595 /* ?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 */
9596 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 32)
9597 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9598 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9599 const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9601 wchar_t percent = mb_to_wc('%', &this->cvt);
9602 char c[MB_LEN_MAX];
9604 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_wn(pat, pat_end-pat));
9606 while(pat < pat_end) {
9607 if(*pat != percent) {
9608 ostreambuf_iterator_wchar_put(&dest, *pat++);
9609 }else if(++pat == pat_end) {
9610 ostreambuf_iterator_wchar_put(&dest, percent);
9611 }else if(_Wcrtomb(c, *pat, NULL, &this->cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9612 ostreambuf_iterator_wchar_put(&dest, percent);
9613 ostreambuf_iterator_wchar_put(&dest, *pat++);
9614 }else {
9615 pat++;
9616 if(*c == '#') {
9617 if(_Wcrtomb(c, *pat++, NULL, &this->cvt) != 1) {
9618 ostreambuf_iterator_wchar_put(&dest, percent);
9619 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9620 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9621 }else {
9622 time_put_wchar_put(this, &dest, dest, base, t, *c, '#');
9624 }else {
9625 time_put_wchar_put(this, &dest, dest, base, t, *c, 0);
9630 *ret = dest;
9631 return ret;
9634 #endif /* _MSVCP_VER >= 70 */
9636 /* ?id@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
9637 locale_id time_get_char_id = {0};
9639 /* ??_7?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
9640 extern const vtable_ptr time_get_char_vtable;
9642 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9643 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9644 DEFINE_THISCALL_WRAPPER(time_get_char__Init, 8)
9645 void __thiscall time_get_char__Init(time_get_char *this, const _Locinfo *locinfo)
9647 const char *months;
9648 const char *days;
9649 int len;
9651 TRACE("(%p %p)\n", this, locinfo);
9653 days = _Locinfo__Getdays(locinfo);
9654 len = strlen(days)+1;
9655 this->days = operator_new(len);
9656 memcpy((char*)this->days, days, len);
9658 months = _Locinfo__Getmonths(locinfo);
9659 len = strlen(months)+1;
9660 this->months = operator_new(len);
9661 memcpy((char*)this->months, months, len);
9663 this->dateorder = _Locinfo__Getdateorder(locinfo);
9664 _Locinfo__Getcvt(locinfo, &this->cvt);
9667 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9668 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9669 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_locinfo, 12)
9670 time_get_char* __thiscall time_get_char_ctor_locinfo(time_get_char *this,
9671 const _Locinfo *locinfo, size_t refs)
9673 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
9674 locale_facet_ctor_refs(&this->facet, refs);
9675 this->facet.vtable = &time_get_char_vtable;
9676 time_get_char__Init(this, locinfo);
9677 return this;
9680 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAE@PBDI@Z */
9681 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAA@PEBD_K@Z */
9682 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_name, 12)
9683 time_get_char* __thiscall time_get_char_ctor_name(time_get_char *this, const char *name, size_t refs)
9685 _Locinfo locinfo;
9687 TRACE("(%p %s %Iu)\n", this, name, refs);
9689 _Locinfo_ctor_cstr(&locinfo, name);
9690 time_get_char_ctor_locinfo(this, &locinfo, refs);
9691 _Locinfo_dtor(&locinfo);
9692 return this;
9695 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
9696 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
9697 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_refs, 8)
9698 time_get_char* __thiscall time_get_char_ctor_refs(time_get_char *this, size_t refs)
9700 _Locinfo locinfo;
9702 TRACE("(%p %Iu)\n", this, refs);
9704 _Locinfo_ctor(&locinfo);
9705 time_get_char_ctor_locinfo(this, &locinfo, refs);
9706 _Locinfo_dtor(&locinfo);
9707 return this;
9710 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
9711 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
9712 DEFINE_THISCALL_WRAPPER(time_get_char_ctor, 4)
9713 time_get_char* __thiscall time_get_char_ctor(time_get_char *this)
9715 return time_get_char_ctor_refs(this, 0);
9718 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AAEXXZ */
9719 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEAAXXZ */
9720 DEFINE_THISCALL_WRAPPER(time_get_char__Tidy, 4)
9721 void __thiscall time_get_char__Tidy(time_get_char *this)
9723 TRACE("(%p)\n", this);
9725 operator_delete((char*)this->days);
9726 operator_delete((char*)this->months);
9729 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
9730 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
9731 DEFINE_THISCALL_WRAPPER(time_get_char_dtor, 4) /* virtual */
9732 void __thiscall time_get_char_dtor(time_get_char *this)
9734 TRACE("(%p)\n", this);
9736 time_get_char__Tidy(this);
9739 DEFINE_THISCALL_WRAPPER(time_get_char_vector_dtor, 8)
9740 time_get_char* __thiscall time_get_char_vector_dtor(time_get_char *this, unsigned int flags)
9742 TRACE("(%p %x)\n", this, flags);
9743 if(flags & 2) {
9744 /* we have an array, with the number of elements stored before the first object */
9745 INT_PTR i, *ptr = (INT_PTR *)this-1;
9747 for(i=*ptr-1; i>=0; i--)
9748 time_get_char_dtor(this+i);
9749 operator_delete(ptr);
9750 } else {
9751 time_get_char_dtor(this);
9752 if(flags & 1)
9753 operator_delete(this);
9756 return this;
9759 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9760 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9761 unsigned int __cdecl time_get_char__Getcat(const locale_facet **facet, const locale *loc)
9763 TRACE("(%p %p)\n", facet, loc);
9765 if(facet && !*facet) {
9766 _Locinfo locinfo;
9768 *facet = operator_new(sizeof(time_get_char));
9769 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
9770 time_get_char_ctor_locinfo((time_get_char*)*facet, &locinfo, 0);
9771 _Locinfo_dtor(&locinfo);
9774 return LC_TIME;
9777 static time_get_char* time_get_char_use_facet(const locale *loc)
9779 static time_get_char *obj = NULL;
9781 _Lockit lock;
9782 const locale_facet *fac;
9784 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9785 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_char_id));
9786 if(fac) {
9787 _Lockit_dtor(&lock);
9788 return (time_get_char*)fac;
9791 if(obj) {
9792 _Lockit_dtor(&lock);
9793 return obj;
9796 time_get_char__Getcat(&fac, loc);
9797 obj = (time_get_char*)fac;
9798 call_locale_facet__Incref(&obj->facet);
9799 locale_facet_register(&obj->facet);
9800 _Lockit_dtor(&lock);
9802 return obj;
9805 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAH@Z */
9806 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAEAH@Z */
9807 int __cdecl time_get_char__Getint(const time_get_char *this,
9808 istreambuf_iterator_char *b, istreambuf_iterator_char *e,
9809 int min_val, int max_val, int *val)
9811 BOOL got_digit = FALSE;
9812 int len = 0, ret = 0;
9813 char buf[16];
9815 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
9817 istreambuf_iterator_char_val(b);
9818 if(b->strbuf && (b->val == '-' || b->val == '+'))
9820 buf[len++] = b->val;
9821 istreambuf_iterator_char_inc(b);
9824 if (b->strbuf && b->val == '0')
9826 got_digit = TRUE;
9827 buf[len++] = '0';
9828 istreambuf_iterator_char_inc(b);
9830 while (b->strbuf && b->val == '0')
9831 istreambuf_iterator_char_inc(b);
9833 for (; b->strbuf && b->val >= '0' && b->val <= '9';
9834 istreambuf_iterator_char_inc(b))
9836 if(len < ARRAY_SIZE(buf)-1)
9837 buf[len] = b->val;
9838 got_digit = TRUE;
9839 len++;
9842 if (!b->strbuf)
9843 ret |= IOSTATE_eofbit;
9844 if (got_digit && len < ARRAY_SIZE(buf)-1)
9846 int v, err;
9848 buf[len] = 0;
9849 v = _Stolx(buf, NULL, 10, &err);
9850 if(err || v < min_val || v > max_val)
9851 ret |= IOSTATE_failbit;
9852 else
9853 *val = v;
9855 else
9856 ret |= IOSTATE_failbit;
9857 return ret;
9860 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
9861 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
9862 DEFINE_THISCALL_WRAPPER(time_get_char_do_date_order, 4) /* virtual */
9863 #if _MSVCP_VER <= 100
9864 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_char*), (this))
9865 #else
9866 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_char*), (this))
9867 #endif
9868 dateorder __thiscall time_get_char_do_date_order(const time_get_char *this)
9870 TRACE("(%p)\n", this);
9871 return this->dateorder;
9874 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
9875 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
9876 DEFINE_THISCALL_WRAPPER(time_get_char_date_order, 4)
9877 dateorder __thiscall time_get_char_date_order(const time_get_char *this)
9879 return call_time_get_char_do_date_order(this);
9882 static int find_longest_match_char(istreambuf_iterator_char *iter, const char *str)
9884 int i, len = 0, last_match = -1, match = -1;
9885 const char *p, *end;
9886 char buf[64];
9888 for(istreambuf_iterator_char_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
9889 istreambuf_iterator_char_inc(iter))
9891 BOOL got_prefix = FALSE;
9893 buf[len++] = iter->val;
9894 last_match = match;
9895 match = -1;
9896 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
9898 end = strchr(p, ':');
9899 if (!end)
9900 end = p + strlen(p);
9902 if (end-p >= len && !memcmp(p, buf, len))
9904 if (end-p == len)
9905 match = i;
9906 else
9907 got_prefix = TRUE;
9911 if (!got_prefix)
9913 if (match != -1)
9915 istreambuf_iterator_char_inc(iter);
9916 return match;
9918 break;
9921 if (len == ARRAY_SIZE(buf))
9922 FIXME("temporary buffer is too small\n");
9923 if (!iter->strbuf)
9924 return match;
9925 return last_match;
9928 /* ?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 */
9929 /* ?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 */
9930 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_monthname, 36) /* virtual */
9931 #if _MSVCP_VER <= 100
9932 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
9933 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9934 (this, ret, s, e, base, err, t))
9935 #else
9936 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
9937 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9938 (this, ret, s, e, base, err, t))
9939 #endif
9940 istreambuf_iterator_char* __thiscall time_get_char_do_get_monthname(const time_get_char *this,
9941 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
9942 ios_base *base, int *err, struct tm *t)
9944 int match;
9946 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
9948 if ((match = find_longest_match_char(&s, this->months)) != -1)
9949 t->tm_mon = match / 2;
9950 else
9951 *err |= IOSTATE_failbit;
9953 *ret = s;
9954 return ret;
9957 /* ?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 */
9958 /* ?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 */
9959 DEFINE_THISCALL_WRAPPER(time_get_char_get_monthname, 36)
9960 istreambuf_iterator_char* __thiscall time_get_char_get_monthname(const time_get_char *this,
9961 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
9962 ios_base *base, int *err, struct tm *t)
9964 return call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t);
9967 /* ?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 */
9968 /* ?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 */
9969 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_time, 36) /* virtual */
9970 #if _MSVCP_VER <= 100
9971 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
9972 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9973 (this, ret, s, e, base, err, t))
9974 #else
9975 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
9976 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
9977 (this, ret, s, e, base, err, t))
9978 #endif
9979 istreambuf_iterator_char* __thiscall time_get_char_do_get_time(const time_get_char *this,
9980 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
9981 ios_base *base, int *err, struct tm *t)
9983 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
9985 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
9986 if (*err || istreambuf_iterator_char_val(&s)!=':')
9987 *err |= IOSTATE_failbit;
9989 if (!*err)
9991 istreambuf_iterator_char_inc(&s);
9992 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
9994 if (*err || istreambuf_iterator_char_val(&s)!=':')
9995 *err |= IOSTATE_failbit;
9997 if (!*err)
9999 istreambuf_iterator_char_inc(&s);
10000 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10003 *ret = s;
10004 return ret;
10007 /* ?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 */
10008 /* ?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 */
10009 DEFINE_THISCALL_WRAPPER(time_get_char_get_time, 36)
10010 istreambuf_iterator_char* __thiscall time_get_char_get_time(const time_get_char *this,
10011 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10012 ios_base *base, int *err, struct tm *t)
10014 return call_time_get_char_do_get_time(this, ret, s, e, base, err, t);
10017 /* ?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 */
10018 /* ?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 */
10019 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_weekday, 36) /* virtual */
10020 #if _MSVCP_VER <= 100
10021 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
10022 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10023 (this, ret, s, e, base, err, t))
10024 #else
10025 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10026 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10027 (this, ret, s, e, base, err, t))
10028 #endif
10029 istreambuf_iterator_char* __thiscall time_get_char_do_get_weekday(const time_get_char *this,
10030 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10031 ios_base *base, int *err, struct tm *t)
10033 int match;
10035 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10037 if ((match = find_longest_match_char(&s, this->days)) != -1)
10038 t->tm_wday = match / 2;
10039 else
10040 *err |= IOSTATE_failbit;
10042 *ret = s;
10043 return ret;
10046 /* ?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 */
10047 /* ?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 */
10048 DEFINE_THISCALL_WRAPPER(time_get_char_get_weekday, 36)
10049 istreambuf_iterator_char* __thiscall time_get_char_get_weekday(const time_get_char *this,
10050 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10051 ios_base *base, int *err, struct tm *t)
10053 return call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t);
10056 /* ?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 */
10057 /* ?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 */
10058 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_year, 36) /* virtual */
10059 #if _MSVCP_VER <= 100
10060 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10061 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10062 (this, ret, s, e, base, err, t))
10063 #else
10064 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
10065 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10066 (this, ret, s, e, base, err, t))
10067 #endif
10068 istreambuf_iterator_char* __thiscall time_get_char_do_get_year(const time_get_char *this,
10069 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10070 ios_base *base, int *err, struct tm *t)
10072 int year;
10074 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10076 /* The function supports only dates from [1900-2035] range */
10077 *err |= time_get_char__Getint(this, &s, &e, 0, 2035, &year);
10078 if (!(*err & IOSTATE_failbit))
10080 if (year >= 1900)
10081 year -= 1900;
10082 if (year > 135)
10083 *err |= IOSTATE_failbit;
10084 else
10085 t->tm_year = year;
10088 *ret = s;
10089 return ret;
10092 /* ?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 */
10093 /* ?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 */
10094 DEFINE_THISCALL_WRAPPER(time_get_char_get_year, 36)
10095 istreambuf_iterator_char* __thiscall time_get_char_get_year(const time_get_char *this,
10096 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10097 ios_base *base, int *err, struct tm *t)
10099 return call_time_get_char_do_get_year(this, ret, s, e, base, err, t);
10102 static void skip_ws_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10104 istreambuf_iterator_char_val(iter);
10105 while(iter->strbuf && ctype_char_is_ch(ctype, _SPACE, iter->val))
10106 istreambuf_iterator_char_inc(iter);
10109 static void skip_date_delim_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10111 skip_ws_char(ctype, iter);
10112 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
10113 istreambuf_iterator_char_inc(iter);
10114 skip_ws_char(ctype, iter);
10117 /* ?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 */
10118 /* ?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 */
10119 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_date, 36) /* virtual */
10120 #if _MSVCP_VER <= 100
10121 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
10122 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10123 (this, ret, s, e, base, err, t))
10124 #else
10125 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
10126 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10127 (this, ret, s, e, base, err, t))
10128 #endif
10129 istreambuf_iterator_char* __thiscall time_get_char_do_get_date(const time_get_char *this,
10130 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10131 ios_base *base, int *err, struct tm *t)
10133 ctype_char *ctype;
10134 dateorder order;
10136 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10138 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10140 order = time_get_char_date_order(this);
10141 if(order == DATEORDER_no_order)
10142 order = DATEORDER_mdy;
10144 switch(order) {
10145 case DATEORDER_dmy:
10146 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10147 skip_date_delim_char(ctype, &s);
10148 if(!s.strbuf) {
10149 *err |= IOSTATE_failbit;
10150 break;
10152 if(s.strbuf && ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10153 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10154 t->tm_mon--;
10155 } else {
10156 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10158 skip_date_delim_char(ctype, &s);
10159 if(!s.strbuf) {
10160 *err |= IOSTATE_failbit;
10161 break;
10163 time_get_char_get_year(this, &s, s, e, base, err, t);
10164 break;
10165 case DATEORDER_mdy:
10166 istreambuf_iterator_char_val(&s);
10167 if(s.strbuf && ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10168 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10169 t->tm_mon--;
10170 } else {
10171 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10173 skip_date_delim_char(ctype, &s);
10174 if(!s.strbuf) {
10175 *err |= IOSTATE_failbit;
10176 break;
10178 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10179 skip_date_delim_char(ctype, &s);
10180 if(!s.strbuf) {
10181 *err |= IOSTATE_failbit;
10182 break;
10184 time_get_char_get_year(this, &s, s, e, base, err, t);
10185 break;
10186 case DATEORDER_ymd:
10187 time_get_char_get_year(this, &s, s, e, base, err, t);
10188 skip_date_delim_char(ctype, &s);
10189 if(!s.strbuf) {
10190 *err |= IOSTATE_failbit;
10191 break;
10193 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10194 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10195 t->tm_mon--;
10196 } else {
10197 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10199 skip_date_delim_char(ctype, &s);
10200 if(!s.strbuf) {
10201 *err |= IOSTATE_failbit;
10202 break;
10204 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10205 break;
10206 case DATEORDER_ydm:
10207 time_get_char_get_year(this, &s, s, e, base, err, t);
10208 skip_date_delim_char(ctype, &s);
10209 if(!s.strbuf) {
10210 *err |= IOSTATE_failbit;
10211 break;
10213 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10214 skip_date_delim_char(ctype, &s);
10215 if(!s.strbuf) {
10216 *err |= IOSTATE_failbit;
10217 break;
10219 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10220 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10221 t->tm_mon--;
10222 } else {
10223 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10225 break;
10226 default:
10227 ERR("incorrect order value: %d\n", order);
10228 break;
10231 if(!s.strbuf)
10232 *err |= IOSTATE_eofbit;
10233 *ret = s;
10234 return ret;
10237 /* ?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 */
10238 /* ?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 */
10239 DEFINE_THISCALL_WRAPPER(time_get_char_get_date, 36)
10240 istreambuf_iterator_char* __thiscall time_get_char_get_date(const time_get_char *this,
10241 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10242 ios_base *base, int *err, struct tm *t)
10244 return call_time_get_char_do_get_date(this, ret, s, e, base, err, t);
10247 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char*,
10248 istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char,
10249 ios_base*, int*, struct tm*, char, char);
10251 /* ?_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 */
10252 /* ?_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 */
10253 DEFINE_THISCALL_WRAPPER(time_get_char__Getfmt, 40)
10254 istreambuf_iterator_char* __thiscall time_get_char__Getfmt(const time_get_char *this,
10255 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10256 ios_base *base, int *err, struct tm *t, const char *fmt)
10258 ctype_char *ctype;
10260 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
10262 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10263 istreambuf_iterator_char_val(&s);
10265 while(*fmt) {
10266 if(ctype_char_is_ch(ctype, _SPACE, *fmt)) {
10267 skip_ws_char(ctype, &s);
10268 fmt++;
10269 continue;
10272 if(!s.strbuf) {
10273 *err |= IOSTATE_failbit;
10274 break;
10277 if(*fmt == '%') {
10278 fmt++;
10279 time_get_char_get(this, &s, s, e, base, err, t, *fmt, 0);
10280 } else {
10281 if(s.val != *fmt)
10282 *err |= IOSTATE_failbit;
10283 else
10284 istreambuf_iterator_char_inc(&s);
10287 if(*err & IOSTATE_failbit)
10288 break;
10289 fmt++;
10292 if(!s.strbuf)
10293 *err |= IOSTATE_eofbit;
10294 *ret = s;
10295 return ret;
10298 /* ?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 */
10299 /* ?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 */
10300 DEFINE_THISCALL_WRAPPER(time_get_char_do_get, 44) /* virtual */
10301 #if _MSVCP_VER <= 100
10302 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
10303 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10304 (this, ret, s, e, base, err, t, fmt, mod))
10305 #else
10306 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
10307 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10308 (this, ret, s, e, base, err, t, fmt, mod))
10309 #endif
10310 istreambuf_iterator_char* __thiscall time_get_char_do_get(const time_get_char *this,
10311 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10312 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10314 ctype_char *ctype;
10316 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
10318 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10320 switch(fmt) {
10321 case 'a':
10322 case 'A':
10323 time_get_char_get_weekday(this, &s, s, e, base, err, t);
10324 break;
10325 case 'b':
10326 case 'B':
10327 case 'h':
10328 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10329 break;
10330 case 'c':
10331 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
10332 break;
10333 case 'C':
10334 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10335 if(!(*err & IOSTATE_failbit))
10336 t->tm_year = t->tm_year * 100 - 1900;
10337 break;
10338 case 'd':
10339 case 'e':
10340 if(fmt == 'e') skip_ws_char(ctype, &s);
10341 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10342 break;
10343 case 'D':
10344 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
10345 break;
10346 case 'F':
10347 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
10348 break;
10349 case 'H':
10350 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10351 break;
10352 case 'I':
10353 *err |= time_get_char__Getint(this, &s, &e, 0, 11, &t->tm_hour);
10354 break;
10355 case 'j':
10356 *err |= time_get_char__Getint(this, &s, &e, 1, 366, &t->tm_yday);
10357 break;
10358 case 'm':
10359 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10360 if(!(*err & IOSTATE_failbit))
10361 t->tm_mon--;
10362 break;
10363 case 'M':
10364 *err = time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
10365 break;
10366 case 'n':
10367 case 't':
10368 skip_ws_char(ctype, &s);
10369 break;
10370 case 'p': {
10371 BOOL pm = FALSE;
10373 istreambuf_iterator_char_val(&s);
10374 if(s.strbuf && (s.val=='P' || s.val=='p'))
10375 pm = TRUE;
10376 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
10377 *err |= IOSTATE_failbit;
10378 break;
10380 istreambuf_iterator_char_inc(&s);
10381 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
10382 *err |= IOSTATE_failbit;
10383 break;
10385 istreambuf_iterator_char_inc(&s);
10387 if(pm)
10388 t->tm_hour += 12;
10389 break;
10391 case 'r':
10392 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
10393 break;
10394 case 'R':
10395 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
10396 break;
10397 case 'S':
10398 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10399 break;
10400 case 'T':
10401 case 'X':
10402 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
10403 break;
10404 case 'u':
10405 *err |= time_get_char__Getint(this, &s, &e, 1, 7, &t->tm_wday);
10406 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
10407 t->tm_wday = 0;
10408 break;
10409 case 'w':
10410 *err |= time_get_char__Getint(this, &s, &e, 0, 6, &t->tm_wday);
10411 break;
10412 case 'x':
10413 time_get_char_get_date(this, &s, s, e, base, err, t);
10414 break;
10415 case 'y':
10416 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10417 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
10418 t->tm_year += 100;
10419 break;
10420 case 'Y':
10421 time_get_char_get_year(this, &s, s, e, base, err, t);
10422 break;
10423 default:
10424 FIXME("unrecognized format: %c\n", fmt);
10425 *err |= IOSTATE_failbit;
10428 if(!s.strbuf)
10429 *err |= IOSTATE_eofbit;
10430 *ret = s;
10431 return ret;
10434 /* ?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 */
10435 /* ?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 */
10436 DEFINE_THISCALL_WRAPPER(time_get_char_get, 44)
10437 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char *this,
10438 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10439 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10441 return call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod);
10444 /* ?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 */
10445 /* ?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 */
10446 DEFINE_THISCALL_WRAPPER(time_get_char_get_fmt, 44)
10447 istreambuf_iterator_char* __thiscall time_get_char_get_fmt(const time_get_char *this,
10448 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10449 ios_base *base, int *err, struct tm *t, const char *fmtstart, const char *fmtend)
10451 ctype_char *ctype;
10453 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_an(fmtstart, fmtend-fmtstart));
10455 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10456 istreambuf_iterator_char_val(&s);
10458 while(fmtstart < fmtend) {
10459 if(ctype_char_is_ch(ctype, _SPACE, *fmtstart)) {
10460 skip_ws_char(ctype, &s);
10461 fmtstart++;
10462 continue;
10465 if(!s.strbuf) {
10466 *err |= IOSTATE_failbit;
10467 break;
10470 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
10471 if(s.val != *fmtstart)
10472 *err |= IOSTATE_failbit;
10473 else
10474 istreambuf_iterator_char_inc(&s);
10475 if(*fmtstart == '%')
10476 fmtstart++;
10477 } else {
10478 fmtstart++;
10479 time_get_char_get(this, &s, s, e, base, err, t, *fmtstart, 0);
10482 if(*err & IOSTATE_failbit)
10483 break;
10484 fmtstart++;
10487 if(!s.strbuf)
10488 *err |= IOSTATE_eofbit;
10489 *ret = s;
10490 return ret;
10493 /* ?id@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
10494 locale_id time_get_wchar_id = {0};
10496 /* ??_7?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
10497 extern const vtable_ptr time_get_wchar_vtable;
10499 #if _MSVCP_VER >=110
10500 static wchar_t* create_time_get_str(const wchar_t *str)
10502 wchar_t *ret;
10503 int len;
10505 len = lstrlenW(str)+1;
10506 ret = operator_new(len * sizeof(wchar_t));
10507 memcpy(ret, str, len*sizeof(wchar_t));
10508 return ret;
10510 #else
10511 static wchar_t* create_time_get_str(const char *str, const _Locinfo *locinfo)
10513 wchar_t *ret;
10514 _Cvtvec cvt;
10515 int len;
10517 _Locinfo__Getcvt(locinfo, &cvt);
10518 len = MultiByteToWideChar(cvt.page, 0, str, -1, NULL, 0);
10519 ret = operator_new(len*sizeof(WCHAR));
10520 MultiByteToWideChar(cvt.page, 0, str, -1, ret, len);
10521 return ret;
10523 #endif
10525 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
10526 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
10527 DEFINE_THISCALL_WRAPPER(time_get_wchar__Init, 8)
10528 void __thiscall time_get_wchar__Init(time_get_wchar *this, const _Locinfo *locinfo)
10530 TRACE("(%p %p)\n", this, locinfo);
10532 #if _MSVCP_VER >=110
10533 this->days = create_time_get_str(_Locinfo__W_Getdays(locinfo));
10534 #else
10535 this->days = create_time_get_str(_Locinfo__Getdays(locinfo), locinfo);
10536 #endif
10538 #if _MSVCP_VER >=110
10539 this->months = create_time_get_str(_Locinfo__W_Getmonths(locinfo));
10540 #else
10541 this->months = create_time_get_str(_Locinfo__Getmonths(locinfo), locinfo);
10542 #endif
10544 this->dateorder = _Locinfo__Getdateorder(locinfo);
10545 _Locinfo__Getcvt(locinfo, &this->cvt);
10548 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
10549 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
10550 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_locinfo, 12)
10551 time_get_wchar* __thiscall time_get_wchar_ctor_locinfo(time_get_wchar *this,
10552 const _Locinfo *locinfo, size_t refs)
10554 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
10555 locale_facet_ctor_refs(&this->facet, refs);
10556 this->facet.vtable = &time_get_wchar_vtable;
10557 time_get_wchar__Init(this, locinfo);
10558 return this;
10561 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
10562 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
10563 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_name, 12)
10564 time_get_wchar* __thiscall time_get_wchar_ctor_name(time_get_wchar *this, const char *name, size_t refs)
10566 _Locinfo locinfo;
10568 TRACE("(%p %s %Iu)\n", this, name, refs);
10570 _Locinfo_ctor_cstr(&locinfo, name);
10571 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10572 _Locinfo_dtor(&locinfo);
10573 return this;
10576 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
10577 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
10578 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_refs, 8)
10579 time_get_wchar* __thiscall time_get_wchar_ctor_refs(time_get_wchar *this, size_t refs)
10581 _Locinfo locinfo;
10583 TRACE("(%p %Iu)\n", this, refs);
10585 _Locinfo_ctor(&locinfo);
10586 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10587 _Locinfo_dtor(&locinfo);
10588 return this;
10591 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
10592 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
10593 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor, 4)
10594 time_get_wchar* __thiscall time_get_wchar_ctor(time_get_wchar *this)
10596 return time_get_wchar_ctor_refs(this, 0);
10599 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AAEXXZ */
10600 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEAAXXZ */
10601 DEFINE_THISCALL_WRAPPER(time_get_wchar__Tidy, 4)
10602 void __thiscall time_get_wchar__Tidy(time_get_wchar *this)
10604 TRACE("(%p)\n", this);
10606 operator_delete((wchar_t*)this->days);
10607 operator_delete((wchar_t*)this->months);
10610 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
10611 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
10612 DEFINE_THISCALL_WRAPPER(time_get_wchar_dtor, 4) /* virtual */
10613 void __thiscall time_get_wchar_dtor(time_get_wchar *this)
10615 TRACE("(%p)\n", this);
10617 time_get_wchar__Tidy(this);
10620 DEFINE_THISCALL_WRAPPER(time_get_wchar_vector_dtor, 8)
10621 time_get_wchar* __thiscall time_get_wchar_vector_dtor(time_get_wchar *this, unsigned int flags)
10623 TRACE("(%p %x)\n", this, flags);
10624 if(flags & 2) {
10625 /* we have an array, with the number of elements stored before the first object */
10626 INT_PTR i, *ptr = (INT_PTR *)this-1;
10628 for(i=*ptr-1; i>=0; i--)
10629 time_get_wchar_dtor(this+i);
10630 operator_delete(ptr);
10631 } else {
10632 time_get_wchar_dtor(this);
10633 if(flags & 1)
10634 operator_delete(this);
10637 return this;
10640 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
10641 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
10642 unsigned int __cdecl time_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
10644 TRACE("(%p %p)\n", facet, loc);
10646 if(facet && !*facet) {
10647 _Locinfo locinfo;
10649 *facet = operator_new(sizeof(time_get_wchar));
10650 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
10651 time_get_wchar_ctor_locinfo((time_get_wchar*)*facet, &locinfo, 0);
10652 _Locinfo_dtor(&locinfo);
10655 return LC_TIME;
10658 static time_get_wchar* time_get_wchar_use_facet(const locale *loc)
10660 static time_get_wchar *obj = NULL;
10662 _Lockit lock;
10663 const locale_facet *fac;
10665 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
10666 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_wchar_id));
10667 if(fac) {
10668 _Lockit_dtor(&lock);
10669 return (time_get_wchar*)fac;
10672 if(obj) {
10673 _Lockit_dtor(&lock);
10674 return obj;
10677 time_get_wchar__Getcat(&fac, loc);
10678 obj = (time_get_wchar*)fac;
10679 call_locale_facet__Incref(&obj->facet);
10680 locale_facet_register(&obj->facet);
10681 _Lockit_dtor(&lock);
10683 return obj;
10686 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAAH@Z */
10687 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAEAH@Z */
10688 int __cdecl time_get_wchar__Getint(const time_get_wchar *this,
10689 istreambuf_iterator_wchar *b, istreambuf_iterator_wchar *e,
10690 int min_val, int max_val, int *val)
10692 BOOL got_digit = FALSE;
10693 int len = 0, ret = 0;
10694 char buf[16];
10696 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
10698 istreambuf_iterator_wchar_val(b);
10699 if(b->strbuf && (b->val == '-' || b->val == '+'))
10701 buf[len++] = b->val;
10702 istreambuf_iterator_wchar_inc(b);
10705 if (b->strbuf && b->val == '0')
10707 got_digit = TRUE;
10708 buf[len++] = '0';
10709 istreambuf_iterator_wchar_inc(b);
10711 while (b->strbuf && b->val == '0')
10712 istreambuf_iterator_wchar_inc(b);
10714 for (; b->strbuf && b->val >= '0' && b->val <= '9';
10715 istreambuf_iterator_wchar_inc(b))
10717 if(len < ARRAY_SIZE(buf)-1)
10718 buf[len] = b->val;
10719 got_digit = TRUE;
10720 len++;
10723 if (!b->strbuf)
10724 ret |= IOSTATE_eofbit;
10725 if (got_digit && len < ARRAY_SIZE(buf)-1)
10727 int v, err;
10729 buf[len] = 0;
10730 v = _Stolx(buf, NULL, 10, &err);
10731 if(err || v < min_val || v > max_val)
10732 ret |= IOSTATE_failbit;
10733 else
10734 *val = v;
10736 else
10737 ret |= IOSTATE_failbit;
10738 return ret;
10741 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
10742 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
10743 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_date_order, 4) /* virtual */
10744 #if _MSVCP_VER <= 100
10745 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_wchar*), (this))
10746 #else
10747 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_wchar*), (this))
10748 #endif
10749 dateorder __thiscall time_get_wchar_do_date_order(const time_get_wchar *this)
10751 TRACE("(%p)\n", this);
10752 return this->dateorder;
10755 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
10756 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
10757 DEFINE_THISCALL_WRAPPER(time_get_wchar_date_order, 4)
10758 dateorder __thiscall time_get_wchar_date_order(const time_get_wchar *this)
10760 return call_time_get_wchar_do_date_order(this);
10763 static int find_longest_match_wchar(istreambuf_iterator_wchar *iter, const wchar_t *str)
10765 int i, len = 0, last_match = -1, match = -1;
10766 const wchar_t *p, *end;
10767 wchar_t buf[64];
10769 for(istreambuf_iterator_wchar_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
10770 istreambuf_iterator_wchar_inc(iter))
10772 BOOL got_prefix = FALSE;
10774 buf[len++] = iter->val;
10775 last_match = match;
10776 match = -1;
10777 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
10779 end = wcschr(p, ':');
10780 if (!end)
10781 end = p + lstrlenW(p);
10783 if (end-p >= len && !memcmp(p, buf, len*sizeof(wchar_t)))
10785 if (end-p == len)
10786 match = i;
10787 else
10788 got_prefix = TRUE;
10792 if (!got_prefix)
10794 if (match != -1)
10796 istreambuf_iterator_wchar_inc(iter);
10797 return match;
10799 break;
10802 if (len == ARRAY_SIZE(buf))
10803 FIXME("temporary buffer is too small\n");
10804 if (!iter->strbuf)
10805 return match;
10806 return last_match;
10809 /* ?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 */
10810 /* ?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 */
10811 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_monthname, 36) /* virtual */
10812 #if _MSVCP_VER <= 100
10813 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
10814 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10815 (this, ret, s, e, base, err, t))
10816 #else
10817 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
10818 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10819 (this, ret, s, e, base, err, t))
10820 #endif
10821 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_monthname(const time_get_wchar *this,
10822 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10823 ios_base *base, int *err, struct tm *t)
10825 int match;
10827 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10829 if ((match = find_longest_match_wchar(&s, this->months)) != -1)
10830 t->tm_mon = match / 2;
10831 else
10832 *err |= IOSTATE_failbit;
10834 *ret = s;
10835 return ret;
10838 /* ?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 */
10839 /* ?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 */
10840 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_monthname, 36)
10841 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_monthname(const time_get_wchar *this,
10842 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10843 ios_base *base, int *err, struct tm *t)
10845 return call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t);
10848 /* ?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 */
10849 /* ?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 */
10850 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_time, 36) /* virtual */
10851 #if _MSVCP_VER <= 100
10852 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
10853 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10854 (this, ret, s, e, base, err, t))
10855 #else
10856 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
10857 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10858 (this, ret, s, e, base, err, t))
10859 #endif
10860 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_time(const time_get_wchar *this,
10861 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10862 ios_base *base, int *err, struct tm *t)
10864 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10866 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10867 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
10868 *err |= IOSTATE_failbit;
10870 if (!*err)
10872 istreambuf_iterator_wchar_inc(&s);
10873 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
10875 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
10876 *err |= IOSTATE_failbit;
10878 if (!*err)
10880 istreambuf_iterator_wchar_inc(&s);
10881 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10884 *ret = s;
10885 return ret;
10888 /* ?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 */
10889 /* ?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 */
10890 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_time, 36)
10891 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_time(const time_get_wchar *this,
10892 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10893 ios_base *base, int *err, struct tm *t)
10895 return call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t);
10898 /* ?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 */
10899 /* ?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 */
10900 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_weekday, 36) /* virtual */
10901 #if _MSVCP_VER <= 100
10902 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
10903 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10904 (this, ret, s, e, base, err, t))
10905 #else
10906 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
10907 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10908 (this, ret, s, e, base, err, t))
10909 #endif
10910 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_weekday(const time_get_wchar *this,
10911 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10912 ios_base *base, int *err, struct tm *t)
10914 int match;
10916 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10918 if ((match = find_longest_match_wchar(&s, this->days)) != -1)
10919 t->tm_wday = match / 2;
10920 else
10921 *err |= IOSTATE_failbit;
10923 *ret = s;
10924 return ret;
10927 /* ?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 */
10928 /* ?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 */
10929 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_weekday, 36)
10930 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_weekday(const time_get_wchar *this,
10931 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10932 ios_base *base, int *err, struct tm *t)
10934 return call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t);
10937 /* ?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 */
10938 /* ?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 */
10939 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_year, 36) /* virtual */
10940 #if _MSVCP_VER <= 100
10941 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
10942 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10943 (this, ret, s, e, base, err, t))
10944 #else
10945 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
10946 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10947 (this, ret, s, e, base, err, t))
10948 #endif
10949 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_year(const time_get_wchar *this,
10950 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10951 ios_base *base, int *err, struct tm *t)
10953 int year;
10955 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10957 /* The function supports only dates from [1900-2035] range */
10958 *err |= time_get_wchar__Getint(this, &s, &e, 0, 2035, &year);
10959 if (!(*err & IOSTATE_failbit))
10961 if (year >= 1900)
10962 year -= 1900;
10963 if (year > 135)
10964 *err |= IOSTATE_failbit;
10965 else
10966 t->tm_year = year;
10969 *ret = s;
10970 return ret;
10973 /* ?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 */
10974 /* ?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 */
10975 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_year, 36)
10976 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_year(const time_get_wchar *this,
10977 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10978 ios_base *base, int *err, struct tm *t)
10980 return call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t);
10983 static void skip_ws_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
10985 istreambuf_iterator_wchar_val(iter);
10986 while(iter->strbuf && ctype_wchar_is_ch(ctype, _SPACE, iter->val))
10987 istreambuf_iterator_wchar_inc(iter);
10990 static void skip_date_delim_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
10992 skip_ws_wchar(ctype, iter);
10993 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
10994 istreambuf_iterator_wchar_inc(iter);
10995 skip_ws_wchar(ctype, iter);
10998 /* ?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 */
10999 /* ?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 */
11000 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_date, 36) /* virtual */
11001 #if _MSVCP_VER <= 100
11002 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
11003 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11004 (this, ret, s, e, base, err, t))
11005 #else
11006 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
11007 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11008 (this, ret, s, e, base, err, t))
11009 #endif
11010 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_date(const time_get_wchar *this,
11011 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11012 ios_base *base, int *err, struct tm *t)
11014 ctype_wchar *ctype;
11015 dateorder order;
11017 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11019 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11021 order = time_get_wchar_date_order(this);
11022 if(order == DATEORDER_no_order)
11023 order = DATEORDER_mdy;
11025 switch(order) {
11026 case DATEORDER_dmy:
11027 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11028 skip_date_delim_wchar(ctype, &s);
11029 if(!s.strbuf) {
11030 *err |= IOSTATE_failbit;
11031 break;
11033 if(s.strbuf && ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11034 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11035 t->tm_mon--;
11036 } else {
11037 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11039 skip_date_delim_wchar(ctype, &s);
11040 if(!s.strbuf) {
11041 *err |= IOSTATE_failbit;
11042 break;
11044 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11045 break;
11046 case DATEORDER_mdy:
11047 istreambuf_iterator_wchar_val(&s);
11048 if(s.strbuf && ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11049 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11050 t->tm_mon--;
11051 } else {
11052 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11054 skip_date_delim_wchar(ctype, &s);
11055 if(!s.strbuf) {
11056 *err |= IOSTATE_failbit;
11057 break;
11059 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11060 skip_date_delim_wchar(ctype, &s);
11061 if(!s.strbuf) {
11062 *err |= IOSTATE_failbit;
11063 break;
11065 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11066 break;
11067 case DATEORDER_ymd:
11068 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11069 skip_date_delim_wchar(ctype, &s);
11070 if(!s.strbuf) {
11071 *err |= IOSTATE_failbit;
11072 break;
11074 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11075 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11076 t->tm_mon--;
11077 } else {
11078 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11080 skip_date_delim_wchar(ctype, &s);
11081 if(!s.strbuf) {
11082 *err |= IOSTATE_failbit;
11083 break;
11085 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11086 break;
11087 case DATEORDER_ydm:
11088 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11089 skip_date_delim_wchar(ctype, &s);
11090 if(!s.strbuf) {
11091 *err |= IOSTATE_failbit;
11092 break;
11094 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11095 skip_date_delim_wchar(ctype, &s);
11096 if(!s.strbuf) {
11097 *err |= IOSTATE_failbit;
11098 break;
11100 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11101 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11102 t->tm_mon--;
11103 } else {
11104 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11106 break;
11107 default:
11108 ERR("incorrect order value: %d\n", order);
11109 break;
11112 if(!s.strbuf)
11113 *err |= IOSTATE_eofbit;
11114 *ret = s;
11115 return ret;
11118 /* ?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 */
11119 /* ?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 */
11120 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_date, 36)
11121 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_date(const time_get_wchar *this,
11122 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11123 ios_base *base, int *err, struct tm *t)
11125 return call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t);
11128 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar*,
11129 istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar,
11130 ios_base*, int*, struct tm*, char, char);
11132 /* ?_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 */
11133 /* ?_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 */
11134 DEFINE_THISCALL_WRAPPER(time_get_wchar__Getfmt, 40)
11135 istreambuf_iterator_wchar* __thiscall time_get_wchar__Getfmt(const time_get_wchar *this,
11136 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11137 ios_base *base, int *err, struct tm *t, const char *fmt)
11139 ctype_wchar *ctype;
11141 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
11143 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11144 istreambuf_iterator_wchar_val(&s);
11146 while(*fmt) {
11147 if(*fmt == ' ') {
11148 skip_ws_wchar(ctype, &s);
11149 fmt++;
11150 continue;
11153 if(!s.strbuf) {
11154 *err |= IOSTATE_failbit;
11155 break;
11158 if(*fmt == '%') {
11159 fmt++;
11160 time_get_wchar_get(this, &s, s, e, base, err, t, *fmt, 0);
11161 } else {
11162 if(s.val != *fmt)
11163 *err |= IOSTATE_failbit;
11164 else
11165 istreambuf_iterator_wchar_inc(&s);
11168 if(*err & IOSTATE_failbit)
11169 break;
11170 fmt++;
11173 if(!s.strbuf)
11174 *err |= IOSTATE_eofbit;
11175 *ret = s;
11176 return ret;
11179 /* ?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 */
11180 /* ?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 */
11181 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get, 44) /* virtual */
11182 #if _MSVCP_VER <= 100
11183 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
11184 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11185 (this, ret, s, e, base, err, t, fmt, mod))
11186 #else
11187 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
11188 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11189 (this, ret, s, e, base, err, t, fmt, mod))
11190 #endif
11191 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get(const time_get_wchar *this,
11192 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11193 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11195 ctype_wchar *ctype;
11197 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
11199 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11201 switch(fmt) {
11202 case 'a':
11203 case 'A':
11204 time_get_wchar_get_weekday(this, &s, s, e, base, err, t);
11205 break;
11206 case 'b':
11207 case 'B':
11208 case 'h':
11209 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11210 break;
11211 case 'c':
11212 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
11213 break;
11214 case 'C':
11215 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11216 if(!(*err & IOSTATE_failbit))
11217 t->tm_year = t->tm_year * 100 - 1900;
11218 break;
11219 case 'd':
11220 case 'e':
11221 if(fmt == 'e') skip_ws_wchar(ctype, &s);
11222 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11223 break;
11224 case 'D':
11225 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
11226 break;
11227 case 'F':
11228 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
11229 break;
11230 case 'H':
11231 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
11232 break;
11233 case 'I':
11234 *err |= time_get_wchar__Getint(this, &s, &e, 0, 11, &t->tm_hour);
11235 break;
11236 case 'j':
11237 *err |= time_get_wchar__Getint(this, &s, &e, 1, 366, &t->tm_yday);
11238 break;
11239 case 'm':
11240 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11241 if(!(*err & IOSTATE_failbit))
11242 t->tm_mon--;
11243 break;
11244 case 'M':
11245 *err = time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
11246 break;
11247 case 'n':
11248 case 't':
11249 skip_ws_wchar(ctype, &s);
11250 break;
11251 case 'p': {
11252 BOOL pm = FALSE;
11254 istreambuf_iterator_wchar_val(&s);
11255 if(s.strbuf && (s.val=='P' || s.val=='p'))
11256 pm = TRUE;
11257 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
11258 *err |= IOSTATE_failbit;
11259 break;
11261 istreambuf_iterator_wchar_inc(&s);
11262 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
11263 *err |= IOSTATE_failbit;
11264 break;
11266 istreambuf_iterator_wchar_inc(&s);
11268 if(pm)
11269 t->tm_hour += 12;
11270 break;
11272 case 'r':
11273 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
11274 break;
11275 case 'R':
11276 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
11277 break;
11278 case 'S':
11279 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
11280 break;
11281 case 'T':
11282 case 'X':
11283 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
11284 break;
11285 case 'u':
11286 *err |= time_get_wchar__Getint(this, &s, &e, 1, 7, &t->tm_wday);
11287 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
11288 t->tm_wday = 0;
11289 break;
11290 case 'w':
11291 *err |= time_get_wchar__Getint(this, &s, &e, 0, 6, &t->tm_wday);
11292 break;
11293 case 'x':
11294 time_get_wchar_get_date(this, &s, s, e, base, err, t);
11295 break;
11296 case 'y':
11297 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11298 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
11299 t->tm_year += 100;
11300 break;
11301 case 'Y':
11302 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11303 break;
11304 default:
11305 FIXME("unrecognized format: %c\n", fmt);
11306 *err |= IOSTATE_failbit;
11309 if(!s.strbuf)
11310 *err |= IOSTATE_eofbit;
11311 *ret = s;
11312 return ret;
11315 /* ?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 */
11316 /* ?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 */
11317 DEFINE_THISCALL_WRAPPER(time_get_wchar_get, 44)
11318 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar *this,
11319 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11320 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11322 return call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod);
11325 /* ?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 */
11326 /* ?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 */
11327 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_fmt, 44)
11328 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_fmt(const time_get_wchar *this,
11329 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11330 ios_base *base, int *err, struct tm *t, const wchar_t *fmtstart, const wchar_t *fmtend)
11332 ctype_wchar *ctype;
11334 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_wn(fmtstart, fmtend-fmtstart));
11336 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11337 istreambuf_iterator_wchar_val(&s);
11339 while(fmtstart < fmtend) {
11340 if(ctype_wchar_is_ch(ctype, _SPACE, *fmtstart)) {
11341 skip_ws_wchar(ctype, &s);
11342 fmtstart++;
11343 continue;
11346 if(!s.strbuf) {
11347 *err |= IOSTATE_failbit;
11348 break;
11351 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
11352 if(s.val != *fmtstart)
11353 *err |= IOSTATE_failbit;
11354 else
11355 istreambuf_iterator_wchar_inc(&s);
11356 if(*fmtstart == '%')
11357 fmtstart++;
11358 } else {
11359 fmtstart++;
11360 time_get_wchar_get(this, &s, s, e, base, err, t, *fmtstart, 0);
11363 if(*err & IOSTATE_failbit)
11364 break;
11365 fmtstart++;
11368 if(!s.strbuf)
11369 *err |= IOSTATE_eofbit;
11370 *ret = s;
11371 return ret;
11374 /* ??_7_Locimp@locale@std@@6B@ */
11375 extern const vtable_ptr locale__Locimp_vtable;
11377 /* ??0_Locimp@locale@std@@AAE@_N@Z */
11378 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
11379 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
11380 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, bool transparent)
11382 TRACE("(%p %d)\n", this, transparent);
11384 memset(this, 0, sizeof(locale__Locimp));
11385 locale_facet_ctor_refs(&this->facet, 1);
11386 this->facet.vtable = &locale__Locimp_vtable;
11387 this->transparent = transparent;
11388 locale_string_char_ctor_cstr(&this->name, "*");
11389 return this;
11392 /* ??_F_Locimp@locale@std@@QAEXXZ */
11393 /* ??_F_Locimp@locale@std@@QEAAXXZ */
11394 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
11395 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
11397 return locale__Locimp_ctor_transparent(this, FALSE);
11400 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
11401 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
11402 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
11403 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
11405 _Lockit lock;
11406 size_t i;
11408 TRACE("(%p %p)\n", this, copy);
11410 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11411 memcpy(this, copy, sizeof(locale__Locimp));
11412 locale_facet_ctor_refs(&this->facet, 1);
11413 this->facet.vtable = &locale__Locimp_vtable;
11414 if(copy->facetvec) {
11415 this->facetvec = operator_new(copy->facet_cnt*sizeof(locale_facet*));
11416 for(i=0; i<this->facet_cnt; i++)
11418 this->facetvec[i] = copy->facetvec[i];
11419 if(this->facetvec[i])
11420 call_locale_facet__Incref(this->facetvec[i]);
11423 locale_string_char_copy_ctor(&this->name, &copy->name);
11424 _Lockit_dtor(&lock);
11425 return this;
11428 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
11429 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
11430 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
11432 return locale__Locimp_copy_ctor(this, copy);
11435 /* ??1_Locimp@locale@std@@MAE@XZ */
11436 /* ??1_Locimp@locale@std@@MEAA@XZ */
11437 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
11438 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
11440 size_t i;
11442 TRACE("(%p)\n", this);
11444 locale_facet_dtor(&this->facet);
11445 for(i=0; i<this->facet_cnt; i++)
11446 if(this->facetvec[i] && call_locale_facet__Decref(this->facetvec[i]))
11447 call_locale_facet_vector_dtor(this->facetvec[i], 1);
11449 operator_delete(this->facetvec);
11450 locale_string_char_dtor(&this->name);
11453 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
11454 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
11455 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
11457 locale__Locimp_dtor(this);
11460 DEFINE_THISCALL_WRAPPER(locale__Locimp_vector_dtor, 8)
11461 locale__Locimp* __thiscall locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
11463 TRACE("(%p %x)\n", this, flags);
11464 if(flags & 2) {
11465 /* we have an array, with the number of elements stored before the first object */
11466 INT_PTR i, *ptr = (INT_PTR *)this-1;
11468 for(i=*ptr-1; i>=0; i--)
11469 locale__Locimp_dtor(this+i);
11470 operator_delete(ptr);
11471 } else {
11472 locale__Locimp_dtor(this);
11473 if(flags & 1)
11474 operator_delete(this);
11477 return this;
11480 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@ABV123@@Z */
11481 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@AEBV123@@Z */
11482 locale__Locimp* __cdecl locale__Locimp__New_Locimp(const locale__Locimp *copy)
11484 locale__Locimp *ret;
11486 TRACE("(%p)\n", copy);
11488 ret = operator_new(sizeof(locale__Locimp));
11489 return locale__Locimp_copy_ctor(ret, copy);
11492 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@_N@Z */
11493 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z */
11494 locale__Locimp* __cdecl locale__Locimp__New_Locimp_transparent(bool transparent)
11496 locale__Locimp *ret;
11498 TRACE("(%x)\n", transparent);
11500 ret = operator_new(sizeof(locale__Locimp));
11501 return locale__Locimp_ctor_transparent(ret, transparent);
11504 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
11505 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
11506 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, size_t id)
11508 _Lockit lock;
11510 TRACE("(%p %p %Iu)\n", locimp, facet, id);
11512 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11513 if(id >= locimp->facet_cnt) {
11514 size_t new_size = id+1;
11515 locale_facet **new_facetvec;
11517 if(new_size < 40)
11518 new_size = 40;
11520 new_facetvec = operator_new(sizeof(locale_facet*)*new_size);
11521 memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
11522 memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
11523 operator_delete(locimp->facetvec);
11524 locimp->facetvec = new_facetvec;
11525 locimp->facet_cnt = new_size;
11528 if(locimp->facetvec[id] && call_locale_facet__Decref(locimp->facetvec[id]))
11529 call_locale_facet_vector_dtor(locimp->facetvec[id], 1);
11531 locimp->facetvec[id] = facet;
11532 if(facet)
11533 call_locale_facet__Incref(facet);
11534 _Lockit_dtor(&lock);
11537 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
11538 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
11539 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
11540 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, size_t id)
11542 locale__Locimp__Locimp_Addfac(this, facet, id);
11545 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
11546 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
11547 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
11549 FIXME("stub\n");
11550 return NULL;
11553 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11554 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11555 /* List of missing facets:
11556 * messages, money_get, money_put, moneypunct, moneypunct, time_get
11558 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11560 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11562 if(cat & (1<<(ctype_short__Getcat(NULL, NULL)-1))) {
11563 ctype_wchar *ctype;
11565 if(loc) {
11566 ctype = ctype_short_use_facet(loc);
11567 }else {
11568 ctype = operator_new(sizeof(ctype_wchar));
11569 ctype_short_ctor_locinfo(ctype, locinfo, 0);
11571 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_short_id));
11574 if(cat & (1<<(num_get_short__Getcat(NULL, NULL)-1))) {
11575 num_get *numget;
11577 if(loc) {
11578 numget = num_get_short_use_facet(loc);
11579 }else {
11580 numget = operator_new(sizeof(num_get));
11581 num_get_short_ctor_locinfo(numget, locinfo, 0);
11583 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_short_id));
11586 if(cat & (1<<(num_put_short__Getcat(NULL, NULL)-1))) {
11587 num_put *numput;
11589 if(loc) {
11590 numput = num_put_short_use_facet(loc);
11591 }else {
11592 numput = operator_new(sizeof(num_put));
11593 num_put_short_ctor_locinfo(numput, locinfo, 0);
11595 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_short_id));
11598 if(cat & (1<<(numpunct_short__Getcat(NULL, NULL)-1))) {
11599 numpunct_wchar *numpunct;
11601 if(loc) {
11602 numpunct = numpunct_short_use_facet(loc);
11603 }else {
11604 numpunct = operator_new(sizeof(numpunct_wchar));
11605 numpunct_short_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11607 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_short_id));
11610 if(cat & (1<<(collate_short__Getcat(NULL, NULL)-1))) {
11611 collate *c;
11613 if(loc) {
11614 c = collate_short_use_facet(loc);
11615 }else {
11616 c = operator_new(sizeof(collate));
11617 collate_short_ctor_locinfo(c, locinfo, 0);
11619 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_short_id));
11622 if(cat & (1<<(time_put_short__Getcat(NULL, NULL)-1))) {
11623 time_put *t;
11625 if(loc) {
11626 t = time_put_short_use_facet(loc);
11627 }else {
11628 t = operator_new(sizeof(time_put));
11629 time_put_short_ctor_locinfo(t, locinfo, 0);
11631 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_short_id));
11634 if(cat & (1<<(codecvt_short__Getcat(NULL, NULL)-1))) {
11635 codecvt_wchar *codecvt;
11637 if(loc) {
11638 codecvt = codecvt_short_use_facet(loc);
11639 }else {
11640 codecvt = operator_new(sizeof(codecvt_wchar));
11641 codecvt_short_ctor_locinfo(codecvt, locinfo, 0);
11643 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_short_id));
11647 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11648 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11649 /* List of missing facets:
11650 * messages, money_get, money_put, moneypunct, moneypunct
11652 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11654 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11656 if(cat & (1<<(ctype_wchar__Getcat(NULL, NULL)-1))) {
11657 ctype_wchar *ctype;
11659 if(loc) {
11660 ctype = ctype_wchar_use_facet(loc);
11661 }else {
11662 ctype = operator_new(sizeof(ctype_wchar));
11663 ctype_wchar_ctor_locinfo(ctype, locinfo, 0);
11665 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_wchar_id));
11668 if(cat & (1<<(num_get_wchar__Getcat(NULL, NULL)-1))) {
11669 num_get *numget;
11671 if(loc) {
11672 numget = num_get_wchar_use_facet(loc);
11673 }else {
11674 numget = operator_new(sizeof(num_get));
11675 num_get_wchar_ctor_locinfo(numget, locinfo, 0);
11677 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_wchar_id));
11680 if(cat & (1<<(num_put_wchar__Getcat(NULL, NULL)-1))) {
11681 num_put *numput;
11683 if(loc) {
11684 numput = num_put_wchar_use_facet(loc);
11685 }else {
11686 numput = operator_new(sizeof(num_put));
11687 num_put_wchar_ctor_locinfo(numput, locinfo, 0);
11689 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_wchar_id));
11692 if(cat & (1<<(numpunct_wchar__Getcat(NULL, NULL)-1))) {
11693 numpunct_wchar *numpunct;
11695 if(loc) {
11696 numpunct = numpunct_wchar_use_facet(loc);
11697 }else {
11698 numpunct = operator_new(sizeof(numpunct_wchar));
11699 numpunct_wchar_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11701 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_wchar_id));
11704 if(cat & (1<<(collate_wchar__Getcat(NULL, NULL)-1))) {
11705 collate *c;
11707 if(loc) {
11708 c = collate_wchar_use_facet(loc);
11709 }else {
11710 c = operator_new(sizeof(collate));
11711 collate_wchar_ctor_locinfo(c, locinfo, 0);
11713 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_wchar_id));
11716 if(cat & (1<<(time_get_wchar__Getcat(NULL, NULL)-1))) {
11717 time_get_wchar *t;
11719 if(loc) {
11720 t = time_get_wchar_use_facet(loc);
11721 }else {
11722 t = operator_new(sizeof(time_get_wchar));
11723 time_get_wchar_ctor_locinfo(t, locinfo, 0);
11725 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_wchar_id));
11728 if(cat & (1<<(time_put_wchar__Getcat(NULL, NULL)-1))) {
11729 time_put *t;
11731 if(loc) {
11732 t = time_put_wchar_use_facet(loc);
11733 }else {
11734 t = operator_new(sizeof(time_put));
11735 time_put_wchar_ctor_locinfo(t, locinfo, 0);
11737 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_wchar_id));
11740 if(cat & (1<<(codecvt_wchar__Getcat(NULL, NULL)-1))) {
11741 codecvt_wchar *codecvt;
11743 if(loc) {
11744 codecvt = codecvt_wchar_use_facet(loc);
11745 }else {
11746 codecvt = operator_new(sizeof(codecvt_wchar));
11747 codecvt_wchar_ctor_locinfo(codecvt, locinfo, 0);
11749 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_wchar_id));
11753 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11754 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11755 /* List of missing facets:
11756 * messages, money_get, money_put, moneypunct, moneypunct
11758 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11760 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11762 if(cat & (1<<(ctype_char__Getcat(NULL, NULL)-1))) {
11763 ctype_char *ctype;
11765 if(loc) {
11766 ctype = ctype_char_use_facet(loc);
11767 }else {
11768 ctype = operator_new(sizeof(ctype_char));
11769 ctype_char_ctor_locinfo(ctype, locinfo, 0);
11771 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_char_id));
11774 if(cat & (1<<(num_get_char__Getcat(NULL, NULL)-1))) {
11775 num_get *numget;
11777 if(loc) {
11778 numget = num_get_char_use_facet(loc);
11779 }else {
11780 numget = operator_new(sizeof(num_get));
11781 num_get_char_ctor_locinfo(numget, locinfo, 0);
11783 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_char_id));
11786 if(cat & (1<<(num_put_char__Getcat(NULL, NULL)-1))) {
11787 num_put *numput;
11789 if(loc) {
11790 numput = num_put_char_use_facet(loc);
11791 }else {
11792 numput = operator_new(sizeof(num_put));
11793 num_put_char_ctor_locinfo(numput, locinfo, 0);
11795 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_char_id));
11798 if(cat & (1<<(numpunct_char__Getcat(NULL, NULL)-1))) {
11799 numpunct_char *numpunct;
11801 if(loc) {
11802 numpunct = numpunct_char_use_facet(loc);
11803 }else {
11804 numpunct = operator_new(sizeof(numpunct_char));
11805 numpunct_char_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11807 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_char_id));
11810 if(cat & (1<<(collate_char__Getcat(NULL, NULL)-1))) {
11811 collate *c;
11813 if(loc) {
11814 c = collate_char_use_facet(loc);
11815 }else {
11816 c = operator_new(sizeof(collate));
11817 collate_char_ctor_locinfo(c, locinfo, 0);
11819 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_char_id));
11822 if(cat & (1<<(time_get_char__Getcat(NULL, NULL)-1))) {
11823 time_get_char *t;
11825 if(loc) {
11826 t = time_get_char_use_facet(loc);
11827 }else {
11828 t = operator_new(sizeof(time_get_char));
11829 time_get_char_ctor_locinfo(t, locinfo, 0);
11831 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_char_id));
11834 if(cat & (1<<(time_put_char__Getcat(NULL, NULL)-1))) {
11835 time_put *t;
11837 if(loc) {
11838 t = time_put_char_use_facet(loc);
11839 }else {
11840 t = operator_new(sizeof(time_put));
11841 time_put_char_ctor_locinfo(t, locinfo, 0);
11843 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_char_id));
11846 if(cat & (1<<(codecvt_char__Getcat(NULL, NULL)-1))) {
11847 codecvt_char *codecvt;
11849 if(loc) {
11850 codecvt = codecvt_char_use_facet(loc);
11851 }else {
11852 codecvt = operator_new(sizeof(codecvt_char));
11853 codecvt_char_ctor_locinfo(codecvt, locinfo, 0);
11855 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_char_id));
11859 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
11860 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11861 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11863 TRACE("(%p %d %p %p)\n", locinfo, cat, locimp, loc);
11865 locale__Locimp__Makexloc(locinfo, cat, locimp, loc);
11866 locale__Locimp__Makewloc(locinfo, cat, locimp, loc);
11867 locale__Locimp__Makeushloc(locinfo, cat, locimp, loc);
11869 locimp->catmask |= cat;
11870 locale_string_char_assign(&locimp->name, &locinfo->newlocname);
11871 return locimp;
11874 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
11875 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
11876 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
11877 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
11879 TRACE("(%p %p)\n", this, locimp);
11880 /* Don't change locimp reference counter */
11881 this->ptr = locimp;
11882 return this;
11885 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
11886 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
11887 locale__Locimp* __cdecl locale__Init(void)
11889 _Lockit lock;
11891 TRACE("\n");
11893 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11894 if(global_locale) {
11895 _Lockit_dtor(&lock);
11896 return global_locale;
11899 global_locale = operator_new(sizeof(locale__Locimp));
11900 locale__Locimp_ctor(global_locale);
11901 global_locale->catmask = (1<<(LC_MAX+1))-1;
11902 locale_string_char_dtor(&global_locale->name);
11903 locale_string_char_ctor_cstr(&global_locale->name, "C");
11905 locale__Locimp__Clocptr = global_locale;
11906 global_locale->facet.refs++;
11907 locale_ctor_locimp(&classic_locale, locale__Locimp__Clocptr);
11908 _Lockit_dtor(&lock);
11910 return global_locale;
11913 /* ?_Init@locale@std@@CAPAV_Locimp@12@_N@Z */
11914 /* ?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z */
11915 locale__Locimp* __cdecl locale__Init_ref(bool inc_ref)
11917 locale__Locimp *ret;
11918 _Lockit lock;
11920 TRACE("(%x)\n", inc_ref);
11922 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11923 if(inc_ref && global_locale) {
11924 call_locale_facet__Incref(&global_locale->facet);
11925 _Lockit_dtor(&lock);
11926 return global_locale;
11929 ret = locale__Init();
11930 _Lockit_dtor(&lock);
11931 return ret;
11934 /* ?_Iscloc@locale@std@@QBE_NXZ */
11935 /* ?_Iscloc@locale@std@@QEBA_NXZ */
11936 DEFINE_THISCALL_WRAPPER(locale__Iscloc, 4)
11937 bool __thiscall locale__Iscloc(const locale *this)
11939 TRACE("(%p)\n", this);
11940 return this->ptr == locale__Locimp__Clocptr;
11943 /* ??0locale@std@@QAE@ABV01@0H@Z */
11944 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
11945 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
11946 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
11948 _Locinfo locinfo;
11950 TRACE("(%p %p %p %d)\n", this, loc, other, cat);
11952 this->ptr = operator_new(sizeof(locale__Locimp));
11953 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
11955 _Locinfo_ctor_cat_cstr(&locinfo, loc->ptr->catmask, locale_string_char_c_str(&loc->ptr->name));
11956 _Locinfo__Addcats(&locinfo, cat & other->ptr->catmask, locale_string_char_c_str(&other->ptr->name));
11957 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, other);
11958 _Locinfo_dtor(&locinfo);
11960 return this;
11963 /* ??0locale@std@@QAE@ABV01@@Z */
11964 /* ??0locale@std@@QEAA@AEBV01@@Z */
11965 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
11966 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
11968 TRACE("(%p %p)\n", this, copy);
11969 this->ptr = copy->ptr;
11970 call_locale_facet__Incref(&this->ptr->facet);
11971 return this;
11974 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
11975 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
11976 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
11977 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
11979 _Locinfo locinfo;
11981 TRACE("(%p %p %s %d)\n", this, loc, locname, cat);
11983 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
11984 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
11985 _Locinfo_dtor(&locinfo);
11986 operator_delete(this->ptr);
11987 _Xruntime_error("bad locale name");
11990 this->ptr = operator_new(sizeof(locale__Locimp));
11991 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
11993 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
11994 _Locinfo_dtor(&locinfo);
11995 return this;
11998 /* ??0locale@std@@QAE@PBDH@Z */
11999 /* ??0locale@std@@QEAA@PEBDH@Z */
12000 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
12001 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
12003 _Locinfo locinfo;
12005 TRACE("(%p %s %d)\n", this, locname, cat);
12007 this->ptr = operator_new(sizeof(locale__Locimp));
12008 locale__Locimp_ctor(this->ptr);
12010 locale__Init();
12012 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
12013 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
12014 _Locinfo_dtor(&locinfo);
12015 operator_delete(this->ptr);
12016 _Xruntime_error("bad locale name");
12019 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
12020 _Locinfo_dtor(&locinfo);
12022 return this;
12025 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
12026 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
12027 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
12028 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
12030 TRACE("(%p)\n", this);
12031 this->ptr = NULL;
12032 return this;
12035 /* ??0locale@std@@QAE@XZ */
12036 /* ??0locale@std@@QEAA@XZ */
12037 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
12038 locale* __thiscall locale_ctor(locale *this)
12040 TRACE("(%p)\n", this);
12041 this->ptr = locale__Init();
12042 call_locale_facet__Incref(&this->ptr->facet);
12043 return this;
12046 /* ??1locale@std@@QAE@XZ */
12047 /* ??1locale@std@@QEAA@XZ */
12048 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
12049 void __thiscall locale_dtor(locale *this)
12051 TRACE("(%p)\n", this);
12052 if(this->ptr && call_locale_facet__Decref(&this->ptr->facet))
12054 locale__Locimp_dtor(this->ptr);
12055 operator_delete(this->ptr);
12059 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
12060 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
12061 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
12062 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
12064 FIXME("(%p %p) stub\n", this, loc);
12065 return NULL;
12068 /* ??8locale@std@@QBE_NABV01@@Z */
12069 /* ??8locale@std@@QEBA_NAEBV01@@Z */
12070 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
12071 bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
12073 FIXME("(%p %p) stub\n", this, loc);
12074 return 0;
12077 /* ??9locale@std@@QBE_NABV01@@Z */
12078 /* ??9locale@std@@QEBA_NAEBV01@@Z */
12079 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
12080 bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
12082 FIXME("(%p %p) stub\n", this, loc);
12083 return 0;
12086 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
12087 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
12088 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
12089 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, size_t id, size_t catmask)
12091 TRACE("(%p %p %Iu %Iu)\n", this, facet, id, catmask);
12093 if(this->ptr->facet.refs > 1) {
12094 locale__Locimp *new_ptr = operator_new(sizeof(locale__Locimp));
12095 locale__Locimp_copy_ctor(new_ptr, this->ptr);
12096 call_locale_facet__Decref(&this->ptr->facet);
12097 this->ptr = new_ptr;
12100 locale__Locimp__Addfac(this->ptr, facet, id);
12102 if(catmask) {
12103 locale_string_char_dtor(&this->ptr->name);
12104 locale_string_char_ctor_cstr(&this->ptr->name, "*");
12106 return this;
12109 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I_N@Z */
12110 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K_N@Z */
12111 DEFINE_THISCALL_WRAPPER(locale__Getfacet_bool, 12)
12112 const locale_facet* __thiscall locale__Getfacet_bool(const locale *this,
12113 size_t id, bool allow_transparent)
12115 locale_facet *fac;
12117 TRACE("(%p %Iu)\n", this, id);
12119 fac = id < this->ptr->facet_cnt ? this->ptr->facetvec[id] : NULL;
12120 if(fac || !this->ptr->transparent || !allow_transparent)
12121 return fac;
12123 return id < global_locale->facet_cnt ? global_locale->facetvec[id] : NULL;
12126 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
12127 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
12128 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
12129 const locale_facet* __thiscall locale__Getfacet(const locale *this, size_t id)
12131 return locale__Getfacet_bool( this, id, TRUE );
12134 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
12135 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
12136 locale__Locimp* __cdecl locale__Getgloballocale(void)
12138 TRACE("\n");
12139 return global_locale;
12142 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
12143 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
12144 void __cdecl locale__Setgloballocale(void *locimp)
12146 TRACE("(%p)\n", locimp);
12147 global_locale = locimp;
12150 /* ?classic@locale@std@@SAABV12@XZ */
12151 /* ?classic@locale@std@@SAAEBV12@XZ */
12152 const locale* __cdecl locale_classic(void)
12154 TRACE("\n");
12155 locale__Init();
12156 return &classic_locale;
12159 /* ?empty@locale@std@@SA?AV12@XZ */
12160 locale* __cdecl locale_empty(locale *ret)
12162 TRACE("\n");
12164 locale__Init();
12166 ret->ptr = operator_new(sizeof(locale__Locimp));
12167 locale__Locimp_ctor_transparent(ret->ptr, TRUE);
12168 return ret;
12171 /* ?global@locale@std@@SA?AV12@ABV12@@Z */
12172 /* ?global@locale@std@@SA?AV12@AEBV12@@Z */
12173 locale* __cdecl locale_global(locale *ret, const locale *loc)
12175 _Lockit lock;
12176 int i;
12178 TRACE("(%p %p)\n", loc, ret);
12180 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12181 locale_ctor(ret);
12183 if(loc->ptr != global_locale) {
12184 call_locale_facet__Decref(&global_locale->facet);
12185 global_locale = loc->ptr;
12186 call_locale_facet__Incref(&global_locale->facet);
12188 for(i=LC_ALL+1; i<=LC_MAX; i++) {
12189 if((global_locale->catmask & (1<<(i-1))) == 0)
12190 continue;
12191 setlocale(i, locale_string_char_c_str(&global_locale->name));
12194 _Lockit_dtor(&lock);
12195 return ret;
12198 #if _MSVCP_VER < 100
12200 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12201 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12202 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
12203 basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
12205 TRACE("(%p)\n", this);
12207 MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
12208 return ret;
12211 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12212 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12213 DEFINE_THISCALL_WRAPPER(locale_name, 8)
12214 basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
12216 TRACE( "(%p)\n", this);
12217 MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
12218 return ret;
12221 #else
12223 /* ?_Getname@_Locinfo@std@@QBEPBDXZ */
12224 /* ?_Getname@_Locinfo@std@@QEBAPEBDXZ */
12225 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 4)
12226 const char * __thiscall _Locinfo__Getname( const _Locinfo *this )
12228 return locale_string_char_c_str( &this->newlocname );
12231 #endif /* _MSVCP_VER < 100 */
12233 /* wctrans */
12234 wctrans_t __cdecl wctrans(const char *property)
12236 static const char str_tolower[] = "tolower";
12237 static const char str_toupper[] = "toupper";
12239 if(!strcmp(property, str_tolower))
12240 return 2;
12241 if(!strcmp(property, str_toupper))
12242 return 1;
12243 return 0;
12246 /* towctrans */
12247 wint_t __cdecl towctrans(wint_t c, wctrans_t category)
12249 if(category == 1)
12250 return towupper(c);
12251 return towlower(c);
12254 #if _MSVCP_VER <= 71
12255 /* btowc */
12256 wint_t __cdecl btowc(int c)
12258 wchar_t ret;
12259 int state = 0;
12260 char ch = c;
12262 if (c == EOF || _Mbrtowc( &ret, &ch, 1, &state, NULL ) != 1) return WEOF;
12263 return ret;
12266 /* mbrlen */
12267 size_t __cdecl mbrlen(const char *str, size_t n, mbstate_t *state)
12269 static int local_state;
12271 if (!state) state = &local_state;
12272 return _Mbrtowc( NULL, str, n, state, NULL );
12275 /* mbrtowc */
12276 size_t __cdecl mbrtowc(wchar_t *dst, const char *str, size_t n, mbstate_t *state)
12278 static int local_state;
12280 if (!state) state = &local_state;
12281 return _Mbrtowc( dst, str, n, state, NULL );
12284 /* mbsrtowcs */
12285 size_t __cdecl mbsrtowcs(wchar_t *dst, const char **pstr, size_t n, mbstate_t *state)
12287 static int local_state;
12288 size_t ret = 0;
12289 wchar_t wc;
12290 const char *src;
12292 src = *pstr;
12293 if (!state) state = &local_state;
12295 while (!dst || n > ret)
12297 int len = _Mbrtowc( &wc, src, 2, state, NULL );
12298 if (len < 0) return -1;
12299 if (!len) break;
12300 if (dst) dst[ret] = wc;
12301 ret++;
12302 if (!wc) break;
12303 src += len;
12305 return ret;
12308 /* wctob */
12309 int __cdecl wctob(wint_t wc)
12311 char ret[MB_LEN_MAX];
12313 if (wc == WEOF || _Wcrtomb( ret, wc, NULL, NULL ) != 1) return EOF;
12314 return ret[0];
12317 /* wcrtomb */
12318 size_t __cdecl wcrtomb(char *dst, wchar_t wc, mbstate_t *state)
12320 return _Wcrtomb( dst, wc, state, NULL );
12323 /* wcsrtombs */
12324 size_t __cdecl wcsrtombs(char *dst, const wchar_t **pstr, size_t n, mbstate_t *state)
12326 const wchar_t *src;
12327 char buffer[MB_LEN_MAX];
12328 size_t ret = 0;
12330 src = *pstr;
12332 while (!dst || n > ret)
12334 int len = _Wcrtomb( buffer, *src, state, NULL );
12335 if (len <= 0) return -1;
12336 if (n < ret + len) break;
12337 memcpy( dst + ret, buffer, len );
12338 ret += len;
12339 if (!buffer[0]) break;
12340 src++;
12342 return ret;
12344 #endif
12346 int __cdecl _To_byte(const wchar_t *src, char *dst)
12348 TRACE("(%s %p)\n", debugstr_w(src), dst);
12349 return WideCharToMultiByte(CP_ACP, 0, src, -1, dst, MAX_PATH, NULL, NULL);
12352 int __cdecl _To_wide(const char *src, wchar_t *dst)
12354 TRACE("(%s %p)\n", debugstr_a(src), dst);
12355 return MultiByteToWideChar(CP_ACP, 0, src, -1, dst, MAX_PATH);
12358 size_t __cdecl _Strxfrm(char *dest, char *dest_end,
12359 const char *src, const char *src_end, _Collvec *coll)
12361 size_t dest_len = dest_end - dest;
12362 size_t src_len = src_end - src;
12363 _Collvec cv;
12364 WCHAR *buf;
12365 LCID lcid;
12366 int len;
12368 TRACE("(%p %p %p %p %p)\n", dest, dest_end, src, src_end, coll);
12370 if (coll) cv = *coll;
12371 else getcoll(&cv);
12373 #if _MSVCP_VER < 110
12374 lcid = cv.handle;
12375 #else
12376 lcid = LocaleNameToLCID(cv.lc_name, 0);
12377 #endif
12379 if (!lcid && !cv.page)
12381 if (src_len > dest_len) return src_len;
12382 memcpy(dest, src, src_len);
12383 return src_len;
12386 len = MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, NULL, 0);
12387 if (!len) return INT_MAX;
12388 buf = heap_alloc(len * sizeof(WCHAR));
12389 if (!buf) return INT_MAX;
12390 MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, buf, len);
12392 len = LCMapStringW(lcid, LCMAP_SORTKEY, buf, len, NULL, 0);
12393 if (len <= dest_len)
12394 LCMapStringW(lcid, LCMAP_SORTKEY, buf, len, (WCHAR*)dest, dest_len);
12395 heap_free(buf);
12396 return len;
12399 size_t __cdecl _Wcsxfrm(wchar_t *dest, wchar_t *dest_end,
12400 const wchar_t *src, const wchar_t *src_end, _Collvec *coll)
12402 size_t dest_len = dest_end - dest;
12403 size_t src_len = src_end - src;
12404 _Collvec cv;
12405 LCID lcid;
12406 int i, len;
12408 TRACE("(%p %p %p %p %p)\n", dest, dest_end, src, src_end, coll);
12410 if (coll) cv = *coll;
12411 else getcoll(&cv);
12413 #if _MSVCP_VER < 110
12414 lcid = cv.handle;
12415 #else
12416 lcid = LocaleNameToLCID(cv.lc_name, 0);
12417 #endif
12419 if (!lcid)
12421 if (src_len > dest_len) return src_len;
12422 memcpy(dest, src, src_len * sizeof(wchar_t));
12423 return src_len;
12426 len = LCMapStringW(lcid, LCMAP_SORTKEY, src, src_len, NULL, 0);
12427 if (!len) return INT_MAX;
12428 if (len > dest_len) return len;
12430 LCMapStringW(lcid, LCMAP_SORTKEY, src, src_len, dest, dest_len);
12431 for (i = len - 1; i >= 0; i--)
12432 dest[i] = ((BYTE*)dest)[i];
12433 return len;
12436 DEFINE_RTTI_DATA0(_Facet_base, 0, ".?AV_Facet_base@std@@")
12437 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@")
12438 DEFINE_RTTI_DATA1(locale__Locimp, 0, &locale_facet_rtti_base_descriptor, ".?AV_Locimp@locale@std@@")
12439 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@")
12440 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@")
12441 DEFINE_RTTI_DATA1(collate_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@G@std@@")
12442 DEFINE_RTTI_DATA1(ctype_base, 0, &locale_facet_rtti_base_descriptor, ".?AUctype_base@std@@")
12443 DEFINE_RTTI_DATA2(ctype_char, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@D@std@@")
12444 DEFINE_RTTI_DATA2(ctype_wchar, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@_W@std@@")
12445 DEFINE_RTTI_DATA2(ctype_short, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@G@std@@")
12446 DEFINE_RTTI_DATA1(codecvt_base, 0, &locale_facet_rtti_base_descriptor, ".?AVcodecvt_base@std@@")
12447 #if _MSVCP_VER >= 140
12448 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDU_Mbstatet@@@std@@")
12449 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDU_Mbstatet@@@std@@")
12450 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDU_Mbstatet@@@std@@")
12451 #else
12452 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDH@std@@")
12453 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDH@std@@")
12454 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDH@std@@")
12455 #endif
12456 DEFINE_RTTI_DATA1(numpunct_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@D@std@@")
12457 DEFINE_RTTI_DATA1(numpunct_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@_W@std@@")
12458 DEFINE_RTTI_DATA1(numpunct_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@G@std@@")
12459 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@@")
12460 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@@")
12461 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@@")
12462 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@@")
12463 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@@")
12464 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@@")
12465 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@@")
12466 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@@")
12467 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@@")
12468 DEFINE_RTTI_DATA1(time_base, 0, &locale_facet_rtti_base_descriptor, ".?AUtime_base@std@@")
12469 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@@")
12470 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@@")
12472 __ASM_BLOCK_BEGIN(locale_vtables)
12473 __ASM_VTABLE(_Facet_base,
12474 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12475 VTABLE_ADD_FUNC(locale_facet__Incref)
12476 VTABLE_ADD_FUNC(locale_facet__Incref)
12478 __ASM_VTABLE(locale_facet,
12479 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12480 #if _MSVCP_VER >= 110
12481 VTABLE_ADD_FUNC(locale_facet__Incref)
12482 VTABLE_ADD_FUNC(locale_facet__Decref)
12483 #endif
12485 __ASM_VTABLE(locale__Locimp,
12486 VTABLE_ADD_FUNC(locale__Locimp_vector_dtor)
12487 #if _MSVCP_VER >= 110
12488 VTABLE_ADD_FUNC(locale_facet__Incref)
12489 VTABLE_ADD_FUNC(locale_facet__Decref)
12490 #endif
12492 __ASM_VTABLE(collate_char,
12493 VTABLE_ADD_FUNC(collate_char_vector_dtor)
12494 #if _MSVCP_VER >= 110
12495 VTABLE_ADD_FUNC(locale_facet__Incref)
12496 VTABLE_ADD_FUNC(locale_facet__Decref)
12497 #endif
12498 VTABLE_ADD_FUNC(collate_char_do_compare)
12499 VTABLE_ADD_FUNC(collate_char_do_transform)
12500 VTABLE_ADD_FUNC(collate_char_do_hash));
12501 __ASM_VTABLE(collate_wchar,
12502 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12503 #if _MSVCP_VER >= 110
12504 VTABLE_ADD_FUNC(locale_facet__Incref)
12505 VTABLE_ADD_FUNC(locale_facet__Decref)
12506 #endif
12507 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12508 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12509 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12510 __ASM_VTABLE(collate_short,
12511 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12512 #if _MSVCP_VER >= 110
12513 VTABLE_ADD_FUNC(locale_facet__Incref)
12514 VTABLE_ADD_FUNC(locale_facet__Decref)
12515 #endif
12516 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12517 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12518 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12519 __ASM_VTABLE(ctype_base,
12520 VTABLE_ADD_FUNC(ctype_base_vector_dtor)
12521 #if _MSVCP_VER >= 110
12522 VTABLE_ADD_FUNC(locale_facet__Incref)
12523 VTABLE_ADD_FUNC(locale_facet__Decref)
12524 #endif
12526 __ASM_VTABLE(ctype_char,
12527 VTABLE_ADD_FUNC(ctype_char_vector_dtor)
12528 #if _MSVCP_VER >= 110
12529 VTABLE_ADD_FUNC(locale_facet__Incref)
12530 VTABLE_ADD_FUNC(locale_facet__Decref)
12531 #endif
12532 VTABLE_ADD_FUNC(ctype_char_do_tolower)
12533 VTABLE_ADD_FUNC(ctype_char_do_tolower_ch)
12534 VTABLE_ADD_FUNC(ctype_char_do_toupper)
12535 VTABLE_ADD_FUNC(ctype_char_do_toupper_ch)
12536 VTABLE_ADD_FUNC(ctype_char_do_widen)
12537 VTABLE_ADD_FUNC(ctype_char_do_widen_ch)
12538 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12539 VTABLE_ADD_FUNC(ctype_char__Do_widen_s)
12540 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12541 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12542 VTABLE_ADD_FUNC(ctype_char__Do_narrow_s)
12543 #else
12544 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12545 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12546 #endif
12548 __ASM_VTABLE(ctype_wchar,
12549 VTABLE_ADD_FUNC(ctype_wchar_vector_dtor)
12550 #if _MSVCP_VER >= 110
12551 VTABLE_ADD_FUNC(locale_facet__Incref)
12552 VTABLE_ADD_FUNC(locale_facet__Decref)
12553 #endif
12554 VTABLE_ADD_FUNC(ctype_wchar_do_is)
12555 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12556 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12557 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12558 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12559 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12560 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12561 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12562 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12563 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12564 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12565 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12566 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12567 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12568 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12569 #else
12570 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12571 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12572 #endif
12574 __ASM_VTABLE(ctype_short,
12575 VTABLE_ADD_FUNC(ctype_wchar_vector_dtor)
12576 #if _MSVCP_VER >= 110
12577 VTABLE_ADD_FUNC(locale_facet__Incref)
12578 VTABLE_ADD_FUNC(locale_facet__Decref)
12579 #endif
12580 VTABLE_ADD_FUNC(ctype_wchar_do_is)
12581 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12582 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12583 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12584 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12585 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12586 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12587 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12588 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12589 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12590 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12591 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12592 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12593 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12594 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12595 #else
12596 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12597 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12598 #endif
12600 __ASM_VTABLE(codecvt_base,
12601 VTABLE_ADD_FUNC(codecvt_base_vector_dtor)
12602 #if _MSVCP_VER >= 110
12603 VTABLE_ADD_FUNC(locale_facet__Incref)
12604 VTABLE_ADD_FUNC(locale_facet__Decref)
12605 #endif
12606 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
12607 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12608 VTABLE_ADD_FUNC(codecvt_base_do_encoding));
12609 __ASM_VTABLE(codecvt_char,
12610 VTABLE_ADD_FUNC(codecvt_char_vector_dtor)
12611 #if _MSVCP_VER >= 110
12612 VTABLE_ADD_FUNC(locale_facet__Incref)
12613 VTABLE_ADD_FUNC(locale_facet__Decref)
12614 VTABLE_ADD_FUNC(codecvt_char_do_always_noconv)
12615 #else
12616 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
12617 #endif
12618 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12619 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12620 VTABLE_ADD_FUNC(codecvt_char_do_in)
12621 VTABLE_ADD_FUNC(codecvt_char_do_out)
12622 VTABLE_ADD_FUNC(codecvt_char_do_unshift)
12623 VTABLE_ADD_FUNC(codecvt_char_do_length));
12624 __ASM_VTABLE(codecvt_wchar,
12625 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12626 #if _MSVCP_VER >= 110
12627 VTABLE_ADD_FUNC(locale_facet__Incref)
12628 VTABLE_ADD_FUNC(locale_facet__Decref)
12629 #endif
12630 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12631 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12632 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12633 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12634 #else
12635 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12636 #endif
12637 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12638 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12639 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12640 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12641 __ASM_VTABLE(codecvt_short,
12642 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12643 #if _MSVCP_VER >= 110
12644 VTABLE_ADD_FUNC(locale_facet__Incref)
12645 VTABLE_ADD_FUNC(locale_facet__Decref)
12646 #endif
12647 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12648 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12649 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12650 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12651 #else
12652 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12653 #endif
12654 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12655 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12656 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12657 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12658 __ASM_VTABLE(numpunct_char,
12659 VTABLE_ADD_FUNC(numpunct_char_vector_dtor)
12660 #if _MSVCP_VER >= 110
12661 VTABLE_ADD_FUNC(locale_facet__Incref)
12662 VTABLE_ADD_FUNC(locale_facet__Decref)
12663 #endif
12664 VTABLE_ADD_FUNC(numpunct_char_do_decimal_point)
12665 VTABLE_ADD_FUNC(numpunct_char_do_thousands_sep)
12666 VTABLE_ADD_FUNC(numpunct_char_do_grouping)
12667 VTABLE_ADD_FUNC(numpunct_char_do_falsename)
12668 VTABLE_ADD_FUNC(numpunct_char_do_truename));
12669 __ASM_VTABLE(numpunct_wchar,
12670 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
12671 #if _MSVCP_VER >= 110
12672 VTABLE_ADD_FUNC(locale_facet__Incref)
12673 VTABLE_ADD_FUNC(locale_facet__Decref)
12674 #endif
12675 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
12676 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
12677 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
12678 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
12679 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
12680 __ASM_VTABLE(numpunct_short,
12681 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
12682 #if _MSVCP_VER >= 110
12683 VTABLE_ADD_FUNC(locale_facet__Incref)
12684 VTABLE_ADD_FUNC(locale_facet__Decref)
12685 #endif
12686 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
12687 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
12688 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
12689 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
12690 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
12691 __ASM_VTABLE(num_get_char,
12692 VTABLE_ADD_FUNC(num_get_char_vector_dtor)
12693 #if _MSVCP_VER >= 110
12694 VTABLE_ADD_FUNC(locale_facet__Incref)
12695 VTABLE_ADD_FUNC(locale_facet__Decref)
12696 #endif
12697 VTABLE_ADD_FUNC(num_get_char_do_get_void)
12698 VTABLE_ADD_FUNC(num_get_char_do_get_double)
12699 VTABLE_ADD_FUNC(num_get_char_do_get_double)
12700 VTABLE_ADD_FUNC(num_get_char_do_get_float)
12701 VTABLE_ADD_FUNC(num_get_char_do_get_uint64)
12702 VTABLE_ADD_FUNC(num_get_char_do_get_int64)
12703 VTABLE_ADD_FUNC(num_get_char_do_get_ulong)
12704 VTABLE_ADD_FUNC(num_get_char_do_get_long)
12705 VTABLE_ADD_FUNC(num_get_char_do_get_uint)
12706 VTABLE_ADD_FUNC(num_get_char_do_get_ushort)
12707 VTABLE_ADD_FUNC(num_get_char_do_get_bool));
12708 __ASM_VTABLE(num_get_short,
12709 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
12710 #if _MSVCP_VER >= 110
12711 VTABLE_ADD_FUNC(locale_facet__Incref)
12712 VTABLE_ADD_FUNC(locale_facet__Decref)
12713 #endif
12714 VTABLE_ADD_FUNC(num_get_short_do_get_void)
12715 VTABLE_ADD_FUNC(num_get_short_do_get_double)
12716 VTABLE_ADD_FUNC(num_get_short_do_get_double)
12717 VTABLE_ADD_FUNC(num_get_short_do_get_float)
12718 VTABLE_ADD_FUNC(num_get_short_do_get_uint64)
12719 VTABLE_ADD_FUNC(num_get_short_do_get_int64)
12720 VTABLE_ADD_FUNC(num_get_short_do_get_ulong)
12721 VTABLE_ADD_FUNC(num_get_short_do_get_long)
12722 VTABLE_ADD_FUNC(num_get_short_do_get_uint)
12723 VTABLE_ADD_FUNC(num_get_short_do_get_ushort)
12724 VTABLE_ADD_FUNC(num_get_short_do_get_bool));
12725 __ASM_VTABLE(num_get_wchar,
12726 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
12727 #if _MSVCP_VER >= 110
12728 VTABLE_ADD_FUNC(locale_facet__Incref)
12729 VTABLE_ADD_FUNC(locale_facet__Decref)
12730 #endif
12731 VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
12732 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
12733 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
12734 VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
12735 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
12736 VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
12737 VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
12738 VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
12739 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
12740 VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
12741 VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
12742 __ASM_VTABLE(num_put_char,
12743 VTABLE_ADD_FUNC(num_put_char_vector_dtor)
12744 #if _MSVCP_VER >= 110
12745 VTABLE_ADD_FUNC(locale_facet__Incref)
12746 VTABLE_ADD_FUNC(locale_facet__Decref)
12747 #endif
12748 VTABLE_ADD_FUNC(num_put_char_do_put_ptr)
12749 VTABLE_ADD_FUNC(num_put_char_do_put_double)
12750 VTABLE_ADD_FUNC(num_put_char_do_put_double)
12751 VTABLE_ADD_FUNC(num_put_char_do_put_uint64)
12752 VTABLE_ADD_FUNC(num_put_char_do_put_int64)
12753 VTABLE_ADD_FUNC(num_put_char_do_put_ulong)
12754 VTABLE_ADD_FUNC(num_put_char_do_put_long)
12755 VTABLE_ADD_FUNC(num_put_char_do_put_bool));
12756 __ASM_VTABLE(num_put_wchar,
12757 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
12758 #if _MSVCP_VER >= 110
12759 VTABLE_ADD_FUNC(locale_facet__Incref)
12760 VTABLE_ADD_FUNC(locale_facet__Decref)
12761 #endif
12762 VTABLE_ADD_FUNC(num_put_wchar_do_put_ptr)
12763 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
12764 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
12765 VTABLE_ADD_FUNC(num_put_wchar_do_put_uint64)
12766 VTABLE_ADD_FUNC(num_put_wchar_do_put_int64)
12767 VTABLE_ADD_FUNC(num_put_wchar_do_put_ulong)
12768 VTABLE_ADD_FUNC(num_put_wchar_do_put_long)
12769 VTABLE_ADD_FUNC(num_put_wchar_do_put_bool));
12770 __ASM_VTABLE(num_put_short,
12771 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
12772 #if _MSVCP_VER >= 110
12773 VTABLE_ADD_FUNC(locale_facet__Incref)
12774 VTABLE_ADD_FUNC(locale_facet__Decref)
12775 #endif
12776 VTABLE_ADD_FUNC(num_put_short_do_put_ptr)
12777 VTABLE_ADD_FUNC(num_put_short_do_put_double)
12778 VTABLE_ADD_FUNC(num_put_short_do_put_double)
12779 VTABLE_ADD_FUNC(num_put_short_do_put_uint64)
12780 VTABLE_ADD_FUNC(num_put_short_do_put_int64)
12781 VTABLE_ADD_FUNC(num_put_short_do_put_ulong)
12782 VTABLE_ADD_FUNC(num_put_short_do_put_long)
12783 VTABLE_ADD_FUNC(num_put_short_do_put_bool));
12784 __ASM_VTABLE(time_put_char,
12785 VTABLE_ADD_FUNC(time_put_char_vector_dtor)
12786 #if _MSVCP_VER >= 110
12787 VTABLE_ADD_FUNC(locale_facet__Incref)
12788 VTABLE_ADD_FUNC(locale_facet__Decref)
12789 #endif
12790 VTABLE_ADD_FUNC(time_put_char_do_put));
12791 __ASM_VTABLE(time_put_wchar,
12792 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
12793 #if _MSVCP_VER >= 110
12794 VTABLE_ADD_FUNC(locale_facet__Incref)
12795 VTABLE_ADD_FUNC(locale_facet__Decref)
12796 #endif
12797 VTABLE_ADD_FUNC(time_put_wchar_do_put));
12798 __ASM_VTABLE(time_put_short,
12799 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
12800 #if _MSVCP_VER >= 110
12801 VTABLE_ADD_FUNC(locale_facet__Incref)
12802 VTABLE_ADD_FUNC(locale_facet__Decref)
12803 #endif
12804 VTABLE_ADD_FUNC(time_put_wchar_do_put));
12805 __ASM_VTABLE(time_get_char,
12806 VTABLE_ADD_FUNC(time_get_char_vector_dtor)
12807 #if _MSVCP_VER >= 110
12808 VTABLE_ADD_FUNC(locale_facet__Incref)
12809 VTABLE_ADD_FUNC(locale_facet__Decref)
12810 #endif
12811 VTABLE_ADD_FUNC(time_get_char_do_date_order)
12812 VTABLE_ADD_FUNC(time_get_char_do_get_time)
12813 VTABLE_ADD_FUNC(time_get_char_do_get_date)
12814 VTABLE_ADD_FUNC(time_get_char_do_get_weekday)
12815 VTABLE_ADD_FUNC(time_get_char_do_get_monthname)
12816 VTABLE_ADD_FUNC(time_get_char_do_get_year)
12817 #if _MSVCP_VER >= 100
12818 VTABLE_ADD_FUNC(time_get_char_do_get)
12819 #endif
12821 __ASM_VTABLE(time_get_wchar,
12822 VTABLE_ADD_FUNC(time_get_wchar_vector_dtor)
12823 #if _MSVCP_VER >= 110
12824 VTABLE_ADD_FUNC(locale_facet__Incref)
12825 VTABLE_ADD_FUNC(locale_facet__Decref)
12826 #endif
12827 VTABLE_ADD_FUNC(time_get_wchar_do_date_order)
12828 VTABLE_ADD_FUNC(time_get_wchar_do_get_time)
12829 VTABLE_ADD_FUNC(time_get_wchar_do_get_date)
12830 VTABLE_ADD_FUNC(time_get_wchar_do_get_weekday)
12831 VTABLE_ADD_FUNC(time_get_wchar_do_get_monthname)
12832 VTABLE_ADD_FUNC(time_get_wchar_do_get_year)
12833 #if _MSVCP_VER >= 100
12834 VTABLE_ADD_FUNC(time_get_wchar_do_get)
12835 #endif
12837 __ASM_BLOCK_END
12839 void init_locale(void *base)
12841 #ifdef __x86_64__
12842 init__Facet_base_rtti(base);
12843 init_locale_facet_rtti(base);
12844 init_locale__Locimp_rtti(base);
12845 init_collate_char_rtti(base);
12846 init_collate_wchar_rtti(base);
12847 init_collate_short_rtti(base);
12848 init_ctype_base_rtti(base);
12849 init_ctype_char_rtti(base);
12850 init_ctype_wchar_rtti(base);
12851 init_ctype_short_rtti(base);
12852 init_codecvt_base_rtti(base);
12853 init_codecvt_char_rtti(base);
12854 init_codecvt_wchar_rtti(base);
12855 init_codecvt_short_rtti(base);
12856 init_numpunct_char_rtti(base);
12857 init_numpunct_wchar_rtti(base);
12858 init_numpunct_short_rtti(base);
12859 init_num_get_char_rtti(base);
12860 init_num_get_wchar_rtti(base);
12861 init_num_get_short_rtti(base);
12862 init_num_put_char_rtti(base);
12863 init_num_put_wchar_rtti(base);
12864 init_num_put_short_rtti(base);
12865 init_time_put_char_rtti(base);
12866 init_time_put_wchar_rtti(base);
12867 init_time_put_short_rtti(base);
12868 init_time_base_rtti(base);
12869 init_time_get_char_rtti(base);
12870 init_time_get_wchar_rtti(base);
12871 #endif
12874 void free_locale(void)
12876 facets_elem *iter, *safe;
12878 if(global_locale) {
12879 locale_dtor(&classic_locale);
12880 locale__Locimp_dtor(global_locale);
12881 operator_delete(global_locale);
12884 LIST_FOR_EACH_ENTRY_SAFE(iter, safe, &lazy_facets, facets_elem, entry) {
12885 list_remove(&iter->entry);
12886 if(call_locale_facet__Decref(iter->fac))
12887 call_locale_facet_vector_dtor(iter->fac, 1);
12888 operator_delete(iter);