wined3d: Set 3D device caps in adapter_gl_get_wined3d_caps().
[wine.git] / dlls / msvcp90 / locale.c
blob068e81e2df673bf66af40b3591f24dd55a17f82d
1 /*
2 * Copyright 2010 Piotr Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "config.h"
21 #include <stdarg.h>
23 #include "assert.h"
24 #include "locale.h"
25 #include "errno.h"
26 #include "limits.h"
27 #include "math.h"
28 #include "mbctype.h"
29 #include "stdio.h"
30 #include "wchar.h"
31 #include "wctype.h"
32 #include "time.h"
33 #include "windef.h"
34 #include "winbase.h"
35 #include "winnls.h"
36 #include "msvcp90.h"
37 #include "wine/unicode.h"
38 #include "wine/list.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
43 typedef enum {
44 DATEORDER_no_order,
45 DATEORDER_dmy,
46 DATEORDER_mdy,
47 DATEORDER_ymd,
48 DATEORDER_ydm
49 } dateorder;
51 char* __cdecl _Getdays(void);
52 wchar_t* __cdecl _W_Getdays(void);
53 char* __cdecl _Getmonths(void);
54 wchar_t* __cdecl _W_Getmonths(void);
55 void* __cdecl _Gettnames(void);
56 unsigned int __cdecl ___lc_codepage_func(void);
57 int __cdecl ___lc_collate_cp_func(void);
58 const unsigned short* __cdecl __pctype_func(void);
59 const locale_facet* __thiscall locale__Getfacet(const locale*, MSVCP_size_t);
60 MSVCP_size_t __cdecl _Strftime(char*, MSVCP_size_t, const char*,
61 const struct tm*, struct __lc_time_data*);
62 const locale* __cdecl locale_classic(void);
64 #if _MSVCP_VER >= 110
65 wchar_t ** __cdecl ___lc_locale_name_func(void);
66 #else
67 LCID* __cdecl ___lc_handle_func(void);
68 #endif
70 #if _MSVCP_VER < 100
71 #define locale_string basic_string_char
72 #define locale_string_char_ctor(this) MSVCP_basic_string_char_ctor(this)
73 #define locale_string_char_ctor_cstr(this,str) MSVCP_basic_string_char_ctor_cstr(this,str)
74 #define locale_string_char_copy_ctor(this,copy) MSVCP_basic_string_char_copy_ctor(this,copy)
75 #define locale_string_char_dtor(this) MSVCP_basic_string_char_dtor(this)
76 #define locale_string_char_c_str(this) MSVCP_basic_string_char_c_str(this)
77 #define locale_string_char_assign(this,assign) MSVCP_basic_string_char_assign(this,assign)
78 #else
79 #define locale_string _Yarn_char
80 #define locale_string_char_ctor(this) _Yarn_char_ctor(this)
81 #define locale_string_char_ctor_cstr(this,str) _Yarn_char_ctor_cstr(this,str)
82 #define locale_string_char_copy_ctor(this,copy) _Yarn_char_copy_ctor(this,copy)
83 #define locale_string_char_dtor(this) _Yarn_char_dtor(this)
84 #define locale_string_char_c_str(this) _Yarn_char_c_str(this)
85 #define locale_string_char_assign(this,assign) _Yarn_char_op_assign(this,assign)
87 #define locale_string_wchar _Yarn_wchar
88 #define locale_string_wchar_ctor(this) _Yarn_wchar_ctor(this)
89 #define locale_string_wchar_dtor(this) _Yarn_wchar_dtor(this)
90 #define locale_string_wchar_c_str(this) _Yarn_wchar__C_str(this)
91 #define locale_string_wchar_assign(this,str) _Yarn_wchar_op_assign_cstr(this,str)
92 #endif
94 typedef int category;
96 typedef struct {
97 MSVCP_size_t id;
98 } locale_id;
100 typedef struct _locale__Locimp {
101 locale_facet facet;
102 locale_facet **facetvec;
103 MSVCP_size_t facet_cnt;
104 category catmask;
105 MSVCP_bool transparent;
106 locale_string name;
107 } locale__Locimp;
109 typedef struct {
110 void *timeptr;
111 } _Timevec;
113 typedef struct {
114 _Lockit lock;
115 locale_string days;
116 locale_string months;
117 #if _MSVCP_VER >= 110
118 locale_string_wchar wdays;
119 locale_string_wchar wmonths;
120 #endif
121 locale_string oldlocname;
122 locale_string newlocname;
123 } _Locinfo;
125 typedef struct {
126 #if _MSVCP_VER < 110
127 LCID handle;
128 #endif
129 unsigned page;
130 #if _MSVCP_VER >= 110
131 wchar_t *lc_name;
132 #endif
133 } _Collvec;
135 typedef struct {
136 locale_facet facet;
137 _Collvec coll;
138 } collate;
140 typedef struct {
141 locale_facet facet;
142 const char *grouping;
143 char dp;
144 char sep;
145 const char *false_name;
146 const char *true_name;
147 } numpunct_char;
149 typedef struct {
150 locale_facet facet;
151 const char *grouping;
152 wchar_t dp;
153 wchar_t sep;
154 const wchar_t *false_name;
155 const wchar_t *true_name;
156 } numpunct_wchar;
158 typedef struct {
159 locale_facet facet;
160 _Timevec time;
161 #if _MSVCP_VER <= 100
162 _Cvtvec cvt;
163 #endif
164 } time_put;
166 typedef struct {
167 locale_facet facet;
168 const char *days;
169 const char *months;
170 dateorder dateorder;
171 _Cvtvec cvt;
172 } time_get_char;
174 typedef struct {
175 locale_facet facet;
176 const wchar_t *days;
177 const wchar_t *months;
178 dateorder dateorder;
179 _Cvtvec cvt;
180 } time_get_wchar;
182 /* ?_Id_cnt@id@locale@std@@0HA */
183 int locale_id__Id_cnt = 0;
185 static locale classic_locale;
187 /* ?_Global@_Locimp@locale@std@@0PAV123@A */
188 /* ?_Global@_Locimp@locale@std@@0PEAV123@EA */
189 locale__Locimp *global_locale = NULL;
191 /* ?_Clocptr@_Locimp@locale@std@@0PAV123@A */
192 /* ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA */
193 locale__Locimp *locale__Locimp__Clocptr = NULL;
195 static char istreambuf_iterator_char_val(istreambuf_iterator_char *this)
197 if(this->strbuf && !this->got) {
198 int c = basic_streambuf_char_sgetc(this->strbuf);
199 if(c == EOF)
200 this->strbuf = NULL;
201 else
202 this->val = c;
205 this->got = TRUE;
206 return this->val;
209 static wchar_t istreambuf_iterator_wchar_val(istreambuf_iterator_wchar *this)
211 if(this->strbuf && !this->got) {
212 unsigned short c = basic_streambuf_wchar_sgetc(this->strbuf);
213 if(c == WEOF)
214 this->strbuf = NULL;
215 else
216 this->val = c;
219 this->got = TRUE;
220 return this->val;
223 static void istreambuf_iterator_char_inc(istreambuf_iterator_char *this)
225 if(!this->strbuf || basic_streambuf_char_sbumpc(this->strbuf)==EOF) {
226 this->strbuf = NULL;
227 this->got = TRUE;
228 }else {
229 this->got = FALSE;
230 istreambuf_iterator_char_val(this);
234 static void istreambuf_iterator_wchar_inc(istreambuf_iterator_wchar *this)
236 if(!this->strbuf || basic_streambuf_wchar_sbumpc(this->strbuf)==WEOF) {
237 this->strbuf = NULL;
238 this->got = TRUE;
239 }else {
240 this->got = FALSE;
241 istreambuf_iterator_wchar_val(this);
245 static void ostreambuf_iterator_char_put(ostreambuf_iterator_char *this, char ch)
247 if(this->failed || basic_streambuf_char_sputc(this->strbuf, ch)==EOF)
248 this->failed = TRUE;
251 static void ostreambuf_iterator_wchar_put(ostreambuf_iterator_wchar *this, wchar_t ch)
253 if(this->failed || basic_streambuf_wchar_sputc(this->strbuf, ch)==WEOF)
254 this->failed = TRUE;
257 /* ??1facet@locale@std@@UAE@XZ */
258 /* ??1facet@locale@std@@UEAA@XZ */
259 /* ??1facet@locale@std@@MAA@XZ */
260 /* ??1facet@locale@std@@MAE@XZ */
261 /* ??1facet@locale@std@@MEAA@XZ */
262 DEFINE_THISCALL_WRAPPER(locale_facet_dtor, 4)
263 void __thiscall locale_facet_dtor(locale_facet *this)
265 TRACE("(%p)\n", this);
268 DEFINE_THISCALL_WRAPPER(locale_facet_vector_dtor, 8)
269 #define call_locale_facet_vector_dtor(this, flags) CALL_VTBL_FUNC(this, 0, \
270 locale_facet*, (locale_facet*, unsigned int), (this, flags))
271 locale_facet* __thiscall locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
273 TRACE("(%p %x)\n", this, flags);
274 if(flags & 2) {
275 /* we have an array, with the number of elements stored before the first object */
276 INT_PTR i, *ptr = (INT_PTR *)this-1;
278 for(i=*ptr-1; i>=0; i--)
279 locale_facet_dtor(this+i);
280 MSVCRT_operator_delete(ptr);
281 } else {
282 locale_facet_dtor(this);
283 if(flags & 1)
284 MSVCRT_operator_delete(this);
287 return this;
290 typedef struct
292 locale_facet *fac;
293 struct list entry;
294 } facets_elem;
295 static struct list lazy_facets = LIST_INIT(lazy_facets);
297 /* Not exported from msvcp90 */
298 /* ?facet_Register@facet@locale@std@@CAXPAV123@@Z */
299 /* ?facet_Register@facet@locale@std@@CAXPEAV123@@Z */
300 void __cdecl locale_facet_register(locale_facet *add)
302 facets_elem *head = MSVCRT_operator_new(sizeof(*head));
303 if(!head) {
304 ERR("Out of memory\n");
305 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
308 head->fac = add;
309 list_add_head(&lazy_facets, &head->entry);
312 /* Not exported from msvcp90 */
313 /* ?_Register@facet@locale@std@@QAEXXZ */
314 /* ?_Register@facet@locale@std@@QEAAXXZ */
315 DEFINE_THISCALL_WRAPPER(locale_facet__Register, 4)
316 void __thiscall locale_facet__Register(locale_facet *this)
318 TRACE("(%p)\n", this);
319 locale_facet_register(this);
322 /* Not exported from msvcp90 */
323 /* ??_7facet@locale@std@@6B@ */
324 extern const vtable_ptr MSVCP_locale_facet_vtable;
326 /* ??0id@locale@std@@QAE@I@Z */
327 /* ??0id@locale@std@@QEAA@_K@Z */
328 DEFINE_THISCALL_WRAPPER(locale_id_ctor_id, 8)
329 locale_id* __thiscall locale_id_ctor_id(locale_id *this, MSVCP_size_t id)
331 TRACE("(%p %lu)\n", this, id);
333 this->id = id;
334 return this;
337 /* ??_Fid@locale@std@@QAEXXZ */
338 /* ??_Fid@locale@std@@QEAAXXZ */
339 DEFINE_THISCALL_WRAPPER(locale_id_ctor, 4)
340 locale_id* __thiscall locale_id_ctor(locale_id *this)
342 TRACE("(%p)\n", this);
344 this->id = 0;
345 return this;
348 /* ??Bid@locale@std@@QAEIXZ */
349 /* ??Bid@locale@std@@QEAA_KXZ */
350 DEFINE_THISCALL_WRAPPER(locale_id_operator_size_t, 4)
351 MSVCP_size_t __thiscall locale_id_operator_size_t(locale_id *this)
353 _Lockit lock;
355 TRACE("(%p)\n", this);
357 if(!this->id) {
358 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
359 this->id = ++locale_id__Id_cnt;
360 _Lockit_dtor(&lock);
363 return this->id;
366 /* ?_Id_cnt_func@id@locale@std@@CAAAHXZ */
367 /* ?_Id_cnt_func@id@locale@std@@CAAEAHXZ */
368 int* __cdecl locale_id__Id_cnt_func(void)
370 TRACE("\n");
371 return &locale_id__Id_cnt;
374 /* ??_Ffacet@locale@std@@QAEXXZ */
375 /* ??_Ffacet@locale@std@@QEAAXXZ */
376 DEFINE_THISCALL_WRAPPER(locale_facet_ctor, 4)
377 locale_facet* __thiscall locale_facet_ctor(locale_facet *this)
379 TRACE("(%p)\n", this);
380 this->vtable = &MSVCP_locale_facet_vtable;
381 this->refs = 0;
382 return this;
385 /* ??0facet@locale@std@@IAE@I@Z */
386 /* ??0facet@locale@std@@IEAA@_K@Z */
387 DEFINE_THISCALL_WRAPPER(locale_facet_ctor_refs, 8)
388 locale_facet* __thiscall locale_facet_ctor_refs(locale_facet *this, MSVCP_size_t refs)
390 TRACE("(%p %lu)\n", this, refs);
391 this->vtable = &MSVCP_locale_facet_vtable;
392 this->refs = refs;
393 return this;
396 /* ?_Incref@facet@locale@std@@QAEXXZ */
397 /* ?_Incref@facet@locale@std@@QEAAXXZ */
398 /* ?_Incref@facet@locale@std@@UAEXXZ */
399 /* ?_Incref@facet@locale@std@@UEAAXXZ */
400 #if _MSVCP_VER >= 110
401 #define call_locale_facet__Incref(this) CALL_VTBL_FUNC(this, 4, void, (locale_facet*), (this))
402 #else
403 #define call_locale_facet__Incref locale_facet__Incref
404 #endif
405 DEFINE_THISCALL_WRAPPER(locale_facet__Incref, 4)
406 void __thiscall locale_facet__Incref(locale_facet *this)
408 _Lockit lock;
410 TRACE("(%p)\n", this);
412 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
413 this->refs++;
414 _Lockit_dtor(&lock);
417 /* ?_Decref@facet@locale@std@@QAEPAV123@XZ */
418 /* ?_Decref@facet@locale@std@@QEAAPEAV123@XZ */
419 /* ?_Decref@facet@locale@std@@UAEPAV_Facet_base@3@XZ */
420 /* ?_Decref@facet@locale@std@@UEAAPEAV_Facet_base@3@XZ */
421 #if _MSVCP_VER >= 110
422 #define call_locale_facet__Decref(this) CALL_VTBL_FUNC(this, 8, \
423 locale_facet*, (locale_facet*), (this))
424 #else
425 #define call_locale_facet__Decref locale_facet__Decref
426 #endif
427 DEFINE_THISCALL_WRAPPER(locale_facet__Decref, 4)
428 locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
430 _Lockit lock;
431 locale_facet *ret;
433 TRACE("(%p)\n", this);
435 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
436 if(this->refs)
437 this->refs--;
439 ret = this->refs ? NULL : this;
440 _Lockit_dtor(&lock);
442 return ret;
445 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z */
446 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z */
447 MSVCP_size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const locale *loc)
449 TRACE("(%p %p)\n", facet, loc);
450 return -1;
453 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@@Z */
454 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@@Z */
455 MSVCP_size_t __cdecl locale_facet__Getcat_old(const locale_facet **facet)
457 TRACE("(%p)\n", facet);
458 return -1;
461 /* ??0_Timevec@std@@QAE@ABV01@@Z */
462 /* ??0_Timevec@std@@QEAA@AEBV01@@Z */
463 /* This copy constructor modifies copied object */
464 DEFINE_THISCALL_WRAPPER(_Timevec_copy_ctor, 8)
465 _Timevec* __thiscall _Timevec_copy_ctor(_Timevec *this, _Timevec *copy)
467 TRACE("(%p %p)\n", this, copy);
468 this->timeptr = copy->timeptr;
469 copy->timeptr = NULL;
470 return this;
473 /* ??0_Timevec@std@@QAE@PAX@Z */
474 /* ??0_Timevec@std@@QEAA@PEAX@Z */
475 DEFINE_THISCALL_WRAPPER(_Timevec_ctor_timeptr, 8)
476 _Timevec* __thiscall _Timevec_ctor_timeptr(_Timevec *this, void *timeptr)
478 TRACE("(%p %p)\n", this, timeptr);
479 this->timeptr = timeptr;
480 return this;
483 /* ??_F_Timevec@std@@QAEXXZ */
484 /* ??_F_Timevec@std@@QEAAXXZ */
485 DEFINE_THISCALL_WRAPPER(_Timevec_ctor, 4)
486 _Timevec* __thiscall _Timevec_ctor(_Timevec *this)
488 TRACE("(%p)\n", this);
489 this->timeptr = NULL;
490 return this;
493 /* ??1_Timevec@std@@QAE@XZ */
494 /* ??1_Timevec@std@@QEAA@XZ */
495 DEFINE_THISCALL_WRAPPER(_Timevec_dtor, 4)
496 void __thiscall _Timevec_dtor(_Timevec *this)
498 TRACE("(%p)\n", this);
499 free(this->timeptr);
502 /* ??4_Timevec@std@@QAEAAV01@ABV01@@Z */
503 /* ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z */
504 DEFINE_THISCALL_WRAPPER(_Timevec_op_assign, 8)
505 _Timevec* __thiscall _Timevec_op_assign(_Timevec *this, _Timevec *right)
507 TRACE("(%p %p)\n", this, right);
508 this->timeptr = right->timeptr;
509 right->timeptr = NULL;
510 return this;
513 /* ?_Getptr@_Timevec@std@@QBEPAXXZ */
514 /* ?_Getptr@_Timevec@std@@QEBAPEAXXZ */
515 DEFINE_THISCALL_WRAPPER(_Timevec__Getptr, 4)
516 void* __thiscall _Timevec__Getptr(_Timevec *this)
518 TRACE("(%p)\n", this);
519 return this->timeptr;
522 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z */
523 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z */
524 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
526 const char *locale = NULL;
528 /* This function is probably modifying more global objects */
529 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
531 if(!locstr)
532 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
534 _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
535 locale_string_char_ctor(&locinfo->days);
536 locale_string_char_ctor(&locinfo->months);
537 #if _MSVCP_VER >= 110
538 locale_string_wchar_ctor(&locinfo->wdays);
539 locale_string_wchar_ctor(&locinfo->wmonths);
540 #endif
541 locale_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
543 if(category)
544 locale = setlocale(LC_ALL, locstr);
545 else
546 locale = setlocale(LC_ALL, NULL);
548 if(locale)
549 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
550 else
551 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
553 return locinfo;
556 /* ??0_Locinfo@std@@QAE@HPBD@Z */
557 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
558 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
559 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
561 return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
564 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
565 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
566 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
568 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
571 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
572 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
573 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
574 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
576 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
579 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
580 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
581 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
583 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
586 /* ??0_Locinfo@std@@QAE@PBD@Z */
587 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
588 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
589 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
591 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
594 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
595 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
596 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
598 TRACE("(%p)\n", locinfo);
600 setlocale(LC_ALL, locale_string_char_c_str(&locinfo->oldlocname));
601 locale_string_char_dtor(&locinfo->days);
602 locale_string_char_dtor(&locinfo->months);
603 #if _MSVCP_VER >= 110
604 locale_string_wchar_dtor(&locinfo->wdays);
605 locale_string_wchar_dtor(&locinfo->wmonths);
606 #endif
607 locale_string_char_dtor(&locinfo->oldlocname);
608 locale_string_char_dtor(&locinfo->newlocname);
609 _Lockit_dtor(&locinfo->lock);
612 /* ??_F_Locinfo@std@@QAEXXZ */
613 /* ??_F_Locinfo@std@@QEAAXXZ */
614 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
615 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
617 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
620 /* ??1_Locinfo@std@@QAE@XZ */
621 /* ??1_Locinfo@std@@QEAA@XZ */
622 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
623 void __thiscall _Locinfo_dtor(_Locinfo *this)
625 _Locinfo__Locinfo_dtor(this);
628 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
629 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
630 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
632 const char *locale = NULL;
634 /* This function is probably modifying more global objects */
635 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
636 if(!locstr)
637 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
639 locale_string_char_dtor(&locinfo->newlocname);
641 if(category)
642 locale = setlocale(LC_ALL, locstr);
643 else
644 locale = setlocale(LC_ALL, NULL);
646 if(locale)
647 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
648 else
649 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
651 return locinfo;
654 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
655 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
656 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
657 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
659 return _Locinfo__Locinfo_Addcats(this, category, locstr);
662 static _Collvec* getcoll(_Collvec *ret)
664 TRACE("\n");
666 ret->page = ___lc_collate_cp_func();
667 #if _MSVCP_VER < 110
668 ret->handle = ___lc_handle_func()[LC_COLLATE];
669 #else
670 ret->lc_name = ___lc_locale_name_func()[LC_COLLATE];
671 #endif
672 return ret;
675 /* _Getcoll */
676 #if defined(__i386__) || _MSVCP_VER<110
677 ULONGLONG __cdecl _Getcoll(void)
679 ULONGLONG ret;
681 C_ASSERT(sizeof(_Collvec) <= sizeof(ULONGLONG));
683 getcoll((_Collvec*)&ret);
684 return ret;
686 #else
687 _Collvec* __cdecl _Getcoll(_Collvec *ret)
689 return getcoll(ret);
691 #endif
693 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
694 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
695 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
696 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
698 return getcoll(ret);
701 /* _Getctype */
702 _Ctypevec* __cdecl _Getctype(_Ctypevec *ret)
704 short *table;
705 #if _MSVCP_VER >= 110
706 wchar_t *name;
707 MSVCP_size_t size;
708 #endif
710 TRACE("\n");
712 ret->page = ___lc_codepage_func();
713 #if _MSVCP_VER < 110
714 ret->handle = ___lc_handle_func()[LC_COLLATE];
715 #else
716 if((name = ___lc_locale_name_func()[LC_COLLATE])) {
717 size = wcslen(name)+1;
718 ret->name = malloc(size*sizeof(*name));
719 if(!ret->name) throw_exception(EXCEPTION_BAD_ALLOC, NULL);
720 memcpy(ret->name, name, size*sizeof(*name));
721 } else {
722 ret->name = NULL;
724 #endif
725 ret->delfl = TRUE;
726 table = malloc(sizeof(short[256]));
727 if(!table) throw_exception(EXCEPTION_BAD_ALLOC, NULL);
728 memcpy(table, __pctype_func(), sizeof(short[256]));
729 ret->table = table;
730 return ret;
733 /* ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ */
734 /* ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ */
735 DEFINE_THISCALL_WRAPPER(_Locinfo__Getctype, 8)
736 _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
738 return _Getctype(ret);
741 /* _Getcvt */
742 #if _MSVCP_VER < 110
743 ULONGLONG __cdecl _Getcvt(void)
745 union {
746 _Cvtvec cvtvec;
747 ULONGLONG ull;
748 } ret;
750 TRACE("\n");
752 ret.cvtvec.page = ___lc_codepage_func();
753 ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
754 return ret.ull;
756 #else
757 _Cvtvec* __cdecl _Getcvt(_Cvtvec *ret)
759 int i;
761 TRACE("\n");
763 memset(ret, 0, sizeof(*ret));
764 ret->page = ___lc_codepage_func();
765 ret->mb_max = ___mb_cur_max_func();
767 if(ret->mb_max > 1) {
768 for(i=0; i<256; i++)
769 if(_ismbblead(i)) ret->isleadbyte[i/8] |= 1 << (i&7);
771 return ret;
773 #endif
775 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
776 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
777 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
778 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
780 #if _MSVCP_VER < 110
781 ULONGLONG ull = _Getcvt();
782 memcpy(ret, &ull, sizeof(ull));
783 #else
784 _Cvtvec cvtvec;
785 _Getcvt(&cvtvec);
786 memcpy(ret, &cvtvec, sizeof(cvtvec));
787 #endif
788 return ret;
791 int __cdecl _Getdateorder(void)
793 WCHAR date_fmt[2];
795 #if _MSVCP_VER < 110
796 if(!GetLocaleInfoW(___lc_handle_func()[LC_TIME], LOCALE_ILDATE,
797 date_fmt, ARRAY_SIZE(date_fmt)))
798 return DATEORDER_no_order;
799 #else
800 if(!GetLocaleInfoEx(___lc_locale_name_func()[LC_TIME], LOCALE_ILDATE,
801 date_fmt, ARRAY_SIZE(date_fmt)))
802 return DATEORDER_no_order;
803 #endif
805 if(*date_fmt == '0') return DATEORDER_mdy;
806 if(*date_fmt == '1') return DATEORDER_dmy;
807 if(*date_fmt == '2') return DATEORDER_ymd;
808 return DATEORDER_no_order;
811 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
812 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
813 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
814 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
816 TRACE("(%p)\n", this);
817 return _Getdateorder();
820 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
821 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
822 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
823 const char* __thiscall _Locinfo__Getdays(const _Locinfo *this)
825 char *days = _Getdays();
826 const char *ret;
828 TRACE("(%p)\n", this);
830 if(days) {
831 locale_string_char_dtor((locale_string *)&this->days);
832 locale_string_char_ctor_cstr((locale_string *)&this->days, days);
833 free(days);
836 ret = locale_string_char_c_str(&this->days);
837 if (!ret[0]) ret = ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
838 return ret;
841 #if _MSVCP_VER >= 110
842 /* ?_W_Getdays@_Locinfo@std@@QBEPBGXZ */
843 /* ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ */
844 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getdays, 4)
845 const wchar_t* __thiscall _Locinfo__W_Getdays(const _Locinfo *this)
847 static const wchar_t defdays[] =
849 ':','S','u','n',':','S','u','n','d','a','y',
850 ':','M','o','n',':','M','o','n','d','a','y',
851 ':','T','u','e',':','T','u','e','s','d','a','y',
852 ':','W','e','d',':','W','e','d','n','e','s','d','a','y',
853 ':','T','h','u',':','T','h','u','r','s','d','a','y',
854 ':','F','r','i',':','F','r','i','d','a','y',
855 ':','S','a','t',':','S','a','t','u','r','d','a','y'
857 wchar_t *wdays = _W_Getdays();
858 const wchar_t *ret;
860 TRACE("(%p)\n", this);
862 if(wdays) {
863 locale_string_wchar_assign((locale_string_wchar *)&this->wdays, wdays);
864 free(wdays);
867 ret = locale_string_wchar_c_str(&this->wdays);
868 if (!ret[0]) ret = defdays;
869 return ret;
872 /* ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ */
873 /* ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ */
874 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getmonths, 4)
875 const wchar_t* __thiscall _Locinfo__W_Getmonths(const _Locinfo *this)
877 static const wchar_t defmonths[] =
879 ':','J','a','n',':','J','a','n','u','a','r','y',
880 ':','F','e','b',':','F','e','b','r','u','a','r','y',
881 ':','M','a','r',':','M','a','r','c','h',
882 ':','A','p','r',':','A','p','r','i','l',
883 ':','M','a','y',':','M','a','y',
884 ':','J','u','n',':','J','u','n','e',
885 ':','J','u','l',':','J','u','l','y',
886 ':','A','u','g',':','A','u','g','u','s','t',
887 ':','S','e','p',':','S','e','p','t','e','m','b','e','r',
888 ':','O','c','t',':','O','c','t','o','b','e','r',
889 ':','N','o','v',':','N','o','v','e','m','b','e','r',
890 ':','D','e','c',':','D','e','c','e','m','b','e','r'
892 wchar_t *wmonths = _W_Getmonths();
893 const wchar_t *ret;
895 TRACE("(%p)\n", this);
897 if(wmonths) {
898 locale_string_wchar_assign((locale_string_wchar *)&this->wmonths, wmonths);
899 free(wmonths);
902 ret = locale_string_wchar_c_str(&this->wmonths);
903 if (!ret[0]) ret = defmonths;
904 return ret;
906 #endif
908 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
909 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
910 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
911 const char* __thiscall _Locinfo__Getmonths(const _Locinfo *this)
913 char *months = _Getmonths();
914 const char *ret;
916 TRACE("(%p)\n", this);
918 if(months) {
919 locale_string_char_dtor((locale_string *)&this->months);
920 locale_string_char_ctor_cstr((locale_string *)&this->months, months);
921 free(months);
924 ret = locale_string_char_c_str(&this->months);
925 if (!ret[0]) ret = ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
926 ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
927 return ret;
930 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
931 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
932 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
933 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
935 TRACE("(%p)\n", this);
936 return "false";
939 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
940 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
941 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
942 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
944 TRACE("(%p)\n", this);
945 return "true";
948 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
949 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
950 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
951 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
953 TRACE("(%p)\n", this);
954 return localeconv();
957 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
958 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
959 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
960 _Timevec*__thiscall _Locinfo__Gettnames(const _Locinfo *this, _Timevec *ret)
962 TRACE("(%p)\n", this);
964 _Timevec_ctor_timeptr(ret, _Gettnames());
965 return ret;
968 /* ?id@?$collate@D@std@@2V0locale@2@A */
969 locale_id collate_char_id = {0};
971 /* ??_7?$collate@D@std@@6B@ */
972 extern const vtable_ptr MSVCP_collate_char_vtable;
974 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
975 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
976 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
977 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
979 TRACE("(%p %p)\n", this, locinfo);
980 _Locinfo__Getcoll(locinfo, &this->coll);
983 /* ??0?$collate@D@std@@IAE@PBDI@Z */
984 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
985 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
986 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
988 _Locinfo locinfo;
990 TRACE("(%p %s %lu)\n", this, name, refs);
992 locale_facet_ctor_refs(&this->facet, refs);
993 this->facet.vtable = &MSVCP_collate_char_vtable;
995 _Locinfo_ctor_cstr(&locinfo, name);
996 collate_char__Init(this, &locinfo);
997 _Locinfo_dtor(&locinfo);
998 return this;
1001 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
1002 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1003 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
1004 collate* __thiscall collate_char_ctor_locinfo(collate *this, const _Locinfo *locinfo, MSVCP_size_t refs)
1006 TRACE("(%p %p %lu)\n", this, locinfo, refs);
1008 locale_facet_ctor_refs(&this->facet, refs);
1009 this->facet.vtable = &MSVCP_collate_char_vtable;
1010 collate_char__Init(this, locinfo);
1011 return this;
1014 /* ??0?$collate@D@std@@QAE@I@Z */
1015 /* ??0?$collate@D@std@@QEAA@_K@Z */
1016 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
1017 collate* __thiscall collate_char_ctor_refs(collate *this, MSVCP_size_t refs)
1019 return collate_char_ctor_name(this, "C", refs);
1022 /* ??1?$collate@D@std@@UAE@XZ */
1023 /* ??1?$collate@D@std@@UEAA@XZ */
1024 /* ??1?$collate@D@std@@MAE@XZ */
1025 /* ??1?$collate@D@std@@MEAA@XZ */
1026 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
1027 void __thiscall collate_char_dtor(collate *this)
1029 TRACE("(%p)\n", this);
1032 DEFINE_THISCALL_WRAPPER(collate_char_vector_dtor, 8)
1033 collate* __thiscall collate_char_vector_dtor(collate *this, unsigned int flags)
1035 TRACE("(%p %x)\n", this, flags);
1036 if(flags & 2) {
1037 /* we have an array, with the number of elements stored before the first object */
1038 INT_PTR i, *ptr = (INT_PTR *)this-1;
1040 for(i=*ptr-1; i>=0; i--)
1041 collate_char_dtor(this+i);
1042 MSVCRT_operator_delete(ptr);
1043 } else {
1044 collate_char_dtor(this);
1045 if(flags & 1)
1046 MSVCRT_operator_delete(this);
1049 return this;
1052 /* ??_F?$collate@D@std@@QAEXXZ */
1053 /* ??_F?$collate@D@std@@QEAAXXZ */
1054 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
1055 collate* __thiscall collate_char_ctor(collate *this)
1057 return collate_char_ctor_name(this, "C", 0);
1060 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1061 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1062 MSVCP_size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale *loc)
1064 TRACE("(%p %p)\n", facet, loc);
1066 if(facet && !*facet) {
1067 *facet = MSVCRT_operator_new(sizeof(collate));
1068 if(!*facet) {
1069 ERR("Out of memory\n");
1070 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1071 return 0;
1073 collate_char_ctor_name((collate*)*facet,
1074 locale_string_char_c_str(&loc->ptr->name), 0);
1077 return LC_COLLATE;
1080 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@@Z */
1081 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1082 MSVCP_size_t __cdecl collate_char__Getcat_old(const locale_facet **facet)
1084 return collate_char__Getcat(facet, locale_classic());
1087 static collate* collate_char_use_facet(const locale *loc)
1089 static collate *obj = NULL;
1091 _Lockit lock;
1092 const locale_facet *fac;
1094 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1095 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_char_id));
1096 if(fac) {
1097 _Lockit_dtor(&lock);
1098 return (collate*)fac;
1101 if(obj) {
1102 _Lockit_dtor(&lock);
1103 return obj;
1106 collate_char__Getcat(&fac, loc);
1107 obj = (collate*)fac;
1108 call_locale_facet__Incref(&obj->facet);
1109 locale_facet_register(&obj->facet);
1110 _Lockit_dtor(&lock);
1112 return obj;
1115 /* _Strcoll */
1116 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
1117 const char *last2, const _Collvec *coll)
1119 LCID lcid;
1121 TRACE("(%s %s)\n", debugstr_an(first1, last1-first1), debugstr_an(first2, last2-first2));
1123 #if _MSVCP_VER < 110
1124 lcid = (coll ? coll->handle : ___lc_handle_func()[LC_COLLATE]);
1125 #else
1126 lcid = LocaleNameToLCID(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE], 0);
1127 #endif
1128 return CompareStringA(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1131 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
1132 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
1133 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
1134 #if _MSVCP_VER <= 100
1135 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1136 (const collate*, const char*, const char*, const char*, const char*), \
1137 (this, first1, last1, first2, last2))
1138 #else
1139 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1140 (const collate*, const char*, const char*, const char*, const char*), \
1141 (this, first1, last1, first2, last2))
1142 #endif
1143 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
1144 const char *last1, const char *first2, const char *last2)
1146 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1147 return _Strcoll(first1, last1, first2, last2, &this->coll);
1150 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
1151 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
1152 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
1153 int __thiscall collate_char_compare(const collate *this, const char *first1,
1154 const char *last1, const char *first2, const char *last2)
1156 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1157 return call_collate_char_do_compare(this, first1, last1, first2, last2);
1160 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
1161 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
1162 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
1163 #if _MSVCP_VER <= 100
1164 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1165 (const collate*, const char*, const char*), (this, first, last))
1166 #else
1167 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1168 (const collate*, const char*, const char*), (this, first, last))
1169 #endif
1170 LONG __thiscall collate_char_do_hash(const collate *this,
1171 const char *first, const char *last)
1173 ULONG ret = 0;
1175 TRACE("(%p %p %p)\n", this, first, last);
1177 for(; first<last; first++)
1178 ret = (ret<<8 | ret>>24) + *first;
1179 return ret;
1182 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
1183 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
1184 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
1185 LONG __thiscall collate_char_hash(const collate *this,
1186 const char *first, const char *last)
1188 TRACE("(%p %p %p)\n", this, first, last);
1189 return call_collate_char_do_hash(this, first, last);
1192 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1193 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1194 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
1195 basic_string_char* __thiscall collate_char_do_transform(const collate *this,
1196 basic_string_char *ret, const char *first, const char *last)
1198 FIXME("(%p %p %p) stub\n", this, first, last);
1199 return ret;
1202 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1203 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1204 DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
1205 basic_string_char* __thiscall collate_char_transform(const collate *this,
1206 basic_string_char *ret, const char *first, const char *last)
1208 FIXME("(%p %p %p) stub\n", this, first, last);
1209 return ret;
1212 /* ?id@?$collate@_W@std@@2V0locale@2@A */
1213 locale_id collate_wchar_id = {0};
1214 /* ?id@?$collate@G@std@@2V0locale@2@A */
1215 locale_id collate_short_id = {0};
1217 /* ??_7?$collate@_W@std@@6B@ */
1218 extern const vtable_ptr MSVCP_collate_wchar_vtable;
1219 /* ??_7?$collate@G@std@@6B@ */
1220 extern const vtable_ptr MSVCP_collate_short_vtable;
1222 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
1223 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
1224 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
1225 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
1226 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
1227 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
1229 TRACE("(%p %p)\n", this, locinfo);
1230 _Locinfo__Getcoll(locinfo, &this->coll);
1233 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
1234 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
1235 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
1236 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
1238 _Locinfo locinfo;
1240 TRACE("(%p %s %lu)\n", this, name, refs);
1242 locale_facet_ctor_refs(&this->facet, refs);
1243 this->facet.vtable = &MSVCP_collate_wchar_vtable;
1245 _Locinfo_ctor_cstr(&locinfo, name);
1246 collate_wchar__Init(this, &locinfo);
1247 _Locinfo_dtor(&locinfo);
1248 return this;
1251 /* ??0?$collate@G@std@@IAE@PBDI@Z */
1252 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
1253 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
1254 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
1256 collate *ret = collate_wchar_ctor_name(this, name, refs);
1257 ret->facet.vtable = &MSVCP_collate_short_vtable;
1258 return ret;
1261 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
1262 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1263 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
1264 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, const _Locinfo *locinfo, MSVCP_size_t refs)
1266 TRACE("(%p %p %lu)\n", this, locinfo, refs);
1268 locale_facet_ctor_refs(&this->facet, refs);
1269 this->facet.vtable = &MSVCP_collate_wchar_vtable;
1270 collate_wchar__Init(this, locinfo);
1271 return this;
1274 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
1275 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1276 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
1277 collate* __thiscall collate_short_ctor_locinfo(collate *this, const _Locinfo *locinfo, MSVCP_size_t refs)
1279 collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
1280 ret->facet.vtable = &MSVCP_collate_short_vtable;
1281 return ret;
1284 /* ??0?$collate@_W@std@@QAE@I@Z */
1285 /* ??0?$collate@_W@std@@QEAA@_K@Z */
1286 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
1287 collate* __thiscall collate_wchar_ctor_refs(collate *this, MSVCP_size_t refs)
1289 return collate_wchar_ctor_name(this, "C", refs);
1292 /* ??0?$collate@G@std@@QAE@I@Z */
1293 /* ??0?$collate@G@std@@QEAA@_K@Z */
1294 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
1295 collate* __thiscall collate_short_ctor_refs(collate *this, MSVCP_size_t refs)
1297 collate *ret = collate_wchar_ctor_refs(this, refs);
1298 ret->facet.vtable = &MSVCP_collate_short_vtable;
1299 return ret;
1302 /* ??1?$collate@G@std@@UAE@XZ */
1303 /* ??1?$collate@G@std@@UEAA@XZ */
1304 /* ??1?$collate@_W@std@@MAE@XZ */
1305 /* ??1?$collate@_W@std@@MEAA@XZ */
1306 /* ??1?$collate@G@std@@MAE@XZ */
1307 /* ??1?$collate@G@std@@MEAA@XZ */
1308 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
1309 void __thiscall collate_wchar_dtor(collate *this)
1311 TRACE("(%p)\n", this);
1314 DEFINE_THISCALL_WRAPPER(collate_wchar_vector_dtor, 8)
1315 collate* __thiscall collate_wchar_vector_dtor(collate *this, unsigned int flags)
1317 TRACE("(%p %x)\n", this, flags);
1318 if(flags & 2) {
1319 /* we have an array, with the number of elements stored before the first object */
1320 INT_PTR i, *ptr = (INT_PTR *)this-1;
1322 for(i=*ptr-1; i>=0; i--)
1323 collate_wchar_dtor(this+i);
1324 MSVCRT_operator_delete(ptr);
1325 } else {
1326 collate_wchar_dtor(this);
1327 if(flags & 1)
1328 MSVCRT_operator_delete(this);
1331 return this;
1334 /* ??_F?$collate@_W@std@@QAEXXZ */
1335 /* ??_F?$collate@_W@std@@QEAAXXZ */
1336 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
1337 collate* __thiscall collate_wchar_ctor(collate *this)
1339 return collate_wchar_ctor_name(this, "C", 0);
1342 /* ??_F?$collate@G@std@@QAEXXZ */
1343 /* ??_F?$collate@G@std@@QEAAXXZ */
1344 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
1345 collate* __thiscall collate_short_ctor(collate *this)
1347 collate *ret = collate_wchar_ctor(this);
1348 ret->facet.vtable = &MSVCP_collate_short_vtable;
1349 return ret;
1352 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1353 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1354 MSVCP_size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale *loc)
1356 TRACE("(%p %p)\n", facet, loc);
1358 if(facet && !*facet) {
1359 *facet = MSVCRT_operator_new(sizeof(collate));
1360 if(!*facet) {
1361 ERR("Out of memory\n");
1362 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1363 return 0;
1365 collate_wchar_ctor_name((collate*)*facet,
1366 locale_string_char_c_str(&loc->ptr->name), 0);
1369 return LC_COLLATE;
1372 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@@Z */
1373 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1374 MSVCP_size_t __cdecl collate_wchar__Getcat_old(const locale_facet **facet)
1376 return collate_wchar__Getcat(facet, locale_classic());
1379 static collate* collate_wchar_use_facet(const locale *loc)
1381 static collate *obj = NULL;
1383 _Lockit lock;
1384 const locale_facet *fac;
1386 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1387 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_wchar_id));
1388 if(fac) {
1389 _Lockit_dtor(&lock);
1390 return (collate*)fac;
1393 if(obj) {
1394 _Lockit_dtor(&lock);
1395 return obj;
1398 collate_wchar__Getcat(&fac, loc);
1399 obj = (collate*)fac;
1400 call_locale_facet__Incref(&obj->facet);
1401 locale_facet_register(&obj->facet);
1402 _Lockit_dtor(&lock);
1404 return obj;
1407 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1408 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1409 MSVCP_size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
1411 if(facet && !*facet) {
1412 collate_wchar__Getcat(facet, loc);
1413 (*(locale_facet**)facet)->vtable = &MSVCP_collate_short_vtable;
1416 return LC_COLLATE;
1419 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@@Z */
1420 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1421 MSVCP_size_t __cdecl collate_short__Getcat_old(const locale_facet **facet)
1423 return collate_short__Getcat(facet, locale_classic());
1426 static collate* collate_short_use_facet(const locale *loc)
1428 static collate *obj = NULL;
1430 _Lockit lock;
1431 const locale_facet *fac;
1433 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1434 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_short_id));
1435 if(fac) {
1436 _Lockit_dtor(&lock);
1437 return (collate*)fac;
1440 if(obj) {
1441 _Lockit_dtor(&lock);
1442 return obj;
1445 collate_short__Getcat(&fac, loc);
1446 obj = (collate*)fac;
1447 call_locale_facet__Incref(&obj->facet);
1448 locale_facet_register(&obj->facet);
1449 _Lockit_dtor(&lock);
1451 return obj;
1454 /* _Wcscoll */
1455 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
1456 const wchar_t *last2, const _Collvec *coll)
1458 TRACE("(%s %s)\n", debugstr_wn(first1, last1-first1), debugstr_wn(first2, last2-first2));
1460 #if _MSVCP_VER < 110
1461 return CompareStringW(coll ? coll->handle : ___lc_handle_func()[LC_COLLATE],
1462 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1463 #else
1464 return CompareStringEx(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE],
1465 0, first1, last1-first1, first2, last2-first2, NULL, NULL, 0)-CSTR_EQUAL;
1466 #endif
1469 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
1470 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
1471 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
1472 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
1473 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
1474 #if _MSVCP_VER <= 100
1475 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1476 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1477 (this, first1, last1, first2, last2))
1478 #else
1479 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1480 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1481 (this, first1, last1, first2, last2))
1482 #endif
1483 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
1484 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1486 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1487 return _Wcscoll(first1, last1, first2, last2, &this->coll);
1490 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
1491 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
1492 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
1493 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
1494 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
1495 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
1496 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1498 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1499 return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
1502 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
1503 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
1504 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
1505 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
1506 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
1507 #if _MSVCP_VER <= 100
1508 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1509 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1510 #else
1511 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1512 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1513 #endif
1514 LONG __thiscall collate_wchar_do_hash(const collate *this,
1515 const wchar_t *first, const wchar_t *last)
1517 ULONG ret = 0;
1519 TRACE("(%p %p %p)\n", this, first, last);
1521 for(; first<last; first++)
1522 ret = (ret<<8 | ret>>24) + *first;
1523 return ret;
1526 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
1527 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
1528 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
1529 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
1530 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
1531 LONG __thiscall collate_wchar_hash(const collate *this,
1532 const wchar_t *first, const wchar_t *last)
1534 TRACE("(%p %p %p)\n", this, first, last);
1535 return call_collate_wchar_do_hash(this, first, last);
1538 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1539 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1540 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1541 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1542 DEFINE_THISCALL_WRAPPER(collate_wchar_do_transform, 16)
1543 basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
1544 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1546 FIXME("(%p %p %p) stub\n", this, first, last);
1547 return ret;
1550 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1551 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1552 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1553 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1554 DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
1555 basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
1556 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1558 FIXME("(%p %p %p) stub\n", this, first, last);
1559 return ret;
1562 /* ??_7ctype_base@std@@6B@ */
1563 extern const vtable_ptr MSVCP_ctype_base_vtable;
1565 /* ??0ctype_base@std@@QAE@I@Z */
1566 /* ??0ctype_base@std@@QEAA@_K@Z */
1567 DEFINE_THISCALL_WRAPPER(ctype_base_ctor_refs, 8)
1568 ctype_base* __thiscall ctype_base_ctor_refs(ctype_base *this, MSVCP_size_t refs)
1570 TRACE("(%p %lu)\n", this, refs);
1571 locale_facet_ctor_refs(&this->facet, refs);
1572 this->facet.vtable = &MSVCP_ctype_base_vtable;
1573 return this;
1576 /* ??_Fctype_base@std@@QAEXXZ */
1577 /* ??_Fctype_base@std@@QEAAXXZ */
1578 DEFINE_THISCALL_WRAPPER(ctype_base_ctor, 4)
1579 ctype_base* __thiscall ctype_base_ctor(ctype_base *this)
1581 TRACE("(%p)\n", this);
1582 locale_facet_ctor_refs(&this->facet, 0);
1583 this->facet.vtable = &MSVCP_ctype_base_vtable;
1584 return this;
1587 /* ??1ctype_base@std@@UAE@XZ */
1588 /* ??1ctype_base@std@@UEAA@XZ */
1589 DEFINE_THISCALL_WRAPPER(ctype_base_dtor, 4)
1590 void __thiscall ctype_base_dtor(ctype_base *this)
1592 TRACE("(%p)\n", this);
1595 DEFINE_THISCALL_WRAPPER(ctype_base_vector_dtor, 8)
1596 ctype_base* __thiscall ctype_base_vector_dtor(ctype_base *this, unsigned int flags)
1598 TRACE("(%p %x)\n", this, flags);
1599 if(flags & 2) {
1600 /* we have an array, with the number of elements stored before the first object */
1601 INT_PTR i, *ptr = (INT_PTR *)this-1;
1603 for(i=*ptr-1; i>=0; i--)
1604 ctype_base_dtor(this+i);
1605 MSVCRT_operator_delete(ptr);
1606 } else {
1607 ctype_base_dtor(this);
1608 if(flags & 1)
1609 MSVCRT_operator_delete(this);
1612 return this;
1615 /* ?_Xran@ctype_base@std@@KAXXZ */
1616 void __cdecl ctype_base__Xran(void)
1618 throw_exception(EXCEPTION_OUT_OF_RANGE, "out of range in ctype<T>");
1621 /* ?id@?$ctype@D@std@@2V0locale@2@A */
1622 locale_id ctype_char_id = {0};
1623 /* ?table_size@?$ctype@D@std@@2IB */
1624 /* ?table_size@?$ctype@D@std@@2_KB */
1625 MSVCP_size_t ctype_char_table_size = 256;
1627 /* ??_7?$ctype@D@std@@6B@ */
1628 extern const vtable_ptr MSVCP_ctype_char_vtable;
1630 /* ?_Id_func@?$ctype@D@std@@SAAAVid@locale@2@XZ */
1631 /* ?_Id_func@?$ctype@D@std@@SAAEAVid@locale@2@XZ */
1632 locale_id* __cdecl ctype_char__Id_func(void)
1634 TRACE("()\n");
1635 return &ctype_char_id;
1638 /* ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z */
1639 /* ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z */
1640 DEFINE_THISCALL_WRAPPER(ctype_char__Init, 8)
1641 void __thiscall ctype_char__Init(ctype_char *this, const _Locinfo *locinfo)
1643 TRACE("(%p %p)\n", this, locinfo);
1644 _Locinfo__Getctype(locinfo, &this->ctype);
1647 /* ?_Tidy@?$ctype@D@std@@IAEXXZ */
1648 /* ?_Tidy@?$ctype@D@std@@IEAAXXZ */
1649 DEFINE_THISCALL_WRAPPER(ctype_char__Tidy, 4)
1650 void __thiscall ctype_char__Tidy(ctype_char *this)
1652 TRACE("(%p)\n", this);
1654 if(this->ctype.delfl)
1655 free((short*)this->ctype.table);
1656 #if _MSVCP_VER >= 110
1657 free(this->ctype.name);
1658 #endif
1661 /* ?classic_table@?$ctype@D@std@@KAPBFXZ */
1662 /* ?classic_table@?$ctype@D@std@@KAPEBFXZ */
1663 const short* __cdecl ctype_char_classic_table(void)
1665 ctype_char *ctype;
1667 TRACE("()\n");
1668 ctype = ctype_char_use_facet( locale_classic() );
1669 return ctype->ctype.table;
1672 /* ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z */
1673 /* ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1674 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_locinfo, 12)
1675 ctype_char* __thiscall ctype_char_ctor_locinfo(ctype_char *this,
1676 const _Locinfo *locinfo, MSVCP_size_t refs)
1678 TRACE("(%p %p %lu)\n", this, locinfo, refs);
1679 ctype_base_ctor_refs(&this->base, refs);
1680 this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1681 ctype_char__Init(this, locinfo);
1682 return this;
1685 /* ??0?$ctype@D@std@@QAE@PBF_NI@Z */
1686 /* ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z */
1687 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_table, 16)
1688 ctype_char* __thiscall ctype_char_ctor_table(ctype_char *this,
1689 const short *table, MSVCP_bool delete, MSVCP_size_t refs)
1691 _Locinfo locinfo;
1693 TRACE("(%p %p %d %lu)\n", this, table, delete, refs);
1695 ctype_base_ctor_refs(&this->base, refs);
1696 this->base.facet.vtable = &MSVCP_ctype_char_vtable;
1698 _Locinfo_ctor(&locinfo);
1699 ctype_char__Init(this, &locinfo);
1700 _Locinfo_dtor(&locinfo);
1702 if(table) {
1703 ctype_char__Tidy(this);
1704 this->ctype.table = table;
1705 this->ctype.delfl = delete;
1707 return this;
1710 /* ??_F?$ctype@D@std@@QAEXXZ */
1711 /* ??_F?$ctype@D@std@@QEAAXXZ */
1712 DEFINE_THISCALL_WRAPPER(ctype_char_ctor, 4)
1713 ctype_char* __thiscall ctype_char_ctor(ctype_char *this)
1715 return ctype_char_ctor_table(this, NULL, FALSE, 0);
1718 /* ??1?$ctype@D@std@@UAE@XZ */
1719 /* ??1?$ctype@D@std@@UEAA@XZ */
1720 /* ??1?$ctype@D@std@@MAE@XZ */
1721 /* ??1?$ctype@D@std@@MEAA@XZ */
1722 DEFINE_THISCALL_WRAPPER(ctype_char_dtor, 4)
1723 void __thiscall ctype_char_dtor(ctype_char *this)
1725 TRACE("(%p)\n", this);
1726 ctype_char__Tidy(this);
1729 DEFINE_THISCALL_WRAPPER(ctype_char_vector_dtor, 8)
1730 ctype_char* __thiscall ctype_char_vector_dtor(ctype_char *this, unsigned int flags)
1732 TRACE("(%p %x)\n", this, flags);
1733 if(flags & 2) {
1734 /* we have an array, with the number of elements stored before the first object */
1735 INT_PTR i, *ptr = (INT_PTR *)this-1;
1737 for(i=*ptr-1; i>=0; i--)
1738 ctype_char_dtor(this+i);
1739 MSVCRT_operator_delete(ptr);
1740 } else {
1741 ctype_char_dtor(this);
1742 if(flags & 1)
1743 MSVCRT_operator_delete(this);
1746 return this;
1749 /* ?do_narrow@?$ctype@D@std@@MBEDDD@Z */
1750 /* ?do_narrow@?$ctype@D@std@@MEBADDD@Z */
1751 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow_ch, 12)
1752 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1753 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 36, \
1754 char, (const ctype_char*, char, char), (this, ch, unused))
1755 #elif _MSVCP_VER <= 100
1756 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 32, \
1757 char, (const ctype_char*, char, char), (this, ch, unused))
1758 #else
1759 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 40, \
1760 char, (const ctype_char*, char, char), (this, ch, unused))
1761 #endif
1762 char __thiscall ctype_char_do_narrow_ch(const ctype_char *this, char ch, char unused)
1764 TRACE("(%p %c %c)\n", this, ch, unused);
1765 return ch;
1768 /* ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z */
1769 /* ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z */
1770 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow, 20)
1771 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1772 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 32, \
1773 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1774 (this, first, last, unused, dest))
1775 #elif _MSVCP_VER <= 100
1776 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 28, \
1777 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1778 (this, first, last, unused, dest))
1779 #else
1780 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 36, \
1781 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1782 (this, first, last, unused, dest))
1783 #endif
1784 const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
1785 const char *first, const char *last, char unused, char *dest)
1787 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1788 memcpy(dest, first, last-first);
1789 return last;
1792 /* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
1793 /* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
1794 DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
1795 #define call_ctype_char__Do_narrow_s(this, first, last, unused, dest, size) CALL_VTBL_FUNC(this, 40, \
1796 const char*, (const ctype_char*, const char*, const char*, char, char*, MSVCP_size_t), \
1797 (this, first, last, unused, dest, size))
1798 const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
1799 const char *last, char unused, char *dest, MSVCP_size_t size)
1801 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1802 memcpy_s(dest, size, first, last-first);
1803 return last;
1806 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
1807 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
1808 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
1809 char __thiscall ctype_char_narrow_ch(const ctype_char *this, char ch, char dflt)
1811 TRACE("(%p %c %c)\n", this, ch, dflt);
1812 return call_ctype_char_do_narrow_ch(this, ch, dflt);
1815 /* ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z */
1816 /* ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z */
1817 DEFINE_THISCALL_WRAPPER(ctype_char_narrow, 20)
1818 const char* __thiscall ctype_char_narrow(const ctype_char *this,
1819 const char *first, const char *last, char dflt, char *dest)
1821 TRACE("(%p %p %p %c %p)\n", this, first, last, dflt, dest);
1822 return call_ctype_char_do_narrow(this, first, last, dflt, dest);
1825 /* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
1826 /* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
1827 DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
1828 const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
1829 const char *last, char dflt, char *dest, MSVCP_size_t size)
1831 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1832 return call_ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
1835 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
1836 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
1837 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
1838 #if _MSVCP_VER <= 100
1839 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
1840 char, (const ctype_char*, char), (this, ch))
1841 #else
1842 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
1843 char, (const ctype_char*, char), (this, ch))
1844 #endif
1845 char __thiscall ctype_char_do_widen_ch(const ctype_char *this, char ch)
1847 TRACE("(%p %c)\n", this, ch);
1848 return ch;
1851 /* ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z */
1852 /* ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z */
1853 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen, 16)
1854 #if _MSVCP_VER <= 100
1855 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 20, \
1856 const char*, (const ctype_char*, const char*, const char*, char*), \
1857 (this, first, last, dest))
1858 #else
1859 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 28, \
1860 const char*, (const ctype_char*, const char*, const char*, char*), \
1861 (this, first, last, dest))
1862 #endif
1863 const char* __thiscall ctype_char_do_widen(const ctype_char *this,
1864 const char *first, const char *last, char *dest)
1866 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1867 memcpy(dest, first, last-first);
1868 return last;
1871 /* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
1872 /* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
1873 DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
1874 #define call_ctype_char__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 28, \
1875 const char*, (const ctype_char*, const char*, const char*, char*, MSVCP_size_t), \
1876 (this, first, last, dest, size))
1877 const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
1878 const char *first, const char *last, char *dest, MSVCP_size_t size)
1880 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1881 memcpy_s(dest, size, first, last-first);
1882 return last;
1885 /* ?widen@?$ctype@D@std@@QBEDD@Z */
1886 /* ?widen@?$ctype@D@std@@QEBADD@Z */
1887 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
1888 char __thiscall ctype_char_widen_ch(const ctype_char *this, char ch)
1890 TRACE("(%p %c)\n", this, ch);
1891 return call_ctype_char_do_widen_ch(this, ch);
1894 /* ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z */
1895 /* ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z */
1896 DEFINE_THISCALL_WRAPPER(ctype_char_widen, 16)
1897 const char* __thiscall ctype_char_widen(const ctype_char *this,
1898 const char *first, const char *last, char *dest)
1900 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1901 return call_ctype_char_do_widen(this, first, last, dest);
1904 /* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
1905 /* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
1906 DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
1907 const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
1908 const char *first, const char *last, char *dest, MSVCP_size_t size)
1910 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
1911 return call_ctype_char__Do_widen_s(this, first, last, dest, size);
1914 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1915 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1916 MSVCP_size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
1918 TRACE("(%p %p)\n", facet, loc);
1920 if(facet && !*facet) {
1921 _Locinfo locinfo;
1923 *facet = MSVCRT_operator_new(sizeof(ctype_char));
1924 if(!*facet) {
1925 ERR("Out of memory\n");
1926 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1927 return 0;
1930 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
1931 ctype_char_ctor_locinfo((ctype_char*)*facet, &locinfo, 0);
1932 _Locinfo_dtor(&locinfo);
1935 return LC_CTYPE;
1938 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@@Z */
1939 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1940 MSVCP_size_t __cdecl ctype_char__Getcat_old(const locale_facet **facet)
1942 return ctype_char__Getcat(facet, locale_classic());
1945 ctype_char* ctype_char_use_facet(const locale *loc)
1947 static ctype_char *obj = NULL;
1949 _Lockit lock;
1950 const locale_facet *fac;
1952 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1953 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_char_id));
1954 if(fac) {
1955 _Lockit_dtor(&lock);
1956 return (ctype_char*)fac;
1959 if(obj) {
1960 _Lockit_dtor(&lock);
1961 return obj;
1964 ctype_char__Getcat(&fac, loc);
1965 obj = (ctype_char*)fac;
1966 call_locale_facet__Incref(&obj->base.facet);
1967 locale_facet_register(&obj->base.facet);
1968 _Lockit_dtor(&lock);
1970 return obj;
1973 /* _Tolower */
1974 int __cdecl _Tolower(int ch, const _Ctypevec *ctype)
1976 unsigned int cp;
1978 TRACE("%d %p\n", ch, ctype);
1980 if(ctype)
1981 cp = ctype->page;
1982 else
1983 cp = ___lc_codepage_func();
1985 /* Don't convert to unicode in case of C locale */
1986 if(!cp) {
1987 if(ch>='A' && ch<='Z')
1988 ch = ch-'A'+'a';
1989 return ch;
1990 } else {
1991 WCHAR wide, lower;
1992 char str[2];
1993 int size;
1995 if(ch > 255) {
1996 str[0] = (ch>>8) & 255;
1997 str[1] = ch & 255;
1998 size = 2;
1999 } else {
2000 str[0] = ch & 255;
2001 size = 1;
2004 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
2005 return ch;
2007 lower = tolowerW(wide);
2008 if(lower == wide)
2009 return ch;
2011 WideCharToMultiByte(cp, 0, &lower, 1, str, 2, NULL, NULL);
2013 return str[0] + (str[1]<<8);
2017 /* ?do_tolower@?$ctype@D@std@@MBEDD@Z */
2018 /* ?do_tolower@?$ctype@D@std@@MEBADD@Z */
2019 #if _MSVCP_VER <= 100
2020 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 8, \
2021 char, (const ctype_char*, char), (this, ch))
2022 #else
2023 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2024 char, (const ctype_char*, char), (this, ch))
2025 #endif
2026 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower_ch, 8)
2027 char __thiscall ctype_char_do_tolower_ch(const ctype_char *this, char ch)
2029 TRACE("(%p %c)\n", this, ch);
2030 return _Tolower(ch, &this->ctype);
2033 /* ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z */
2034 /* ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2035 #if _MSVCP_VER <= 100
2036 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 4, \
2037 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2038 #else
2039 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 12, \
2040 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2041 #endif
2042 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower, 12)
2043 const char* __thiscall ctype_char_do_tolower(const ctype_char *this, char *first, const char *last)
2045 TRACE("(%p %p %p)\n", this, first, last);
2046 for(; first<last; first++)
2047 *first = _Tolower(*first, &this->ctype);
2048 return last;
2051 /* ?tolower@?$ctype@D@std@@QBEDD@Z */
2052 /* ?tolower@?$ctype@D@std@@QEBADD@Z */
2053 DEFINE_THISCALL_WRAPPER(ctype_char_tolower_ch, 8)
2054 char __thiscall ctype_char_tolower_ch(const ctype_char *this, char ch)
2056 TRACE("(%p %c)\n", this, ch);
2057 return call_ctype_char_do_tolower_ch(this, ch);
2060 /* ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z */
2061 /* ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2062 DEFINE_THISCALL_WRAPPER(ctype_char_tolower, 12)
2063 const char* __thiscall ctype_char_tolower(const ctype_char *this, char *first, const char *last)
2065 TRACE("(%p %p %p)\n", this, first, last);
2066 return call_ctype_char_do_tolower(this, first, last);
2069 /* _Toupper */
2070 int __cdecl _Toupper(int ch, const _Ctypevec *ctype)
2072 unsigned int cp;
2074 TRACE("%d %p\n", ch, ctype);
2076 if(ctype)
2077 cp = ctype->page;
2078 else
2079 cp = ___lc_codepage_func();
2081 /* Don't convert to unicode in case of C locale */
2082 if(!cp) {
2083 if(ch>='a' && ch<='z')
2084 ch = ch-'a'+'A';
2085 return ch;
2086 } else {
2087 WCHAR wide, upper;
2088 char str[2];
2089 int size;
2091 if(ch > 255) {
2092 str[0] = (ch>>8) & 255;
2093 str[1] = ch & 255;
2094 size = 2;
2095 } else {
2096 str[0] = ch & 255;
2097 size = 1;
2100 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
2101 return ch;
2103 upper = toupperW(wide);
2104 if(upper == wide)
2105 return ch;
2107 WideCharToMultiByte(cp, 0, &upper, 1, str, 2, NULL, NULL);
2109 return str[0] + (str[1]<<8);
2113 /* ?do_toupper@?$ctype@D@std@@MBEDD@Z */
2114 /* ?do_toupper@?$ctype@D@std@@MEBADD@Z */
2115 #if _MSVCP_VER <= 100
2116 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2117 char, (const ctype_char*, char), (this, ch))
2118 #else
2119 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2120 char, (const ctype_char*, char), (this, ch))
2121 #endif
2122 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper_ch, 8)
2123 char __thiscall ctype_char_do_toupper_ch(const ctype_char *this, char ch)
2125 TRACE("(%p %c)\n", this, ch);
2126 return _Toupper(ch, &this->ctype);
2129 /* ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z */
2130 /* ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2131 #if _MSVCP_VER <= 100
2132 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 12, \
2133 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2134 #else
2135 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 20, \
2136 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2137 #endif
2138 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper, 12)
2139 const char* __thiscall ctype_char_do_toupper(const ctype_char *this,
2140 char *first, const char *last)
2142 TRACE("(%p %p %p)\n", this, first, last);
2143 for(; first<last; first++)
2144 *first = _Toupper(*first, &this->ctype);
2145 return last;
2148 /* ?toupper@?$ctype@D@std@@QBEDD@Z */
2149 /* ?toupper@?$ctype@D@std@@QEBADD@Z */
2150 DEFINE_THISCALL_WRAPPER(ctype_char_toupper_ch, 8)
2151 char __thiscall ctype_char_toupper_ch(const ctype_char *this, char ch)
2153 TRACE("(%p %c)\n", this, ch);
2154 return call_ctype_char_do_toupper_ch(this, ch);
2157 /* ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z */
2158 /* ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2159 DEFINE_THISCALL_WRAPPER(ctype_char_toupper, 12)
2160 const char* __thiscall ctype_char_toupper(const ctype_char *this, char *first, const char *last)
2162 TRACE("(%p %p %p)\n", this, first, last);
2163 return call_ctype_char_do_toupper(this, first, last);
2166 /* ?is@?$ctype@D@std@@QBE_NFD@Z */
2167 /* ?is@?$ctype@D@std@@QEBA_NFD@Z */
2168 DEFINE_THISCALL_WRAPPER(ctype_char_is_ch, 12)
2169 MSVCP_bool __thiscall ctype_char_is_ch(const ctype_char *this, short mask, char ch)
2171 TRACE("(%p %x %c)\n", this, mask, ch);
2172 return (this->ctype.table[(unsigned char)ch] & mask) != 0;
2175 /* ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z */
2176 /* ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z */
2177 DEFINE_THISCALL_WRAPPER(ctype_char_is, 16)
2178 const char* __thiscall ctype_char_is(const ctype_char *this, const char *first, const char *last, short *dest)
2180 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2181 for(; first<last; first++)
2182 *dest++ = this->ctype.table[(unsigned char)*first];
2183 return last;
2186 /* ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z */
2187 /* ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2188 DEFINE_THISCALL_WRAPPER(ctype_char_scan_is, 16)
2189 const char* __thiscall ctype_char_scan_is(const ctype_char *this, short mask, const char *first, const char *last)
2191 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2192 for(; first<last; first++)
2193 if(!ctype_char_is_ch(this, mask, *first))
2194 break;
2195 return first;
2198 /* ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z */
2199 /* ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2200 DEFINE_THISCALL_WRAPPER(ctype_char_scan_not, 16)
2201 const char* __thiscall ctype_char_scan_not(const ctype_char *this, short mask, const char *first, const char *last)
2203 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2204 for(; first<last; first++)
2205 if(ctype_char_is_ch(this, mask, *first))
2206 break;
2207 return first;
2210 /* ?table@?$ctype@D@std@@IBEPBFXZ */
2211 /* ?table@?$ctype@D@std@@IEBAPEBFXZ */
2212 DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
2213 const short* __thiscall ctype_char_table(const ctype_char *this)
2215 TRACE("(%p)\n", this);
2216 return this->ctype.table;
2219 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
2220 locale_id ctype_wchar_id = {0};
2221 /* ?id@?$ctype@G@std@@2V0locale@2@A */
2222 locale_id ctype_short_id = {0};
2224 /* ??_7?$ctype@_W@std@@6B@ */
2225 extern const vtable_ptr MSVCP_ctype_wchar_vtable;
2226 /* ??_7?$ctype@G@std@@6B@ */
2227 extern const vtable_ptr MSVCP_ctype_short_vtable;
2229 /* ?_Id_func@?$ctype@_W@std@@SAAAVid@locale@2@XZ */
2230 /* ?_Id_func@?$ctype@_W@std@@SAAEAVid@locale@2@XZ */
2231 locale_id* __cdecl ctype_wchar__Id_func(void)
2233 TRACE("()\n");
2234 return &ctype_wchar_id;
2237 /* ?_Id_func@?$ctype@G@std@@SAAAVid@locale@2@XZ */
2238 /* ?_Id_func@?$ctype@G@std@@SAAEAVid@locale@2@XZ */
2239 locale_id* __cdecl ctype_short__Id_func(void)
2241 TRACE("()\n");
2242 return &ctype_short_id;
2245 /* ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z */
2246 /* ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
2247 /* ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z */
2248 /* ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z */
2249 DEFINE_THISCALL_WRAPPER(ctype_wchar__Init, 8)
2250 void __thiscall ctype_wchar__Init(ctype_wchar *this, const _Locinfo *locinfo)
2252 TRACE("(%p %p)\n", this, locinfo);
2253 _Locinfo__Getctype(locinfo, &this->ctype);
2254 _Locinfo__Getcvt(locinfo, &this->cvt);
2257 /* ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z */
2258 /* ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2259 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_locinfo, 12)
2260 ctype_wchar* __thiscall ctype_wchar_ctor_locinfo(ctype_wchar *this,
2261 const _Locinfo *locinfo, MSVCP_size_t refs)
2263 TRACE("(%p %p %lu)\n", this, locinfo, refs);
2264 ctype_base_ctor_refs(&this->base, refs);
2265 this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
2266 ctype_wchar__Init(this, locinfo);
2267 return this;
2270 /* ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z */
2271 /* ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2272 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_locinfo, 12)
2273 ctype_wchar* __thiscall ctype_short_ctor_locinfo(ctype_wchar *this,
2274 const _Locinfo *locinfo, MSVCP_size_t refs)
2276 ctype_wchar *ret = ctype_wchar_ctor_locinfo(this, locinfo, refs);
2277 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
2278 return ret;
2281 /* ??0?$ctype@_W@std@@QAE@I@Z */
2282 /* ??0?$ctype@_W@std@@QEAA@_K@Z */
2283 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_refs, 8)
2284 ctype_wchar* __thiscall ctype_wchar_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
2286 _Locinfo locinfo;
2288 TRACE("(%p %lu)\n", this, refs);
2290 ctype_base_ctor_refs(&this->base, refs);
2291 this->base.facet.vtable = &MSVCP_ctype_wchar_vtable;
2293 _Locinfo_ctor(&locinfo);
2294 ctype_wchar__Init(this, &locinfo);
2295 _Locinfo_dtor(&locinfo);
2296 return this;
2299 /* ??0?$ctype@G@std@@QAE@I@Z */
2300 /* ??0?$ctype@G@std@@QEAA@_K@Z */
2301 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_refs, 8)
2302 ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, MSVCP_size_t refs)
2304 ctype_wchar *ret = ctype_wchar_ctor_refs(this, refs);
2305 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
2306 return ret;
2309 /* ??0?$ctype@G@std@@IAE@PBDI@Z */
2310 /* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
2311 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
2312 ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
2313 const char *name, MSVCP_size_t refs)
2315 _Locinfo locinfo;
2317 TRACE("(%p %s %lu)\n", this, debugstr_a(name), refs);
2319 ctype_base_ctor_refs(&this->base, refs);
2320 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
2322 _Locinfo_ctor_cstr(&locinfo, name);
2323 ctype_wchar__Init(this, &locinfo);
2324 _Locinfo_dtor(&locinfo);
2325 return this;
2328 /* ??_F?$ctype@_W@std@@QAEXXZ */
2329 /* ??_F?$ctype@_W@std@@QEAAXXZ */
2330 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
2331 ctype_wchar* __thiscall ctype_wchar_ctor(ctype_wchar *this)
2333 TRACE("(%p)\n", this);
2334 return ctype_short_ctor_refs(this, 0);
2337 /* ??_F?$ctype@G@std@@QAEXXZ */
2338 /* ??_F?$ctype@G@std@@QEAAXXZ */
2339 DEFINE_THISCALL_WRAPPER(ctype_short_ctor, 4)
2340 ctype_wchar* __thiscall ctype_short_ctor(ctype_wchar *this)
2342 ctype_wchar *ret = ctype_wchar_ctor(this);
2343 this->base.facet.vtable = &MSVCP_ctype_short_vtable;
2344 return ret;
2347 /* ??1?$ctype@G@std@@UAE@XZ */
2348 /* ??1?$ctype@G@std@@UEAA@XZ */
2349 /* ??1?$ctype@_W@std@@MAE@XZ */
2350 /* ??1?$ctype@_W@std@@MEAA@XZ */
2351 /* ??1?$ctype@G@std@@MAE@XZ */
2352 /* ??1?$ctype@G@std@@MEAA@XZ */
2353 DEFINE_THISCALL_WRAPPER(ctype_wchar_dtor, 4)
2354 void __thiscall ctype_wchar_dtor(ctype_wchar *this)
2356 TRACE("(%p)\n", this);
2357 if(this->ctype.delfl)
2358 free((void*)this->ctype.table);
2359 #if _MSVCP_VER >= 110
2360 free(this->ctype.name);
2361 #endif
2364 DEFINE_THISCALL_WRAPPER(ctype_wchar_vector_dtor, 8)
2365 ctype_wchar* __thiscall ctype_wchar_vector_dtor(ctype_wchar *this, unsigned int flags)
2367 TRACE("(%p %x)\n", this, flags);
2368 if(flags & 2) {
2369 /* we have an array, with the number of elements stored before the first object */
2370 INT_PTR i, *ptr = (INT_PTR *)this-1;
2372 for(i=*ptr-1; i>=0; i--)
2373 ctype_wchar_dtor(this+i);
2374 MSVCRT_operator_delete(ptr);
2375 } else {
2376 ctype_wchar_dtor(this);
2377 if(flags & 1)
2378 MSVCRT_operator_delete(this);
2381 return this;
2384 /* _Wcrtomb */
2385 int __cdecl _Wcrtomb(char *s, wchar_t wch, _Mbstatet *state, const _Cvtvec *cvt)
2387 int cp, size;
2388 BOOL def;
2390 TRACE("%p %d %p %p\n", s, wch, state, cvt);
2392 if(cvt)
2393 cp = cvt->page;
2394 else
2395 cp = ___lc_codepage_func();
2397 if(!cp) {
2398 if(wch > 255) {
2399 *_errno() = EILSEQ;
2400 return -1;
2403 *s = wch & 255;
2404 return 1;
2407 size = WideCharToMultiByte(cp, 0, &wch, 1, s, MB_LEN_MAX, NULL, &def);
2408 if(!size || def) {
2409 *_errno() = EILSEQ;
2410 return -1;
2413 return size;
2416 /* ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z */
2417 /* ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z */
2418 /* ?_Donarrow@?$ctype@G@std@@IBEDGD@Z */
2419 /* ?_Donarrow@?$ctype@G@std@@IEBADGD@Z */
2420 DEFINE_THISCALL_WRAPPER(ctype_wchar__Donarrow, 12)
2421 char __thiscall ctype_wchar__Donarrow(const ctype_wchar *this, wchar_t ch, char dflt)
2423 char buf[MB_LEN_MAX];
2425 TRACE("(%p %d %d)\n", this, ch, dflt);
2427 return _Wcrtomb(buf, ch, NULL, &this->cvt)==1 ? buf[0] : dflt;
2430 /* ?do_narrow@?$ctype@_W@std@@MBED_WD@Z */
2431 /* ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z */
2432 /* ?do_narrow@?$ctype@G@std@@MBEDGD@Z */
2433 /* ?do_narrow@?$ctype@G@std@@MEBADGD@Z */
2434 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow_ch, 12)
2435 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2436 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 52, \
2437 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2438 #elif _MSVCP_VER <= 100
2439 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 48, \
2440 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2441 #else
2442 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 56, \
2443 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2444 #endif
2445 char __thiscall ctype_wchar_do_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2447 return ctype_wchar__Donarrow(this, ch, dflt);
2450 /* ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z */
2451 /* ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z */
2452 /* ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z */
2453 /* ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z */
2454 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow, 20)
2455 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2456 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 48, \
2457 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2458 (this, first, last, dflt, dest))
2459 #elif _MSVCP_VER <= 100
2460 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 44, \
2461 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2462 (this, first, last, dflt, dest))
2463 #else
2464 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 52, \
2465 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2466 (this, first, last, dflt, dest))
2467 #endif
2468 const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
2469 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2471 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2472 for(; first<last; first++)
2473 *dest++ = ctype_wchar__Donarrow(this, *first, dflt);
2474 return last;
2477 /* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
2478 /* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
2479 /* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
2480 /* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
2481 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
2482 #define call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size) CALL_VTBL_FUNC(this, 56, \
2483 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*, MSVCP_size_t), \
2484 (this, first, last, dflt, dest, size))
2485 const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
2486 const wchar_t *first, const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
2488 TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
2489 /* This function converts all multi-byte characters to dflt,
2490 * thanks to it result size is known before converting */
2491 if(last-first > size)
2492 ctype_base__Xran();
2493 return ctype_wchar_do_narrow(this, first, last, dflt, dest);
2496 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
2497 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
2498 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
2499 /* ?narrow@?$ctype@G@std@@QEBADGD@Z */
2500 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow_ch, 12)
2501 char __thiscall ctype_wchar_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2503 TRACE("(%p %d %d)\n", this, ch, dflt);
2504 return call_ctype_wchar_do_narrow_ch(this, ch, dflt);
2507 /* ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z */
2508 /* ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z */
2509 /* ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z */
2510 /* ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z */
2511 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow, 20)
2512 const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
2513 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2515 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2516 return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
2519 /* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
2520 /* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
2521 /* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
2522 /* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
2523 DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
2524 const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
2525 const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
2527 TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
2528 return call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
2531 /* _Mbrtowc */
2532 int __cdecl _Mbrtowc(wchar_t *out, const char *in, MSVCP_size_t len, _Mbstatet *state, const _Cvtvec *cvt)
2534 int i, cp;
2535 CPINFO cp_info;
2536 BOOL is_lead;
2538 TRACE("(%p %p %lu %p %p)\n", out, in, len, state, cvt);
2540 if(!len)
2541 return 0;
2543 if(cvt)
2544 cp = cvt->page;
2545 else
2546 cp = ___lc_codepage_func();
2548 if(!cp) {
2549 if(out)
2550 *out = (unsigned char)*in;
2552 memset(state, 0, sizeof(*state));
2553 return *in ? 1 : 0;
2556 if(MBSTATET_TO_INT(state)) {
2557 ((char*)&MBSTATET_TO_INT(state))[1] = *in;
2559 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, (char*)&MBSTATET_TO_INT(state), 2, out, out ? 1 : 0)) {
2560 memset(state, 0, sizeof(*state));
2561 *_errno() = EILSEQ;
2562 return -1;
2565 memset(state, 0, sizeof(*state));
2566 return 2;
2569 GetCPInfo(cp, &cp_info);
2570 is_lead = FALSE;
2571 for(i=0; i<MAX_LEADBYTES; i+=2) {
2572 if(!cp_info.LeadByte[i+1])
2573 break;
2574 if((unsigned char)*in>=cp_info.LeadByte[i] && (unsigned char)*in<=cp_info.LeadByte[i+1]) {
2575 is_lead = TRUE;
2576 break;
2580 if(is_lead) {
2581 if(len == 1) {
2582 MBSTATET_TO_INT(state) = (unsigned char)*in;
2583 return -2;
2586 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 2, out, out ? 1 : 0)) {
2587 *_errno() = EILSEQ;
2588 return -1;
2590 return 2;
2593 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 1, out, out ? 1 : 0)) {
2594 *_errno() = EILSEQ;
2595 return -1;
2597 return 1;
2600 static inline wchar_t mb_to_wc(char ch, const _Cvtvec *cvt)
2602 _Mbstatet state;
2603 wchar_t ret;
2605 memset(&state, 0, sizeof(state));
2606 return _Mbrtowc(&ret, &ch, 1, &state, cvt) == 1 ? ret : 0;
2609 /* ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z */
2610 /* ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z */
2611 /* ?_Dowiden@?$ctype@G@std@@IBEGD@Z */
2612 /* ?_Dowiden@?$ctype@G@std@@IEBAGD@Z */
2613 DEFINE_THISCALL_WRAPPER(ctype_wchar__Dowiden, 8)
2614 wchar_t __thiscall ctype_wchar__Dowiden(const ctype_wchar *this, char ch)
2616 _Mbstatet state;
2617 wchar_t ret;
2619 TRACE("(%p %d)\n", this, ch);
2621 memset(&state, 0, sizeof(state));
2622 return _Mbrtowc(&ret, &ch, 1, &state, &this->cvt)<0 ? WEOF : ret;
2625 /* ?do_widen@?$ctype@_W@std@@MBE_WD@Z */
2626 /* ?do_widen@?$ctype@_W@std@@MEBA_WD@Z */
2627 /* ?do_widen@?$ctype@G@std@@MBEGD@Z */
2628 /* ?do_widen@?$ctype@G@std@@MEBAGD@Z */
2629 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen_ch, 8)
2630 #if _MSVCP_VER <= 100
2631 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2632 wchar_t, (const ctype_wchar*, char), (this, ch))
2633 #else
2634 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 48, \
2635 wchar_t, (const ctype_wchar*, char), (this, ch))
2636 #endif
2637 wchar_t __thiscall ctype_wchar_do_widen_ch(const ctype_wchar *this, char ch)
2639 return ctype_wchar__Dowiden(this, ch);
2642 /* ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z */
2643 /* ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z */
2644 /* ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z */
2645 /* ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z */
2646 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen, 16)
2647 #if _MSVCP_VER <= 100
2648 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 36, \
2649 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2650 (this, first, last, dest))
2651 #else
2652 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 44, \
2653 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2654 (this, first, last, dest))
2655 #endif
2656 const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
2657 const char *first, const char *last, wchar_t *dest)
2659 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2660 for(; first<last; first++)
2661 *dest++ = ctype_wchar__Dowiden(this, *first);
2662 return last;
2665 /* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
2666 /* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
2667 /* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
2668 /* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
2669 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
2670 #define call_ctype_wchar__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 44, \
2671 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*, MSVCP_size_t), \
2672 (this, first, last, dest, size))
2673 const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
2674 const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2676 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2677 /* This function converts all multi-byte characters to WEOF,
2678 * thanks to it result size is known before converting */
2679 if(size < last-first)
2680 ctype_base__Xran();
2681 return ctype_wchar_do_widen(this, first, last, dest);
2684 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
2685 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
2686 /* ?widen@?$ctype@G@std@@QBEGD@Z */
2687 /* ?widen@?$ctype@G@std@@QEBAGD@Z */
2688 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen_ch, 8)
2689 wchar_t __thiscall ctype_wchar_widen_ch(const ctype_wchar *this, char ch)
2691 TRACE("(%p %d)\n", this, ch);
2692 return call_ctype_wchar_do_widen_ch(this, ch);
2695 /* ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z */
2696 /* ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z */
2697 /* ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z */
2698 /* ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z */
2699 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen, 16)
2700 const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
2701 const char *first, const char *last, wchar_t *dest)
2703 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2704 return call_ctype_wchar_do_widen(this, first, last, dest);
2707 /* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
2708 /* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
2709 /* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
2710 /* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
2711 DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
2712 const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
2713 const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
2715 TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
2716 return call_ctype_wchar__Do_widen_s(this, first, last, dest, size);
2719 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2720 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2721 MSVCP_size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
2723 TRACE("(%p %p)\n", facet, loc);
2725 if(facet && !*facet) {
2726 _Locinfo locinfo;
2728 *facet = MSVCRT_operator_new(sizeof(ctype_wchar));
2729 if(!*facet) {
2730 ERR("Out of memory\n");
2731 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2732 return 0;
2735 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
2736 ctype_wchar_ctor_locinfo((ctype_wchar*)*facet, &locinfo, 0);
2737 _Locinfo_dtor(&locinfo);
2740 return LC_CTYPE;
2743 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@@Z */
2744 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2745 MSVCP_size_t __cdecl ctype_wchar__Getcat_old(const locale_facet **facet)
2747 return ctype_wchar__Getcat(facet, locale_classic());
2750 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2751 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2752 MSVCP_size_t __cdecl ctype_short__Getcat(const locale_facet **facet, const locale *loc)
2754 if(facet && !*facet) {
2755 ctype_wchar__Getcat(facet, loc);
2756 (*(locale_facet**)facet)->vtable = &MSVCP_ctype_short_vtable;
2759 return LC_CTYPE;
2762 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@@Z */
2763 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2764 MSVCP_size_t __cdecl ctype_short__Getcat_old(const locale_facet **facet)
2766 return ctype_short__Getcat(facet, locale_classic());
2769 /* _Towlower */
2770 wchar_t __cdecl _Towlower(wchar_t ch, const _Ctypevec *ctype)
2772 TRACE("(%d %p)\n", ch, ctype);
2773 return tolowerW(ch);
2776 ctype_wchar* ctype_wchar_use_facet(const locale *loc)
2778 static ctype_wchar *obj = NULL;
2780 _Lockit lock;
2781 const locale_facet *fac;
2783 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2784 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_wchar_id));
2785 if(fac) {
2786 _Lockit_dtor(&lock);
2787 return (ctype_wchar*)fac;
2790 if(obj) {
2791 _Lockit_dtor(&lock);
2792 return obj;
2795 ctype_wchar__Getcat(&fac, loc);
2796 obj = (ctype_wchar*)fac;
2797 call_locale_facet__Incref(&obj->base.facet);
2798 locale_facet_register(&obj->base.facet);
2799 _Lockit_dtor(&lock);
2801 return obj;
2804 ctype_wchar* ctype_short_use_facet(const locale *loc)
2806 static ctype_wchar *obj = NULL;
2808 _Lockit lock;
2809 const locale_facet *fac;
2811 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2812 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_short_id));
2813 if(fac) {
2814 _Lockit_dtor(&lock);
2815 return (ctype_wchar*)fac;
2818 if(obj) {
2819 _Lockit_dtor(&lock);
2820 return obj;
2823 ctype_short__Getcat(&fac, loc);
2824 obj = (ctype_wchar*)fac;
2825 call_locale_facet__Incref(&obj->base.facet);
2826 locale_facet_register(&obj->base.facet);
2827 _Lockit_dtor(&lock);
2829 return obj;
2832 /* ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z */
2833 /* ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z */
2834 /* ?do_tolower@?$ctype@G@std@@MBEGG@Z */
2835 /* ?do_tolower@?$ctype@G@std@@MEBAGG@Z */
2836 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower_ch, 8)
2837 #if _MSVCP_VER <= 100
2838 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2839 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2840 #else
2841 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2842 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2843 #endif
2844 wchar_t __thiscall ctype_wchar_do_tolower_ch(const ctype_wchar *this, wchar_t ch)
2846 return _Towlower(ch, &this->ctype);
2849 /* ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2850 /* ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2851 /* ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2852 /* ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2853 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower, 12)
2854 #if _MSVCP_VER <= 100
2855 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 20, \
2856 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2857 (this, first, last))
2858 #else
2859 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 28, \
2860 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2861 (this, first, last))
2862 #endif
2863 const wchar_t* __thiscall ctype_wchar_do_tolower(const ctype_wchar *this,
2864 wchar_t *first, const wchar_t *last)
2866 TRACE("(%p %p %p)\n", this, first, last);
2867 for(; first<last; first++)
2868 *first = _Towlower(*first, &this->ctype);
2869 return last;
2872 /* ?tolower@?$ctype@_W@std@@QBE_W_W@Z */
2873 /* ?tolower@?$ctype@_W@std@@QEBA_W_W@Z */
2874 /* ?tolower@?$ctype@G@std@@QBEGG@Z */
2875 /* ?tolower@?$ctype@G@std@@QEBAGG@Z */
2876 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower_ch, 8)
2877 wchar_t __thiscall ctype_wchar_tolower_ch(const ctype_wchar *this, wchar_t ch)
2879 TRACE("(%p %d)\n", this, ch);
2880 return call_ctype_wchar_do_tolower_ch(this, ch);
2883 /* ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2884 /* ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2885 /* ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2886 /* ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2887 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower, 12)
2888 const wchar_t* __thiscall ctype_wchar_tolower(const ctype_wchar *this,
2889 wchar_t *first, const wchar_t *last)
2891 TRACE("(%p %p %p)\n", this, first, last);
2892 return call_ctype_wchar_do_tolower(this, first, last);
2895 /* _Towupper */
2896 wchar_t __cdecl _Towupper(wchar_t ch, const _Ctypevec *ctype)
2898 TRACE("(%d %p)\n", ch, ctype);
2899 return toupperW(ch);
2902 /* ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z */
2903 /* ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z */
2904 /* ?do_toupper@?$ctype@G@std@@MBEGG@Z */
2905 /* ?do_toupper@?$ctype@G@std@@MEBAGG@Z */
2906 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper_ch, 8)
2907 #if _MSVCP_VER <= 100
2908 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2909 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2910 #else
2911 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2912 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2913 #endif
2914 wchar_t __thiscall ctype_wchar_do_toupper_ch(const ctype_wchar *this, wchar_t ch)
2916 return _Towupper(ch, &this->ctype);
2919 /* ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2920 /* ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2921 /* ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2922 /* ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2923 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper, 12)
2924 #if _MSVCP_VER <= 100
2925 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 28, \
2926 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2927 (this, first, last))
2928 #else
2929 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 36, \
2930 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2931 (this, first, last))
2932 #endif
2933 const wchar_t* __thiscall ctype_wchar_do_toupper(const ctype_wchar *this,
2934 wchar_t *first, const wchar_t *last)
2936 TRACE("(%p %p %p)\n", this, first, last);
2937 for(; first<last; first++)
2938 *first = _Towupper(*first, &this->ctype);
2939 return last;
2942 /* ?toupper@?$ctype@_W@std@@QBE_W_W@Z */
2943 /* ?toupper@?$ctype@_W@std@@QEBA_W_W@Z */
2944 /* ?toupper@?$ctype@G@std@@QBEGG@Z */
2945 /* ?toupper@?$ctype@G@std@@QEBAGG@Z */
2946 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper_ch, 8)
2947 wchar_t __thiscall ctype_wchar_toupper_ch(const ctype_wchar *this, wchar_t ch)
2949 TRACE("(%p %d)\n", this, ch);
2950 return call_ctype_wchar_do_toupper_ch(this, ch);
2953 /* ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2954 /* ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2955 /* ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2956 /* ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2957 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper, 12)
2958 const wchar_t* __thiscall ctype_wchar_toupper(const ctype_wchar *this,
2959 wchar_t *first, const wchar_t *last)
2961 TRACE("(%p %p %p)\n", this, first, last);
2962 return call_ctype_wchar_do_toupper(this, first, last);
2965 /* _Getwctypes */
2966 const wchar_t* __cdecl _Getwctypes(const wchar_t *first, const wchar_t *last,
2967 short *mask, const _Ctypevec *ctype)
2969 TRACE("(%p %p %p %p)\n", first, last, mask, ctype);
2970 GetStringTypeW(CT_CTYPE1, first, last-first, (WORD*)mask);
2971 return last;
2974 /* _Getwctype */
2975 short __cdecl _Getwctype(wchar_t ch, const _Ctypevec *ctype)
2977 short mask = 0;
2978 _Getwctypes(&ch, &ch+1, &mask, ctype);
2979 return mask;
2982 /* ?do_is@?$ctype@_W@std@@MBE_NF_W@Z */
2983 /* ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z */
2984 /* ?do_is@?$ctype@G@std@@MBE_NFG@Z */
2985 /* ?do_is@?$ctype@G@std@@MEBA_NFG@Z */
2986 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is_ch, 12)
2987 #if _MSVCP_VER <= 100
2988 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 8, \
2989 MSVCP_bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2990 #else
2991 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 16, \
2992 MSVCP_bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
2993 #endif
2994 MSVCP_bool __thiscall ctype_wchar_do_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
2996 TRACE("(%p %x %d)\n", this, mask, ch);
2997 return (_Getwctype(ch, &this->ctype) & mask) != 0;
3000 /* ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z */
3001 /* ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z */
3002 /* ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z */
3003 /* ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z */
3004 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is, 16)
3005 #if _MSVCP_VER <= 100
3006 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 4, \
3007 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
3008 (this, first, last, dest))
3009 #else
3010 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 12, \
3011 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
3012 (this, first, last, dest))
3013 #endif
3014 const wchar_t* __thiscall ctype_wchar_do_is(const ctype_wchar *this,
3015 const wchar_t *first, const wchar_t *last, short *dest)
3017 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3018 return _Getwctypes(first, last, dest, &this->ctype);
3021 /* ?is@?$ctype@_W@std@@QBE_NF_W@Z */
3022 /* ?is@?$ctype@_W@std@@QEBA_NF_W@Z */
3023 /* ?is@?$ctype@G@std@@QBE_NFG@Z */
3024 /* ?is@?$ctype@G@std@@QEBA_NFG@Z */
3025 DEFINE_THISCALL_WRAPPER(ctype_wchar_is_ch, 12)
3026 MSVCP_bool __thiscall ctype_wchar_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
3028 TRACE("(%p %x %d)\n", this, mask, ch);
3029 return call_ctype_wchar_do_is_ch(this, mask, ch);
3032 /* ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z */
3033 /* ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z */
3034 /* ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z */
3035 /* ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z */
3036 DEFINE_THISCALL_WRAPPER(ctype_wchar_is, 16)
3037 const wchar_t* __thiscall ctype_wchar_is(const ctype_wchar *this,
3038 const wchar_t *first, const wchar_t *last, short *dest)
3040 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3041 return call_ctype_wchar_do_is(this, first, last, dest);
3044 /* ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3045 /* ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3046 /* ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z */
3047 /* ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3048 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_is, 16)
3049 #if _MSVCP_VER <= 100
3050 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 12, \
3051 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3052 (this, mask, first, last))
3053 #else
3054 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 20, \
3055 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3056 (this, mask, first, last))
3057 #endif
3058 const wchar_t* __thiscall ctype_wchar_do_scan_is(const ctype_wchar *this,
3059 short mask, const wchar_t *first, const wchar_t *last)
3061 TRACE("(%p %d %p %p)\n", this, mask, first, last);
3062 for(; first<last; first++)
3063 if(!ctype_wchar_is_ch(this, mask, *first))
3064 break;
3065 return first;
3068 /* ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3069 /* ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3070 /* ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z */
3071 /* ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3072 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_is, 16)
3073 const wchar_t* __thiscall ctype_wchar_scan_is(const ctype_wchar *this,
3074 short mask, const wchar_t *first, const wchar_t *last)
3076 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3077 return call_ctype_wchar_do_scan_is(this, mask, first, last);
3080 /* ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3081 /* ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3082 /* ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z */
3083 /* ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3084 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_not, 16)
3085 #if _MSVCP_VER <= 100
3086 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 16, \
3087 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3088 (this, mask, first, last))
3089 #else
3090 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 24, \
3091 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3092 (this, mask, first, last))
3093 #endif
3094 const wchar_t* __thiscall ctype_wchar_do_scan_not(const ctype_wchar *this,
3095 short mask, const wchar_t *first, const wchar_t *last)
3097 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3098 for(; first<last; first++)
3099 if(ctype_wchar_is_ch(this, mask, *first))
3100 break;
3101 return first;
3104 /* ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3105 /* ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3106 /* ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z */
3107 /* ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3108 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_not, 16)
3109 const wchar_t* __thiscall ctype_wchar_scan_not(const ctype_wchar *this,
3110 short mask, const wchar_t *first, const wchar_t *last)
3112 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3113 return call_ctype_wchar_do_scan_not(this, mask, first, last);
3116 /* ??_7codecvt_base@std@@6B@ */
3117 extern const vtable_ptr MSVCP_codecvt_base_vtable;
3119 /* ??0codecvt_base@std@@QAE@I@Z */
3120 /* ??0codecvt_base@std@@QEAA@_K@Z */
3121 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor_refs, 8)
3122 codecvt_base* __thiscall codecvt_base_ctor_refs(codecvt_base *this, MSVCP_size_t refs)
3124 TRACE("(%p %lu)\n", this, refs);
3125 locale_facet_ctor_refs(&this->facet, refs);
3126 this->facet.vtable = &MSVCP_codecvt_base_vtable;
3127 return this;
3130 /* ??_Fcodecvt_base@std@@QAEXXZ */
3131 /* ??_Fcodecvt_base@std@@QEAAXXZ */
3132 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor, 4)
3133 codecvt_base* __thiscall codecvt_base_ctor(codecvt_base *this)
3135 return codecvt_base_ctor_refs(this, 0);
3138 /* ??1codecvt_base@std@@UAE@XZ */
3139 /* ??1codecvt_base@std@@UEAA@XZ */
3140 DEFINE_THISCALL_WRAPPER(codecvt_base_dtor, 4)
3141 void __thiscall codecvt_base_dtor(codecvt_base *this)
3143 TRACE("(%p)\n", this);
3144 locale_facet_dtor(&this->facet);
3147 DEFINE_THISCALL_WRAPPER(codecvt_base_vector_dtor, 8)
3148 codecvt_base* __thiscall codecvt_base_vector_dtor(codecvt_base *this, unsigned int flags)
3150 TRACE("(%p %x)\n", this, flags);
3151 if(flags & 2) {
3152 /* we have an array, with the number of elements stored before the first object */
3153 INT_PTR i, *ptr = (INT_PTR *)this-1;
3155 for(i=*ptr-1; i>=0; i--)
3156 codecvt_base_dtor(this+i);
3157 MSVCRT_operator_delete(ptr);
3158 } else {
3159 codecvt_base_dtor(this);
3160 if(flags & 1)
3161 MSVCRT_operator_delete(this);
3164 return this;
3167 /* ?do_always_noconv@codecvt_base@std@@MBE_NXZ */
3168 /* ?do_always_noconv@codecvt_base@std@@MEBA_NXZ */
3169 #if _MSVCP_VER <= 100
3170 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 4, \
3171 MSVCP_bool, (const codecvt_base*), (this))
3172 #else
3173 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 12, \
3174 MSVCP_bool, (const codecvt_base*), (this))
3175 #endif
3176 DEFINE_THISCALL_WRAPPER(codecvt_base_do_always_noconv, 4)
3177 MSVCP_bool __thiscall codecvt_base_do_always_noconv(const codecvt_base *this)
3179 TRACE("(%p)\n", this);
3180 return _MSVCP_VER <= 100;
3183 /* ?always_noconv@codecvt_base@std@@QBE_NXZ */
3184 /* ?always_noconv@codecvt_base@std@@QEBA_NXZ */
3185 DEFINE_THISCALL_WRAPPER(codecvt_base_always_noconv, 4)
3186 MSVCP_bool __thiscall codecvt_base_always_noconv(const codecvt_base *this)
3188 TRACE("(%p)\n", this);
3189 return call_codecvt_base_do_always_noconv(this);
3192 /* ?do_max_length@codecvt_base@std@@MBEHXZ */
3193 /* ?do_max_length@codecvt_base@std@@MEBAHXZ */
3194 #if _MSVCP_VER <= 100
3195 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 8, \
3196 int, (const codecvt_base*), (this))
3197 #else
3198 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 16, \
3199 int, (const codecvt_base*), (this))
3200 #endif
3201 DEFINE_THISCALL_WRAPPER(codecvt_base_do_max_length, 4)
3202 int __thiscall codecvt_base_do_max_length(const codecvt_base *this)
3204 TRACE("(%p)\n", this);
3205 return 1;
3208 /* ?max_length@codecvt_base@std@@QBEHXZ */
3209 /* ?max_length@codecvt_base@std@@QEBAHXZ */
3210 DEFINE_THISCALL_WRAPPER(codecvt_base_max_length, 4)
3211 int __thiscall codecvt_base_max_length(const codecvt_base *this)
3213 TRACE("(%p)\n", this);
3214 return call_codecvt_base_do_max_length(this);
3217 /* ?do_encoding@codecvt_base@std@@MBEHXZ */
3218 /* ?do_encoding@codecvt_base@std@@MEBAHXZ */
3219 #if _MSVCP_VER <= 100
3220 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 12, \
3221 int, (const codecvt_base*), (this))
3222 #else
3223 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 20, \
3224 int, (const codecvt_base*), (this))
3225 #endif
3226 DEFINE_THISCALL_WRAPPER(codecvt_base_do_encoding, 4)
3227 int __thiscall codecvt_base_do_encoding(const codecvt_base *this)
3229 TRACE("(%p)\n", this);
3230 return 1;
3233 /* ?encoding@codecvt_base@std@@QBEHXZ */
3234 /* ?encoding@codecvt_base@std@@QEBAHXZ */
3235 DEFINE_THISCALL_WRAPPER(codecvt_base_encoding, 4)
3236 int __thiscall codecvt_base_encoding(const codecvt_base *this)
3238 TRACE("(%p)\n", this);
3239 return call_codecvt_base_do_encoding(this);
3242 /* ?id@?$codecvt@DDH@std@@2V0locale@2@A */
3243 locale_id codecvt_char_id = {0};
3245 /* ??_7?$codecvt@DDH@std@@6B@ */
3246 extern const vtable_ptr MSVCP_codecvt_char_vtable;
3248 /* ?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z */
3249 /* ?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3250 DEFINE_THISCALL_WRAPPER(codecvt_char__Init, 8)
3251 void __thiscall codecvt_char__Init(codecvt_char *this, const _Locinfo *locinfo)
3253 TRACE("(%p %p)\n", this, locinfo);
3256 /* ??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z */
3257 /* ??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3258 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_locinfo, 12)
3259 codecvt_char* __thiscall codecvt_char_ctor_locinfo(codecvt_char *this, const _Locinfo *locinfo, MSVCP_size_t refs)
3261 TRACE("(%p %p %lu)\n", this, locinfo, refs);
3262 codecvt_base_ctor_refs(&this->base, refs);
3263 this->base.facet.vtable = &MSVCP_codecvt_char_vtable;
3264 return this;
3267 /* ??0?$codecvt@DDH@std@@QAE@I@Z */
3268 /* ??0?$codecvt@DDH@std@@QEAA@_K@Z */
3269 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_refs, 8)
3270 codecvt_char* __thiscall codecvt_char_ctor_refs(codecvt_char *this, MSVCP_size_t refs)
3272 return codecvt_char_ctor_locinfo(this, NULL, refs);
3275 /* ??_F?$codecvt@DDH@std@@QAEXXZ */
3276 /* ??_F?$codecvt@DDH@std@@QEAAXXZ */
3277 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor, 4)
3278 codecvt_char* __thiscall codecvt_char_ctor(codecvt_char *this)
3280 return codecvt_char_ctor_locinfo(this, NULL, 0);
3283 /* ??1?$codecvt@DDH@std@@UAE@XZ */
3284 /* ??1?$codecvt@DDH@std@@UEAA@XZ */
3285 /* ??1?$codecvt@DDH@std@@MAE@XZ */
3286 /* ??1?$codecvt@DDH@std@@MEAA@XZ */
3287 DEFINE_THISCALL_WRAPPER(codecvt_char_dtor, 4)
3288 void __thiscall codecvt_char_dtor(codecvt_char *this)
3290 TRACE("(%p)\n", this);
3291 codecvt_base_dtor(&this->base);
3294 DEFINE_THISCALL_WRAPPER(codecvt_char_vector_dtor, 8)
3295 codecvt_char* __thiscall codecvt_char_vector_dtor(codecvt_char *this, unsigned int flags)
3297 TRACE("(%p %x)\n", this, flags);
3298 if(flags & 2) {
3299 /* we have an array, with the number of elements stored before the first object */
3300 INT_PTR i, *ptr = (INT_PTR *)this-1;
3302 for(i=*ptr-1; i>=0; i--)
3303 codecvt_char_dtor(this+i);
3304 MSVCRT_operator_delete(ptr);
3305 } else {
3306 codecvt_char_dtor(this);
3307 if(flags & 1)
3308 MSVCRT_operator_delete(this);
3311 return this;
3314 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3315 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3316 MSVCP_size_t __cdecl codecvt_char__Getcat(const locale_facet **facet, const locale *loc)
3318 TRACE("(%p %p)\n", facet, loc);
3320 if(facet && !*facet) {
3321 *facet = MSVCRT_operator_new(sizeof(codecvt_char));
3322 if(!*facet) {
3323 ERR("Out of memory\n");
3324 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3325 return 0;
3327 codecvt_char_ctor((codecvt_char*)*facet);
3330 return LC_CTYPE;
3333 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@@Z */
3334 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3335 MSVCP_size_t __cdecl codecvt_char__Getcat_old(const locale_facet **facet)
3337 return codecvt_char__Getcat(facet, locale_classic());
3340 codecvt_char* codecvt_char_use_facet(const locale *loc)
3342 static codecvt_char *obj = NULL;
3344 _Lockit lock;
3345 const locale_facet *fac;
3347 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3348 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_char_id));
3349 if(fac) {
3350 _Lockit_dtor(&lock);
3351 return (codecvt_char*)fac;
3354 if(obj) {
3355 _Lockit_dtor(&lock);
3356 return obj;
3359 codecvt_char__Getcat(&fac, loc);
3360 obj = (codecvt_char*)fac;
3361 call_locale_facet__Incref(&obj->base.facet);
3362 locale_facet_register(&obj->base.facet);
3363 _Lockit_dtor(&lock);
3365 return obj;
3368 /* ?do_always_noconv@?$codecvt@DDH@std@@MBE_NXZ */
3369 /* ?do_always_noconv@?$codecvt@DDH@std@@MEBA_NXZ */
3370 DEFINE_THISCALL_WRAPPER(codecvt_char_do_always_noconv, 4)
3371 MSVCP_bool __thiscall codecvt_char_do_always_noconv(const codecvt_char *this)
3373 TRACE("(%p)\n", this);
3374 return TRUE;
3377 /* ?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3378 /* ?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3379 #if _MSVCP_VER <= 100
3380 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3381 CALL_VTBL_FUNC(this, 16, int, \
3382 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3383 (this, state, from, from_end, from_next, to, to_end, to_next))
3384 #else
3385 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3386 CALL_VTBL_FUNC(this, 24, int, \
3387 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3388 (this, state, from, from_end, from_next, to, to_end, to_next))
3389 #endif
3390 DEFINE_THISCALL_WRAPPER(codecvt_char_do_in, 32)
3391 int __thiscall codecvt_char_do_in(const codecvt_char *this, _Mbstatet *state,
3392 const char *from, const char *from_end, const char **from_next,
3393 char *to, char *to_end, char **to_next)
3395 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3396 from_next, to, to_end, to_next);
3397 *from_next = from;
3398 *to_next = to;
3399 return CODECVT_noconv;
3402 /* ?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3403 /* ?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3404 DEFINE_THISCALL_WRAPPER(codecvt_char_in, 32)
3405 int __thiscall codecvt_char_in(const codecvt_char *this, _Mbstatet *state,
3406 const char *from, const char *from_end, const char **from_next,
3407 char *to, char *to_end, char **to_next)
3409 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3410 from_next, to, to_end, to_next);
3411 return call_codecvt_char_do_in(this, state, from, from_end, from_next,
3412 to, to_end, to_next);
3415 /* ?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3416 /* ?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3417 #if _MSVCP_VER <= 100
3418 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3419 CALL_VTBL_FUNC(this, 20, int, \
3420 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3421 (this, state, from, from_end, from_next, to, to_end, to_next))
3422 #else
3423 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3424 CALL_VTBL_FUNC(this, 28, int, \
3425 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3426 (this, state, from, from_end, from_next, to, to_end, to_next))
3427 #endif
3428 DEFINE_THISCALL_WRAPPER(codecvt_char_do_out, 32)
3429 int __thiscall codecvt_char_do_out(const codecvt_char *this, _Mbstatet *state,
3430 const char *from, const char *from_end, const char **from_next,
3431 char *to, char *to_end, char **to_next)
3433 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3434 from_end, from_next, to, to_end, to_next);
3435 *from_next = from;
3436 *to_next = to;
3437 return CODECVT_noconv;
3440 /* ?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3441 /* ?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3442 DEFINE_THISCALL_WRAPPER(codecvt_char_out, 32)
3443 int __thiscall codecvt_char_out(const codecvt_char *this, _Mbstatet *state,
3444 const char *from, const char *from_end, const char **from_next,
3445 char *to, char *to_end, char **to_next)
3447 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3448 from_next, to, to_end, to_next);
3449 return call_codecvt_char_do_out(this, state, from, from_end, from_next,
3450 to, to_end, to_next);
3453 /* ?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z */
3454 /* ?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3455 #if _MSVCP_VER <= 100
3456 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3457 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3458 #else
3459 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3460 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3461 #endif
3462 DEFINE_THISCALL_WRAPPER(codecvt_char_do_unshift, 20)
3463 int __thiscall codecvt_char_do_unshift(const codecvt_char *this,
3464 _Mbstatet *state, char *to, char *to_end, char **to_next)
3466 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3467 *to_next = to;
3468 return CODECVT_noconv;
3471 /* ?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z */
3472 /* ?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3473 DEFINE_THISCALL_WRAPPER(codecvt_char_unshift, 20)
3474 int __thiscall codecvt_char_unshift(const codecvt_char *this,
3475 _Mbstatet *state, char *to, char *to_end, char **to_next)
3477 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3478 return call_codecvt_char_do_unshift(this, state, to, to_end, to_next);
3481 /* ?do_length@?$codecvt@DDH@std@@MBEHABHPBD1I@Z */
3482 /* ?do_length@?$codecvt@DDH@std@@MEBAHAEBHPEBD1_K@Z */
3483 #if _MSVCP_VER <= 100
3484 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3485 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, MSVCP_size_t), \
3486 (this, state, from, from_end, max))
3487 #else
3488 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
3489 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, MSVCP_size_t), \
3490 (this, state, from, from_end, max))
3491 #endif
3492 DEFINE_THISCALL_WRAPPER(codecvt_char_do_length, 20)
3493 int __thiscall codecvt_char_do_length(const codecvt_char *this, const _Mbstatet *state,
3494 const char *from, const char *from_end, MSVCP_size_t max)
3496 TRACE("(%p %p %p %p %lu)\n", this, state, from, from_end, max);
3497 return (from_end-from > max ? max : from_end-from);
3500 /* ?length@?$codecvt@DDH@std@@QBEHABHPBD1I@Z */
3501 /* ?length@?$codecvt@DDH@std@@QEBAHAEBHPEBD1_K@Z */
3502 DEFINE_THISCALL_WRAPPER(codecvt_char_length, 20)
3503 int __thiscall codecvt_char_length(const codecvt_char *this, const _Mbstatet *state,
3504 const char *from, const char *from_end, MSVCP_size_t max)
3506 TRACE("(%p %p %p %p %lu)\n", this, state, from, from_end, max);
3507 return call_codecvt_char_do_length(this, state, from, from_end, max);
3510 /* ?id@?$codecvt@_WDH@std@@2V0locale@2@A */
3511 locale_id codecvt_wchar_id = {0};
3512 /* ?id@?$codecvt@GDH@std@@2V0locale@2@A */
3513 locale_id codecvt_short_id = {0};
3515 /* ??_7?$codecvt@_WDH@std@@6B@ */
3516 extern const vtable_ptr MSVCP_codecvt_wchar_vtable;
3517 /* ??_7?$codecvt@GDH@std@@6B@ */
3518 extern const vtable_ptr MSVCP_codecvt_short_vtable;
3520 /* ?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z */
3521 /* ?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3522 /* ?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z */
3523 /* ?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3524 DEFINE_THISCALL_WRAPPER(codecvt_wchar__Init, 8)
3525 void __thiscall codecvt_wchar__Init(codecvt_wchar *this, const _Locinfo *locinfo)
3527 TRACE("(%p %p)\n", this, locinfo);
3528 _Locinfo__Getcvt(locinfo, &this->cvt);
3531 /* ??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z */
3532 /* ??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3533 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_locinfo, 12)
3534 codecvt_wchar* __thiscall codecvt_wchar_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, MSVCP_size_t refs)
3536 TRACE("(%p %p %ld)\n", this, locinfo, refs);
3538 codecvt_base_ctor_refs(&this->base, refs);
3539 this->base.facet.vtable = &MSVCP_codecvt_wchar_vtable;
3541 codecvt_wchar__Init(this, locinfo);
3542 return this;
3545 /* ??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z */
3546 /* ??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3547 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_locinfo, 12)
3548 codecvt_wchar* __thiscall codecvt_short_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, MSVCP_size_t refs)
3550 TRACE("(%p %p %ld)\n", this, locinfo, refs);
3552 codecvt_wchar_ctor_locinfo(this, locinfo, refs);
3553 this->base.facet.vtable = &MSVCP_codecvt_short_vtable;
3554 return this;
3557 /* ??0?$codecvt@_WDH@std@@QAE@I@Z */
3558 /* ??0?$codecvt@_WDH@std@@QEAA@_K@Z */
3559 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_refs, 8)
3560 codecvt_wchar* __thiscall codecvt_wchar_ctor_refs(codecvt_wchar *this, MSVCP_size_t refs)
3562 _Locinfo locinfo;
3564 TRACE("(%p %ld)\n", this, refs);
3566 _Locinfo_ctor(&locinfo);
3567 codecvt_wchar_ctor_locinfo(this, &locinfo, refs);
3568 _Locinfo_dtor(&locinfo);
3569 return this;
3572 /* ??0?$codecvt@GDH@std@@QAE@I@Z */
3573 /* ??0?$codecvt@GDH@std@@QEAA@_K@Z */
3574 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_refs, 8)
3575 codecvt_wchar* __thiscall codecvt_short_ctor_refs(codecvt_wchar *this, MSVCP_size_t refs)
3577 _Locinfo locinfo;
3579 TRACE("(%p %ld)\n", this, refs);
3581 _Locinfo_ctor(&locinfo);
3582 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3583 _Locinfo_dtor(&locinfo);
3584 return this;
3587 /* ??0?$codecvt@GDH@std@@IAE@PBDI@Z */
3588 /* ??0?$codecvt@GDH@std@@IEAA@PEBD_K@Z */
3589 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_name, 12)
3590 codecvt_wchar* __thiscall codecvt_short_ctor_name(codecvt_wchar *this, const char *name, MSVCP_size_t refs)
3592 _Locinfo locinfo;
3594 TRACE("(%p %s %ld)\n", this, name, refs);
3596 _Locinfo_ctor_cstr(&locinfo, name);
3597 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3598 _Locinfo_dtor(&locinfo);
3599 return this;
3602 /* ??_F?$codecvt@_WDH@std@@QAEXXZ */
3603 /* ??_F?$codecvt@_WDH@std@@QEAAXXZ */
3604 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor, 4)
3605 codecvt_wchar* __thiscall codecvt_wchar_ctor(codecvt_wchar *this)
3607 return codecvt_wchar_ctor_refs(this, 0);
3610 /* ??_F?$codecvt@GDH@std@@QAEXXZ */
3611 /* ??_F?$codecvt@GDH@std@@QEAAXXZ */
3612 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor, 4)
3613 codecvt_wchar* __thiscall codecvt_short_ctor(codecvt_wchar *this)
3615 return codecvt_short_ctor_refs(this, 0);
3618 /* ??1?$codecvt@GDH@std@@UAE@XZ */
3619 /* ??1?$codecvt@GDH@std@@UEAA@XZ */
3620 /* ??1?$codecvt@GDH@std@@MAE@XZ */
3621 /* ??1?$codecvt@GDH@std@@MEAA@XZ */
3622 /* ??1?$codecvt@_WDH@std@@MAE@XZ */
3623 /* ??1?$codecvt@_WDH@std@@MEAA@XZ */
3624 DEFINE_THISCALL_WRAPPER(codecvt_wchar_dtor, 4)
3625 void __thiscall codecvt_wchar_dtor(codecvt_wchar *this)
3627 TRACE("(%p)\n", this);
3628 codecvt_base_dtor(&this->base);
3631 DEFINE_THISCALL_WRAPPER(codecvt_wchar_vector_dtor, 8)
3632 codecvt_wchar* __thiscall codecvt_wchar_vector_dtor(codecvt_wchar *this, unsigned int flags)
3634 TRACE("(%p %x)\n", this, flags);
3635 if(flags & 2) {
3636 /* we have an array, with the number of elements stored before the first object */
3637 INT_PTR i, *ptr = (INT_PTR *)this-1;
3639 for(i=*ptr-1; i>=0; i--)
3640 codecvt_wchar_dtor(this+i);
3641 MSVCRT_operator_delete(ptr);
3642 } else {
3643 codecvt_wchar_dtor(this);
3644 if(flags & 1)
3645 MSVCRT_operator_delete(this);
3648 return this;
3651 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3652 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3653 MSVCP_size_t __cdecl codecvt_wchar__Getcat(const locale_facet **facet, const locale *loc)
3655 TRACE("(%p %p)\n", facet, loc);
3657 if(facet && !*facet) {
3658 _Locinfo locinfo;
3660 *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
3661 if(!*facet) {
3662 ERR("Out of memory\n");
3663 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3664 return 0;
3667 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3668 codecvt_wchar_ctor_locinfo((codecvt_wchar*)*facet, &locinfo, 0);
3669 _Locinfo_dtor(&locinfo);
3672 return LC_CTYPE;
3675 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@@Z */
3676 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3677 MSVCP_size_t __cdecl codecvt_wchar__Getcat_old(const locale_facet **facet)
3679 return codecvt_wchar__Getcat(facet, locale_classic());
3682 codecvt_wchar* codecvt_wchar_use_facet(const locale *loc)
3684 static codecvt_wchar *obj = NULL;
3686 _Lockit lock;
3687 const locale_facet *fac;
3689 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3690 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_wchar_id));
3691 if(fac) {
3692 _Lockit_dtor(&lock);
3693 return (codecvt_wchar*)fac;
3696 if(obj) {
3697 _Lockit_dtor(&lock);
3698 return obj;
3701 codecvt_wchar__Getcat(&fac, loc);
3702 obj = (codecvt_wchar*)fac;
3703 call_locale_facet__Incref(&obj->base.facet);
3704 locale_facet_register(&obj->base.facet);
3705 _Lockit_dtor(&lock);
3707 return obj;
3710 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3711 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3712 MSVCP_size_t __cdecl codecvt_short__Getcat(const locale_facet **facet, const locale *loc)
3714 TRACE("(%p %p)\n", facet, loc);
3716 if(facet && !*facet) {
3717 _Locinfo locinfo;
3719 *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
3720 if(!*facet) {
3721 ERR("Out of memory\n");
3722 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3723 return 0;
3726 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3727 codecvt_short_ctor((codecvt_wchar*)*facet);
3728 _Locinfo_dtor(&locinfo);
3731 return LC_CTYPE;
3734 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@@Z */
3735 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3736 MSVCP_size_t __cdecl codecvt_short__Getcat_old(const locale_facet **facet)
3738 return codecvt_short__Getcat(facet, locale_classic());
3741 codecvt_wchar* codecvt_short_use_facet(const locale *loc)
3743 static codecvt_wchar *obj = NULL;
3745 _Lockit lock;
3746 const locale_facet *fac;
3748 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3749 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_short_id));
3750 if(fac) {
3751 _Lockit_dtor(&lock);
3752 return (codecvt_wchar*)fac;
3755 if(obj) {
3756 _Lockit_dtor(&lock);
3757 return obj;
3760 codecvt_short__Getcat(&fac, loc);
3761 obj = (codecvt_wchar*)fac;
3762 call_locale_facet__Incref(&obj->base.facet);
3763 locale_facet_register(&obj->base.facet);
3764 _Lockit_dtor(&lock);
3766 return obj;
3769 /* ?_Id_func@?$codecvt@_WDH@std@@SAAAVid@locale@2@XZ */
3770 /* ?_Id_func@?$codecvt@_WDH@std@@SAAEAVid@locale@2@XZ */
3771 locale_id* __cdecl codecvt_wchar__Id_func(void)
3773 TRACE("()\n");
3774 return &codecvt_wchar_id;
3777 /* ?_Id_func@?$codecvt@GDH@std@@SAAAVid@locale@2@XZ */
3778 /* ?_Id_func@?$codecvt@GDH@std@@SAAEAVid@locale@2@XZ */
3779 locale_id* __cdecl codecvt_short__Id_func(void)
3781 TRACE("()\n");
3782 return &codecvt_short_id;
3785 /* ?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ */
3786 /* ?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ */
3787 /* ?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ */
3788 /* ?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ */
3789 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_always_noconv, 4)
3790 MSVCP_bool __thiscall codecvt_wchar_do_always_noconv(const codecvt_wchar *this)
3792 TRACE("(%p)\n", this);
3793 return FALSE;
3796 /* ?do_max_length@?$codecvt@GDH@std@@MBEHXZ */
3797 /* ?do_max_length@?$codecvt@GDH@std@@MEBAHXZ */
3798 /* ?do_max_length@?$codecvt@_WDH@std@@MBEHXZ */
3799 /* ?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ */
3800 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_max_length, 4)
3801 int __thiscall codecvt_wchar_do_max_length(const codecvt_wchar *this)
3803 TRACE("(%p)\n", this);
3804 return MB_LEN_MAX;
3807 /* ?do_encoding@?$codecvt@GDH@std@@MBEHXZ */
3808 /* ?do_encoding@?$codecvt@GDH@std@@MEBAHXZ */
3809 /* ?do_encoding@?$codecvt@_WDH@std@@MBEHXZ */
3810 /* ?do_encoding@?$codecvt@_WDH@std@@MEBAHXZ */
3811 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_encoding, 4)
3812 int __thiscall codecvt_wchar_do_encoding(const codecvt_wchar *this)
3814 TRACE("(%p)\n", this);
3815 return 0;
3818 /* ?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3819 /* ?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3820 /* ?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3821 /* ?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3822 #if _MSVCP_VER <= 100
3823 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3824 CALL_VTBL_FUNC(this, 16, int, \
3825 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3826 (this, state, from, from_end, from_next, to, to_end, to_next))
3827 #else
3828 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3829 CALL_VTBL_FUNC(this, 24, int, \
3830 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3831 (this, state, from, from_end, from_next, to, to_end, to_next))
3832 #endif
3833 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_in, 32)
3834 int __thiscall codecvt_wchar_do_in(const codecvt_wchar *this, _Mbstatet *state,
3835 const char *from, const char *from_end, const char **from_next,
3836 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3838 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3839 from_end, from_next, to, to_end, to_next);
3841 *from_next = from;
3842 *to_next = to;
3844 while(*from_next!=from_end && *to_next!=to_end) {
3845 switch(_Mbrtowc(*to_next, *from_next, from_end-*from_next, state, &this->cvt)) {
3846 case -2:
3847 *from_next = from_end;
3848 return CODECVT_partial;
3849 case -1:
3850 return CODECVT_error;
3851 case 2:
3852 (*from_next)++;
3853 /* fall through */
3854 case 0:
3855 case 1:
3856 (*from_next)++;
3857 (*to_next)++;
3861 return CODECVT_ok;
3864 /* ?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3865 /* ?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3866 /* ?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3867 /* ?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3868 DEFINE_THISCALL_WRAPPER(codecvt_wchar_in, 32)
3869 int __thiscall codecvt_wchar_in(const codecvt_wchar *this, _Mbstatet *state,
3870 const char *from, const char *from_end, const char **from_next,
3871 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3873 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3874 from_end, from_next, to, to_end, to_next);
3875 return call_codecvt_wchar_do_in(this, state, from,
3876 from_end, from_next, to, to_end, to_next);
3879 /* ?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3880 /* ?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3881 /* ?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3882 /* ?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3883 #if _MSVCP_VER <= 100
3884 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3885 CALL_VTBL_FUNC(this, 20, int, \
3886 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3887 (this, state, from, from_end, from_next, to, to_end, to_next))
3888 #else
3889 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3890 CALL_VTBL_FUNC(this, 28, int, \
3891 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3892 (this, state, from, from_end, from_next, to, to_end, to_next))
3893 #endif
3894 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_out, 32)
3895 int __thiscall codecvt_wchar_do_out(const codecvt_wchar *this, _Mbstatet *state,
3896 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3897 char *to, char *to_end, char **to_next)
3899 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3900 from_end, from_next, to, to_end, to_next);
3902 *from_next = from;
3903 *to_next = to;
3905 while(*from_next!=from_end && *to_next!=to_end) {
3906 _Mbstatet old_state = *state;
3907 int size;
3908 char buf[MB_LEN_MAX];
3910 switch((size = _Wcrtomb(buf, **from_next, state, &this->cvt))) {
3911 case -1:
3912 return CODECVT_error;
3913 default:
3914 if(size > from_end-*from_next) {
3915 *state = old_state;
3916 return CODECVT_partial;
3919 (*from_next)++;
3920 memcpy_s(*to_next, to_end-*to_next, buf, size);
3921 (*to_next) += size;
3925 return CODECVT_ok;
3928 /* ?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3929 /* ?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3930 /* ?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3931 /* ?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3932 DEFINE_THISCALL_WRAPPER(codecvt_wchar_out, 32)
3933 int __thiscall codecvt_wchar_out(const codecvt_wchar *this, _Mbstatet *state,
3934 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3935 char *to, char *to_end, char **to_next)
3937 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3938 from_end, from_next, to, to_end, to_next);
3939 return call_codecvt_wchar_do_out(this, state, from,
3940 from_end, from_next, to, to_end, to_next);
3943 /* ?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z */
3944 /* ?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3945 /* ?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z */
3946 /* ?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3947 #if _MSVCP_VER <= 100
3948 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3949 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3950 #else
3951 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3952 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3953 #endif
3954 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_unshift, 20)
3955 int __thiscall codecvt_wchar_do_unshift(const codecvt_wchar *this,
3956 _Mbstatet *state, char *to, char *to_end, char **to_next)
3958 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3959 if(MBSTATET_TO_INT(state))
3960 WARN("unexpected state: %x\n", MBSTATET_TO_INT(state));
3962 *to_next = to;
3963 return CODECVT_ok;
3966 /* ?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z */
3967 /* ?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3968 /* ?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z */
3969 /* ?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3970 DEFINE_THISCALL_WRAPPER(codecvt_wchar_unshift, 20)
3971 int __thiscall codecvt_wchar_unshift(const codecvt_wchar *this,
3972 _Mbstatet *state, char *to, char *to_end, char **to_next)
3974 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3975 return call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next);
3978 /* ?do_length@?$codecvt@GDH@std@@MBEHABHPBD1I@Z */
3979 /* ?do_length@?$codecvt@GDH@std@@MEBAHAEBHPEBD1_K@Z */
3980 /* ?do_length@?$codecvt@_WDH@std@@MBEHABHPBD1I@Z */
3981 /* ?do_length@?$codecvt@_WDH@std@@MEBAHAEBHPEBD1_K@Z */
3982 #if _MSVCP_VER <= 100
3983 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3984 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, MSVCP_size_t), \
3985 (this, state, from, from_end, max))
3986 #else
3987 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
3988 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, MSVCP_size_t), \
3989 (this, state, from, from_end, max))
3990 #endif
3991 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_length, 20)
3992 int __thiscall codecvt_wchar_do_length(const codecvt_wchar *this, const _Mbstatet *state,
3993 const char *from, const char *from_end, MSVCP_size_t max)
3995 _Mbstatet tmp_state = *state;
3996 int ret=0;
3998 TRACE("(%p %p %p %p %ld)\n", this, state, from, from_end, max);
4000 while(ret<max && from!=from_end) {
4001 switch(_Mbrtowc(NULL, from, from_end-from, &tmp_state, &this->cvt)) {
4002 case -2:
4003 case -1:
4004 return ret;
4005 case 2:
4006 from++;
4007 /* fall through */
4008 case 0:
4009 case 1:
4010 from++;
4011 ret++;
4015 return ret;
4018 /* ?length@?$codecvt@GDH@std@@QBEHABHPBD1I@Z */
4019 /* ?length@?$codecvt@GDH@std@@QEBAHAEBHPEBD1_K@Z */
4020 /* ?length@?$codecvt@_WDH@std@@QBEHABHPBD1I@Z */
4021 /* ?length@?$codecvt@_WDH@std@@QEBAHAEBHPEBD1_K@Z */
4022 DEFINE_THISCALL_WRAPPER(codecvt_wchar_length, 20)
4023 int __thiscall codecvt_wchar_length(const codecvt_wchar *this, const _Mbstatet *state,
4024 const char *from, const char *from_end, MSVCP_size_t max)
4026 TRACE("(%p %p %p %p %ld)\n", this, state, from, from_end, max);
4027 return call_codecvt_wchar_do_length(this, state, from, from_end, max);
4030 /* ?id@?$numpunct@D@std@@2V0locale@2@A */
4031 locale_id numpunct_char_id = {0};
4033 /* ??_7?$numpunct@D@std@@6B@ */
4034 extern const vtable_ptr MSVCP_numpunct_char_vtable;
4036 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
4037 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4038 DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
4039 void __thiscall numpunct_char__Init(numpunct_char *this, const _Locinfo *locinfo, MSVCP_bool isdef)
4041 int len;
4043 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4045 len = strlen(_Locinfo__Getfalse(locinfo))+1;
4046 this->false_name = MSVCRT_operator_new(len);
4047 if(this->false_name)
4048 memcpy((char*)this->false_name, _Locinfo__Getfalse(locinfo), len);
4050 len = strlen(_Locinfo__Gettrue(locinfo))+1;
4051 this->true_name = MSVCRT_operator_new(len);
4052 if(this->true_name)
4053 memcpy((char*)this->true_name, _Locinfo__Gettrue(locinfo), len);
4055 if(isdef) {
4056 this->grouping = MSVCRT_operator_new(1);
4057 if(this->grouping)
4058 *(char*)this->grouping = 0;
4060 this->dp = '.';
4061 this->sep = ',';
4062 } else {
4063 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4065 len = strlen(lc->grouping)+1;
4066 this->grouping = MSVCRT_operator_new(len);
4067 if(this->grouping)
4068 memcpy((char*)this->grouping, lc->grouping, len);
4070 this->dp = lc->decimal_point[0];
4071 this->sep = lc->thousands_sep[0];
4074 if(!this->false_name || !this->true_name || !this->grouping) {
4075 MSVCRT_operator_delete((char*)this->grouping);
4076 MSVCRT_operator_delete((char*)this->false_name);
4077 MSVCRT_operator_delete((char*)this->true_name);
4079 ERR("Out of memory\n");
4080 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4084 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
4085 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
4086 DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
4087 void __thiscall numpunct_char__Tidy(numpunct_char *this)
4089 TRACE("(%p)\n", this);
4091 MSVCRT_operator_delete((char*)this->grouping);
4092 MSVCRT_operator_delete((char*)this->false_name);
4093 MSVCRT_operator_delete((char*)this->true_name);
4096 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
4097 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4098 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
4099 numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
4100 const _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
4102 TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
4103 locale_facet_ctor_refs(&this->facet, refs);
4104 this->facet.vtable = &MSVCP_numpunct_char_vtable;
4105 numpunct_char__Init(this, locinfo, usedef);
4106 return this;
4109 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
4110 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
4111 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
4112 numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
4113 const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
4115 _Locinfo locinfo;
4117 TRACE("(%p %s %lu %d)\n", this, debugstr_a(name), refs, usedef);
4118 locale_facet_ctor_refs(&this->facet, refs);
4119 this->facet.vtable = &MSVCP_numpunct_char_vtable;
4121 _Locinfo_ctor_cstr(&locinfo, name);
4122 numpunct_char__Init(this, &locinfo, usedef);
4123 _Locinfo_dtor(&locinfo);
4124 return this;
4127 /* ??0?$numpunct@D@std@@QAE@I@Z */
4128 /* ??0?$numpunct@D@std@@QEAA@_K@Z */
4129 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
4130 numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, MSVCP_size_t refs)
4132 TRACE("(%p %lu)\n", this, refs);
4133 return numpunct_char_ctor_name(this, "C", refs, FALSE);
4136 /* ??_F?$numpunct@D@std@@QAEXXZ */
4137 /* ??_F?$numpunct@D@std@@QEAAXXZ */
4138 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
4139 numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
4141 return numpunct_char_ctor_refs(this, 0);
4144 /* ??1?$numpunct@D@std@@UAE@XZ */
4145 /* ??1?$numpunct@D@std@@UEAA@XZ */
4146 /* ??1?$numpunct@D@std@@MAE@XZ */
4147 /* ??1?$numpunct@D@std@@MEAA@XZ */
4148 DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
4149 void __thiscall numpunct_char_dtor(numpunct_char *this)
4151 TRACE("(%p)\n", this);
4152 numpunct_char__Tidy(this);
4155 DEFINE_THISCALL_WRAPPER(numpunct_char_vector_dtor, 8)
4156 numpunct_char* __thiscall numpunct_char_vector_dtor(numpunct_char *this, unsigned int flags)
4158 TRACE("(%p %x)\n", this, flags);
4159 if(flags & 2) {
4160 /* we have an array, with the number of elements stored before the first object */
4161 INT_PTR i, *ptr = (INT_PTR *)this-1;
4163 for(i=*ptr-1; i>=0; i--)
4164 numpunct_char_dtor(this+i);
4165 MSVCRT_operator_delete(ptr);
4166 } else {
4167 numpunct_char_dtor(this);
4168 if(flags & 1)
4169 MSVCRT_operator_delete(this);
4172 return this;
4175 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4176 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4177 MSVCP_size_t __cdecl numpunct_char__Getcat(const locale_facet **facet, const locale *loc)
4179 TRACE("(%p %p)\n", facet, loc);
4181 if(facet && !*facet) {
4182 *facet = MSVCRT_operator_new(sizeof(numpunct_char));
4183 if(!*facet) {
4184 ERR("Out of memory\n");
4185 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4186 return 0;
4188 numpunct_char_ctor_name((numpunct_char*)*facet,
4189 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4192 return LC_NUMERIC;
4195 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@@Z */
4196 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4197 MSVCP_size_t __cdecl numpunct_char__Getcat_old(const locale_facet **facet)
4199 return numpunct_char__Getcat(facet, locale_classic());
4202 static numpunct_char* numpunct_char_use_facet(const locale *loc)
4204 static numpunct_char *obj = NULL;
4206 _Lockit lock;
4207 const locale_facet *fac;
4209 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4210 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_char_id));
4211 if(fac) {
4212 _Lockit_dtor(&lock);
4213 return (numpunct_char*)fac;
4216 if(obj) {
4217 _Lockit_dtor(&lock);
4218 return obj;
4221 numpunct_char__Getcat(&fac, loc);
4222 obj = (numpunct_char*)fac;
4223 call_locale_facet__Incref(&obj->facet);
4224 locale_facet_register(&obj->facet);
4225 _Lockit_dtor(&lock);
4227 return obj;
4230 /* ?do_decimal_point@?$numpunct@D@std@@MBEDXZ */
4231 /* ?do_decimal_point@?$numpunct@D@std@@MEBADXZ */
4232 DEFINE_THISCALL_WRAPPER(numpunct_char_do_decimal_point, 4)
4233 #if _MSVCP_VER <= 100
4234 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4235 char, (const numpunct_char *this), (this))
4236 #else
4237 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4238 char, (const numpunct_char *this), (this))
4239 #endif
4240 char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
4242 TRACE("(%p)\n", this);
4243 return this->dp;
4246 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
4247 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
4248 DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
4249 char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
4251 TRACE("(%p)\n", this);
4252 return call_numpunct_char_do_decimal_point(this);
4255 /* ?do_thousands_sep@?$numpunct@D@std@@MBEDXZ */
4256 /* ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ */
4257 DEFINE_THISCALL_WRAPPER(numpunct_char_do_thousands_sep, 4)
4258 #if _MSVCP_VER <= 100
4259 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4260 char, (const numpunct_char*), (this))
4261 #else
4262 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4263 char, (const numpunct_char*), (this))
4264 #endif
4265 char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
4267 TRACE("(%p)\n", this);
4268 return this->sep;
4271 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
4272 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
4273 DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
4274 char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
4276 TRACE("(%p)\n", this);
4277 return call_numpunct_char_do_thousands_sep(this);
4280 /* ?do_grouping@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4281 /* ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4282 DEFINE_THISCALL_WRAPPER(numpunct_char_do_grouping, 8)
4283 #if _MSVCP_VER <= 100
4284 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4285 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4286 #else
4287 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4288 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4289 #endif
4290 basic_string_char* __thiscall numpunct_char_do_grouping(
4291 const numpunct_char *this, basic_string_char *ret)
4293 TRACE("(%p)\n", this);
4294 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4297 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4298 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4299 DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
4300 basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
4302 TRACE("(%p)\n", this);
4303 return call_numpunct_char_do_grouping(this, ret);
4306 /* ?do_falsename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4307 /* ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4308 DEFINE_THISCALL_WRAPPER(numpunct_char_do_falsename, 8)
4309 #if _MSVCP_VER <= 100
4310 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4311 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4312 #else
4313 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4314 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4315 #endif
4316 basic_string_char* __thiscall numpunct_char_do_falsename(
4317 const numpunct_char *this, basic_string_char *ret)
4319 TRACE("(%p)\n", this);
4320 return MSVCP_basic_string_char_ctor_cstr(ret, this->false_name);
4323 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4324 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4325 DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
4326 basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
4328 TRACE("(%p)\n", this);
4329 return call_numpunct_char_do_falsename(this, ret);
4332 /* ?do_truename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4333 /* ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4334 DEFINE_THISCALL_WRAPPER(numpunct_char_do_truename, 8)
4335 #if _MSVCP_VER <= 100
4336 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4337 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4338 #else
4339 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4340 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4341 #endif
4342 basic_string_char* __thiscall numpunct_char_do_truename(
4343 const numpunct_char *this, basic_string_char *ret)
4345 TRACE("(%p)\n", this);
4346 return MSVCP_basic_string_char_ctor_cstr(ret, this->true_name);
4349 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4350 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4351 DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
4352 basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
4354 TRACE("(%p)\n", this);
4355 return call_numpunct_char_do_truename(this, ret);
4358 /* ?id@?$numpunct@_W@std@@2V0locale@2@A */
4359 locale_id numpunct_wchar_id = {0};
4360 /* ?id@?$numpunct@G@std@@2V0locale@2@A */
4361 locale_id numpunct_short_id = {0};
4363 /* ??_7?$numpunct@_W@std@@6B@ */
4364 extern const vtable_ptr MSVCP_numpunct_wchar_vtable;
4365 /* ??_7?$numpunct@G@std@@6B@ */
4366 extern const vtable_ptr MSVCP_numpunct_short_vtable;
4368 /* ?_Init@?$numpunct@_W@std@@IAEXABV_Locinfo@2@_N@Z */
4369 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4370 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
4371 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4372 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
4373 void __thiscall numpunct_wchar__Init(numpunct_wchar *this,
4374 const _Locinfo *locinfo, MSVCP_bool isdef)
4376 const char *to_convert;
4377 _Cvtvec cvt;
4378 int len;
4380 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4382 _Locinfo__Getcvt(locinfo, &cvt);
4384 to_convert = _Locinfo__Getfalse(locinfo);
4385 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4386 this->false_name = MSVCRT_operator_new(len*sizeof(WCHAR));
4387 if(this->false_name)
4388 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4389 (wchar_t*)this->false_name, len);
4391 to_convert = _Locinfo__Gettrue(locinfo);
4392 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4393 this->true_name = MSVCRT_operator_new(len*sizeof(WCHAR));
4394 if(this->true_name)
4395 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4396 (wchar_t*)this->true_name, len);
4398 if(isdef) {
4399 this->grouping = MSVCRT_operator_new(1);
4400 if(this->grouping)
4401 *(char*)this->grouping = 0;
4403 this->dp = '.';
4404 this->sep = ',';
4405 } else {
4406 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4408 len = strlen(lc->grouping)+1;
4409 this->grouping = MSVCRT_operator_new(len);
4410 if(this->grouping)
4411 memcpy((char*)this->grouping, lc->grouping, len);
4413 this->dp = mb_to_wc(lc->decimal_point[0], &cvt);
4414 this->sep = mb_to_wc(lc->thousands_sep[0], &cvt);
4417 if(!this->false_name || !this->true_name || !this->grouping) {
4418 MSVCRT_operator_delete((char*)this->grouping);
4419 MSVCRT_operator_delete((wchar_t*)this->false_name);
4420 MSVCRT_operator_delete((wchar_t*)this->true_name);
4422 ERR("Out of memory\n");
4423 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4427 /* ?_Tidy@?$numpunct@_W@std@@AAEXXZ */
4428 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
4429 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
4430 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
4431 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
4432 void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
4434 TRACE("(%p)\n", this);
4436 MSVCRT_operator_delete((char*)this->grouping);
4437 MSVCRT_operator_delete((wchar_t*)this->false_name);
4438 MSVCRT_operator_delete((wchar_t*)this->true_name);
4441 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
4442 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4443 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
4444 numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
4445 const _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
4447 TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
4448 locale_facet_ctor_refs(&this->facet, refs);
4449 this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
4450 numpunct_wchar__Init(this, locinfo, usedef);
4451 return this;
4454 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
4455 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4456 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
4457 numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
4458 const _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
4460 numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
4461 this->facet.vtable = &MSVCP_numpunct_short_vtable;
4462 return this;
4465 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
4466 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
4467 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
4468 numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
4469 const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
4471 _Locinfo locinfo;
4473 TRACE("(%p %s %lu %d)\n", this, debugstr_a(name), refs, usedef);
4474 locale_facet_ctor_refs(&this->facet, refs);
4475 this->facet.vtable = &MSVCP_numpunct_wchar_vtable;
4477 _Locinfo_ctor_cstr(&locinfo, name);
4478 numpunct_wchar__Init(this, &locinfo, usedef);
4479 _Locinfo_dtor(&locinfo);
4480 return this;
4483 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
4484 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
4485 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
4486 numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
4487 const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
4489 numpunct_wchar_ctor_name(this, name, refs, usedef);
4490 this->facet.vtable = &MSVCP_numpunct_short_vtable;
4491 return this;
4494 /* ??0?$numpunct@_W@std@@QAE@I@Z */
4495 /* ??0?$numpunct@_W@std@@QEAA@_K@Z */
4496 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
4497 numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
4499 TRACE("(%p %lu)\n", this, refs);
4500 return numpunct_wchar_ctor_name(this, "C", refs, FALSE);
4503 /* ??0?$numpunct@G@std@@QAE@I@Z */
4504 /* ??0?$numpunct@G@std@@QEAA@_K@Z */
4505 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
4506 numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
4508 numpunct_wchar_ctor_refs(this, refs);
4509 this->facet.vtable = &MSVCP_numpunct_short_vtable;
4510 return this;
4513 /* ??_F?$numpunct@_W@std@@QAEXXZ */
4514 /* ??_F?$numpunct@_W@std@@QEAAXXZ */
4515 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
4516 numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
4518 return numpunct_wchar_ctor_refs(this, 0);
4521 /* ??_F?$numpunct@G@std@@QAEXXZ */
4522 /* ??_F?$numpunct@G@std@@QEAAXXZ */
4523 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
4524 numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
4526 return numpunct_short_ctor_refs(this, 0);
4529 /* ??1?$numpunct@G@std@@UAE@XZ */
4530 /* ??1?$numpunct@G@std@@UEAA@XZ */
4531 /* ??1?$numpunct@_W@std@@MAE@XZ */
4532 /* ??1?$numpunct@_W@std@@MEAA@XZ */
4533 /* ??1?$numpunct@G@std@@MAE@XZ */
4534 /* ??1?$numpunct@G@std@@MEAA@XZ */
4535 DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
4536 void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
4538 TRACE("(%p)\n", this);
4539 numpunct_wchar__Tidy(this);
4542 DEFINE_THISCALL_WRAPPER(numpunct_wchar_vector_dtor, 8)
4543 numpunct_wchar* __thiscall numpunct_wchar_vector_dtor(numpunct_wchar *this, unsigned int flags)
4545 TRACE("(%p %x)\n", this, flags);
4546 if(flags & 2) {
4547 /* we have an array, with the number of elements stored before the first object */
4548 INT_PTR i, *ptr = (INT_PTR *)this-1;
4550 for(i=*ptr-1; i>=0; i--)
4551 numpunct_wchar_dtor(this+i);
4552 MSVCRT_operator_delete(ptr);
4553 } else {
4554 numpunct_wchar_dtor(this);
4555 if(flags & 1)
4556 MSVCRT_operator_delete(this);
4559 return this;
4562 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4563 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4564 MSVCP_size_t __cdecl numpunct_wchar__Getcat(const locale_facet **facet, const locale *loc)
4566 TRACE("(%p %p)\n", facet, loc);
4568 if(facet && !*facet) {
4569 *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
4570 if(!*facet) {
4571 ERR("Out of memory\n");
4572 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4573 return 0;
4575 numpunct_wchar_ctor_name((numpunct_wchar*)*facet,
4576 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4579 return LC_NUMERIC;
4582 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@@Z */
4583 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4584 MSVCP_size_t __cdecl numpunct_wchar__Getcat_old(const locale_facet **facet)
4586 return numpunct_wchar__Getcat(facet, locale_classic());
4589 static numpunct_wchar* numpunct_wchar_use_facet(const locale *loc)
4591 static numpunct_wchar *obj = NULL;
4593 _Lockit lock;
4594 const locale_facet *fac;
4596 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4597 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_wchar_id));
4598 if(fac) {
4599 _Lockit_dtor(&lock);
4600 return (numpunct_wchar*)fac;
4603 if(obj) {
4604 _Lockit_dtor(&lock);
4605 return obj;
4608 numpunct_wchar__Getcat(&fac, loc);
4609 obj = (numpunct_wchar*)fac;
4610 call_locale_facet__Incref(&obj->facet);
4611 locale_facet_register(&obj->facet);
4612 _Lockit_dtor(&lock);
4614 return obj;
4617 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4618 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4619 MSVCP_size_t __cdecl numpunct_short__Getcat(const locale_facet **facet, const locale *loc)
4621 TRACE("(%p %p)\n", facet, loc);
4623 if(facet && !*facet) {
4624 *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
4625 if(!*facet) {
4626 ERR("Out of memory\n");
4627 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4628 return 0;
4630 numpunct_short_ctor_name((numpunct_wchar*)*facet,
4631 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4634 return LC_NUMERIC;
4637 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@@Z */
4638 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4639 MSVCP_size_t __cdecl numpunct_short__Getcat_old(const locale_facet **facet)
4641 return numpunct_short__Getcat(facet, locale_classic());
4644 static numpunct_wchar* numpunct_short_use_facet(const locale *loc)
4646 static numpunct_wchar *obj = NULL;
4648 _Lockit lock;
4649 const locale_facet *fac;
4651 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4652 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_short_id));
4653 if(fac) {
4654 _Lockit_dtor(&lock);
4655 return (numpunct_wchar*)fac;
4658 if(obj) {
4659 _Lockit_dtor(&lock);
4660 return obj;
4663 numpunct_short__Getcat(&fac, loc);
4664 obj = (numpunct_wchar*)fac;
4665 call_locale_facet__Incref(&obj->facet);
4666 locale_facet_register(&obj->facet);
4667 _Lockit_dtor(&lock);
4669 return obj;
4672 /* ?do_decimal_point@?$numpunct@_W@std@@MBE_WXZ */
4673 /* ?do_decimal_point@?$numpunct@_W@std@@MEBA_WXZ */
4674 /* ?do_decimal_point@?$numpunct@G@std@@MBEGXZ */
4675 /* ?do_decimal_point@?$numpunct@G@std@@MEBAGXZ */
4676 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_decimal_point, 4)
4677 #if _MSVCP_VER <= 100
4678 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4679 wchar_t, (const numpunct_wchar *this), (this))
4680 #else
4681 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4682 wchar_t, (const numpunct_wchar *this), (this))
4683 #endif
4684 wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
4686 TRACE("(%p)\n", this);
4687 return this->dp;
4690 /* ?decimal_point@?$numpunct@_W@std@@QBE_WXZ */
4691 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
4692 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
4693 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
4694 DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
4695 wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
4697 TRACE("(%p)\n", this);
4698 return call_numpunct_wchar_do_decimal_point(this);
4701 /* ?do_thousands_sep@?$numpunct@_W@std@@MBE_WXZ */
4702 /* ?do_thousands_sep@?$numpunct@_W@std@@MEBA_WXZ */
4703 /* ?do_thousands_sep@?$numpunct@G@std@@MBEGXZ */
4704 /* ?do_thousands_sep@?$numpunct@G@std@@MEBAGXZ */
4705 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_thousands_sep, 4)
4706 #if _MSVCP_VER <= 100
4707 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4708 wchar_t, (const numpunct_wchar *this), (this))
4709 #else
4710 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4711 wchar_t, (const numpunct_wchar *this), (this))
4712 #endif
4713 wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
4715 TRACE("(%p)\n", this);
4716 return this->sep;
4719 /* ?thousands_sep@?$numpunct@_W@std@@QBE_WXZ */
4720 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
4721 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
4722 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
4723 DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
4724 wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
4726 TRACE("(%p)\n", this);
4727 return call_numpunct_wchar_do_thousands_sep(this);
4730 /* ?do_grouping@?$numpunct@_W@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4731 /* ?do_grouping@?$numpunct@_W@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4732 /* ?do_grouping@?$numpunct@G@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4733 /* ?do_grouping@?$numpunct@G@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4734 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_grouping, 8)
4735 #if _MSVCP_VER <= 100
4736 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4737 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4738 #else
4739 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4740 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4741 #endif
4742 basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *this, basic_string_char *ret)
4744 TRACE("(%p)\n", this);
4745 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4748 /* ?grouping@?$numpunct@_W@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4749 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4750 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4751 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4752 DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
4753 basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
4755 TRACE("(%p)\n", this);
4756 return call_numpunct_wchar_do_grouping(this, ret);
4759 /* ?do_falsename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4760 /* ?do_falsename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4761 /* ?do_falsename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4762 /* ?do_falsename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4763 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_falsename, 8)
4764 #if _MSVCP_VER <= 100
4765 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4766 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4767 #else
4768 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4769 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4770 #endif
4771 basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4773 TRACE("(%p)\n", this);
4774 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->false_name);
4777 /* ?falsename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4778 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4779 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4780 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4781 DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
4782 basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4784 TRACE("(%p)\n", this);
4785 return call_numpunct_wchar_do_falsename(this, ret);
4788 /* ?do_truename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4789 /* ?do_truename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4790 /* ?do_truename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4791 /* ?do_truename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4792 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_truename, 8)
4793 #if _MSVCP_VER <= 100
4794 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4795 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4796 #else
4797 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4798 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4799 #endif
4800 basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4802 TRACE("(%p)\n", this);
4803 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->true_name);
4806 /* ?truename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4807 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4808 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4809 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4810 DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
4811 basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4813 TRACE("(%p)\n", this);
4814 return call_numpunct_wchar_do_truename(this, ret);
4817 double __cdecl _Stod(const char *buf, char **buf_end, LONG exp)
4819 double ret = strtod(buf, buf_end);
4821 if(exp)
4822 ret *= pow(10, exp);
4823 return ret;
4826 double __cdecl _Stodx(const char *buf, char **buf_end, LONG exp, int *err)
4828 double ret;
4830 *err = *_errno();
4831 *_errno() = 0;
4832 ret = _Stod(buf, buf_end, exp);
4833 if(*_errno()) {
4834 *err = *_errno();
4835 }else {
4836 *_errno() = *err;
4837 *err = 0;
4839 return ret;
4842 float __cdecl _Stof(const char *buf, char **buf_end, LONG exp)
4844 return _Stod(buf, buf_end, exp);
4847 float __cdecl _Stofx(const char *buf, char **buf_end, LONG exp, int *err)
4849 return _Stodx(buf, buf_end, exp, err);
4852 __int64 __cdecl _Stoll(const char *buf, char **buf_end, int base)
4854 return _strtoi64(buf, buf_end, base);
4857 __int64 __cdecl _Stollx(const char *buf, char **buf_end, int base, int *err)
4859 __int64 ret;
4861 *err = *_errno();
4862 *_errno() = 0;
4863 ret = _strtoi64(buf, buf_end, base);
4864 if(*_errno()) {
4865 *err = *_errno();
4866 }else {
4867 *_errno() = *err;
4868 *err = 0;
4870 return ret;
4873 LONG __cdecl _Stolx(const char *buf, char **buf_end, int base, int *err)
4875 __int64 i = _Stollx(buf, buf_end, base, err);
4876 if(!*err && i!=(__int64)((LONG)i))
4877 *err = ERANGE;
4878 return i;
4881 unsigned __int64 __cdecl _Stoull(const char *buf, char **buf_end, int base)
4883 return _strtoui64(buf, buf_end, base);
4886 unsigned __int64 __cdecl _Stoullx(const char *buf, char **buf_end, int base, int *err)
4888 unsigned __int64 ret;
4890 *err = *_errno();
4891 *_errno() = 0;
4892 ret = _strtoui64(buf, buf_end, base);
4893 if(*_errno()) {
4894 *err = *_errno();
4895 }else {
4896 *_errno() = *err;
4897 *err = 0;
4899 return ret;
4902 ULONG __cdecl _Stoul(const char *buf, char **buf_end, int base)
4904 int err;
4905 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, &err);
4906 if(!err && i!=(unsigned __int64)((ULONG)i))
4907 *_errno() = ERANGE;
4908 return buf[0]=='-' ? -i : i;
4911 ULONG __cdecl _Stoulx(const char *buf, char **buf_end, int base, int *err)
4913 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, err);
4914 if(!*err && i!=(unsigned __int64)((ULONG)i))
4915 *err = ERANGE;
4916 return buf[0]=='-' ? -i : i;
4919 /* ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
4920 locale_id num_get_wchar_id = {0};
4921 /* ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
4922 locale_id num_get_short_id = {0};
4924 /* ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
4925 extern const vtable_ptr MSVCP_num_get_wchar_vtable;
4926 /* ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
4927 extern const vtable_ptr MSVCP_num_get_short_vtable;
4929 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4930 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4931 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4932 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4933 DEFINE_THISCALL_WRAPPER(num_get_wchar__Init, 8)
4934 void __thiscall num_get_wchar__Init(num_get *this, const _Locinfo *locinfo)
4936 TRACE("(%p %p)\n", this, locinfo);
4937 #if _MSVCP_VER <= 100
4938 _Locinfo__Getcvt(locinfo, &this->cvt);
4939 #endif
4942 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4943 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4944 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_locinfo, 12)
4945 num_get* __thiscall num_get_wchar_ctor_locinfo(num_get *this,
4946 const _Locinfo *locinfo, MSVCP_size_t refs)
4948 TRACE("(%p %p %lu)\n", this, locinfo, refs);
4950 locale_facet_ctor_refs(&this->facet, refs);
4951 this->facet.vtable = &MSVCP_num_get_wchar_vtable;
4953 num_get_wchar__Init(this, locinfo);
4954 return this;
4957 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4958 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4959 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_locinfo, 12)
4960 num_get* __thiscall num_get_short_ctor_locinfo(num_get *this,
4961 const _Locinfo *locinfo, MSVCP_size_t refs)
4963 num_get_wchar_ctor_locinfo(this, locinfo, refs);
4964 this->facet.vtable = &MSVCP_num_get_short_vtable;
4965 return this;
4968 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
4969 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
4970 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_refs, 8)
4971 num_get* __thiscall num_get_wchar_ctor_refs(num_get *this, MSVCP_size_t refs)
4973 _Locinfo locinfo;
4975 TRACE("(%p %lu)\n", this, refs);
4977 _Locinfo_ctor(&locinfo);
4978 num_get_wchar_ctor_locinfo(this, &locinfo, refs);
4979 _Locinfo_dtor(&locinfo);
4980 return this;
4983 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
4984 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
4985 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_refs, 8)
4986 num_get* __thiscall num_get_short_ctor_refs(num_get *this, MSVCP_size_t refs)
4988 num_get_wchar_ctor_refs(this, refs);
4989 this->facet.vtable = &MSVCP_num_get_short_vtable;
4990 return this;
4993 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
4994 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
4995 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor, 4)
4996 num_get* __thiscall num_get_wchar_ctor(num_get *this)
4998 return num_get_wchar_ctor_refs(this, 0);
5001 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
5002 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
5003 DEFINE_THISCALL_WRAPPER(num_get_short_ctor, 4)
5004 num_get* __thiscall num_get_short_ctor(num_get *this)
5006 return num_get_short_ctor_refs(this, 0);
5009 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
5010 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
5011 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
5012 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
5013 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
5014 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
5015 DEFINE_THISCALL_WRAPPER(num_get_wchar_dtor, 4)
5016 void __thiscall num_get_wchar_dtor(num_get *this)
5018 TRACE("(%p)\n", this);
5019 locale_facet_dtor(&this->facet);
5022 DEFINE_THISCALL_WRAPPER(num_get_wchar_vector_dtor, 8)
5023 num_get* __thiscall num_get_wchar_vector_dtor(num_get *this, unsigned int flags)
5025 TRACE("(%p %x)\n", this, flags);
5026 if(flags & 2) {
5027 /* we have an array, with the number of elements stored before the first object */
5028 INT_PTR i, *ptr = (INT_PTR *)this-1;
5030 for(i=*ptr-1; i>=0; i--)
5031 num_get_wchar_dtor(this+i);
5032 MSVCRT_operator_delete(ptr);
5033 } else {
5034 num_get_wchar_dtor(this);
5035 if(flags & 1)
5036 MSVCRT_operator_delete(this);
5039 return this;
5042 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
5043 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
5044 MSVCP_size_t __cdecl num_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
5046 TRACE("(%p %p)\n", facet, loc);
5048 if(facet && !*facet) {
5049 _Locinfo locinfo;
5051 *facet = MSVCRT_operator_new(sizeof(num_get));
5052 if(!*facet) {
5053 ERR("Out of memory\n");
5054 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
5055 return 0;
5058 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
5059 num_get_wchar_ctor_locinfo((num_get*)*facet, &locinfo, 0);
5060 _Locinfo_dtor(&locinfo);
5063 return LC_NUMERIC;
5066 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
5067 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
5068 MSVCP_size_t __cdecl num_get_wchar__Getcat_old(const locale_facet **facet)
5070 return num_get_wchar__Getcat(facet, locale_classic());
5073 num_get* num_get_wchar_use_facet(const locale *loc)
5075 static num_get *obj = NULL;
5077 _Lockit lock;
5078 const locale_facet *fac;
5080 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5081 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_wchar_id));
5082 if(fac) {
5083 _Lockit_dtor(&lock);
5084 return (num_get*)fac;
5087 if(obj) {
5088 _Lockit_dtor(&lock);
5089 return obj;
5092 num_get_wchar__Getcat(&fac, loc);
5093 obj = (num_get*)fac;
5094 call_locale_facet__Incref(&obj->facet);
5095 locale_facet_register(&obj->facet);
5096 _Lockit_dtor(&lock);
5098 return obj;
5101 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
5102 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
5103 MSVCP_size_t __cdecl num_get_short__Getcat(const locale_facet **facet, const locale *loc)
5105 if(facet && !*facet) {
5106 num_get_wchar__Getcat(facet, loc);
5107 (*(locale_facet**)facet)->vtable = &MSVCP_num_get_short_vtable;
5110 return LC_NUMERIC;
5113 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
5114 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
5115 MSVCP_size_t __cdecl num_get_short__Getcat_old(const locale_facet **facet)
5117 return num_get_short__Getcat(facet, locale_classic());
5120 num_get* num_get_short_use_facet(const locale *loc)
5122 static num_get *obj = NULL;
5124 _Lockit lock;
5125 const locale_facet *fac;
5127 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5128 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_short_id));
5129 if(fac) {
5130 _Lockit_dtor(&lock);
5131 return (num_get*)fac;
5134 if(obj) {
5135 _Lockit_dtor(&lock);
5136 return obj;
5139 num_get_short__Getcat(&fac, loc);
5140 obj = (num_get*)fac;
5141 call_locale_facet__Incref(&obj->facet);
5142 locale_facet_register(&obj->facet);
5143 _Lockit_dtor(&lock);
5145 return obj;
5148 static int num_get__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5149 istreambuf_iterator_wchar *last, const locale *loc, numpunct_wchar *numpunct)
5151 basic_string_char grouping_bstr;
5152 basic_string_char groups_found;
5153 int i, groups_no = 0, cur_group = 0, exp = 0;
5154 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31;
5155 wchar_t sep = 0, digits[11], *digits_pos;
5156 const char *grouping, *groups;
5157 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
5158 const _Cvtvec *cvt;
5160 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
5162 #if _MSVCP_VER <= 100
5163 cvt = &this->cvt;
5164 #else
5165 cvt = &ctype_wchar_use_facet(loc)->cvt;
5166 #endif
5168 for(i=0; i<10; i++)
5169 digits[i] = mb_to_wc('0'+i, cvt);
5170 digits[10] = 0;
5172 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5173 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5174 #if _MSVCP_VER >= 70
5175 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5176 #endif
5178 if(sep)
5179 MSVCP_basic_string_char_ctor(&groups_found);
5181 istreambuf_iterator_wchar_val(first);
5182 /* get sign */
5183 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5184 *dest++ = '-';
5185 istreambuf_iterator_wchar_inc(first);
5186 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5187 *dest++ = '+';
5188 istreambuf_iterator_wchar_inc(first);
5191 /* read possibly grouped numbers before decimal */
5192 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5193 if(!(digits_pos = wcschr(digits, first->val))) {
5194 if(sep && first->val==sep) {
5195 if(!groups_no) break; /* empty group - stop parsing */
5196 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5197 groups_no = 0;
5198 ++cur_group;
5199 }else {
5200 break;
5202 }else {
5203 got_digit = TRUE; /* found a digit, zero or non-zero */
5204 /* write digit to dest if not a leading zero (to not waste dest buffer) */
5205 if(!got_nonzero && first->val == digits[0])
5207 ++groups_no;
5208 continue;
5210 got_nonzero = TRUE;
5211 if(dest < num_end)
5212 *dest++ = '0'+digits_pos-digits;
5213 else
5214 exp++; /* too many digits, just multiply by 10 */
5215 if(sep && groups_no<CHAR_MAX)
5216 ++groups_no;
5220 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
5221 if(got_digit && !got_nonzero)
5222 *dest++ = '0';
5224 /* get decimal, if any */
5225 if(first->strbuf && first->val==numpunct_wchar_decimal_point(numpunct)) {
5226 if(dest < num_end)
5227 *dest++ = *localeconv()->decimal_point;
5228 istreambuf_iterator_wchar_inc(first);
5231 /* read non-grouped after decimal */
5232 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5233 if(!(digits_pos = wcschr(digits, first->val)))
5234 break;
5235 else if(dest<num_end) {
5236 got_digit = TRUE;
5237 *dest++ = '0'+digits_pos-digits;
5241 /* read exponent, if any */
5242 if(first->strbuf && (first->val==mb_to_wc('e', cvt) || first->val==mb_to_wc('E', cvt))) {
5243 *dest++ = 'e';
5244 istreambuf_iterator_wchar_inc(first);
5246 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5247 *dest++ = '-';
5248 istreambuf_iterator_wchar_inc(first);
5249 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5250 *dest++ = '+';
5251 istreambuf_iterator_wchar_inc(first);
5254 got_digit = got_nonzero = FALSE;
5255 error = TRUE;
5256 /* skip any leading zeroes */
5257 for(; first->strbuf && first->val==digits[0]; istreambuf_iterator_wchar_inc(first))
5258 error = FALSE;
5260 for(; first->strbuf && (digits_pos = wcschr(digits, first->val)); istreambuf_iterator_wchar_inc(first)) {
5261 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
5262 error = FALSE;
5263 if(dest<exp_end)
5264 *dest++ = '0'+digits_pos-digits;
5267 /* if just found zeroes for exponent, use that */
5268 if(got_digit && !got_nonzero)
5270 error = FALSE;
5271 if(dest<exp_end)
5272 *dest++ = '0';
5276 if(sep && groups_no)
5277 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5279 if(!cur_group) /* no groups, skip loop */
5280 cur_group--;
5281 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
5282 error = TRUE; /* trailing empty */
5284 for(; cur_group>=0 && !error; cur_group--) {
5285 if(*grouping == CHAR_MAX) {
5286 if(cur_group)
5287 error = TRUE;
5288 break;
5289 }else if((cur_group && *grouping!=groups[cur_group])
5290 || (!cur_group && *grouping<groups[cur_group])) {
5291 error = TRUE;
5292 break;
5293 }else if(grouping[1]) {
5294 grouping++;
5297 MSVCP_basic_string_char_dtor(&grouping_bstr);
5298 if(sep)
5299 MSVCP_basic_string_char_dtor(&groups_found);
5301 if(error) {
5302 *dest_beg = '\0';
5303 return 0;
5305 *dest++ = '\0';
5306 return exp;
5309 /* ?_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 */
5310 /* ?_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 */
5311 int __cdecl num_get_wchar__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5312 istreambuf_iterator_wchar *last, const locale *loc)
5314 return num_get__Getffld(this, dest, first, last, loc, numpunct_wchar_use_facet(loc));
5317 /* ?_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 */
5318 /* ?_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 */
5319 int __cdecl num_get_short__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5320 istreambuf_iterator_wchar *last, const locale *loc)
5322 return num_get__Getffld(this, dest, first, last, loc, numpunct_short_use_facet(loc));
5325 /* ?_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 */
5326 /* ?_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 */
5327 /* ?_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 */
5328 /* ?_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 */
5329 int __cdecl num_get_wchar__Getffldx(num_get *this, char *dest, istreambuf_iterator_wchar *first,
5330 istreambuf_iterator_wchar *last, ios_base *ios, int *phexexp)
5332 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
5333 return -1;
5336 static int num_get__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5337 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc, numpunct_wchar *numpunct)
5339 wchar_t digits[23], *digits_pos, sep = 0;
5340 basic_string_char grouping_bstr;
5341 basic_string_char groups_found;
5342 int i, basefield, base, groups_no = 0, cur_group = 0;
5343 char *dest_beg = dest, *dest_end = dest+24;
5344 const char *grouping, *groups;
5345 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
5346 const _Cvtvec *cvt;
5348 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
5350 #if _MSVCP_VER <= 100
5351 cvt = &this->cvt;
5352 #else
5353 cvt = &ctype_wchar_use_facet(loc)->cvt;
5354 #endif
5356 for(i=0; i<10; i++)
5357 digits[i] = mb_to_wc('0'+i, cvt);
5358 for(i=0; i<6; i++) {
5359 digits[10+i] = mb_to_wc('a'+i, cvt);
5360 digits[16+i] = mb_to_wc('A'+i, cvt);
5363 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5364 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5365 #if _MSVCP_VER >= 70
5366 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5367 #endif
5369 basefield = fmtflags & FMTFLAG_basefield;
5370 if(basefield == FMTFLAG_oct)
5371 base = 8;
5372 else if(basefield == FMTFLAG_hex)
5373 base = 22; /* equal to the size of digits buffer */
5374 else if(!basefield)
5375 base = 0;
5376 else
5377 base = 10;
5379 istreambuf_iterator_wchar_val(first);
5380 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5381 *dest++ = '-';
5382 istreambuf_iterator_wchar_inc(first);
5383 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5384 *dest++ = '+';
5385 istreambuf_iterator_wchar_inc(first);
5388 if(first->strbuf && first->val==digits[0]) {
5389 found_zero = TRUE;
5390 istreambuf_iterator_wchar_inc(first);
5391 if(first->strbuf && (first->val==mb_to_wc('x', cvt) || first->val==mb_to_wc('X', cvt))) {
5392 if(!base || base == 22) {
5393 found_zero = FALSE;
5394 istreambuf_iterator_wchar_inc(first);
5395 base = 22;
5396 }else {
5397 base = 10;
5399 }else {
5400 error = FALSE;
5401 if(!base) base = 8;
5403 }else {
5404 if(!base) base = 10;
5406 digits[base] = 0;
5408 if(sep) {
5409 MSVCP_basic_string_char_ctor(&groups_found);
5410 if(found_zero) ++groups_no;
5413 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5414 if(!(digits_pos = wcschr(digits, first->val))) {
5415 if(sep && first->val==sep) {
5416 if(!groups_no) break; /* empty group - stop parsing */
5417 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5418 groups_no = 0;
5419 ++cur_group;
5420 }else {
5421 break;
5423 }else {
5424 error = FALSE;
5425 if(dest_empty && first->val == digits[0]) {
5426 found_zero = TRUE;
5427 ++groups_no;
5428 continue;
5430 dest_empty = FALSE;
5431 /* skip digits that can't be copied to dest buffer, other
5432 * functions are responsible for detecting overflows */
5433 if(dest < dest_end)
5434 *dest++ = (digits_pos-digits<10 ? '0'+digits_pos-digits :
5435 (digits_pos-digits<16 ? 'a'+digits_pos-digits-10 :
5436 'A'+digits_pos-digits-16));
5437 if(sep && groups_no<CHAR_MAX)
5438 ++groups_no;
5442 if(sep && groups_no)
5443 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5445 if(!cur_group) { /* no groups, skip loop */
5446 cur_group--;
5447 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
5448 error = TRUE; /* trailing empty */
5449 found_zero = FALSE;
5452 for(; cur_group>=0 && !error; cur_group--) {
5453 if(*grouping == CHAR_MAX) {
5454 if(cur_group)
5455 error = TRUE;
5456 break;
5457 }else if((cur_group && *grouping!=groups[cur_group])
5458 || (!cur_group && *grouping<groups[cur_group])) {
5459 error = TRUE;
5460 break;
5461 }else if(grouping[1]) {
5462 grouping++;
5466 MSVCP_basic_string_char_dtor(&grouping_bstr);
5467 if(sep)
5468 MSVCP_basic_string_char_dtor(&groups_found);
5470 if(error) {
5471 if (found_zero)
5472 *dest++ = '0';
5473 else
5474 dest = dest_beg;
5475 }else if(dest_empty)
5476 *dest++ = '0';
5477 *dest = '\0';
5479 return (base==22 ? 16 : base);
5482 /* ?_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 */
5483 /* ?_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 */
5484 int __cdecl num_get_wchar__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5485 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5487 return num_get__Getifld(this, dest, first, last,
5488 fmtflags, loc, numpunct_wchar_use_facet(loc));
5491 /* ?_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 */
5492 /* ?_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 */
5493 int __cdecl num_get_short__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5494 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5496 return num_get__Getifld(this, dest, first, last,
5497 fmtflags, loc, numpunct_short_use_facet(loc));
5500 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABEH_W000@Z */
5501 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAH_W000@Z */
5502 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABEHGGGG@Z */
5503 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHGGGG@Z */
5504 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar__Hexdig, 20)
5505 int __thiscall MSVCP_num_get_wchar__Hexdig(num_get *this, wchar_t dig, wchar_t e0, wchar_t al, wchar_t au)
5507 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
5508 return -1;
5511 static istreambuf_iterator_wchar* num_get_do_get_void(const num_get *this,
5512 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5513 istreambuf_iterator_wchar last, ios_base *base, int *state,
5514 void **pval, numpunct_wchar *numpunct)
5516 unsigned __int64 v;
5517 char tmp[25], *end;
5518 int err;
5520 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5522 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5523 &last, FMTFLAG_hex, IOS_LOCALE(base), numpunct), &err);
5524 if(v!=(unsigned __int64)((INT_PTR)v))
5525 *state |= IOSTATE_failbit;
5526 else if(end!=tmp && !err)
5527 *pval = (void*)((INT_PTR)v);
5528 else
5529 *state |= IOSTATE_failbit;
5531 if(!first.strbuf)
5532 *state |= IOSTATE_eofbit;
5534 *ret = first;
5535 return ret;
5538 /* ?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 */
5539 /* ?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 */
5540 #if _MSVCP_VER <= 100
5541 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_wchar*, \
5542 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5543 (this, ret, first, last, base, state, pval))
5544 #else
5545 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5546 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5547 (this, ret, first, last, base, state, pval))
5548 #endif
5549 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_void,36)
5550 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5551 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5553 return num_get_do_get_void(this, ret, first, last, base,
5554 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5557 /* ?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 */
5558 /* ?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 */
5559 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_void,36)
5560 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5561 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5563 return num_get_do_get_void(this, ret, first, last, base,
5564 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5567 /* ?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 */
5568 /* ?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 */
5569 /* ?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 */
5570 /* ?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 */
5571 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_void,36)
5572 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5573 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5575 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5576 return call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval);
5579 static istreambuf_iterator_wchar* num_get_do_get_double(const num_get *this,
5580 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5581 istreambuf_iterator_wchar last, ios_base *base, int *state,
5582 double *pval, numpunct_wchar *numpunct)
5584 double v;
5585 char tmp[32], *end;
5586 int err;
5588 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5590 v = _Stodx(tmp, &end, num_get__Getffld(this, tmp, &first, &last, IOS_LOCALE(base), numpunct), &err);
5591 if(end!=tmp && !err)
5592 *pval = v;
5593 else
5594 *state |= IOSTATE_failbit;
5596 if(!first.strbuf)
5597 *state |= IOSTATE_eofbit;
5599 *ret = first;
5600 return ret;
5603 /* ?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 */
5604 /* ?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 */
5605 /* ?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 */
5606 /* ?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 */
5607 #if _MSVCP_VER <= 100
5608 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
5609 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5610 (this, ret, first, last, base, state, pval))
5611 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5612 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5613 (this, ret, first, last, base, state, pval))
5614 #else
5615 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5616 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5617 (this, ret, first, last, base, state, pval))
5618 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5619 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5620 (this, ret, first, last, base, state, pval))
5621 #endif
5622 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_double,36)
5623 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5624 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5626 return num_get_do_get_double(this, ret, first, last, base,
5627 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5630 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
5631 /* ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
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@AAHAAN@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@AEAHAEAN@Z */
5634 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_double,36)
5635 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5636 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5638 return num_get_do_get_double(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@AAHAAO@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@AEAHAEAO@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@AAHAAO@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@AEAHAEAO@Z */
5646 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ldouble,36)
5647 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ldouble(const num_get *this, istreambuf_iterator_wchar *ret,
5648 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5650 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5651 return call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval);
5654 /* ?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 */
5655 /* ?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 */
5656 /* ?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 */
5657 /* ?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 */
5658 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_double,36)
5659 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5660 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5662 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5663 return call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval);
5666 static istreambuf_iterator_wchar* num_get_do_get_float(const num_get *this,
5667 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5668 istreambuf_iterator_wchar last, ios_base *base, int *state,
5669 float *pval, numpunct_wchar *numpunct)
5671 float v;
5672 char tmp[32], *end;
5673 int err;
5675 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5677 v = _Stofx(tmp, &end, num_get__Getffld(this, tmp, &first,
5678 &last, IOS_LOCALE(base), numpunct), &err);
5679 if(end!=tmp && !err)
5680 *pval = v;
5681 else
5682 *state |= IOSTATE_failbit;
5684 if(!first.strbuf)
5685 *state |= IOSTATE_eofbit;
5687 *ret = first;
5688 return ret;
5691 /* ?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 */
5692 /* ?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 */
5693 #if _MSVCP_VER <= 100
5694 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5695 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5696 (this, ret, first, last, base, state, pval))
5697 #else
5698 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5699 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5700 (this, ret, first, last, base, state, pval))
5701 #endif
5702 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_float,36)
5703 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5704 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5706 return num_get_do_get_float(this, ret, first, last, base,
5707 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5710 /* ?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 */
5711 /* ?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 */
5712 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_float,36)
5713 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5714 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5716 return num_get_do_get_float(this, ret, first, last, base,
5717 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5720 /* ?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 */
5721 /* ?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 */
5722 /* ?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 */
5723 /* ?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 */
5724 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_float,36)
5725 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5726 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5728 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5729 return call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval);
5732 static istreambuf_iterator_wchar* num_get_do_get_uint64(const num_get *this,
5733 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5734 istreambuf_iterator_wchar last, ios_base *base, int *state,
5735 ULONGLONG *pval, numpunct_wchar *numpunct)
5737 unsigned __int64 v;
5738 char tmp[25], *end;
5739 int err;
5741 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5743 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5744 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5745 if(end!=tmp && !err)
5746 *pval = v;
5747 else
5748 *state |= IOSTATE_failbit;
5750 if(!first.strbuf)
5751 *state |= IOSTATE_eofbit;
5753 *ret = first;
5754 return ret;
5757 /* ?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 */
5758 /* ?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 */
5759 #if _MSVCP_VER <= 100
5760 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5761 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5762 (this, ret, first, last, base, state, pval))
5763 #else
5764 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5765 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5766 (this, ret, first, last, base, state, pval))
5767 #endif
5768 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint64,36)
5769 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5770 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5772 return num_get_do_get_uint64(this, ret, first, last, base,
5773 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5776 /* ?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 */
5777 /* ?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 */
5778 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint64,36)
5779 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5780 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5782 return num_get_do_get_uint64(this, ret, first, last, base,
5783 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5786 /* ?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 */
5787 /* ?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 */
5788 /* ?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 */
5789 /* ?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 */
5790 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint64,36)
5791 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5792 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5794 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5795 return call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval);
5798 static istreambuf_iterator_wchar* num_get_do_get_int64(const num_get *this,
5799 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5800 istreambuf_iterator_wchar last, ios_base *base, int *state,
5801 LONGLONG *pval, numpunct_wchar *numpunct)
5803 __int64 v;
5804 char tmp[25], *end;
5805 int err;
5807 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5809 v = _Stollx(tmp, &end, num_get__Getifld(this, tmp, &first,
5810 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5811 if(end!=tmp && !err)
5812 *pval = v;
5813 else
5814 *state |= IOSTATE_failbit;
5816 if(!first.strbuf)
5817 *state |= IOSTATE_eofbit;
5819 *ret = first;
5820 return ret;
5823 /* ?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 */
5824 /* ?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 */
5825 #if _MSVCP_VER <= 100
5826 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5827 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5828 (this, ret, first, last, base, state, pval))
5829 #else
5830 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5831 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5832 (this, ret, first, last, base, state, pval))
5833 #endif
5834 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_int64,36)
5835 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5836 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5838 return num_get_do_get_int64(this, ret, first, last, base,
5839 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5842 /* ?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 */
5843 /* ?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 */
5844 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_int64,36)
5845 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5846 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5848 return num_get_do_get_int64(this, ret, first, last, base,
5849 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5852 /* ?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 */
5853 /* ?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 */
5854 /* ?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 */
5855 /* ?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 */
5856 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_int64,36)
5857 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5858 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5860 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5861 return call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval);
5864 static istreambuf_iterator_wchar* num_get_do_get_ulong(const num_get *this,
5865 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5866 istreambuf_iterator_wchar last, ios_base *base, int *state,
5867 ULONG *pval, numpunct_wchar *numpunct)
5869 ULONG v;
5870 char tmp[25], *end;
5871 int err;
5873 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5875 v = _Stoulx(tmp, &end, num_get__Getifld(this, tmp, &first,
5876 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5877 if(end!=tmp && !err)
5878 *pval = v;
5879 else
5880 *state |= IOSTATE_failbit;
5882 if(!first.strbuf)
5883 *state |= IOSTATE_eofbit;
5885 *ret = first;
5886 return ret;
5889 /* ?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 */
5890 /* ?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 */
5891 #if _MSVCP_VER <= 100
5892 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5893 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5894 (this, ret, first, last, base, state, pval))
5895 #else
5896 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
5897 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5898 (this, ret, first, last, base, state, pval))
5899 #endif
5900 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ulong,36)
5901 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5902 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5904 return num_get_do_get_ulong(this, ret, first, last, base,
5905 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5908 /* ?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 */
5909 /* ?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 */
5910 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ulong,36)
5911 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5912 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5914 return num_get_do_get_ulong(this, ret, first, last, base,
5915 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5918 /* ?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 */
5919 /* ?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 */
5920 /* ?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 */
5921 /* ?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 */
5922 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ulong,36)
5923 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5924 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5926 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5927 return call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval);
5930 static istreambuf_iterator_wchar* num_get_do_get_long(const num_get *this,
5931 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5932 istreambuf_iterator_wchar last, ios_base *base, int *state,
5933 LONG *pval, numpunct_wchar *numpunct)
5935 LONG v;
5936 char tmp[25], *end;
5937 int err;
5939 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5941 v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
5942 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5943 if(end!=tmp && !err)
5944 *pval = v;
5945 else
5946 *state |= IOSTATE_failbit;
5948 if(!first.strbuf)
5949 *state |= IOSTATE_eofbit;
5951 *ret = first;
5952 return ret;
5955 /* ?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 */
5956 /* ?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 */
5957 #if _MSVCP_VER <= 100
5958 #define call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5959 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONG*), \
5960 (this, ret, first, last, base, state, pval))
5961 #else
5962 #define call_num_get_wchar_do_get_long(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*, LONG*), \
5964 (this, ret, first, last, base, state, pval))
5965 #endif
5966 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_long,36)
5967 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5968 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5970 return num_get_do_get_long(this, ret, first, last, base,
5971 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5974 /* ?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 */
5975 /* ?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 */
5976 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_long,36)
5977 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5978 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5980 return num_get_do_get_long(this, ret, first, last, base,
5981 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5984 /* ?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 */
5985 /* ?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 */
5986 /* ?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 */
5987 /* ?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 */
5988 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_long,36)
5989 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5990 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5992 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5993 return call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval);
5996 /* ?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 */
5997 /* ?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 */
5998 #if _MSVCP_VER <= 100
5999 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
6000 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
6001 (this, ret, first, last, base, state, pval))
6002 #else
6003 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
6004 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
6005 (this, ret, first, last, base, state, pval))
6006 #endif
6007 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint,36)
6008 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
6009 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
6011 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6012 return num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval);
6015 /* ?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 */
6016 /* ?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 */
6017 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint,36)
6018 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
6019 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
6021 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6022 return num_get_short_do_get_ulong(this, ret, first, last, base, state, pval);
6025 /* ?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 */
6026 /* ?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 */
6027 /* ?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 */
6028 /* ?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 */
6029 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint,36)
6030 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
6031 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
6033 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6034 return call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval);
6037 /* ?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 */
6038 /* ?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 */
6039 #if _MSVCP_VER <= 100
6040 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_wchar*, \
6041 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
6042 (this, ret, first, last, base, state, pval))
6043 #else
6044 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_wchar*, \
6045 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
6046 (this, ret, first, last, base, state, pval))
6047 #endif
6048 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ushort,36)
6049 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6050 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6052 ULONG v;
6053 char tmp[25], *beg, *end;
6054 int err, b;
6056 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6058 b = num_get_wchar__Getifld(this, tmp,
6059 &first, &last, base->fmtfl, IOS_LOCALE(base));
6060 beg = tmp + (tmp[0]=='-' ? 1 : 0);
6061 v = _Stoulx(beg, &end, b, &err);
6063 if(v != (ULONG)((unsigned short)v))
6064 *state |= IOSTATE_failbit;
6065 else if(end!=beg && !err)
6066 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
6067 else
6068 *state |= IOSTATE_failbit;
6070 if(!first.strbuf)
6071 *state |= IOSTATE_eofbit;
6073 *ret = first;
6074 return ret;
6077 /* ?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 */
6078 /* ?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 */
6079 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ushort,36)
6080 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6081 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6083 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
6084 return ret;
6087 /* ?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 */
6088 /* ?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 */
6089 /* ?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@ */
6090 /* ?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 */
6091 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ushort,36)
6092 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6093 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6095 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6096 return call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval);
6099 static istreambuf_iterator_wchar* num_get_do_get_bool(const num_get *this,
6100 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
6101 istreambuf_iterator_wchar last, ios_base *base, int *state,
6102 MSVCP_bool *pval, numpunct_wchar *numpunct)
6104 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6106 if(base->fmtfl & FMTFLAG_boolalpha) {
6107 basic_string_wchar false_bstr, true_bstr;
6108 const wchar_t *pfalse, *ptrue;
6110 numpunct_wchar_falsename(numpunct, &false_bstr);
6111 numpunct_wchar_truename(numpunct, &true_bstr);
6112 pfalse = MSVCP_basic_string_wchar_c_str(&false_bstr);
6113 ptrue = MSVCP_basic_string_wchar_c_str(&true_bstr);
6115 for(istreambuf_iterator_wchar_val(&first); first.strbuf;) {
6116 if(pfalse && *pfalse && first.val!=*pfalse)
6117 pfalse = NULL;
6118 if(ptrue && *ptrue && first.val!=*ptrue)
6119 ptrue = NULL;
6121 if(pfalse && *pfalse && ptrue && !*ptrue)
6122 ptrue = NULL;
6123 if(ptrue && *ptrue && pfalse && !*pfalse)
6124 pfalse = NULL;
6126 if(pfalse)
6127 pfalse++;
6128 if(ptrue)
6129 ptrue++;
6131 if(pfalse || ptrue)
6132 istreambuf_iterator_wchar_inc(&first);
6134 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
6135 break;
6138 if(ptrue)
6139 *pval = TRUE;
6140 else if(pfalse)
6141 *pval = FALSE;
6142 else
6143 *state |= IOSTATE_failbit;
6145 MSVCP_basic_string_wchar_dtor(&false_bstr);
6146 MSVCP_basic_string_wchar_dtor(&true_bstr);
6147 }else {
6148 char tmp[25], *end;
6149 int err;
6150 LONG v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
6151 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
6153 if(end!=tmp && err==0 && (v==0 || v==1))
6154 *pval = v;
6155 else
6156 *state |= IOSTATE_failbit;
6159 if(!first.strbuf)
6160 *state |= IOSTATE_eofbit;
6161 memcpy(ret, &first, sizeof(first));
6162 return ret;
6165 /* ?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 */
6166 /* ?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 */
6167 #if _MSVCP_VER <= 100
6168 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
6169 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, MSVCP_bool*), \
6170 (this, ret, first, last, base, state, pval))
6171 #else
6172 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_wchar*, \
6173 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, MSVCP_bool*), \
6174 (this, ret, first, last, base, state, pval))
6175 #endif
6176 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_bool,36)
6177 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6178 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, MSVCP_bool *pval)
6180 return num_get_do_get_bool(this, ret, first, last, base,
6181 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
6184 /* ?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 */
6185 /* ?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 */
6186 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_bool,36)
6187 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6188 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, MSVCP_bool *pval)
6190 return num_get_do_get_bool(this, ret, first, last, base,
6191 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
6194 /* ?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 */
6195 /* ?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 */
6196 /* ?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 */
6197 /* ?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 */
6198 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_bool,36)
6199 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6200 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, MSVCP_bool *pval)
6202 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6203 return call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval);
6206 /* ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
6207 locale_id num_get_char_id = {0};
6209 /* ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
6210 extern const vtable_ptr MSVCP_num_get_char_vtable;
6212 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
6213 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
6214 DEFINE_THISCALL_WRAPPER(num_get_char__Init, 8)
6215 void __thiscall num_get_char__Init(num_get *this, const _Locinfo *locinfo)
6217 TRACE("(%p %p)\n", this, locinfo);
6218 #if _MSVCP_VER <= 100
6219 _Locinfo__Getcvt(locinfo, &this->cvt);
6220 #endif
6223 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
6224 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
6225 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_locinfo, 12)
6226 num_get* __thiscall num_get_char_ctor_locinfo(num_get *this,
6227 const _Locinfo *locinfo, MSVCP_size_t refs)
6229 TRACE("(%p %p %lu)\n", this, locinfo, refs);
6231 locale_facet_ctor_refs(&this->facet, refs);
6232 this->facet.vtable = &MSVCP_num_get_char_vtable;
6234 num_get_char__Init(this, locinfo);
6235 return this;
6238 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
6239 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
6240 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_refs, 8)
6241 num_get* __thiscall num_get_char_ctor_refs(num_get *this, MSVCP_size_t refs)
6243 _Locinfo locinfo;
6245 TRACE("(%p %lu)\n", this, refs);
6247 _Locinfo_ctor(&locinfo);
6248 num_get_char_ctor_locinfo(this, &locinfo, refs);
6249 _Locinfo_dtor(&locinfo);
6250 return this;
6253 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
6254 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
6255 DEFINE_THISCALL_WRAPPER(num_get_char_ctor, 4)
6256 num_get* __thiscall num_get_char_ctor(num_get *this)
6258 return num_get_char_ctor_refs(this, 0);
6261 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
6262 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
6263 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
6264 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
6265 DEFINE_THISCALL_WRAPPER(num_get_char_dtor, 4)
6266 void __thiscall num_get_char_dtor(num_get *this)
6268 TRACE("(%p)\n", this);
6269 locale_facet_dtor(&this->facet);
6272 DEFINE_THISCALL_WRAPPER(num_get_char_vector_dtor, 8)
6273 num_get* __thiscall num_get_char_vector_dtor(num_get *this, unsigned int flags)
6275 TRACE("(%p %x)\n", this, flags);
6276 if(flags & 2) {
6277 /* we have an array, with the number of elements stored before the first object */
6278 INT_PTR i, *ptr = (INT_PTR *)this-1;
6280 for(i=*ptr-1; i>=0; i--)
6281 num_get_char_dtor(this+i);
6282 MSVCRT_operator_delete(ptr);
6283 } else {
6284 num_get_char_dtor(this);
6285 if(flags & 1)
6286 MSVCRT_operator_delete(this);
6289 return this;
6292 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
6293 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
6294 MSVCP_size_t __cdecl num_get_char__Getcat(const locale_facet **facet, const locale *loc)
6296 TRACE("(%p %p)\n", facet, loc);
6298 if(facet && !*facet) {
6299 _Locinfo locinfo;
6301 *facet = MSVCRT_operator_new(sizeof(num_get));
6302 if(!*facet) {
6303 ERR("Out of memory\n");
6304 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
6305 return 0;
6308 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
6309 num_get_char_ctor_locinfo((num_get*)*facet, &locinfo, 0);
6310 _Locinfo_dtor(&locinfo);
6313 return LC_NUMERIC;
6316 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
6317 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
6318 MSVCP_size_t __cdecl num_get_char__Getcat_old(const locale_facet **facet)
6320 return num_get_char__Getcat(facet, locale_classic());
6323 num_get* num_get_char_use_facet(const locale *loc)
6325 static num_get *obj = NULL;
6327 _Lockit lock;
6328 const locale_facet *fac;
6330 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
6331 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_char_id));
6332 if(fac) {
6333 _Lockit_dtor(&lock);
6334 return (num_get*)fac;
6337 if(obj) {
6338 _Lockit_dtor(&lock);
6339 return obj;
6342 num_get_char__Getcat(&fac, loc);
6343 obj = (num_get*)fac;
6344 call_locale_facet__Incref(&obj->facet);
6345 locale_facet_register(&obj->facet);
6346 _Lockit_dtor(&lock);
6348 return obj;
6351 /* ?_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 */
6352 /* ?_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 */
6353 /* Copies number to dest buffer, validates grouping and skips separators.
6354 * Updates first so it points past the number, all digits are skipped.
6355 * Returns how exponent needs to changed.
6356 * Size of dest buffer is not specified, assuming it's not smaller than 32:
6357 * strlen(+0.e+) + 22(digits) + 4(exponent) + 1(nullbyte)
6359 int __cdecl num_get_char__Getffld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6360 istreambuf_iterator_char *last, const locale *loc)
6362 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6363 basic_string_char grouping_bstr;
6364 basic_string_char groups_found;
6365 int groups_no = 0, cur_group = 0, exp = 0;
6366 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31, sep = 0;
6367 const char *grouping, *groups;
6368 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
6370 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
6372 numpunct_char_grouping(numpunct, &grouping_bstr);
6373 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6374 #if _MSVCP_VER >= 70
6375 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6376 #endif
6378 if(sep)
6379 MSVCP_basic_string_char_ctor(&groups_found);
6381 istreambuf_iterator_char_val(first);
6382 /* get sign */
6383 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6384 *dest++ = first->val;
6385 istreambuf_iterator_char_inc(first);
6388 /* read possibly grouped numbers before decimal */
6389 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6390 if(first->val<'0' || first->val>'9') {
6391 if(sep && first->val==sep) {
6392 if(!groups_no) break; /* empty group - stop parsing */
6393 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6394 groups_no = 0;
6395 ++cur_group;
6396 }else {
6397 break;
6399 }else {
6400 got_digit = TRUE; /* found a digit, zero or non-zero */
6401 /* write digit to dest if not a leading zero (to not waste dest buffer) */
6402 if(!got_nonzero && first->val == '0')
6404 ++groups_no;
6405 continue;
6407 got_nonzero = TRUE;
6408 if(dest < num_end)
6409 *dest++ = first->val;
6410 else
6411 exp++; /* too many digits, just multiply by 10 */
6412 if(sep && groups_no<CHAR_MAX)
6413 ++groups_no;
6417 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
6418 if(got_digit && !got_nonzero)
6419 *dest++ = '0';
6421 /* get decimal, if any */
6422 if(first->strbuf && first->val==numpunct_char_decimal_point(numpunct)) {
6423 if(dest < num_end)
6424 *dest++ = *localeconv()->decimal_point;
6425 istreambuf_iterator_char_inc(first);
6428 /* read non-grouped after decimal */
6429 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6430 if(first->val<'0' || first->val>'9')
6431 break;
6432 else if(dest<num_end) {
6433 got_digit = TRUE;
6434 *dest++ = first->val;
6438 /* read exponent, if any */
6439 if(first->strbuf && (first->val=='e' || first->val=='E')) {
6440 *dest++ = first->val;
6441 istreambuf_iterator_char_inc(first);
6443 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6444 *dest++ = first->val;
6445 istreambuf_iterator_char_inc(first);
6448 got_digit = got_nonzero = FALSE;
6449 error = TRUE;
6450 /* skip any leading zeroes */
6451 for(; first->strbuf && first->val=='0'; istreambuf_iterator_char_inc(first))
6452 got_digit = TRUE;
6454 for(; first->strbuf && first->val>='0' && first->val<='9'; istreambuf_iterator_char_inc(first)) {
6455 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
6456 error = FALSE;
6457 if(dest<exp_end)
6458 *dest++ = first->val;
6461 /* if just found zeroes for exponent, use that */
6462 if(got_digit && !got_nonzero)
6464 error = FALSE;
6465 if(dest<exp_end)
6466 *dest++ = '0';
6470 if(sep && groups_no)
6471 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6473 if(!cur_group) /* no groups, skip loop */
6474 cur_group--;
6475 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
6476 error = TRUE; /* trailing empty */
6478 for(; cur_group>=0 && !error; cur_group--) {
6479 if(*grouping == CHAR_MAX) {
6480 if(cur_group)
6481 error = TRUE;
6482 break;
6483 }else if((cur_group && *grouping!=groups[cur_group])
6484 || (!cur_group && *grouping<groups[cur_group])) {
6485 error = TRUE;
6486 break;
6487 }else if(grouping[1]) {
6488 grouping++;
6491 MSVCP_basic_string_char_dtor(&grouping_bstr);
6492 if(sep)
6493 MSVCP_basic_string_char_dtor(&groups_found);
6495 if(error) {
6496 *dest_beg = '\0';
6497 return 0;
6499 *dest++ = '\0';
6500 return exp;
6503 /* ?_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 */
6504 /* ?_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 */
6505 int __cdecl num_get_char__Getffldx(const num_get *this, char *dest, istreambuf_iterator_char *first,
6506 istreambuf_iterator_char *last, ios_base *ios, int *phexexp)
6508 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
6509 return -1;
6512 /* ?_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 */
6513 /* ?_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 */
6514 /* Copies number to dest buffer, validates grouping and skips separators.
6515 * Updates first so it points past the number, all digits are skipped.
6516 * Returns number base (8, 10 or 16).
6517 * Size of dest buffer is not specified, assuming it's not smaller than 25:
6518 * 22(8^22>2^64)+1(detect overflows)+1(sign)+1(nullbyte) = 25
6520 int __cdecl num_get_char__Getifld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6521 istreambuf_iterator_char *last, int fmtflags, const locale *loc)
6523 static const char digits[] = "0123456789abcdefABCDEF";
6525 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6526 basic_string_char grouping_bstr;
6527 basic_string_char groups_found;
6528 int basefield, base, groups_no = 0, cur_group = 0;
6529 char *dest_beg = dest, *dest_end = dest+24, sep = 0;
6530 const char *grouping, *groups;
6531 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
6533 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
6535 numpunct_char_grouping(numpunct, &grouping_bstr);
6536 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6537 #if _MSVCP_VER >= 70
6538 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6539 #endif
6541 basefield = fmtflags & FMTFLAG_basefield;
6542 if(basefield == FMTFLAG_oct)
6543 base = 8;
6544 else if(basefield == FMTFLAG_hex)
6545 base = 22; /* equal to the size of digits buffer */
6546 else if(!basefield)
6547 base = 0;
6548 else
6549 base = 10;
6551 istreambuf_iterator_char_val(first);
6552 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6553 *dest++ = first->val;
6554 istreambuf_iterator_char_inc(first);
6557 if(first->strbuf && first->val=='0') {
6558 found_zero = TRUE;
6559 istreambuf_iterator_char_inc(first);
6560 if(first->strbuf && (first->val=='x' || first->val=='X')) {
6561 if(!base || base == 22) {
6562 found_zero = FALSE;
6563 istreambuf_iterator_char_inc(first);
6564 base = 22;
6565 }else {
6566 base = 10;
6568 }else {
6569 error = FALSE;
6570 if(!base) base = 8;
6572 }else {
6573 if (!base) base = 10;
6576 if(sep)
6578 MSVCP_basic_string_char_ctor(&groups_found);
6579 if(found_zero) ++groups_no;
6582 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6583 if(!memchr(digits, first->val, base)) {
6584 if(sep && first->val==sep) {
6585 if(!groups_no) break; /* empty group - stop parsing */
6586 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6587 groups_no = 0;
6588 ++cur_group;
6589 }else {
6590 break;
6592 }else {
6593 error = FALSE;
6594 if(dest_empty && first->val == '0')
6596 found_zero = TRUE;
6597 ++groups_no;
6598 continue;
6600 dest_empty = FALSE;
6601 /* skip digits that can't be copied to dest buffer, other
6602 * functions are responsible for detecting overflows */
6603 if(dest < dest_end)
6604 *dest++ = first->val;
6605 if(sep && groups_no<CHAR_MAX)
6606 ++groups_no;
6610 if(sep && groups_no)
6611 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6613 if(!cur_group) { /* no groups, skip loop */
6614 cur_group--;
6615 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
6616 error = TRUE; /* trailing empty */
6617 found_zero = FALSE;
6620 for(; cur_group>=0 && !error; cur_group--) {
6621 if(*grouping == CHAR_MAX) {
6622 if(cur_group)
6623 error = TRUE;
6624 break;
6625 }else if((cur_group && *grouping!=groups[cur_group])
6626 || (!cur_group && *grouping<groups[cur_group])) {
6627 error = TRUE;
6628 break;
6629 }else if(grouping[1]) {
6630 grouping++;
6634 MSVCP_basic_string_char_dtor(&grouping_bstr);
6635 if(sep)
6636 MSVCP_basic_string_char_dtor(&groups_found);
6638 if(error) {
6639 if (found_zero)
6640 *dest++ = '0';
6641 else
6642 dest = dest_beg;
6643 }else if(dest_empty)
6644 *dest++ = '0';
6645 *dest = '\0';
6647 return (base==22 ? 16 : base);
6650 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABEHD000@Z */
6651 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHD000@Z */
6652 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char__Hexdig, 20)
6653 int __thiscall MSVCP_num_get_char__Hexdig(num_get *this, char dig, char e0, char al, char au)
6655 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
6656 return -1;
6659 /* ?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 */
6660 /* ?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 */
6661 #if _MSVCP_VER <= 100
6662 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_char*, \
6663 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6664 (this, ret, first, last, base, state, pval))
6665 #else
6666 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6667 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6668 (this, ret, first, last, base, state, pval))
6669 #endif
6670 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_void,36)
6671 istreambuf_iterator_char *__thiscall num_get_char_do_get_void(const num_get *this, istreambuf_iterator_char *ret,
6672 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6674 unsigned __int64 v;
6675 char tmp[25], *end;
6676 int err;
6678 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6680 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6681 &first, &last, FMTFLAG_hex, IOS_LOCALE(base)), &err);
6682 if(v!=(unsigned __int64)((INT_PTR)v))
6683 *state |= IOSTATE_failbit;
6684 else if(end!=tmp && !err)
6685 *pval = (void*)((INT_PTR)v);
6686 else
6687 *state |= IOSTATE_failbit;
6689 if(!first.strbuf)
6690 *state |= IOSTATE_eofbit;
6692 *ret = first;
6693 return ret;
6696 /* ?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 */
6697 /* ?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 */
6698 DEFINE_THISCALL_WRAPPER(num_get_char_get_void,36)
6699 istreambuf_iterator_char *__thiscall num_get_char_get_void(const num_get *this, istreambuf_iterator_char *ret,
6700 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6702 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6703 return call_num_get_char_do_get_void(this, ret, first, last, base, state, pval);
6706 /* ?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 */
6707 /* ?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 */
6708 /* ?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 */
6709 /* ?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 */
6710 #if _MSVCP_VER <= 100
6711 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
6712 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6713 (this, ret, first, last, base, state, pval))
6714 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6715 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6716 (this, ret, first, last, base, state, pval))
6717 #else
6718 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6719 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6720 (this, ret, first, last, base, state, pval))
6721 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6722 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6723 (this, ret, first, last, base, state, pval))
6724 #endif
6725 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_double,36)
6726 istreambuf_iterator_char *__thiscall num_get_char_do_get_double(const num_get *this, istreambuf_iterator_char *ret,
6727 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6729 double v;
6730 char tmp[32], *end;
6731 int err;
6733 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6735 v = _Stodx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6736 if(end!=tmp && !err)
6737 *pval = v;
6738 else
6739 *state |= IOSTATE_failbit;
6741 if(!first.strbuf)
6742 *state |= IOSTATE_eofbit;
6744 *ret = first;
6745 return ret;
6748 /* ?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 */
6749 /* ?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 */
6750 DEFINE_THISCALL_WRAPPER(num_get_char_get_ldouble,36)
6751 istreambuf_iterator_char *__thiscall num_get_char_get_ldouble(const num_get *this, istreambuf_iterator_char *ret,
6752 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6754 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6755 return call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval);
6758 /* ?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 */
6759 /* ?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 */
6760 DEFINE_THISCALL_WRAPPER(num_get_char_get_double,36)
6761 istreambuf_iterator_char *__thiscall num_get_char_get_double(const num_get *this, istreambuf_iterator_char *ret,
6762 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6764 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6765 return call_num_get_char_do_get_double(this, ret, first, last, base, state, pval);
6768 /* ?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 */
6769 /* ?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 */
6770 #if _MSVCP_VER <= 100
6771 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6772 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6773 (this, ret, first, last, base, state, pval))
6774 #else
6775 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6776 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6777 (this, ret, first, last, base, state, pval))
6778 #endif
6779 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_float,36)
6780 istreambuf_iterator_char *__thiscall num_get_char_do_get_float(const num_get *this, istreambuf_iterator_char *ret,
6781 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6783 float v;
6784 char tmp[32], *end;
6785 int err;
6787 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6789 v = _Stofx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6790 if(end!=tmp && !err)
6791 *pval = v;
6792 else
6793 *state |= IOSTATE_failbit;
6795 if(!first.strbuf)
6796 *state |= IOSTATE_eofbit;
6798 *ret = first;
6799 return ret;
6802 /* ?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 */
6803 /* ?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 */
6804 DEFINE_THISCALL_WRAPPER(num_get_char_get_float,36)
6805 istreambuf_iterator_char *__thiscall num_get_char_get_float(const num_get *this, istreambuf_iterator_char *ret,
6806 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6808 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6809 return call_num_get_char_do_get_float(this, ret, first, last, base, state, pval);
6812 /* ?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 */
6813 /* ?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 */
6814 #if _MSVCP_VER <= 100
6815 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6816 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6817 (this, ret, first, last, base, state, pval))
6818 #else
6819 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6820 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6821 (this, ret, first, last, base, state, pval))
6822 #endif
6823 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint64,36)
6824 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6825 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6827 unsigned __int64 v;
6828 char tmp[25], *end;
6829 int err;
6831 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6833 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6834 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6835 if(end!=tmp && !err)
6836 *pval = v;
6837 else
6838 *state |= IOSTATE_failbit;
6840 if(!first.strbuf)
6841 *state |= IOSTATE_eofbit;
6843 *ret = first;
6844 return ret;
6847 /* ?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 */
6848 /* ?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 */
6849 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint64,36)
6850 istreambuf_iterator_char *__thiscall num_get_char_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6851 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6853 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6854 return call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval);
6857 /* ?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 */
6858 /* ?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 */
6859 #if _MSVCP_VER <= 100
6860 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6861 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6862 (this, ret, first, last, base, state, pval))
6863 #else
6864 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6865 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6866 (this, ret, first, last, base, state, pval))
6867 #endif
6868 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_int64,36)
6869 istreambuf_iterator_char *__thiscall num_get_char_do_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6870 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6872 __int64 v;
6873 char tmp[25], *end;
6874 int err;
6876 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6878 v = _Stollx(tmp, &end, num_get_char__Getifld(this, tmp,
6879 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6880 if(end!=tmp && !err)
6881 *pval = v;
6882 else
6883 *state |= IOSTATE_failbit;
6885 if(!first.strbuf)
6886 *state |= IOSTATE_eofbit;
6888 *ret = first;
6889 return ret;
6892 /* ?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 */
6893 /* ?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 */
6894 DEFINE_THISCALL_WRAPPER(num_get_char_get_int64,36)
6895 istreambuf_iterator_char *__thiscall num_get_char_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6896 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6898 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6899 return call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval);
6902 /* ?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 */
6903 /* ?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 */
6904 #if _MSVCP_VER <= 100
6905 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6906 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6907 (this, ret, first, last, base, state, pval))
6908 #else
6909 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
6910 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6911 (this, ret, first, last, base, state, pval))
6912 #endif
6913 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ulong,36)
6914 istreambuf_iterator_char *__thiscall num_get_char_do_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6915 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6917 ULONG v;
6918 char tmp[25], *end;
6919 int err;
6921 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6923 v = _Stoulx(tmp, &end, num_get_char__Getifld(this, tmp,
6924 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6925 if(end!=tmp && !err)
6926 *pval = v;
6927 else
6928 *state |= IOSTATE_failbit;
6930 if(!first.strbuf)
6931 *state |= IOSTATE_eofbit;
6933 *ret = first;
6934 return ret;
6937 /* ?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 */
6938 /* ?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 */
6939 DEFINE_THISCALL_WRAPPER(num_get_char_get_ulong,36)
6940 istreambuf_iterator_char *__thiscall num_get_char_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6941 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6943 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6944 return call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
6947 /* ?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 */
6948 /* ?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 */
6949 #if _MSVCP_VER <= 100
6950 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6951 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6952 (this, ret, first, last, base, state, pval))
6953 #else
6954 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
6955 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6956 (this, ret, first, last, base, state, pval))
6957 #endif
6958 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_long,36)
6959 istreambuf_iterator_char *__thiscall num_get_char_do_get_long(const num_get *this, istreambuf_iterator_char *ret,
6960 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
6962 LONG v;
6963 char tmp[25], *end;
6964 int err;
6966 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6968 v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
6969 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6970 if(end!=tmp && !err)
6971 *pval = v;
6972 else
6973 *state |= IOSTATE_failbit;
6975 if(!first.strbuf)
6976 *state |= IOSTATE_eofbit;
6978 *ret = first;
6979 return ret;
6982 /* ?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 */
6983 /* ?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 */
6984 DEFINE_THISCALL_WRAPPER(num_get_char_get_long,36)
6985 istreambuf_iterator_char *__thiscall num_get_char_get_long(const num_get *this, istreambuf_iterator_char *ret,
6986 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
6988 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6989 return call_num_get_char_do_get_long(this, ret, first, last, base, state, pval);
6992 /* ?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 */
6993 /* ?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 */
6994 #if _MSVCP_VER <= 100
6995 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
6996 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
6997 (this, ret, first, last, base, state, pval))
6998 #else
6999 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
7000 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
7001 (this, ret, first, last, base, state, pval))
7002 #endif
7003 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint,36)
7004 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint(const num_get *this, istreambuf_iterator_char *ret,
7005 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
7007 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7008 return num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
7011 /* ?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 */
7012 /* ?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 */
7013 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint,36)
7014 istreambuf_iterator_char *__thiscall num_get_char_get_uint(const num_get *this, istreambuf_iterator_char *ret,
7015 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
7017 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7018 return call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval);
7021 /* ?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 */
7022 /* ?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 */
7023 #if _MSVCP_VER <= 100
7024 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
7025 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
7026 (this, ret, first, last, base, state, pval))
7027 #else
7028 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_char*, \
7029 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
7030 (this, ret, first, last, base, state, pval))
7031 #endif
7032 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ushort,36)
7033 istreambuf_iterator_char *__thiscall num_get_char_do_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
7034 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
7036 ULONG v;
7037 char tmp[25], *beg, *end;
7038 int err, b;
7040 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7042 b = num_get_char__Getifld(this, tmp,
7043 &first, &last, base->fmtfl, IOS_LOCALE(base));
7044 beg = tmp + (tmp[0]=='-' ? 1 : 0);
7045 v = _Stoulx(beg, &end, b, &err);
7047 if(v != (ULONG)((unsigned short)v))
7048 *state |= IOSTATE_failbit;
7049 else if(end!=beg && !err)
7050 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
7051 else
7052 *state |= IOSTATE_failbit;
7054 if(!first.strbuf)
7055 *state |= IOSTATE_eofbit;
7057 *ret = first;
7058 return ret;
7061 /* ?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 */
7062 /* ?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 */
7063 DEFINE_THISCALL_WRAPPER(num_get_char_get_ushort,36)
7064 istreambuf_iterator_char *__thiscall num_get_char_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
7065 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
7067 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7068 return call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval);
7071 /* ?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 */
7072 /* ?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 */
7073 #if _MSVCP_VER <= 100
7074 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
7075 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, MSVCP_bool*), \
7076 (this, ret, first, last, base, state, pval))
7077 #else
7078 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_char*, \
7079 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, MSVCP_bool*), \
7080 (this, ret, first, last, base, state, pval))
7081 #endif
7082 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_bool,36)
7083 istreambuf_iterator_char *__thiscall num_get_char_do_get_bool(const num_get *this, istreambuf_iterator_char *ret,
7084 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, MSVCP_bool *pval)
7086 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7088 if(base->fmtfl & FMTFLAG_boolalpha) {
7089 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7090 basic_string_char false_bstr, true_bstr;
7091 const char *pfalse, *ptrue;
7093 numpunct_char_falsename(numpunct, &false_bstr);
7094 numpunct_char_truename(numpunct, &true_bstr);
7095 pfalse = MSVCP_basic_string_char_c_str(&false_bstr);
7096 ptrue = MSVCP_basic_string_char_c_str(&true_bstr);
7098 for(istreambuf_iterator_char_val(&first); first.strbuf;) {
7099 if(pfalse && *pfalse && first.val!=*pfalse)
7100 pfalse = NULL;
7101 if(ptrue && *ptrue && first.val!=*ptrue)
7102 ptrue = NULL;
7104 if(pfalse && *pfalse && ptrue && !*ptrue)
7105 ptrue = NULL;
7106 if(ptrue && *ptrue && pfalse && !*pfalse)
7107 pfalse = NULL;
7109 if(pfalse)
7110 pfalse++;
7111 if(ptrue)
7112 ptrue++;
7114 if(pfalse || ptrue)
7115 istreambuf_iterator_char_inc(&first);
7117 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
7118 break;
7121 if(ptrue)
7122 *pval = TRUE;
7123 else if(pfalse)
7124 *pval = FALSE;
7125 else
7126 *state |= IOSTATE_failbit;
7128 MSVCP_basic_string_char_dtor(&false_bstr);
7129 MSVCP_basic_string_char_dtor(&true_bstr);
7130 }else {
7131 char tmp[25], *end;
7132 int err;
7133 LONG v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
7134 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
7136 if(end!=tmp && err==0 && (v==0 || v==1))
7137 *pval = v;
7138 else
7139 *state |= IOSTATE_failbit;
7142 if(!first.strbuf)
7143 *state |= IOSTATE_eofbit;
7144 memcpy(ret, &first, sizeof(first));
7145 return ret;
7148 /* ?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 */
7149 /* ?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 */
7150 DEFINE_THISCALL_WRAPPER(num_get_char_get_bool,36)
7151 istreambuf_iterator_char *__thiscall num_get_char_get_bool(const num_get *this, istreambuf_iterator_char *ret,
7152 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, MSVCP_bool *pval)
7154 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7155 return call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval);
7158 /* ?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
7159 locale_id num_put_char_id = {0};
7161 /* num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
7162 extern const vtable_ptr MSVCP_num_put_char_vtable;
7164 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7165 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7166 DEFINE_THISCALL_WRAPPER(num_put_char__Init, 8)
7167 void __thiscall num_put_char__Init(num_put *this, const _Locinfo *locinfo)
7169 TRACE("(%p %p)\n", this, locinfo);
7170 #if _MSVCP_VER < 110
7171 _Locinfo__Getcvt(locinfo, &this->cvt);
7172 #endif
7175 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7176 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7177 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_locinfo, 12)
7178 num_put* __thiscall num_put_char_ctor_locinfo(num_put *this, const _Locinfo *locinfo, MSVCP_size_t refs)
7180 TRACE("(%p %p %ld)\n", this, locinfo, refs);
7182 locale_facet_ctor_refs(&this->facet, refs);
7183 this->facet.vtable = &MSVCP_num_put_char_vtable;
7185 num_put_char__Init(this, locinfo);
7186 return this;
7189 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
7190 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
7191 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_refs, 8)
7192 num_put* __thiscall num_put_char_ctor_refs(num_put *this, MSVCP_size_t refs)
7194 _Locinfo locinfo;
7196 TRACE("(%p %lu)\n", this, refs);
7198 _Locinfo_ctor(&locinfo);
7199 num_put_char_ctor_locinfo(this, &locinfo, refs);
7200 _Locinfo_dtor(&locinfo);
7201 return this;
7204 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
7205 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
7206 DEFINE_THISCALL_WRAPPER(num_put_char_ctor, 4)
7207 num_put* __thiscall num_put_char_ctor(num_put *this)
7209 return num_put_char_ctor_refs(this, 0);
7212 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
7213 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
7214 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
7215 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
7216 DEFINE_THISCALL_WRAPPER(num_put_char_dtor, 4)
7217 void __thiscall num_put_char_dtor(num_put *this)
7219 TRACE("(%p)\n", this);
7220 locale_facet_dtor(&this->facet);
7223 DEFINE_THISCALL_WRAPPER(num_put_char_vector_dtor, 8)
7224 num_put* __thiscall num_put_char_vector_dtor(num_put *this, unsigned int flags)
7226 TRACE("(%p %x)\n", this, flags);
7227 if(flags & 2) {
7228 /* we have an array, with the number of elements stored before the first object */
7229 INT_PTR i, *ptr = (INT_PTR *)this-1;
7231 for(i=*ptr-1; i>=0; i--)
7232 num_put_char_dtor(this+i);
7233 MSVCRT_operator_delete(ptr);
7234 } else {
7235 num_put_char_dtor(this);
7236 if(flags & 1)
7237 MSVCRT_operator_delete(this);
7240 return this;
7243 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7244 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7245 MSVCP_size_t __cdecl num_put_char__Getcat(const locale_facet **facet, const locale *loc)
7247 TRACE("(%p %p)\n", facet, loc);
7249 if(facet && !*facet) {
7250 _Locinfo locinfo;
7252 *facet = MSVCRT_operator_new(sizeof(num_put));
7253 if(!*facet) {
7254 ERR("Out of memory\n");
7255 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
7256 return 0;
7259 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7260 num_put_char_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7261 _Locinfo_dtor(&locinfo);
7264 return LC_NUMERIC;
7267 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7268 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7269 MSVCP_size_t __cdecl num_put_char__Getcat_old(const locale_facet **facet)
7271 return num_put_char__Getcat(facet, locale_classic());
7274 num_put* num_put_char_use_facet(const locale *loc)
7276 static num_put *obj = NULL;
7278 _Lockit lock;
7279 const locale_facet *fac;
7281 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
7282 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_char_id));
7283 if(fac) {
7284 _Lockit_dtor(&lock);
7285 return (num_put*)fac;
7288 if(obj) {
7289 _Lockit_dtor(&lock);
7290 return obj;
7293 num_put_char__Getcat(&fac, loc);
7294 obj = (num_put*)fac;
7295 call_locale_facet__Incref(&obj->facet);
7296 locale_facet_register(&obj->facet);
7297 _Lockit_dtor(&lock);
7299 return obj;
7302 /* ?_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 */
7303 /* ?_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 */
7304 ostreambuf_iterator_char* __cdecl num_put_char__Put(const num_put *this, ostreambuf_iterator_char *ret,
7305 ostreambuf_iterator_char dest, const char *ptr, MSVCP_size_t count)
7307 TRACE("(%p %p %p %ld)\n", this, ret, ptr, count);
7309 for(; count>0; count--)
7310 ostreambuf_iterator_char_put(&dest, *ptr++);
7312 *ret = dest;
7313 return ret;
7316 /* ?_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 */
7317 /* ?_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 */
7318 ostreambuf_iterator_char* __cdecl num_put_char__Putc(const num_put *this, ostreambuf_iterator_char *ret,
7319 ostreambuf_iterator_char dest, const char *ptr, MSVCP_size_t count)
7321 TRACE("(%p %p %p %ld)\n", this, ret, ptr, count);
7323 for(; count>0; count--)
7324 ostreambuf_iterator_char_put(&dest, *ptr++);
7326 *ret = dest;
7327 return ret;
7330 /* ?_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 */
7331 /* ?_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 */
7332 ostreambuf_iterator_char* __cdecl num_put_char__Putgrouped(const num_put *this, ostreambuf_iterator_char *ret,
7333 ostreambuf_iterator_char dest, const char *ptr, MSVCP_size_t count, char delim)
7335 FIXME("(%p %p %p %ld %d) stub\n", this, ret, ptr, count, delim);
7336 return NULL;
7339 /* ?_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 */
7340 /* ?_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 */
7341 ostreambuf_iterator_char* __cdecl num_put_char__Rep(const num_put *this, ostreambuf_iterator_char *ret,
7342 ostreambuf_iterator_char dest, char c, MSVCP_size_t count)
7344 TRACE("(%p %p %d %ld)\n", this, ret, c, count);
7346 for(; count>0; count--)
7347 ostreambuf_iterator_char_put(&dest, c);
7349 *ret = dest;
7350 return ret;
7353 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADDH@Z */
7354 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADDH@Z */
7355 char* __cdecl num_put_char__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
7357 int type = fmtfl & FMTFLAG_floatfield;
7358 char *p = fmt;
7360 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
7362 *p++ = '%';
7363 if(fmtfl & FMTFLAG_showpos)
7364 *p++ = '+';
7365 if(fmtfl & FMTFLAG_showpoint)
7366 *p++ = '#';
7367 *p++ = '.';
7368 *p++ = '*';
7369 if(spec)
7370 *p++ = spec;
7372 if(type == FMTFLAG_fixed)
7373 *p++ = 'f';
7374 else if(type == FMTFLAG_scientific)
7375 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
7376 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
7377 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
7378 else
7379 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
7381 *p++ = '\0';
7382 return fmt;
7385 /* ?_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 */
7386 /* ?_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 */
7387 ostreambuf_iterator_char* __cdecl num_put_char__Fput(const num_put *this, ostreambuf_iterator_char *ret,
7388 ostreambuf_iterator_char dest, ios_base *base, char fill, const char *buf, MSVCP_size_t bef_point,
7389 MSVCP_size_t aft_point, MSVCP_size_t trailing, MSVCP_size_t count)
7391 FIXME("(%p %p %p %d %p %ld %ld %ld %ld) stub\n", this, ret, base,
7392 fill, buf, bef_point, aft_point, trailing, count);
7393 return NULL;
7396 /* TODO: This function should be removed when num_put_char__Fput is implemented */
7397 static ostreambuf_iterator_char* num_put_char_fput(const num_put *this, ostreambuf_iterator_char *ret,
7398 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, MSVCP_size_t count)
7400 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7401 basic_string_char grouping_bstr;
7402 const char *grouping;
7403 char *p, sep = 0, dec_point = *localeconv()->decimal_point;
7404 int cur_group = 0, group_size = 0;
7405 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7406 MSVCP_size_t pad;
7408 TRACE("(%p %p %p %d %s %ld)\n", this, ret, base, fill, buf, count);
7410 /* Change decimal point */
7411 for(p=buf; p<buf+count; p++) {
7412 if(*p == dec_point) {
7413 *p = numpunct_char_decimal_point(numpunct);
7414 break;
7417 p--;
7419 /* Add separators to number */
7420 numpunct_char_grouping(numpunct, &grouping_bstr);
7421 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7422 #if _MSVCP_VER >= 70
7423 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7424 #endif
7426 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7427 group_size++;
7428 if(group_size == grouping[cur_group]) {
7429 group_size = 0;
7430 if(grouping[cur_group+1])
7431 cur_group++;
7433 memmove(p+1, p, buf+count-p);
7434 *p = sep;
7435 count++;
7438 MSVCP_basic_string_char_dtor(&grouping_bstr);
7440 /* Display number with padding */
7441 if(count >= base->wide)
7442 pad = 0;
7443 else
7444 pad = base->wide-count;
7445 base->wide = 0;
7447 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7448 num_put_char__Putc(this, &dest, dest, buf, 1);
7449 buf++;
7451 if(adjustfield != FMTFLAG_left) {
7452 num_put_char__Rep(this, ret, dest, fill, pad);
7453 pad = 0;
7455 num_put_char__Putc(this, &dest, dest, buf, count);
7456 return num_put_char__Rep(this, ret, dest, fill, pad);
7459 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADPBDH@Z */
7460 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
7461 char* __cdecl num_put_char__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
7463 int base = fmtfl & FMTFLAG_basefield;
7464 char *p = fmt;
7466 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
7468 *p++ = '%';
7469 if(fmtfl & FMTFLAG_showpos)
7470 *p++ = '+';
7471 if(fmtfl & FMTFLAG_showbase)
7472 *p++ = '#';
7474 *p++ = *spec++;
7475 if(*spec == 'l')
7476 *p++ = *spec++;
7478 if(base == FMTFLAG_oct)
7479 *p++ = 'o';
7480 else if(base == FMTFLAG_hex)
7481 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
7482 else
7483 *p++ = *spec;
7485 *p++ = '\0';
7486 return fmt;
7489 /* ?_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 */
7490 /* ?_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 */
7491 ostreambuf_iterator_char* __cdecl num_put_char__Iput(const num_put *this, ostreambuf_iterator_char *ret,
7492 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, MSVCP_size_t count)
7494 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7495 basic_string_char grouping_bstr;
7496 const char *grouping;
7497 char *p, sep = 0;
7498 int cur_group = 0, group_size = 0;
7499 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7500 MSVCP_size_t pad;
7502 TRACE("(%p %p %p %d %s %ld)\n", this, ret, base, fill, buf, count);
7504 /* Add separators to number */
7505 numpunct_char_grouping(numpunct, &grouping_bstr);
7506 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7507 #if _MSVCP_VER >= 70
7508 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7509 #endif
7511 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7512 group_size++;
7513 if(group_size == grouping[cur_group]) {
7514 group_size = 0;
7515 if(grouping[cur_group+1])
7516 cur_group++;
7518 memmove(p+1, p, buf+count-p);
7519 *p = sep;
7520 count++;
7523 MSVCP_basic_string_char_dtor(&grouping_bstr);
7525 /* Display number with padding */
7526 if(count >= base->wide)
7527 pad = 0;
7528 else
7529 pad = base->wide-count;
7530 base->wide = 0;
7532 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7533 num_put_char__Putc(this, &dest, dest, buf, 1);
7534 buf++;
7535 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
7536 num_put_char__Putc(this, &dest, dest, buf, 2);
7537 buf += 2;
7539 if(adjustfield != FMTFLAG_left) {
7540 num_put_char__Rep(this, ret, dest, fill, pad);
7541 pad = 0;
7543 num_put_char__Putc(this, &dest, dest, buf, count);
7544 return num_put_char__Rep(this, ret, dest, fill, pad);
7547 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z */
7548 /* ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z */
7549 #if _MSVCP_VER <= 100
7550 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7551 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7552 (this, ret, dest, base, fill, v))
7553 #else
7554 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_char*, \
7555 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7556 (this, ret, dest, base, fill, v))
7557 #endif
7558 #if _MSVCP_VER != 80
7559 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 28)
7560 #else
7561 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 32)
7562 #endif
7563 ostreambuf_iterator_char* __thiscall num_put_char_do_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7564 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7566 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7567 char fmt[7]; /* strlen("%+#lld")+1 */
7569 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7571 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7572 sprintf(tmp, num_put_char__Ifmt(this, fmt, "ld", base->fmtfl), v));
7575 /* ?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 */
7576 /* ?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 */
7577 #if _MSVCP_VER != 80
7578 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 28)
7579 #else
7580 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 32)
7581 #endif
7582 ostreambuf_iterator_char* __thiscall num_put_char_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7583 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7585 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7586 return call_num_put_char_do_put_long(this, ret, dest, base, fill, v);
7589 /* ?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 */
7590 /* ?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 */
7591 #if _MSVCP_VER <= 100
7592 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7593 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7594 (this, ret, dest, base, fill, v))
7595 #else
7596 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7597 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7598 (this, ret, dest, base, fill, v))
7599 #endif
7600 #if _MSVCP_VER != 80
7601 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 28)
7602 #else
7603 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 32)
7604 #endif
7605 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7606 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7608 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7609 char fmt[7]; /* strlen("%+#lld")+1 */
7611 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7613 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7614 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lu", base->fmtfl), v));
7617 /* ?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 */
7618 /* ?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 */
7619 #if _MSVCP_VER != 80
7620 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 28)
7621 #else
7622 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 32)
7623 #endif
7624 ostreambuf_iterator_char* __thiscall num_put_char_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7625 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7627 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7628 return call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v);
7631 static inline unsigned get_precision(const ios_base *base)
7633 streamsize ret = base->prec <= 0 && !(base->fmtfl & FMTFLAG_fixed) ? 6 : base->prec;
7634 if(ret > UINT_MAX)
7635 ret = UINT_MAX;
7636 return ret;
7639 /* ?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 */
7640 /* ?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 */
7641 /* ?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 */
7642 /* ?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 */
7643 #if _MSVCP_VER <= 100
7644 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7645 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7646 (this, ret, dest, base, fill, v))
7647 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_char*, \
7648 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7649 (this, ret, dest, base, fill, v))
7650 #else
7651 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7652 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7653 (this, ret, dest, base, fill, v))
7654 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7655 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7656 (this, ret, dest, base, fill, v))
7657 #endif
7658 #if _MSVCP_VER != 80
7659 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 32)
7660 #else
7661 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 36)
7662 #endif
7663 ostreambuf_iterator_char* __thiscall num_put_char_do_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7664 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7666 char *tmp;
7667 char fmt[8]; /* strlen("%+#.*lg")+1 */
7668 int size;
7669 unsigned prec;
7671 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7673 num_put_char__Ffmt(this, fmt, '\0', base->fmtfl);
7674 prec = get_precision(base);
7675 size = _scprintf(fmt, prec, v);
7677 /* TODO: don't use dynamic allocation */
7678 tmp = MSVCRT_operator_new(size*2);
7679 if(!tmp) {
7680 ERR("Out of memory\n");
7681 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
7683 num_put_char_fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v));
7684 MSVCRT_operator_delete(tmp);
7685 return ret;
7688 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z */
7689 /* ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z */
7690 #if _MSVCP_VER != 80
7691 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 32)
7692 #else
7693 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 36)
7694 #endif
7695 ostreambuf_iterator_char* __thiscall num_put_char_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7696 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7698 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7699 return call_num_put_char_do_put_double(this, ret, dest, base, fill, v);
7702 /* ?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 */
7703 /* ?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 */
7704 #if _MSVCP_VER != 80
7705 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 32)
7706 #else
7707 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 36)
7708 #endif
7709 ostreambuf_iterator_char* __thiscall num_put_char_put_ldouble(const num_put *this, ostreambuf_iterator_char *ret,
7710 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7712 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7713 return call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v);
7716 /* ?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 */
7717 /* ?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 */
7718 #if _MSVCP_VER <= 100
7719 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
7720 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7721 (this, ret, dest, base, fill, v))
7722 #else
7723 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7724 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7725 (this, ret, dest, base, fill, v))
7726 #endif
7727 #if _MSVCP_VER != 80
7728 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 28)
7729 #else
7730 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 32)
7731 #endif
7732 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7733 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7735 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
7737 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7739 return num_put_char__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
7742 /* ?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 */
7743 /* ?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 */
7744 #if _MSVCP_VER != 80
7745 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 28)
7746 #else
7747 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 32)
7748 #endif
7749 ostreambuf_iterator_char* __thiscall num_put_char_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7750 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7752 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7753 return call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v);
7756 /* ?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 */
7757 /* ?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 */
7758 #if _MSVCP_VER <= 100
7759 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7760 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7761 (this, ret, dest, base, fill, v))
7762 #else
7763 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7764 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7765 (this, ret, dest, base, fill, v))
7766 #endif
7767 #if _MSVCP_VER != 80
7768 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 32)
7769 #else
7770 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 36)
7771 #endif
7772 ostreambuf_iterator_char* __thiscall num_put_char_do_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7773 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7775 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7776 char fmt[7]; /* strlen("%+#lld")+1 */
7778 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7780 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7781 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lld", base->fmtfl), v));
7784 /* ?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 */
7785 /* ?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 */
7786 #if _MSVCP_VER != 80
7787 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 32)
7788 #else
7789 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 36)
7790 #endif
7791 ostreambuf_iterator_char* __thiscall num_put_char_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7792 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7794 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7795 return call_num_put_char_do_put_int64(this, ret, dest, base, fill, v);
7798 /* ?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 */
7799 /* ?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 */
7800 #if _MSVCP_VER <= 100
7801 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7802 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7803 (this, ret, dest, base, fill, v))
7804 #else
7805 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7806 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7807 (this, ret, dest, base, fill, v))
7808 #endif
7809 #if _MSVCP_VER != 80
7810 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 32)
7811 #else
7812 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 36)
7813 #endif
7814 ostreambuf_iterator_char* __thiscall num_put_char_do_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7815 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7817 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7818 char fmt[7]; /* strlen("%+#lld")+1 */
7820 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7822 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7823 sprintf(tmp, num_put_char__Ifmt(this, fmt, "llu", base->fmtfl), v));
7826 /* ?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 */
7827 /* ?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 */
7828 #if _MSVCP_VER != 80
7829 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 32)
7830 #else
7831 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 36)
7832 #endif
7833 ostreambuf_iterator_char* __thiscall num_put_char_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7834 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7836 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7837 return call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v);
7840 /* ?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 */
7841 /* ?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 */
7842 #if _MSVCP_VER <= 100
7843 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7844 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, MSVCP_bool), \
7845 (this, ret, dest, base, fill, v))
7846 #else
7847 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_char*, \
7848 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, MSVCP_bool), \
7849 (this, ret, dest, base, fill, v))
7850 #endif
7851 #if _MSVCP_VER != 80
7852 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 28)
7853 #else
7854 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 32)
7855 #endif
7856 ostreambuf_iterator_char* __thiscall num_put_char_do_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7857 ostreambuf_iterator_char dest, ios_base *base, char fill, MSVCP_bool v)
7859 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7861 if(base->fmtfl & FMTFLAG_boolalpha) {
7862 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7863 basic_string_char str;
7864 MSVCP_size_t pad, len;
7866 if(v)
7867 numpunct_char_truename(numpunct, &str);
7868 else
7869 numpunct_char_falsename(numpunct, &str);
7871 len = MSVCP_basic_string_char_length(&str);
7872 pad = (len>base->wide ? 0 : base->wide-len);
7873 base->wide = 0;
7875 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
7876 num_put_char__Rep(this, &dest, dest, fill, pad);
7877 pad = 0;
7879 num_put_char__Putc(this, &dest, dest, MSVCP_basic_string_char_c_str(&str), len);
7880 MSVCP_basic_string_char_dtor(&str);
7881 return num_put_char__Rep(this, ret, dest, fill, pad);
7884 return num_put_char_put_long(this, ret, dest, base, fill, v);
7887 /* ?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 */
7888 /* ?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 */
7889 #if _MSVCP_VER != 80
7890 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 28)
7891 #else
7892 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 32)
7893 #endif
7894 ostreambuf_iterator_char* __thiscall num_put_char_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7895 ostreambuf_iterator_char dest, ios_base *base, char fill, MSVCP_bool v)
7897 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7898 return call_num_put_char_do_put_bool(this, ret, dest, base, fill, v);
7901 /* ?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
7902 locale_id num_put_wchar_id = {0};
7903 /* ?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
7904 locale_id num_put_short_id = {0};
7906 /* num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
7907 extern const vtable_ptr MSVCP_num_put_wchar_vtable;
7908 /* num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
7909 extern const vtable_ptr MSVCP_num_put_short_vtable;
7911 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7912 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7913 DEFINE_THISCALL_WRAPPER(num_put_wchar__Init, 8)
7914 void __thiscall num_put_wchar__Init(num_put *this, const _Locinfo *locinfo)
7916 TRACE("(%p %p)\n", this, locinfo);
7917 #if _MSVCP_VER < 110
7918 _Locinfo__Getcvt(locinfo, &this->cvt);
7919 #endif
7922 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7923 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7924 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_locinfo, 12)
7925 num_put* __thiscall num_put_wchar_ctor_locinfo(num_put *this, const _Locinfo *locinfo, MSVCP_size_t refs)
7927 TRACE("(%p %p %ld)\n", this, locinfo, refs);
7929 locale_facet_ctor_refs(&this->facet, refs);
7930 this->facet.vtable = &MSVCP_num_put_wchar_vtable;
7932 num_put_wchar__Init(this, locinfo);
7933 return this;
7936 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7937 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7938 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_locinfo, 12)
7939 num_put* __thiscall num_put_short_ctor_locinfo(num_put *this, const _Locinfo *locinfo, MSVCP_size_t refs)
7941 num_put_wchar_ctor_locinfo(this, locinfo, refs);
7942 this->facet.vtable = &MSVCP_num_put_short_vtable;
7943 return this;
7946 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
7947 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
7948 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_refs, 8)
7949 num_put* __thiscall num_put_wchar_ctor_refs(num_put *this, MSVCP_size_t refs)
7951 _Locinfo locinfo;
7953 TRACE("(%p %lu)\n", this, refs);
7955 _Locinfo_ctor(&locinfo);
7956 num_put_wchar_ctor_locinfo(this, &locinfo, refs);
7957 _Locinfo_dtor(&locinfo);
7958 return this;
7961 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
7962 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
7963 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_refs, 8)
7964 num_put* __thiscall num_put_short_ctor_refs(num_put *this, MSVCP_size_t refs)
7966 num_put_wchar_ctor_refs(this, refs);
7967 this->facet.vtable = &MSVCP_num_put_short_vtable;
7968 return this;
7971 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
7972 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
7973 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor, 4)
7974 num_put* __thiscall num_put_wchar_ctor(num_put *this)
7976 return num_put_wchar_ctor_refs(this, 0);
7979 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
7980 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
7981 DEFINE_THISCALL_WRAPPER(num_put_short_ctor, 4)
7982 num_put* __thiscall num_put_short_ctor(num_put *this)
7984 return num_put_short_ctor_refs(this, 0);
7987 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
7988 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
7989 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
7990 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
7991 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
7992 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
7993 DEFINE_THISCALL_WRAPPER(num_put_wchar_dtor, 4)
7994 void __thiscall num_put_wchar_dtor(num_put *this)
7996 TRACE("(%p)\n", this);
7997 locale_facet_dtor(&this->facet);
8000 DEFINE_THISCALL_WRAPPER(num_put_wchar_vector_dtor, 8)
8001 num_put* __thiscall num_put_wchar_vector_dtor(num_put *this, unsigned int flags)
8003 TRACE("(%p %x)\n", this, flags);
8004 if(flags & 2) {
8005 /* we have an array, with the number of elements stored before the first object */
8006 INT_PTR i, *ptr = (INT_PTR *)this-1;
8008 for(i=*ptr-1; i>=0; i--)
8009 num_put_wchar_dtor(this+i);
8010 MSVCRT_operator_delete(ptr);
8011 } else {
8012 num_put_wchar_dtor(this);
8013 if(flags & 1)
8014 MSVCRT_operator_delete(this);
8017 return this;
8020 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
8021 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
8022 MSVCP_size_t __cdecl num_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
8024 TRACE("(%p %p)\n", facet, loc);
8026 if(facet && !*facet) {
8027 _Locinfo locinfo;
8029 *facet = MSVCRT_operator_new(sizeof(num_put));
8030 if(!*facet) {
8031 ERR("Out of memory\n");
8032 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8033 return 0;
8036 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
8037 num_put_wchar_ctor_locinfo((num_put*)*facet, &locinfo, 0);
8038 _Locinfo_dtor(&locinfo);
8041 return LC_NUMERIC;
8044 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
8045 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
8046 MSVCP_size_t __cdecl num_put_wchar__Getcat_old(const locale_facet **facet)
8048 return num_put_wchar__Getcat(facet, locale_classic());
8051 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
8052 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
8053 MSVCP_size_t __cdecl num_put_short__Getcat(const locale_facet **facet, const locale *loc)
8055 TRACE("(%p %p)\n", facet, loc);
8057 if(facet && !*facet) {
8058 _Locinfo locinfo;
8060 *facet = MSVCRT_operator_new(sizeof(num_put));
8061 if(!*facet) {
8062 ERR("Out of memory\n");
8063 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8064 return 0;
8067 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
8068 num_put_short_ctor_locinfo((num_put*)*facet, &locinfo, 0);
8069 _Locinfo_dtor(&locinfo);
8072 return LC_NUMERIC;
8075 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
8076 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
8077 MSVCP_size_t __cdecl num_put_short__Getcat_old(const locale_facet **facet)
8079 return num_put_short__Getcat(facet, locale_classic());
8082 num_put* num_put_wchar_use_facet(const locale *loc)
8084 static num_put *obj = NULL;
8086 _Lockit lock;
8087 const locale_facet *fac;
8089 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8090 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_wchar_id));
8091 if(fac) {
8092 _Lockit_dtor(&lock);
8093 return (num_put*)fac;
8096 if(obj) {
8097 _Lockit_dtor(&lock);
8098 return obj;
8101 num_put_wchar__Getcat(&fac, loc);
8102 obj = (num_put*)fac;
8103 call_locale_facet__Incref(&obj->facet);
8104 locale_facet_register(&obj->facet);
8105 _Lockit_dtor(&lock);
8107 return obj;
8110 num_put* num_put_short_use_facet(const locale *loc)
8112 static num_put *obj = NULL;
8114 _Lockit lock;
8115 const locale_facet *fac;
8117 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8118 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_short_id));
8119 if(fac) {
8120 _Lockit_dtor(&lock);
8121 return (num_put*)fac;
8124 if(obj) {
8125 _Lockit_dtor(&lock);
8126 return obj;
8129 num_put_short__Getcat(&fac, loc);
8130 obj = (num_put*)fac;
8131 call_locale_facet__Incref(&obj->facet);
8132 locale_facet_register(&obj->facet);
8133 _Lockit_dtor(&lock);
8135 return obj;
8138 /* ?_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 */
8139 /* ?_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 */
8140 /* ?_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 */
8141 /* ?_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 */
8142 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Put(const num_put *this, ostreambuf_iterator_wchar *ret,
8143 ostreambuf_iterator_wchar dest, const wchar_t *ptr, MSVCP_size_t count)
8145 TRACE("(%p %p %s %ld)\n", this, ret, debugstr_wn(ptr, count), count);
8147 for(; count>0; count--)
8148 ostreambuf_iterator_wchar_put(&dest, *ptr++);
8150 *ret = dest;
8151 return ret;
8154 #if _MSVCP_VER < 110
8155 /* ?_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 */
8156 /* ?_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 */
8157 /* ?_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 */
8158 /* ?_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 */
8159 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putc(const num_put *this, ostreambuf_iterator_wchar *ret,
8160 ostreambuf_iterator_wchar dest, const char *ptr, MSVCP_size_t count)
8162 _Mbstatet state;
8163 wchar_t ch;
8165 TRACE("(%p %p %s %ld)\n", this, ret, debugstr_an(ptr, count), count);
8167 memset(&state, 0, sizeof(state));
8168 for(; count>0; count--) {
8169 if(_Mbrtowc(&ch, ptr++, 1, &state, &this->cvt) == 1)
8170 ostreambuf_iterator_wchar_put(&dest, ch);
8173 *ret = dest;
8174 return ret;
8176 #endif
8178 /* ?_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 */
8179 /* ?_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 */
8180 /* ?_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 */
8181 /* ?_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 */
8182 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putgrouped(const num_put *this, ostreambuf_iterator_wchar *ret,
8183 ostreambuf_iterator_wchar dest, const char *ptr, MSVCP_size_t count, wchar_t delim)
8185 FIXME("(%p %p %p %ld %d) stub\n", this, ret, ptr, count, delim);
8186 return NULL;
8189 /* ?_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 */
8190 /* ?_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 */
8191 /* ?_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 */
8192 /* ?_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 */
8193 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Rep(const num_put *this, ostreambuf_iterator_wchar *ret,
8194 ostreambuf_iterator_wchar dest, wchar_t c, MSVCP_size_t count)
8196 TRACE("(%p %p %d %ld)\n", this, ret, c, count);
8198 for(; count>0; count--)
8199 ostreambuf_iterator_wchar_put(&dest, c);
8201 *ret = dest;
8202 return ret;
8205 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADDH@Z */
8206 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8207 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADDH@Z */
8208 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8209 char* __cdecl num_put_wchar__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
8211 int type = fmtfl & FMTFLAG_floatfield;
8212 char *p = fmt;
8214 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
8216 *p++ = '%';
8217 if(fmtfl & FMTFLAG_showpos)
8218 *p++ = '+';
8219 if(fmtfl & FMTFLAG_showbase)
8220 *p++ = '#';
8221 *p++ = '.';
8222 *p++ = '*';
8223 if(spec)
8224 *p++ = spec;
8226 if(type == FMTFLAG_fixed)
8227 *p++ = 'f';
8228 else if(type == FMTFLAG_scientific)
8229 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
8230 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
8231 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
8232 else
8233 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
8235 *p++ = '\0';
8236 return fmt;
8239 /* ?_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 */
8240 /* ?_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 */
8241 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8242 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, MSVCP_size_t bef_point,
8243 MSVCP_size_t aft_point, MSVCP_size_t trailing, MSVCP_size_t count)
8245 FIXME("(%p %p %p %d %p %ld %ld %ld %ld) stub\n", this, ret, base,
8246 fill, buf, bef_point, aft_point, trailing, count);
8247 return NULL;
8250 /* ?_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 */
8251 /* ?_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 */
8252 ostreambuf_iterator_wchar* __cdecl num_put_short__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8253 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, MSVCP_size_t bef_point,
8254 MSVCP_size_t aft_point, MSVCP_size_t trailing, MSVCP_size_t count)
8256 FIXME("(%p %p %p %d %p %ld %ld %ld %ld) stub\n", this, ret, base,
8257 fill, buf, bef_point, aft_point, trailing, count);
8258 return NULL;
8261 #if _MSVCP_VER < 110
8262 static void num_put_wchar_wide_put(const num_put *this,
8263 ostreambuf_iterator_wchar *dest, ios_base *base,
8264 const char *buf, MSVCP_size_t count)
8266 num_put_wchar__Putc(this, dest, *dest, buf, count);
8268 #else
8269 static void num_put_wchar_wide_put(const num_put *this,
8270 ostreambuf_iterator_wchar *dest, ios_base *base,
8271 const char *buf, MSVCP_size_t count)
8273 ctype_wchar *ctype;
8274 MSVCP_size_t i;
8276 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
8277 for(i=0; i<count; i++)
8278 ostreambuf_iterator_wchar_put(dest, ctype_wchar_widen_ch(ctype, buf[i]));
8280 #endif
8282 /* TODO: This function should be removed when num_put_wchar__Fput is implemented */
8283 static ostreambuf_iterator_wchar* num_put__fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8284 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8285 MSVCP_size_t count, numpunct_wchar *numpunct)
8287 basic_string_char grouping_bstr;
8288 const char *grouping;
8289 char *p, dec_point = *localeconv()->decimal_point;
8290 wchar_t sep = 0;
8291 int cur_group = 0, group_size = 0;
8292 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8293 MSVCP_size_t i, pad;
8295 TRACE("(%p %p %p %d %s %ld)\n", this, ret, base, fill, buf, count);
8297 for(p=buf; p<buf+count; p++) {
8298 if(*p == dec_point)
8299 break;
8301 p--;
8303 /* Add separators to number */
8304 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8305 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8306 #if _MSVCP_VER >= 70
8307 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
8308 #endif
8310 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8311 group_size++;
8312 if(group_size == grouping[cur_group]) {
8313 group_size = 0;
8314 if(grouping[cur_group+1])
8315 cur_group++;
8317 memmove(p+1, p, buf+count-p);
8318 *p = '\0'; /* mark thousands separator positions */
8319 count++;
8322 MSVCP_basic_string_char_dtor(&grouping_bstr);
8324 /* Display number with padding */
8325 if(count >= base->wide)
8326 pad = 0;
8327 else
8328 pad = base->wide-count;
8329 base->wide = 0;
8331 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8332 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8333 buf++;
8335 if(adjustfield != FMTFLAG_left) {
8336 num_put_wchar__Rep(this, ret, dest, fill, pad);
8337 pad = 0;
8340 for(i=0; i<count; i++) {
8341 if(buf[i] == dec_point)
8342 num_put_wchar__Rep(this, &dest, dest, numpunct_wchar_decimal_point(numpunct), 1);
8343 else if(!buf[i])
8344 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8345 else
8346 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8349 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8352 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADPBDH@Z */
8353 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8354 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADPBDH@Z */
8355 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8356 char* __cdecl num_put_wchar__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
8358 int base = fmtfl & FMTFLAG_basefield;
8359 char *p = fmt;
8361 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
8363 *p++ = '%';
8364 if(fmtfl & FMTFLAG_showpos)
8365 *p++ = '+';
8366 if(fmtfl & FMTFLAG_showbase)
8367 *p++ = '#';
8369 *p++ = *spec++;
8370 if(*spec == 'l')
8371 *p++ = *spec++;
8373 if(base == FMTFLAG_oct)
8374 *p++ = 'o';
8375 else if(base == FMTFLAG_hex)
8376 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
8377 else
8378 *p++ = *spec;
8380 *p++ = '\0';
8381 return fmt;
8384 static ostreambuf_iterator_wchar* num_put__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8385 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8386 MSVCP_size_t count, numpunct_wchar *numpunct)
8388 basic_string_char grouping_bstr;
8389 const char *grouping;
8390 char *p;
8391 wchar_t sep;
8392 int cur_group = 0, group_size = 0;
8393 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8394 MSVCP_size_t i, pad;
8396 TRACE("(%p %p %p %d %s %ld)\n", this, ret, base, fill, buf, count);
8398 /* Add separators to number */
8399 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8400 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8401 sep = grouping[0] ? numpunct_wchar_thousands_sep(numpunct) : '\0';
8403 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8404 group_size++;
8405 if(group_size == grouping[cur_group]) {
8406 group_size = 0;
8407 if(grouping[cur_group+1])
8408 cur_group++;
8410 memmove(p+1, p, buf+count-p);
8411 *p = '\0'; /* mark thousands separator positions */
8412 count++;
8415 MSVCP_basic_string_char_dtor(&grouping_bstr);
8417 /* Display number with padding */
8418 if(count >= base->wide)
8419 pad = 0;
8420 else
8421 pad = base->wide-count;
8422 base->wide = 0;
8424 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8425 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8426 buf++;
8427 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
8428 num_put_wchar_wide_put(this, &dest, base, buf, 2);
8429 buf += 2;
8431 if(adjustfield != FMTFLAG_left) {
8432 num_put_wchar__Rep(this, ret, dest, fill, pad);
8433 pad = 0;
8436 for(i=0; i<count; i++) {
8437 if(!buf[i])
8438 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8439 else
8440 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8443 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8446 /* ?_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 */
8447 /* ?_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 */
8448 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8449 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, MSVCP_size_t count)
8451 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_wchar_use_facet(IOS_LOCALE(base)));
8454 /* ?_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 */
8455 /* ?_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 */
8456 ostreambuf_iterator_wchar* __cdecl num_put_short__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8457 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, MSVCP_size_t count)
8459 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_short_use_facet(IOS_LOCALE(base)));
8462 /* ?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 */
8463 /* ?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 */
8464 #if _MSVCP_VER <= 100
8465 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8466 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8467 (this, ret, dest, base, fill, v))
8468 #else
8469 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_wchar*, \
8470 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8471 (this, ret, dest, base, fill, v))
8472 #endif
8473 #if _MSVCP_VER != 80
8474 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 28)
8475 #else
8476 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 32)
8477 #endif
8478 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8479 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8481 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8482 char fmt[7]; /* strlen("%+#lld")+1 */
8484 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8486 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8487 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8490 /* ?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 */
8491 /* ?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 */
8492 #if _MSVCP_VER != 80
8493 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 28)
8494 #else
8495 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 32)
8496 #endif
8497 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8498 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8500 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8501 char fmt[7]; /* strlen("%+#lld")+1 */
8503 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8505 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8506 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8509 /* ?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 */
8510 /* ?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 */
8511 /* ?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 */
8512 /* ?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 */
8513 #if _MSVCP_VER != 80
8514 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 28)
8515 #else
8516 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 32)
8517 #endif
8518 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8519 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8521 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8522 return call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v);
8525 /* ?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 */
8526 /* ?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 */
8527 #if _MSVCP_VER <= 100
8528 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8529 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8530 (this, ret, dest, base, fill, v))
8531 #else
8532 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8533 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8534 (this, ret, dest, base, fill, v))
8535 #endif
8536 #if _MSVCP_VER != 80
8537 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 28)
8538 #else
8539 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 32)
8540 #endif
8541 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8542 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8544 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8545 char fmt[7]; /* strlen("%+#lld")+1 */
8547 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8549 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8550 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8553 /* ?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 */
8554 /* ?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 */
8555 #if _MSVCP_VER != 80
8556 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 28)
8557 #else
8558 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 32)
8559 #endif
8560 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8561 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8563 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8564 char fmt[7]; /* strlen("%+#lld")+1 */
8566 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8568 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8569 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8572 /* ?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 */
8573 /* ?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 */
8574 /* ?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 */
8575 /* ?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 */
8576 #if _MSVCP_VER != 80
8577 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 28)
8578 #else
8579 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 32)
8580 #endif
8581 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8582 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8584 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8585 return call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v);
8588 /* ?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 */
8589 /* ?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 */
8590 /* ?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 */
8591 /* ?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 */
8592 #if _MSVCP_VER <= 100
8593 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8594 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8595 (this, ret, dest, base, fill, v))
8596 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_wchar*, \
8597 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8598 (this, ret, dest, base, fill, v))
8599 #else
8600 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8601 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8602 (this, ret, dest, base, fill, v))
8603 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8604 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8605 (this, ret, dest, base, fill, v))
8606 #endif
8607 #if _MSVCP_VER != 80
8608 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 32)
8609 #else
8610 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 36)
8611 #endif
8612 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8613 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8615 char *tmp;
8616 char fmt[8]; /* strlen("%+#.*lg")+1 */
8617 int size;
8618 unsigned prec;
8620 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8622 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8623 prec = get_precision(base);
8624 size = _scprintf(fmt, prec, v);
8626 /* TODO: don't use dynamic allocation */
8627 tmp = MSVCRT_operator_new(size*2);
8628 if(!tmp) {
8629 ERR("Out of memory\n");
8630 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8632 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8633 numpunct_wchar_use_facet(IOS_LOCALE(base)));
8634 MSVCRT_operator_delete(tmp);
8635 return ret;
8638 /* ?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 */
8639 /* ?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 */
8640 /* ?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 */
8641 /* ?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 */
8642 #if _MSVCP_VER != 80
8643 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 32)
8644 #else
8645 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 36)
8646 #endif
8647 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8648 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8650 char *tmp;
8651 char fmt[8]; /* strlen("%+#.*lg")+1 */
8652 int size;
8653 unsigned prec;
8655 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8657 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8658 prec = get_precision(base);
8659 size = _scprintf(fmt, prec, v);
8661 /* TODO: don't use dynamic allocation */
8662 tmp = MSVCRT_operator_new(size*2);
8663 if(!tmp) {
8664 ERR("Out of memory\n");
8665 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8667 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8668 numpunct_short_use_facet(IOS_LOCALE(base)));
8669 MSVCRT_operator_delete(tmp);
8670 return ret;
8673 /* ?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 */
8674 /* ?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 */
8675 /* ?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 */
8676 /* ?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 */
8677 #if _MSVCP_VER != 80
8678 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 32)
8679 #else
8680 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 36)
8681 #endif
8682 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8683 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8685 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8686 return call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v);
8689 /* ?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 */
8690 /* ?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 */
8691 /* ?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 */
8692 /* ?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 */
8693 #if _MSVCP_VER != 80
8694 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 32)
8695 #else
8696 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 36)
8697 #endif
8698 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ldouble(const num_put *this, ostreambuf_iterator_wchar *ret,
8699 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8701 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8702 return call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v);
8705 /* ?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 */
8706 /* ?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 */
8707 #if _MSVCP_VER <= 100
8708 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
8709 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8710 (this, ret, dest, base, fill, v))
8711 #else
8712 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8713 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8714 (this, ret, dest, base, fill, v))
8715 #endif
8716 #if _MSVCP_VER != 80
8717 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 28)
8718 #else
8719 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 32)
8720 #endif
8721 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8722 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8724 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8726 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8728 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8731 /* ?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 */
8732 /* ?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 */
8733 #if _MSVCP_VER != 80
8734 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 28)
8735 #else
8736 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 32)
8737 #endif
8738 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8739 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8741 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8743 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8745 return num_put_short__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8748 /* ?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 */
8749 /* ?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 */
8750 /* ?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 */
8751 /* ?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 */
8752 #if _MSVCP_VER != 80
8753 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 28)
8754 #else
8755 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 32)
8756 #endif
8757 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8758 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8760 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8761 return call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v);
8764 /* ?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 */
8765 /* ?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 */
8766 #if _MSVCP_VER <= 100
8767 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8768 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8769 (this, ret, dest, base, fill, v))
8770 #else
8771 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8772 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8773 (this, ret, dest, base, fill, v))
8774 #endif
8775 #if _MSVCP_VER != 80
8776 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 32)
8777 #else
8778 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 36)
8779 #endif
8780 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8781 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8783 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8784 char fmt[7]; /* strlen("%+#lld")+1 */
8786 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8788 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8789 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8792 /* ?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 */
8793 /* ?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 */
8794 #if _MSVCP_VER != 80
8795 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 32)
8796 #else
8797 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 36)
8798 #endif
8799 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8800 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8802 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8803 char fmt[7]; /* strlen("%+#lld")+1 */
8805 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8807 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8808 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8811 /* ?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 */
8812 /* ?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 */
8813 /* ?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 */
8814 /* ?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 */
8815 #if _MSVCP_VER != 80
8816 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 32)
8817 #else
8818 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 36)
8819 #endif
8820 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8821 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8823 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8824 return call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v);
8827 /* ?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 */
8828 /* ?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 */
8829 #if _MSVCP_VER <= 100
8830 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8831 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8832 (this, ret, dest, base, fill, v))
8833 #else
8834 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8835 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8836 (this, ret, dest, base, fill, v))
8837 #endif
8838 #if _MSVCP_VER != 80
8839 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 32)
8840 #else
8841 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 36)
8842 #endif
8843 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8844 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8846 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8847 char fmt[7]; /* strlen("%+#lld")+1 */
8849 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8851 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8852 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8855 /* ?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 */
8856 /* ?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 */
8857 #if _MSVCP_VER != 80
8858 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 32)
8859 #else
8860 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 36)
8861 #endif
8862 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8863 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8865 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8866 char fmt[7]; /* strlen("%+#lld")+1 */
8868 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8870 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8871 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8874 /* ?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 */
8875 /* ?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 */
8876 /* ?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 */
8877 /* ?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 */
8878 #if _MSVCP_VER != 80
8879 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 32)
8880 #else
8881 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 36)
8882 #endif
8883 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8884 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8886 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8887 return call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v);
8890 /* ?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 */
8891 /* ?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 */
8892 #if _MSVCP_VER <= 100
8893 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8894 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, MSVCP_bool), \
8895 (this, ret, dest, base, fill, v))
8896 #else
8897 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_wchar*, \
8898 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, MSVCP_bool), \
8899 (this, ret, dest, base, fill, v))
8900 #endif
8901 #if _MSVCP_VER != 80
8902 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 28)
8903 #else
8904 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 32)
8905 #endif
8906 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8907 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, MSVCP_bool v)
8909 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8911 if(base->fmtfl & FMTFLAG_boolalpha) {
8912 numpunct_wchar *numpunct = numpunct_wchar_use_facet(IOS_LOCALE(base));
8913 basic_string_wchar str;
8914 MSVCP_size_t pad, len;
8916 if(v)
8917 numpunct_wchar_truename(numpunct, &str);
8918 else
8919 numpunct_wchar_falsename(numpunct, &str);
8921 len = MSVCP_basic_string_wchar_length(&str);
8922 pad = (len>base->wide ? 0 : base->wide-len);
8923 base->wide = 0;
8925 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8926 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8927 pad = 0;
8929 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8930 MSVCP_basic_string_wchar_dtor(&str);
8931 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8934 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8937 /* ?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 */
8938 /* ?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 */
8939 #if _MSVCP_VER != 80
8940 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 28)
8941 #else
8942 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 32)
8943 #endif
8944 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8945 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, MSVCP_bool v)
8947 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8949 if(base->fmtfl & FMTFLAG_boolalpha) {
8950 numpunct_wchar *numpunct = numpunct_short_use_facet(IOS_LOCALE(base));
8951 basic_string_wchar str;
8952 MSVCP_size_t pad, len;
8954 if(v)
8955 numpunct_wchar_truename(numpunct, &str);
8956 else
8957 numpunct_wchar_falsename(numpunct, &str);
8959 len = MSVCP_basic_string_wchar_length(&str);
8960 pad = (len>base->wide ? 0 : base->wide-len);
8961 base->wide = 0;
8963 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8964 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8965 pad = 0;
8967 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8968 MSVCP_basic_string_wchar_dtor(&str);
8969 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8972 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8975 /* ?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 */
8976 /* ?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 */
8977 /* ?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 */
8978 /* ?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 */
8979 #if _MSVCP_VER != 80
8980 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 28)
8981 #else
8982 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 32)
8983 #endif
8984 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8985 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, MSVCP_bool v)
8987 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8988 return call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v);
8991 /* ?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
8992 locale_id time_put_char_id = {0};
8994 /* ??_7?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
8995 extern const vtable_ptr MSVCP_time_put_char_vtable;
8997 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
8998 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
8999 DEFINE_THISCALL_WRAPPER(time_put_char__Init, 8)
9000 void __thiscall time_put_char__Init(time_put *this, const _Locinfo *locinfo)
9002 TRACE("(%p %p)\n", this, locinfo);
9003 _Locinfo__Gettnames(locinfo, &this->time);
9004 #if _MSVCP_VER <= 100
9005 _Locinfo__Getcvt(locinfo, &this->cvt);
9006 #endif
9009 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9010 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9011 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_locinfo, 12)
9012 time_put* __thiscall time_put_char_ctor_locinfo(time_put *this, const _Locinfo *locinfo, MSVCP_size_t refs)
9014 TRACE("(%p %p %lu)\n", this, locinfo, refs);
9015 locale_facet_ctor_refs(&this->facet, refs);
9016 this->facet.vtable = &MSVCP_time_put_char_vtable;
9017 time_put_char__Init(this, locinfo);
9018 return this;
9021 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
9022 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
9023 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_refs, 8)
9024 time_put* __thiscall time_put_char_ctor_refs(time_put *this, MSVCP_size_t refs)
9026 _Locinfo locinfo;
9028 TRACE("(%p %lu)\n", this, refs);
9030 _Locinfo_ctor(&locinfo);
9031 time_put_char_ctor_locinfo(this, &locinfo, refs);
9032 _Locinfo_dtor(&locinfo);
9033 return this;
9036 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
9037 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
9038 DEFINE_THISCALL_WRAPPER(time_put_char_ctor, 4)
9039 time_put* __thiscall time_put_char_ctor(time_put *this)
9041 return time_put_char_ctor_refs(this, 0);
9044 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
9045 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
9046 DEFINE_THISCALL_WRAPPER(time_put_char_dtor, 4)
9047 void __thiscall time_put_char_dtor(time_put *this)
9049 TRACE("(%p)\n", this);
9050 _Timevec_dtor(&this->time);
9053 DEFINE_THISCALL_WRAPPER(time_put_char_vector_dtor, 8)
9054 time_put* __thiscall time_put_char_vector_dtor(time_put *this, unsigned int flags)
9056 TRACE("(%p %x)\n", this, flags);
9057 if(flags & 2) {
9058 /* we have an array, with the number of elements stored before the first object */
9059 INT_PTR i, *ptr = (INT_PTR *)this-1;
9061 for(i=*ptr-1; i>=0; i--)
9062 time_put_char_dtor(this+i);
9063 MSVCRT_operator_delete(ptr);
9064 } else {
9065 time_put_char_dtor(this);
9066 if(flags & 1)
9067 MSVCRT_operator_delete(this);
9070 return this;
9073 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9074 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9075 MSVCP_size_t __cdecl time_put_char__Getcat(const locale_facet **facet, const locale *loc)
9077 TRACE("(%p %p)\n", facet, loc);
9079 if(facet && !*facet) {
9080 _Locinfo locinfo;
9082 *facet = MSVCRT_operator_new(sizeof(time_put));
9083 if(!*facet) {
9084 ERR("Out of memory\n");
9085 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9086 return 0;
9089 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
9090 time_put_char_ctor_locinfo((time_put*)*facet, &locinfo, 0);
9091 _Locinfo_dtor(&locinfo);
9094 return LC_TIME;
9097 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9098 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9099 MSVCP_size_t __cdecl time_put_char__Getcat_old(const locale_facet **facet)
9101 return time_put_char__Getcat(facet, locale_classic());
9104 static time_put* time_put_char_use_facet(const locale *loc)
9106 static time_put *obj = NULL;
9108 _Lockit lock;
9109 const locale_facet *fac;
9111 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9112 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_char_id));
9113 if(fac) {
9114 _Lockit_dtor(&lock);
9115 return (time_put*)fac;
9118 if(obj) {
9119 _Lockit_dtor(&lock);
9120 return obj;
9123 time_put_char__Getcat(&fac, loc);
9124 obj = (time_put*)fac;
9125 call_locale_facet__Incref(&obj->facet);
9126 locale_facet_register(&obj->facet);
9127 _Lockit_dtor(&lock);
9129 return obj;
9132 #if _MSVCP_VER >= 70
9134 /* ?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 */
9135 /* ?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 */
9136 #if _MSVCP_VER != 80
9137 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 36)
9138 #else
9139 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 40)
9140 #endif
9141 #if _MSVCP_VER <= 100
9142 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9143 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9144 (this, ret, dest, base, fill, t, spec, mod))
9145 #else
9146 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
9147 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9148 (this, ret, dest, base, fill, t, spec, mod))
9149 #endif
9150 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9151 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9153 char buf[64], fmt[4], *p = fmt;
9154 MSVCP_size_t i, len;
9156 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9158 *p++ = '%';
9159 if(mod)
9160 *p++ = mod;
9161 *p++ = spec;
9162 *p++ = 0;
9164 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9165 for(i=0; i<len; i++)
9166 ostreambuf_iterator_char_put(&dest, buf[i]);
9168 *ret = dest;
9169 return ret;
9172 /* ?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 */
9173 /* ?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 */
9174 #if _MSVCP_VER != 80
9175 DEFINE_THISCALL_WRAPPER(time_put_char_put, 36)
9176 #else
9177 DEFINE_THISCALL_WRAPPER(time_put_char_put, 40)
9178 #endif
9179 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9180 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9182 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9183 return call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod);
9186 /* ?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 */
9187 /* ?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 */
9188 #if _MSVCP_VER != 80
9189 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 36)
9190 #else
9191 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 40)
9192 #endif
9193 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9194 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, const char *pat, const char *pat_end)
9196 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_an(pat, pat_end-pat));
9198 while(pat < pat_end) {
9199 if(*pat != '%') {
9200 ostreambuf_iterator_char_put(&dest, *pat++);
9201 }else if(++pat == pat_end) {
9202 ostreambuf_iterator_char_put(&dest, '%');
9203 }else if(*pat=='#' && pat+1==pat_end) {
9204 ostreambuf_iterator_char_put(&dest, '%');
9205 ostreambuf_iterator_char_put(&dest, *pat++);
9206 }else {
9207 char mod;
9209 if(*pat == '#') {
9210 mod = '#';
9211 pat++;
9212 }else {
9213 mod = 0;
9216 time_put_char_put(this, &dest, dest, base, fill, t, *pat++, mod);
9220 *ret = dest;
9221 return ret;
9224 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9226 /* ?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 */
9227 /* ?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 */
9228 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 32)
9229 #define call_time_put_char_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9230 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, const struct tm*, char, char), \
9231 (this, ret, dest, base, t, spec, mod))
9232 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9233 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9235 char buf[64], fmt[4], *p = fmt;
9236 MSVCP_size_t i, len;
9238 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9240 *p++ = '%';
9241 if(mod)
9242 *p++ = mod;
9243 *p++ = spec;
9244 *p++ = 0;
9246 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9247 for(i=0; i<len; i++)
9248 ostreambuf_iterator_char_put(&dest, buf[i]);
9250 *ret = dest;
9251 return ret;
9254 /* ?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 */
9255 /* ?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 */
9256 DEFINE_THISCALL_WRAPPER(time_put_char_put, 32)
9257 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9258 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9260 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9261 return call_time_put_char_do_put(this, ret, dest, base, t, spec, mod);
9264 /* ?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 */
9265 /* ?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 */
9266 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 32)
9267 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9268 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, const char *pat, const char *pat_end)
9270 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_an(pat, pat_end-pat));
9272 while(pat < pat_end) {
9273 if(*pat != '%') {
9274 ostreambuf_iterator_char_put(&dest, *pat++);
9275 }else if(++pat == pat_end) {
9276 ostreambuf_iterator_char_put(&dest, '%');
9277 }else if(*pat=='#' && pat+1==pat_end) {
9278 ostreambuf_iterator_char_put(&dest, '%');
9279 ostreambuf_iterator_char_put(&dest, *pat++);
9280 }else {
9281 char mod;
9283 if(*pat == '#') {
9284 mod = '#';
9285 pat++;
9286 }else {
9287 mod = 0;
9290 time_put_char_put(this, &dest, dest, base, t, *pat++, mod);
9294 *ret = dest;
9295 return ret;
9298 #endif /* MSVCP_VER >= 70 */
9300 /* ?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
9301 locale_id time_put_wchar_id = {0};
9302 /* ?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
9303 locale_id time_put_short_id = {0};
9305 /* ??_7?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
9306 extern const vtable_ptr MSVCP_time_put_wchar_vtable;
9307 /* ??_7?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
9308 extern const vtable_ptr MSVCP_time_put_short_vtable;
9310 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9311 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9312 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9313 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9314 DEFINE_THISCALL_WRAPPER(time_put_wchar__Init, 8)
9315 void __thiscall time_put_wchar__Init(time_put *this, const _Locinfo *locinfo)
9317 TRACE("(%p %p)\n", this, locinfo);
9318 _Locinfo__Gettnames(locinfo, &this->time);
9319 #if _MSVCP_VER <= 100
9320 _Locinfo__Getcvt(locinfo, &this->cvt);
9321 #endif
9324 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9325 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9326 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_locinfo, 12)
9327 time_put* __thiscall time_put_wchar_ctor_locinfo(time_put *this, const _Locinfo *locinfo, MSVCP_size_t refs)
9329 TRACE("(%p %p %lu)\n", this, locinfo, refs);
9330 locale_facet_ctor_refs(&this->facet, refs);
9331 this->facet.vtable = &MSVCP_time_put_wchar_vtable;
9332 time_put_wchar__Init(this, locinfo);
9333 return this;
9336 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9337 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9338 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_locinfo, 12)
9339 time_put* __thiscall time_put_short_ctor_locinfo(time_put *this, const _Locinfo *locinfo, MSVCP_size_t refs)
9341 time_put_wchar_ctor_locinfo(this, locinfo, refs);
9342 this->facet.vtable = &MSVCP_time_put_short_vtable;
9343 return this;
9346 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
9347 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
9348 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_name, 12)
9349 time_put* __thiscall time_put_wchar_ctor_name(time_put *this, const char *name, MSVCP_size_t refs)
9351 _Locinfo locinfo;
9353 TRACE("(%p %s %lu)\n", this, debugstr_a(name), refs);
9355 _Locinfo_ctor_cstr(&locinfo, name);
9356 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9357 _Locinfo_dtor(&locinfo);
9358 return this;
9361 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAE@PBDI@Z */
9362 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z */
9363 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_name, 12)
9364 time_put* __thiscall time_put_short_ctor_name(time_put *this, const char *name, MSVCP_size_t refs)
9366 time_put_wchar_ctor_name(this, name, refs);
9367 this->facet.vtable = &MSVCP_time_put_short_vtable;
9368 return this;
9371 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
9372 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
9373 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_refs, 8)
9374 time_put* __thiscall time_put_wchar_ctor_refs(time_put *this, MSVCP_size_t refs)
9376 _Locinfo locinfo;
9378 TRACE("(%p %lu)\n", this, refs);
9380 _Locinfo_ctor(&locinfo);
9381 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9382 _Locinfo_dtor(&locinfo);
9383 return this;
9386 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
9387 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
9388 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_refs, 8)
9389 time_put* __thiscall time_put_short_ctor_refs(time_put *this, MSVCP_size_t refs)
9391 time_put_wchar_ctor_refs(this, refs);
9392 this->facet.vtable = &MSVCP_time_put_short_vtable;
9393 return this;
9396 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
9397 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
9398 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor, 4)
9399 time_put* __thiscall time_put_wchar_ctor(time_put *this)
9401 return time_put_wchar_ctor_refs(this, 0);
9404 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
9405 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
9406 DEFINE_THISCALL_WRAPPER(time_put_short_ctor, 4)
9407 time_put* __thiscall time_put_short_ctor(time_put *this)
9409 time_put_wchar_ctor(this);
9410 this->facet.vtable = &MSVCP_time_put_short_vtable;
9411 return this;
9414 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
9415 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
9416 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
9417 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
9418 DEFINE_THISCALL_WRAPPER(time_put_wchar_dtor, 4)
9419 void __thiscall time_put_wchar_dtor(time_put *this)
9421 TRACE("(%p)\n", this);
9422 _Timevec_dtor(&this->time);
9425 DEFINE_THISCALL_WRAPPER(time_put_wchar_vector_dtor, 8)
9426 time_put* __thiscall time_put_wchar_vector_dtor(time_put *this, unsigned int flags)
9428 TRACE("(%p %x)\n", this, flags);
9429 if(flags & 2) {
9430 /* we have an array, with the number of elements stored before the first object */
9431 INT_PTR i, *ptr = (INT_PTR *)this-1;
9433 for(i=*ptr-1; i>=0; i--)
9434 time_put_wchar_dtor(this+i);
9435 MSVCRT_operator_delete(ptr);
9436 } else {
9437 time_put_wchar_dtor(this);
9438 if(flags & 1)
9439 MSVCRT_operator_delete(this);
9442 return this;
9445 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9446 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9447 MSVCP_size_t __cdecl time_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
9449 TRACE("(%p %p)\n", facet, loc);
9451 if(facet && !*facet) {
9452 *facet = MSVCRT_operator_new(sizeof(time_put));
9453 if(!*facet) {
9454 ERR("Out of memory\n");
9455 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9456 return 0;
9458 time_put_wchar_ctor_name((time_put*)*facet,
9459 locale_string_char_c_str(&loc->ptr->name), 0);
9462 return LC_TIME;
9465 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9466 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9467 MSVCP_size_t __cdecl time_put_wchar__Getcat_old(const locale_facet **facet)
9469 return time_put_wchar__Getcat(facet, locale_classic());
9472 static time_put* time_put_wchar_use_facet(const locale *loc)
9474 static time_put *obj = NULL;
9476 _Lockit lock;
9477 const locale_facet *fac;
9479 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9480 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_wchar_id));
9481 if(fac) {
9482 _Lockit_dtor(&lock);
9483 return (time_put*)fac;
9486 if(obj) {
9487 _Lockit_dtor(&lock);
9488 return obj;
9491 time_put_wchar__Getcat(&fac, loc);
9492 obj = (time_put*)fac;
9493 call_locale_facet__Incref(&obj->facet);
9494 locale_facet_register(&obj->facet);
9495 _Lockit_dtor(&lock);
9497 return obj;
9500 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9501 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9502 MSVCP_size_t __cdecl time_put_short__Getcat(const locale_facet **facet, const locale *loc)
9504 TRACE("(%p %p)\n", facet, loc);
9506 if(facet && !*facet) {
9507 *facet = MSVCRT_operator_new(sizeof(time_put));
9508 if(!*facet) {
9509 ERR("Out of memory\n");
9510 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9511 return 0;
9513 time_put_short_ctor_name((time_put*)*facet,
9514 locale_string_char_c_str(&loc->ptr->name), 0);
9517 return LC_TIME;
9520 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9521 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9522 MSVCP_size_t __cdecl time_put_short__Getcat_old(const locale_facet **facet)
9524 return time_put_short__Getcat(facet, locale_classic());
9527 static time_put* time_put_short_use_facet(const locale *loc)
9529 static time_put *obj = NULL;
9531 _Lockit lock;
9532 const locale_facet *fac;
9534 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9535 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_short_id));
9536 if(fac) {
9537 _Lockit_dtor(&lock);
9538 return (time_put*)fac;
9541 if(obj) {
9542 _Lockit_dtor(&lock);
9543 return obj;
9546 time_put_short__Getcat(&fac, loc);
9547 obj = (time_put*)fac;
9548 call_locale_facet__Incref(&obj->facet);
9549 locale_facet_register(&obj->facet);
9550 _Lockit_dtor(&lock);
9552 return obj;
9555 #if _MSVCP_VER >= 70
9557 /* ?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 */
9558 /* ?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 */
9559 /* ?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 */
9560 /* ?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 */
9561 #if _MSVCP_VER != 80
9562 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 36)
9563 #else
9564 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 40)
9565 #endif
9566 #if _MSVCP_VER <= 100
9567 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9568 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9569 (this, ret, dest, base, fill, t, spec, mod))
9570 #else
9571 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
9572 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9573 (this, ret, dest, base, fill, t, spec, mod))
9574 #endif
9575 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9576 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9577 wchar_t fill, const struct tm *t, char spec, char mod)
9579 char buf[64], fmt[4], *p = fmt;
9580 MSVCP_size_t i, len;
9581 const _Cvtvec *cvt;
9582 wchar_t c;
9584 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9586 *p++ = '%';
9587 if(mod)
9588 *p++ = mod;
9589 *p++ = spec;
9590 *p++ = 0;
9592 #if _MSVCP_VER <= 100
9593 cvt = &this->cvt;
9594 #else
9595 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9596 #endif
9598 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9599 for(i=0; i<len; i++) {
9600 c = mb_to_wc(buf[i], cvt);
9601 ostreambuf_iterator_wchar_put(&dest, c);
9604 *ret = dest;
9605 return ret;
9608 /* ?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 */
9609 /* ?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 */
9610 /* ?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 */
9611 /* ?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 */
9612 #if _MSVCP_VER != 80
9613 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 36)
9614 #else
9615 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 40)
9616 #endif
9617 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9618 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9619 wchar_t fill, const struct tm *t, char spec, char mod)
9621 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9622 return call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod);
9625 /* ?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 */
9626 /* ?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 */
9627 /* ?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 */
9628 /* ?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 */
9629 #if _MSVCP_VER != 80
9630 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 36)
9631 #else
9632 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 40)
9633 #endif
9634 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9635 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9636 wchar_t fill, const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9638 wchar_t percent;
9639 char c[MB_LEN_MAX];
9640 const _Cvtvec *cvt;
9642 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_wn(pat, pat_end-pat));
9644 #if _MSVCP_VER <= 100
9645 cvt = &this->cvt;
9646 #else
9647 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9648 #endif
9650 percent = mb_to_wc('%', cvt);
9651 while(pat < pat_end) {
9652 if(*pat != percent) {
9653 ostreambuf_iterator_wchar_put(&dest, *pat++);
9654 }else if(++pat == pat_end) {
9655 ostreambuf_iterator_wchar_put(&dest, percent);
9656 }else if(_Wcrtomb(c, *pat, NULL, cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9657 ostreambuf_iterator_wchar_put(&dest, percent);
9658 ostreambuf_iterator_wchar_put(&dest, *pat++);
9659 }else {
9660 pat++;
9661 if(*c == '#') {
9662 if(_Wcrtomb(c, *pat++, NULL, cvt) != 1) {
9663 ostreambuf_iterator_wchar_put(&dest, percent);
9664 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9665 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9666 }else {
9667 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, '#');
9669 }else {
9670 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, 0);
9675 *ret = dest;
9676 return ret;
9679 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9681 /* ?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 */
9682 /* ?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 */
9683 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 32)
9684 #define call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9685 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, const struct tm*, char, char), \
9686 (this, ret, dest, base, t, spec, mod))
9687 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9688 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9689 const struct tm *t, char spec, char mod)
9691 char buf[64], fmt[4], *p = fmt;
9692 MSVCP_size_t i, len;
9693 wchar_t c;
9695 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9697 *p++ = '%';
9698 if(mod)
9699 *p++ = mod;
9700 *p++ = spec;
9701 *p++ = 0;
9703 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9704 for(i=0; i<len; i++) {
9705 c = mb_to_wc(buf[i], &this->cvt);
9706 ostreambuf_iterator_wchar_put(&dest, c);
9709 *ret = dest;
9710 return ret;
9713 /* ?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 */
9714 /* ?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 */
9715 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 32)
9716 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9717 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9718 const struct tm *t, char spec, char mod)
9720 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9721 return call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod);
9724 /* ?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 */
9725 /* ?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 */
9726 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 32)
9727 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9728 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9729 const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9731 wchar_t percent = mb_to_wc('%', &this->cvt);
9732 char c[MB_LEN_MAX];
9734 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_wn(pat, pat_end-pat));
9736 while(pat < pat_end) {
9737 if(*pat != percent) {
9738 ostreambuf_iterator_wchar_put(&dest, *pat++);
9739 }else if(++pat == pat_end) {
9740 ostreambuf_iterator_wchar_put(&dest, percent);
9741 }else if(_Wcrtomb(c, *pat, NULL, &this->cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9742 ostreambuf_iterator_wchar_put(&dest, percent);
9743 ostreambuf_iterator_wchar_put(&dest, *pat++);
9744 }else {
9745 pat++;
9746 if(*c == '#') {
9747 if(_Wcrtomb(c, *pat++, NULL, &this->cvt) != 1) {
9748 ostreambuf_iterator_wchar_put(&dest, percent);
9749 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9750 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9751 }else {
9752 time_put_wchar_put(this, &dest, dest, base, t, *c, '#');
9754 }else {
9755 time_put_wchar_put(this, &dest, dest, base, t, *c, 0);
9760 *ret = dest;
9761 return ret;
9764 #endif /* _MSVCP_VER >= 70 */
9766 /* ?id@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
9767 locale_id time_get_char_id = {0};
9769 /* ??_7?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
9770 extern const vtable_ptr MSVCP_time_get_char_vtable;
9772 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9773 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9774 DEFINE_THISCALL_WRAPPER(time_get_char__Init, 8)
9775 void __thiscall time_get_char__Init(time_get_char *this, const _Locinfo *locinfo)
9777 const char *months;
9778 const char *days;
9779 int len;
9781 TRACE("(%p %p)\n", this, locinfo);
9783 days = _Locinfo__Getdays(locinfo);
9784 len = strlen(days)+1;
9785 this->days = MSVCRT_operator_new(len);
9786 if(!this->days)
9788 ERR("Out of memory\n");
9789 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9791 memcpy((char*)this->days, days, len);
9793 months = _Locinfo__Getmonths(locinfo);
9794 len = strlen(months)+1;
9795 this->months = MSVCRT_operator_new(len);
9796 if(!this->months)
9798 MSVCRT_operator_delete((char*)this->days);
9800 ERR("Out of memory\n");
9801 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9803 memcpy((char*)this->months, months, len);
9805 this->dateorder = _Locinfo__Getdateorder(locinfo);
9806 _Locinfo__Getcvt(locinfo, &this->cvt);
9809 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9810 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9811 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_locinfo, 12)
9812 time_get_char* __thiscall time_get_char_ctor_locinfo(time_get_char *this,
9813 const _Locinfo *locinfo, MSVCP_size_t refs)
9815 TRACE("(%p %p %lu)\n", this, locinfo, refs);
9816 locale_facet_ctor_refs(&this->facet, refs);
9817 this->facet.vtable = &MSVCP_time_get_char_vtable;
9818 time_get_char__Init(this, locinfo);
9819 return this;
9822 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAE@PBDI@Z */
9823 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAA@PEBD_K@Z */
9824 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_name, 12)
9825 time_get_char* __thiscall time_get_char_ctor_name(time_get_char *this, const char *name, MSVCP_size_t refs)
9827 _Locinfo locinfo;
9829 TRACE("(%p %s %lu)\n", this, name, refs);
9831 _Locinfo_ctor_cstr(&locinfo, name);
9832 time_get_char_ctor_locinfo(this, &locinfo, refs);
9833 _Locinfo_dtor(&locinfo);
9834 return this;
9837 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
9838 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
9839 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_refs, 8)
9840 time_get_char* __thiscall time_get_char_ctor_refs(time_get_char *this, MSVCP_size_t refs)
9842 _Locinfo locinfo;
9844 TRACE("(%p %lu)\n", this, refs);
9846 _Locinfo_ctor(&locinfo);
9847 time_get_char_ctor_locinfo(this, &locinfo, refs);
9848 _Locinfo_dtor(&locinfo);
9849 return this;
9852 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
9853 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
9854 DEFINE_THISCALL_WRAPPER(time_get_char_ctor, 4)
9855 time_get_char* __thiscall time_get_char_ctor(time_get_char *this)
9857 return time_get_char_ctor_refs(this, 0);
9860 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AAEXXZ */
9861 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEAAXXZ */
9862 DEFINE_THISCALL_WRAPPER(time_get_char__Tidy, 4)
9863 void __thiscall time_get_char__Tidy(time_get_char *this)
9865 TRACE("(%p)\n", this);
9867 MSVCRT_operator_delete((char*)this->days);
9868 MSVCRT_operator_delete((char*)this->months);
9871 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
9872 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
9873 DEFINE_THISCALL_WRAPPER(time_get_char_dtor, 4) /* virtual */
9874 void __thiscall time_get_char_dtor(time_get_char *this)
9876 TRACE("(%p)\n", this);
9878 time_get_char__Tidy(this);
9881 DEFINE_THISCALL_WRAPPER(time_get_char_vector_dtor, 8)
9882 time_get_char* __thiscall time_get_char_vector_dtor(time_get_char *this, unsigned int flags)
9884 TRACE("(%p %x)\n", this, flags);
9885 if(flags & 2) {
9886 /* we have an array, with the number of elements stored before the first object */
9887 INT_PTR i, *ptr = (INT_PTR *)this-1;
9889 for(i=*ptr-1; i>=0; i--)
9890 time_get_char_dtor(this+i);
9891 MSVCRT_operator_delete(ptr);
9892 } else {
9893 time_get_char_dtor(this);
9894 if(flags & 1)
9895 MSVCRT_operator_delete(this);
9898 return this;
9901 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9902 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9903 unsigned int __cdecl time_get_char__Getcat(const locale_facet **facet, const locale *loc)
9905 TRACE("(%p %p)\n", facet, loc);
9907 if(facet && !*facet) {
9908 _Locinfo locinfo;
9910 *facet = MSVCRT_operator_new(sizeof(time_get_char));
9911 if(!*facet) {
9912 ERR("Out of memory\n");
9913 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9914 return 0;
9917 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
9918 time_get_char_ctor_locinfo((time_get_char*)*facet, &locinfo, 0);
9919 _Locinfo_dtor(&locinfo);
9922 return LC_TIME;
9925 static time_get_char* time_get_char_use_facet(const locale *loc)
9927 static time_get_char *obj = NULL;
9929 _Lockit lock;
9930 const locale_facet *fac;
9932 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9933 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_char_id));
9934 if(fac) {
9935 _Lockit_dtor(&lock);
9936 return (time_get_char*)fac;
9939 if(obj) {
9940 _Lockit_dtor(&lock);
9941 return obj;
9944 time_get_char__Getcat(&fac, loc);
9945 obj = (time_get_char*)fac;
9946 call_locale_facet__Incref(&obj->facet);
9947 locale_facet_register(&obj->facet);
9948 _Lockit_dtor(&lock);
9950 return obj;
9953 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAH@Z */
9954 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAEAH@Z */
9955 int __cdecl time_get_char__Getint(const time_get_char *this,
9956 istreambuf_iterator_char *b, istreambuf_iterator_char *e,
9957 int min_val, int max_val, int *val)
9959 BOOL got_digit = FALSE;
9960 int len = 0, ret = 0;
9961 char buf[16];
9963 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
9965 istreambuf_iterator_char_val(b);
9966 if(b->strbuf && (b->val == '-' || b->val == '+'))
9968 buf[len++] = b->val;
9969 istreambuf_iterator_char_inc(b);
9972 if (b->strbuf && b->val == '0')
9974 got_digit = TRUE;
9975 buf[len++] = '0';
9976 istreambuf_iterator_char_inc(b);
9978 while (b->strbuf && b->val == '0')
9979 istreambuf_iterator_char_inc(b);
9981 for (; b->strbuf && b->val >= '0' && b->val <= '9';
9982 istreambuf_iterator_char_inc(b))
9984 if(len < ARRAY_SIZE(buf)-1)
9985 buf[len] = b->val;
9986 got_digit = TRUE;
9987 len++;
9990 if (!b->strbuf)
9991 ret |= IOSTATE_eofbit;
9992 if (got_digit && len < ARRAY_SIZE(buf)-1)
9994 int v, err;
9996 buf[len] = 0;
9997 v = _Stolx(buf, NULL, 10, &err);
9998 if(err || v < min_val || v > max_val)
9999 ret |= IOSTATE_failbit;
10000 else
10001 *val = v;
10003 else
10004 ret |= IOSTATE_failbit;
10005 return ret;
10008 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
10009 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
10010 DEFINE_THISCALL_WRAPPER(time_get_char_do_date_order, 4) /* virtual */
10011 #if _MSVCP_VER <= 100
10012 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_char*), (this))
10013 #else
10014 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_char*), (this))
10015 #endif
10016 dateorder __thiscall time_get_char_do_date_order(const time_get_char *this)
10018 TRACE("(%p)\n", this);
10019 return this->dateorder;
10022 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
10023 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
10024 DEFINE_THISCALL_WRAPPER(time_get_char_date_order, 4)
10025 dateorder __thiscall time_get_char_date_order(const time_get_char *this)
10027 return call_time_get_char_do_date_order(this);
10030 static int find_longest_match_char(istreambuf_iterator_char *iter, const char *str)
10032 int i, len = 0, last_match = -1, match = -1;
10033 const char *p, *end;
10034 char buf[64];
10036 for(istreambuf_iterator_char_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
10037 istreambuf_iterator_char_inc(iter))
10039 BOOL got_prefix = FALSE;
10041 buf[len++] = iter->val;
10042 last_match = match;
10043 match = -1;
10044 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
10046 end = strchr(p, ':');
10047 if (!end)
10048 end = p + strlen(p);
10050 if (end-p >= len && !memcmp(p, buf, len))
10052 if (end-p == len)
10053 match = i;
10054 else
10055 got_prefix = TRUE;
10059 if (!got_prefix)
10061 if (match != -1)
10063 istreambuf_iterator_char_inc(iter);
10064 return match;
10066 break;
10069 if (len == ARRAY_SIZE(buf))
10070 FIXME("temporary buffer is too small\n");
10071 if (!iter->strbuf)
10072 return match;
10073 return last_match;
10076 /* ?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 */
10077 /* ?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 */
10078 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_monthname, 36) /* virtual */
10079 #if _MSVCP_VER <= 100
10080 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
10081 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10082 (this, ret, s, e, base, err, t))
10083 #else
10084 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
10085 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10086 (this, ret, s, e, base, err, t))
10087 #endif
10088 istreambuf_iterator_char* __thiscall time_get_char_do_get_monthname(const time_get_char *this,
10089 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10090 ios_base *base, int *err, struct tm *t)
10092 int match;
10094 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10096 if ((match = find_longest_match_char(&s, this->months)) != -1)
10097 t->tm_mon = match / 2;
10098 else
10099 *err |= IOSTATE_failbit;
10101 *ret = s;
10102 return ret;
10105 /* ?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 */
10106 /* ?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 */
10107 DEFINE_THISCALL_WRAPPER(time_get_char_get_monthname, 36)
10108 istreambuf_iterator_char* __thiscall time_get_char_get_monthname(const time_get_char *this,
10109 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10110 ios_base *base, int *err, struct tm *t)
10112 return call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t);
10115 /* ?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 */
10116 /* ?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 */
10117 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_time, 36) /* virtual */
10118 #if _MSVCP_VER <= 100
10119 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
10120 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10121 (this, ret, s, e, base, err, t))
10122 #else
10123 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
10124 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10125 (this, ret, s, e, base, err, t))
10126 #endif
10127 istreambuf_iterator_char* __thiscall time_get_char_do_get_time(const time_get_char *this,
10128 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10129 ios_base *base, int *err, struct tm *t)
10131 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10133 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10134 if (*err || istreambuf_iterator_char_val(&s)!=':')
10135 *err |= IOSTATE_failbit;
10137 if (!*err)
10139 istreambuf_iterator_char_inc(&s);
10140 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
10142 if (*err || istreambuf_iterator_char_val(&s)!=':')
10143 *err |= IOSTATE_failbit;
10145 if (!*err)
10147 istreambuf_iterator_char_inc(&s);
10148 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10151 *ret = s;
10152 return ret;
10155 /* ?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 */
10156 /* ?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 */
10157 DEFINE_THISCALL_WRAPPER(time_get_char_get_time, 36)
10158 istreambuf_iterator_char* __thiscall time_get_char_get_time(const time_get_char *this,
10159 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10160 ios_base *base, int *err, struct tm *t)
10162 return call_time_get_char_do_get_time(this, ret, s, e, base, err, t);
10165 /* ?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 */
10166 /* ?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 */
10167 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_weekday, 36) /* virtual */
10168 #if _MSVCP_VER <= 100
10169 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
10170 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10171 (this, ret, s, e, base, err, t))
10172 #else
10173 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10174 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10175 (this, ret, s, e, base, err, t))
10176 #endif
10177 istreambuf_iterator_char* __thiscall time_get_char_do_get_weekday(const time_get_char *this,
10178 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10179 ios_base *base, int *err, struct tm *t)
10181 int match;
10183 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10185 if ((match = find_longest_match_char(&s, this->days)) != -1)
10186 t->tm_wday = match / 2;
10187 else
10188 *err |= IOSTATE_failbit;
10190 *ret = s;
10191 return ret;
10194 /* ?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 */
10195 /* ?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 */
10196 DEFINE_THISCALL_WRAPPER(time_get_char_get_weekday, 36)
10197 istreambuf_iterator_char* __thiscall time_get_char_get_weekday(const time_get_char *this,
10198 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10199 ios_base *base, int *err, struct tm *t)
10201 return call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t);
10204 /* ?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 */
10205 /* ?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 */
10206 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_year, 36) /* virtual */
10207 #if _MSVCP_VER <= 100
10208 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10209 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10210 (this, ret, s, e, base, err, t))
10211 #else
10212 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
10213 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10214 (this, ret, s, e, base, err, t))
10215 #endif
10216 istreambuf_iterator_char* __thiscall time_get_char_do_get_year(const time_get_char *this,
10217 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10218 ios_base *base, int *err, struct tm *t)
10220 int year;
10222 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10224 /* The function supports only dates from [1900-2035] range */
10225 *err |= time_get_char__Getint(this, &s, &e, 0, 2035, &year);
10226 if (!(*err & IOSTATE_failbit))
10228 if (year >= 1900)
10229 year -= 1900;
10230 if (year > 135)
10231 *err |= IOSTATE_failbit;
10232 else
10233 t->tm_year = year;
10236 *ret = s;
10237 return ret;
10240 /* ?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 */
10241 /* ?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 */
10242 DEFINE_THISCALL_WRAPPER(time_get_char_get_year, 36)
10243 istreambuf_iterator_char* __thiscall time_get_char_get_year(const time_get_char *this,
10244 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10245 ios_base *base, int *err, struct tm *t)
10247 return call_time_get_char_do_get_year(this, ret, s, e, base, err, t);
10250 static void skip_ws_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10252 istreambuf_iterator_char_val(iter);
10253 while(iter->strbuf && ctype_char_is_ch(ctype, _SPACE, iter->val))
10254 istreambuf_iterator_char_inc(iter);
10257 static void skip_date_delim_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10259 skip_ws_char(ctype, iter);
10260 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
10261 istreambuf_iterator_char_inc(iter);
10262 skip_ws_char(ctype, iter);
10265 /* ?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 */
10266 /* ?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 */
10267 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_date, 36) /* virtual */
10268 #if _MSVCP_VER <= 100
10269 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
10270 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10271 (this, ret, s, e, base, err, t))
10272 #else
10273 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
10274 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10275 (this, ret, s, e, base, err, t))
10276 #endif
10277 istreambuf_iterator_char* __thiscall time_get_char_do_get_date(const time_get_char *this,
10278 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10279 ios_base *base, int *err, struct tm *t)
10281 ctype_char *ctype;
10282 dateorder order;
10284 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10286 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10288 order = time_get_char_date_order(this);
10289 if(order == DATEORDER_no_order)
10290 order = DATEORDER_mdy;
10292 switch(order) {
10293 case DATEORDER_dmy:
10294 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10295 skip_date_delim_char(ctype, &s);
10296 if(!s.strbuf) {
10297 *err |= IOSTATE_failbit;
10298 break;
10300 if(s.strbuf && ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10301 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10302 t->tm_mon--;
10303 } else {
10304 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10306 skip_date_delim_char(ctype, &s);
10307 if(!s.strbuf) {
10308 *err |= IOSTATE_failbit;
10309 break;
10311 time_get_char_get_year(this, &s, s, e, base, err, t);
10312 break;
10313 case DATEORDER_mdy:
10314 istreambuf_iterator_char_val(&s);
10315 if(s.strbuf && ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10316 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10317 t->tm_mon--;
10318 } else {
10319 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10321 skip_date_delim_char(ctype, &s);
10322 if(!s.strbuf) {
10323 *err |= IOSTATE_failbit;
10324 break;
10326 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10327 skip_date_delim_char(ctype, &s);
10328 if(!s.strbuf) {
10329 *err |= IOSTATE_failbit;
10330 break;
10332 time_get_char_get_year(this, &s, s, e, base, err, t);
10333 break;
10334 case DATEORDER_ymd:
10335 time_get_char_get_year(this, &s, s, e, base, err, t);
10336 skip_date_delim_char(ctype, &s);
10337 if(!s.strbuf) {
10338 *err |= IOSTATE_failbit;
10339 break;
10341 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10342 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10343 t->tm_mon--;
10344 } else {
10345 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10347 skip_date_delim_char(ctype, &s);
10348 if(!s.strbuf) {
10349 *err |= IOSTATE_failbit;
10350 break;
10352 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10353 break;
10354 case DATEORDER_ydm:
10355 time_get_char_get_year(this, &s, s, e, base, err, t);
10356 skip_date_delim_char(ctype, &s);
10357 if(!s.strbuf) {
10358 *err |= IOSTATE_failbit;
10359 break;
10361 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10362 skip_date_delim_char(ctype, &s);
10363 if(!s.strbuf) {
10364 *err |= IOSTATE_failbit;
10365 break;
10367 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10368 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10369 t->tm_mon--;
10370 } else {
10371 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10373 break;
10374 default:
10375 ERR("incorrect order value: %d\n", order);
10376 break;
10379 if(!s.strbuf)
10380 *err |= IOSTATE_eofbit;
10381 *ret = s;
10382 return ret;
10385 /* ?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 */
10386 /* ?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 */
10387 DEFINE_THISCALL_WRAPPER(time_get_char_get_date, 36)
10388 istreambuf_iterator_char* __thiscall time_get_char_get_date(const time_get_char *this,
10389 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10390 ios_base *base, int *err, struct tm *t)
10392 return call_time_get_char_do_get_date(this, ret, s, e, base, err, t);
10395 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char*,
10396 istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char,
10397 ios_base*, int*, struct tm*, char, char);
10399 /* ?_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 */
10400 /* ?_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 */
10401 DEFINE_THISCALL_WRAPPER(time_get_char__Getfmt, 40)
10402 istreambuf_iterator_char* __thiscall time_get_char__Getfmt(const time_get_char *this,
10403 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10404 ios_base *base, int *err, struct tm *t, const char *fmt)
10406 ctype_char *ctype;
10408 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
10410 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10411 istreambuf_iterator_char_val(&s);
10413 while(*fmt) {
10414 if(ctype_char_is_ch(ctype, _SPACE, *fmt)) {
10415 skip_ws_char(ctype, &s);
10416 fmt++;
10417 continue;
10420 if(!s.strbuf) {
10421 *err |= IOSTATE_failbit;
10422 break;
10425 if(*fmt == '%') {
10426 fmt++;
10427 time_get_char_get(this, &s, s, e, base, err, t, *fmt, 0);
10428 } else {
10429 if(s.val != *fmt)
10430 *err |= IOSTATE_failbit;
10431 else
10432 istreambuf_iterator_char_inc(&s);
10435 if(*err & IOSTATE_failbit)
10436 break;
10437 fmt++;
10440 if(!s.strbuf)
10441 *err |= IOSTATE_eofbit;
10442 *ret = s;
10443 return ret;
10446 /* ?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 */
10447 /* ?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 */
10448 DEFINE_THISCALL_WRAPPER(time_get_char_do_get, 44) /* virtual */
10449 #if _MSVCP_VER <= 100
10450 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
10451 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10452 (this, ret, s, e, base, err, t, fmt, mod))
10453 #else
10454 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
10455 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10456 (this, ret, s, e, base, err, t, fmt, mod))
10457 #endif
10458 istreambuf_iterator_char* __thiscall time_get_char_do_get(const time_get_char *this,
10459 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10460 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10462 ctype_char *ctype;
10464 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
10466 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10468 switch(fmt) {
10469 case 'a':
10470 case 'A':
10471 time_get_char_get_weekday(this, &s, s, e, base, err, t);
10472 break;
10473 case 'b':
10474 case 'B':
10475 case 'h':
10476 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10477 break;
10478 case 'c':
10479 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
10480 break;
10481 case 'C':
10482 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10483 if(!(*err & IOSTATE_failbit))
10484 t->tm_year = t->tm_year * 100 - 1900;
10485 break;
10486 case 'd':
10487 case 'e':
10488 if(fmt == 'e') skip_ws_char(ctype, &s);
10489 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10490 break;
10491 case 'D':
10492 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
10493 break;
10494 case 'F':
10495 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
10496 break;
10497 case 'H':
10498 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10499 break;
10500 case 'I':
10501 *err |= time_get_char__Getint(this, &s, &e, 0, 11, &t->tm_hour);
10502 break;
10503 case 'j':
10504 *err |= time_get_char__Getint(this, &s, &e, 1, 366, &t->tm_yday);
10505 break;
10506 case 'm':
10507 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10508 if(!(*err & IOSTATE_failbit))
10509 t->tm_mon--;
10510 break;
10511 case 'M':
10512 *err = time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
10513 break;
10514 case 'n':
10515 case 't':
10516 skip_ws_char(ctype, &s);
10517 break;
10518 case 'p': {
10519 BOOL pm = FALSE;
10521 istreambuf_iterator_char_val(&s);
10522 if(s.strbuf && (s.val=='P' || s.val=='p'))
10523 pm = TRUE;
10524 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
10525 *err |= IOSTATE_failbit;
10526 break;
10528 istreambuf_iterator_char_inc(&s);
10529 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
10530 *err |= IOSTATE_failbit;
10531 break;
10533 istreambuf_iterator_char_inc(&s);
10535 if(pm)
10536 t->tm_hour += 12;
10537 break;
10539 case 'r':
10540 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
10541 break;
10542 case 'R':
10543 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
10544 break;
10545 case 'S':
10546 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10547 break;
10548 case 'T':
10549 case 'X':
10550 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
10551 break;
10552 case 'u':
10553 *err |= time_get_char__Getint(this, &s, &e, 1, 7, &t->tm_wday);
10554 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
10555 t->tm_wday = 0;
10556 break;
10557 case 'w':
10558 *err |= time_get_char__Getint(this, &s, &e, 0, 6, &t->tm_wday);
10559 break;
10560 case 'x':
10561 time_get_char_get_date(this, &s, s, e, base, err, t);
10562 break;
10563 case 'y':
10564 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10565 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
10566 t->tm_year += 100;
10567 break;
10568 case 'Y':
10569 time_get_char_get_year(this, &s, s, e, base, err, t);
10570 break;
10571 default:
10572 FIXME("unrecognized format: %c\n", fmt);
10573 *err |= IOSTATE_failbit;
10576 if(!s.strbuf)
10577 *err |= IOSTATE_eofbit;
10578 *ret = s;
10579 return ret;
10582 /* ?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 */
10583 /* ?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 */
10584 DEFINE_THISCALL_WRAPPER(time_get_char_get, 44)
10585 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char *this,
10586 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10587 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10589 return call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod);
10592 /* ?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 */
10593 /* ?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 */
10594 DEFINE_THISCALL_WRAPPER(time_get_char_get_fmt, 44)
10595 istreambuf_iterator_char* __thiscall time_get_char_get_fmt(const time_get_char *this,
10596 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10597 ios_base *base, int *err, struct tm *t, const char *fmtstart, const char *fmtend)
10599 ctype_char *ctype;
10601 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_an(fmtstart, fmtend-fmtstart));
10603 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10604 istreambuf_iterator_char_val(&s);
10606 while(fmtstart < fmtend) {
10607 if(ctype_char_is_ch(ctype, _SPACE, *fmtstart)) {
10608 skip_ws_char(ctype, &s);
10609 fmtstart++;
10610 continue;
10613 if(!s.strbuf) {
10614 *err |= IOSTATE_failbit;
10615 break;
10618 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
10619 if(s.val != *fmtstart)
10620 *err |= IOSTATE_failbit;
10621 else
10622 istreambuf_iterator_char_inc(&s);
10623 if(*fmtstart == '%')
10624 fmtstart++;
10625 } else {
10626 fmtstart++;
10627 time_get_char_get(this, &s, s, e, base, err, t, *fmtstart, 0);
10630 if(*err & IOSTATE_failbit)
10631 break;
10632 fmtstart++;
10635 if(!s.strbuf)
10636 *err |= IOSTATE_eofbit;
10637 *ret = s;
10638 return ret;
10641 /* ?id@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
10642 locale_id time_get_wchar_id = {0};
10644 /* ??_7?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
10645 extern const vtable_ptr MSVCP_time_get_wchar_vtable;
10647 #if _MSVCP_VER >=110
10648 static wchar_t* create_time_get_str(const wchar_t *str)
10650 wchar_t *ret;
10651 int len;
10653 len = strlenW(str)+1;
10654 ret = MSVCRT_operator_new(len * sizeof(wchar_t));
10655 if(ret)
10656 memcpy(ret, str, len*sizeof(wchar_t));
10657 return ret;
10659 #else
10660 static wchar_t* create_time_get_str(const char *str, const _Locinfo *locinfo)
10662 wchar_t *ret;
10663 _Cvtvec cvt;
10664 int len;
10666 _Locinfo__Getcvt(locinfo, &cvt);
10667 len = MultiByteToWideChar(cvt.page, 0, str, -1, NULL, 0);
10668 ret = MSVCRT_operator_new(len*sizeof(WCHAR));
10669 if(ret)
10670 MultiByteToWideChar(cvt.page, 0, str, -1, ret, len);
10671 return ret;
10673 #endif
10675 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
10676 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
10677 DEFINE_THISCALL_WRAPPER(time_get_wchar__Init, 8)
10678 void __thiscall time_get_wchar__Init(time_get_wchar *this, const _Locinfo *locinfo)
10680 TRACE("(%p %p)\n", this, locinfo);
10682 #if _MSVCP_VER >=110
10683 this->days = create_time_get_str(_Locinfo__W_Getdays(locinfo));
10684 #else
10685 this->days = create_time_get_str(_Locinfo__Getdays(locinfo), locinfo);
10686 #endif
10687 if(!this->days)
10689 ERR("Out of memory\n");
10690 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
10693 #if _MSVCP_VER >=110
10694 this->months = create_time_get_str(_Locinfo__W_Getmonths(locinfo));
10695 #else
10696 this->months = create_time_get_str(_Locinfo__Getmonths(locinfo), locinfo);
10697 #endif
10698 if(!this->months)
10700 MSVCRT_operator_delete((wchar_t*)this->days);
10702 ERR("Out of memory\n");
10703 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
10706 this->dateorder = _Locinfo__Getdateorder(locinfo);
10707 _Locinfo__Getcvt(locinfo, &this->cvt);
10710 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
10711 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
10712 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_locinfo, 12)
10713 time_get_wchar* __thiscall time_get_wchar_ctor_locinfo(time_get_wchar *this,
10714 const _Locinfo *locinfo, MSVCP_size_t refs)
10716 TRACE("(%p %p %lu)\n", this, locinfo, refs);
10717 locale_facet_ctor_refs(&this->facet, refs);
10718 this->facet.vtable = &MSVCP_time_get_wchar_vtable;
10719 time_get_wchar__Init(this, locinfo);
10720 return this;
10723 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
10724 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
10725 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_name, 12)
10726 time_get_wchar* __thiscall time_get_wchar_ctor_name(time_get_wchar *this, const char *name, MSVCP_size_t refs)
10728 _Locinfo locinfo;
10730 TRACE("(%p %s %lu)\n", this, name, refs);
10732 _Locinfo_ctor_cstr(&locinfo, name);
10733 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10734 _Locinfo_dtor(&locinfo);
10735 return this;
10738 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
10739 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
10740 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_refs, 8)
10741 time_get_wchar* __thiscall time_get_wchar_ctor_refs(time_get_wchar *this, MSVCP_size_t refs)
10743 _Locinfo locinfo;
10745 TRACE("(%p %lu)\n", this, refs);
10747 _Locinfo_ctor(&locinfo);
10748 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10749 _Locinfo_dtor(&locinfo);
10750 return this;
10753 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
10754 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
10755 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor, 4)
10756 time_get_wchar* __thiscall time_get_wchar_ctor(time_get_wchar *this)
10758 return time_get_wchar_ctor_refs(this, 0);
10761 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AAEXXZ */
10762 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEAAXXZ */
10763 DEFINE_THISCALL_WRAPPER(time_get_wchar__Tidy, 4)
10764 void __thiscall time_get_wchar__Tidy(time_get_wchar *this)
10766 TRACE("(%p)\n", this);
10768 MSVCRT_operator_delete((wchar_t*)this->days);
10769 MSVCRT_operator_delete((wchar_t*)this->months);
10772 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
10773 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
10774 DEFINE_THISCALL_WRAPPER(time_get_wchar_dtor, 4) /* virtual */
10775 void __thiscall time_get_wchar_dtor(time_get_wchar *this)
10777 TRACE("(%p)\n", this);
10779 time_get_wchar__Tidy(this);
10782 DEFINE_THISCALL_WRAPPER(time_get_wchar_vector_dtor, 8)
10783 time_get_wchar* __thiscall time_get_wchar_vector_dtor(time_get_wchar *this, unsigned int flags)
10785 TRACE("(%p %x)\n", this, flags);
10786 if(flags & 2) {
10787 /* we have an array, with the number of elements stored before the first object */
10788 INT_PTR i, *ptr = (INT_PTR *)this-1;
10790 for(i=*ptr-1; i>=0; i--)
10791 time_get_wchar_dtor(this+i);
10792 MSVCRT_operator_delete(ptr);
10793 } else {
10794 time_get_wchar_dtor(this);
10795 if(flags & 1)
10796 MSVCRT_operator_delete(this);
10799 return this;
10802 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
10803 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
10804 unsigned int __cdecl time_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
10806 TRACE("(%p %p)\n", facet, loc);
10808 if(facet && !*facet) {
10809 _Locinfo locinfo;
10811 *facet = MSVCRT_operator_new(sizeof(time_get_wchar));
10812 if(!*facet) {
10813 ERR("Out of memory\n");
10814 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
10815 return 0;
10818 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
10819 time_get_wchar_ctor_locinfo((time_get_wchar*)*facet, &locinfo, 0);
10820 _Locinfo_dtor(&locinfo);
10823 return LC_TIME;
10826 static time_get_wchar* time_get_wchar_use_facet(const locale *loc)
10828 static time_get_wchar *obj = NULL;
10830 _Lockit lock;
10831 const locale_facet *fac;
10833 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
10834 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_wchar_id));
10835 if(fac) {
10836 _Lockit_dtor(&lock);
10837 return (time_get_wchar*)fac;
10840 if(obj) {
10841 _Lockit_dtor(&lock);
10842 return obj;
10845 time_get_wchar__Getcat(&fac, loc);
10846 obj = (time_get_wchar*)fac;
10847 call_locale_facet__Incref(&obj->facet);
10848 locale_facet_register(&obj->facet);
10849 _Lockit_dtor(&lock);
10851 return obj;
10854 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAAH@Z */
10855 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAEAH@Z */
10856 int __cdecl time_get_wchar__Getint(const time_get_wchar *this,
10857 istreambuf_iterator_wchar *b, istreambuf_iterator_wchar *e,
10858 int min_val, int max_val, int *val)
10860 BOOL got_digit = FALSE;
10861 int len = 0, ret = 0;
10862 char buf[16];
10864 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
10866 istreambuf_iterator_wchar_val(b);
10867 if(b->strbuf && (b->val == '-' || b->val == '+'))
10869 buf[len++] = b->val;
10870 istreambuf_iterator_wchar_inc(b);
10873 if (b->strbuf && b->val == '0')
10875 got_digit = TRUE;
10876 buf[len++] = '0';
10877 istreambuf_iterator_wchar_inc(b);
10879 while (b->strbuf && b->val == '0')
10880 istreambuf_iterator_wchar_inc(b);
10882 for (; b->strbuf && b->val >= '0' && b->val <= '9';
10883 istreambuf_iterator_wchar_inc(b))
10885 if(len < ARRAY_SIZE(buf)-1)
10886 buf[len] = b->val;
10887 got_digit = TRUE;
10888 len++;
10891 if (!b->strbuf)
10892 ret |= IOSTATE_eofbit;
10893 if (got_digit && len < ARRAY_SIZE(buf)-1)
10895 int v, err;
10897 buf[len] = 0;
10898 v = _Stolx(buf, NULL, 10, &err);
10899 if(err || v < min_val || v > max_val)
10900 ret |= IOSTATE_failbit;
10901 else
10902 *val = v;
10904 else
10905 ret |= IOSTATE_failbit;
10906 return ret;
10909 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
10910 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
10911 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_date_order, 4) /* virtual */
10912 #if _MSVCP_VER <= 100
10913 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_wchar*), (this))
10914 #else
10915 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_wchar*), (this))
10916 #endif
10917 dateorder __thiscall time_get_wchar_do_date_order(const time_get_wchar *this)
10919 TRACE("(%p)\n", this);
10920 return this->dateorder;
10923 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
10924 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
10925 DEFINE_THISCALL_WRAPPER(time_get_wchar_date_order, 4)
10926 dateorder __thiscall time_get_wchar_date_order(const time_get_wchar *this)
10928 return call_time_get_wchar_do_date_order(this);
10931 static int find_longest_match_wchar(istreambuf_iterator_wchar *iter, const wchar_t *str)
10933 int i, len = 0, last_match = -1, match = -1;
10934 const wchar_t *p, *end;
10935 wchar_t buf[64];
10937 for(istreambuf_iterator_wchar_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
10938 istreambuf_iterator_wchar_inc(iter))
10940 BOOL got_prefix = FALSE;
10942 buf[len++] = iter->val;
10943 last_match = match;
10944 match = -1;
10945 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
10947 end = strchrW(p, ':');
10948 if (!end)
10949 end = p + strlenW(p);
10951 if (end-p >= len && !memcmp(p, buf, len*sizeof(wchar_t)))
10953 if (end-p == len)
10954 match = i;
10955 else
10956 got_prefix = TRUE;
10960 if (!got_prefix)
10962 if (match != -1)
10964 istreambuf_iterator_wchar_inc(iter);
10965 return match;
10967 break;
10970 if (len == ARRAY_SIZE(buf))
10971 FIXME("temporary buffer is too small\n");
10972 if (!iter->strbuf)
10973 return match;
10974 return last_match;
10977 /* ?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 */
10978 /* ?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 */
10979 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_monthname, 36) /* virtual */
10980 #if _MSVCP_VER <= 100
10981 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
10982 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10983 (this, ret, s, e, base, err, t))
10984 #else
10985 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
10986 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10987 (this, ret, s, e, base, err, t))
10988 #endif
10989 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_monthname(const time_get_wchar *this,
10990 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
10991 ios_base *base, int *err, struct tm *t)
10993 int match;
10995 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10997 if ((match = find_longest_match_wchar(&s, this->months)) != -1)
10998 t->tm_mon = match / 2;
10999 else
11000 *err |= IOSTATE_failbit;
11002 *ret = s;
11003 return ret;
11006 /* ?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 */
11007 /* ?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 */
11008 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_monthname, 36)
11009 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_monthname(const time_get_wchar *this,
11010 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11011 ios_base *base, int *err, struct tm *t)
11013 return call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t);
11016 /* ?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 */
11017 /* ?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 */
11018 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_time, 36) /* virtual */
11019 #if _MSVCP_VER <= 100
11020 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
11021 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11022 (this, ret, s, e, base, err, t))
11023 #else
11024 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
11025 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11026 (this, ret, s, e, base, err, t))
11027 #endif
11028 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_time(const time_get_wchar *this,
11029 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11030 ios_base *base, int *err, struct tm *t)
11032 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11034 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
11035 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
11036 *err |= IOSTATE_failbit;
11038 if (!*err)
11040 istreambuf_iterator_wchar_inc(&s);
11041 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
11043 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
11044 *err |= IOSTATE_failbit;
11046 if (!*err)
11048 istreambuf_iterator_wchar_inc(&s);
11049 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
11052 *ret = s;
11053 return ret;
11056 /* ?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 */
11057 /* ?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 */
11058 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_time, 36)
11059 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_time(const time_get_wchar *this,
11060 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11061 ios_base *base, int *err, struct tm *t)
11063 return call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t);
11066 /* ?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 */
11067 /* ?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 */
11068 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_weekday, 36) /* virtual */
11069 #if _MSVCP_VER <= 100
11070 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
11071 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11072 (this, ret, s, e, base, err, t))
11073 #else
11074 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
11075 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11076 (this, ret, s, e, base, err, t))
11077 #endif
11078 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_weekday(const time_get_wchar *this,
11079 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11080 ios_base *base, int *err, struct tm *t)
11082 int match;
11084 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11086 if ((match = find_longest_match_wchar(&s, this->days)) != -1)
11087 t->tm_wday = match / 2;
11088 else
11089 *err |= IOSTATE_failbit;
11091 *ret = s;
11092 return ret;
11095 /* ?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 */
11096 /* ?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 */
11097 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_weekday, 36)
11098 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_weekday(const time_get_wchar *this,
11099 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11100 ios_base *base, int *err, struct tm *t)
11102 return call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t);
11105 /* ?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 */
11106 /* ?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 */
11107 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_year, 36) /* virtual */
11108 #if _MSVCP_VER <= 100
11109 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
11110 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11111 (this, ret, s, e, base, err, t))
11112 #else
11113 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
11114 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11115 (this, ret, s, e, base, err, t))
11116 #endif
11117 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_year(const time_get_wchar *this,
11118 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11119 ios_base *base, int *err, struct tm *t)
11121 int year;
11123 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11125 /* The function supports only dates from [1900-2035] range */
11126 *err |= time_get_wchar__Getint(this, &s, &e, 0, 2035, &year);
11127 if (!(*err & IOSTATE_failbit))
11129 if (year >= 1900)
11130 year -= 1900;
11131 if (year > 135)
11132 *err |= IOSTATE_failbit;
11133 else
11134 t->tm_year = year;
11137 *ret = s;
11138 return ret;
11141 /* ?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 */
11142 /* ?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 */
11143 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_year, 36)
11144 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_year(const time_get_wchar *this,
11145 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11146 ios_base *base, int *err, struct tm *t)
11148 return call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t);
11151 static void skip_ws_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
11153 istreambuf_iterator_wchar_val(iter);
11154 while(iter->strbuf && ctype_wchar_is_ch(ctype, _SPACE, iter->val))
11155 istreambuf_iterator_wchar_inc(iter);
11158 static void skip_date_delim_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
11160 skip_ws_wchar(ctype, iter);
11161 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
11162 istreambuf_iterator_wchar_inc(iter);
11163 skip_ws_wchar(ctype, iter);
11166 /* ?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 */
11167 /* ?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 */
11168 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_date, 36) /* virtual */
11169 #if _MSVCP_VER <= 100
11170 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
11171 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11172 (this, ret, s, e, base, err, t))
11173 #else
11174 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
11175 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11176 (this, ret, s, e, base, err, t))
11177 #endif
11178 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_date(const time_get_wchar *this,
11179 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11180 ios_base *base, int *err, struct tm *t)
11182 ctype_wchar *ctype;
11183 dateorder order;
11185 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11187 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11189 order = time_get_wchar_date_order(this);
11190 if(order == DATEORDER_no_order)
11191 order = DATEORDER_mdy;
11193 switch(order) {
11194 case DATEORDER_dmy:
11195 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11196 skip_date_delim_wchar(ctype, &s);
11197 if(!s.strbuf) {
11198 *err |= IOSTATE_failbit;
11199 break;
11201 if(s.strbuf && ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11202 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11203 t->tm_mon--;
11204 } else {
11205 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11207 skip_date_delim_wchar(ctype, &s);
11208 if(!s.strbuf) {
11209 *err |= IOSTATE_failbit;
11210 break;
11212 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11213 break;
11214 case DATEORDER_mdy:
11215 istreambuf_iterator_wchar_val(&s);
11216 if(s.strbuf && ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11217 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11218 t->tm_mon--;
11219 } else {
11220 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11222 skip_date_delim_wchar(ctype, &s);
11223 if(!s.strbuf) {
11224 *err |= IOSTATE_failbit;
11225 break;
11227 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11228 skip_date_delim_wchar(ctype, &s);
11229 if(!s.strbuf) {
11230 *err |= IOSTATE_failbit;
11231 break;
11233 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11234 break;
11235 case DATEORDER_ymd:
11236 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11237 skip_date_delim_wchar(ctype, &s);
11238 if(!s.strbuf) {
11239 *err |= IOSTATE_failbit;
11240 break;
11242 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11243 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11244 t->tm_mon--;
11245 } else {
11246 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11248 skip_date_delim_wchar(ctype, &s);
11249 if(!s.strbuf) {
11250 *err |= IOSTATE_failbit;
11251 break;
11253 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11254 break;
11255 case DATEORDER_ydm:
11256 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11257 skip_date_delim_wchar(ctype, &s);
11258 if(!s.strbuf) {
11259 *err |= IOSTATE_failbit;
11260 break;
11262 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11263 skip_date_delim_wchar(ctype, &s);
11264 if(!s.strbuf) {
11265 *err |= IOSTATE_failbit;
11266 break;
11268 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11269 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11270 t->tm_mon--;
11271 } else {
11272 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11274 break;
11275 default:
11276 ERR("incorrect order value: %d\n", order);
11277 break;
11280 if(!s.strbuf)
11281 *err |= IOSTATE_eofbit;
11282 *ret = s;
11283 return ret;
11286 /* ?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 */
11287 /* ?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 */
11288 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_date, 36)
11289 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_date(const time_get_wchar *this,
11290 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11291 ios_base *base, int *err, struct tm *t)
11293 return call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t);
11296 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar*,
11297 istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar,
11298 ios_base*, int*, struct tm*, char, char);
11300 /* ?_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 */
11301 /* ?_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 */
11302 DEFINE_THISCALL_WRAPPER(time_get_wchar__Getfmt, 40)
11303 istreambuf_iterator_wchar* __thiscall time_get_wchar__Getfmt(const time_get_wchar *this,
11304 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11305 ios_base *base, int *err, struct tm *t, const char *fmt)
11307 ctype_wchar *ctype;
11309 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
11311 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11312 istreambuf_iterator_wchar_val(&s);
11314 while(*fmt) {
11315 if(*fmt == ' ') {
11316 skip_ws_wchar(ctype, &s);
11317 fmt++;
11318 continue;
11321 if(!s.strbuf) {
11322 *err |= IOSTATE_failbit;
11323 break;
11326 if(*fmt == '%') {
11327 fmt++;
11328 time_get_wchar_get(this, &s, s, e, base, err, t, *fmt, 0);
11329 } else {
11330 if(s.val != *fmt)
11331 *err |= IOSTATE_failbit;
11332 else
11333 istreambuf_iterator_wchar_inc(&s);
11336 if(*err & IOSTATE_failbit)
11337 break;
11338 fmt++;
11341 if(!s.strbuf)
11342 *err |= IOSTATE_eofbit;
11343 *ret = s;
11344 return ret;
11347 /* ?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 */
11348 /* ?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 */
11349 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get, 44) /* virtual */
11350 #if _MSVCP_VER <= 100
11351 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
11352 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11353 (this, ret, s, e, base, err, t, fmt, mod))
11354 #else
11355 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
11356 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11357 (this, ret, s, e, base, err, t, fmt, mod))
11358 #endif
11359 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get(const time_get_wchar *this,
11360 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11361 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11363 ctype_wchar *ctype;
11365 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
11367 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11369 switch(fmt) {
11370 case 'a':
11371 case 'A':
11372 time_get_wchar_get_weekday(this, &s, s, e, base, err, t);
11373 break;
11374 case 'b':
11375 case 'B':
11376 case 'h':
11377 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11378 break;
11379 case 'c':
11380 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
11381 break;
11382 case 'C':
11383 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11384 if(!(*err & IOSTATE_failbit))
11385 t->tm_year = t->tm_year * 100 - 1900;
11386 break;
11387 case 'd':
11388 case 'e':
11389 if(fmt == 'e') skip_ws_wchar(ctype, &s);
11390 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11391 break;
11392 case 'D':
11393 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
11394 break;
11395 case 'F':
11396 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
11397 break;
11398 case 'H':
11399 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
11400 break;
11401 case 'I':
11402 *err |= time_get_wchar__Getint(this, &s, &e, 0, 11, &t->tm_hour);
11403 break;
11404 case 'j':
11405 *err |= time_get_wchar__Getint(this, &s, &e, 1, 366, &t->tm_yday);
11406 break;
11407 case 'm':
11408 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11409 if(!(*err & IOSTATE_failbit))
11410 t->tm_mon--;
11411 break;
11412 case 'M':
11413 *err = time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
11414 break;
11415 case 'n':
11416 case 't':
11417 skip_ws_wchar(ctype, &s);
11418 break;
11419 case 'p': {
11420 BOOL pm = FALSE;
11422 istreambuf_iterator_wchar_val(&s);
11423 if(s.strbuf && (s.val=='P' || s.val=='p'))
11424 pm = TRUE;
11425 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
11426 *err |= IOSTATE_failbit;
11427 break;
11429 istreambuf_iterator_wchar_inc(&s);
11430 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
11431 *err |= IOSTATE_failbit;
11432 break;
11434 istreambuf_iterator_wchar_inc(&s);
11436 if(pm)
11437 t->tm_hour += 12;
11438 break;
11440 case 'r':
11441 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
11442 break;
11443 case 'R':
11444 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
11445 break;
11446 case 'S':
11447 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
11448 break;
11449 case 'T':
11450 case 'X':
11451 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
11452 break;
11453 case 'u':
11454 *err |= time_get_wchar__Getint(this, &s, &e, 1, 7, &t->tm_wday);
11455 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
11456 t->tm_wday = 0;
11457 break;
11458 case 'w':
11459 *err |= time_get_wchar__Getint(this, &s, &e, 0, 6, &t->tm_wday);
11460 break;
11461 case 'x':
11462 time_get_wchar_get_date(this, &s, s, e, base, err, t);
11463 break;
11464 case 'y':
11465 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11466 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
11467 t->tm_year += 100;
11468 break;
11469 case 'Y':
11470 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11471 break;
11472 default:
11473 FIXME("unrecognized format: %c\n", fmt);
11474 *err |= IOSTATE_failbit;
11477 if(!s.strbuf)
11478 *err |= IOSTATE_eofbit;
11479 *ret = s;
11480 return ret;
11483 /* ?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 */
11484 /* ?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 */
11485 DEFINE_THISCALL_WRAPPER(time_get_wchar_get, 44)
11486 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar *this,
11487 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11488 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11490 return call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod);
11493 /* ?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 */
11494 /* ?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 */
11495 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_fmt, 44)
11496 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_fmt(const time_get_wchar *this,
11497 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11498 ios_base *base, int *err, struct tm *t, const wchar_t *fmtstart, const wchar_t *fmtend)
11500 ctype_wchar *ctype;
11502 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_wn(fmtstart, fmtend-fmtstart));
11504 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11505 istreambuf_iterator_wchar_val(&s);
11507 while(fmtstart < fmtend) {
11508 if(ctype_wchar_is_ch(ctype, _SPACE, *fmtstart)) {
11509 skip_ws_wchar(ctype, &s);
11510 fmtstart++;
11511 continue;
11514 if(!s.strbuf) {
11515 *err |= IOSTATE_failbit;
11516 break;
11519 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
11520 if(s.val != *fmtstart)
11521 *err |= IOSTATE_failbit;
11522 else
11523 istreambuf_iterator_wchar_inc(&s);
11524 if(*fmtstart == '%')
11525 fmtstart++;
11526 } else {
11527 fmtstart++;
11528 time_get_wchar_get(this, &s, s, e, base, err, t, *fmtstart, 0);
11531 if(*err & IOSTATE_failbit)
11532 break;
11533 fmtstart++;
11536 if(!s.strbuf)
11537 *err |= IOSTATE_eofbit;
11538 *ret = s;
11539 return ret;
11542 /* ??_7_Locimp@locale@std@@6B@ */
11543 extern const vtable_ptr MSVCP_locale__Locimp_vtable;
11545 /* ??0_Locimp@locale@std@@AAE@_N@Z */
11546 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
11547 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
11548 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, MSVCP_bool transparent)
11550 TRACE("(%p %d)\n", this, transparent);
11552 memset(this, 0, sizeof(locale__Locimp));
11553 locale_facet_ctor_refs(&this->facet, 1);
11554 this->facet.vtable = &MSVCP_locale__Locimp_vtable;
11555 this->transparent = transparent;
11556 locale_string_char_ctor_cstr(&this->name, "*");
11557 return this;
11560 /* ??_F_Locimp@locale@std@@QAEXXZ */
11561 /* ??_F_Locimp@locale@std@@QEAAXXZ */
11562 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
11563 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
11565 return locale__Locimp_ctor_transparent(this, FALSE);
11568 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
11569 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
11570 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
11571 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
11573 _Lockit lock;
11574 MSVCP_size_t i;
11576 TRACE("(%p %p)\n", this, copy);
11578 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11579 memcpy(this, copy, sizeof(locale__Locimp));
11580 locale_facet_ctor_refs(&this->facet, 1);
11581 this->facet.vtable = &MSVCP_locale__Locimp_vtable;
11582 if(copy->facetvec) {
11583 this->facetvec = MSVCRT_operator_new(copy->facet_cnt*sizeof(locale_facet*));
11584 if(!this->facetvec) {
11585 _Lockit_dtor(&lock);
11586 ERR("Out of memory\n");
11587 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11588 return NULL;
11590 for(i=0; i<this->facet_cnt; i++)
11592 this->facetvec[i] = copy->facetvec[i];
11593 if(this->facetvec[i])
11594 call_locale_facet__Incref(this->facetvec[i]);
11597 locale_string_char_copy_ctor(&this->name, &copy->name);
11598 _Lockit_dtor(&lock);
11599 return this;
11602 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
11603 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
11604 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
11606 return locale__Locimp_copy_ctor(this, copy);
11609 /* ??1_Locimp@locale@std@@MAE@XZ */
11610 /* ??1_Locimp@locale@std@@MEAA@XZ */
11611 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
11612 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
11614 MSVCP_size_t i;
11616 TRACE("(%p)\n", this);
11618 locale_facet_dtor(&this->facet);
11619 for(i=0; i<this->facet_cnt; i++)
11620 if(this->facetvec[i] && call_locale_facet__Decref(this->facetvec[i]))
11621 call_locale_facet_vector_dtor(this->facetvec[i], 1);
11623 MSVCRT_operator_delete(this->facetvec);
11624 locale_string_char_dtor(&this->name);
11627 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
11628 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
11629 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
11631 locale__Locimp_dtor(this);
11634 DEFINE_THISCALL_WRAPPER(locale__Locimp_vector_dtor, 8)
11635 locale__Locimp* __thiscall locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
11637 TRACE("(%p %x)\n", this, flags);
11638 if(flags & 2) {
11639 /* we have an array, with the number of elements stored before the first object */
11640 INT_PTR i, *ptr = (INT_PTR *)this-1;
11642 for(i=*ptr-1; i>=0; i--)
11643 locale__Locimp_dtor(this+i);
11644 MSVCRT_operator_delete(ptr);
11645 } else {
11646 locale__Locimp_dtor(this);
11647 if(flags & 1)
11648 MSVCRT_operator_delete(this);
11651 return this;
11654 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@ABV123@@Z */
11655 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@AEBV123@@Z */
11656 locale__Locimp* __cdecl locale__Locimp__New_Locimp(const locale__Locimp *copy)
11658 locale__Locimp *ret;
11660 TRACE("(%p)\n", copy);
11662 ret = MSVCRT_operator_new(sizeof(locale__Locimp));
11663 if(!ret) {
11664 ERR("Out of memory\n");
11665 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11666 return NULL;
11668 return locale__Locimp_copy_ctor(ret, copy);
11671 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@_N@Z */
11672 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z */
11673 locale__Locimp* __cdecl locale__Locimp__New_Locimp_transparent(MSVCP_bool transparent)
11675 locale__Locimp *ret;
11677 TRACE("(%x)\n", transparent);
11679 ret = MSVCRT_operator_new(sizeof(locale__Locimp));
11680 if(!ret) {
11681 ERR("Out of memory\n");
11682 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11683 return NULL;
11685 return locale__Locimp_ctor_transparent(ret, transparent);
11688 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
11689 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
11690 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, MSVCP_size_t id)
11692 _Lockit lock;
11694 TRACE("(%p %p %lu)\n", locimp, facet, id);
11696 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11697 if(id >= locimp->facet_cnt) {
11698 MSVCP_size_t new_size = id+1;
11699 locale_facet **new_facetvec;
11701 if(new_size < 40)
11702 new_size = 40;
11704 new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
11705 if(!new_facetvec) {
11706 _Lockit_dtor(&lock);
11707 ERR("Out of memory\n");
11708 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11709 return;
11712 memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
11713 memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
11714 MSVCRT_operator_delete(locimp->facetvec);
11715 locimp->facetvec = new_facetvec;
11716 locimp->facet_cnt = new_size;
11719 if(locimp->facetvec[id] && call_locale_facet__Decref(locimp->facetvec[id]))
11720 call_locale_facet_vector_dtor(locimp->facetvec[id], 1);
11722 locimp->facetvec[id] = facet;
11723 if(facet)
11724 call_locale_facet__Incref(facet);
11725 _Lockit_dtor(&lock);
11728 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
11729 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
11730 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
11731 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, MSVCP_size_t id)
11733 locale__Locimp__Locimp_Addfac(this, facet, id);
11736 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
11737 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
11738 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
11740 FIXME("stub\n");
11741 return NULL;
11744 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11745 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11746 /* List of missing facets:
11747 * messages, money_get, money_put, moneypunct, moneypunct, time_get
11749 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11751 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11753 if(cat & (1<<(ctype_short__Getcat(NULL, NULL)-1))) {
11754 ctype_wchar *ctype;
11756 if(loc) {
11757 ctype = ctype_short_use_facet(loc);
11758 }else {
11759 ctype = MSVCRT_operator_new(sizeof(ctype_wchar));
11760 if(!ctype) {
11761 ERR("Out of memory\n");
11762 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11764 ctype_short_ctor_locinfo(ctype, locinfo, 0);
11766 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_short_id));
11769 if(cat & (1<<(num_get_short__Getcat(NULL, NULL)-1))) {
11770 num_get *numget;
11772 if(loc) {
11773 numget = num_get_short_use_facet(loc);
11774 }else {
11775 numget = MSVCRT_operator_new(sizeof(num_get));
11776 if(!numget) {
11777 ERR("Out of memory\n");
11778 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11780 num_get_short_ctor_locinfo(numget, locinfo, 0);
11782 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_short_id));
11785 if(cat & (1<<(num_put_short__Getcat(NULL, NULL)-1))) {
11786 num_put *numput;
11788 if(loc) {
11789 numput = num_put_short_use_facet(loc);
11790 }else {
11791 numput = MSVCRT_operator_new(sizeof(num_put));
11792 if(!numput) {
11793 ERR("Out of memory\n");
11794 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11796 num_put_short_ctor_locinfo(numput, locinfo, 0);
11798 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_short_id));
11801 if(cat & (1<<(numpunct_short__Getcat(NULL, NULL)-1))) {
11802 numpunct_wchar *numpunct;
11804 if(loc) {
11805 numpunct = numpunct_short_use_facet(loc);
11806 }else {
11807 numpunct = MSVCRT_operator_new(sizeof(numpunct_wchar));
11808 if(!numpunct) {
11809 ERR("Out of memory\n");
11810 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11812 numpunct_short_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11814 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_short_id));
11817 if(cat & (1<<(collate_short__Getcat(NULL, NULL)-1))) {
11818 collate *c;
11820 if(loc) {
11821 c = collate_short_use_facet(loc);
11822 }else {
11823 c = MSVCRT_operator_new(sizeof(collate));
11824 if(!c) {
11825 ERR("Out of memory\n");
11826 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11828 collate_short_ctor_locinfo(c, locinfo, 0);
11830 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_short_id));
11833 if(cat & (1<<(time_put_short__Getcat(NULL, NULL)-1))) {
11834 time_put *t;
11836 if(loc) {
11837 t = time_put_short_use_facet(loc);
11838 }else {
11839 t = MSVCRT_operator_new(sizeof(time_put));
11840 if(!t) {
11841 ERR("Out of memory\n");
11842 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11844 time_put_short_ctor_locinfo(t, locinfo, 0);
11846 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_short_id));
11849 if(cat & (1<<(codecvt_short__Getcat(NULL, NULL)-1))) {
11850 codecvt_wchar *codecvt;
11852 if(loc) {
11853 codecvt = codecvt_short_use_facet(loc);
11854 }else {
11855 codecvt = MSVCRT_operator_new(sizeof(codecvt_wchar));
11856 if(!codecvt) {
11857 ERR("Out of memory\n");
11858 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11860 codecvt_short_ctor_locinfo(codecvt, locinfo, 0);
11862 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_short_id));
11866 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11867 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11868 /* List of missing facets:
11869 * messages, money_get, money_put, moneypunct, moneypunct
11871 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11873 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11875 if(cat & (1<<(ctype_wchar__Getcat(NULL, NULL)-1))) {
11876 ctype_wchar *ctype;
11878 if(loc) {
11879 ctype = ctype_wchar_use_facet(loc);
11880 }else {
11881 ctype = MSVCRT_operator_new(sizeof(ctype_wchar));
11882 if(!ctype) {
11883 ERR("Out of memory\n");
11884 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11886 ctype_wchar_ctor_locinfo(ctype, locinfo, 0);
11888 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_wchar_id));
11891 if(cat & (1<<(num_get_wchar__Getcat(NULL, NULL)-1))) {
11892 num_get *numget;
11894 if(loc) {
11895 numget = num_get_wchar_use_facet(loc);
11896 }else {
11897 numget = MSVCRT_operator_new(sizeof(num_get));
11898 if(!numget) {
11899 ERR("Out of memory\n");
11900 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11902 num_get_wchar_ctor_locinfo(numget, locinfo, 0);
11904 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_wchar_id));
11907 if(cat & (1<<(num_put_wchar__Getcat(NULL, NULL)-1))) {
11908 num_put *numput;
11910 if(loc) {
11911 numput = num_put_wchar_use_facet(loc);
11912 }else {
11913 numput = MSVCRT_operator_new(sizeof(num_put));
11914 if(!numput) {
11915 ERR("Out of memory\n");
11916 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11918 num_put_wchar_ctor_locinfo(numput, locinfo, 0);
11920 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_wchar_id));
11923 if(cat & (1<<(numpunct_wchar__Getcat(NULL, NULL)-1))) {
11924 numpunct_wchar *numpunct;
11926 if(loc) {
11927 numpunct = numpunct_wchar_use_facet(loc);
11928 }else {
11929 numpunct = MSVCRT_operator_new(sizeof(numpunct_wchar));
11930 if(!numpunct) {
11931 ERR("Out of memory\n");
11932 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11934 numpunct_wchar_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11936 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_wchar_id));
11939 if(cat & (1<<(collate_wchar__Getcat(NULL, NULL)-1))) {
11940 collate *c;
11942 if(loc) {
11943 c = collate_wchar_use_facet(loc);
11944 }else {
11945 c = MSVCRT_operator_new(sizeof(collate));
11946 if(!c) {
11947 ERR("Out of memory\n");
11948 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11950 collate_wchar_ctor_locinfo(c, locinfo, 0);
11952 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_wchar_id));
11955 if(cat & (1<<(time_get_wchar__Getcat(NULL, NULL)-1))) {
11956 time_get_wchar *t;
11958 if(loc) {
11959 t = time_get_wchar_use_facet(loc);
11960 }else {
11961 t = MSVCRT_operator_new(sizeof(time_get_wchar));
11962 if(!t) {
11963 ERR("Out of memory\n");
11964 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11966 time_get_wchar_ctor_locinfo(t, locinfo, 0);
11968 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_wchar_id));
11971 if(cat & (1<<(time_put_wchar__Getcat(NULL, NULL)-1))) {
11972 time_put *t;
11974 if(loc) {
11975 t = time_put_wchar_use_facet(loc);
11976 }else {
11977 t = MSVCRT_operator_new(sizeof(time_put));
11978 if(!t) {
11979 ERR("Out of memory\n");
11980 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11982 time_put_wchar_ctor_locinfo(t, locinfo, 0);
11984 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_wchar_id));
11987 if(cat & (1<<(codecvt_wchar__Getcat(NULL, NULL)-1))) {
11988 codecvt_wchar *codecvt;
11990 if(loc) {
11991 codecvt = codecvt_wchar_use_facet(loc);
11992 }else {
11993 codecvt = MSVCRT_operator_new(sizeof(codecvt_wchar));
11994 if(!codecvt) {
11995 ERR("Out of memory\n");
11996 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11998 codecvt_wchar_ctor_locinfo(codecvt, locinfo, 0);
12000 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_wchar_id));
12004 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
12005 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
12006 /* List of missing facets:
12007 * messages, money_get, money_put, moneypunct, moneypunct
12009 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
12011 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
12013 if(cat & (1<<(ctype_char__Getcat(NULL, NULL)-1))) {
12014 ctype_char *ctype;
12016 if(loc) {
12017 ctype = ctype_char_use_facet(loc);
12018 }else {
12019 ctype = MSVCRT_operator_new(sizeof(ctype_char));
12020 if(!ctype) {
12021 ERR("Out of memory\n");
12022 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12024 ctype_char_ctor_locinfo(ctype, locinfo, 0);
12026 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_char_id));
12029 if(cat & (1<<(num_get_char__Getcat(NULL, NULL)-1))) {
12030 num_get *numget;
12032 if(loc) {
12033 numget = num_get_char_use_facet(loc);
12034 }else {
12035 numget = MSVCRT_operator_new(sizeof(num_get));
12036 if(!numget) {
12037 ERR("Out of memory\n");
12038 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12040 num_get_char_ctor_locinfo(numget, locinfo, 0);
12042 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_char_id));
12045 if(cat & (1<<(num_put_char__Getcat(NULL, NULL)-1))) {
12046 num_put *numput;
12048 if(loc) {
12049 numput = num_put_char_use_facet(loc);
12050 }else {
12051 numput = MSVCRT_operator_new(sizeof(num_put));
12052 if(!numput) {
12053 ERR("Out of memory\n");
12054 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12056 num_put_char_ctor_locinfo(numput, locinfo, 0);
12058 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_char_id));
12061 if(cat & (1<<(numpunct_char__Getcat(NULL, NULL)-1))) {
12062 numpunct_char *numpunct;
12064 if(loc) {
12065 numpunct = numpunct_char_use_facet(loc);
12066 }else {
12067 numpunct = MSVCRT_operator_new(sizeof(numpunct_char));
12068 if(!numpunct) {
12069 ERR("Out of memory\n");
12070 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12072 numpunct_char_ctor_locinfo(numpunct, locinfo, 0, FALSE);
12074 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_char_id));
12077 if(cat & (1<<(collate_char__Getcat(NULL, NULL)-1))) {
12078 collate *c;
12080 if(loc) {
12081 c = collate_char_use_facet(loc);
12082 }else {
12083 c = MSVCRT_operator_new(sizeof(collate));
12084 if(!c) {
12085 ERR("Out of memory\n");
12086 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12088 collate_char_ctor_locinfo(c, locinfo, 0);
12090 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_char_id));
12093 if(cat & (1<<(time_get_char__Getcat(NULL, NULL)-1))) {
12094 time_get_char *t;
12096 if(loc) {
12097 t = time_get_char_use_facet(loc);
12098 }else {
12099 t = MSVCRT_operator_new(sizeof(time_get_char));
12100 if(!t) {
12101 ERR("Out of memory\n");
12102 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12104 time_get_char_ctor_locinfo(t, locinfo, 0);
12106 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_char_id));
12109 if(cat & (1<<(time_put_char__Getcat(NULL, NULL)-1))) {
12110 time_put *t;
12112 if(loc) {
12113 t = time_put_char_use_facet(loc);
12114 }else {
12115 t = MSVCRT_operator_new(sizeof(time_put));
12116 if(!t) {
12117 ERR("Out of memory\n");
12118 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12120 time_put_char_ctor_locinfo(t, locinfo, 0);
12122 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_char_id));
12125 if(cat & (1<<(codecvt_char__Getcat(NULL, NULL)-1))) {
12126 codecvt_char *codecvt;
12128 if(loc) {
12129 codecvt = codecvt_char_use_facet(loc);
12130 }else {
12131 codecvt = MSVCRT_operator_new(sizeof(codecvt_char));
12132 if(!codecvt) {
12133 ERR("Out of memory\n");
12134 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12136 codecvt_char_ctor_locinfo(codecvt, locinfo, 0);
12138 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_char_id));
12142 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
12143 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
12144 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
12146 TRACE("(%p %d %p %p)\n", locinfo, cat, locimp, loc);
12148 locale__Locimp__Makexloc(locinfo, cat, locimp, loc);
12149 locale__Locimp__Makewloc(locinfo, cat, locimp, loc);
12150 locale__Locimp__Makeushloc(locinfo, cat, locimp, loc);
12152 locimp->catmask |= cat;
12153 locale_string_char_assign(&locimp->name, &locinfo->newlocname);
12154 return locimp;
12157 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
12158 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
12159 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
12160 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
12162 TRACE("(%p %p)\n", this, locimp);
12163 /* Don't change locimp reference counter */
12164 this->ptr = locimp;
12165 return this;
12168 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
12169 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
12170 locale__Locimp* __cdecl locale__Init(void)
12172 _Lockit lock;
12174 TRACE("\n");
12176 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12177 if(global_locale) {
12178 _Lockit_dtor(&lock);
12179 return global_locale;
12182 global_locale = MSVCRT_operator_new(sizeof(locale__Locimp));
12183 if(!global_locale) {
12184 _Lockit_dtor(&lock);
12185 ERR("Out of memory\n");
12186 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12187 return NULL;
12190 locale__Locimp_ctor(global_locale);
12191 global_locale->catmask = (1<<(LC_MAX+1))-1;
12192 locale_string_char_dtor(&global_locale->name);
12193 locale_string_char_ctor_cstr(&global_locale->name, "C");
12195 locale__Locimp__Clocptr = global_locale;
12196 global_locale->facet.refs++;
12197 locale_ctor_locimp(&classic_locale, locale__Locimp__Clocptr);
12198 _Lockit_dtor(&lock);
12200 return global_locale;
12203 /* ?_Init@locale@std@@CAPAV_Locimp@12@_N@Z */
12204 /* ?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z */
12205 locale__Locimp* __cdecl locale__Init_ref(MSVCP_bool inc_ref)
12207 locale__Locimp *ret;
12208 _Lockit lock;
12210 TRACE("(%x)\n", inc_ref);
12212 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12213 if(inc_ref && global_locale) {
12214 call_locale_facet__Incref(&global_locale->facet);
12215 _Lockit_dtor(&lock);
12216 return global_locale;
12219 ret = locale__Init();
12220 _Lockit_dtor(&lock);
12221 return ret;
12224 /* ?_Iscloc@locale@std@@QBE_NXZ */
12225 /* ?_Iscloc@locale@std@@QEBA_NXZ */
12226 DEFINE_THISCALL_WRAPPER(locale__Iscloc, 4)
12227 MSVCP_bool __thiscall locale__Iscloc(const locale *this)
12229 TRACE("(%p)\n", this);
12230 return this->ptr == locale__Locimp__Clocptr;
12233 /* ??0locale@std@@QAE@ABV01@0H@Z */
12234 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
12235 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
12236 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
12238 _Locinfo locinfo;
12240 TRACE("(%p %p %p %d)\n", this, loc, other, cat);
12242 this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12243 if(!this->ptr) {
12244 ERR("Out of memory\n");
12245 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12247 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
12249 _Locinfo_ctor_cat_cstr(&locinfo, loc->ptr->catmask, locale_string_char_c_str(&loc->ptr->name));
12250 _Locinfo__Addcats(&locinfo, cat & other->ptr->catmask, locale_string_char_c_str(&other->ptr->name));
12251 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, other);
12252 _Locinfo_dtor(&locinfo);
12254 return this;
12257 /* ??0locale@std@@QAE@ABV01@@Z */
12258 /* ??0locale@std@@QEAA@AEBV01@@Z */
12259 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
12260 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
12262 TRACE("(%p %p)\n", this, copy);
12263 this->ptr = copy->ptr;
12264 call_locale_facet__Incref(&this->ptr->facet);
12265 return this;
12268 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
12269 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
12270 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
12271 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
12273 _Locinfo locinfo;
12275 TRACE("(%p %p %s %d)\n", this, loc, locname, cat);
12277 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
12278 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
12279 _Locinfo_dtor(&locinfo);
12280 MSVCRT_operator_delete(this->ptr);
12281 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
12284 this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12285 if(!this->ptr) {
12286 ERR("Out of memory\n");
12287 _Locinfo_dtor(&locinfo);
12288 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12290 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
12292 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
12293 _Locinfo_dtor(&locinfo);
12294 return this;
12297 /* ??0locale@std@@QAE@PBDH@Z */
12298 /* ??0locale@std@@QEAA@PEBDH@Z */
12299 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
12300 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
12302 _Locinfo locinfo;
12304 TRACE("(%p %s %d)\n", this, locname, cat);
12306 this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12307 if(!this->ptr) {
12308 ERR("Out of memory\n");
12309 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12311 locale__Locimp_ctor(this->ptr);
12313 locale__Init();
12315 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
12316 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
12317 _Locinfo_dtor(&locinfo);
12318 MSVCRT_operator_delete(this->ptr);
12319 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
12322 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
12323 _Locinfo_dtor(&locinfo);
12325 return this;
12328 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
12329 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
12330 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
12331 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
12333 TRACE("(%p)\n", this);
12334 this->ptr = NULL;
12335 return this;
12338 /* ??0locale@std@@QAE@XZ */
12339 /* ??0locale@std@@QEAA@XZ */
12340 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
12341 locale* __thiscall locale_ctor(locale *this)
12343 TRACE("(%p)\n", this);
12344 this->ptr = locale__Init();
12345 call_locale_facet__Incref(&this->ptr->facet);
12346 return this;
12349 /* ??1locale@std@@QAE@XZ */
12350 /* ??1locale@std@@QEAA@XZ */
12351 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
12352 void __thiscall locale_dtor(locale *this)
12354 TRACE("(%p)\n", this);
12355 if(this->ptr && call_locale_facet__Decref(&this->ptr->facet))
12357 locale__Locimp_dtor(this->ptr);
12358 MSVCRT_operator_delete(this->ptr);
12362 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
12363 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
12364 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
12365 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
12367 FIXME("(%p %p) stub\n", this, loc);
12368 return NULL;
12371 /* ??8locale@std@@QBE_NABV01@@Z */
12372 /* ??8locale@std@@QEBA_NAEBV01@@Z */
12373 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
12374 MSVCP_bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
12376 FIXME("(%p %p) stub\n", this, loc);
12377 return 0;
12380 /* ??9locale@std@@QBE_NABV01@@Z */
12381 /* ??9locale@std@@QEBA_NAEBV01@@Z */
12382 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
12383 MSVCP_bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
12385 FIXME("(%p %p) stub\n", this, loc);
12386 return 0;
12389 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
12390 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
12391 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
12392 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, MSVCP_size_t id, MSVCP_size_t catmask)
12394 TRACE("(%p %p %lu %lu)\n", this, facet, id, catmask);
12396 if(this->ptr->facet.refs > 1) {
12397 locale__Locimp *new_ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12398 if(!new_ptr) {
12399 ERR("Out of memory\n");
12400 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12401 return NULL;
12403 locale__Locimp_copy_ctor(new_ptr, this->ptr);
12404 call_locale_facet__Decref(&this->ptr->facet);
12405 this->ptr = new_ptr;
12408 locale__Locimp__Addfac(this->ptr, facet, id);
12410 if(catmask) {
12411 locale_string_char_dtor(&this->ptr->name);
12412 locale_string_char_ctor_cstr(&this->ptr->name, "*");
12414 return this;
12417 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I_N@Z */
12418 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K_N@Z */
12419 DEFINE_THISCALL_WRAPPER(locale__Getfacet_bool, 12)
12420 const locale_facet* __thiscall locale__Getfacet_bool(const locale *this,
12421 MSVCP_size_t id, MSVCP_bool allow_transparent)
12423 locale_facet *fac;
12425 TRACE("(%p %lu)\n", this, id);
12427 fac = id < this->ptr->facet_cnt ? this->ptr->facetvec[id] : NULL;
12428 if(fac || !this->ptr->transparent || !allow_transparent)
12429 return fac;
12431 return id < global_locale->facet_cnt ? global_locale->facetvec[id] : NULL;
12434 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
12435 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
12436 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
12437 const locale_facet* __thiscall locale__Getfacet(const locale *this, MSVCP_size_t id)
12439 return locale__Getfacet_bool( this, id, TRUE );
12442 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
12443 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
12444 locale__Locimp* __cdecl locale__Getgloballocale(void)
12446 TRACE("\n");
12447 return global_locale;
12450 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
12451 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
12452 void __cdecl locale__Setgloballocale(void *locimp)
12454 TRACE("(%p)\n", locimp);
12455 global_locale = locimp;
12458 /* ?classic@locale@std@@SAABV12@XZ */
12459 /* ?classic@locale@std@@SAAEBV12@XZ */
12460 const locale* __cdecl locale_classic(void)
12462 TRACE("\n");
12463 locale__Init();
12464 return &classic_locale;
12467 /* ?empty@locale@std@@SA?AV12@XZ */
12468 locale* __cdecl locale_empty(locale *ret)
12470 TRACE("\n");
12472 locale__Init();
12474 ret->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12475 if(!ret->ptr) {
12476 ERR("Out of memory\n");
12477 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12479 locale__Locimp_ctor_transparent(ret->ptr, TRUE);
12480 return ret;
12483 /* ?global@locale@std@@SA?AV12@ABV12@@Z */
12484 /* ?global@locale@std@@SA?AV12@AEBV12@@Z */
12485 locale* __cdecl locale_global(locale *ret, const locale *loc)
12487 _Lockit lock;
12488 int i;
12490 TRACE("(%p %p)\n", loc, ret);
12492 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12493 locale_ctor(ret);
12495 if(loc->ptr != global_locale) {
12496 call_locale_facet__Decref(&global_locale->facet);
12497 global_locale = loc->ptr;
12498 call_locale_facet__Incref(&global_locale->facet);
12500 for(i=LC_ALL+1; i<=LC_MAX; i++) {
12501 if((global_locale->catmask & (1<<(i-1))) == 0)
12502 continue;
12503 setlocale(i, locale_string_char_c_str(&global_locale->name));
12506 _Lockit_dtor(&lock);
12507 return ret;
12510 #if _MSVCP_VER < 100
12512 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12513 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12514 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
12515 basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
12517 TRACE("(%p)\n", this);
12519 MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
12520 return ret;
12523 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12524 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12525 DEFINE_THISCALL_WRAPPER(locale_name, 8)
12526 basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
12528 TRACE( "(%p)\n", this);
12529 MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
12530 return ret;
12533 #else
12535 /* ?_Getname@_Locinfo@std@@QBEPBDXZ */
12536 /* ?_Getname@_Locinfo@std@@QEBAPEBDXZ */
12537 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 4)
12538 const char * __thiscall _Locinfo__Getname( const _Locinfo *this )
12540 return locale_string_char_c_str( &this->newlocname );
12543 #endif /* _MSVCP_VER < 100 */
12545 /* wctrans */
12546 wctrans_t __cdecl wctrans(const char *property)
12548 static const char str_tolower[] = "tolower";
12549 static const char str_toupper[] = "toupper";
12551 if(!strcmp(property, str_tolower))
12552 return 2;
12553 if(!strcmp(property, str_toupper))
12554 return 1;
12555 return 0;
12558 /* towctrans */
12559 wint_t __cdecl towctrans(wint_t c, wctrans_t category)
12561 if(category == 1)
12562 return towupper(c);
12563 return towlower(c);
12566 #if _MSVCP_VER <= 71
12567 /* btowc */
12568 wint_t __cdecl btowc(int c)
12570 wchar_t ret;
12571 int state = 0;
12572 char ch = c;
12574 if (c == EOF || _Mbrtowc( &ret, &ch, 1, &state, NULL ) != 1) return WEOF;
12575 return ret;
12578 /* mbrlen */
12579 size_t __cdecl mbrlen(const char *str, size_t n, mbstate_t *state)
12581 static int local_state;
12583 if (!state) state = &local_state;
12584 return _Mbrtowc( NULL, str, n, state, NULL );
12587 /* mbrtowc */
12588 size_t __cdecl mbrtowc(wchar_t *dst, const char *str, size_t n, mbstate_t *state)
12590 static int local_state;
12592 if (!state) state = &local_state;
12593 return _Mbrtowc( dst, str, n, state, NULL );
12596 /* mbsrtowcs */
12597 size_t __cdecl mbsrtowcs(wchar_t *dst, const char **pstr, size_t n, mbstate_t *state)
12599 static int local_state;
12600 size_t ret = 0;
12601 wchar_t wc;
12602 const char *src;
12604 src = *pstr;
12605 if (!state) state = &local_state;
12607 while (!dst || n > ret)
12609 int len = _Mbrtowc( &wc, src, 2, state, NULL );
12610 if (len < 0) return -1;
12611 if (!len) break;
12612 if (dst) dst[ret] = wc;
12613 ret++;
12614 if (!wc) break;
12615 src += len;
12617 return ret;
12620 /* wctob */
12621 int __cdecl wctob(wint_t wc)
12623 char ret[MB_LEN_MAX];
12625 if (wc == WEOF || _Wcrtomb( ret, wc, NULL, NULL ) != 1) return EOF;
12626 return ret[0];
12629 /* wcrtomb */
12630 size_t __cdecl wcrtomb(char *dst, wchar_t wc, mbstate_t *state)
12632 return _Wcrtomb( dst, wc, state, NULL );
12635 /* wcsrtombs */
12636 size_t __cdecl wcsrtombs(char *dst, const wchar_t **pstr, size_t n, mbstate_t *state)
12638 const wchar_t *src;
12639 char buffer[MB_LEN_MAX];
12640 size_t ret = 0;
12642 src = *pstr;
12644 while (!dst || n > ret)
12646 int len = _Wcrtomb( buffer, *src, state, NULL );
12647 if (len <= 0) return -1;
12648 if (n < ret + len) break;
12649 memcpy( dst + ret, buffer, len );
12650 ret += len;
12651 if (!buffer[0]) break;
12652 src++;
12654 return ret;
12656 #endif
12658 int __cdecl _To_byte(const wchar_t *src, char *dst)
12660 TRACE("(%s %p)\n", debugstr_w(src), dst);
12661 return WideCharToMultiByte(CP_ACP, 0, src, -1, dst, MAX_PATH, NULL, NULL);
12664 int __cdecl _To_wide(const char *src, wchar_t *dst)
12666 TRACE("(%s %p)\n", debugstr_a(src), dst);
12667 return MultiByteToWideChar(CP_ACP, 0, src, -1, dst, MAX_PATH);
12670 DEFINE_RTTI_DATA0(_Facet_base, 0, ".?AV_Facet_base@std@@")
12671 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@")
12672 DEFINE_RTTI_DATA1(locale__Locimp, 0, &locale_facet_rtti_base_descriptor, ".?AV_Locimp@locale@std@@")
12673 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@")
12674 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@")
12675 DEFINE_RTTI_DATA1(collate_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@G@std@@")
12676 DEFINE_RTTI_DATA1(ctype_base, 0, &locale_facet_rtti_base_descriptor, ".?AUctype_base@std@@")
12677 DEFINE_RTTI_DATA2(ctype_char, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@D@std@@")
12678 DEFINE_RTTI_DATA2(ctype_wchar, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@_W@std@@")
12679 DEFINE_RTTI_DATA2(ctype_short, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@G@std@@")
12680 DEFINE_RTTI_DATA1(codecvt_base, 0, &locale_facet_rtti_base_descriptor, ".?AVcodecvt_base@std@@")
12681 #if _MSVCP_VER >= 140
12682 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDU_Mbstatet@@@std@@")
12683 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDU_Mbstatet@@@std@@")
12684 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDU_Mbstatet@@@std@@")
12685 #else
12686 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDH@std@@")
12687 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDH@std@@")
12688 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDH@std@@")
12689 #endif
12690 DEFINE_RTTI_DATA1(numpunct_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@D@std@@")
12691 DEFINE_RTTI_DATA1(numpunct_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@_W@std@@")
12692 DEFINE_RTTI_DATA1(numpunct_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@G@std@@")
12693 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@@")
12694 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@@")
12695 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@@")
12696 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@@")
12697 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@@")
12698 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@@")
12699 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@@")
12700 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@@")
12701 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@@")
12702 DEFINE_RTTI_DATA1(time_base, 0, &locale_facet_rtti_base_descriptor, ".?AUtime_base@std@@")
12703 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@@")
12704 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@@")
12706 #ifndef __GNUC__
12707 void __asm_dummy_vtables(void) {
12708 #endif
12709 __ASM_VTABLE(_Facet_base,
12710 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12711 VTABLE_ADD_FUNC(locale_facet__Incref)
12712 VTABLE_ADD_FUNC(locale_facet__Incref)
12714 __ASM_VTABLE(locale_facet,
12715 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12716 #if _MSVCP_VER >= 110
12717 VTABLE_ADD_FUNC(locale_facet__Incref)
12718 VTABLE_ADD_FUNC(locale_facet__Decref)
12719 #endif
12721 __ASM_VTABLE(locale__Locimp,
12722 VTABLE_ADD_FUNC(locale__Locimp_vector_dtor)
12723 #if _MSVCP_VER >= 110
12724 VTABLE_ADD_FUNC(locale_facet__Incref)
12725 VTABLE_ADD_FUNC(locale_facet__Decref)
12726 #endif
12728 __ASM_VTABLE(collate_char,
12729 VTABLE_ADD_FUNC(collate_char_vector_dtor)
12730 #if _MSVCP_VER >= 110
12731 VTABLE_ADD_FUNC(locale_facet__Incref)
12732 VTABLE_ADD_FUNC(locale_facet__Decref)
12733 #endif
12734 VTABLE_ADD_FUNC(collate_char_do_compare)
12735 VTABLE_ADD_FUNC(collate_char_do_transform)
12736 VTABLE_ADD_FUNC(collate_char_do_hash));
12737 __ASM_VTABLE(collate_wchar,
12738 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12739 #if _MSVCP_VER >= 110
12740 VTABLE_ADD_FUNC(locale_facet__Incref)
12741 VTABLE_ADD_FUNC(locale_facet__Decref)
12742 #endif
12743 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12744 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12745 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12746 __ASM_VTABLE(collate_short,
12747 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12748 #if _MSVCP_VER >= 110
12749 VTABLE_ADD_FUNC(locale_facet__Incref)
12750 VTABLE_ADD_FUNC(locale_facet__Decref)
12751 #endif
12752 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12753 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12754 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12755 __ASM_VTABLE(ctype_base,
12756 VTABLE_ADD_FUNC(ctype_base_vector_dtor)
12757 #if _MSVCP_VER >= 110
12758 VTABLE_ADD_FUNC(locale_facet__Incref)
12759 VTABLE_ADD_FUNC(locale_facet__Decref)
12760 #endif
12762 __ASM_VTABLE(ctype_char,
12763 VTABLE_ADD_FUNC(ctype_char_vector_dtor)
12764 #if _MSVCP_VER >= 110
12765 VTABLE_ADD_FUNC(locale_facet__Incref)
12766 VTABLE_ADD_FUNC(locale_facet__Decref)
12767 #endif
12768 VTABLE_ADD_FUNC(ctype_char_do_tolower)
12769 VTABLE_ADD_FUNC(ctype_char_do_tolower_ch)
12770 VTABLE_ADD_FUNC(ctype_char_do_toupper)
12771 VTABLE_ADD_FUNC(ctype_char_do_toupper_ch)
12772 VTABLE_ADD_FUNC(ctype_char_do_widen)
12773 VTABLE_ADD_FUNC(ctype_char_do_widen_ch)
12774 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12775 VTABLE_ADD_FUNC(ctype_char__Do_widen_s)
12776 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12777 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12778 VTABLE_ADD_FUNC(ctype_char__Do_narrow_s)
12779 #else
12780 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12781 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12782 #endif
12784 __ASM_VTABLE(ctype_wchar,
12785 VTABLE_ADD_FUNC(ctype_wchar_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(ctype_wchar_do_is)
12791 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12792 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12793 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12794 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12795 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12796 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12797 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12798 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12799 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12800 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12801 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12802 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12803 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12804 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12805 #else
12806 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12807 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12808 #endif
12810 __ASM_VTABLE(ctype_short,
12811 VTABLE_ADD_FUNC(ctype_wchar_vector_dtor)
12812 #if _MSVCP_VER >= 110
12813 VTABLE_ADD_FUNC(locale_facet__Incref)
12814 VTABLE_ADD_FUNC(locale_facet__Decref)
12815 #endif
12816 VTABLE_ADD_FUNC(ctype_wchar_do_is)
12817 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12818 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12819 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12820 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12821 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12822 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12823 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12824 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12825 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12826 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12827 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12828 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12829 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12830 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12831 #else
12832 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12833 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12834 #endif
12836 __ASM_VTABLE(codecvt_base,
12837 VTABLE_ADD_FUNC(codecvt_base_vector_dtor)
12838 #if _MSVCP_VER >= 110
12839 VTABLE_ADD_FUNC(locale_facet__Incref)
12840 VTABLE_ADD_FUNC(locale_facet__Decref)
12841 #endif
12842 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
12843 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12844 VTABLE_ADD_FUNC(codecvt_base_do_encoding));
12845 __ASM_VTABLE(codecvt_char,
12846 VTABLE_ADD_FUNC(codecvt_char_vector_dtor)
12847 #if _MSVCP_VER >= 110
12848 VTABLE_ADD_FUNC(locale_facet__Incref)
12849 VTABLE_ADD_FUNC(locale_facet__Decref)
12850 VTABLE_ADD_FUNC(codecvt_char_do_always_noconv)
12851 #else
12852 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
12853 #endif
12854 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12855 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12856 VTABLE_ADD_FUNC(codecvt_char_do_in)
12857 VTABLE_ADD_FUNC(codecvt_char_do_out)
12858 VTABLE_ADD_FUNC(codecvt_char_do_unshift)
12859 VTABLE_ADD_FUNC(codecvt_char_do_length));
12860 __ASM_VTABLE(codecvt_wchar,
12861 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12862 #if _MSVCP_VER >= 110
12863 VTABLE_ADD_FUNC(locale_facet__Incref)
12864 VTABLE_ADD_FUNC(locale_facet__Decref)
12865 #endif
12866 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12867 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12868 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12869 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12870 #else
12871 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12872 #endif
12873 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12874 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12875 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12876 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12877 __ASM_VTABLE(codecvt_short,
12878 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12879 #if _MSVCP_VER >= 110
12880 VTABLE_ADD_FUNC(locale_facet__Incref)
12881 VTABLE_ADD_FUNC(locale_facet__Decref)
12882 #endif
12883 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12884 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12885 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12886 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12887 #else
12888 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12889 #endif
12890 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12891 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12892 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12893 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12894 __ASM_VTABLE(numpunct_char,
12895 VTABLE_ADD_FUNC(numpunct_char_vector_dtor)
12896 #if _MSVCP_VER >= 110
12897 VTABLE_ADD_FUNC(locale_facet__Incref)
12898 VTABLE_ADD_FUNC(locale_facet__Decref)
12899 #endif
12900 VTABLE_ADD_FUNC(numpunct_char_do_decimal_point)
12901 VTABLE_ADD_FUNC(numpunct_char_do_thousands_sep)
12902 VTABLE_ADD_FUNC(numpunct_char_do_grouping)
12903 VTABLE_ADD_FUNC(numpunct_char_do_falsename)
12904 VTABLE_ADD_FUNC(numpunct_char_do_truename));
12905 __ASM_VTABLE(numpunct_wchar,
12906 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
12907 #if _MSVCP_VER >= 110
12908 VTABLE_ADD_FUNC(locale_facet__Incref)
12909 VTABLE_ADD_FUNC(locale_facet__Decref)
12910 #endif
12911 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
12912 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
12913 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
12914 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
12915 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
12916 __ASM_VTABLE(numpunct_short,
12917 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
12918 #if _MSVCP_VER >= 110
12919 VTABLE_ADD_FUNC(locale_facet__Incref)
12920 VTABLE_ADD_FUNC(locale_facet__Decref)
12921 #endif
12922 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
12923 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
12924 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
12925 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
12926 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
12927 __ASM_VTABLE(num_get_char,
12928 VTABLE_ADD_FUNC(num_get_char_vector_dtor)
12929 #if _MSVCP_VER >= 110
12930 VTABLE_ADD_FUNC(locale_facet__Incref)
12931 VTABLE_ADD_FUNC(locale_facet__Decref)
12932 #endif
12933 VTABLE_ADD_FUNC(num_get_char_do_get_void)
12934 VTABLE_ADD_FUNC(num_get_char_do_get_double)
12935 VTABLE_ADD_FUNC(num_get_char_do_get_double)
12936 VTABLE_ADD_FUNC(num_get_char_do_get_float)
12937 VTABLE_ADD_FUNC(num_get_char_do_get_uint64)
12938 VTABLE_ADD_FUNC(num_get_char_do_get_int64)
12939 VTABLE_ADD_FUNC(num_get_char_do_get_ulong)
12940 VTABLE_ADD_FUNC(num_get_char_do_get_long)
12941 VTABLE_ADD_FUNC(num_get_char_do_get_uint)
12942 VTABLE_ADD_FUNC(num_get_char_do_get_ushort)
12943 VTABLE_ADD_FUNC(num_get_char_do_get_bool));
12944 __ASM_VTABLE(num_get_short,
12945 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
12946 #if _MSVCP_VER >= 110
12947 VTABLE_ADD_FUNC(locale_facet__Incref)
12948 VTABLE_ADD_FUNC(locale_facet__Decref)
12949 #endif
12950 VTABLE_ADD_FUNC(num_get_short_do_get_void)
12951 VTABLE_ADD_FUNC(num_get_short_do_get_double)
12952 VTABLE_ADD_FUNC(num_get_short_do_get_double)
12953 VTABLE_ADD_FUNC(num_get_short_do_get_float)
12954 VTABLE_ADD_FUNC(num_get_short_do_get_uint64)
12955 VTABLE_ADD_FUNC(num_get_short_do_get_int64)
12956 VTABLE_ADD_FUNC(num_get_short_do_get_ulong)
12957 VTABLE_ADD_FUNC(num_get_short_do_get_long)
12958 VTABLE_ADD_FUNC(num_get_short_do_get_uint)
12959 VTABLE_ADD_FUNC(num_get_short_do_get_ushort)
12960 VTABLE_ADD_FUNC(num_get_short_do_get_bool));
12961 __ASM_VTABLE(num_get_wchar,
12962 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
12963 #if _MSVCP_VER >= 110
12964 VTABLE_ADD_FUNC(locale_facet__Incref)
12965 VTABLE_ADD_FUNC(locale_facet__Decref)
12966 #endif
12967 VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
12968 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
12969 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
12970 VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
12971 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
12972 VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
12973 VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
12974 VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
12975 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
12976 VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
12977 VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
12978 __ASM_VTABLE(num_put_char,
12979 VTABLE_ADD_FUNC(num_put_char_vector_dtor)
12980 #if _MSVCP_VER >= 110
12981 VTABLE_ADD_FUNC(locale_facet__Incref)
12982 VTABLE_ADD_FUNC(locale_facet__Decref)
12983 #endif
12984 VTABLE_ADD_FUNC(num_put_char_do_put_ptr)
12985 VTABLE_ADD_FUNC(num_put_char_do_put_double)
12986 VTABLE_ADD_FUNC(num_put_char_do_put_double)
12987 VTABLE_ADD_FUNC(num_put_char_do_put_uint64)
12988 VTABLE_ADD_FUNC(num_put_char_do_put_int64)
12989 VTABLE_ADD_FUNC(num_put_char_do_put_ulong)
12990 VTABLE_ADD_FUNC(num_put_char_do_put_long)
12991 VTABLE_ADD_FUNC(num_put_char_do_put_bool));
12992 __ASM_VTABLE(num_put_wchar,
12993 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
12994 #if _MSVCP_VER >= 110
12995 VTABLE_ADD_FUNC(locale_facet__Incref)
12996 VTABLE_ADD_FUNC(locale_facet__Decref)
12997 #endif
12998 VTABLE_ADD_FUNC(num_put_wchar_do_put_ptr)
12999 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
13000 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
13001 VTABLE_ADD_FUNC(num_put_wchar_do_put_uint64)
13002 VTABLE_ADD_FUNC(num_put_wchar_do_put_int64)
13003 VTABLE_ADD_FUNC(num_put_wchar_do_put_ulong)
13004 VTABLE_ADD_FUNC(num_put_wchar_do_put_long)
13005 VTABLE_ADD_FUNC(num_put_wchar_do_put_bool));
13006 __ASM_VTABLE(num_put_short,
13007 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
13008 #if _MSVCP_VER >= 110
13009 VTABLE_ADD_FUNC(locale_facet__Incref)
13010 VTABLE_ADD_FUNC(locale_facet__Decref)
13011 #endif
13012 VTABLE_ADD_FUNC(num_put_short_do_put_ptr)
13013 VTABLE_ADD_FUNC(num_put_short_do_put_double)
13014 VTABLE_ADD_FUNC(num_put_short_do_put_double)
13015 VTABLE_ADD_FUNC(num_put_short_do_put_uint64)
13016 VTABLE_ADD_FUNC(num_put_short_do_put_int64)
13017 VTABLE_ADD_FUNC(num_put_short_do_put_ulong)
13018 VTABLE_ADD_FUNC(num_put_short_do_put_long)
13019 VTABLE_ADD_FUNC(num_put_short_do_put_bool));
13020 __ASM_VTABLE(time_put_char,
13021 VTABLE_ADD_FUNC(time_put_char_vector_dtor)
13022 #if _MSVCP_VER >= 110
13023 VTABLE_ADD_FUNC(locale_facet__Incref)
13024 VTABLE_ADD_FUNC(locale_facet__Decref)
13025 #endif
13026 VTABLE_ADD_FUNC(time_put_char_do_put));
13027 __ASM_VTABLE(time_put_wchar,
13028 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
13029 #if _MSVCP_VER >= 110
13030 VTABLE_ADD_FUNC(locale_facet__Incref)
13031 VTABLE_ADD_FUNC(locale_facet__Decref)
13032 #endif
13033 VTABLE_ADD_FUNC(time_put_wchar_do_put));
13034 __ASM_VTABLE(time_put_short,
13035 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
13036 #if _MSVCP_VER >= 110
13037 VTABLE_ADD_FUNC(locale_facet__Incref)
13038 VTABLE_ADD_FUNC(locale_facet__Decref)
13039 #endif
13040 VTABLE_ADD_FUNC(time_put_wchar_do_put));
13041 __ASM_VTABLE(time_get_char,
13042 VTABLE_ADD_FUNC(time_get_char_vector_dtor)
13043 #if _MSVCP_VER >= 110
13044 VTABLE_ADD_FUNC(locale_facet__Incref)
13045 VTABLE_ADD_FUNC(locale_facet__Decref)
13046 #endif
13047 VTABLE_ADD_FUNC(time_get_char_do_date_order)
13048 VTABLE_ADD_FUNC(time_get_char_do_get_time)
13049 VTABLE_ADD_FUNC(time_get_char_do_get_date)
13050 VTABLE_ADD_FUNC(time_get_char_do_get_weekday)
13051 VTABLE_ADD_FUNC(time_get_char_do_get_monthname)
13052 VTABLE_ADD_FUNC(time_get_char_do_get_year)
13053 #if _MSVCP_VER >= 100
13054 VTABLE_ADD_FUNC(time_get_char_do_get)
13055 #endif
13057 __ASM_VTABLE(time_get_wchar,
13058 VTABLE_ADD_FUNC(time_get_wchar_vector_dtor)
13059 #if _MSVCP_VER >= 110
13060 VTABLE_ADD_FUNC(locale_facet__Incref)
13061 VTABLE_ADD_FUNC(locale_facet__Decref)
13062 #endif
13063 VTABLE_ADD_FUNC(time_get_wchar_do_date_order)
13064 VTABLE_ADD_FUNC(time_get_wchar_do_get_time)
13065 VTABLE_ADD_FUNC(time_get_wchar_do_get_date)
13066 VTABLE_ADD_FUNC(time_get_wchar_do_get_weekday)
13067 VTABLE_ADD_FUNC(time_get_wchar_do_get_monthname)
13068 VTABLE_ADD_FUNC(time_get_wchar_do_get_year)
13069 #if _MSVCP_VER >= 100
13070 VTABLE_ADD_FUNC(time_get_wchar_do_get)
13071 #endif
13073 #ifndef __GNUC__
13075 #endif
13077 void init_locale(void *base)
13079 #ifdef __x86_64__
13080 init__Facet_base_rtti(base);
13081 init_locale_facet_rtti(base);
13082 init_locale__Locimp_rtti(base);
13083 init_collate_char_rtti(base);
13084 init_collate_wchar_rtti(base);
13085 init_collate_short_rtti(base);
13086 init_ctype_base_rtti(base);
13087 init_ctype_char_rtti(base);
13088 init_ctype_wchar_rtti(base);
13089 init_ctype_short_rtti(base);
13090 init_codecvt_base_rtti(base);
13091 init_codecvt_char_rtti(base);
13092 init_codecvt_wchar_rtti(base);
13093 init_codecvt_short_rtti(base);
13094 init_numpunct_char_rtti(base);
13095 init_numpunct_wchar_rtti(base);
13096 init_numpunct_short_rtti(base);
13097 init_num_get_char_rtti(base);
13098 init_num_get_wchar_rtti(base);
13099 init_num_get_short_rtti(base);
13100 init_num_put_char_rtti(base);
13101 init_num_put_wchar_rtti(base);
13102 init_num_put_short_rtti(base);
13103 init_time_put_char_rtti(base);
13104 init_time_put_wchar_rtti(base);
13105 init_time_put_short_rtti(base);
13106 init_time_base_rtti(base);
13107 init_time_get_char_rtti(base);
13108 init_time_get_wchar_rtti(base);
13109 #endif
13112 void free_locale(void)
13114 facets_elem *iter, *safe;
13116 if(global_locale) {
13117 locale_dtor(&classic_locale);
13118 locale__Locimp_dtor(global_locale);
13119 MSVCRT_operator_delete(global_locale);
13122 LIST_FOR_EACH_ENTRY_SAFE(iter, safe, &lazy_facets, facets_elem, entry) {
13123 list_remove(&iter->entry);
13124 if(call_locale_facet__Decref(iter->fac))
13125 call_locale_facet_vector_dtor(iter->fac, 1);
13126 MSVCRT_operator_delete(iter);