wow64: Add thunks for the I/O completion syscalls.
[wine.git] / dlls / msvcp90 / locale.c
blobea0729cf4f999d4ddda0ffa933fcd4d9b534b8b2
1 /*
2 * Copyright 2010 Piotr Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <stdarg.h>
21 #include "assert.h"
22 #include "locale.h"
23 #include "errno.h"
24 #include "limits.h"
25 #include "math.h"
26 #include "mbctype.h"
27 #include "stdio.h"
28 #include "wchar.h"
29 #include "wctype.h"
30 #include "time.h"
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winnls.h"
34 #include "msvcp90.h"
35 #include "wine/heap.h"
36 #include "wine/list.h"
37 #include "wine/debug.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
41 typedef enum {
42 DATEORDER_no_order,
43 DATEORDER_dmy,
44 DATEORDER_mdy,
45 DATEORDER_ymd,
46 DATEORDER_ydm
47 } dateorder;
49 char* __cdecl _Getdays(void);
50 wchar_t* __cdecl _W_Getdays(void);
51 char* __cdecl _Getmonths(void);
52 wchar_t* __cdecl _W_Getmonths(void);
53 void* __cdecl _Gettnames(void);
54 unsigned int __cdecl ___lc_codepage_func(void);
55 int __cdecl ___lc_collate_cp_func(void);
56 const unsigned short* __cdecl __pctype_func(void);
57 const locale_facet* __thiscall locale__Getfacet(const locale*, size_t);
58 const locale* __cdecl locale_classic(void);
60 #if _MSVCP_VER >= 110
61 wchar_t ** __cdecl ___lc_locale_name_func(void);
62 #else
63 LCID* __cdecl ___lc_handle_func(void);
64 #endif
66 #if _MSVCP_VER < 100
67 #define locale_string basic_string_char
68 #define locale_string_char_ctor(this) MSVCP_basic_string_char_ctor(this)
69 #define locale_string_char_ctor_cstr(this,str) MSVCP_basic_string_char_ctor_cstr(this,str)
70 #define locale_string_char_copy_ctor(this,copy) MSVCP_basic_string_char_copy_ctor(this,copy)
71 #define locale_string_char_dtor(this) MSVCP_basic_string_char_dtor(this)
72 #define locale_string_char_c_str(this) MSVCP_basic_string_char_c_str(this)
73 #define locale_string_char_assign(this,assign) MSVCP_basic_string_char_assign(this,assign)
74 #else
75 #define locale_string _Yarn_char
76 #define locale_string_char_ctor(this) _Yarn_char_ctor(this)
77 #define locale_string_char_ctor_cstr(this,str) _Yarn_char_ctor_cstr(this,str)
78 #define locale_string_char_copy_ctor(this,copy) _Yarn_char_copy_ctor(this,copy)
79 #define locale_string_char_dtor(this) _Yarn_char_dtor(this)
80 #define locale_string_char_c_str(this) _Yarn_char_c_str(this)
81 #define locale_string_char_assign(this,assign) _Yarn_char_op_assign(this,assign)
83 #define locale_string_wchar _Yarn_wchar
84 #define locale_string_wchar_ctor(this) _Yarn_wchar_ctor(this)
85 #define locale_string_wchar_dtor(this) _Yarn_wchar_dtor(this)
86 #define locale_string_wchar_c_str(this) _Yarn_wchar__C_str(this)
87 #define locale_string_wchar_assign(this,str) _Yarn_wchar_op_assign_cstr(this,str)
88 #endif
90 typedef int category;
92 typedef struct {
93 size_t id;
94 } locale_id;
96 typedef struct _locale__Locimp {
97 locale_facet facet;
98 locale_facet **facetvec;
99 size_t facet_cnt;
100 category catmask;
101 bool transparent;
102 locale_string name;
103 } locale__Locimp;
105 typedef struct {
106 void *timeptr;
107 } _Timevec;
109 typedef struct {
110 _Lockit lock;
111 locale_string days;
112 locale_string months;
113 #if _MSVCP_VER >= 110
114 locale_string_wchar wdays;
115 locale_string_wchar wmonths;
116 #endif
117 locale_string oldlocname;
118 locale_string newlocname;
119 } _Locinfo;
121 typedef struct {
122 #if _MSVCP_VER < 110
123 LCID handle;
124 #endif
125 unsigned page;
126 #if _MSVCP_VER >= 110
127 wchar_t *lc_name;
128 #endif
129 } _Collvec;
131 typedef struct {
132 locale_facet facet;
133 _Collvec coll;
134 } collate;
136 typedef struct {
137 locale_facet facet;
138 const char *grouping;
139 char dp;
140 char sep;
141 const char *false_name;
142 const char *true_name;
143 } numpunct_char;
145 typedef struct {
146 locale_facet facet;
147 const char *grouping;
148 wchar_t dp;
149 wchar_t sep;
150 const wchar_t *false_name;
151 const wchar_t *true_name;
152 } numpunct_wchar;
154 typedef struct {
155 locale_facet facet;
156 _Timevec time;
157 #if _MSVCP_VER <= 100
158 _Cvtvec cvt;
159 #endif
160 } time_put;
162 typedef struct {
163 locale_facet facet;
164 const char *days;
165 const char *months;
166 dateorder dateorder;
167 _Cvtvec cvt;
168 } time_get_char;
170 typedef struct {
171 locale_facet facet;
172 const wchar_t *days;
173 const wchar_t *months;
174 dateorder dateorder;
175 _Cvtvec cvt;
176 } time_get_wchar;
178 /* ?_Id_cnt@id@locale@std@@0HA */
179 int locale_id__Id_cnt = 0;
181 static locale classic_locale;
183 /* ?_Global@_Locimp@locale@std@@0PAV123@A */
184 /* ?_Global@_Locimp@locale@std@@0PEAV123@EA */
185 locale__Locimp *global_locale = NULL;
187 /* ?_Clocptr@_Locimp@locale@std@@0PAV123@A */
188 /* ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA */
189 locale__Locimp *locale__Locimp__Clocptr = NULL;
191 static char istreambuf_iterator_char_val(istreambuf_iterator_char *this)
193 if(this->strbuf && !this->got) {
194 int c = basic_streambuf_char_sgetc(this->strbuf);
195 if(c == EOF)
196 this->strbuf = NULL;
197 else
198 this->val = c;
201 this->got = TRUE;
202 return this->val;
205 static wchar_t istreambuf_iterator_wchar_val(istreambuf_iterator_wchar *this)
207 if(this->strbuf && !this->got) {
208 unsigned short c = basic_streambuf_wchar_sgetc(this->strbuf);
209 if(c == WEOF)
210 this->strbuf = NULL;
211 else
212 this->val = c;
215 this->got = TRUE;
216 return this->val;
219 static void istreambuf_iterator_char_inc(istreambuf_iterator_char *this)
221 if(!this->strbuf || basic_streambuf_char_sbumpc(this->strbuf)==EOF) {
222 this->strbuf = NULL;
223 this->got = TRUE;
224 }else {
225 this->got = FALSE;
226 istreambuf_iterator_char_val(this);
230 static void istreambuf_iterator_wchar_inc(istreambuf_iterator_wchar *this)
232 if(!this->strbuf || basic_streambuf_wchar_sbumpc(this->strbuf)==WEOF) {
233 this->strbuf = NULL;
234 this->got = TRUE;
235 }else {
236 this->got = FALSE;
237 istreambuf_iterator_wchar_val(this);
241 static void ostreambuf_iterator_char_put(ostreambuf_iterator_char *this, char ch)
243 if(this->failed || basic_streambuf_char_sputc(this->strbuf, ch)==EOF)
244 this->failed = TRUE;
247 static void ostreambuf_iterator_wchar_put(ostreambuf_iterator_wchar *this, wchar_t ch)
249 if(this->failed || basic_streambuf_wchar_sputc(this->strbuf, ch)==WEOF)
250 this->failed = TRUE;
253 /* ??1facet@locale@std@@UAE@XZ */
254 /* ??1facet@locale@std@@UEAA@XZ */
255 /* ??1facet@locale@std@@MAA@XZ */
256 /* ??1facet@locale@std@@MAE@XZ */
257 /* ??1facet@locale@std@@MEAA@XZ */
258 DEFINE_THISCALL_WRAPPER(locale_facet_dtor, 4)
259 void __thiscall locale_facet_dtor(locale_facet *this)
261 TRACE("(%p)\n", this);
264 DEFINE_THISCALL_WRAPPER(locale_facet_vector_dtor, 8)
265 #define call_locale_facet_vector_dtor(this, flags) CALL_VTBL_FUNC(this, 0, \
266 locale_facet*, (locale_facet*, unsigned int), (this, flags))
267 locale_facet* __thiscall locale_facet_vector_dtor(locale_facet *this, unsigned int flags)
269 TRACE("(%p %x)\n", this, flags);
270 if(flags & 2) {
271 /* we have an array, with the number of elements stored before the first object */
272 INT_PTR i, *ptr = (INT_PTR *)this-1;
274 for(i=*ptr-1; i>=0; i--)
275 locale_facet_dtor(this+i);
276 MSVCRT_operator_delete(ptr);
277 } else {
278 locale_facet_dtor(this);
279 if(flags & 1)
280 MSVCRT_operator_delete(this);
283 return this;
286 typedef struct
288 locale_facet *fac;
289 struct list entry;
290 } facets_elem;
291 static struct list lazy_facets = LIST_INIT(lazy_facets);
293 /* Not exported from msvcp90 */
294 /* ?facet_Register@facet@locale@std@@CAXPAV123@@Z */
295 /* ?facet_Register@facet@locale@std@@CAXPEAV123@@Z */
296 void __cdecl locale_facet_register(locale_facet *add)
298 facets_elem *head = MSVCRT_operator_new(sizeof(*head));
299 if(!head) {
300 ERR("Out of memory\n");
301 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
304 head->fac = add;
305 list_add_head(&lazy_facets, &head->entry);
308 /* Not exported from msvcp90 */
309 /* ?_Register@facet@locale@std@@QAEXXZ */
310 /* ?_Register@facet@locale@std@@QEAAXXZ */
311 DEFINE_THISCALL_WRAPPER(locale_facet__Register, 4)
312 void __thiscall locale_facet__Register(locale_facet *this)
314 TRACE("(%p)\n", this);
315 locale_facet_register(this);
318 /* Not exported from msvcp90 */
319 /* ??_7facet@locale@std@@6B@ */
320 extern const vtable_ptr locale_facet_vtable;
322 /* ??0id@locale@std@@QAE@I@Z */
323 /* ??0id@locale@std@@QEAA@_K@Z */
324 DEFINE_THISCALL_WRAPPER(locale_id_ctor_id, 8)
325 locale_id* __thiscall locale_id_ctor_id(locale_id *this, size_t id)
327 TRACE("(%p %Iu)\n", this, id);
329 this->id = id;
330 return this;
333 /* ??_Fid@locale@std@@QAEXXZ */
334 /* ??_Fid@locale@std@@QEAAXXZ */
335 DEFINE_THISCALL_WRAPPER(locale_id_ctor, 4)
336 locale_id* __thiscall locale_id_ctor(locale_id *this)
338 TRACE("(%p)\n", this);
340 this->id = 0;
341 return this;
344 /* ??Bid@locale@std@@QAEIXZ */
345 /* ??Bid@locale@std@@QEAA_KXZ */
346 DEFINE_THISCALL_WRAPPER(locale_id_operator_size_t, 4)
347 size_t __thiscall locale_id_operator_size_t(locale_id *this)
349 _Lockit lock;
351 TRACE("(%p)\n", this);
353 if(!this->id) {
354 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
355 this->id = ++locale_id__Id_cnt;
356 _Lockit_dtor(&lock);
359 return this->id;
362 /* ?_Id_cnt_func@id@locale@std@@CAAAHXZ */
363 /* ?_Id_cnt_func@id@locale@std@@CAAEAHXZ */
364 int* __cdecl locale_id__Id_cnt_func(void)
366 TRACE("\n");
367 return &locale_id__Id_cnt;
370 /* ??_Ffacet@locale@std@@QAEXXZ */
371 /* ??_Ffacet@locale@std@@QEAAXXZ */
372 DEFINE_THISCALL_WRAPPER(locale_facet_ctor, 4)
373 locale_facet* __thiscall locale_facet_ctor(locale_facet *this)
375 TRACE("(%p)\n", this);
376 this->vtable = &locale_facet_vtable;
377 this->refs = 0;
378 return this;
381 /* ??0facet@locale@std@@IAE@I@Z */
382 /* ??0facet@locale@std@@IEAA@_K@Z */
383 DEFINE_THISCALL_WRAPPER(locale_facet_ctor_refs, 8)
384 locale_facet* __thiscall locale_facet_ctor_refs(locale_facet *this, size_t refs)
386 TRACE("(%p %Iu)\n", this, refs);
387 this->vtable = &locale_facet_vtable;
388 this->refs = refs;
389 return this;
392 /* ?_Incref@facet@locale@std@@QAEXXZ */
393 /* ?_Incref@facet@locale@std@@QEAAXXZ */
394 /* ?_Incref@facet@locale@std@@UAEXXZ */
395 /* ?_Incref@facet@locale@std@@UEAAXXZ */
396 #if _MSVCP_VER >= 110
397 #define call_locale_facet__Incref(this) CALL_VTBL_FUNC(this, 4, void, (locale_facet*), (this))
398 #else
399 #define call_locale_facet__Incref locale_facet__Incref
400 #endif
401 DEFINE_THISCALL_WRAPPER(locale_facet__Incref, 4)
402 void __thiscall locale_facet__Incref(locale_facet *this)
404 _Lockit lock;
406 TRACE("(%p)\n", this);
408 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
409 this->refs++;
410 _Lockit_dtor(&lock);
413 /* ?_Decref@facet@locale@std@@QAEPAV123@XZ */
414 /* ?_Decref@facet@locale@std@@QEAAPEAV123@XZ */
415 /* ?_Decref@facet@locale@std@@UAEPAV_Facet_base@3@XZ */
416 /* ?_Decref@facet@locale@std@@UEAAPEAV_Facet_base@3@XZ */
417 #if _MSVCP_VER >= 110
418 #define call_locale_facet__Decref(this) CALL_VTBL_FUNC(this, 8, \
419 locale_facet*, (locale_facet*), (this))
420 #else
421 #define call_locale_facet__Decref locale_facet__Decref
422 #endif
423 DEFINE_THISCALL_WRAPPER(locale_facet__Decref, 4)
424 locale_facet* __thiscall locale_facet__Decref(locale_facet *this)
426 _Lockit lock;
427 locale_facet *ret;
429 TRACE("(%p)\n", this);
431 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
432 if(this->refs)
433 this->refs--;
435 ret = this->refs ? NULL : this;
436 _Lockit_dtor(&lock);
438 return ret;
441 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z */
442 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z */
443 size_t __cdecl locale_facet__Getcat(const locale_facet **facet, const locale *loc)
445 TRACE("(%p %p)\n", facet, loc);
446 return -1;
449 /* ?_Getcat@facet@locale@std@@SAIPAPBV123@@Z */
450 /* ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@@Z */
451 size_t __cdecl locale_facet__Getcat_old(const locale_facet **facet)
453 TRACE("(%p)\n", facet);
454 return -1;
457 /* ??0_Timevec@std@@QAE@ABV01@@Z */
458 /* ??0_Timevec@std@@QEAA@AEBV01@@Z */
459 /* This copy constructor modifies copied object */
460 DEFINE_THISCALL_WRAPPER(_Timevec_copy_ctor, 8)
461 _Timevec* __thiscall _Timevec_copy_ctor(_Timevec *this, _Timevec *copy)
463 TRACE("(%p %p)\n", this, copy);
464 this->timeptr = copy->timeptr;
465 copy->timeptr = NULL;
466 return this;
469 /* ??0_Timevec@std@@QAE@PAX@Z */
470 /* ??0_Timevec@std@@QEAA@PEAX@Z */
471 DEFINE_THISCALL_WRAPPER(_Timevec_ctor_timeptr, 8)
472 _Timevec* __thiscall _Timevec_ctor_timeptr(_Timevec *this, void *timeptr)
474 TRACE("(%p %p)\n", this, timeptr);
475 this->timeptr = timeptr;
476 return this;
479 /* ??_F_Timevec@std@@QAEXXZ */
480 /* ??_F_Timevec@std@@QEAAXXZ */
481 DEFINE_THISCALL_WRAPPER(_Timevec_ctor, 4)
482 _Timevec* __thiscall _Timevec_ctor(_Timevec *this)
484 TRACE("(%p)\n", this);
485 this->timeptr = NULL;
486 return this;
489 /* ??1_Timevec@std@@QAE@XZ */
490 /* ??1_Timevec@std@@QEAA@XZ */
491 DEFINE_THISCALL_WRAPPER(_Timevec_dtor, 4)
492 void __thiscall _Timevec_dtor(_Timevec *this)
494 TRACE("(%p)\n", this);
495 free(this->timeptr);
498 /* ??4_Timevec@std@@QAEAAV01@ABV01@@Z */
499 /* ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z */
500 DEFINE_THISCALL_WRAPPER(_Timevec_op_assign, 8)
501 _Timevec* __thiscall _Timevec_op_assign(_Timevec *this, _Timevec *right)
503 TRACE("(%p %p)\n", this, right);
504 this->timeptr = right->timeptr;
505 right->timeptr = NULL;
506 return this;
509 /* ?_Getptr@_Timevec@std@@QBEPAXXZ */
510 /* ?_Getptr@_Timevec@std@@QEBAPEAXXZ */
511 DEFINE_THISCALL_WRAPPER(_Timevec__Getptr, 4)
512 void* __thiscall _Timevec__Getptr(_Timevec *this)
514 TRACE("(%p)\n", this);
515 return this->timeptr;
518 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z */
519 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z */
520 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cat_cstr(_Locinfo *locinfo, int category, const char *locstr)
522 const char *locale = NULL;
524 /* This function is probably modifying more global objects */
525 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
527 if(!locstr)
528 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
530 _Lockit_ctor_locktype(&locinfo->lock, _LOCK_LOCALE);
531 locale_string_char_ctor(&locinfo->days);
532 locale_string_char_ctor(&locinfo->months);
533 #if _MSVCP_VER >= 110
534 locale_string_wchar_ctor(&locinfo->wdays);
535 locale_string_wchar_ctor(&locinfo->wmonths);
536 #endif
537 locale_string_char_ctor_cstr(&locinfo->oldlocname, setlocale(LC_ALL, NULL));
539 if(category)
540 locale = setlocale(LC_ALL, locstr);
541 else
542 locale = setlocale(LC_ALL, NULL);
544 if(locale)
545 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
546 else
547 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
549 return locinfo;
552 /* ??0_Locinfo@std@@QAE@HPBD@Z */
553 /* ??0_Locinfo@std@@QEAA@HPEBD@Z */
554 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cat_cstr, 12)
555 _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const char *locstr)
557 return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
560 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
561 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
562 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_bstr(_Locinfo *locinfo, const basic_string_char *locstr)
564 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
567 /* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
568 /* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
569 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
570 _Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
572 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
575 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
576 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
577 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
579 return _Locinfo__Locinfo_ctor_cat_cstr(locinfo, 1/*FIXME*/, locstr);
582 /* ??0_Locinfo@std@@QAE@PBD@Z */
583 /* ??0_Locinfo@std@@QEAA@PEBD@Z */
584 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_cstr, 8)
585 _Locinfo* __thiscall _Locinfo_ctor_cstr(_Locinfo *this, const char *locstr)
587 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, locstr);
590 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z */
591 /* ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z */
592 void __cdecl _Locinfo__Locinfo_dtor(_Locinfo *locinfo)
594 TRACE("(%p)\n", locinfo);
596 setlocale(LC_ALL, locale_string_char_c_str(&locinfo->oldlocname));
597 locale_string_char_dtor(&locinfo->days);
598 locale_string_char_dtor(&locinfo->months);
599 #if _MSVCP_VER >= 110
600 locale_string_wchar_dtor(&locinfo->wdays);
601 locale_string_wchar_dtor(&locinfo->wmonths);
602 #endif
603 locale_string_char_dtor(&locinfo->oldlocname);
604 locale_string_char_dtor(&locinfo->newlocname);
605 _Lockit_dtor(&locinfo->lock);
608 /* ??_F_Locinfo@std@@QAEXXZ */
609 /* ??_F_Locinfo@std@@QEAAXXZ */
610 DEFINE_THISCALL_WRAPPER(_Locinfo_ctor, 4)
611 _Locinfo* __thiscall _Locinfo_ctor(_Locinfo *this)
613 return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, "C");
616 /* ??1_Locinfo@std@@QAE@XZ */
617 /* ??1_Locinfo@std@@QEAA@XZ */
618 DEFINE_THISCALL_WRAPPER(_Locinfo_dtor, 4)
619 void __thiscall _Locinfo_dtor(_Locinfo *this)
621 _Locinfo__Locinfo_dtor(this);
624 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z */
625 /* ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z */
626 _Locinfo* __cdecl _Locinfo__Locinfo_Addcats(_Locinfo *locinfo, int category, const char *locstr)
628 const char *locale = NULL;
630 /* This function is probably modifying more global objects */
631 FIXME("(%p %d %s) semi-stub\n", locinfo, category, locstr);
632 if(!locstr)
633 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
635 locale_string_char_dtor(&locinfo->newlocname);
637 if(category)
638 locale = setlocale(LC_ALL, locstr);
639 else
640 locale = setlocale(LC_ALL, NULL);
642 if(locale)
643 locale_string_char_ctor_cstr(&locinfo->newlocname, locale);
644 else
645 locale_string_char_ctor_cstr(&locinfo->newlocname, "*");
647 return locinfo;
650 /* ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z */
651 /* ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z */
652 DEFINE_THISCALL_WRAPPER(_Locinfo__Addcats, 12)
653 _Locinfo* __thiscall _Locinfo__Addcats(_Locinfo *this, int category, const char *locstr)
655 return _Locinfo__Locinfo_Addcats(this, category, locstr);
658 static _Collvec* getcoll(_Collvec *ret)
660 TRACE("\n");
662 ret->page = ___lc_collate_cp_func();
663 #if _MSVCP_VER < 110
664 ret->handle = ___lc_handle_func()[LC_COLLATE];
665 #else
666 ret->lc_name = ___lc_locale_name_func()[LC_COLLATE];
667 #endif
668 return ret;
671 /* _Getcoll */
672 #if defined(__i386__)
673 /* Work around a gcc bug */
674 ULONGLONG __cdecl _Getcoll(void)
676 C_ASSERT(sizeof(_Collvec) == sizeof(ULONGLONG));
677 ULONGLONG ret;
679 getcoll((_Collvec*)&ret);
680 return ret;
682 #else
683 _Collvec __cdecl _Getcoll(void)
685 _Collvec ret;
687 getcoll(&ret);
688 return ret;
690 #endif
692 /* ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ */
693 /* ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ */
694 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcoll, 8)
695 _Collvec* __thiscall _Locinfo__Getcoll(const _Locinfo *this, _Collvec *ret)
697 return getcoll(ret);
700 /* _Getctype */
701 _Ctypevec __cdecl _Getctype(void)
703 _Ctypevec ret;
704 short *table;
705 #if _MSVCP_VER >= 110
706 wchar_t *name;
707 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 *ret = _Getctype();
739 return ret;
742 /* _Getcvt */
743 #if _MSVCP_VER < 110 && defined(__i386__)
744 /* Work around a gcc bug */
745 ULONGLONG __cdecl _Getcvt(void)
747 C_ASSERT(sizeof(_Cvtvec) == sizeof(ULONGLONG));
748 union {
749 _Cvtvec cvtvec;
750 ULONGLONG ull;
751 } ret;
753 TRACE("\n");
755 ret.cvtvec.page = ___lc_codepage_func();
756 ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
757 return ret.ull;
759 #elif _MSVCP_VER < 110
760 _Cvtvec __cdecl _Getcvt(void)
762 _Cvtvec ret;
764 TRACE("\n");
766 ret.page = ___lc_codepage_func();
767 ret.handle = ___lc_handle_func()[LC_CTYPE];
768 return ret;
770 #else
771 _Cvtvec __cdecl _Getcvt(void)
773 _Cvtvec ret;
774 int i;
776 TRACE("\n");
778 memset(&ret, 0, sizeof(ret));
779 ret.page = ___lc_codepage_func();
780 ret.mb_max = ___mb_cur_max_func();
782 if(ret.mb_max > 1) {
783 for(i=0; i<256; i++)
784 if(_ismbblead(i)) ret.isleadbyte[i/8] |= 1 << (i&7);
786 return ret;
788 #endif
790 /* ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ */
791 /* ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ */
792 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
793 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
795 #if _MSVCP_VER < 110 && defined(__i386__)
796 ULONGLONG cvtvec;
797 #else
798 _Cvtvec cvtvec;
799 #endif
801 cvtvec = _Getcvt();
802 memcpy(ret, &cvtvec, sizeof(cvtvec));
803 return ret;
806 int __cdecl _Getdateorder(void)
808 WCHAR date_fmt[2];
810 #if _MSVCP_VER < 110
811 if(!GetLocaleInfoW(___lc_handle_func()[LC_TIME], LOCALE_ILDATE,
812 date_fmt, ARRAY_SIZE(date_fmt)))
813 return DATEORDER_no_order;
814 #else
815 if(!GetLocaleInfoEx(___lc_locale_name_func()[LC_TIME], LOCALE_ILDATE,
816 date_fmt, ARRAY_SIZE(date_fmt)))
817 return DATEORDER_no_order;
818 #endif
820 if(*date_fmt == '0') return DATEORDER_mdy;
821 if(*date_fmt == '1') return DATEORDER_dmy;
822 if(*date_fmt == '2') return DATEORDER_ymd;
823 return DATEORDER_no_order;
826 /* ?_Getdateorder@_Locinfo@std@@QBEHXZ */
827 /* ?_Getdateorder@_Locinfo@std@@QEBAHXZ */
828 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdateorder, 4)
829 int __thiscall _Locinfo__Getdateorder(const _Locinfo *this)
831 TRACE("(%p)\n", this);
832 return _Getdateorder();
835 /* ?_Getdays@_Locinfo@std@@QBEPBDXZ */
836 /* ?_Getdays@_Locinfo@std@@QEBAPEBDXZ */
837 DEFINE_THISCALL_WRAPPER(_Locinfo__Getdays, 4)
838 const char* __thiscall _Locinfo__Getdays(const _Locinfo *this)
840 char *days = _Getdays();
841 const char *ret;
843 TRACE("(%p)\n", this);
845 if(days) {
846 locale_string_char_dtor((locale_string *)&this->days);
847 locale_string_char_ctor_cstr((locale_string *)&this->days, days);
848 free(days);
851 ret = locale_string_char_c_str(&this->days);
852 if (!ret[0]) ret = ":Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday";
853 return ret;
856 #if _MSVCP_VER >= 110
857 /* ?_W_Getdays@_Locinfo@std@@QBEPBGXZ */
858 /* ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ */
859 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getdays, 4)
860 const wchar_t* __thiscall _Locinfo__W_Getdays(const _Locinfo *this)
862 static const wchar_t defdays[] =
864 ':','S','u','n',':','S','u','n','d','a','y',
865 ':','M','o','n',':','M','o','n','d','a','y',
866 ':','T','u','e',':','T','u','e','s','d','a','y',
867 ':','W','e','d',':','W','e','d','n','e','s','d','a','y',
868 ':','T','h','u',':','T','h','u','r','s','d','a','y',
869 ':','F','r','i',':','F','r','i','d','a','y',
870 ':','S','a','t',':','S','a','t','u','r','d','a','y'
872 wchar_t *wdays = _W_Getdays();
873 const wchar_t *ret;
875 TRACE("(%p)\n", this);
877 if(wdays) {
878 locale_string_wchar_assign((locale_string_wchar *)&this->wdays, wdays);
879 free(wdays);
882 ret = locale_string_wchar_c_str(&this->wdays);
883 if (!ret[0]) ret = defdays;
884 return ret;
887 /* ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ */
888 /* ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ */
889 DEFINE_THISCALL_WRAPPER(_Locinfo__W_Getmonths, 4)
890 const wchar_t* __thiscall _Locinfo__W_Getmonths(const _Locinfo *this)
892 static const wchar_t defmonths[] =
894 ':','J','a','n',':','J','a','n','u','a','r','y',
895 ':','F','e','b',':','F','e','b','r','u','a','r','y',
896 ':','M','a','r',':','M','a','r','c','h',
897 ':','A','p','r',':','A','p','r','i','l',
898 ':','M','a','y',':','M','a','y',
899 ':','J','u','n',':','J','u','n','e',
900 ':','J','u','l',':','J','u','l','y',
901 ':','A','u','g',':','A','u','g','u','s','t',
902 ':','S','e','p',':','S','e','p','t','e','m','b','e','r',
903 ':','O','c','t',':','O','c','t','o','b','e','r',
904 ':','N','o','v',':','N','o','v','e','m','b','e','r',
905 ':','D','e','c',':','D','e','c','e','m','b','e','r'
907 wchar_t *wmonths = _W_Getmonths();
908 const wchar_t *ret;
910 TRACE("(%p)\n", this);
912 if(wmonths) {
913 locale_string_wchar_assign((locale_string_wchar *)&this->wmonths, wmonths);
914 free(wmonths);
917 ret = locale_string_wchar_c_str(&this->wmonths);
918 if (!ret[0]) ret = defmonths;
919 return ret;
921 #endif
923 /* ?_Getmonths@_Locinfo@std@@QBEPBDXZ */
924 /* ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ */
925 DEFINE_THISCALL_WRAPPER(_Locinfo__Getmonths, 4)
926 const char* __thiscall _Locinfo__Getmonths(const _Locinfo *this)
928 char *months = _Getmonths();
929 const char *ret;
931 TRACE("(%p)\n", this);
933 if(months) {
934 locale_string_char_dtor((locale_string *)&this->months);
935 locale_string_char_ctor_cstr((locale_string *)&this->months, months);
936 free(months);
939 ret = locale_string_char_c_str(&this->months);
940 if (!ret[0]) ret = ":Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July"
941 ":Aug:August:Sep:September:Oct:October:Nov:November:Dec:December";
942 return ret;
945 /* ?_Getfalse@_Locinfo@std@@QBEPBDXZ */
946 /* ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ */
947 DEFINE_THISCALL_WRAPPER(_Locinfo__Getfalse, 4)
948 const char* __thiscall _Locinfo__Getfalse(const _Locinfo *this)
950 TRACE("(%p)\n", this);
951 return "false";
954 /* ?_Gettrue@_Locinfo@std@@QBEPBDXZ */
955 /* ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ */
956 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettrue, 4)
957 const char* __thiscall _Locinfo__Gettrue(const _Locinfo *this)
959 TRACE("(%p)\n", this);
960 return "true";
963 /* ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ */
964 /* ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ */
965 DEFINE_THISCALL_WRAPPER(_Locinfo__Getlconv, 4)
966 const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
968 TRACE("(%p)\n", this);
969 return localeconv();
972 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
973 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
974 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
975 _Timevec*__thiscall _Locinfo__Gettnames(const _Locinfo *this, _Timevec *ret)
977 TRACE("(%p)\n", this);
979 _Timevec_ctor_timeptr(ret, _Gettnames());
980 return ret;
983 /* ?id@?$collate@D@std@@2V0locale@2@A */
984 locale_id collate_char_id = {0};
986 /* ??_7?$collate@D@std@@6B@ */
987 extern const vtable_ptr collate_char_vtable;
989 /* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
990 /* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
991 DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
992 void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
994 TRACE("(%p %p)\n", this, locinfo);
995 _Locinfo__Getcoll(locinfo, &this->coll);
998 /* ??0?$collate@D@std@@IAE@PBDI@Z */
999 /* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
1000 DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
1001 collate* __thiscall collate_char_ctor_name(collate *this, const char *name, size_t refs)
1003 _Locinfo locinfo;
1005 TRACE("(%p %s %Iu)\n", this, name, refs);
1007 locale_facet_ctor_refs(&this->facet, refs);
1008 this->facet.vtable = &collate_char_vtable;
1010 _Locinfo_ctor_cstr(&locinfo, name);
1011 collate_char__Init(this, &locinfo);
1012 _Locinfo_dtor(&locinfo);
1013 return this;
1016 /* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
1017 /* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1018 DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
1019 collate* __thiscall collate_char_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1021 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1023 locale_facet_ctor_refs(&this->facet, refs);
1024 this->facet.vtable = &collate_char_vtable;
1025 collate_char__Init(this, locinfo);
1026 return this;
1029 /* ??0?$collate@D@std@@QAE@I@Z */
1030 /* ??0?$collate@D@std@@QEAA@_K@Z */
1031 DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
1032 collate* __thiscall collate_char_ctor_refs(collate *this, size_t refs)
1034 return collate_char_ctor_name(this, "C", refs);
1037 /* ??1?$collate@D@std@@UAE@XZ */
1038 /* ??1?$collate@D@std@@UEAA@XZ */
1039 /* ??1?$collate@D@std@@MAE@XZ */
1040 /* ??1?$collate@D@std@@MEAA@XZ */
1041 DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
1042 void __thiscall collate_char_dtor(collate *this)
1044 TRACE("(%p)\n", this);
1047 DEFINE_THISCALL_WRAPPER(collate_char_vector_dtor, 8)
1048 collate* __thiscall collate_char_vector_dtor(collate *this, unsigned int flags)
1050 TRACE("(%p %x)\n", this, flags);
1051 if(flags & 2) {
1052 /* we have an array, with the number of elements stored before the first object */
1053 INT_PTR i, *ptr = (INT_PTR *)this-1;
1055 for(i=*ptr-1; i>=0; i--)
1056 collate_char_dtor(this+i);
1057 MSVCRT_operator_delete(ptr);
1058 } else {
1059 collate_char_dtor(this);
1060 if(flags & 1)
1061 MSVCRT_operator_delete(this);
1064 return this;
1067 /* ??_F?$collate@D@std@@QAEXXZ */
1068 /* ??_F?$collate@D@std@@QEAAXXZ */
1069 DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
1070 collate* __thiscall collate_char_ctor(collate *this)
1072 return collate_char_ctor_name(this, "C", 0);
1075 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1076 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1077 size_t __cdecl collate_char__Getcat(const locale_facet **facet, const locale *loc)
1079 TRACE("(%p %p)\n", facet, loc);
1081 if(facet && !*facet) {
1082 *facet = MSVCRT_operator_new(sizeof(collate));
1083 if(!*facet) {
1084 ERR("Out of memory\n");
1085 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1086 return 0;
1088 collate_char_ctor_name((collate*)*facet,
1089 locale_string_char_c_str(&loc->ptr->name), 0);
1092 return LC_COLLATE;
1095 /* ?_Getcat@?$collate@D@std@@SAIPAPBVfacet@locale@2@@Z */
1096 /* ?_Getcat@?$collate@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1097 size_t __cdecl collate_char__Getcat_old(const locale_facet **facet)
1099 return collate_char__Getcat(facet, locale_classic());
1102 static collate* collate_char_use_facet(const locale *loc)
1104 static collate *obj = NULL;
1106 _Lockit lock;
1107 const locale_facet *fac;
1109 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1110 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_char_id));
1111 if(fac) {
1112 _Lockit_dtor(&lock);
1113 return (collate*)fac;
1116 if(obj) {
1117 _Lockit_dtor(&lock);
1118 return obj;
1121 collate_char__Getcat(&fac, loc);
1122 obj = (collate*)fac;
1123 call_locale_facet__Incref(&obj->facet);
1124 locale_facet_register(&obj->facet);
1125 _Lockit_dtor(&lock);
1127 return obj;
1130 /* _Strcoll */
1131 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
1132 const char *last2, const _Collvec *coll)
1134 LCID lcid;
1136 TRACE("(%s %s)\n", debugstr_an(first1, last1-first1), debugstr_an(first2, last2-first2));
1138 #if _MSVCP_VER < 110
1139 lcid = (coll ? coll->handle : ___lc_handle_func()[LC_COLLATE]);
1140 #else
1141 lcid = LocaleNameToLCID(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE], 0);
1142 #endif
1143 return CompareStringA(lcid, 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1146 /* ?do_compare@?$collate@D@std@@MBEHPBD000@Z */
1147 /* ?do_compare@?$collate@D@std@@MEBAHPEBD000@Z */
1148 DEFINE_THISCALL_WRAPPER(collate_char_do_compare, 20)
1149 #if _MSVCP_VER <= 100
1150 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1151 (const collate*, const char*, const char*, const char*, const char*), \
1152 (this, first1, last1, first2, last2))
1153 #else
1154 #define call_collate_char_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1155 (const collate*, const char*, const char*, const char*, const char*), \
1156 (this, first1, last1, first2, last2))
1157 #endif
1158 int __thiscall collate_char_do_compare(const collate *this, const char *first1,
1159 const char *last1, const char *first2, const char *last2)
1161 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1162 return _Strcoll(first1, last1, first2, last2, &this->coll);
1165 /* ?compare@?$collate@D@std@@QBEHPBD000@Z */
1166 /* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
1167 DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
1168 int __thiscall collate_char_compare(const collate *this, const char *first1,
1169 const char *last1, const char *first2, const char *last2)
1171 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1172 return call_collate_char_do_compare(this, first1, last1, first2, last2);
1175 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
1176 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
1177 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
1178 #if _MSVCP_VER <= 100
1179 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1180 (const collate*, const char*, const char*), (this, first, last))
1181 #else
1182 #define call_collate_char_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1183 (const collate*, const char*, const char*), (this, first, last))
1184 #endif
1185 LONG __thiscall collate_char_do_hash(const collate *this,
1186 const char *first, const char *last)
1188 ULONG ret = 0;
1190 TRACE("(%p %p %p)\n", this, first, last);
1192 for(; first<last; first++)
1193 ret = (ret<<8 | ret>>24) + *first;
1194 return ret;
1197 /* ?hash@?$collate@D@std@@QBEJPBD0@Z */
1198 /* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
1199 DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
1200 LONG __thiscall collate_char_hash(const collate *this,
1201 const char *first, const char *last)
1203 TRACE("(%p %p %p)\n", this, first, last);
1204 return call_collate_char_do_hash(this, first, last);
1207 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1208 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1209 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
1210 basic_string_char* __thiscall collate_char_do_transform(const collate *this,
1211 basic_string_char *ret, const char *first, const char *last)
1213 FIXME("(%p %p %p) stub\n", this, first, last);
1214 return ret;
1217 /* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
1218 /* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
1219 DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
1220 basic_string_char* __thiscall collate_char_transform(const collate *this,
1221 basic_string_char *ret, const char *first, const char *last)
1223 FIXME("(%p %p %p) stub\n", this, first, last);
1224 return ret;
1227 /* ?id@?$collate@_W@std@@2V0locale@2@A */
1228 locale_id collate_wchar_id = {0};
1229 /* ?id@?$collate@G@std@@2V0locale@2@A */
1230 locale_id collate_short_id = {0};
1232 /* ??_7?$collate@_W@std@@6B@ */
1233 extern const vtable_ptr collate_wchar_vtable;
1234 /* ??_7?$collate@G@std@@6B@ */
1235 extern const vtable_ptr collate_short_vtable;
1237 /* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
1238 /* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
1239 /* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
1240 /* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
1241 DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
1242 void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
1244 TRACE("(%p %p)\n", this, locinfo);
1245 _Locinfo__Getcoll(locinfo, &this->coll);
1248 /* ??0?$collate@_W@std@@IAE@PBDI@Z */
1249 /* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
1250 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
1251 collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, size_t refs)
1253 _Locinfo locinfo;
1255 TRACE("(%p %s %Iu)\n", this, name, refs);
1257 locale_facet_ctor_refs(&this->facet, refs);
1258 this->facet.vtable = &collate_wchar_vtable;
1260 _Locinfo_ctor_cstr(&locinfo, name);
1261 collate_wchar__Init(this, &locinfo);
1262 _Locinfo_dtor(&locinfo);
1263 return this;
1266 /* ??0?$collate@G@std@@IAE@PBDI@Z */
1267 /* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
1268 DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
1269 collate* __thiscall collate_short_ctor_name(collate *this, const char *name, size_t refs)
1271 collate *ret = collate_wchar_ctor_name(this, name, refs);
1272 ret->facet.vtable = &collate_short_vtable;
1273 return ret;
1276 /* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
1277 /* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1278 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
1279 collate* __thiscall collate_wchar_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1281 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1283 locale_facet_ctor_refs(&this->facet, refs);
1284 this->facet.vtable = &collate_wchar_vtable;
1285 collate_wchar__Init(this, locinfo);
1286 return this;
1289 /* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
1290 /* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1291 DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
1292 collate* __thiscall collate_short_ctor_locinfo(collate *this, const _Locinfo *locinfo, size_t refs)
1294 collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
1295 ret->facet.vtable = &collate_short_vtable;
1296 return ret;
1299 /* ??0?$collate@_W@std@@QAE@I@Z */
1300 /* ??0?$collate@_W@std@@QEAA@_K@Z */
1301 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
1302 collate* __thiscall collate_wchar_ctor_refs(collate *this, size_t refs)
1304 return collate_wchar_ctor_name(this, "C", refs);
1307 /* ??0?$collate@G@std@@QAE@I@Z */
1308 /* ??0?$collate@G@std@@QEAA@_K@Z */
1309 DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
1310 collate* __thiscall collate_short_ctor_refs(collate *this, size_t refs)
1312 collate *ret = collate_wchar_ctor_refs(this, refs);
1313 ret->facet.vtable = &collate_short_vtable;
1314 return ret;
1317 /* ??1?$collate@G@std@@UAE@XZ */
1318 /* ??1?$collate@G@std@@UEAA@XZ */
1319 /* ??1?$collate@_W@std@@MAE@XZ */
1320 /* ??1?$collate@_W@std@@MEAA@XZ */
1321 /* ??1?$collate@G@std@@MAE@XZ */
1322 /* ??1?$collate@G@std@@MEAA@XZ */
1323 DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
1324 void __thiscall collate_wchar_dtor(collate *this)
1326 TRACE("(%p)\n", this);
1329 DEFINE_THISCALL_WRAPPER(collate_wchar_vector_dtor, 8)
1330 collate* __thiscall collate_wchar_vector_dtor(collate *this, unsigned int flags)
1332 TRACE("(%p %x)\n", this, flags);
1333 if(flags & 2) {
1334 /* we have an array, with the number of elements stored before the first object */
1335 INT_PTR i, *ptr = (INT_PTR *)this-1;
1337 for(i=*ptr-1; i>=0; i--)
1338 collate_wchar_dtor(this+i);
1339 MSVCRT_operator_delete(ptr);
1340 } else {
1341 collate_wchar_dtor(this);
1342 if(flags & 1)
1343 MSVCRT_operator_delete(this);
1346 return this;
1349 /* ??_F?$collate@_W@std@@QAEXXZ */
1350 /* ??_F?$collate@_W@std@@QEAAXXZ */
1351 DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
1352 collate* __thiscall collate_wchar_ctor(collate *this)
1354 return collate_wchar_ctor_name(this, "C", 0);
1357 /* ??_F?$collate@G@std@@QAEXXZ */
1358 /* ??_F?$collate@G@std@@QEAAXXZ */
1359 DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
1360 collate* __thiscall collate_short_ctor(collate *this)
1362 collate *ret = collate_wchar_ctor(this);
1363 ret->facet.vtable = &collate_short_vtable;
1364 return ret;
1367 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1368 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1369 size_t __cdecl collate_wchar__Getcat(const locale_facet **facet, const locale *loc)
1371 TRACE("(%p %p)\n", facet, loc);
1373 if(facet && !*facet) {
1374 *facet = MSVCRT_operator_new(sizeof(collate));
1375 if(!*facet) {
1376 ERR("Out of memory\n");
1377 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1378 return 0;
1380 collate_wchar_ctor_name((collate*)*facet,
1381 locale_string_char_c_str(&loc->ptr->name), 0);
1384 return LC_COLLATE;
1387 /* ?_Getcat@?$collate@_W@std@@SAIPAPBVfacet@locale@2@@Z */
1388 /* ?_Getcat@?$collate@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1389 size_t __cdecl collate_wchar__Getcat_old(const locale_facet **facet)
1391 return collate_wchar__Getcat(facet, locale_classic());
1394 static collate* collate_wchar_use_facet(const locale *loc)
1396 static collate *obj = NULL;
1398 _Lockit lock;
1399 const locale_facet *fac;
1401 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1402 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_wchar_id));
1403 if(fac) {
1404 _Lockit_dtor(&lock);
1405 return (collate*)fac;
1408 if(obj) {
1409 _Lockit_dtor(&lock);
1410 return obj;
1413 collate_wchar__Getcat(&fac, loc);
1414 obj = (collate*)fac;
1415 call_locale_facet__Incref(&obj->facet);
1416 locale_facet_register(&obj->facet);
1417 _Lockit_dtor(&lock);
1419 return obj;
1422 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1423 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1424 size_t __cdecl collate_short__Getcat(const locale_facet **facet, const locale *loc)
1426 if(facet && !*facet) {
1427 collate_wchar__Getcat(facet, loc);
1428 (*(locale_facet**)facet)->vtable = &collate_short_vtable;
1431 return LC_COLLATE;
1434 /* ?_Getcat@?$collate@G@std@@SAIPAPBVfacet@locale@2@@Z */
1435 /* ?_Getcat@?$collate@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1436 size_t __cdecl collate_short__Getcat_old(const locale_facet **facet)
1438 return collate_short__Getcat(facet, locale_classic());
1441 static collate* collate_short_use_facet(const locale *loc)
1443 static collate *obj = NULL;
1445 _Lockit lock;
1446 const locale_facet *fac;
1448 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1449 fac = locale__Getfacet(loc, locale_id_operator_size_t(&collate_short_id));
1450 if(fac) {
1451 _Lockit_dtor(&lock);
1452 return (collate*)fac;
1455 if(obj) {
1456 _Lockit_dtor(&lock);
1457 return obj;
1460 collate_short__Getcat(&fac, loc);
1461 obj = (collate*)fac;
1462 call_locale_facet__Incref(&obj->facet);
1463 locale_facet_register(&obj->facet);
1464 _Lockit_dtor(&lock);
1466 return obj;
1469 /* _Wcscoll */
1470 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
1471 const wchar_t *last2, const _Collvec *coll)
1473 TRACE("(%s %s)\n", debugstr_wn(first1, last1-first1), debugstr_wn(first2, last2-first2));
1475 #if _MSVCP_VER < 110
1476 return CompareStringW(coll ? coll->handle : ___lc_handle_func()[LC_COLLATE],
1477 0, first1, last1-first1, first2, last2-first2)-CSTR_EQUAL;
1478 #else
1479 return CompareStringEx(coll ? coll->lc_name : ___lc_locale_name_func()[LC_COLLATE],
1480 0, first1, last1-first1, first2, last2-first2, NULL, NULL, 0)-CSTR_EQUAL;
1481 #endif
1484 /* ?do_compare@?$collate@_W@std@@MBEHPB_W000@Z */
1485 /* ?do_compare@?$collate@_W@std@@MEBAHPEB_W000@Z */
1486 /* ?do_compare@?$collate@G@std@@MBEHPBG000@Z */
1487 /* ?do_compare@?$collate@G@std@@MEBAHPEBG000@Z */
1488 DEFINE_THISCALL_WRAPPER(collate_wchar_do_compare, 20)
1489 #if _MSVCP_VER <= 100
1490 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 4, int, \
1491 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1492 (this, first1, last1, first2, last2))
1493 #else
1494 #define call_collate_wchar_do_compare(this, first1, last1, first2, last2) CALL_VTBL_FUNC(this, 12, int, \
1495 (const collate*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*), \
1496 (this, first1, last1, first2, last2))
1497 #endif
1498 int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *first1,
1499 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1501 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1502 return _Wcscoll(first1, last1, first2, last2, &this->coll);
1505 /* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
1506 /* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
1507 /* ?compare@?$collate@G@std@@QBEHPBG000@Z */
1508 /* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
1509 DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
1510 int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
1511 const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
1513 TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
1514 return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
1517 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
1518 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
1519 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
1520 /* ?do_hash@?$collate@G@std@@MEBAJPEBG0@Z */
1521 DEFINE_THISCALL_WRAPPER(collate_wchar_do_hash, 12)
1522 #if _MSVCP_VER <= 100
1523 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 12, LONG, \
1524 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1525 #else
1526 #define call_collate_wchar_do_hash(this, first, last) CALL_VTBL_FUNC(this, 20, LONG, \
1527 (const collate*, const wchar_t*, const wchar_t*), (this, first, last))
1528 #endif
1529 LONG __thiscall collate_wchar_do_hash(const collate *this,
1530 const wchar_t *first, const wchar_t *last)
1532 ULONG ret = 0;
1534 TRACE("(%p %p %p)\n", this, first, last);
1536 for(; first<last; first++)
1537 ret = (ret<<8 | ret>>24) + *first;
1538 return ret;
1541 /* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
1542 /* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
1543 /* ?hash@?$collate@G@std@@QBEJPBG0@Z */
1544 /* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
1545 DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
1546 LONG __thiscall collate_wchar_hash(const collate *this,
1547 const wchar_t *first, const wchar_t *last)
1549 TRACE("(%p %p %p)\n", this, first, last);
1550 return call_collate_wchar_do_hash(this, first, last);
1553 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1554 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1555 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1556 /* ?do_transform@?$collate@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1557 DEFINE_THISCALL_WRAPPER(collate_wchar_do_transform, 16)
1558 basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
1559 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1561 FIXME("(%p %p %p) stub\n", this, first, last);
1562 return ret;
1565 /* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
1566 /* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
1567 /* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
1568 /* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
1569 DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
1570 basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
1571 basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
1573 FIXME("(%p %p %p) stub\n", this, first, last);
1574 return ret;
1577 /* ??_7ctype_base@std@@6B@ */
1578 extern const vtable_ptr ctype_base_vtable;
1580 /* ??0ctype_base@std@@QAE@I@Z */
1581 /* ??0ctype_base@std@@QEAA@_K@Z */
1582 DEFINE_THISCALL_WRAPPER(ctype_base_ctor_refs, 8)
1583 ctype_base* __thiscall ctype_base_ctor_refs(ctype_base *this, size_t refs)
1585 TRACE("(%p %Iu)\n", this, refs);
1586 locale_facet_ctor_refs(&this->facet, refs);
1587 this->facet.vtable = &ctype_base_vtable;
1588 return this;
1591 /* ??_Fctype_base@std@@QAEXXZ */
1592 /* ??_Fctype_base@std@@QEAAXXZ */
1593 DEFINE_THISCALL_WRAPPER(ctype_base_ctor, 4)
1594 ctype_base* __thiscall ctype_base_ctor(ctype_base *this)
1596 TRACE("(%p)\n", this);
1597 locale_facet_ctor_refs(&this->facet, 0);
1598 this->facet.vtable = &ctype_base_vtable;
1599 return this;
1602 /* ??1ctype_base@std@@UAE@XZ */
1603 /* ??1ctype_base@std@@UEAA@XZ */
1604 DEFINE_THISCALL_WRAPPER(ctype_base_dtor, 4)
1605 void __thiscall ctype_base_dtor(ctype_base *this)
1607 TRACE("(%p)\n", this);
1610 DEFINE_THISCALL_WRAPPER(ctype_base_vector_dtor, 8)
1611 ctype_base* __thiscall ctype_base_vector_dtor(ctype_base *this, unsigned int flags)
1613 TRACE("(%p %x)\n", this, flags);
1614 if(flags & 2) {
1615 /* we have an array, with the number of elements stored before the first object */
1616 INT_PTR i, *ptr = (INT_PTR *)this-1;
1618 for(i=*ptr-1; i>=0; i--)
1619 ctype_base_dtor(this+i);
1620 MSVCRT_operator_delete(ptr);
1621 } else {
1622 ctype_base_dtor(this);
1623 if(flags & 1)
1624 MSVCRT_operator_delete(this);
1627 return this;
1630 /* ?_Xran@ctype_base@std@@KAXXZ */
1631 void __cdecl ctype_base__Xran(void)
1633 throw_exception(EXCEPTION_OUT_OF_RANGE, "out of range in ctype<T>");
1636 /* ?id@?$ctype@D@std@@2V0locale@2@A */
1637 locale_id ctype_char_id = {0};
1638 /* ?table_size@?$ctype@D@std@@2IB */
1639 /* ?table_size@?$ctype@D@std@@2_KB */
1640 size_t ctype_char_table_size = 256;
1642 /* ??_7?$ctype@D@std@@6B@ */
1643 extern const vtable_ptr ctype_char_vtable;
1645 /* ?_Id_func@?$ctype@D@std@@SAAAVid@locale@2@XZ */
1646 /* ?_Id_func@?$ctype@D@std@@SAAEAVid@locale@2@XZ */
1647 locale_id* __cdecl ctype_char__Id_func(void)
1649 TRACE("()\n");
1650 return &ctype_char_id;
1653 /* ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z */
1654 /* ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z */
1655 DEFINE_THISCALL_WRAPPER(ctype_char__Init, 8)
1656 void __thiscall ctype_char__Init(ctype_char *this, const _Locinfo *locinfo)
1658 TRACE("(%p %p)\n", this, locinfo);
1659 _Locinfo__Getctype(locinfo, &this->ctype);
1662 /* ?_Tidy@?$ctype@D@std@@IAEXXZ */
1663 /* ?_Tidy@?$ctype@D@std@@IEAAXXZ */
1664 DEFINE_THISCALL_WRAPPER(ctype_char__Tidy, 4)
1665 void __thiscall ctype_char__Tidy(ctype_char *this)
1667 TRACE("(%p)\n", this);
1669 if(this->ctype.delfl)
1670 free((short*)this->ctype.table);
1671 #if _MSVCP_VER >= 110
1672 free(this->ctype.name);
1673 #endif
1676 /* ?classic_table@?$ctype@D@std@@KAPBFXZ */
1677 /* ?classic_table@?$ctype@D@std@@KAPEBFXZ */
1678 const short* __cdecl ctype_char_classic_table(void)
1680 ctype_char *ctype;
1682 TRACE("()\n");
1683 ctype = ctype_char_use_facet( locale_classic() );
1684 return ctype->ctype.table;
1687 /* ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z */
1688 /* ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
1689 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_locinfo, 12)
1690 ctype_char* __thiscall ctype_char_ctor_locinfo(ctype_char *this,
1691 const _Locinfo *locinfo, size_t refs)
1693 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
1694 ctype_base_ctor_refs(&this->base, refs);
1695 this->base.facet.vtable = &ctype_char_vtable;
1696 ctype_char__Init(this, locinfo);
1697 return this;
1700 /* ??0?$ctype@D@std@@QAE@PBF_NI@Z */
1701 /* ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z */
1702 DEFINE_THISCALL_WRAPPER(ctype_char_ctor_table, 16)
1703 ctype_char* __thiscall ctype_char_ctor_table(ctype_char *this,
1704 const short *table, bool delete, size_t refs)
1706 _Locinfo locinfo;
1708 TRACE("(%p %p %d %Iu)\n", this, table, delete, refs);
1710 ctype_base_ctor_refs(&this->base, refs);
1711 this->base.facet.vtable = &ctype_char_vtable;
1713 _Locinfo_ctor(&locinfo);
1714 ctype_char__Init(this, &locinfo);
1715 _Locinfo_dtor(&locinfo);
1717 if(table) {
1718 ctype_char__Tidy(this);
1719 this->ctype.table = table;
1720 this->ctype.delfl = delete;
1722 return this;
1725 /* ??_F?$ctype@D@std@@QAEXXZ */
1726 /* ??_F?$ctype@D@std@@QEAAXXZ */
1727 DEFINE_THISCALL_WRAPPER(ctype_char_ctor, 4)
1728 ctype_char* __thiscall ctype_char_ctor(ctype_char *this)
1730 return ctype_char_ctor_table(this, NULL, FALSE, 0);
1733 /* ??1?$ctype@D@std@@UAE@XZ */
1734 /* ??1?$ctype@D@std@@UEAA@XZ */
1735 /* ??1?$ctype@D@std@@MAE@XZ */
1736 /* ??1?$ctype@D@std@@MEAA@XZ */
1737 DEFINE_THISCALL_WRAPPER(ctype_char_dtor, 4)
1738 void __thiscall ctype_char_dtor(ctype_char *this)
1740 TRACE("(%p)\n", this);
1741 ctype_char__Tidy(this);
1744 DEFINE_THISCALL_WRAPPER(ctype_char_vector_dtor, 8)
1745 ctype_char* __thiscall ctype_char_vector_dtor(ctype_char *this, unsigned int flags)
1747 TRACE("(%p %x)\n", this, flags);
1748 if(flags & 2) {
1749 /* we have an array, with the number of elements stored before the first object */
1750 INT_PTR i, *ptr = (INT_PTR *)this-1;
1752 for(i=*ptr-1; i>=0; i--)
1753 ctype_char_dtor(this+i);
1754 MSVCRT_operator_delete(ptr);
1755 } else {
1756 ctype_char_dtor(this);
1757 if(flags & 1)
1758 MSVCRT_operator_delete(this);
1761 return this;
1764 /* ?do_narrow@?$ctype@D@std@@MBEDDD@Z */
1765 /* ?do_narrow@?$ctype@D@std@@MEBADDD@Z */
1766 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow_ch, 12)
1767 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1768 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 36, \
1769 char, (const ctype_char*, char, char), (this, ch, unused))
1770 #elif _MSVCP_VER <= 100
1771 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 32, \
1772 char, (const ctype_char*, char, char), (this, ch, unused))
1773 #else
1774 #define call_ctype_char_do_narrow_ch(this, ch, unused) CALL_VTBL_FUNC(this, 40, \
1775 char, (const ctype_char*, char, char), (this, ch, unused))
1776 #endif
1777 char __thiscall ctype_char_do_narrow_ch(const ctype_char *this, char ch, char unused)
1779 TRACE("(%p %c %c)\n", this, ch, unused);
1780 return ch;
1783 /* ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z */
1784 /* ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z */
1785 DEFINE_THISCALL_WRAPPER(ctype_char_do_narrow, 20)
1786 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
1787 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 32, \
1788 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1789 (this, first, last, unused, dest))
1790 #elif _MSVCP_VER <= 100
1791 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 28, \
1792 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1793 (this, first, last, unused, dest))
1794 #else
1795 #define call_ctype_char_do_narrow(this, first, last, unused, dest) CALL_VTBL_FUNC(this, 36, \
1796 const char*, (const ctype_char*, const char*, const char*, char, char*), \
1797 (this, first, last, unused, dest))
1798 #endif
1799 const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
1800 const char *first, const char *last, char unused, char *dest)
1802 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1803 memcpy(dest, first, last-first);
1804 return last;
1807 /* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
1808 /* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
1809 DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
1810 #define call_ctype_char__Do_narrow_s(this, first, last, unused, dest, size) CALL_VTBL_FUNC(this, 40, \
1811 const char*, (const ctype_char*, const char*, const char*, char, char*, size_t), \
1812 (this, first, last, unused, dest, size))
1813 const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
1814 const char *last, char unused, char *dest, size_t size)
1816 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1817 memcpy_s(dest, size, first, last-first);
1818 return last;
1821 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
1822 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
1823 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
1824 char __thiscall ctype_char_narrow_ch(const ctype_char *this, char ch, char dflt)
1826 TRACE("(%p %c %c)\n", this, ch, dflt);
1827 return call_ctype_char_do_narrow_ch(this, ch, dflt);
1830 /* ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z */
1831 /* ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z */
1832 DEFINE_THISCALL_WRAPPER(ctype_char_narrow, 20)
1833 const char* __thiscall ctype_char_narrow(const ctype_char *this,
1834 const char *first, const char *last, char dflt, char *dest)
1836 TRACE("(%p %p %p %c %p)\n", this, first, last, dflt, dest);
1837 return call_ctype_char_do_narrow(this, first, last, dflt, dest);
1840 /* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
1841 /* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
1842 DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
1843 const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
1844 const char *last, char dflt, char *dest, size_t size)
1846 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1847 return call_ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
1850 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
1851 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
1852 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
1853 #if _MSVCP_VER <= 100
1854 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
1855 char, (const ctype_char*, char), (this, ch))
1856 #else
1857 #define call_ctype_char_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
1858 char, (const ctype_char*, char), (this, ch))
1859 #endif
1860 char __thiscall ctype_char_do_widen_ch(const ctype_char *this, char ch)
1862 TRACE("(%p %c)\n", this, ch);
1863 return ch;
1866 /* ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z */
1867 /* ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z */
1868 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen, 16)
1869 #if _MSVCP_VER <= 100
1870 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 20, \
1871 const char*, (const ctype_char*, const char*, const char*, char*), \
1872 (this, first, last, dest))
1873 #else
1874 #define call_ctype_char_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 28, \
1875 const char*, (const ctype_char*, const char*, const char*, char*), \
1876 (this, first, last, dest))
1877 #endif
1878 const char* __thiscall ctype_char_do_widen(const ctype_char *this,
1879 const char *first, const char *last, char *dest)
1881 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1882 memcpy(dest, first, last-first);
1883 return last;
1886 /* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
1887 /* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
1888 DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
1889 #define call_ctype_char__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 28, \
1890 const char*, (const ctype_char*, const char*, const char*, char*, size_t), \
1891 (this, first, last, dest, size))
1892 const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
1893 const char *first, const char *last, char *dest, size_t size)
1895 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1896 memcpy_s(dest, size, first, last-first);
1897 return last;
1900 /* ?widen@?$ctype@D@std@@QBEDD@Z */
1901 /* ?widen@?$ctype@D@std@@QEBADD@Z */
1902 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
1903 char __thiscall ctype_char_widen_ch(const ctype_char *this, char ch)
1905 TRACE("(%p %c)\n", this, ch);
1906 return call_ctype_char_do_widen_ch(this, ch);
1909 /* ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z */
1910 /* ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z */
1911 DEFINE_THISCALL_WRAPPER(ctype_char_widen, 16)
1912 const char* __thiscall ctype_char_widen(const ctype_char *this,
1913 const char *first, const char *last, char *dest)
1915 TRACE("(%p %p %p %p)\n", this, first, last, dest);
1916 return call_ctype_char_do_widen(this, first, last, dest);
1919 /* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
1920 /* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
1921 DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
1922 const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
1923 const char *first, const char *last, char *dest, size_t size)
1925 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
1926 return call_ctype_char__Do_widen_s(this, first, last, dest, size);
1929 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
1930 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
1931 size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
1933 TRACE("(%p %p)\n", facet, loc);
1935 if(facet && !*facet) {
1936 _Locinfo locinfo;
1938 *facet = MSVCRT_operator_new(sizeof(ctype_char));
1939 if(!*facet) {
1940 ERR("Out of memory\n");
1941 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
1942 return 0;
1945 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
1946 ctype_char_ctor_locinfo((ctype_char*)*facet, &locinfo, 0);
1947 _Locinfo_dtor(&locinfo);
1950 return LC_CTYPE;
1953 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@@Z */
1954 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
1955 size_t __cdecl ctype_char__Getcat_old(const locale_facet **facet)
1957 return ctype_char__Getcat(facet, locale_classic());
1960 ctype_char* ctype_char_use_facet(const locale *loc)
1962 static ctype_char *obj = NULL;
1964 _Lockit lock;
1965 const locale_facet *fac;
1967 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
1968 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_char_id));
1969 if(fac) {
1970 _Lockit_dtor(&lock);
1971 return (ctype_char*)fac;
1974 if(obj) {
1975 _Lockit_dtor(&lock);
1976 return obj;
1979 ctype_char__Getcat(&fac, loc);
1980 obj = (ctype_char*)fac;
1981 call_locale_facet__Incref(&obj->base.facet);
1982 locale_facet_register(&obj->base.facet);
1983 _Lockit_dtor(&lock);
1985 return obj;
1988 /* _Tolower */
1989 int __cdecl _Tolower(int ch, const _Ctypevec *ctype)
1991 unsigned int cp;
1993 TRACE("%d %p\n", ch, ctype);
1995 if(ctype)
1996 cp = ctype->page;
1997 else
1998 cp = ___lc_codepage_func();
2000 /* Don't convert to unicode in case of C locale */
2001 if(!cp) {
2002 if(ch>='A' && ch<='Z')
2003 ch = ch-'A'+'a';
2004 return ch;
2005 } else {
2006 WCHAR wide, lower;
2007 char str[2];
2008 int size;
2010 if(ch > 255) {
2011 str[0] = (ch>>8) & 255;
2012 str[1] = ch & 255;
2013 size = 2;
2014 } else {
2015 str[0] = ch & 255;
2016 size = 1;
2019 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
2020 return ch;
2022 lower = towlower(wide);
2023 if(lower == wide)
2024 return ch;
2026 WideCharToMultiByte(cp, 0, &lower, 1, str, 2, NULL, NULL);
2028 return str[0] + (str[1]<<8);
2032 /* ?do_tolower@?$ctype@D@std@@MBEDD@Z */
2033 /* ?do_tolower@?$ctype@D@std@@MEBADD@Z */
2034 #if _MSVCP_VER <= 100
2035 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 8, \
2036 char, (const ctype_char*, char), (this, ch))
2037 #else
2038 #define call_ctype_char_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2039 char, (const ctype_char*, char), (this, ch))
2040 #endif
2041 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower_ch, 8)
2042 char __thiscall ctype_char_do_tolower_ch(const ctype_char *this, char ch)
2044 TRACE("(%p %c)\n", this, ch);
2045 return _Tolower(ch, &this->ctype);
2048 /* ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z */
2049 /* ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2050 #if _MSVCP_VER <= 100
2051 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 4, \
2052 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2053 #else
2054 #define call_ctype_char_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 12, \
2055 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2056 #endif
2057 DEFINE_THISCALL_WRAPPER(ctype_char_do_tolower, 12)
2058 const char* __thiscall ctype_char_do_tolower(const ctype_char *this, char *first, const char *last)
2060 TRACE("(%p %p %p)\n", this, first, last);
2061 for(; first<last; first++)
2062 *first = _Tolower(*first, &this->ctype);
2063 return last;
2066 /* ?tolower@?$ctype@D@std@@QBEDD@Z */
2067 /* ?tolower@?$ctype@D@std@@QEBADD@Z */
2068 DEFINE_THISCALL_WRAPPER(ctype_char_tolower_ch, 8)
2069 char __thiscall ctype_char_tolower_ch(const ctype_char *this, char ch)
2071 TRACE("(%p %c)\n", this, ch);
2072 return call_ctype_char_do_tolower_ch(this, ch);
2075 /* ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z */
2076 /* ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2077 DEFINE_THISCALL_WRAPPER(ctype_char_tolower, 12)
2078 const char* __thiscall ctype_char_tolower(const ctype_char *this, char *first, const char *last)
2080 TRACE("(%p %p %p)\n", this, first, last);
2081 return call_ctype_char_do_tolower(this, first, last);
2084 /* _Toupper */
2085 int __cdecl _Toupper(int ch, const _Ctypevec *ctype)
2087 unsigned int cp;
2089 TRACE("%d %p\n", ch, ctype);
2091 if(ctype)
2092 cp = ctype->page;
2093 else
2094 cp = ___lc_codepage_func();
2096 /* Don't convert to unicode in case of C locale */
2097 if(!cp) {
2098 if(ch>='a' && ch<='z')
2099 ch = ch-'a'+'A';
2100 return ch;
2101 } else {
2102 WCHAR wide, upper;
2103 char str[2];
2104 int size;
2106 if(ch > 255) {
2107 str[0] = (ch>>8) & 255;
2108 str[1] = ch & 255;
2109 size = 2;
2110 } else {
2111 str[0] = ch & 255;
2112 size = 1;
2115 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, str, size, &wide, 1))
2116 return ch;
2118 upper = towupper(wide);
2119 if(upper == wide)
2120 return ch;
2122 WideCharToMultiByte(cp, 0, &upper, 1, str, 2, NULL, NULL);
2124 return str[0] + (str[1]<<8);
2128 /* ?do_toupper@?$ctype@D@std@@MBEDD@Z */
2129 /* ?do_toupper@?$ctype@D@std@@MEBADD@Z */
2130 #if _MSVCP_VER <= 100
2131 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 16, \
2132 char, (const ctype_char*, char), (this, ch))
2133 #else
2134 #define call_ctype_char_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2135 char, (const ctype_char*, char), (this, ch))
2136 #endif
2137 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper_ch, 8)
2138 char __thiscall ctype_char_do_toupper_ch(const ctype_char *this, char ch)
2140 TRACE("(%p %c)\n", this, ch);
2141 return _Toupper(ch, &this->ctype);
2144 /* ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z */
2145 /* ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z */
2146 #if _MSVCP_VER <= 100
2147 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 12, \
2148 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2149 #else
2150 #define call_ctype_char_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 20, \
2151 const char*, (const ctype_char*, char*, const char*), (this, first, last))
2152 #endif
2153 DEFINE_THISCALL_WRAPPER(ctype_char_do_toupper, 12)
2154 const char* __thiscall ctype_char_do_toupper(const ctype_char *this,
2155 char *first, const char *last)
2157 TRACE("(%p %p %p)\n", this, first, last);
2158 for(; first<last; first++)
2159 *first = _Toupper(*first, &this->ctype);
2160 return last;
2163 /* ?toupper@?$ctype@D@std@@QBEDD@Z */
2164 /* ?toupper@?$ctype@D@std@@QEBADD@Z */
2165 DEFINE_THISCALL_WRAPPER(ctype_char_toupper_ch, 8)
2166 char __thiscall ctype_char_toupper_ch(const ctype_char *this, char ch)
2168 TRACE("(%p %c)\n", this, ch);
2169 return call_ctype_char_do_toupper_ch(this, ch);
2172 /* ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z */
2173 /* ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z */
2174 DEFINE_THISCALL_WRAPPER(ctype_char_toupper, 12)
2175 const char* __thiscall ctype_char_toupper(const ctype_char *this, char *first, const char *last)
2177 TRACE("(%p %p %p)\n", this, first, last);
2178 return call_ctype_char_do_toupper(this, first, last);
2181 /* ?is@?$ctype@D@std@@QBE_NFD@Z */
2182 /* ?is@?$ctype@D@std@@QEBA_NFD@Z */
2183 DEFINE_THISCALL_WRAPPER(ctype_char_is_ch, 12)
2184 bool __thiscall ctype_char_is_ch(const ctype_char *this, short mask, char ch)
2186 TRACE("(%p %x %c)\n", this, mask, ch);
2187 return (this->ctype.table[(unsigned char)ch] & mask) != 0;
2190 /* ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z */
2191 /* ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z */
2192 DEFINE_THISCALL_WRAPPER(ctype_char_is, 16)
2193 const char* __thiscall ctype_char_is(const ctype_char *this, const char *first, const char *last, short *dest)
2195 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2196 for(; first<last; first++)
2197 *dest++ = this->ctype.table[(unsigned char)*first];
2198 return last;
2201 /* ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z */
2202 /* ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2203 DEFINE_THISCALL_WRAPPER(ctype_char_scan_is, 16)
2204 const char* __thiscall ctype_char_scan_is(const ctype_char *this, short mask, const char *first, const char *last)
2206 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2207 for(; first<last; first++)
2208 if(!ctype_char_is_ch(this, mask, *first))
2209 break;
2210 return first;
2213 /* ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z */
2214 /* ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z */
2215 DEFINE_THISCALL_WRAPPER(ctype_char_scan_not, 16)
2216 const char* __thiscall ctype_char_scan_not(const ctype_char *this, short mask, const char *first, const char *last)
2218 TRACE("(%p %x %p %p)\n", this, mask, first, last);
2219 for(; first<last; first++)
2220 if(ctype_char_is_ch(this, mask, *first))
2221 break;
2222 return first;
2225 /* ?table@?$ctype@D@std@@IBEPBFXZ */
2226 /* ?table@?$ctype@D@std@@IEBAPEBFXZ */
2227 DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
2228 const short* __thiscall ctype_char_table(const ctype_char *this)
2230 TRACE("(%p)\n", this);
2231 return this->ctype.table;
2234 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
2235 locale_id ctype_wchar_id = {0};
2236 /* ?id@?$ctype@G@std@@2V0locale@2@A */
2237 locale_id ctype_short_id = {0};
2239 /* ??_7?$ctype@_W@std@@6B@ */
2240 extern const vtable_ptr ctype_wchar_vtable;
2241 /* ??_7?$ctype@G@std@@6B@ */
2242 extern const vtable_ptr ctype_short_vtable;
2244 /* ?_Id_func@?$ctype@_W@std@@SAAAVid@locale@2@XZ */
2245 /* ?_Id_func@?$ctype@_W@std@@SAAEAVid@locale@2@XZ */
2246 locale_id* __cdecl ctype_wchar__Id_func(void)
2248 TRACE("()\n");
2249 return &ctype_wchar_id;
2252 /* ?_Id_func@?$ctype@G@std@@SAAAVid@locale@2@XZ */
2253 /* ?_Id_func@?$ctype@G@std@@SAAEAVid@locale@2@XZ */
2254 locale_id* __cdecl ctype_short__Id_func(void)
2256 TRACE("()\n");
2257 return &ctype_short_id;
2260 /* ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z */
2261 /* ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
2262 /* ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z */
2263 /* ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z */
2264 DEFINE_THISCALL_WRAPPER(ctype_wchar__Init, 8)
2265 void __thiscall ctype_wchar__Init(ctype_wchar *this, const _Locinfo *locinfo)
2267 TRACE("(%p %p)\n", this, locinfo);
2268 _Locinfo__Getctype(locinfo, &this->ctype);
2269 _Locinfo__Getcvt(locinfo, &this->cvt);
2272 /* ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z */
2273 /* ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2274 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_locinfo, 12)
2275 ctype_wchar* __thiscall ctype_wchar_ctor_locinfo(ctype_wchar *this,
2276 const _Locinfo *locinfo, size_t refs)
2278 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
2279 ctype_base_ctor_refs(&this->base, refs);
2280 this->base.facet.vtable = &ctype_wchar_vtable;
2281 ctype_wchar__Init(this, locinfo);
2282 return this;
2285 /* ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z */
2286 /* ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
2287 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_locinfo, 12)
2288 ctype_wchar* __thiscall ctype_short_ctor_locinfo(ctype_wchar *this,
2289 const _Locinfo *locinfo, size_t refs)
2291 ctype_wchar *ret = ctype_wchar_ctor_locinfo(this, locinfo, refs);
2292 this->base.facet.vtable = &ctype_short_vtable;
2293 return ret;
2296 /* ??0?$ctype@_W@std@@QAE@I@Z */
2297 /* ??0?$ctype@_W@std@@QEAA@_K@Z */
2298 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor_refs, 8)
2299 ctype_wchar* __thiscall ctype_wchar_ctor_refs(ctype_wchar *this, size_t refs)
2301 _Locinfo locinfo;
2303 TRACE("(%p %Iu)\n", this, refs);
2305 ctype_base_ctor_refs(&this->base, refs);
2306 this->base.facet.vtable = &ctype_wchar_vtable;
2308 _Locinfo_ctor(&locinfo);
2309 ctype_wchar__Init(this, &locinfo);
2310 _Locinfo_dtor(&locinfo);
2311 return this;
2314 /* ??0?$ctype@G@std@@QAE@I@Z */
2315 /* ??0?$ctype@G@std@@QEAA@_K@Z */
2316 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_refs, 8)
2317 ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, size_t refs)
2319 ctype_wchar *ret = ctype_wchar_ctor_refs(this, refs);
2320 this->base.facet.vtable = &ctype_short_vtable;
2321 return ret;
2324 /* ??0?$ctype@G@std@@IAE@PBDI@Z */
2325 /* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
2326 DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
2327 ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
2328 const char *name, size_t refs)
2330 _Locinfo locinfo;
2332 TRACE("(%p %s %Iu)\n", this, debugstr_a(name), refs);
2334 ctype_base_ctor_refs(&this->base, refs);
2335 this->base.facet.vtable = &ctype_short_vtable;
2337 _Locinfo_ctor_cstr(&locinfo, name);
2338 ctype_wchar__Init(this, &locinfo);
2339 _Locinfo_dtor(&locinfo);
2340 return this;
2343 /* ??_F?$ctype@_W@std@@QAEXXZ */
2344 /* ??_F?$ctype@_W@std@@QEAAXXZ */
2345 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
2346 ctype_wchar* __thiscall ctype_wchar_ctor(ctype_wchar *this)
2348 TRACE("(%p)\n", this);
2349 return ctype_short_ctor_refs(this, 0);
2352 /* ??_F?$ctype@G@std@@QAEXXZ */
2353 /* ??_F?$ctype@G@std@@QEAAXXZ */
2354 DEFINE_THISCALL_WRAPPER(ctype_short_ctor, 4)
2355 ctype_wchar* __thiscall ctype_short_ctor(ctype_wchar *this)
2357 ctype_wchar *ret = ctype_wchar_ctor(this);
2358 this->base.facet.vtable = &ctype_short_vtable;
2359 return ret;
2362 /* ??1?$ctype@G@std@@UAE@XZ */
2363 /* ??1?$ctype@G@std@@UEAA@XZ */
2364 /* ??1?$ctype@_W@std@@MAE@XZ */
2365 /* ??1?$ctype@_W@std@@MEAA@XZ */
2366 /* ??1?$ctype@G@std@@MAE@XZ */
2367 /* ??1?$ctype@G@std@@MEAA@XZ */
2368 DEFINE_THISCALL_WRAPPER(ctype_wchar_dtor, 4)
2369 void __thiscall ctype_wchar_dtor(ctype_wchar *this)
2371 TRACE("(%p)\n", this);
2372 if(this->ctype.delfl)
2373 free((void*)this->ctype.table);
2374 #if _MSVCP_VER >= 110
2375 free(this->ctype.name);
2376 #endif
2379 DEFINE_THISCALL_WRAPPER(ctype_wchar_vector_dtor, 8)
2380 ctype_wchar* __thiscall ctype_wchar_vector_dtor(ctype_wchar *this, unsigned int flags)
2382 TRACE("(%p %x)\n", this, flags);
2383 if(flags & 2) {
2384 /* we have an array, with the number of elements stored before the first object */
2385 INT_PTR i, *ptr = (INT_PTR *)this-1;
2387 for(i=*ptr-1; i>=0; i--)
2388 ctype_wchar_dtor(this+i);
2389 MSVCRT_operator_delete(ptr);
2390 } else {
2391 ctype_wchar_dtor(this);
2392 if(flags & 1)
2393 MSVCRT_operator_delete(this);
2396 return this;
2399 /* _Wcrtomb */
2400 int __cdecl _Wcrtomb(char *s, wchar_t wch, _Mbstatet *state, const _Cvtvec *cvt)
2402 int cp, size;
2403 BOOL def;
2405 TRACE("%p %d %p %p\n", s, wch, state, cvt);
2407 if(cvt)
2408 cp = cvt->page;
2409 else
2410 cp = ___lc_codepage_func();
2412 if(!cp) {
2413 if(wch > 255) {
2414 *_errno() = EILSEQ;
2415 return -1;
2418 *s = wch & 255;
2419 return 1;
2422 size = WideCharToMultiByte(cp, 0, &wch, 1, s, MB_LEN_MAX, NULL, &def);
2423 if(!size || def) {
2424 *_errno() = EILSEQ;
2425 return -1;
2428 return size;
2431 /* ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z */
2432 /* ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z */
2433 /* ?_Donarrow@?$ctype@G@std@@IBEDGD@Z */
2434 /* ?_Donarrow@?$ctype@G@std@@IEBADGD@Z */
2435 DEFINE_THISCALL_WRAPPER(ctype_wchar__Donarrow, 12)
2436 char __thiscall ctype_wchar__Donarrow(const ctype_wchar *this, wchar_t ch, char dflt)
2438 char buf[MB_LEN_MAX];
2440 TRACE("(%p %d %d)\n", this, ch, dflt);
2442 return _Wcrtomb(buf, ch, NULL, &this->cvt)==1 ? buf[0] : dflt;
2445 /* ?do_narrow@?$ctype@_W@std@@MBED_WD@Z */
2446 /* ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z */
2447 /* ?do_narrow@?$ctype@G@std@@MBEDGD@Z */
2448 /* ?do_narrow@?$ctype@G@std@@MEBADGD@Z */
2449 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow_ch, 12)
2450 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2451 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 52, \
2452 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2453 #elif _MSVCP_VER <= 100
2454 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 48, \
2455 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2456 #else
2457 #define call_ctype_wchar_do_narrow_ch(this, ch, dflt) CALL_VTBL_FUNC(this, 56, \
2458 char, (const ctype_wchar*, wchar_t, char), (this, ch, dflt))
2459 #endif
2460 char __thiscall ctype_wchar_do_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2462 return ctype_wchar__Donarrow(this, ch, dflt);
2465 /* ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z */
2466 /* ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z */
2467 /* ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z */
2468 /* ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z */
2469 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_narrow, 20)
2470 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
2471 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 48, \
2472 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2473 (this, first, last, dflt, dest))
2474 #elif _MSVCP_VER <= 100
2475 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 44, \
2476 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2477 (this, first, last, dflt, dest))
2478 #else
2479 #define call_ctype_wchar_do_narrow(this, first, last, dflt, dest) CALL_VTBL_FUNC(this, 52, \
2480 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*), \
2481 (this, first, last, dflt, dest))
2482 #endif
2483 const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
2484 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2486 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2487 for(; first<last; first++)
2488 *dest++ = ctype_wchar__Donarrow(this, *first, dflt);
2489 return last;
2492 /* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
2493 /* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
2494 /* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
2495 /* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
2496 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
2497 #define call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size) CALL_VTBL_FUNC(this, 56, \
2498 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, char, char*, size_t), \
2499 (this, first, last, dflt, dest, size))
2500 const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
2501 const wchar_t *first, const wchar_t *last, char dflt, char *dest, size_t size)
2503 TRACE("(%p %p %p %d %p %Iu)\n", this, first, last, dflt, dest, size);
2504 /* This function converts all multi-byte characters to dflt,
2505 * thanks to it result size is known before converting */
2506 if(last-first > size)
2507 ctype_base__Xran();
2508 return ctype_wchar_do_narrow(this, first, last, dflt, dest);
2511 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
2512 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
2513 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
2514 /* ?narrow@?$ctype@G@std@@QEBADGD@Z */
2515 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow_ch, 12)
2516 char __thiscall ctype_wchar_narrow_ch(const ctype_wchar *this, wchar_t ch, char dflt)
2518 TRACE("(%p %d %d)\n", this, ch, dflt);
2519 return call_ctype_wchar_do_narrow_ch(this, ch, dflt);
2522 /* ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z */
2523 /* ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z */
2524 /* ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z */
2525 /* ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z */
2526 DEFINE_THISCALL_WRAPPER(ctype_wchar_narrow, 20)
2527 const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
2528 const wchar_t *first, const wchar_t *last, char dflt, char *dest)
2530 TRACE("(%p %p %p %d %p)\n", this, first, last, dflt, dest);
2531 return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
2534 /* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
2535 /* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
2536 /* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
2537 /* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
2538 DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
2539 const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
2540 const wchar_t *last, char dflt, char *dest, size_t size)
2542 TRACE("(%p %p %p %d %p %Iu)\n", this, first, last, dflt, dest, size);
2543 return call_ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
2546 /* _Mbrtowc */
2547 int __cdecl _Mbrtowc(wchar_t *out, const char *in, size_t len, _Mbstatet *state, const _Cvtvec *cvt)
2549 int i, cp;
2550 CPINFO cp_info;
2551 BOOL is_lead;
2553 TRACE("(%p %p %Iu %p %p)\n", out, in, len, state, cvt);
2555 if(!len)
2556 return 0;
2558 if(cvt)
2559 cp = cvt->page;
2560 else
2561 cp = ___lc_codepage_func();
2563 if(!cp) {
2564 if(out)
2565 *out = (unsigned char)*in;
2567 memset(state, 0, sizeof(*state));
2568 return *in ? 1 : 0;
2571 if(MBSTATET_TO_INT(state)) {
2572 ((char*)&MBSTATET_TO_INT(state))[1] = *in;
2574 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, (char*)&MBSTATET_TO_INT(state), 2, out, out ? 1 : 0)) {
2575 memset(state, 0, sizeof(*state));
2576 *_errno() = EILSEQ;
2577 return -1;
2580 memset(state, 0, sizeof(*state));
2581 return 2;
2584 GetCPInfo(cp, &cp_info);
2585 is_lead = FALSE;
2586 for(i=0; i<MAX_LEADBYTES; i+=2) {
2587 if(!cp_info.LeadByte[i+1])
2588 break;
2589 if((unsigned char)*in>=cp_info.LeadByte[i] && (unsigned char)*in<=cp_info.LeadByte[i+1]) {
2590 is_lead = TRUE;
2591 break;
2595 if(is_lead) {
2596 if(len == 1) {
2597 MBSTATET_TO_INT(state) = (unsigned char)*in;
2598 return -2;
2601 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 2, out, out ? 1 : 0)) {
2602 *_errno() = EILSEQ;
2603 return -1;
2605 return 2;
2608 if(!MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, in, 1, out, out ? 1 : 0)) {
2609 *_errno() = EILSEQ;
2610 return -1;
2612 return 1;
2615 static inline wchar_t mb_to_wc(char ch, const _Cvtvec *cvt)
2617 _Mbstatet state;
2618 wchar_t ret;
2620 memset(&state, 0, sizeof(state));
2621 return _Mbrtowc(&ret, &ch, 1, &state, cvt) == 1 ? ret : 0;
2624 /* ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z */
2625 /* ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z */
2626 /* ?_Dowiden@?$ctype@G@std@@IBEGD@Z */
2627 /* ?_Dowiden@?$ctype@G@std@@IEBAGD@Z */
2628 DEFINE_THISCALL_WRAPPER(ctype_wchar__Dowiden, 8)
2629 wchar_t __thiscall ctype_wchar__Dowiden(const ctype_wchar *this, char ch)
2631 _Mbstatet state;
2632 wchar_t ret;
2634 TRACE("(%p %d)\n", this, ch);
2636 memset(&state, 0, sizeof(state));
2637 return _Mbrtowc(&ret, &ch, 1, &state, &this->cvt)<0 ? WEOF : ret;
2640 /* ?do_widen@?$ctype@_W@std@@MBE_WD@Z */
2641 /* ?do_widen@?$ctype@_W@std@@MEBA_WD@Z */
2642 /* ?do_widen@?$ctype@G@std@@MBEGD@Z */
2643 /* ?do_widen@?$ctype@G@std@@MEBAGD@Z */
2644 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen_ch, 8)
2645 #if _MSVCP_VER <= 100
2646 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2647 wchar_t, (const ctype_wchar*, char), (this, ch))
2648 #else
2649 #define call_ctype_wchar_do_widen_ch(this, ch) CALL_VTBL_FUNC(this, 48, \
2650 wchar_t, (const ctype_wchar*, char), (this, ch))
2651 #endif
2652 wchar_t __thiscall ctype_wchar_do_widen_ch(const ctype_wchar *this, char ch)
2654 return ctype_wchar__Dowiden(this, ch);
2657 /* ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z */
2658 /* ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z */
2659 /* ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z */
2660 /* ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z */
2661 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_widen, 16)
2662 #if _MSVCP_VER <= 100
2663 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 36, \
2664 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2665 (this, first, last, dest))
2666 #else
2667 #define call_ctype_wchar_do_widen(this, first, last, dest) CALL_VTBL_FUNC(this, 44, \
2668 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*), \
2669 (this, first, last, dest))
2670 #endif
2671 const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
2672 const char *first, const char *last, wchar_t *dest)
2674 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2675 for(; first<last; first++)
2676 *dest++ = ctype_wchar__Dowiden(this, *first);
2677 return last;
2680 /* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
2681 /* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
2682 /* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
2683 /* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
2684 DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
2685 #define call_ctype_wchar__Do_widen_s(this, first, last, dest, size) CALL_VTBL_FUNC(this, 44, \
2686 const char*, (const ctype_wchar*, const char*, const char*, wchar_t*, size_t), \
2687 (this, first, last, dest, size))
2688 const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
2689 const char *first, const char *last, wchar_t *dest, size_t size)
2691 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
2692 /* This function converts all multi-byte characters to WEOF,
2693 * thanks to it result size is known before converting */
2694 if(size < last-first)
2695 ctype_base__Xran();
2696 return ctype_wchar_do_widen(this, first, last, dest);
2699 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
2700 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
2701 /* ?widen@?$ctype@G@std@@QBEGD@Z */
2702 /* ?widen@?$ctype@G@std@@QEBAGD@Z */
2703 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen_ch, 8)
2704 wchar_t __thiscall ctype_wchar_widen_ch(const ctype_wchar *this, char ch)
2706 TRACE("(%p %d)\n", this, ch);
2707 return call_ctype_wchar_do_widen_ch(this, ch);
2710 /* ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z */
2711 /* ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z */
2712 /* ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z */
2713 /* ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z */
2714 DEFINE_THISCALL_WRAPPER(ctype_wchar_widen, 16)
2715 const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
2716 const char *first, const char *last, wchar_t *dest)
2718 TRACE("(%p %p %p %p)\n", this, first, last, dest);
2719 return call_ctype_wchar_do_widen(this, first, last, dest);
2722 /* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
2723 /* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
2724 /* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
2725 /* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
2726 DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
2727 const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
2728 const char *first, const char *last, wchar_t *dest, size_t size)
2730 TRACE("(%p %p %p %p %Iu)\n", this, first, last, dest, size);
2731 return call_ctype_wchar__Do_widen_s(this, first, last, dest, size);
2734 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2735 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2736 size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
2738 TRACE("(%p %p)\n", facet, loc);
2740 if(facet && !*facet) {
2741 _Locinfo locinfo;
2743 *facet = MSVCRT_operator_new(sizeof(ctype_wchar));
2744 if(!*facet) {
2745 ERR("Out of memory\n");
2746 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
2747 return 0;
2750 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
2751 ctype_wchar_ctor_locinfo((ctype_wchar*)*facet, &locinfo, 0);
2752 _Locinfo_dtor(&locinfo);
2755 return LC_CTYPE;
2758 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@@Z */
2759 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2760 size_t __cdecl ctype_wchar__Getcat_old(const locale_facet **facet)
2762 return ctype_wchar__Getcat(facet, locale_classic());
2765 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
2766 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
2767 size_t __cdecl ctype_short__Getcat(const locale_facet **facet, const locale *loc)
2769 if(facet && !*facet) {
2770 ctype_wchar__Getcat(facet, loc);
2771 (*(locale_facet**)facet)->vtable = &ctype_short_vtable;
2774 return LC_CTYPE;
2777 /* ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@@Z */
2778 /* ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
2779 size_t __cdecl ctype_short__Getcat_old(const locale_facet **facet)
2781 return ctype_short__Getcat(facet, locale_classic());
2784 /* _Towlower */
2785 wchar_t __cdecl _Towlower(wchar_t ch, const _Ctypevec *ctype)
2787 TRACE("(%d %p)\n", ch, ctype);
2788 return towlower(ch);
2791 ctype_wchar* ctype_wchar_use_facet(const locale *loc)
2793 static ctype_wchar *obj = NULL;
2795 _Lockit lock;
2796 const locale_facet *fac;
2798 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2799 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_wchar_id));
2800 if(fac) {
2801 _Lockit_dtor(&lock);
2802 return (ctype_wchar*)fac;
2805 if(obj) {
2806 _Lockit_dtor(&lock);
2807 return obj;
2810 ctype_wchar__Getcat(&fac, loc);
2811 obj = (ctype_wchar*)fac;
2812 call_locale_facet__Incref(&obj->base.facet);
2813 locale_facet_register(&obj->base.facet);
2814 _Lockit_dtor(&lock);
2816 return obj;
2819 ctype_wchar* ctype_short_use_facet(const locale *loc)
2821 static ctype_wchar *obj = NULL;
2823 _Lockit lock;
2824 const locale_facet *fac;
2826 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
2827 fac = locale__Getfacet(loc, locale_id_operator_size_t(&ctype_short_id));
2828 if(fac) {
2829 _Lockit_dtor(&lock);
2830 return (ctype_wchar*)fac;
2833 if(obj) {
2834 _Lockit_dtor(&lock);
2835 return obj;
2838 ctype_short__Getcat(&fac, loc);
2839 obj = (ctype_wchar*)fac;
2840 call_locale_facet__Incref(&obj->base.facet);
2841 locale_facet_register(&obj->base.facet);
2842 _Lockit_dtor(&lock);
2844 return obj;
2847 /* ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z */
2848 /* ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z */
2849 /* ?do_tolower@?$ctype@G@std@@MBEGG@Z */
2850 /* ?do_tolower@?$ctype@G@std@@MEBAGG@Z */
2851 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower_ch, 8)
2852 #if _MSVCP_VER <= 100
2853 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 24, \
2854 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2855 #else
2856 #define call_ctype_wchar_do_tolower_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2857 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2858 #endif
2859 wchar_t __thiscall ctype_wchar_do_tolower_ch(const ctype_wchar *this, wchar_t ch)
2861 return _Towlower(ch, &this->ctype);
2864 /* ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2865 /* ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2866 /* ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2867 /* ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2868 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_tolower, 12)
2869 #if _MSVCP_VER <= 100
2870 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 20, \
2871 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2872 (this, first, last))
2873 #else
2874 #define call_ctype_wchar_do_tolower(this, first, last) CALL_VTBL_FUNC(this, 28, \
2875 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2876 (this, first, last))
2877 #endif
2878 const wchar_t* __thiscall ctype_wchar_do_tolower(const ctype_wchar *this,
2879 wchar_t *first, const wchar_t *last)
2881 TRACE("(%p %p %p)\n", this, first, last);
2882 for(; first<last; first++)
2883 *first = _Towlower(*first, &this->ctype);
2884 return last;
2887 /* ?tolower@?$ctype@_W@std@@QBE_W_W@Z */
2888 /* ?tolower@?$ctype@_W@std@@QEBA_W_W@Z */
2889 /* ?tolower@?$ctype@G@std@@QBEGG@Z */
2890 /* ?tolower@?$ctype@G@std@@QEBAGG@Z */
2891 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower_ch, 8)
2892 wchar_t __thiscall ctype_wchar_tolower_ch(const ctype_wchar *this, wchar_t ch)
2894 TRACE("(%p %d)\n", this, ch);
2895 return call_ctype_wchar_do_tolower_ch(this, ch);
2898 /* ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2899 /* ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2900 /* ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2901 /* ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2902 DEFINE_THISCALL_WRAPPER(ctype_wchar_tolower, 12)
2903 const wchar_t* __thiscall ctype_wchar_tolower(const ctype_wchar *this,
2904 wchar_t *first, const wchar_t *last)
2906 TRACE("(%p %p %p)\n", this, first, last);
2907 return call_ctype_wchar_do_tolower(this, first, last);
2910 /* _Towupper */
2911 wchar_t __cdecl _Towupper(wchar_t ch, const _Ctypevec *ctype)
2913 TRACE("(%d %p)\n", ch, ctype);
2914 return towupper(ch);
2917 /* ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z */
2918 /* ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z */
2919 /* ?do_toupper@?$ctype@G@std@@MBEGG@Z */
2920 /* ?do_toupper@?$ctype@G@std@@MEBAGG@Z */
2921 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper_ch, 8)
2922 #if _MSVCP_VER <= 100
2923 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 32, \
2924 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2925 #else
2926 #define call_ctype_wchar_do_toupper_ch(this, ch) CALL_VTBL_FUNC(this, 40, \
2927 wchar_t, (const ctype_wchar*, wchar_t), (this, ch))
2928 #endif
2929 wchar_t __thiscall ctype_wchar_do_toupper_ch(const ctype_wchar *this, wchar_t ch)
2931 return _Towupper(ch, &this->ctype);
2934 /* ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z */
2935 /* ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z */
2936 /* ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z */
2937 /* ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z */
2938 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_toupper, 12)
2939 #if _MSVCP_VER <= 100
2940 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 28, \
2941 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2942 (this, first, last))
2943 #else
2944 #define call_ctype_wchar_do_toupper(this, first, last) CALL_VTBL_FUNC(this, 36, \
2945 const wchar_t*, (const ctype_wchar*, wchar_t*, const wchar_t*), \
2946 (this, first, last))
2947 #endif
2948 const wchar_t* __thiscall ctype_wchar_do_toupper(const ctype_wchar *this,
2949 wchar_t *first, const wchar_t *last)
2951 TRACE("(%p %p %p)\n", this, first, last);
2952 for(; first<last; first++)
2953 *first = _Towupper(*first, &this->ctype);
2954 return last;
2957 /* ?toupper@?$ctype@_W@std@@QBE_W_W@Z */
2958 /* ?toupper@?$ctype@_W@std@@QEBA_W_W@Z */
2959 /* ?toupper@?$ctype@G@std@@QBEGG@Z */
2960 /* ?toupper@?$ctype@G@std@@QEBAGG@Z */
2961 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper_ch, 8)
2962 wchar_t __thiscall ctype_wchar_toupper_ch(const ctype_wchar *this, wchar_t ch)
2964 TRACE("(%p %d)\n", this, ch);
2965 return call_ctype_wchar_do_toupper_ch(this, ch);
2968 /* ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z */
2969 /* ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z */
2970 /* ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z */
2971 /* ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z */
2972 DEFINE_THISCALL_WRAPPER(ctype_wchar_toupper, 12)
2973 const wchar_t* __thiscall ctype_wchar_toupper(const ctype_wchar *this,
2974 wchar_t *first, const wchar_t *last)
2976 TRACE("(%p %p %p)\n", this, first, last);
2977 return call_ctype_wchar_do_toupper(this, first, last);
2980 /* _Getwctypes */
2981 const wchar_t* __cdecl _Getwctypes(const wchar_t *first, const wchar_t *last,
2982 short *mask, const _Ctypevec *ctype)
2984 TRACE("(%p %p %p %p)\n", first, last, mask, ctype);
2985 GetStringTypeW(CT_CTYPE1, first, last-first, (WORD*)mask);
2986 return last;
2989 /* _Getwctype */
2990 short __cdecl _Getwctype(wchar_t ch, const _Ctypevec *ctype)
2992 short mask = 0;
2993 _Getwctypes(&ch, &ch+1, &mask, ctype);
2994 return mask;
2997 /* ?do_is@?$ctype@_W@std@@MBE_NF_W@Z */
2998 /* ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z */
2999 /* ?do_is@?$ctype@G@std@@MBE_NFG@Z */
3000 /* ?do_is@?$ctype@G@std@@MEBA_NFG@Z */
3001 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is_ch, 12)
3002 #if _MSVCP_VER <= 100
3003 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 8, \
3004 bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
3005 #else
3006 #define call_ctype_wchar_do_is_ch(this, mask, ch) CALL_VTBL_FUNC(this, 16, \
3007 bool, (const ctype_wchar*, short, wchar_t), (this, mask, ch))
3008 #endif
3009 bool __thiscall ctype_wchar_do_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
3011 TRACE("(%p %x %d)\n", this, mask, ch);
3012 return (_Getwctype(ch, &this->ctype) & mask) != 0;
3015 /* ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z */
3016 /* ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z */
3017 /* ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z */
3018 /* ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z */
3019 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_is, 16)
3020 #if _MSVCP_VER <= 100
3021 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 4, \
3022 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
3023 (this, first, last, dest))
3024 #else
3025 #define call_ctype_wchar_do_is(this, first, last, dest) CALL_VTBL_FUNC(this, 12, \
3026 const wchar_t*, (const ctype_wchar*, const wchar_t*, const wchar_t*, short*), \
3027 (this, first, last, dest))
3028 #endif
3029 const wchar_t* __thiscall ctype_wchar_do_is(const ctype_wchar *this,
3030 const wchar_t *first, const wchar_t *last, short *dest)
3032 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3033 return _Getwctypes(first, last, dest, &this->ctype);
3036 /* ?is@?$ctype@_W@std@@QBE_NF_W@Z */
3037 /* ?is@?$ctype@_W@std@@QEBA_NF_W@Z */
3038 /* ?is@?$ctype@G@std@@QBE_NFG@Z */
3039 /* ?is@?$ctype@G@std@@QEBA_NFG@Z */
3040 DEFINE_THISCALL_WRAPPER(ctype_wchar_is_ch, 12)
3041 bool __thiscall ctype_wchar_is_ch(const ctype_wchar *this, short mask, wchar_t ch)
3043 TRACE("(%p %x %d)\n", this, mask, ch);
3044 return call_ctype_wchar_do_is_ch(this, mask, ch);
3047 /* ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z */
3048 /* ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z */
3049 /* ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z */
3050 /* ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z */
3051 DEFINE_THISCALL_WRAPPER(ctype_wchar_is, 16)
3052 const wchar_t* __thiscall ctype_wchar_is(const ctype_wchar *this,
3053 const wchar_t *first, const wchar_t *last, short *dest)
3055 TRACE("(%p %p %p %p)\n", this, first, last, dest);
3056 return call_ctype_wchar_do_is(this, first, last, dest);
3059 /* ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3060 /* ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3061 /* ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z */
3062 /* ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3063 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_is, 16)
3064 #if _MSVCP_VER <= 100
3065 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 12, \
3066 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3067 (this, mask, first, last))
3068 #else
3069 #define call_ctype_wchar_do_scan_is(this, mask, first, last) CALL_VTBL_FUNC(this, 20, \
3070 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3071 (this, mask, first, last))
3072 #endif
3073 const wchar_t* __thiscall ctype_wchar_do_scan_is(const ctype_wchar *this,
3074 short mask, const wchar_t *first, const wchar_t *last)
3076 TRACE("(%p %d %p %p)\n", this, mask, first, last);
3077 for(; first<last; first++)
3078 if(!ctype_wchar_is_ch(this, mask, *first))
3079 break;
3080 return first;
3083 /* ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3084 /* ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3085 /* ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z */
3086 /* ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3087 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_is, 16)
3088 const wchar_t* __thiscall ctype_wchar_scan_is(const ctype_wchar *this,
3089 short mask, const wchar_t *first, const wchar_t *last)
3091 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3092 return call_ctype_wchar_do_scan_is(this, mask, first, last);
3095 /* ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z */
3096 /* ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z */
3097 /* ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z */
3098 /* ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z */
3099 DEFINE_THISCALL_WRAPPER(ctype_wchar_do_scan_not, 16)
3100 #if _MSVCP_VER <= 100
3101 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 16, \
3102 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3103 (this, mask, first, last))
3104 #else
3105 #define call_ctype_wchar_do_scan_not(this, mask, first, last) CALL_VTBL_FUNC(this, 24, \
3106 const wchar_t*, (const ctype_wchar*, short, const wchar_t*, const wchar_t*), \
3107 (this, mask, first, last))
3108 #endif
3109 const wchar_t* __thiscall ctype_wchar_do_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 for(; first<last; first++)
3114 if(ctype_wchar_is_ch(this, mask, *first))
3115 break;
3116 return first;
3119 /* ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z */
3120 /* ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z */
3121 /* ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z */
3122 /* ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z */
3123 DEFINE_THISCALL_WRAPPER(ctype_wchar_scan_not, 16)
3124 const wchar_t* __thiscall ctype_wchar_scan_not(const ctype_wchar *this,
3125 short mask, const wchar_t *first, const wchar_t *last)
3127 TRACE("(%p %x %p %p)\n", this, mask, first, last);
3128 return call_ctype_wchar_do_scan_not(this, mask, first, last);
3131 /* ??_7codecvt_base@std@@6B@ */
3132 extern const vtable_ptr codecvt_base_vtable;
3134 /* ??0codecvt_base@std@@QAE@I@Z */
3135 /* ??0codecvt_base@std@@QEAA@_K@Z */
3136 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor_refs, 8)
3137 codecvt_base* __thiscall codecvt_base_ctor_refs(codecvt_base *this, size_t refs)
3139 TRACE("(%p %Iu)\n", this, refs);
3140 locale_facet_ctor_refs(&this->facet, refs);
3141 this->facet.vtable = &codecvt_base_vtable;
3142 return this;
3145 /* ??_Fcodecvt_base@std@@QAEXXZ */
3146 /* ??_Fcodecvt_base@std@@QEAAXXZ */
3147 DEFINE_THISCALL_WRAPPER(codecvt_base_ctor, 4)
3148 codecvt_base* __thiscall codecvt_base_ctor(codecvt_base *this)
3150 return codecvt_base_ctor_refs(this, 0);
3153 /* ??1codecvt_base@std@@UAE@XZ */
3154 /* ??1codecvt_base@std@@UEAA@XZ */
3155 DEFINE_THISCALL_WRAPPER(codecvt_base_dtor, 4)
3156 void __thiscall codecvt_base_dtor(codecvt_base *this)
3158 TRACE("(%p)\n", this);
3159 locale_facet_dtor(&this->facet);
3162 DEFINE_THISCALL_WRAPPER(codecvt_base_vector_dtor, 8)
3163 codecvt_base* __thiscall codecvt_base_vector_dtor(codecvt_base *this, unsigned int flags)
3165 TRACE("(%p %x)\n", this, flags);
3166 if(flags & 2) {
3167 /* we have an array, with the number of elements stored before the first object */
3168 INT_PTR i, *ptr = (INT_PTR *)this-1;
3170 for(i=*ptr-1; i>=0; i--)
3171 codecvt_base_dtor(this+i);
3172 MSVCRT_operator_delete(ptr);
3173 } else {
3174 codecvt_base_dtor(this);
3175 if(flags & 1)
3176 MSVCRT_operator_delete(this);
3179 return this;
3182 /* ?do_always_noconv@codecvt_base@std@@MBE_NXZ */
3183 /* ?do_always_noconv@codecvt_base@std@@MEBA_NXZ */
3184 #if _MSVCP_VER <= 100
3185 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 4, \
3186 bool, (const codecvt_base*), (this))
3187 #else
3188 #define call_codecvt_base_do_always_noconv(this) CALL_VTBL_FUNC(this, 12, \
3189 bool, (const codecvt_base*), (this))
3190 #endif
3191 DEFINE_THISCALL_WRAPPER(codecvt_base_do_always_noconv, 4)
3192 bool __thiscall codecvt_base_do_always_noconv(const codecvt_base *this)
3194 TRACE("(%p)\n", this);
3195 return _MSVCP_VER <= 100;
3198 /* ?always_noconv@codecvt_base@std@@QBE_NXZ */
3199 /* ?always_noconv@codecvt_base@std@@QEBA_NXZ */
3200 DEFINE_THISCALL_WRAPPER(codecvt_base_always_noconv, 4)
3201 bool __thiscall codecvt_base_always_noconv(const codecvt_base *this)
3203 TRACE("(%p)\n", this);
3204 return call_codecvt_base_do_always_noconv(this);
3207 /* ?do_max_length@codecvt_base@std@@MBEHXZ */
3208 /* ?do_max_length@codecvt_base@std@@MEBAHXZ */
3209 #if _MSVCP_VER <= 100
3210 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 8, \
3211 int, (const codecvt_base*), (this))
3212 #else
3213 #define call_codecvt_base_do_max_length(this) CALL_VTBL_FUNC(this, 16, \
3214 int, (const codecvt_base*), (this))
3215 #endif
3216 DEFINE_THISCALL_WRAPPER(codecvt_base_do_max_length, 4)
3217 int __thiscall codecvt_base_do_max_length(const codecvt_base *this)
3219 TRACE("(%p)\n", this);
3220 return 1;
3223 /* ?max_length@codecvt_base@std@@QBEHXZ */
3224 /* ?max_length@codecvt_base@std@@QEBAHXZ */
3225 DEFINE_THISCALL_WRAPPER(codecvt_base_max_length, 4)
3226 int __thiscall codecvt_base_max_length(const codecvt_base *this)
3228 TRACE("(%p)\n", this);
3229 return call_codecvt_base_do_max_length(this);
3232 /* ?do_encoding@codecvt_base@std@@MBEHXZ */
3233 /* ?do_encoding@codecvt_base@std@@MEBAHXZ */
3234 #if _MSVCP_VER <= 100
3235 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 12, \
3236 int, (const codecvt_base*), (this))
3237 #else
3238 #define call_codecvt_base_do_encoding(this) CALL_VTBL_FUNC(this, 20, \
3239 int, (const codecvt_base*), (this))
3240 #endif
3241 DEFINE_THISCALL_WRAPPER(codecvt_base_do_encoding, 4)
3242 int __thiscall codecvt_base_do_encoding(const codecvt_base *this)
3244 TRACE("(%p)\n", this);
3245 return 1;
3248 /* ?encoding@codecvt_base@std@@QBEHXZ */
3249 /* ?encoding@codecvt_base@std@@QEBAHXZ */
3250 DEFINE_THISCALL_WRAPPER(codecvt_base_encoding, 4)
3251 int __thiscall codecvt_base_encoding(const codecvt_base *this)
3253 TRACE("(%p)\n", this);
3254 return call_codecvt_base_do_encoding(this);
3257 /* ?id@?$codecvt@DDH@std@@2V0locale@2@A */
3258 locale_id codecvt_char_id = {0};
3260 /* ??_7?$codecvt@DDH@std@@6B@ */
3261 extern const vtable_ptr codecvt_char_vtable;
3263 /* ?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z */
3264 /* ?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3265 DEFINE_THISCALL_WRAPPER(codecvt_char__Init, 8)
3266 void __thiscall codecvt_char__Init(codecvt_char *this, const _Locinfo *locinfo)
3268 TRACE("(%p %p)\n", this, locinfo);
3271 /* ??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z */
3272 /* ??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3273 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_locinfo, 12)
3274 codecvt_char* __thiscall codecvt_char_ctor_locinfo(codecvt_char *this, const _Locinfo *locinfo, size_t refs)
3276 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3277 codecvt_base_ctor_refs(&this->base, refs);
3278 this->base.facet.vtable = &codecvt_char_vtable;
3279 return this;
3282 /* ??0?$codecvt@DDH@std@@QAE@I@Z */
3283 /* ??0?$codecvt@DDH@std@@QEAA@_K@Z */
3284 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor_refs, 8)
3285 codecvt_char* __thiscall codecvt_char_ctor_refs(codecvt_char *this, size_t refs)
3287 return codecvt_char_ctor_locinfo(this, NULL, refs);
3290 /* ??_F?$codecvt@DDH@std@@QAEXXZ */
3291 /* ??_F?$codecvt@DDH@std@@QEAAXXZ */
3292 DEFINE_THISCALL_WRAPPER(codecvt_char_ctor, 4)
3293 codecvt_char* __thiscall codecvt_char_ctor(codecvt_char *this)
3295 return codecvt_char_ctor_locinfo(this, NULL, 0);
3298 /* ??1?$codecvt@DDH@std@@UAE@XZ */
3299 /* ??1?$codecvt@DDH@std@@UEAA@XZ */
3300 /* ??1?$codecvt@DDH@std@@MAE@XZ */
3301 /* ??1?$codecvt@DDH@std@@MEAA@XZ */
3302 DEFINE_THISCALL_WRAPPER(codecvt_char_dtor, 4)
3303 void __thiscall codecvt_char_dtor(codecvt_char *this)
3305 TRACE("(%p)\n", this);
3306 codecvt_base_dtor(&this->base);
3309 DEFINE_THISCALL_WRAPPER(codecvt_char_vector_dtor, 8)
3310 codecvt_char* __thiscall codecvt_char_vector_dtor(codecvt_char *this, unsigned int flags)
3312 TRACE("(%p %x)\n", this, flags);
3313 if(flags & 2) {
3314 /* we have an array, with the number of elements stored before the first object */
3315 INT_PTR i, *ptr = (INT_PTR *)this-1;
3317 for(i=*ptr-1; i>=0; i--)
3318 codecvt_char_dtor(this+i);
3319 MSVCRT_operator_delete(ptr);
3320 } else {
3321 codecvt_char_dtor(this);
3322 if(flags & 1)
3323 MSVCRT_operator_delete(this);
3326 return this;
3329 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3330 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3331 size_t __cdecl codecvt_char__Getcat(const locale_facet **facet, const locale *loc)
3333 TRACE("(%p %p)\n", facet, loc);
3335 if(facet && !*facet) {
3336 *facet = MSVCRT_operator_new(sizeof(codecvt_char));
3337 if(!*facet) {
3338 ERR("Out of memory\n");
3339 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3340 return 0;
3342 codecvt_char_ctor((codecvt_char*)*facet);
3345 return LC_CTYPE;
3348 /* ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@@Z */
3349 /* ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3350 size_t __cdecl codecvt_char__Getcat_old(const locale_facet **facet)
3352 return codecvt_char__Getcat(facet, locale_classic());
3355 codecvt_char* codecvt_char_use_facet(const locale *loc)
3357 static codecvt_char *obj = NULL;
3359 _Lockit lock;
3360 const locale_facet *fac;
3362 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3363 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_char_id));
3364 if(fac) {
3365 _Lockit_dtor(&lock);
3366 return (codecvt_char*)fac;
3369 if(obj) {
3370 _Lockit_dtor(&lock);
3371 return obj;
3374 codecvt_char__Getcat(&fac, loc);
3375 obj = (codecvt_char*)fac;
3376 call_locale_facet__Incref(&obj->base.facet);
3377 locale_facet_register(&obj->base.facet);
3378 _Lockit_dtor(&lock);
3380 return obj;
3383 /* ?do_always_noconv@?$codecvt@DDH@std@@MBE_NXZ */
3384 /* ?do_always_noconv@?$codecvt@DDH@std@@MEBA_NXZ */
3385 DEFINE_THISCALL_WRAPPER(codecvt_char_do_always_noconv, 4)
3386 bool __thiscall codecvt_char_do_always_noconv(const codecvt_char *this)
3388 TRACE("(%p)\n", this);
3389 return TRUE;
3392 /* ?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3393 /* ?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3394 #if _MSVCP_VER <= 100
3395 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3396 CALL_VTBL_FUNC(this, 16, int, \
3397 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3398 (this, state, from, from_end, from_next, to, to_end, to_next))
3399 #else
3400 #define call_codecvt_char_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3401 CALL_VTBL_FUNC(this, 24, int, \
3402 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3403 (this, state, from, from_end, from_next, to, to_end, to_next))
3404 #endif
3405 DEFINE_THISCALL_WRAPPER(codecvt_char_do_in, 32)
3406 int __thiscall codecvt_char_do_in(const codecvt_char *this, _Mbstatet *state,
3407 const char *from, const char *from_end, const char **from_next,
3408 char *to, char *to_end, char **to_next)
3410 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3411 from_next, to, to_end, to_next);
3412 *from_next = from;
3413 *to_next = to;
3414 return CODECVT_noconv;
3417 /* ?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3418 /* ?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3419 DEFINE_THISCALL_WRAPPER(codecvt_char_in, 32)
3420 int __thiscall codecvt_char_in(const codecvt_char *this, _Mbstatet *state,
3421 const char *from, const char *from_end, const char **from_next,
3422 char *to, char *to_end, char **to_next)
3424 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3425 from_next, to, to_end, to_next);
3426 return call_codecvt_char_do_in(this, state, from, from_end, from_next,
3427 to, to_end, to_next);
3430 /* ?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3431 /* ?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3432 #if _MSVCP_VER <= 100
3433 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3434 CALL_VTBL_FUNC(this, 20, int, \
3435 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3436 (this, state, from, from_end, from_next, to, to_end, to_next))
3437 #else
3438 #define call_codecvt_char_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3439 CALL_VTBL_FUNC(this, 28, int, \
3440 (const codecvt_char*, _Mbstatet*, const char*, const char*, const char**, char*, char*, char**), \
3441 (this, state, from, from_end, from_next, to, to_end, to_next))
3442 #endif
3443 DEFINE_THISCALL_WRAPPER(codecvt_char_do_out, 32)
3444 int __thiscall codecvt_char_do_out(const codecvt_char *this, _Mbstatet *state,
3445 const char *from, const char *from_end, const char **from_next,
3446 char *to, char *to_end, char **to_next)
3448 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3449 from_end, from_next, to, to_end, to_next);
3450 *from_next = from;
3451 *to_next = to;
3452 return CODECVT_noconv;
3455 /* ?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z */
3456 /* ?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z */
3457 DEFINE_THISCALL_WRAPPER(codecvt_char_out, 32)
3458 int __thiscall codecvt_char_out(const codecvt_char *this, _Mbstatet *state,
3459 const char *from, const char *from_end, const char **from_next,
3460 char *to, char *to_end, char **to_next)
3462 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from, from_end,
3463 from_next, to, to_end, to_next);
3464 return call_codecvt_char_do_out(this, state, from, from_end, from_next,
3465 to, to_end, to_next);
3468 /* ?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z */
3469 /* ?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3470 #if _MSVCP_VER <= 100
3471 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3472 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3473 #else
3474 #define call_codecvt_char_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3475 int, (const codecvt_char*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3476 #endif
3477 DEFINE_THISCALL_WRAPPER(codecvt_char_do_unshift, 20)
3478 int __thiscall codecvt_char_do_unshift(const codecvt_char *this,
3479 _Mbstatet *state, char *to, char *to_end, char **to_next)
3481 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3482 *to_next = to;
3483 return CODECVT_noconv;
3486 /* ?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z */
3487 /* ?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3488 DEFINE_THISCALL_WRAPPER(codecvt_char_unshift, 20)
3489 int __thiscall codecvt_char_unshift(const codecvt_char *this,
3490 _Mbstatet *state, char *to, char *to_end, char **to_next)
3492 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3493 return call_codecvt_char_do_unshift(this, state, to, to_end, to_next);
3496 /* ?do_length@?$codecvt@DDH@std@@MBEHABHPBD1I@Z */
3497 /* ?do_length@?$codecvt@DDH@std@@MEBAHAEBHPEBD1_K@Z */
3498 #if _MSVCP_VER <= 100
3499 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3500 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, size_t), \
3501 (this, state, from, from_end, max))
3502 #else
3503 #define call_codecvt_char_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
3504 int, (const codecvt_char*, const _Mbstatet*, const char*, const char*, size_t), \
3505 (this, state, from, from_end, max))
3506 #endif
3507 DEFINE_THISCALL_WRAPPER(codecvt_char_do_length, 20)
3508 int __thiscall codecvt_char_do_length(const codecvt_char *this, const _Mbstatet *state,
3509 const char *from, const char *from_end, size_t max)
3511 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3512 return (from_end-from > max ? max : from_end-from);
3515 /* ?length@?$codecvt@DDH@std@@QBEHABHPBD1I@Z */
3516 /* ?length@?$codecvt@DDH@std@@QEBAHAEBHPEBD1_K@Z */
3517 DEFINE_THISCALL_WRAPPER(codecvt_char_length, 20)
3518 int __thiscall codecvt_char_length(const codecvt_char *this, const _Mbstatet *state,
3519 const char *from, const char *from_end, size_t max)
3521 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
3522 return call_codecvt_char_do_length(this, state, from, from_end, max);
3525 /* ?id@?$codecvt@_WDH@std@@2V0locale@2@A */
3526 locale_id codecvt_wchar_id = {0};
3527 /* ?id@?$codecvt@GDH@std@@2V0locale@2@A */
3528 locale_id codecvt_short_id = {0};
3530 /* ??_7?$codecvt@_WDH@std@@6B@ */
3531 extern const vtable_ptr codecvt_wchar_vtable;
3532 /* ??_7?$codecvt@GDH@std@@6B@ */
3533 extern const vtable_ptr codecvt_short_vtable;
3535 /* ?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z */
3536 /* ?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3537 /* ?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z */
3538 /* ?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z */
3539 DEFINE_THISCALL_WRAPPER(codecvt_wchar__Init, 8)
3540 void __thiscall codecvt_wchar__Init(codecvt_wchar *this, const _Locinfo *locinfo)
3542 TRACE("(%p %p)\n", this, locinfo);
3543 _Locinfo__Getcvt(locinfo, &this->cvt);
3546 /* ??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z */
3547 /* ??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3548 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_locinfo, 12)
3549 codecvt_wchar* __thiscall codecvt_wchar_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, size_t refs)
3551 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3553 codecvt_base_ctor_refs(&this->base, refs);
3554 this->base.facet.vtable = &codecvt_wchar_vtable;
3556 codecvt_wchar__Init(this, locinfo);
3557 return this;
3560 /* ??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z */
3561 /* ??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z */
3562 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_locinfo, 12)
3563 codecvt_wchar* __thiscall codecvt_short_ctor_locinfo(codecvt_wchar *this, const _Locinfo *locinfo, size_t refs)
3565 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
3567 codecvt_wchar_ctor_locinfo(this, locinfo, refs);
3568 this->base.facet.vtable = &codecvt_short_vtable;
3569 return this;
3572 /* ??0?$codecvt@_WDH@std@@QAE@I@Z */
3573 /* ??0?$codecvt@_WDH@std@@QEAA@_K@Z */
3574 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor_refs, 8)
3575 codecvt_wchar* __thiscall codecvt_wchar_ctor_refs(codecvt_wchar *this, size_t refs)
3577 _Locinfo locinfo;
3579 TRACE("(%p %Iu)\n", this, refs);
3581 _Locinfo_ctor(&locinfo);
3582 codecvt_wchar_ctor_locinfo(this, &locinfo, refs);
3583 _Locinfo_dtor(&locinfo);
3584 return this;
3587 /* ??0?$codecvt@GDH@std@@QAE@I@Z */
3588 /* ??0?$codecvt@GDH@std@@QEAA@_K@Z */
3589 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_refs, 8)
3590 codecvt_wchar* __thiscall codecvt_short_ctor_refs(codecvt_wchar *this, size_t refs)
3592 _Locinfo locinfo;
3594 TRACE("(%p %Iu)\n", this, refs);
3596 _Locinfo_ctor(&locinfo);
3597 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3598 _Locinfo_dtor(&locinfo);
3599 return this;
3602 /* ??0?$codecvt@GDH@std@@IAE@PBDI@Z */
3603 /* ??0?$codecvt@GDH@std@@IEAA@PEBD_K@Z */
3604 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_name, 12)
3605 codecvt_wchar* __thiscall codecvt_short_ctor_name(codecvt_wchar *this, const char *name, size_t refs)
3607 _Locinfo locinfo;
3609 TRACE("(%p %s %Iu)\n", this, name, refs);
3611 _Locinfo_ctor_cstr(&locinfo, name);
3612 codecvt_short_ctor_locinfo(this, &locinfo, refs);
3613 _Locinfo_dtor(&locinfo);
3614 return this;
3617 /* ??_F?$codecvt@_WDH@std@@QAEXXZ */
3618 /* ??_F?$codecvt@_WDH@std@@QEAAXXZ */
3619 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor, 4)
3620 codecvt_wchar* __thiscall codecvt_wchar_ctor(codecvt_wchar *this)
3622 return codecvt_wchar_ctor_refs(this, 0);
3625 /* ??_F?$codecvt@GDH@std@@QAEXXZ */
3626 /* ??_F?$codecvt@GDH@std@@QEAAXXZ */
3627 DEFINE_THISCALL_WRAPPER(codecvt_short_ctor, 4)
3628 codecvt_wchar* __thiscall codecvt_short_ctor(codecvt_wchar *this)
3630 return codecvt_short_ctor_refs(this, 0);
3633 /* ??1?$codecvt@GDH@std@@UAE@XZ */
3634 /* ??1?$codecvt@GDH@std@@UEAA@XZ */
3635 /* ??1?$codecvt@GDH@std@@MAE@XZ */
3636 /* ??1?$codecvt@GDH@std@@MEAA@XZ */
3637 /* ??1?$codecvt@_WDH@std@@MAE@XZ */
3638 /* ??1?$codecvt@_WDH@std@@MEAA@XZ */
3639 DEFINE_THISCALL_WRAPPER(codecvt_wchar_dtor, 4)
3640 void __thiscall codecvt_wchar_dtor(codecvt_wchar *this)
3642 TRACE("(%p)\n", this);
3643 codecvt_base_dtor(&this->base);
3646 DEFINE_THISCALL_WRAPPER(codecvt_wchar_vector_dtor, 8)
3647 codecvt_wchar* __thiscall codecvt_wchar_vector_dtor(codecvt_wchar *this, unsigned int flags)
3649 TRACE("(%p %x)\n", this, flags);
3650 if(flags & 2) {
3651 /* we have an array, with the number of elements stored before the first object */
3652 INT_PTR i, *ptr = (INT_PTR *)this-1;
3654 for(i=*ptr-1; i>=0; i--)
3655 codecvt_wchar_dtor(this+i);
3656 MSVCRT_operator_delete(ptr);
3657 } else {
3658 codecvt_wchar_dtor(this);
3659 if(flags & 1)
3660 MSVCRT_operator_delete(this);
3663 return this;
3666 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3667 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3668 size_t __cdecl codecvt_wchar__Getcat(const locale_facet **facet, const locale *loc)
3670 TRACE("(%p %p)\n", facet, loc);
3672 if(facet && !*facet) {
3673 _Locinfo locinfo;
3675 *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
3676 if(!*facet) {
3677 ERR("Out of memory\n");
3678 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3679 return 0;
3682 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3683 codecvt_wchar_ctor_locinfo((codecvt_wchar*)*facet, &locinfo, 0);
3684 _Locinfo_dtor(&locinfo);
3687 return LC_CTYPE;
3690 /* ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@@Z */
3691 /* ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3692 size_t __cdecl codecvt_wchar__Getcat_old(const locale_facet **facet)
3694 return codecvt_wchar__Getcat(facet, locale_classic());
3697 codecvt_wchar* codecvt_wchar_use_facet(const locale *loc)
3699 static codecvt_wchar *obj = NULL;
3701 _Lockit lock;
3702 const locale_facet *fac;
3704 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3705 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_wchar_id));
3706 if(fac) {
3707 _Lockit_dtor(&lock);
3708 return (codecvt_wchar*)fac;
3711 if(obj) {
3712 _Lockit_dtor(&lock);
3713 return obj;
3716 codecvt_wchar__Getcat(&fac, loc);
3717 obj = (codecvt_wchar*)fac;
3718 call_locale_facet__Incref(&obj->base.facet);
3719 locale_facet_register(&obj->base.facet);
3720 _Lockit_dtor(&lock);
3722 return obj;
3725 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
3726 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
3727 size_t __cdecl codecvt_short__Getcat(const locale_facet **facet, const locale *loc)
3729 TRACE("(%p %p)\n", facet, loc);
3731 if(facet && !*facet) {
3732 _Locinfo locinfo;
3734 *facet = MSVCRT_operator_new(sizeof(codecvt_wchar));
3735 if(!*facet) {
3736 ERR("Out of memory\n");
3737 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3738 return 0;
3741 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
3742 codecvt_short_ctor((codecvt_wchar*)*facet);
3743 _Locinfo_dtor(&locinfo);
3746 return LC_CTYPE;
3749 /* ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@@Z */
3750 /* ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@@Z */
3751 size_t __cdecl codecvt_short__Getcat_old(const locale_facet **facet)
3753 return codecvt_short__Getcat(facet, locale_classic());
3756 codecvt_wchar* codecvt_short_use_facet(const locale *loc)
3758 static codecvt_wchar *obj = NULL;
3760 _Lockit lock;
3761 const locale_facet *fac;
3763 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
3764 fac = locale__Getfacet(loc, locale_id_operator_size_t(&codecvt_short_id));
3765 if(fac) {
3766 _Lockit_dtor(&lock);
3767 return (codecvt_wchar*)fac;
3770 if(obj) {
3771 _Lockit_dtor(&lock);
3772 return obj;
3775 codecvt_short__Getcat(&fac, loc);
3776 obj = (codecvt_wchar*)fac;
3777 call_locale_facet__Incref(&obj->base.facet);
3778 locale_facet_register(&obj->base.facet);
3779 _Lockit_dtor(&lock);
3781 return obj;
3784 /* ?_Id_func@?$codecvt@_WDH@std@@SAAAVid@locale@2@XZ */
3785 /* ?_Id_func@?$codecvt@_WDH@std@@SAAEAVid@locale@2@XZ */
3786 locale_id* __cdecl codecvt_wchar__Id_func(void)
3788 TRACE("()\n");
3789 return &codecvt_wchar_id;
3792 /* ?_Id_func@?$codecvt@GDH@std@@SAAAVid@locale@2@XZ */
3793 /* ?_Id_func@?$codecvt@GDH@std@@SAAEAVid@locale@2@XZ */
3794 locale_id* __cdecl codecvt_short__Id_func(void)
3796 TRACE("()\n");
3797 return &codecvt_short_id;
3800 /* ?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ */
3801 /* ?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ */
3802 /* ?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ */
3803 /* ?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ */
3804 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_always_noconv, 4)
3805 bool __thiscall codecvt_wchar_do_always_noconv(const codecvt_wchar *this)
3807 TRACE("(%p)\n", this);
3808 return FALSE;
3811 /* ?do_max_length@?$codecvt@GDH@std@@MBEHXZ */
3812 /* ?do_max_length@?$codecvt@GDH@std@@MEBAHXZ */
3813 /* ?do_max_length@?$codecvt@_WDH@std@@MBEHXZ */
3814 /* ?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ */
3815 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_max_length, 4)
3816 int __thiscall codecvt_wchar_do_max_length(const codecvt_wchar *this)
3818 TRACE("(%p)\n", this);
3819 return MB_LEN_MAX;
3822 /* ?do_encoding@?$codecvt@GDH@std@@MBEHXZ */
3823 /* ?do_encoding@?$codecvt@GDH@std@@MEBAHXZ */
3824 /* ?do_encoding@?$codecvt@_WDH@std@@MBEHXZ */
3825 /* ?do_encoding@?$codecvt@_WDH@std@@MEBAHXZ */
3826 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_encoding, 4)
3827 int __thiscall codecvt_wchar_do_encoding(const codecvt_wchar *this)
3829 TRACE("(%p)\n", this);
3830 return 0;
3833 /* ?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3834 /* ?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3835 /* ?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3836 /* ?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3837 #if _MSVCP_VER <= 100
3838 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3839 CALL_VTBL_FUNC(this, 16, int, \
3840 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3841 (this, state, from, from_end, from_next, to, to_end, to_next))
3842 #else
3843 #define call_codecvt_wchar_do_in(this, state, from, from_end, from_next, to, to_end, to_next) \
3844 CALL_VTBL_FUNC(this, 24, int, \
3845 (const codecvt_wchar*, _Mbstatet*, const char*, const char*, const char**, wchar_t*, wchar_t*, wchar_t**), \
3846 (this, state, from, from_end, from_next, to, to_end, to_next))
3847 #endif
3848 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_in, 32)
3849 int __thiscall codecvt_wchar_do_in(const codecvt_wchar *this, _Mbstatet *state,
3850 const char *from, const char *from_end, const char **from_next,
3851 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3853 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3854 from_end, from_next, to, to_end, to_next);
3856 *from_next = from;
3857 *to_next = to;
3859 while(*from_next!=from_end && *to_next!=to_end) {
3860 switch(_Mbrtowc(*to_next, *from_next, from_end-*from_next, state, &this->cvt)) {
3861 case -2:
3862 *from_next = from_end;
3863 return CODECVT_partial;
3864 case -1:
3865 return CODECVT_error;
3866 case 2:
3867 (*from_next)++;
3868 /* fall through */
3869 case 0:
3870 case 1:
3871 (*from_next)++;
3872 (*to_next)++;
3876 return CODECVT_ok;
3879 /* ?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z */
3880 /* ?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z */
3881 /* ?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z */
3882 /* ?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z */
3883 DEFINE_THISCALL_WRAPPER(codecvt_wchar_in, 32)
3884 int __thiscall codecvt_wchar_in(const codecvt_wchar *this, _Mbstatet *state,
3885 const char *from, const char *from_end, const char **from_next,
3886 wchar_t *to, wchar_t *to_end, wchar_t **to_next)
3888 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3889 from_end, from_next, to, to_end, to_next);
3890 return call_codecvt_wchar_do_in(this, state, from,
3891 from_end, from_next, to, to_end, to_next);
3894 /* ?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3895 /* ?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3896 /* ?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3897 /* ?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3898 #if _MSVCP_VER <= 100
3899 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3900 CALL_VTBL_FUNC(this, 20, int, \
3901 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3902 (this, state, from, from_end, from_next, to, to_end, to_next))
3903 #else
3904 #define call_codecvt_wchar_do_out(this, state, from, from_end, from_next, to, to_end, to_next) \
3905 CALL_VTBL_FUNC(this, 28, int, \
3906 (const codecvt_wchar*, _Mbstatet*, const wchar_t*, const wchar_t*, const wchar_t**, char*, char*, char**), \
3907 (this, state, from, from_end, from_next, to, to_end, to_next))
3908 #endif
3909 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_out, 32)
3910 int __thiscall codecvt_wchar_do_out(const codecvt_wchar *this, _Mbstatet *state,
3911 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3912 char *to, char *to_end, char **to_next)
3914 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3915 from_end, from_next, to, to_end, to_next);
3917 *from_next = from;
3918 *to_next = to;
3920 while(*from_next!=from_end && *to_next!=to_end) {
3921 _Mbstatet old_state = *state;
3922 int size;
3923 char buf[MB_LEN_MAX];
3925 switch((size = _Wcrtomb(buf, **from_next, state, &this->cvt))) {
3926 case -1:
3927 return CODECVT_error;
3928 default:
3929 if(size > from_end-*from_next) {
3930 *state = old_state;
3931 return CODECVT_partial;
3934 (*from_next)++;
3935 memcpy_s(*to_next, to_end-*to_next, buf, size);
3936 (*to_next) += size;
3940 return CODECVT_ok;
3943 /* ?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z */
3944 /* ?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z */
3945 /* ?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z */
3946 /* ?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z */
3947 DEFINE_THISCALL_WRAPPER(codecvt_wchar_out, 32)
3948 int __thiscall codecvt_wchar_out(const codecvt_wchar *this, _Mbstatet *state,
3949 const wchar_t *from, const wchar_t *from_end, const wchar_t **from_next,
3950 char *to, char *to_end, char **to_next)
3952 TRACE("(%p %p %p %p %p %p %p %p)\n", this, state, from,
3953 from_end, from_next, to, to_end, to_next);
3954 return call_codecvt_wchar_do_out(this, state, from,
3955 from_end, from_next, to, to_end, to_next);
3958 /* ?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z */
3959 /* ?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3960 /* ?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z */
3961 /* ?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z */
3962 #if _MSVCP_VER <= 100
3963 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 24, \
3964 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3965 #else
3966 #define call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next) CALL_VTBL_FUNC(this, 32, \
3967 int, (const codecvt_wchar*, _Mbstatet*, char*, char*, char**), (this, state, to, to_end, to_next))
3968 #endif
3969 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_unshift, 20)
3970 int __thiscall codecvt_wchar_do_unshift(const codecvt_wchar *this,
3971 _Mbstatet *state, char *to, char *to_end, char **to_next)
3973 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3974 if(MBSTATET_TO_INT(state))
3975 WARN("unexpected state: %x\n", MBSTATET_TO_INT(state));
3977 *to_next = to;
3978 return CODECVT_ok;
3981 /* ?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z */
3982 /* ?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3983 /* ?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z */
3984 /* ?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z */
3985 DEFINE_THISCALL_WRAPPER(codecvt_wchar_unshift, 20)
3986 int __thiscall codecvt_wchar_unshift(const codecvt_wchar *this,
3987 _Mbstatet *state, char *to, char *to_end, char **to_next)
3989 TRACE("(%p %p %p %p %p)\n", this, state, to, to_end, to_next);
3990 return call_codecvt_wchar_do_unshift(this, state, to, to_end, to_next);
3993 /* ?do_length@?$codecvt@GDH@std@@MBEHABHPBD1I@Z */
3994 /* ?do_length@?$codecvt@GDH@std@@MEBAHAEBHPEBD1_K@Z */
3995 /* ?do_length@?$codecvt@_WDH@std@@MBEHABHPBD1I@Z */
3996 /* ?do_length@?$codecvt@_WDH@std@@MEBAHAEBHPEBD1_K@Z */
3997 #if _MSVCP_VER <= 100
3998 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 28, \
3999 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, size_t), \
4000 (this, state, from, from_end, max))
4001 #else
4002 #define call_codecvt_wchar_do_length(this, state, from, from_end, max) CALL_VTBL_FUNC(this, 36, \
4003 int, (const codecvt_wchar*, const _Mbstatet*, const char*, const char*, size_t), \
4004 (this, state, from, from_end, max))
4005 #endif
4006 DEFINE_THISCALL_WRAPPER(codecvt_wchar_do_length, 20)
4007 int __thiscall codecvt_wchar_do_length(const codecvt_wchar *this, const _Mbstatet *state,
4008 const char *from, const char *from_end, size_t max)
4010 _Mbstatet tmp_state = *state;
4011 int ret=0;
4013 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
4015 while(ret<max && from!=from_end) {
4016 switch(_Mbrtowc(NULL, from, from_end-from, &tmp_state, &this->cvt)) {
4017 case -2:
4018 case -1:
4019 return ret;
4020 case 2:
4021 from++;
4022 /* fall through */
4023 case 0:
4024 case 1:
4025 from++;
4026 ret++;
4030 return ret;
4033 /* ?length@?$codecvt@GDH@std@@QBEHABHPBD1I@Z */
4034 /* ?length@?$codecvt@GDH@std@@QEBAHAEBHPEBD1_K@Z */
4035 /* ?length@?$codecvt@_WDH@std@@QBEHABHPBD1I@Z */
4036 /* ?length@?$codecvt@_WDH@std@@QEBAHAEBHPEBD1_K@Z */
4037 DEFINE_THISCALL_WRAPPER(codecvt_wchar_length, 20)
4038 int __thiscall codecvt_wchar_length(const codecvt_wchar *this, const _Mbstatet *state,
4039 const char *from, const char *from_end, size_t max)
4041 TRACE("(%p %p %p %p %Iu)\n", this, state, from, from_end, max);
4042 return call_codecvt_wchar_do_length(this, state, from, from_end, max);
4045 /* ?id@?$numpunct@D@std@@2V0locale@2@A */
4046 locale_id numpunct_char_id = {0};
4048 /* ??_7?$numpunct@D@std@@6B@ */
4049 extern const vtable_ptr numpunct_char_vtable;
4051 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
4052 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4053 DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
4054 void __thiscall numpunct_char__Init(numpunct_char *this, const _Locinfo *locinfo, bool isdef)
4056 int len;
4058 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4060 len = strlen(_Locinfo__Getfalse(locinfo))+1;
4061 this->false_name = MSVCRT_operator_new(len);
4062 if(this->false_name)
4063 memcpy((char*)this->false_name, _Locinfo__Getfalse(locinfo), len);
4065 len = strlen(_Locinfo__Gettrue(locinfo))+1;
4066 this->true_name = MSVCRT_operator_new(len);
4067 if(this->true_name)
4068 memcpy((char*)this->true_name, _Locinfo__Gettrue(locinfo), len);
4070 if(isdef) {
4071 this->grouping = MSVCRT_operator_new(1);
4072 if(this->grouping)
4073 *(char*)this->grouping = 0;
4075 this->dp = '.';
4076 this->sep = ',';
4077 } else {
4078 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4080 len = strlen(lc->grouping)+1;
4081 this->grouping = MSVCRT_operator_new(len);
4082 if(this->grouping)
4083 memcpy((char*)this->grouping, lc->grouping, len);
4085 this->dp = lc->decimal_point[0];
4086 this->sep = lc->thousands_sep[0];
4089 if(!this->false_name || !this->true_name || !this->grouping) {
4090 MSVCRT_operator_delete((char*)this->grouping);
4091 MSVCRT_operator_delete((char*)this->false_name);
4092 MSVCRT_operator_delete((char*)this->true_name);
4094 ERR("Out of memory\n");
4095 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4099 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
4100 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
4101 DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
4102 void __thiscall numpunct_char__Tidy(numpunct_char *this)
4104 TRACE("(%p)\n", this);
4106 MSVCRT_operator_delete((char*)this->grouping);
4107 MSVCRT_operator_delete((char*)this->false_name);
4108 MSVCRT_operator_delete((char*)this->true_name);
4111 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
4112 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4113 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
4114 numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
4115 const _Locinfo *locinfo, size_t refs, bool usedef)
4117 TRACE("(%p %p %Iu %d)\n", this, locinfo, refs, usedef);
4118 locale_facet_ctor_refs(&this->facet, refs);
4119 this->facet.vtable = &numpunct_char_vtable;
4120 numpunct_char__Init(this, locinfo, usedef);
4121 return this;
4124 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
4125 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
4126 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
4127 numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
4128 const char *name, size_t refs, bool usedef)
4130 _Locinfo locinfo;
4132 TRACE("(%p %s %Iu %d)\n", this, debugstr_a(name), refs, usedef);
4133 locale_facet_ctor_refs(&this->facet, refs);
4134 this->facet.vtable = &numpunct_char_vtable;
4136 _Locinfo_ctor_cstr(&locinfo, name);
4137 numpunct_char__Init(this, &locinfo, usedef);
4138 _Locinfo_dtor(&locinfo);
4139 return this;
4142 /* ??0?$numpunct@D@std@@QAE@I@Z */
4143 /* ??0?$numpunct@D@std@@QEAA@_K@Z */
4144 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
4145 numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, size_t refs)
4147 TRACE("(%p %Iu)\n", this, refs);
4148 return numpunct_char_ctor_name(this, "C", refs, FALSE);
4151 /* ??_F?$numpunct@D@std@@QAEXXZ */
4152 /* ??_F?$numpunct@D@std@@QEAAXXZ */
4153 DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
4154 numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
4156 return numpunct_char_ctor_refs(this, 0);
4159 /* ??1?$numpunct@D@std@@UAE@XZ */
4160 /* ??1?$numpunct@D@std@@UEAA@XZ */
4161 /* ??1?$numpunct@D@std@@MAE@XZ */
4162 /* ??1?$numpunct@D@std@@MEAA@XZ */
4163 DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
4164 void __thiscall numpunct_char_dtor(numpunct_char *this)
4166 TRACE("(%p)\n", this);
4167 numpunct_char__Tidy(this);
4170 DEFINE_THISCALL_WRAPPER(numpunct_char_vector_dtor, 8)
4171 numpunct_char* __thiscall numpunct_char_vector_dtor(numpunct_char *this, unsigned int flags)
4173 TRACE("(%p %x)\n", this, flags);
4174 if(flags & 2) {
4175 /* we have an array, with the number of elements stored before the first object */
4176 INT_PTR i, *ptr = (INT_PTR *)this-1;
4178 for(i=*ptr-1; i>=0; i--)
4179 numpunct_char_dtor(this+i);
4180 MSVCRT_operator_delete(ptr);
4181 } else {
4182 numpunct_char_dtor(this);
4183 if(flags & 1)
4184 MSVCRT_operator_delete(this);
4187 return this;
4190 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4191 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4192 size_t __cdecl numpunct_char__Getcat(const locale_facet **facet, const locale *loc)
4194 TRACE("(%p %p)\n", facet, loc);
4196 if(facet && !*facet) {
4197 *facet = MSVCRT_operator_new(sizeof(numpunct_char));
4198 if(!*facet) {
4199 ERR("Out of memory\n");
4200 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4201 return 0;
4203 numpunct_char_ctor_name((numpunct_char*)*facet,
4204 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4207 return LC_NUMERIC;
4210 /* ?_Getcat@?$numpunct@D@std@@SAIPAPBVfacet@locale@2@@Z */
4211 /* ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4212 size_t __cdecl numpunct_char__Getcat_old(const locale_facet **facet)
4214 return numpunct_char__Getcat(facet, locale_classic());
4217 static numpunct_char* numpunct_char_use_facet(const locale *loc)
4219 static numpunct_char *obj = NULL;
4221 _Lockit lock;
4222 const locale_facet *fac;
4224 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4225 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_char_id));
4226 if(fac) {
4227 _Lockit_dtor(&lock);
4228 return (numpunct_char*)fac;
4231 if(obj) {
4232 _Lockit_dtor(&lock);
4233 return obj;
4236 numpunct_char__Getcat(&fac, loc);
4237 obj = (numpunct_char*)fac;
4238 call_locale_facet__Incref(&obj->facet);
4239 locale_facet_register(&obj->facet);
4240 _Lockit_dtor(&lock);
4242 return obj;
4245 /* ?do_decimal_point@?$numpunct@D@std@@MBEDXZ */
4246 /* ?do_decimal_point@?$numpunct@D@std@@MEBADXZ */
4247 DEFINE_THISCALL_WRAPPER(numpunct_char_do_decimal_point, 4)
4248 #if _MSVCP_VER <= 100
4249 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4250 char, (const numpunct_char *this), (this))
4251 #else
4252 #define call_numpunct_char_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4253 char, (const numpunct_char *this), (this))
4254 #endif
4255 char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
4257 TRACE("(%p)\n", this);
4258 return this->dp;
4261 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
4262 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
4263 DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
4264 char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
4266 TRACE("(%p)\n", this);
4267 return call_numpunct_char_do_decimal_point(this);
4270 /* ?do_thousands_sep@?$numpunct@D@std@@MBEDXZ */
4271 /* ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ */
4272 DEFINE_THISCALL_WRAPPER(numpunct_char_do_thousands_sep, 4)
4273 #if _MSVCP_VER <= 100
4274 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4275 char, (const numpunct_char*), (this))
4276 #else
4277 #define call_numpunct_char_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4278 char, (const numpunct_char*), (this))
4279 #endif
4280 char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
4282 TRACE("(%p)\n", this);
4283 return this->sep;
4286 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
4287 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
4288 DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
4289 char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
4291 TRACE("(%p)\n", this);
4292 return call_numpunct_char_do_thousands_sep(this);
4295 /* ?do_grouping@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4296 /* ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4297 DEFINE_THISCALL_WRAPPER(numpunct_char_do_grouping, 8)
4298 #if _MSVCP_VER <= 100
4299 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4300 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4301 #else
4302 #define call_numpunct_char_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4303 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4304 #endif
4305 basic_string_char* __thiscall numpunct_char_do_grouping(
4306 const numpunct_char *this, basic_string_char *ret)
4308 TRACE("(%p)\n", this);
4309 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4312 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4313 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4314 DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
4315 basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
4317 TRACE("(%p)\n", this);
4318 return call_numpunct_char_do_grouping(this, ret);
4321 /* ?do_falsename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4322 /* ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4323 DEFINE_THISCALL_WRAPPER(numpunct_char_do_falsename, 8)
4324 #if _MSVCP_VER <= 100
4325 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4326 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4327 #else
4328 #define call_numpunct_char_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4329 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4330 #endif
4331 basic_string_char* __thiscall numpunct_char_do_falsename(
4332 const numpunct_char *this, basic_string_char *ret)
4334 TRACE("(%p)\n", this);
4335 return MSVCP_basic_string_char_ctor_cstr(ret, this->false_name);
4338 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4339 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4340 DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
4341 basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
4343 TRACE("(%p)\n", this);
4344 return call_numpunct_char_do_falsename(this, ret);
4347 /* ?do_truename@?$numpunct@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4348 /* ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4349 DEFINE_THISCALL_WRAPPER(numpunct_char_do_truename, 8)
4350 #if _MSVCP_VER <= 100
4351 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4352 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4353 #else
4354 #define call_numpunct_char_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4355 basic_string_char*, (const numpunct_char*, basic_string_char*), (this, ret))
4356 #endif
4357 basic_string_char* __thiscall numpunct_char_do_truename(
4358 const numpunct_char *this, basic_string_char *ret)
4360 TRACE("(%p)\n", this);
4361 return MSVCP_basic_string_char_ctor_cstr(ret, this->true_name);
4364 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4365 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4366 DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
4367 basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
4369 TRACE("(%p)\n", this);
4370 return call_numpunct_char_do_truename(this, ret);
4373 /* ?id@?$numpunct@_W@std@@2V0locale@2@A */
4374 locale_id numpunct_wchar_id = {0};
4375 /* ?id@?$numpunct@G@std@@2V0locale@2@A */
4376 locale_id numpunct_short_id = {0};
4378 /* ??_7?$numpunct@_W@std@@6B@ */
4379 extern const vtable_ptr numpunct_wchar_vtable;
4380 /* ??_7?$numpunct@G@std@@6B@ */
4381 extern const vtable_ptr numpunct_short_vtable;
4383 /* ?_Init@?$numpunct@_W@std@@IAEXABV_Locinfo@2@_N@Z */
4384 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4385 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
4386 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
4387 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
4388 void __thiscall numpunct_wchar__Init(numpunct_wchar *this,
4389 const _Locinfo *locinfo, bool isdef)
4391 const char *to_convert;
4392 _Cvtvec cvt;
4393 int len;
4395 TRACE("(%p %p %d)\n", this, locinfo, isdef);
4397 _Locinfo__Getcvt(locinfo, &cvt);
4399 to_convert = _Locinfo__Getfalse(locinfo);
4400 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4401 this->false_name = MSVCRT_operator_new(len*sizeof(WCHAR));
4402 if(this->false_name)
4403 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4404 (wchar_t*)this->false_name, len);
4406 to_convert = _Locinfo__Gettrue(locinfo);
4407 len = MultiByteToWideChar(cvt.page, 0, to_convert, -1, NULL, 0);
4408 this->true_name = MSVCRT_operator_new(len*sizeof(WCHAR));
4409 if(this->true_name)
4410 MultiByteToWideChar(cvt.page, 0, to_convert, -1,
4411 (wchar_t*)this->true_name, len);
4413 if(isdef) {
4414 this->grouping = MSVCRT_operator_new(1);
4415 if(this->grouping)
4416 *(char*)this->grouping = 0;
4418 this->dp = '.';
4419 this->sep = ',';
4420 } else {
4421 const struct lconv *lc = _Locinfo__Getlconv(locinfo);
4423 len = strlen(lc->grouping)+1;
4424 this->grouping = MSVCRT_operator_new(len);
4425 if(this->grouping)
4426 memcpy((char*)this->grouping, lc->grouping, len);
4428 this->dp = mb_to_wc(lc->decimal_point[0], &cvt);
4429 this->sep = mb_to_wc(lc->thousands_sep[0], &cvt);
4432 if(!this->false_name || !this->true_name || !this->grouping) {
4433 MSVCRT_operator_delete((char*)this->grouping);
4434 MSVCRT_operator_delete((wchar_t*)this->false_name);
4435 MSVCRT_operator_delete((wchar_t*)this->true_name);
4437 ERR("Out of memory\n");
4438 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4442 /* ?_Tidy@?$numpunct@_W@std@@AAEXXZ */
4443 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
4444 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
4445 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
4446 DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
4447 void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
4449 TRACE("(%p)\n", this);
4451 MSVCRT_operator_delete((char*)this->grouping);
4452 MSVCRT_operator_delete((wchar_t*)this->false_name);
4453 MSVCRT_operator_delete((wchar_t*)this->true_name);
4456 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
4457 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4458 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
4459 numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
4460 const _Locinfo *locinfo, size_t refs, bool usedef)
4462 TRACE("(%p %p %Iu %d)\n", this, locinfo, refs, usedef);
4463 locale_facet_ctor_refs(&this->facet, refs);
4464 this->facet.vtable = &numpunct_wchar_vtable;
4465 numpunct_wchar__Init(this, locinfo, usedef);
4466 return this;
4469 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
4470 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
4471 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
4472 numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
4473 const _Locinfo *locinfo, size_t refs, bool usedef)
4475 numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
4476 this->facet.vtable = &numpunct_short_vtable;
4477 return this;
4480 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
4481 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
4482 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
4483 numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
4484 const char *name, size_t refs, bool usedef)
4486 _Locinfo locinfo;
4488 TRACE("(%p %s %Iu %d)\n", this, debugstr_a(name), refs, usedef);
4489 locale_facet_ctor_refs(&this->facet, refs);
4490 this->facet.vtable = &numpunct_wchar_vtable;
4492 _Locinfo_ctor_cstr(&locinfo, name);
4493 numpunct_wchar__Init(this, &locinfo, usedef);
4494 _Locinfo_dtor(&locinfo);
4495 return this;
4498 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
4499 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
4500 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
4501 numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
4502 const char *name, size_t refs, bool usedef)
4504 numpunct_wchar_ctor_name(this, name, refs, usedef);
4505 this->facet.vtable = &numpunct_short_vtable;
4506 return this;
4509 /* ??0?$numpunct@_W@std@@QAE@I@Z */
4510 /* ??0?$numpunct@_W@std@@QEAA@_K@Z */
4511 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
4512 numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, size_t refs)
4514 TRACE("(%p %Iu)\n", this, refs);
4515 return numpunct_wchar_ctor_name(this, "C", refs, FALSE);
4518 /* ??0?$numpunct@G@std@@QAE@I@Z */
4519 /* ??0?$numpunct@G@std@@QEAA@_K@Z */
4520 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
4521 numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, size_t refs)
4523 numpunct_wchar_ctor_refs(this, refs);
4524 this->facet.vtable = &numpunct_short_vtable;
4525 return this;
4528 /* ??_F?$numpunct@_W@std@@QAEXXZ */
4529 /* ??_F?$numpunct@_W@std@@QEAAXXZ */
4530 DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
4531 numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
4533 return numpunct_wchar_ctor_refs(this, 0);
4536 /* ??_F?$numpunct@G@std@@QAEXXZ */
4537 /* ??_F?$numpunct@G@std@@QEAAXXZ */
4538 DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
4539 numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
4541 return numpunct_short_ctor_refs(this, 0);
4544 /* ??1?$numpunct@G@std@@UAE@XZ */
4545 /* ??1?$numpunct@G@std@@UEAA@XZ */
4546 /* ??1?$numpunct@_W@std@@MAE@XZ */
4547 /* ??1?$numpunct@_W@std@@MEAA@XZ */
4548 /* ??1?$numpunct@G@std@@MAE@XZ */
4549 /* ??1?$numpunct@G@std@@MEAA@XZ */
4550 DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
4551 void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
4553 TRACE("(%p)\n", this);
4554 numpunct_wchar__Tidy(this);
4557 DEFINE_THISCALL_WRAPPER(numpunct_wchar_vector_dtor, 8)
4558 numpunct_wchar* __thiscall numpunct_wchar_vector_dtor(numpunct_wchar *this, unsigned int flags)
4560 TRACE("(%p %x)\n", this, flags);
4561 if(flags & 2) {
4562 /* we have an array, with the number of elements stored before the first object */
4563 INT_PTR i, *ptr = (INT_PTR *)this-1;
4565 for(i=*ptr-1; i>=0; i--)
4566 numpunct_wchar_dtor(this+i);
4567 MSVCRT_operator_delete(ptr);
4568 } else {
4569 numpunct_wchar_dtor(this);
4570 if(flags & 1)
4571 MSVCRT_operator_delete(this);
4574 return this;
4577 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4578 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4579 size_t __cdecl numpunct_wchar__Getcat(const locale_facet **facet, const locale *loc)
4581 TRACE("(%p %p)\n", facet, loc);
4583 if(facet && !*facet) {
4584 *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
4585 if(!*facet) {
4586 ERR("Out of memory\n");
4587 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4588 return 0;
4590 numpunct_wchar_ctor_name((numpunct_wchar*)*facet,
4591 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4594 return LC_NUMERIC;
4597 /* ?_Getcat@?$numpunct@_W@std@@SAIPAPBVfacet@locale@2@@Z */
4598 /* ?_Getcat@?$numpunct@_W@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4599 size_t __cdecl numpunct_wchar__Getcat_old(const locale_facet **facet)
4601 return numpunct_wchar__Getcat(facet, locale_classic());
4604 static numpunct_wchar* numpunct_wchar_use_facet(const locale *loc)
4606 static numpunct_wchar *obj = NULL;
4608 _Lockit lock;
4609 const locale_facet *fac;
4611 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4612 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_wchar_id));
4613 if(fac) {
4614 _Lockit_dtor(&lock);
4615 return (numpunct_wchar*)fac;
4618 if(obj) {
4619 _Lockit_dtor(&lock);
4620 return obj;
4623 numpunct_wchar__Getcat(&fac, loc);
4624 obj = (numpunct_wchar*)fac;
4625 call_locale_facet__Incref(&obj->facet);
4626 locale_facet_register(&obj->facet);
4627 _Lockit_dtor(&lock);
4629 return obj;
4632 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
4633 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
4634 size_t __cdecl numpunct_short__Getcat(const locale_facet **facet, const locale *loc)
4636 TRACE("(%p %p)\n", facet, loc);
4638 if(facet && !*facet) {
4639 *facet = MSVCRT_operator_new(sizeof(numpunct_wchar));
4640 if(!*facet) {
4641 ERR("Out of memory\n");
4642 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
4643 return 0;
4645 numpunct_short_ctor_name((numpunct_wchar*)*facet,
4646 locale_string_char_c_str(&loc->ptr->name), 0, TRUE);
4649 return LC_NUMERIC;
4652 /* ?_Getcat@?$numpunct@G@std@@SAIPAPBVfacet@locale@2@@Z */
4653 /* ?_Getcat@?$numpunct@G@std@@SA_KPEAPEBVfacet@locale@2@@Z */
4654 size_t __cdecl numpunct_short__Getcat_old(const locale_facet **facet)
4656 return numpunct_short__Getcat(facet, locale_classic());
4659 static numpunct_wchar* numpunct_short_use_facet(const locale *loc)
4661 static numpunct_wchar *obj = NULL;
4663 _Lockit lock;
4664 const locale_facet *fac;
4666 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
4667 fac = locale__Getfacet(loc, locale_id_operator_size_t(&numpunct_short_id));
4668 if(fac) {
4669 _Lockit_dtor(&lock);
4670 return (numpunct_wchar*)fac;
4673 if(obj) {
4674 _Lockit_dtor(&lock);
4675 return obj;
4678 numpunct_short__Getcat(&fac, loc);
4679 obj = (numpunct_wchar*)fac;
4680 call_locale_facet__Incref(&obj->facet);
4681 locale_facet_register(&obj->facet);
4682 _Lockit_dtor(&lock);
4684 return obj;
4687 /* ?do_decimal_point@?$numpunct@_W@std@@MBE_WXZ */
4688 /* ?do_decimal_point@?$numpunct@_W@std@@MEBA_WXZ */
4689 /* ?do_decimal_point@?$numpunct@G@std@@MBEGXZ */
4690 /* ?do_decimal_point@?$numpunct@G@std@@MEBAGXZ */
4691 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_decimal_point, 4)
4692 #if _MSVCP_VER <= 100
4693 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 4, \
4694 wchar_t, (const numpunct_wchar *this), (this))
4695 #else
4696 #define call_numpunct_wchar_do_decimal_point(this) CALL_VTBL_FUNC(this, 12, \
4697 wchar_t, (const numpunct_wchar *this), (this))
4698 #endif
4699 wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
4701 TRACE("(%p)\n", this);
4702 return this->dp;
4705 /* ?decimal_point@?$numpunct@_W@std@@QBE_WXZ */
4706 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
4707 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
4708 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
4709 DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
4710 wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
4712 TRACE("(%p)\n", this);
4713 return call_numpunct_wchar_do_decimal_point(this);
4716 /* ?do_thousands_sep@?$numpunct@_W@std@@MBE_WXZ */
4717 /* ?do_thousands_sep@?$numpunct@_W@std@@MEBA_WXZ */
4718 /* ?do_thousands_sep@?$numpunct@G@std@@MBEGXZ */
4719 /* ?do_thousands_sep@?$numpunct@G@std@@MEBAGXZ */
4720 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_thousands_sep, 4)
4721 #if _MSVCP_VER <= 100
4722 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 8, \
4723 wchar_t, (const numpunct_wchar *this), (this))
4724 #else
4725 #define call_numpunct_wchar_do_thousands_sep(this) CALL_VTBL_FUNC(this, 16, \
4726 wchar_t, (const numpunct_wchar *this), (this))
4727 #endif
4728 wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
4730 TRACE("(%p)\n", this);
4731 return this->sep;
4734 /* ?thousands_sep@?$numpunct@_W@std@@QBE_WXZ */
4735 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
4736 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
4737 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
4738 DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
4739 wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
4741 TRACE("(%p)\n", this);
4742 return call_numpunct_wchar_do_thousands_sep(this);
4745 /* ?do_grouping@?$numpunct@_W@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4746 /* ?do_grouping@?$numpunct@_W@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4747 /* ?do_grouping@?$numpunct@G@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4748 /* ?do_grouping@?$numpunct@G@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4749 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_grouping, 8)
4750 #if _MSVCP_VER <= 100
4751 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 12, \
4752 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4753 #else
4754 #define call_numpunct_wchar_do_grouping(this, ret) CALL_VTBL_FUNC(this, 20, \
4755 basic_string_char*, (const numpunct_wchar*, basic_string_char*), (this, ret))
4756 #endif
4757 basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *this, basic_string_char *ret)
4759 TRACE("(%p)\n", this);
4760 return MSVCP_basic_string_char_ctor_cstr(ret, this->grouping);
4763 /* ?grouping@?$numpunct@_W@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4764 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4765 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4766 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
4767 DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
4768 basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
4770 TRACE("(%p)\n", this);
4771 return call_numpunct_wchar_do_grouping(this, ret);
4774 /* ?do_falsename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4775 /* ?do_falsename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4776 /* ?do_falsename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4777 /* ?do_falsename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4778 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_falsename, 8)
4779 #if _MSVCP_VER <= 100
4780 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 16, \
4781 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4782 #else
4783 #define call_numpunct_wchar_do_falsename(this, ret) CALL_VTBL_FUNC(this, 24, \
4784 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4785 #endif
4786 basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4788 TRACE("(%p)\n", this);
4789 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->false_name);
4792 /* ?falsename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4793 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4794 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4795 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4796 DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
4797 basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
4799 TRACE("(%p)\n", this);
4800 return call_numpunct_wchar_do_falsename(this, ret);
4803 /* ?do_truename@?$numpunct@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4804 /* ?do_truename@?$numpunct@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4805 /* ?do_truename@?$numpunct@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4806 /* ?do_truename@?$numpunct@G@std@@MEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4807 DEFINE_THISCALL_WRAPPER(numpunct_wchar_do_truename, 8)
4808 #if _MSVCP_VER <= 100
4809 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 20, \
4810 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4811 #else
4812 #define call_numpunct_wchar_do_truename(this, ret) CALL_VTBL_FUNC(this, 28, \
4813 basic_string_wchar*, (const numpunct_wchar*, basic_string_wchar*), (this, ret))
4814 #endif
4815 basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4817 TRACE("(%p)\n", this);
4818 return MSVCP_basic_string_wchar_ctor_cstr(ret, this->true_name);
4821 /* ?truename@?$numpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4822 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4823 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4824 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4825 DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
4826 basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
4828 TRACE("(%p)\n", this);
4829 return call_numpunct_wchar_do_truename(this, ret);
4832 double __cdecl _Stod(const char *buf, char **buf_end, LONG exp)
4834 double ret = strtod(buf, buf_end);
4836 if(exp)
4837 ret *= pow(10, exp);
4838 return ret;
4841 double __cdecl _Stodx(const char *buf, char **buf_end, LONG exp, int *err)
4843 double ret;
4845 *err = *_errno();
4846 *_errno() = 0;
4847 ret = _Stod(buf, buf_end, exp);
4848 if(*_errno()) {
4849 *err = *_errno();
4850 }else {
4851 *_errno() = *err;
4852 *err = 0;
4854 return ret;
4857 float __cdecl _Stof(const char *buf, char **buf_end, LONG exp)
4859 return _Stod(buf, buf_end, exp);
4862 float __cdecl _Stofx(const char *buf, char **buf_end, LONG exp, int *err)
4864 return _Stodx(buf, buf_end, exp, err);
4867 __int64 __cdecl _Stoll(const char *buf, char **buf_end, int base)
4869 return _strtoi64(buf, buf_end, base);
4872 __int64 __cdecl _Stollx(const char *buf, char **buf_end, int base, int *err)
4874 __int64 ret;
4876 *err = *_errno();
4877 *_errno() = 0;
4878 ret = _strtoi64(buf, buf_end, base);
4879 if(*_errno()) {
4880 *err = *_errno();
4881 }else {
4882 *_errno() = *err;
4883 *err = 0;
4885 return ret;
4888 LONG __cdecl _Stolx(const char *buf, char **buf_end, int base, int *err)
4890 __int64 i = _Stollx(buf, buf_end, base, err);
4891 if(!*err && i!=(__int64)((LONG)i))
4892 *err = ERANGE;
4893 return i;
4896 unsigned __int64 __cdecl _Stoull(const char *buf, char **buf_end, int base)
4898 return _strtoui64(buf, buf_end, base);
4901 unsigned __int64 __cdecl _Stoullx(const char *buf, char **buf_end, int base, int *err)
4903 unsigned __int64 ret;
4905 *err = *_errno();
4906 *_errno() = 0;
4907 ret = _strtoui64(buf, buf_end, base);
4908 if(*_errno()) {
4909 *err = *_errno();
4910 }else {
4911 *_errno() = *err;
4912 *err = 0;
4914 return ret;
4917 ULONG __cdecl _Stoul(const char *buf, char **buf_end, int base)
4919 int err;
4920 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, &err);
4921 if(!err && i!=(unsigned __int64)((ULONG)i))
4922 *_errno() = ERANGE;
4923 return buf[0]=='-' ? -i : i;
4926 ULONG __cdecl _Stoulx(const char *buf, char **buf_end, int base, int *err)
4928 unsigned __int64 i = _Stoullx(buf[0]=='-' ? buf+1 : buf, buf_end, base, err);
4929 if(!*err && i!=(unsigned __int64)((ULONG)i))
4930 *err = ERANGE;
4931 return buf[0]=='-' ? -i : i;
4934 /* ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
4935 locale_id num_get_wchar_id = {0};
4936 /* ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
4937 locale_id num_get_short_id = {0};
4939 /* ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
4940 extern const vtable_ptr num_get_wchar_vtable;
4941 /* ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
4942 extern const vtable_ptr num_get_short_vtable;
4944 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4945 /* ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4946 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
4947 /* ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
4948 DEFINE_THISCALL_WRAPPER(num_get_wchar__Init, 8)
4949 void __thiscall num_get_wchar__Init(num_get *this, const _Locinfo *locinfo)
4951 TRACE("(%p %p)\n", this, locinfo);
4952 #if _MSVCP_VER <= 100
4953 _Locinfo__Getcvt(locinfo, &this->cvt);
4954 #endif
4957 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4958 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4959 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_locinfo, 12)
4960 num_get* __thiscall num_get_wchar_ctor_locinfo(num_get *this,
4961 const _Locinfo *locinfo, size_t refs)
4963 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
4965 locale_facet_ctor_refs(&this->facet, refs);
4966 this->facet.vtable = &num_get_wchar_vtable;
4968 num_get_wchar__Init(this, locinfo);
4969 return this;
4972 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
4973 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
4974 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_locinfo, 12)
4975 num_get* __thiscall num_get_short_ctor_locinfo(num_get *this,
4976 const _Locinfo *locinfo, size_t refs)
4978 num_get_wchar_ctor_locinfo(this, locinfo, refs);
4979 this->facet.vtable = &num_get_short_vtable;
4980 return this;
4983 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
4984 /* ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
4985 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor_refs, 8)
4986 num_get* __thiscall num_get_wchar_ctor_refs(num_get *this, size_t refs)
4988 _Locinfo locinfo;
4990 TRACE("(%p %Iu)\n", this, refs);
4992 _Locinfo_ctor(&locinfo);
4993 num_get_wchar_ctor_locinfo(this, &locinfo, refs);
4994 _Locinfo_dtor(&locinfo);
4995 return this;
4998 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
4999 /* ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
5000 DEFINE_THISCALL_WRAPPER(num_get_short_ctor_refs, 8)
5001 num_get* __thiscall num_get_short_ctor_refs(num_get *this, size_t refs)
5003 num_get_wchar_ctor_refs(this, refs);
5004 this->facet.vtable = &num_get_short_vtable;
5005 return this;
5008 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
5009 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
5010 DEFINE_THISCALL_WRAPPER(num_get_wchar_ctor, 4)
5011 num_get* __thiscall num_get_wchar_ctor(num_get *this)
5013 return num_get_wchar_ctor_refs(this, 0);
5016 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
5017 /* ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
5018 DEFINE_THISCALL_WRAPPER(num_get_short_ctor, 4)
5019 num_get* __thiscall num_get_short_ctor(num_get *this)
5021 return num_get_short_ctor_refs(this, 0);
5024 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
5025 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
5026 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
5027 /* ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
5028 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
5029 /* ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
5030 DEFINE_THISCALL_WRAPPER(num_get_wchar_dtor, 4)
5031 void __thiscall num_get_wchar_dtor(num_get *this)
5033 TRACE("(%p)\n", this);
5034 locale_facet_dtor(&this->facet);
5037 DEFINE_THISCALL_WRAPPER(num_get_wchar_vector_dtor, 8)
5038 num_get* __thiscall num_get_wchar_vector_dtor(num_get *this, unsigned int flags)
5040 TRACE("(%p %x)\n", this, flags);
5041 if(flags & 2) {
5042 /* we have an array, with the number of elements stored before the first object */
5043 INT_PTR i, *ptr = (INT_PTR *)this-1;
5045 for(i=*ptr-1; i>=0; i--)
5046 num_get_wchar_dtor(this+i);
5047 MSVCRT_operator_delete(ptr);
5048 } else {
5049 num_get_wchar_dtor(this);
5050 if(flags & 1)
5051 MSVCRT_operator_delete(this);
5054 return this;
5057 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
5058 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
5059 size_t __cdecl num_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
5061 TRACE("(%p %p)\n", facet, loc);
5063 if(facet && !*facet) {
5064 _Locinfo locinfo;
5066 *facet = MSVCRT_operator_new(sizeof(num_get));
5067 if(!*facet) {
5068 ERR("Out of memory\n");
5069 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
5070 return 0;
5073 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
5074 num_get_wchar_ctor_locinfo((num_get*)*facet, &locinfo, 0);
5075 _Locinfo_dtor(&locinfo);
5078 return LC_NUMERIC;
5081 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
5082 /* ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
5083 size_t __cdecl num_get_wchar__Getcat_old(const locale_facet **facet)
5085 return num_get_wchar__Getcat(facet, locale_classic());
5088 num_get* num_get_wchar_use_facet(const locale *loc)
5090 static num_get *obj = NULL;
5092 _Lockit lock;
5093 const locale_facet *fac;
5095 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5096 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_wchar_id));
5097 if(fac) {
5098 _Lockit_dtor(&lock);
5099 return (num_get*)fac;
5102 if(obj) {
5103 _Lockit_dtor(&lock);
5104 return obj;
5107 num_get_wchar__Getcat(&fac, loc);
5108 obj = (num_get*)fac;
5109 call_locale_facet__Incref(&obj->facet);
5110 locale_facet_register(&obj->facet);
5111 _Lockit_dtor(&lock);
5113 return obj;
5116 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
5117 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
5118 size_t __cdecl num_get_short__Getcat(const locale_facet **facet, const locale *loc)
5120 if(facet && !*facet) {
5121 num_get_wchar__Getcat(facet, loc);
5122 (*(locale_facet**)facet)->vtable = &num_get_short_vtable;
5125 return LC_NUMERIC;
5128 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
5129 /* ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
5130 size_t __cdecl num_get_short__Getcat_old(const locale_facet **facet)
5132 return num_get_short__Getcat(facet, locale_classic());
5135 num_get* num_get_short_use_facet(const locale *loc)
5137 static num_get *obj = NULL;
5139 _Lockit lock;
5140 const locale_facet *fac;
5142 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
5143 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_short_id));
5144 if(fac) {
5145 _Lockit_dtor(&lock);
5146 return (num_get*)fac;
5149 if(obj) {
5150 _Lockit_dtor(&lock);
5151 return obj;
5154 num_get_short__Getcat(&fac, loc);
5155 obj = (num_get*)fac;
5156 call_locale_facet__Incref(&obj->facet);
5157 locale_facet_register(&obj->facet);
5158 _Lockit_dtor(&lock);
5160 return obj;
5163 static int num_get__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5164 istreambuf_iterator_wchar *last, const locale *loc, numpunct_wchar *numpunct)
5166 basic_string_char grouping_bstr;
5167 basic_string_char groups_found;
5168 int i, groups_no = 0, cur_group = 0, exp = 0;
5169 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31;
5170 wchar_t sep = 0, digits[11], *digits_pos;
5171 const char *grouping, *groups;
5172 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
5173 const _Cvtvec *cvt;
5175 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
5177 #if _MSVCP_VER <= 100
5178 cvt = &this->cvt;
5179 #else
5180 cvt = &ctype_wchar_use_facet(loc)->cvt;
5181 #endif
5183 for(i=0; i<10; i++)
5184 digits[i] = mb_to_wc('0'+i, cvt);
5185 digits[10] = 0;
5187 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5188 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5189 #if _MSVCP_VER >= 70
5190 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5191 #endif
5193 if(sep)
5194 MSVCP_basic_string_char_ctor(&groups_found);
5196 istreambuf_iterator_wchar_val(first);
5197 /* get sign */
5198 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5199 *dest++ = '-';
5200 istreambuf_iterator_wchar_inc(first);
5201 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5202 *dest++ = '+';
5203 istreambuf_iterator_wchar_inc(first);
5206 /* read possibly grouped numbers before decimal */
5207 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5208 if(!(digits_pos = wcschr(digits, first->val))) {
5209 if(sep && first->val==sep) {
5210 if(!groups_no) break; /* empty group - stop parsing */
5211 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5212 groups_no = 0;
5213 ++cur_group;
5214 }else {
5215 break;
5217 }else {
5218 got_digit = TRUE; /* found a digit, zero or non-zero */
5219 /* write digit to dest if not a leading zero (to not waste dest buffer) */
5220 if(!got_nonzero && first->val == digits[0])
5222 ++groups_no;
5223 continue;
5225 got_nonzero = TRUE;
5226 if(dest < num_end)
5227 *dest++ = '0'+digits_pos-digits;
5228 else
5229 exp++; /* too many digits, just multiply by 10 */
5230 if(sep && groups_no<CHAR_MAX)
5231 ++groups_no;
5235 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
5236 if(got_digit && !got_nonzero)
5237 *dest++ = '0';
5239 /* get decimal, if any */
5240 if(first->strbuf && first->val==numpunct_wchar_decimal_point(numpunct)) {
5241 if(dest < num_end)
5242 *dest++ = *localeconv()->decimal_point;
5243 istreambuf_iterator_wchar_inc(first);
5246 /* read non-grouped after decimal */
5247 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5248 if(!(digits_pos = wcschr(digits, first->val)))
5249 break;
5250 else if(dest<num_end) {
5251 got_digit = TRUE;
5252 *dest++ = '0'+digits_pos-digits;
5256 /* read exponent, if any */
5257 if(first->strbuf && (first->val==mb_to_wc('e', cvt) || first->val==mb_to_wc('E', cvt))) {
5258 *dest++ = 'e';
5259 istreambuf_iterator_wchar_inc(first);
5261 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5262 *dest++ = '-';
5263 istreambuf_iterator_wchar_inc(first);
5264 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5265 *dest++ = '+';
5266 istreambuf_iterator_wchar_inc(first);
5269 got_digit = got_nonzero = FALSE;
5270 error = TRUE;
5271 /* skip any leading zeroes */
5272 for(; first->strbuf && first->val==digits[0]; istreambuf_iterator_wchar_inc(first))
5273 error = FALSE;
5275 for(; first->strbuf && (digits_pos = wcschr(digits, first->val)); istreambuf_iterator_wchar_inc(first)) {
5276 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
5277 error = FALSE;
5278 if(dest<exp_end)
5279 *dest++ = '0'+digits_pos-digits;
5282 /* if just found zeroes for exponent, use that */
5283 if(got_digit && !got_nonzero)
5285 error = FALSE;
5286 if(dest<exp_end)
5287 *dest++ = '0';
5291 if(sep && groups_no)
5292 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5294 if(!cur_group) /* no groups, skip loop */
5295 cur_group--;
5296 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
5297 error = TRUE; /* trailing empty */
5299 for(; cur_group>=0 && !error; cur_group--) {
5300 if(*grouping == CHAR_MAX) {
5301 if(cur_group)
5302 error = TRUE;
5303 break;
5304 }else if((cur_group && *grouping!=groups[cur_group])
5305 || (!cur_group && *grouping<groups[cur_group])) {
5306 error = TRUE;
5307 break;
5308 }else if(grouping[1]) {
5309 grouping++;
5312 MSVCP_basic_string_char_dtor(&grouping_bstr);
5313 if(sep)
5314 MSVCP_basic_string_char_dtor(&groups_found);
5316 if(error) {
5317 *dest_beg = '\0';
5318 return 0;
5320 *dest++ = '\0';
5321 return exp;
5324 /* ?_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 */
5325 /* ?_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 */
5326 int __cdecl num_get_wchar__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5327 istreambuf_iterator_wchar *last, const locale *loc)
5329 return num_get__Getffld(this, dest, first, last, loc, numpunct_wchar_use_facet(loc));
5332 /* ?_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 */
5333 /* ?_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 */
5334 int __cdecl num_get_short__Getffld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5335 istreambuf_iterator_wchar *last, const locale *loc)
5337 return num_get__Getffld(this, dest, first, last, loc, numpunct_short_use_facet(loc));
5340 /* ?_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 */
5341 /* ?_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 */
5342 /* ?_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 */
5343 /* ?_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 */
5344 int __cdecl num_get_wchar__Getffldx(num_get *this, char *dest, istreambuf_iterator_wchar *first,
5345 istreambuf_iterator_wchar *last, ios_base *ios, int *phexexp)
5347 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
5348 return -1;
5351 static int num_get__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5352 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc, numpunct_wchar *numpunct)
5354 wchar_t digits[23], *digits_pos, sep = 0;
5355 basic_string_char grouping_bstr;
5356 basic_string_char groups_found;
5357 int i, basefield, base, groups_no = 0, cur_group = 0;
5358 char *dest_beg = dest, *dest_end = dest+24;
5359 const char *grouping, *groups;
5360 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
5361 const _Cvtvec *cvt;
5363 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
5365 #if _MSVCP_VER <= 100
5366 cvt = &this->cvt;
5367 #else
5368 cvt = &ctype_wchar_use_facet(loc)->cvt;
5369 #endif
5371 for(i=0; i<10; i++)
5372 digits[i] = mb_to_wc('0'+i, cvt);
5373 for(i=0; i<6; i++) {
5374 digits[10+i] = mb_to_wc('a'+i, cvt);
5375 digits[16+i] = mb_to_wc('A'+i, cvt);
5378 numpunct_wchar_grouping(numpunct, &grouping_bstr);
5379 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
5380 #if _MSVCP_VER >= 70
5381 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
5382 #endif
5384 basefield = fmtflags & FMTFLAG_basefield;
5385 if(basefield == FMTFLAG_oct)
5386 base = 8;
5387 else if(basefield == FMTFLAG_hex)
5388 base = 22; /* equal to the size of digits buffer */
5389 else if(!basefield)
5390 base = 0;
5391 else
5392 base = 10;
5394 istreambuf_iterator_wchar_val(first);
5395 if(first->strbuf && first->val==mb_to_wc('-', cvt)) {
5396 *dest++ = '-';
5397 istreambuf_iterator_wchar_inc(first);
5398 }else if(first->strbuf && first->val==mb_to_wc('+', cvt)) {
5399 *dest++ = '+';
5400 istreambuf_iterator_wchar_inc(first);
5403 if(first->strbuf && first->val==digits[0]) {
5404 found_zero = TRUE;
5405 istreambuf_iterator_wchar_inc(first);
5406 if(first->strbuf && (first->val==mb_to_wc('x', cvt) || first->val==mb_to_wc('X', cvt))) {
5407 if(!base || base == 22) {
5408 found_zero = FALSE;
5409 istreambuf_iterator_wchar_inc(first);
5410 base = 22;
5411 }else {
5412 base = 10;
5414 }else {
5415 error = FALSE;
5416 if(!base) base = 8;
5418 }else {
5419 if(!base) base = 10;
5421 digits[base] = 0;
5423 if(sep) {
5424 MSVCP_basic_string_char_ctor(&groups_found);
5425 if(found_zero) ++groups_no;
5428 for(; first->strbuf; istreambuf_iterator_wchar_inc(first)) {
5429 if(!(digits_pos = wcschr(digits, first->val))) {
5430 if(sep && first->val==sep) {
5431 if(!groups_no) break; /* empty group - stop parsing */
5432 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5433 groups_no = 0;
5434 ++cur_group;
5435 }else {
5436 break;
5438 }else {
5439 error = FALSE;
5440 if(dest_empty && first->val == digits[0]) {
5441 found_zero = TRUE;
5442 ++groups_no;
5443 continue;
5445 dest_empty = FALSE;
5446 /* skip digits that can't be copied to dest buffer, other
5447 * functions are responsible for detecting overflows */
5448 if(dest < dest_end)
5449 *dest++ = (digits_pos-digits<10 ? '0'+digits_pos-digits :
5450 (digits_pos-digits<16 ? 'a'+digits_pos-digits-10 :
5451 'A'+digits_pos-digits-16));
5452 if(sep && groups_no<CHAR_MAX)
5453 ++groups_no;
5457 if(sep && groups_no)
5458 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
5460 if(!cur_group) { /* no groups, skip loop */
5461 cur_group--;
5462 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
5463 error = TRUE; /* trailing empty */
5464 found_zero = FALSE;
5467 for(; cur_group>=0 && !error; cur_group--) {
5468 if(*grouping == CHAR_MAX) {
5469 if(cur_group)
5470 error = TRUE;
5471 break;
5472 }else if((cur_group && *grouping!=groups[cur_group])
5473 || (!cur_group && *grouping<groups[cur_group])) {
5474 error = TRUE;
5475 break;
5476 }else if(grouping[1]) {
5477 grouping++;
5481 MSVCP_basic_string_char_dtor(&grouping_bstr);
5482 if(sep)
5483 MSVCP_basic_string_char_dtor(&groups_found);
5485 if(error) {
5486 if (found_zero)
5487 *dest++ = '0';
5488 else
5489 dest = dest_beg;
5490 }else if(dest_empty)
5491 *dest++ = '0';
5492 *dest = '\0';
5494 return (base==22 ? 16 : base);
5497 /* ?_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 */
5498 /* ?_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 */
5499 int __cdecl num_get_wchar__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5500 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5502 return num_get__Getifld(this, dest, first, last,
5503 fmtflags, loc, numpunct_wchar_use_facet(loc));
5506 /* ?_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 */
5507 /* ?_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 */
5508 int __cdecl num_get_short__Getifld(const num_get *this, char *dest, istreambuf_iterator_wchar *first,
5509 istreambuf_iterator_wchar *last, int fmtflags, const locale *loc)
5511 return num_get__Getifld(this, dest, first, last,
5512 fmtflags, loc, numpunct_short_use_facet(loc));
5515 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABEH_W000@Z */
5516 /* ?_Hexdig@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAH_W000@Z */
5517 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABEHGGGG@Z */
5518 /* ?_Hexdig@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHGGGG@Z */
5519 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_wchar__Hexdig, 20)
5520 int __thiscall MSVCP_num_get_wchar__Hexdig(num_get *this, wchar_t dig, wchar_t e0, wchar_t al, wchar_t au)
5522 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
5523 return -1;
5526 static istreambuf_iterator_wchar* num_get_do_get_void(const num_get *this,
5527 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5528 istreambuf_iterator_wchar last, ios_base *base, int *state,
5529 void **pval, numpunct_wchar *numpunct)
5531 unsigned __int64 v;
5532 char tmp[25], *end;
5533 int err;
5535 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5537 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5538 &last, FMTFLAG_hex, IOS_LOCALE(base), numpunct), &err);
5539 if(v!=(unsigned __int64)((INT_PTR)v))
5540 *state |= IOSTATE_failbit;
5541 else if(end!=tmp && !err)
5542 *pval = (void*)((INT_PTR)v);
5543 else
5544 *state |= IOSTATE_failbit;
5546 if(!first.strbuf)
5547 *state |= IOSTATE_eofbit;
5549 *ret = first;
5550 return ret;
5553 /* ?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 */
5554 /* ?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 */
5555 #if _MSVCP_VER <= 100
5556 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_wchar*, \
5557 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5558 (this, ret, first, last, base, state, pval))
5559 #else
5560 #define call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5561 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, void**), \
5562 (this, ret, first, last, base, state, pval))
5563 #endif
5564 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_void,36)
5565 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5566 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5568 return num_get_do_get_void(this, ret, first, last, base,
5569 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5572 /* ?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 */
5573 /* ?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 */
5574 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_void,36)
5575 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5576 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5578 return num_get_do_get_void(this, ret, first, last, base,
5579 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5582 /* ?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 */
5583 /* ?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 */
5584 /* ?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 */
5585 /* ?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 */
5586 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_void,36)
5587 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_void(const num_get *this, istreambuf_iterator_wchar *ret,
5588 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, void **pval)
5590 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5591 return call_num_get_wchar_do_get_void(this, ret, first, last, base, state, pval);
5594 static istreambuf_iterator_wchar* num_get_do_get_double(const num_get *this,
5595 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5596 istreambuf_iterator_wchar last, ios_base *base, int *state,
5597 double *pval, numpunct_wchar *numpunct)
5599 double v;
5600 char tmp[32], *end;
5601 int err;
5603 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5605 v = _Stodx(tmp, &end, num_get__Getffld(this, tmp, &first, &last, IOS_LOCALE(base), numpunct), &err);
5606 if(end!=tmp && !err)
5607 *pval = v;
5608 else
5609 *state |= IOSTATE_failbit;
5611 if(!first.strbuf)
5612 *state |= IOSTATE_eofbit;
5614 *ret = first;
5615 return ret;
5618 /* ?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 */
5619 /* ?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 */
5620 /* ?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 */
5621 /* ?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 */
5622 #if _MSVCP_VER <= 100
5623 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
5624 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5625 (this, ret, first, last, base, state, pval))
5626 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
5627 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5628 (this, ret, first, last, base, state, pval))
5629 #else
5630 #define call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5631 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5632 (this, ret, first, last, base, state, pval))
5633 #define call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5634 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, double*), \
5635 (this, ret, first, last, base, state, pval))
5636 #endif
5637 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_double,36)
5638 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5639 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5641 return num_get_do_get_double(this, ret, first, last, base,
5642 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5645 /* ?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 */
5646 /* ?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 */
5647 /* ?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 */
5648 /* ?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 */
5649 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_double,36)
5650 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5651 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5653 return num_get_do_get_double(this, ret, first, last, base,
5654 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5657 /* ?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 */
5658 /* ?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 */
5659 /* ?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 */
5660 /* ?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 */
5661 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ldouble,36)
5662 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ldouble(const num_get *this, istreambuf_iterator_wchar *ret,
5663 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5665 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5666 return call_num_get_wchar_do_get_ldouble(this, ret, first, last, base, state, pval);
5669 /* ?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 */
5670 /* ?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 */
5671 /* ?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 */
5672 /* ?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 */
5673 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_double,36)
5674 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_double(const num_get *this, istreambuf_iterator_wchar *ret,
5675 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, double *pval)
5677 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5678 return call_num_get_wchar_do_get_double(this, ret, first, last, base, state, pval);
5681 static istreambuf_iterator_wchar* num_get_do_get_float(const num_get *this,
5682 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5683 istreambuf_iterator_wchar last, ios_base *base, int *state,
5684 float *pval, numpunct_wchar *numpunct)
5686 float v;
5687 char tmp[32], *end;
5688 int err;
5690 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5692 v = _Stofx(tmp, &end, num_get__Getffld(this, tmp, &first,
5693 &last, IOS_LOCALE(base), numpunct), &err);
5694 if(end!=tmp && !err)
5695 *pval = v;
5696 else
5697 *state |= IOSTATE_failbit;
5699 if(!first.strbuf)
5700 *state |= IOSTATE_eofbit;
5702 *ret = first;
5703 return ret;
5706 /* ?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 */
5707 /* ?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 */
5708 #if _MSVCP_VER <= 100
5709 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
5710 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5711 (this, ret, first, last, base, state, pval))
5712 #else
5713 #define call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5714 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, float*), \
5715 (this, ret, first, last, base, state, pval))
5716 #endif
5717 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_float,36)
5718 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5719 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5721 return num_get_do_get_float(this, ret, first, last, base,
5722 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5725 /* ?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 */
5726 /* ?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 */
5727 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_float,36)
5728 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5729 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5731 return num_get_do_get_float(this, ret, first, last, base,
5732 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5735 /* ?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 */
5736 /* ?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 */
5737 /* ?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 */
5738 /* ?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 */
5739 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_float,36)
5740 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_float(const num_get *this, istreambuf_iterator_wchar *ret,
5741 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, float *pval)
5743 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5744 return call_num_get_wchar_do_get_float(this, ret, first, last, base, state, pval);
5747 static istreambuf_iterator_wchar* num_get_do_get_uint64(const num_get *this,
5748 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5749 istreambuf_iterator_wchar last, ios_base *base, int *state,
5750 ULONGLONG *pval, numpunct_wchar *numpunct)
5752 unsigned __int64 v;
5753 char tmp[25], *end;
5754 int err;
5756 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5758 v = _Stoullx(tmp, &end, num_get__Getifld(this, tmp, &first,
5759 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5760 if(end!=tmp && !err)
5761 *pval = v;
5762 else
5763 *state |= IOSTATE_failbit;
5765 if(!first.strbuf)
5766 *state |= IOSTATE_eofbit;
5768 *ret = first;
5769 return ret;
5772 /* ?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 */
5773 /* ?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 */
5774 #if _MSVCP_VER <= 100
5775 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
5776 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5777 (this, ret, first, last, base, state, pval))
5778 #else
5779 #define call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5780 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONGLONG*), \
5781 (this, ret, first, last, base, state, pval))
5782 #endif
5783 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint64,36)
5784 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5785 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5787 return num_get_do_get_uint64(this, ret, first, last, base,
5788 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5791 /* ?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 */
5792 /* ?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 */
5793 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint64,36)
5794 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5795 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5797 return num_get_do_get_uint64(this, ret, first, last, base,
5798 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5801 /* ?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 */
5802 /* ?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 */
5803 /* ?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 */
5804 /* ?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 */
5805 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint64,36)
5806 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint64(const num_get *this, istreambuf_iterator_wchar *ret,
5807 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONGLONG *pval)
5809 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5810 return call_num_get_wchar_do_get_uint64(this, ret, first, last, base, state, pval);
5813 static istreambuf_iterator_wchar* num_get_do_get_int64(const num_get *this,
5814 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5815 istreambuf_iterator_wchar last, ios_base *base, int *state,
5816 LONGLONG *pval, numpunct_wchar *numpunct)
5818 __int64 v;
5819 char tmp[25], *end;
5820 int err;
5822 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5824 v = _Stollx(tmp, &end, num_get__Getifld(this, tmp, &first,
5825 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5826 if(end!=tmp && !err)
5827 *pval = v;
5828 else
5829 *state |= IOSTATE_failbit;
5831 if(!first.strbuf)
5832 *state |= IOSTATE_eofbit;
5834 *ret = first;
5835 return ret;
5838 /* ?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 */
5839 /* ?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 */
5840 #if _MSVCP_VER <= 100
5841 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
5842 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5843 (this, ret, first, last, base, state, pval))
5844 #else
5845 #define call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5846 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONGLONG*), \
5847 (this, ret, first, last, base, state, pval))
5848 #endif
5849 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_int64,36)
5850 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5851 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5853 return num_get_do_get_int64(this, ret, first, last, base,
5854 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5857 /* ?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 */
5858 /* ?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 */
5859 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_int64,36)
5860 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5861 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5863 return num_get_do_get_int64(this, ret, first, last, base,
5864 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5867 /* ?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 */
5868 /* ?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 */
5869 /* ?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 */
5870 /* ?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 */
5871 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_int64,36)
5872 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_int64(const num_get *this, istreambuf_iterator_wchar *ret,
5873 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONGLONG *pval)
5875 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5876 return call_num_get_wchar_do_get_int64(this, ret, first, last, base, state, pval);
5879 static istreambuf_iterator_wchar* num_get_do_get_ulong(const num_get *this,
5880 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5881 istreambuf_iterator_wchar last, ios_base *base, int *state,
5882 ULONG *pval, numpunct_wchar *numpunct)
5884 ULONG v;
5885 char tmp[25], *end;
5886 int err;
5888 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5890 v = _Stoulx(tmp, &end, num_get__Getifld(this, tmp, &first,
5891 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5892 if(end!=tmp && !err)
5893 *pval = v;
5894 else
5895 *state |= IOSTATE_failbit;
5897 if(!first.strbuf)
5898 *state |= IOSTATE_eofbit;
5900 *ret = first;
5901 return ret;
5904 /* ?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 */
5905 /* ?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 */
5906 #if _MSVCP_VER <= 100
5907 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
5908 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5909 (this, ret, first, last, base, state, pval))
5910 #else
5911 #define call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
5912 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, ULONG*), \
5913 (this, ret, first, last, base, state, pval))
5914 #endif
5915 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ulong,36)
5916 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5917 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5919 return num_get_do_get_ulong(this, ret, first, last, base,
5920 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5923 /* ?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 */
5924 /* ?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 */
5925 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ulong,36)
5926 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5927 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5929 return num_get_do_get_ulong(this, ret, first, last, base,
5930 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5933 /* ?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 */
5934 /* ?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 */
5935 /* ?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 */
5936 /* ?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 */
5937 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ulong,36)
5938 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ulong(const num_get *this, istreambuf_iterator_wchar *ret,
5939 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, ULONG *pval)
5941 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5942 return call_num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval);
5945 static istreambuf_iterator_wchar* num_get_do_get_long(const num_get *this,
5946 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
5947 istreambuf_iterator_wchar last, ios_base *base, int *state,
5948 LONG *pval, numpunct_wchar *numpunct)
5950 LONG v;
5951 char tmp[25], *end;
5952 int err;
5954 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
5956 v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
5957 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
5958 if(end!=tmp && !err)
5959 *pval = v;
5960 else
5961 *state |= IOSTATE_failbit;
5963 if(!first.strbuf)
5964 *state |= IOSTATE_eofbit;
5966 *ret = first;
5967 return ret;
5970 /* ?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 */
5971 /* ?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 */
5972 #if _MSVCP_VER <= 100
5973 #define call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
5974 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONG*), \
5975 (this, ret, first, last, base, state, pval))
5976 #else
5977 #define call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_wchar*, \
5978 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, LONG*), \
5979 (this, ret, first, last, base, state, pval))
5980 #endif
5981 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_long,36)
5982 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5983 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5985 return num_get_do_get_long(this, ret, first, last, base,
5986 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
5989 /* ?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 */
5990 /* ?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 */
5991 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_long,36)
5992 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
5993 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
5995 return num_get_do_get_long(this, ret, first, last, base,
5996 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
5999 /* ?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 */
6000 /* ?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 */
6001 /* ?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 */
6002 /* ?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 */
6003 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_long,36)
6004 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_long(const num_get *this, istreambuf_iterator_wchar *ret,
6005 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, LONG *pval)
6007 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6008 return call_num_get_wchar_do_get_long(this, ret, first, last, base, state, pval);
6011 /* ?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 */
6012 /* ?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 */
6013 #if _MSVCP_VER <= 100
6014 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
6015 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
6016 (this, ret, first, last, base, state, pval))
6017 #else
6018 #define call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
6019 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned int*), \
6020 (this, ret, first, last, base, state, pval))
6021 #endif
6022 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_uint,36)
6023 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
6024 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
6026 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6027 return num_get_wchar_do_get_ulong(this, ret, first, last, base, state, pval);
6030 /* ?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 */
6031 /* ?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 */
6032 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_uint,36)
6033 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
6034 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
6036 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6037 return num_get_short_do_get_ulong(this, ret, first, last, base, state, pval);
6040 /* ?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 */
6041 /* ?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 */
6042 /* ?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 */
6043 /* ?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 */
6044 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_uint,36)
6045 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_uint(const num_get *this, istreambuf_iterator_wchar *ret,
6046 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned int *pval)
6048 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6049 return call_num_get_wchar_do_get_uint(this, ret, first, last, base, state, pval);
6052 /* ?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 */
6053 /* ?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 */
6054 #if _MSVCP_VER <= 100
6055 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_wchar*, \
6056 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
6057 (this, ret, first, last, base, state, pval))
6058 #else
6059 #define call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_wchar*, \
6060 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, unsigned short*), \
6061 (this, ret, first, last, base, state, pval))
6062 #endif
6063 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_ushort,36)
6064 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6065 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6067 ULONG v;
6068 char tmp[25], *beg, *end;
6069 int err, b;
6071 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6073 b = num_get_wchar__Getifld(this, tmp,
6074 &first, &last, base->fmtfl, IOS_LOCALE(base));
6075 beg = tmp + (tmp[0]=='-' ? 1 : 0);
6076 v = _Stoulx(beg, &end, b, &err);
6078 if(v != (ULONG)((unsigned short)v))
6079 *state |= IOSTATE_failbit;
6080 else if(end!=beg && !err)
6081 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
6082 else
6083 *state |= IOSTATE_failbit;
6085 if(!first.strbuf)
6086 *state |= IOSTATE_eofbit;
6088 *ret = first;
6089 return ret;
6092 /* ?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 */
6093 /* ?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 */
6094 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_ushort,36)
6095 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6096 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6098 FIXME("(%p %p %p %p %p) stub\n", this, ret, base, state, pval);
6099 return ret;
6102 /* ?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 */
6103 /* ?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 */
6104 /* ?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@ */
6105 /* ?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 */
6106 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_ushort,36)
6107 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_ushort(const num_get *this, istreambuf_iterator_wchar *ret,
6108 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, unsigned short *pval)
6110 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6111 return call_num_get_wchar_do_get_ushort(this, ret, first, last, base, state, pval);
6114 static istreambuf_iterator_wchar* num_get_do_get_bool(const num_get *this,
6115 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar first,
6116 istreambuf_iterator_wchar last, ios_base *base, int *state,
6117 bool *pval, numpunct_wchar *numpunct)
6119 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6121 if(base->fmtfl & FMTFLAG_boolalpha) {
6122 basic_string_wchar false_bstr, true_bstr;
6123 const wchar_t *pfalse, *ptrue;
6125 numpunct_wchar_falsename(numpunct, &false_bstr);
6126 numpunct_wchar_truename(numpunct, &true_bstr);
6127 pfalse = MSVCP_basic_string_wchar_c_str(&false_bstr);
6128 ptrue = MSVCP_basic_string_wchar_c_str(&true_bstr);
6130 for(istreambuf_iterator_wchar_val(&first); first.strbuf;) {
6131 if(pfalse && *pfalse && first.val!=*pfalse)
6132 pfalse = NULL;
6133 if(ptrue && *ptrue && first.val!=*ptrue)
6134 ptrue = NULL;
6136 if(pfalse && *pfalse && ptrue && !*ptrue)
6137 ptrue = NULL;
6138 if(ptrue && *ptrue && pfalse && !*pfalse)
6139 pfalse = NULL;
6141 if(pfalse)
6142 pfalse++;
6143 if(ptrue)
6144 ptrue++;
6146 if(pfalse || ptrue)
6147 istreambuf_iterator_wchar_inc(&first);
6149 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
6150 break;
6153 if(ptrue)
6154 *pval = TRUE;
6155 else if(pfalse)
6156 *pval = FALSE;
6157 else
6158 *state |= IOSTATE_failbit;
6160 MSVCP_basic_string_wchar_dtor(&false_bstr);
6161 MSVCP_basic_string_wchar_dtor(&true_bstr);
6162 }else {
6163 char tmp[25], *end;
6164 int err;
6165 LONG v = _Stolx(tmp, &end, num_get__Getifld(this, tmp, &first,
6166 &last, base->fmtfl, IOS_LOCALE(base), numpunct), &err);
6168 if(end!=tmp && err==0 && (v==0 || v==1))
6169 *pval = v;
6170 else
6171 *state |= IOSTATE_failbit;
6174 if(!first.strbuf)
6175 *state |= IOSTATE_eofbit;
6176 memcpy(ret, &first, sizeof(first));
6177 return ret;
6180 /* ?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 */
6181 /* ?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 */
6182 #if _MSVCP_VER <= 100
6183 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_wchar*, \
6184 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, bool*), \
6185 (this, ret, first, last, base, state, pval))
6186 #else
6187 #define call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_wchar*, \
6188 (const num_get*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, bool*), \
6189 (this, ret, first, last, base, state, pval))
6190 #endif
6191 DEFINE_THISCALL_WRAPPER(num_get_wchar_do_get_bool,36)
6192 istreambuf_iterator_wchar *__thiscall num_get_wchar_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6193 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6195 return num_get_do_get_bool(this, ret, first, last, base,
6196 state, pval, numpunct_wchar_use_facet(IOS_LOCALE(base)));
6199 /* ?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 */
6200 /* ?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 */
6201 DEFINE_THISCALL_WRAPPER(num_get_short_do_get_bool,36)
6202 istreambuf_iterator_wchar *__thiscall num_get_short_do_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6203 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6205 return num_get_do_get_bool(this, ret, first, last, base,
6206 state, pval, numpunct_short_use_facet(IOS_LOCALE(base)));
6209 /* ?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 */
6210 /* ?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 */
6211 /* ?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 */
6212 /* ?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 */
6213 DEFINE_THISCALL_WRAPPER(num_get_wchar_get_bool,36)
6214 istreambuf_iterator_wchar *__thiscall num_get_wchar_get_bool(const num_get *this, istreambuf_iterator_wchar *ret,
6215 istreambuf_iterator_wchar first, istreambuf_iterator_wchar last, ios_base *base, int *state, bool *pval)
6217 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6218 return call_num_get_wchar_do_get_bool(this, ret, first, last, base, state, pval);
6221 /* ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
6222 locale_id num_get_char_id = {0};
6224 /* ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
6225 extern const vtable_ptr num_get_char_vtable;
6227 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
6228 /* ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
6229 DEFINE_THISCALL_WRAPPER(num_get_char__Init, 8)
6230 void __thiscall num_get_char__Init(num_get *this, const _Locinfo *locinfo)
6232 TRACE("(%p %p)\n", this, locinfo);
6233 #if _MSVCP_VER <= 100
6234 _Locinfo__Getcvt(locinfo, &this->cvt);
6235 #endif
6238 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
6239 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
6240 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_locinfo, 12)
6241 num_get* __thiscall num_get_char_ctor_locinfo(num_get *this,
6242 const _Locinfo *locinfo, size_t refs)
6244 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
6246 locale_facet_ctor_refs(&this->facet, refs);
6247 this->facet.vtable = &num_get_char_vtable;
6249 num_get_char__Init(this, locinfo);
6250 return this;
6253 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
6254 /* ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
6255 DEFINE_THISCALL_WRAPPER(num_get_char_ctor_refs, 8)
6256 num_get* __thiscall num_get_char_ctor_refs(num_get *this, size_t refs)
6258 _Locinfo locinfo;
6260 TRACE("(%p %Iu)\n", this, refs);
6262 _Locinfo_ctor(&locinfo);
6263 num_get_char_ctor_locinfo(this, &locinfo, refs);
6264 _Locinfo_dtor(&locinfo);
6265 return this;
6268 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
6269 /* ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
6270 DEFINE_THISCALL_WRAPPER(num_get_char_ctor, 4)
6271 num_get* __thiscall num_get_char_ctor(num_get *this)
6273 return num_get_char_ctor_refs(this, 0);
6276 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
6277 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
6278 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
6279 /* ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
6280 DEFINE_THISCALL_WRAPPER(num_get_char_dtor, 4)
6281 void __thiscall num_get_char_dtor(num_get *this)
6283 TRACE("(%p)\n", this);
6284 locale_facet_dtor(&this->facet);
6287 DEFINE_THISCALL_WRAPPER(num_get_char_vector_dtor, 8)
6288 num_get* __thiscall num_get_char_vector_dtor(num_get *this, unsigned int flags)
6290 TRACE("(%p %x)\n", this, flags);
6291 if(flags & 2) {
6292 /* we have an array, with the number of elements stored before the first object */
6293 INT_PTR i, *ptr = (INT_PTR *)this-1;
6295 for(i=*ptr-1; i>=0; i--)
6296 num_get_char_dtor(this+i);
6297 MSVCRT_operator_delete(ptr);
6298 } else {
6299 num_get_char_dtor(this);
6300 if(flags & 1)
6301 MSVCRT_operator_delete(this);
6304 return this;
6307 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
6308 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
6309 size_t __cdecl num_get_char__Getcat(const locale_facet **facet, const locale *loc)
6311 TRACE("(%p %p)\n", facet, loc);
6313 if(facet && !*facet) {
6314 _Locinfo locinfo;
6316 *facet = MSVCRT_operator_new(sizeof(num_get));
6317 if(!*facet) {
6318 ERR("Out of memory\n");
6319 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
6320 return 0;
6323 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
6324 num_get_char_ctor_locinfo((num_get*)*facet, &locinfo, 0);
6325 _Locinfo_dtor(&locinfo);
6328 return LC_NUMERIC;
6331 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
6332 /* ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
6333 size_t __cdecl num_get_char__Getcat_old(const locale_facet **facet)
6335 return num_get_char__Getcat(facet, locale_classic());
6338 num_get* num_get_char_use_facet(const locale *loc)
6340 static num_get *obj = NULL;
6342 _Lockit lock;
6343 const locale_facet *fac;
6345 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
6346 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_get_char_id));
6347 if(fac) {
6348 _Lockit_dtor(&lock);
6349 return (num_get*)fac;
6352 if(obj) {
6353 _Lockit_dtor(&lock);
6354 return obj;
6357 num_get_char__Getcat(&fac, loc);
6358 obj = (num_get*)fac;
6359 call_locale_facet__Incref(&obj->facet);
6360 locale_facet_register(&obj->facet);
6361 _Lockit_dtor(&lock);
6363 return obj;
6366 /* ?_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 */
6367 /* ?_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 */
6368 /* Copies number to dest buffer, validates grouping and skips separators.
6369 * Updates first so it points past the number, all digits are skipped.
6370 * Returns how exponent needs to changed.
6371 * Size of dest buffer is not specified, assuming it's not smaller than 32:
6372 * strlen(+0.e+) + 22(digits) + 4(exponent) + 1(nullbyte)
6374 int __cdecl num_get_char__Getffld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6375 istreambuf_iterator_char *last, const locale *loc)
6377 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6378 basic_string_char grouping_bstr;
6379 basic_string_char groups_found;
6380 int groups_no = 0, cur_group = 0, exp = 0;
6381 char *dest_beg = dest, *num_end = dest+25, *exp_end = dest+31, sep = 0;
6382 const char *grouping, *groups;
6383 BOOL error = FALSE, got_digit = FALSE, got_nonzero = FALSE;
6385 TRACE("(%p %p %p %p)\n", dest, first, last, loc);
6387 numpunct_char_grouping(numpunct, &grouping_bstr);
6388 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6389 #if _MSVCP_VER >= 70
6390 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6391 #endif
6393 if(sep)
6394 MSVCP_basic_string_char_ctor(&groups_found);
6396 istreambuf_iterator_char_val(first);
6397 /* get sign */
6398 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6399 *dest++ = first->val;
6400 istreambuf_iterator_char_inc(first);
6403 /* read possibly grouped numbers before decimal */
6404 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6405 if(first->val<'0' || first->val>'9') {
6406 if(sep && first->val==sep) {
6407 if(!groups_no) break; /* empty group - stop parsing */
6408 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6409 groups_no = 0;
6410 ++cur_group;
6411 }else {
6412 break;
6414 }else {
6415 got_digit = TRUE; /* found a digit, zero or non-zero */
6416 /* write digit to dest if not a leading zero (to not waste dest buffer) */
6417 if(!got_nonzero && first->val == '0')
6419 ++groups_no;
6420 continue;
6422 got_nonzero = TRUE;
6423 if(dest < num_end)
6424 *dest++ = first->val;
6425 else
6426 exp++; /* too many digits, just multiply by 10 */
6427 if(sep && groups_no<CHAR_MAX)
6428 ++groups_no;
6432 /* if all leading zeroes, we didn't write anything so put a zero we check for a decimal */
6433 if(got_digit && !got_nonzero)
6434 *dest++ = '0';
6436 /* get decimal, if any */
6437 if(first->strbuf && first->val==numpunct_char_decimal_point(numpunct)) {
6438 if(dest < num_end)
6439 *dest++ = *localeconv()->decimal_point;
6440 istreambuf_iterator_char_inc(first);
6443 /* read non-grouped after decimal */
6444 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6445 if(first->val<'0' || first->val>'9')
6446 break;
6447 else if(dest<num_end) {
6448 got_digit = TRUE;
6449 *dest++ = first->val;
6453 /* read exponent, if any */
6454 if(first->strbuf && (first->val=='e' || first->val=='E')) {
6455 *dest++ = first->val;
6456 istreambuf_iterator_char_inc(first);
6458 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6459 *dest++ = first->val;
6460 istreambuf_iterator_char_inc(first);
6463 got_digit = got_nonzero = FALSE;
6464 error = TRUE;
6465 /* skip any leading zeroes */
6466 for(; first->strbuf && first->val=='0'; istreambuf_iterator_char_inc(first))
6467 got_digit = TRUE;
6469 for(; first->strbuf && first->val>='0' && first->val<='9'; istreambuf_iterator_char_inc(first)) {
6470 got_digit = got_nonzero = TRUE; /* leading zeroes would have been skipped, so first digit is non-zero */
6471 error = FALSE;
6472 if(dest<exp_end)
6473 *dest++ = first->val;
6476 /* if just found zeroes for exponent, use that */
6477 if(got_digit && !got_nonzero)
6479 error = FALSE;
6480 if(dest<exp_end)
6481 *dest++ = '0';
6485 if(sep && groups_no)
6486 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6488 if(!cur_group) /* no groups, skip loop */
6489 cur_group--;
6490 else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group])
6491 error = TRUE; /* trailing empty */
6493 for(; cur_group>=0 && !error; cur_group--) {
6494 if(*grouping == CHAR_MAX) {
6495 if(cur_group)
6496 error = TRUE;
6497 break;
6498 }else if((cur_group && *grouping!=groups[cur_group])
6499 || (!cur_group && *grouping<groups[cur_group])) {
6500 error = TRUE;
6501 break;
6502 }else if(grouping[1]) {
6503 grouping++;
6506 MSVCP_basic_string_char_dtor(&grouping_bstr);
6507 if(sep)
6508 MSVCP_basic_string_char_dtor(&groups_found);
6510 if(error) {
6511 *dest_beg = '\0';
6512 return 0;
6514 *dest++ = '\0';
6515 return exp;
6518 /* ?_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 */
6519 /* ?_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 */
6520 int __cdecl num_get_char__Getffldx(const num_get *this, char *dest, istreambuf_iterator_char *first,
6521 istreambuf_iterator_char *last, ios_base *ios, int *phexexp)
6523 FIXME("(%p %p %p %p %p) stub\n", dest, first, last, ios, phexexp);
6524 return -1;
6527 /* ?_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 */
6528 /* ?_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 */
6529 /* Copies number to dest buffer, validates grouping and skips separators.
6530 * Updates first so it points past the number, all digits are skipped.
6531 * Returns number base (8, 10 or 16).
6532 * Size of dest buffer is not specified, assuming it's not smaller than 25:
6533 * 22(8^22>2^64)+1(detect overflows)+1(sign)+1(nullbyte) = 25
6535 int __cdecl num_get_char__Getifld(const num_get *this, char *dest, istreambuf_iterator_char *first,
6536 istreambuf_iterator_char *last, int fmtflags, const locale *loc)
6538 static const char digits[] = "0123456789abcdefABCDEF";
6540 numpunct_char *numpunct = numpunct_char_use_facet(loc);
6541 basic_string_char grouping_bstr;
6542 basic_string_char groups_found;
6543 int basefield, base, groups_no = 0, cur_group = 0;
6544 char *dest_beg = dest, *dest_end = dest+24, sep = 0;
6545 const char *grouping, *groups;
6546 BOOL error = TRUE, dest_empty = TRUE, found_zero = FALSE;
6548 TRACE("(%p %p %p %04x %p)\n", dest, first, last, fmtflags, loc);
6550 numpunct_char_grouping(numpunct, &grouping_bstr);
6551 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
6552 #if _MSVCP_VER >= 70
6553 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
6554 #endif
6556 basefield = fmtflags & FMTFLAG_basefield;
6557 if(basefield == FMTFLAG_oct)
6558 base = 8;
6559 else if(basefield == FMTFLAG_hex)
6560 base = 22; /* equal to the size of digits buffer */
6561 else if(!basefield)
6562 base = 0;
6563 else
6564 base = 10;
6566 istreambuf_iterator_char_val(first);
6567 if(first->strbuf && (first->val=='-' || first->val=='+')) {
6568 *dest++ = first->val;
6569 istreambuf_iterator_char_inc(first);
6572 if(first->strbuf && first->val=='0') {
6573 found_zero = TRUE;
6574 istreambuf_iterator_char_inc(first);
6575 if(first->strbuf && (first->val=='x' || first->val=='X')) {
6576 if(!base || base == 22) {
6577 found_zero = FALSE;
6578 istreambuf_iterator_char_inc(first);
6579 base = 22;
6580 }else {
6581 base = 10;
6583 }else {
6584 error = FALSE;
6585 if(!base) base = 8;
6587 }else {
6588 if (!base) base = 10;
6591 if(sep)
6593 MSVCP_basic_string_char_ctor(&groups_found);
6594 if(found_zero) ++groups_no;
6597 for(; first->strbuf; istreambuf_iterator_char_inc(first)) {
6598 if(!memchr(digits, first->val, base)) {
6599 if(sep && first->val==sep) {
6600 if(!groups_no) break; /* empty group - stop parsing */
6601 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6602 groups_no = 0;
6603 ++cur_group;
6604 }else {
6605 break;
6607 }else {
6608 error = FALSE;
6609 if(dest_empty && first->val == '0')
6611 found_zero = TRUE;
6612 ++groups_no;
6613 continue;
6615 dest_empty = FALSE;
6616 /* skip digits that can't be copied to dest buffer, other
6617 * functions are responsible for detecting overflows */
6618 if(dest < dest_end)
6619 *dest++ = first->val;
6620 if(sep && groups_no<CHAR_MAX)
6621 ++groups_no;
6625 if(sep && groups_no)
6626 MSVCP_basic_string_char_append_ch(&groups_found, groups_no);
6628 if(!cur_group) { /* no groups, skip loop */
6629 cur_group--;
6630 }else if(!(groups = MSVCP_basic_string_char_c_str(&groups_found))[cur_group]) {
6631 error = TRUE; /* trailing empty */
6632 found_zero = FALSE;
6635 for(; cur_group>=0 && !error; cur_group--) {
6636 if(*grouping == CHAR_MAX) {
6637 if(cur_group)
6638 error = TRUE;
6639 break;
6640 }else if((cur_group && *grouping!=groups[cur_group])
6641 || (!cur_group && *grouping<groups[cur_group])) {
6642 error = TRUE;
6643 break;
6644 }else if(grouping[1]) {
6645 grouping++;
6649 MSVCP_basic_string_char_dtor(&grouping_bstr);
6650 if(sep)
6651 MSVCP_basic_string_char_dtor(&groups_found);
6653 if(error) {
6654 if (found_zero)
6655 *dest++ = '0';
6656 else
6657 dest = dest_beg;
6658 }else if(dest_empty)
6659 *dest++ = '0';
6660 *dest = '\0';
6662 return (base==22 ? 16 : base);
6665 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABEHD000@Z */
6666 /* ?_Hexdig@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHD000@Z */
6667 DEFINE_THISCALL_WRAPPER(MSVCP_num_get_char__Hexdig, 20)
6668 int __thiscall MSVCP_num_get_char__Hexdig(num_get *this, char dig, char e0, char al, char au)
6670 FIXME("(%p %c %c %c %c) stub\n", this, dig, e0, al, au);
6671 return -1;
6674 /* ?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 */
6675 /* ?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 */
6676 #if _MSVCP_VER <= 100
6677 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 4, istreambuf_iterator_char*, \
6678 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6679 (this, ret, first, last, base, state, pval))
6680 #else
6681 #define call_num_get_char_do_get_void(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6682 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, void**), \
6683 (this, ret, first, last, base, state, pval))
6684 #endif
6685 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_void,36)
6686 istreambuf_iterator_char *__thiscall num_get_char_do_get_void(const num_get *this, istreambuf_iterator_char *ret,
6687 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6689 unsigned __int64 v;
6690 char tmp[25], *end;
6691 int err;
6693 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6695 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6696 &first, &last, FMTFLAG_hex, IOS_LOCALE(base)), &err);
6697 if(v!=(unsigned __int64)((INT_PTR)v))
6698 *state |= IOSTATE_failbit;
6699 else if(end!=tmp && !err)
6700 *pval = (void*)((INT_PTR)v);
6701 else
6702 *state |= IOSTATE_failbit;
6704 if(!first.strbuf)
6705 *state |= IOSTATE_eofbit;
6707 *ret = first;
6708 return ret;
6711 /* ?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 */
6712 /* ?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 */
6713 DEFINE_THISCALL_WRAPPER(num_get_char_get_void,36)
6714 istreambuf_iterator_char *__thiscall num_get_char_get_void(const num_get *this, istreambuf_iterator_char *ret,
6715 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, void **pval)
6717 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6718 return call_num_get_char_do_get_void(this, ret, first, last, base, state, pval);
6721 /* ?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 */
6722 /* ?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 */
6723 /* ?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 */
6724 /* ?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 */
6725 #if _MSVCP_VER <= 100
6726 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
6727 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6728 (this, ret, first, last, base, state, pval))
6729 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
6730 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6731 (this, ret, first, last, base, state, pval))
6732 #else
6733 #define call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6734 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6735 (this, ret, first, last, base, state, pval))
6736 #define call_num_get_char_do_get_double(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6737 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, double*), \
6738 (this, ret, first, last, base, state, pval))
6739 #endif
6740 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_double,36)
6741 istreambuf_iterator_char *__thiscall num_get_char_do_get_double(const num_get *this, istreambuf_iterator_char *ret,
6742 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6744 double v;
6745 char tmp[32], *end;
6746 int err;
6748 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6750 v = _Stodx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6751 if(end!=tmp && !err)
6752 *pval = v;
6753 else
6754 *state |= IOSTATE_failbit;
6756 if(!first.strbuf)
6757 *state |= IOSTATE_eofbit;
6759 *ret = first;
6760 return ret;
6763 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z */
6764 /* ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z */
6765 DEFINE_THISCALL_WRAPPER(num_get_char_get_ldouble,36)
6766 istreambuf_iterator_char *__thiscall num_get_char_get_ldouble(const num_get *this, istreambuf_iterator_char *ret,
6767 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6769 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6770 return call_num_get_char_do_get_ldouble(this, ret, first, last, base, state, pval);
6773 /* ?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 */
6774 /* ?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 */
6775 DEFINE_THISCALL_WRAPPER(num_get_char_get_double,36)
6776 istreambuf_iterator_char *__thiscall num_get_char_get_double(const num_get *this, istreambuf_iterator_char *ret,
6777 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, double *pval)
6779 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6780 return call_num_get_char_do_get_double(this, ret, first, last, base, state, pval);
6783 /* ?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 */
6784 /* ?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 */
6785 #if _MSVCP_VER <= 100
6786 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
6787 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6788 (this, ret, first, last, base, state, pval))
6789 #else
6790 #define call_num_get_char_do_get_float(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6791 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, float*), \
6792 (this, ret, first, last, base, state, pval))
6793 #endif
6794 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_float,36)
6795 istreambuf_iterator_char *__thiscall num_get_char_do_get_float(const num_get *this, istreambuf_iterator_char *ret,
6796 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6798 float v;
6799 char tmp[32], *end;
6800 int err;
6802 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6804 v = _Stofx(tmp, &end, num_get_char__Getffld(this, tmp, &first, &last, IOS_LOCALE(base)), &err);
6805 if(end!=tmp && !err)
6806 *pval = v;
6807 else
6808 *state |= IOSTATE_failbit;
6810 if(!first.strbuf)
6811 *state |= IOSTATE_eofbit;
6813 *ret = first;
6814 return ret;
6817 /* ?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 */
6818 /* ?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 */
6819 DEFINE_THISCALL_WRAPPER(num_get_char_get_float,36)
6820 istreambuf_iterator_char *__thiscall num_get_char_get_float(const num_get *this, istreambuf_iterator_char *ret,
6821 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, float *pval)
6823 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6824 return call_num_get_char_do_get_float(this, ret, first, last, base, state, pval);
6827 /* ?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 */
6828 /* ?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 */
6829 #if _MSVCP_VER <= 100
6830 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
6831 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6832 (this, ret, first, last, base, state, pval))
6833 #else
6834 #define call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6835 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONGLONG*), \
6836 (this, ret, first, last, base, state, pval))
6837 #endif
6838 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint64,36)
6839 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6840 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6842 unsigned __int64 v;
6843 char tmp[25], *end;
6844 int err;
6846 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6848 v = _Stoullx(tmp, &end, num_get_char__Getifld(this, tmp,
6849 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6850 if(end!=tmp && !err)
6851 *pval = v;
6852 else
6853 *state |= IOSTATE_failbit;
6855 if(!first.strbuf)
6856 *state |= IOSTATE_eofbit;
6858 *ret = first;
6859 return ret;
6862 /* ?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 */
6863 /* ?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 */
6864 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint64,36)
6865 istreambuf_iterator_char *__thiscall num_get_char_get_uint64(const num_get *this, istreambuf_iterator_char *ret,
6866 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONGLONG *pval)
6868 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6869 return call_num_get_char_do_get_uint64(this, ret, first, last, base, state, pval);
6872 /* ?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 */
6873 /* ?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 */
6874 #if _MSVCP_VER <= 100
6875 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
6876 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6877 (this, ret, first, last, base, state, pval))
6878 #else
6879 #define call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6880 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONGLONG*), \
6881 (this, ret, first, last, base, state, pval))
6882 #endif
6883 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_int64,36)
6884 istreambuf_iterator_char *__thiscall num_get_char_do_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6885 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6887 __int64 v;
6888 char tmp[25], *end;
6889 int err;
6891 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6893 v = _Stollx(tmp, &end, num_get_char__Getifld(this, tmp,
6894 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6895 if(end!=tmp && !err)
6896 *pval = v;
6897 else
6898 *state |= IOSTATE_failbit;
6900 if(!first.strbuf)
6901 *state |= IOSTATE_eofbit;
6903 *ret = first;
6904 return ret;
6907 /* ?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 */
6908 /* ?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 */
6909 DEFINE_THISCALL_WRAPPER(num_get_char_get_int64,36)
6910 istreambuf_iterator_char *__thiscall num_get_char_get_int64(const num_get *this, istreambuf_iterator_char *ret,
6911 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONGLONG *pval)
6913 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6914 return call_num_get_char_do_get_int64(this, ret, first, last, base, state, pval);
6917 /* ?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 */
6918 /* ?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 */
6919 #if _MSVCP_VER <= 100
6920 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
6921 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6922 (this, ret, first, last, base, state, pval))
6923 #else
6924 #define call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
6925 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, ULONG*), \
6926 (this, ret, first, last, base, state, pval))
6927 #endif
6928 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ulong,36)
6929 istreambuf_iterator_char *__thiscall num_get_char_do_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6930 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6932 ULONG v;
6933 char tmp[25], *end;
6934 int err;
6936 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6938 v = _Stoulx(tmp, &end, num_get_char__Getifld(this, tmp,
6939 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6940 if(end!=tmp && !err)
6941 *pval = v;
6942 else
6943 *state |= IOSTATE_failbit;
6945 if(!first.strbuf)
6946 *state |= IOSTATE_eofbit;
6948 *ret = first;
6949 return ret;
6952 /* ?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 */
6953 /* ?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 */
6954 DEFINE_THISCALL_WRAPPER(num_get_char_get_ulong,36)
6955 istreambuf_iterator_char *__thiscall num_get_char_get_ulong(const num_get *this, istreambuf_iterator_char *ret,
6956 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, ULONG *pval)
6958 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6959 return call_num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
6962 /* ?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 */
6963 /* ?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 */
6964 #if _MSVCP_VER <= 100
6965 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
6966 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6967 (this, ret, first, last, base, state, pval))
6968 #else
6969 #define call_num_get_char_do_get_long(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
6970 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, LONG*), \
6971 (this, ret, first, last, base, state, pval))
6972 #endif
6973 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_long,36)
6974 istreambuf_iterator_char *__thiscall num_get_char_do_get_long(const num_get *this, istreambuf_iterator_char *ret,
6975 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
6977 LONG v;
6978 char tmp[25], *end;
6979 int err;
6981 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
6983 v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
6984 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
6985 if(end!=tmp && !err)
6986 *pval = v;
6987 else
6988 *state |= IOSTATE_failbit;
6990 if(!first.strbuf)
6991 *state |= IOSTATE_eofbit;
6993 *ret = first;
6994 return ret;
6997 /* ?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 */
6998 /* ?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 */
6999 DEFINE_THISCALL_WRAPPER(num_get_char_get_long,36)
7000 istreambuf_iterator_char *__thiscall num_get_char_get_long(const num_get *this, istreambuf_iterator_char *ret,
7001 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, LONG *pval)
7003 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7004 return call_num_get_char_do_get_long(this, ret, first, last, base, state, pval);
7007 /* ?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 */
7008 /* ?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 */
7009 #if _MSVCP_VER <= 100
7010 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
7011 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
7012 (this, ret, first, last, base, state, pval))
7013 #else
7014 #define call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
7015 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned int*), \
7016 (this, ret, first, last, base, state, pval))
7017 #endif
7018 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_uint,36)
7019 istreambuf_iterator_char *__thiscall num_get_char_do_get_uint(const num_get *this, istreambuf_iterator_char *ret,
7020 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
7022 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7023 return num_get_char_do_get_ulong(this, ret, first, last, base, state, pval);
7026 /* ?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 */
7027 /* ?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 */
7028 DEFINE_THISCALL_WRAPPER(num_get_char_get_uint,36)
7029 istreambuf_iterator_char *__thiscall num_get_char_get_uint(const num_get *this, istreambuf_iterator_char *ret,
7030 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned int *pval)
7032 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7033 return call_num_get_char_do_get_uint(this, ret, first, last, base, state, pval);
7036 /* ?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 */
7037 /* ?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 */
7038 #if _MSVCP_VER <= 100
7039 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 40, istreambuf_iterator_char*, \
7040 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
7041 (this, ret, first, last, base, state, pval))
7042 #else
7043 #define call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 48, istreambuf_iterator_char*, \
7044 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, unsigned short*), \
7045 (this, ret, first, last, base, state, pval))
7046 #endif
7047 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_ushort,36)
7048 istreambuf_iterator_char *__thiscall num_get_char_do_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
7049 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
7051 ULONG v;
7052 char tmp[25], *beg, *end;
7053 int err, b;
7055 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7057 b = num_get_char__Getifld(this, tmp,
7058 &first, &last, base->fmtfl, IOS_LOCALE(base));
7059 beg = tmp + (tmp[0]=='-' ? 1 : 0);
7060 v = _Stoulx(beg, &end, b, &err);
7062 if(v != (ULONG)((unsigned short)v))
7063 *state |= IOSTATE_failbit;
7064 else if(end!=beg && !err)
7065 *pval = (tmp[0]=='-' ? -((unsigned short)v) : v);
7066 else
7067 *state |= IOSTATE_failbit;
7069 if(!first.strbuf)
7070 *state |= IOSTATE_eofbit;
7072 *ret = first;
7073 return ret;
7076 /* ?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 */
7077 /* ?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 */
7078 DEFINE_THISCALL_WRAPPER(num_get_char_get_ushort,36)
7079 istreambuf_iterator_char *__thiscall num_get_char_get_ushort(const num_get *this, istreambuf_iterator_char *ret,
7080 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, unsigned short *pval)
7082 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7083 return call_num_get_char_do_get_ushort(this, ret, first, last, base, state, pval);
7086 /* ?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 */
7087 /* ?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 */
7088 #if _MSVCP_VER <= 100
7089 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 44, istreambuf_iterator_char*, \
7090 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, bool*), \
7091 (this, ret, first, last, base, state, pval))
7092 #else
7093 #define call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval) CALL_VTBL_FUNC(this, 52, istreambuf_iterator_char*, \
7094 (const num_get*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, bool*), \
7095 (this, ret, first, last, base, state, pval))
7096 #endif
7097 DEFINE_THISCALL_WRAPPER(num_get_char_do_get_bool,36)
7098 istreambuf_iterator_char *__thiscall num_get_char_do_get_bool(const num_get *this, istreambuf_iterator_char *ret,
7099 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, bool *pval)
7101 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7103 if(base->fmtfl & FMTFLAG_boolalpha) {
7104 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7105 basic_string_char false_bstr, true_bstr;
7106 const char *pfalse, *ptrue;
7108 numpunct_char_falsename(numpunct, &false_bstr);
7109 numpunct_char_truename(numpunct, &true_bstr);
7110 pfalse = MSVCP_basic_string_char_c_str(&false_bstr);
7111 ptrue = MSVCP_basic_string_char_c_str(&true_bstr);
7113 for(istreambuf_iterator_char_val(&first); first.strbuf;) {
7114 if(pfalse && *pfalse && first.val!=*pfalse)
7115 pfalse = NULL;
7116 if(ptrue && *ptrue && first.val!=*ptrue)
7117 ptrue = NULL;
7119 if(pfalse && *pfalse && ptrue && !*ptrue)
7120 ptrue = NULL;
7121 if(ptrue && *ptrue && pfalse && !*pfalse)
7122 pfalse = NULL;
7124 if(pfalse)
7125 pfalse++;
7126 if(ptrue)
7127 ptrue++;
7129 if(pfalse || ptrue)
7130 istreambuf_iterator_char_inc(&first);
7132 if((!pfalse || !*pfalse) && (!ptrue || !*ptrue))
7133 break;
7136 if(ptrue)
7137 *pval = TRUE;
7138 else if(pfalse)
7139 *pval = FALSE;
7140 else
7141 *state |= IOSTATE_failbit;
7143 MSVCP_basic_string_char_dtor(&false_bstr);
7144 MSVCP_basic_string_char_dtor(&true_bstr);
7145 }else {
7146 char tmp[25], *end;
7147 int err;
7148 LONG v = _Stolx(tmp, &end, num_get_char__Getifld(this, tmp,
7149 &first, &last, base->fmtfl, IOS_LOCALE(base)), &err);
7151 if(end!=tmp && err==0 && (v==0 || v==1))
7152 *pval = v;
7153 else
7154 *state |= IOSTATE_failbit;
7157 if(!first.strbuf)
7158 *state |= IOSTATE_eofbit;
7159 memcpy(ret, &first, sizeof(first));
7160 return ret;
7163 /* ?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 */
7164 /* ?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 */
7165 DEFINE_THISCALL_WRAPPER(num_get_char_get_bool,36)
7166 istreambuf_iterator_char *__thiscall num_get_char_get_bool(const num_get *this, istreambuf_iterator_char *ret,
7167 istreambuf_iterator_char first, istreambuf_iterator_char last, ios_base *base, int *state, bool *pval)
7169 TRACE("(%p %p %p %p %p)\n", this, ret, base, state, pval);
7170 return call_num_get_char_do_get_bool(this, ret, first, last, base, state, pval);
7173 /* ?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
7174 locale_id num_put_char_id = {0};
7176 /* num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
7177 extern const vtable_ptr num_put_char_vtable;
7179 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7180 /* ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7181 DEFINE_THISCALL_WRAPPER(num_put_char__Init, 8)
7182 void __thiscall num_put_char__Init(num_put *this, const _Locinfo *locinfo)
7184 TRACE("(%p %p)\n", this, locinfo);
7185 #if _MSVCP_VER < 110
7186 _Locinfo__Getcvt(locinfo, &this->cvt);
7187 #endif
7190 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7191 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7192 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_locinfo, 12)
7193 num_put* __thiscall num_put_char_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7195 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
7197 locale_facet_ctor_refs(&this->facet, refs);
7198 this->facet.vtable = &num_put_char_vtable;
7200 num_put_char__Init(this, locinfo);
7201 return this;
7204 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
7205 /* ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
7206 DEFINE_THISCALL_WRAPPER(num_put_char_ctor_refs, 8)
7207 num_put* __thiscall num_put_char_ctor_refs(num_put *this, size_t refs)
7209 _Locinfo locinfo;
7211 TRACE("(%p %Iu)\n", this, refs);
7213 _Locinfo_ctor(&locinfo);
7214 num_put_char_ctor_locinfo(this, &locinfo, refs);
7215 _Locinfo_dtor(&locinfo);
7216 return this;
7219 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
7220 /* ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
7221 DEFINE_THISCALL_WRAPPER(num_put_char_ctor, 4)
7222 num_put* __thiscall num_put_char_ctor(num_put *this)
7224 return num_put_char_ctor_refs(this, 0);
7227 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UAE@XZ */
7228 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@UEAA@XZ */
7229 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
7230 /* ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
7231 DEFINE_THISCALL_WRAPPER(num_put_char_dtor, 4)
7232 void __thiscall num_put_char_dtor(num_put *this)
7234 TRACE("(%p)\n", this);
7235 locale_facet_dtor(&this->facet);
7238 DEFINE_THISCALL_WRAPPER(num_put_char_vector_dtor, 8)
7239 num_put* __thiscall num_put_char_vector_dtor(num_put *this, unsigned int flags)
7241 TRACE("(%p %x)\n", this, flags);
7242 if(flags & 2) {
7243 /* we have an array, with the number of elements stored before the first object */
7244 INT_PTR i, *ptr = (INT_PTR *)this-1;
7246 for(i=*ptr-1; i>=0; i--)
7247 num_put_char_dtor(this+i);
7248 MSVCRT_operator_delete(ptr);
7249 } else {
7250 num_put_char_dtor(this);
7251 if(flags & 1)
7252 MSVCRT_operator_delete(this);
7255 return this;
7258 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
7259 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
7260 size_t __cdecl num_put_char__Getcat(const locale_facet **facet, const locale *loc)
7262 TRACE("(%p %p)\n", facet, loc);
7264 if(facet && !*facet) {
7265 _Locinfo locinfo;
7267 *facet = MSVCRT_operator_new(sizeof(num_put));
7268 if(!*facet) {
7269 ERR("Out of memory\n");
7270 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
7271 return 0;
7274 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
7275 num_put_char_ctor_locinfo((num_put*)*facet, &locinfo, 0);
7276 _Locinfo_dtor(&locinfo);
7279 return LC_NUMERIC;
7282 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
7283 /* ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
7284 size_t __cdecl num_put_char__Getcat_old(const locale_facet **facet)
7286 return num_put_char__Getcat(facet, locale_classic());
7289 num_put* num_put_char_use_facet(const locale *loc)
7291 static num_put *obj = NULL;
7293 _Lockit lock;
7294 const locale_facet *fac;
7296 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
7297 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_char_id));
7298 if(fac) {
7299 _Lockit_dtor(&lock);
7300 return (num_put*)fac;
7303 if(obj) {
7304 _Lockit_dtor(&lock);
7305 return obj;
7308 num_put_char__Getcat(&fac, loc);
7309 obj = (num_put*)fac;
7310 call_locale_facet__Incref(&obj->facet);
7311 locale_facet_register(&obj->facet);
7312 _Lockit_dtor(&lock);
7314 return obj;
7317 /* ?_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 */
7318 /* ?_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 */
7319 ostreambuf_iterator_char* __cdecl num_put_char__Put(const num_put *this, ostreambuf_iterator_char *ret,
7320 ostreambuf_iterator_char dest, const char *ptr, size_t count)
7322 TRACE("(%p %p %p %Iu)\n", this, ret, ptr, count);
7324 for(; count>0; count--)
7325 ostreambuf_iterator_char_put(&dest, *ptr++);
7327 *ret = dest;
7328 return ret;
7331 /* ?_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 */
7332 /* ?_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 */
7333 ostreambuf_iterator_char* __cdecl num_put_char__Putc(const num_put *this, ostreambuf_iterator_char *ret,
7334 ostreambuf_iterator_char dest, const char *ptr, size_t count)
7336 TRACE("(%p %p %p %Iu)\n", this, ret, ptr, count);
7338 for(; count>0; count--)
7339 ostreambuf_iterator_char_put(&dest, *ptr++);
7341 *ret = dest;
7342 return ret;
7345 /* ?_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 */
7346 /* ?_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 */
7347 ostreambuf_iterator_char* __cdecl num_put_char__Putgrouped(const num_put *this, ostreambuf_iterator_char *ret,
7348 ostreambuf_iterator_char dest, const char *ptr, size_t count, char delim)
7350 FIXME("(%p %p %p %Iu %d) stub\n", this, ret, ptr, count, delim);
7351 return NULL;
7354 /* ?_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 */
7355 /* ?_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 */
7356 ostreambuf_iterator_char* __cdecl num_put_char__Rep(const num_put *this, ostreambuf_iterator_char *ret,
7357 ostreambuf_iterator_char dest, char c, size_t count)
7359 TRACE("(%p %p %d %Iu)\n", this, ret, c, count);
7361 for(; count>0; count--)
7362 ostreambuf_iterator_char_put(&dest, c);
7364 *ret = dest;
7365 return ret;
7368 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADDH@Z */
7369 /* ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADDH@Z */
7370 char* __cdecl num_put_char__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
7372 int type = fmtfl & FMTFLAG_floatfield;
7373 char *p = fmt;
7375 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
7377 *p++ = '%';
7378 if(fmtfl & FMTFLAG_showpos)
7379 *p++ = '+';
7380 if(fmtfl & FMTFLAG_showpoint)
7381 *p++ = '#';
7382 *p++ = '.';
7383 *p++ = '*';
7384 if(spec)
7385 *p++ = spec;
7387 if(type == FMTFLAG_fixed)
7388 *p++ = 'f';
7389 else if(type == FMTFLAG_scientific)
7390 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
7391 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
7392 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
7393 else
7394 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
7396 *p++ = '\0';
7397 return fmt;
7400 /* ?_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 */
7401 /* ?_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 */
7402 ostreambuf_iterator_char* __cdecl num_put_char__Fput(const num_put *this, ostreambuf_iterator_char *ret,
7403 ostreambuf_iterator_char dest, ios_base *base, char fill, const char *buf, size_t bef_point,
7404 size_t aft_point, size_t trailing, size_t count)
7406 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
7407 fill, buf, bef_point, aft_point, trailing, count);
7408 return NULL;
7411 /* TODO: This function should be removed when num_put_char__Fput is implemented */
7412 static ostreambuf_iterator_char* num_put_char_fput(const num_put *this, ostreambuf_iterator_char *ret,
7413 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, size_t count)
7415 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7416 basic_string_char grouping_bstr;
7417 const char *grouping;
7418 char *p, sep = 0, dec_point = *localeconv()->decimal_point;
7419 int cur_group = 0, group_size = 0;
7420 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7421 size_t pad;
7423 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
7425 /* Change decimal point */
7426 for(p=buf; p<buf+count; p++) {
7427 if(*p == dec_point) {
7428 *p = numpunct_char_decimal_point(numpunct);
7429 break;
7432 p--;
7434 /* Add separators to number */
7435 numpunct_char_grouping(numpunct, &grouping_bstr);
7436 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7437 #if _MSVCP_VER >= 70
7438 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7439 #endif
7441 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7442 group_size++;
7443 if(group_size == grouping[cur_group]) {
7444 group_size = 0;
7445 if(grouping[cur_group+1])
7446 cur_group++;
7448 memmove(p+1, p, buf+count-p);
7449 *p = sep;
7450 count++;
7453 MSVCP_basic_string_char_dtor(&grouping_bstr);
7455 /* Display number with padding */
7456 if(count >= base->wide)
7457 pad = 0;
7458 else
7459 pad = base->wide-count;
7460 base->wide = 0;
7462 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7463 num_put_char__Putc(this, &dest, dest, buf, 1);
7464 buf++;
7466 if(adjustfield != FMTFLAG_left) {
7467 num_put_char__Rep(this, ret, dest, fill, pad);
7468 pad = 0;
7470 num_put_char__Putc(this, &dest, dest, buf, count);
7471 return num_put_char__Rep(this, ret, dest, fill, pad);
7474 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADPBDH@Z */
7475 /* ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
7476 char* __cdecl num_put_char__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
7478 int base = fmtfl & FMTFLAG_basefield;
7479 char *p = fmt;
7481 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
7483 *p++ = '%';
7484 if(fmtfl & FMTFLAG_showpos)
7485 *p++ = '+';
7486 if(fmtfl & FMTFLAG_showbase)
7487 *p++ = '#';
7489 *p++ = *spec++;
7490 if(*spec == 'l')
7491 *p++ = *spec++;
7493 if(base == FMTFLAG_oct)
7494 *p++ = 'o';
7495 else if(base == FMTFLAG_hex)
7496 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
7497 else
7498 *p++ = *spec;
7500 *p++ = '\0';
7501 return fmt;
7504 /* ?_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 */
7505 /* ?_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 */
7506 ostreambuf_iterator_char* __cdecl num_put_char__Iput(const num_put *this, ostreambuf_iterator_char *ret,
7507 ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, size_t count)
7509 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7510 basic_string_char grouping_bstr;
7511 const char *grouping;
7512 char *p, sep = 0;
7513 int cur_group = 0, group_size = 0;
7514 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
7515 size_t pad;
7517 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
7519 /* Add separators to number */
7520 numpunct_char_grouping(numpunct, &grouping_bstr);
7521 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
7522 #if _MSVCP_VER >= 70
7523 if (grouping[0]) sep = numpunct_char_thousands_sep(numpunct);
7524 #endif
7526 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
7527 group_size++;
7528 if(group_size == grouping[cur_group]) {
7529 group_size = 0;
7530 if(grouping[cur_group+1])
7531 cur_group++;
7533 memmove(p+1, p, buf+count-p);
7534 *p = sep;
7535 count++;
7538 MSVCP_basic_string_char_dtor(&grouping_bstr);
7540 /* Display number with padding */
7541 if(count >= base->wide)
7542 pad = 0;
7543 else
7544 pad = base->wide-count;
7545 base->wide = 0;
7547 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
7548 num_put_char__Putc(this, &dest, dest, buf, 1);
7549 buf++;
7550 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
7551 num_put_char__Putc(this, &dest, dest, buf, 2);
7552 buf += 2;
7554 if(adjustfield != FMTFLAG_left) {
7555 num_put_char__Rep(this, ret, dest, fill, pad);
7556 pad = 0;
7558 num_put_char__Putc(this, &dest, dest, buf, count);
7559 return num_put_char__Rep(this, ret, dest, fill, pad);
7562 /* ?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 */
7563 /* ?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 */
7564 #if _MSVCP_VER <= 100
7565 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7566 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7567 (this, ret, dest, base, fill, v))
7568 #else
7569 #define call_num_put_char_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_char*, \
7570 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, LONG), \
7571 (this, ret, dest, base, fill, v))
7572 #endif
7573 #if _MSVCP_VER != 80
7574 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 28)
7575 #else
7576 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 32)
7577 #endif
7578 ostreambuf_iterator_char* __thiscall num_put_char_do_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7579 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7581 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7582 char fmt[7]; /* strlen("%+#lld")+1 */
7584 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7586 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7587 sprintf(tmp, num_put_char__Ifmt(this, fmt, "ld", base->fmtfl), v));
7590 /* ?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 */
7591 /* ?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 */
7592 #if _MSVCP_VER != 80
7593 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 28)
7594 #else
7595 DEFINE_THISCALL_WRAPPER(num_put_char_put_long, 32)
7596 #endif
7597 ostreambuf_iterator_char* __thiscall num_put_char_put_long(const num_put *this, ostreambuf_iterator_char *ret,
7598 ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
7600 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7601 return call_num_put_char_do_put_long(this, ret, dest, base, fill, v);
7604 /* ?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 */
7605 /* ?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 */
7606 #if _MSVCP_VER <= 100
7607 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7608 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7609 (this, ret, dest, base, fill, v))
7610 #else
7611 #define call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7612 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, ULONG), \
7613 (this, ret, dest, base, fill, v))
7614 #endif
7615 #if _MSVCP_VER != 80
7616 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 28)
7617 #else
7618 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 32)
7619 #endif
7620 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7621 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7623 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7624 char fmt[7]; /* strlen("%+#lld")+1 */
7626 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7628 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7629 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lu", base->fmtfl), v));
7632 /* ?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 */
7633 /* ?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 */
7634 #if _MSVCP_VER != 80
7635 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 28)
7636 #else
7637 DEFINE_THISCALL_WRAPPER(num_put_char_put_ulong, 32)
7638 #endif
7639 ostreambuf_iterator_char* __thiscall num_put_char_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
7640 ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
7642 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7643 return call_num_put_char_do_put_ulong(this, ret, dest, base, fill, v);
7646 static inline unsigned get_precision(const ios_base *base)
7648 streamsize ret = base->prec <= 0 && !(base->fmtfl & FMTFLAG_fixed) ? 6 : base->prec;
7649 if(ret > UINT_MAX)
7650 ret = UINT_MAX;
7651 return ret;
7654 /* ?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 */
7655 /* ?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 */
7656 /* ?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 */
7657 /* ?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 */
7658 #if _MSVCP_VER <= 100
7659 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7660 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7661 (this, ret, dest, base, fill, v))
7662 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_char*, \
7663 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7664 (this, ret, dest, base, fill, v))
7665 #else
7666 #define call_num_put_char_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7667 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7668 (this, ret, dest, base, fill, v))
7669 #define call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7670 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, double), \
7671 (this, ret, dest, base, fill, v))
7672 #endif
7673 #if _MSVCP_VER != 80
7674 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 32)
7675 #else
7676 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_double, 36)
7677 #endif
7678 ostreambuf_iterator_char* __thiscall num_put_char_do_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7679 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7681 char *tmp;
7682 char fmt[8]; /* strlen("%+#.*lg")+1 */
7683 int size;
7684 unsigned prec;
7686 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7688 num_put_char__Ffmt(this, fmt, '\0', base->fmtfl);
7689 prec = get_precision(base);
7690 size = _scprintf(fmt, prec, v);
7692 /* TODO: don't use dynamic allocation */
7693 tmp = MSVCRT_operator_new(size*2);
7694 if(!tmp) {
7695 ERR("Out of memory\n");
7696 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
7698 num_put_char_fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v));
7699 MSVCRT_operator_delete(tmp);
7700 return ret;
7703 /* ?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 */
7704 /* ?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 */
7705 #if _MSVCP_VER != 80
7706 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 32)
7707 #else
7708 DEFINE_THISCALL_WRAPPER(num_put_char_put_double, 36)
7709 #endif
7710 ostreambuf_iterator_char* __thiscall num_put_char_put_double(const num_put *this, ostreambuf_iterator_char *ret,
7711 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7713 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7714 return call_num_put_char_do_put_double(this, ret, dest, base, fill, v);
7717 /* ?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 */
7718 /* ?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 */
7719 #if _MSVCP_VER != 80
7720 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 32)
7721 #else
7722 DEFINE_THISCALL_WRAPPER(num_put_char_put_ldouble, 36)
7723 #endif
7724 ostreambuf_iterator_char* __thiscall num_put_char_put_ldouble(const num_put *this, ostreambuf_iterator_char *ret,
7725 ostreambuf_iterator_char dest, ios_base *base, char fill, double v)
7727 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
7728 return call_num_put_char_do_put_ldouble(this, ret, dest, base, fill, v);
7731 /* ?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 */
7732 /* ?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 */
7733 #if _MSVCP_VER <= 100
7734 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
7735 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7736 (this, ret, dest, base, fill, v))
7737 #else
7738 #define call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
7739 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const void*), \
7740 (this, ret, dest, base, fill, v))
7741 #endif
7742 #if _MSVCP_VER != 80
7743 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 28)
7744 #else
7745 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 32)
7746 #endif
7747 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7748 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7750 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
7752 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7754 return num_put_char__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
7757 /* ?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 */
7758 /* ?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 */
7759 #if _MSVCP_VER != 80
7760 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 28)
7761 #else
7762 DEFINE_THISCALL_WRAPPER(num_put_char_put_ptr, 32)
7763 #endif
7764 ostreambuf_iterator_char* __thiscall num_put_char_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
7765 ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
7767 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
7768 return call_num_put_char_do_put_ptr(this, ret, dest, base, fill, v);
7771 /* ?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 */
7772 /* ?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 */
7773 #if _MSVCP_VER <= 100
7774 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_char*, \
7775 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7776 (this, ret, dest, base, fill, v))
7777 #else
7778 #define call_num_put_char_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_char*, \
7779 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, __int64), \
7780 (this, ret, dest, base, fill, v))
7781 #endif
7782 #if _MSVCP_VER != 80
7783 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 32)
7784 #else
7785 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 36)
7786 #endif
7787 ostreambuf_iterator_char* __thiscall num_put_char_do_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7788 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7790 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7791 char fmt[7]; /* strlen("%+#lld")+1 */
7793 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7795 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7796 sprintf(tmp, num_put_char__Ifmt(this, fmt, "lld", base->fmtfl), v));
7799 /* ?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 */
7800 /* ?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 */
7801 #if _MSVCP_VER != 80
7802 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 32)
7803 #else
7804 DEFINE_THISCALL_WRAPPER(num_put_char_put_int64, 36)
7805 #endif
7806 ostreambuf_iterator_char* __thiscall num_put_char_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
7807 ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
7809 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7810 return call_num_put_char_do_put_int64(this, ret, dest, base, fill, v);
7813 /* ?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 */
7814 /* ?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 */
7815 #if _MSVCP_VER <= 100
7816 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_char*, \
7817 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7818 (this, ret, dest, base, fill, v))
7819 #else
7820 #define call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_char*, \
7821 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, unsigned __int64), \
7822 (this, ret, dest, base, fill, v))
7823 #endif
7824 #if _MSVCP_VER != 80
7825 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 32)
7826 #else
7827 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 36)
7828 #endif
7829 ostreambuf_iterator_char* __thiscall num_put_char_do_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7830 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7832 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
7833 char fmt[7]; /* strlen("%+#lld")+1 */
7835 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7837 return num_put_char__Iput(this, ret, dest, base, fill, tmp,
7838 sprintf(tmp, num_put_char__Ifmt(this, fmt, "llu", base->fmtfl), v));
7841 /* ?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 */
7842 /* ?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 */
7843 #if _MSVCP_VER != 80
7844 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 32)
7845 #else
7846 DEFINE_THISCALL_WRAPPER(num_put_char_put_uint64, 36)
7847 #endif
7848 ostreambuf_iterator_char* __thiscall num_put_char_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
7849 ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
7851 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
7852 return call_num_put_char_do_put_uint64(this, ret, dest, base, fill, v);
7855 /* ?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 */
7856 /* ?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 */
7857 #if _MSVCP_VER <= 100
7858 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_char*, \
7859 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, bool), \
7860 (this, ret, dest, base, fill, v))
7861 #else
7862 #define call_num_put_char_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_char*, \
7863 (const num_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, bool), \
7864 (this, ret, dest, base, fill, v))
7865 #endif
7866 #if _MSVCP_VER != 80
7867 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 28)
7868 #else
7869 DEFINE_THISCALL_WRAPPER(num_put_char_do_put_bool, 32)
7870 #endif
7871 ostreambuf_iterator_char* __thiscall num_put_char_do_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7872 ostreambuf_iterator_char dest, ios_base *base, char fill, bool v)
7874 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7876 if(base->fmtfl & FMTFLAG_boolalpha) {
7877 numpunct_char *numpunct = numpunct_char_use_facet(IOS_LOCALE(base));
7878 basic_string_char str;
7879 size_t pad, len;
7881 if(v)
7882 numpunct_char_truename(numpunct, &str);
7883 else
7884 numpunct_char_falsename(numpunct, &str);
7886 len = MSVCP_basic_string_char_length(&str);
7887 pad = (len>base->wide ? 0 : base->wide-len);
7888 base->wide = 0;
7890 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
7891 num_put_char__Rep(this, &dest, dest, fill, pad);
7892 pad = 0;
7894 num_put_char__Putc(this, &dest, dest, MSVCP_basic_string_char_c_str(&str), len);
7895 MSVCP_basic_string_char_dtor(&str);
7896 return num_put_char__Rep(this, ret, dest, fill, pad);
7899 return num_put_char_put_long(this, ret, dest, base, fill, v);
7902 /* ?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 */
7903 /* ?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 */
7904 #if _MSVCP_VER != 80
7905 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 28)
7906 #else
7907 DEFINE_THISCALL_WRAPPER(num_put_char_put_bool, 32)
7908 #endif
7909 ostreambuf_iterator_char* __thiscall num_put_char_put_bool(const num_put *this, ostreambuf_iterator_char *ret,
7910 ostreambuf_iterator_char dest, ios_base *base, char fill, bool v)
7912 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
7913 return call_num_put_char_do_put_bool(this, ret, dest, base, fill, v);
7916 /* ?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
7917 locale_id num_put_wchar_id = {0};
7918 /* ?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
7919 locale_id num_put_short_id = {0};
7921 /* num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
7922 extern const vtable_ptr num_put_wchar_vtable;
7923 /* num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
7924 extern const vtable_ptr num_put_short_vtable;
7926 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
7927 /* ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
7928 DEFINE_THISCALL_WRAPPER(num_put_wchar__Init, 8)
7929 void __thiscall num_put_wchar__Init(num_put *this, const _Locinfo *locinfo)
7931 TRACE("(%p %p)\n", this, locinfo);
7932 #if _MSVCP_VER < 110
7933 _Locinfo__Getcvt(locinfo, &this->cvt);
7934 #endif
7937 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7938 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7939 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_locinfo, 12)
7940 num_put* __thiscall num_put_wchar_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7942 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
7944 locale_facet_ctor_refs(&this->facet, refs);
7945 this->facet.vtable = &num_put_wchar_vtable;
7947 num_put_wchar__Init(this, locinfo);
7948 return this;
7951 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
7952 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
7953 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_locinfo, 12)
7954 num_put* __thiscall num_put_short_ctor_locinfo(num_put *this, const _Locinfo *locinfo, size_t refs)
7956 num_put_wchar_ctor_locinfo(this, locinfo, refs);
7957 this->facet.vtable = &num_put_short_vtable;
7958 return this;
7961 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
7962 /* ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
7963 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor_refs, 8)
7964 num_put* __thiscall num_put_wchar_ctor_refs(num_put *this, size_t refs)
7966 _Locinfo locinfo;
7968 TRACE("(%p %Iu)\n", this, refs);
7970 _Locinfo_ctor(&locinfo);
7971 num_put_wchar_ctor_locinfo(this, &locinfo, refs);
7972 _Locinfo_dtor(&locinfo);
7973 return this;
7976 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
7977 /* ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
7978 DEFINE_THISCALL_WRAPPER(num_put_short_ctor_refs, 8)
7979 num_put* __thiscall num_put_short_ctor_refs(num_put *this, size_t refs)
7981 num_put_wchar_ctor_refs(this, refs);
7982 this->facet.vtable = &num_put_short_vtable;
7983 return this;
7986 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
7987 /* ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
7988 DEFINE_THISCALL_WRAPPER(num_put_wchar_ctor, 4)
7989 num_put* __thiscall num_put_wchar_ctor(num_put *this)
7991 return num_put_wchar_ctor_refs(this, 0);
7994 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
7995 /* ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
7996 DEFINE_THISCALL_WRAPPER(num_put_short_ctor, 4)
7997 num_put* __thiscall num_put_short_ctor(num_put *this)
7999 return num_put_short_ctor_refs(this, 0);
8002 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UAE@XZ */
8003 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@UEAA@XZ */
8004 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
8005 /* ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
8006 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
8007 /* ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
8008 DEFINE_THISCALL_WRAPPER(num_put_wchar_dtor, 4)
8009 void __thiscall num_put_wchar_dtor(num_put *this)
8011 TRACE("(%p)\n", this);
8012 locale_facet_dtor(&this->facet);
8015 DEFINE_THISCALL_WRAPPER(num_put_wchar_vector_dtor, 8)
8016 num_put* __thiscall num_put_wchar_vector_dtor(num_put *this, unsigned int flags)
8018 TRACE("(%p %x)\n", this, flags);
8019 if(flags & 2) {
8020 /* we have an array, with the number of elements stored before the first object */
8021 INT_PTR i, *ptr = (INT_PTR *)this-1;
8023 for(i=*ptr-1; i>=0; i--)
8024 num_put_wchar_dtor(this+i);
8025 MSVCRT_operator_delete(ptr);
8026 } else {
8027 num_put_wchar_dtor(this);
8028 if(flags & 1)
8029 MSVCRT_operator_delete(this);
8032 return this;
8035 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
8036 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
8037 size_t __cdecl num_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
8039 TRACE("(%p %p)\n", facet, loc);
8041 if(facet && !*facet) {
8042 _Locinfo locinfo;
8044 *facet = MSVCRT_operator_new(sizeof(num_put));
8045 if(!*facet) {
8046 ERR("Out of memory\n");
8047 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8048 return 0;
8051 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
8052 num_put_wchar_ctor_locinfo((num_put*)*facet, &locinfo, 0);
8053 _Locinfo_dtor(&locinfo);
8056 return LC_NUMERIC;
8059 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
8060 /* ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
8061 size_t __cdecl num_put_wchar__Getcat_old(const locale_facet **facet)
8063 return num_put_wchar__Getcat(facet, locale_classic());
8066 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
8067 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
8068 size_t __cdecl num_put_short__Getcat(const locale_facet **facet, const locale *loc)
8070 TRACE("(%p %p)\n", facet, loc);
8072 if(facet && !*facet) {
8073 _Locinfo locinfo;
8075 *facet = MSVCRT_operator_new(sizeof(num_put));
8076 if(!*facet) {
8077 ERR("Out of memory\n");
8078 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8079 return 0;
8082 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
8083 num_put_short_ctor_locinfo((num_put*)*facet, &locinfo, 0);
8084 _Locinfo_dtor(&locinfo);
8087 return LC_NUMERIC;
8090 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
8091 /* ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
8092 size_t __cdecl num_put_short__Getcat_old(const locale_facet **facet)
8094 return num_put_short__Getcat(facet, locale_classic());
8097 num_put* num_put_wchar_use_facet(const locale *loc)
8099 static num_put *obj = NULL;
8101 _Lockit lock;
8102 const locale_facet *fac;
8104 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8105 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_wchar_id));
8106 if(fac) {
8107 _Lockit_dtor(&lock);
8108 return (num_put*)fac;
8111 if(obj) {
8112 _Lockit_dtor(&lock);
8113 return obj;
8116 num_put_wchar__Getcat(&fac, loc);
8117 obj = (num_put*)fac;
8118 call_locale_facet__Incref(&obj->facet);
8119 locale_facet_register(&obj->facet);
8120 _Lockit_dtor(&lock);
8122 return obj;
8125 num_put* num_put_short_use_facet(const locale *loc)
8127 static num_put *obj = NULL;
8129 _Lockit lock;
8130 const locale_facet *fac;
8132 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
8133 fac = locale__Getfacet(loc, locale_id_operator_size_t(&num_put_short_id));
8134 if(fac) {
8135 _Lockit_dtor(&lock);
8136 return (num_put*)fac;
8139 if(obj) {
8140 _Lockit_dtor(&lock);
8141 return obj;
8144 num_put_short__Getcat(&fac, loc);
8145 obj = (num_put*)fac;
8146 call_locale_facet__Incref(&obj->facet);
8147 locale_facet_register(&obj->facet);
8148 _Lockit_dtor(&lock);
8150 return obj;
8153 /* ?_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 */
8154 /* ?_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 */
8155 /* ?_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 */
8156 /* ?_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 */
8157 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Put(const num_put *this, ostreambuf_iterator_wchar *ret,
8158 ostreambuf_iterator_wchar dest, const wchar_t *ptr, size_t count)
8160 TRACE("(%p %p %s %Iu)\n", this, ret, debugstr_wn(ptr, count), count);
8162 for(; count>0; count--)
8163 ostreambuf_iterator_wchar_put(&dest, *ptr++);
8165 *ret = dest;
8166 return ret;
8169 #if _MSVCP_VER < 110
8170 /* ?_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 */
8171 /* ?_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 */
8172 /* ?_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 */
8173 /* ?_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 */
8174 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putc(const num_put *this, ostreambuf_iterator_wchar *ret,
8175 ostreambuf_iterator_wchar dest, const char *ptr, size_t count)
8177 _Mbstatet state;
8178 wchar_t ch;
8180 TRACE("(%p %p %s %Iu)\n", this, ret, debugstr_an(ptr, count), count);
8182 memset(&state, 0, sizeof(state));
8183 for(; count>0; count--) {
8184 if(_Mbrtowc(&ch, ptr++, 1, &state, &this->cvt) == 1)
8185 ostreambuf_iterator_wchar_put(&dest, ch);
8188 *ret = dest;
8189 return ret;
8191 #endif
8193 /* ?_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 */
8194 /* ?_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 */
8195 /* ?_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 */
8196 /* ?_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 */
8197 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Putgrouped(const num_put *this, ostreambuf_iterator_wchar *ret,
8198 ostreambuf_iterator_wchar dest, const char *ptr, size_t count, wchar_t delim)
8200 FIXME("(%p %p %p %Iu %d) stub\n", this, ret, ptr, count, delim);
8201 return NULL;
8204 /* ?_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 */
8205 /* ?_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 */
8206 /* ?_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 */
8207 /* ?_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 */
8208 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Rep(const num_put *this, ostreambuf_iterator_wchar *ret,
8209 ostreambuf_iterator_wchar dest, wchar_t c, size_t count)
8211 TRACE("(%p %p %d %Iu)\n", this, ret, c, count);
8213 for(; count>0; count--)
8214 ostreambuf_iterator_wchar_put(&dest, c);
8216 *ret = dest;
8217 return ret;
8220 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADDH@Z */
8221 /* ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8222 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADDH@Z */
8223 /* ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADDH@Z */
8224 char* __cdecl num_put_wchar__Ffmt(const num_put *this, char *fmt, char spec, int fmtfl)
8226 int type = fmtfl & FMTFLAG_floatfield;
8227 char *p = fmt;
8229 TRACE("(%p %p %d %d)\n", this, fmt, spec, fmtfl);
8231 *p++ = '%';
8232 if(fmtfl & FMTFLAG_showpos)
8233 *p++ = '+';
8234 if(fmtfl & FMTFLAG_showbase)
8235 *p++ = '#';
8236 *p++ = '.';
8237 *p++ = '*';
8238 if(spec)
8239 *p++ = spec;
8241 if(type == FMTFLAG_fixed)
8242 *p++ = 'f';
8243 else if(type == FMTFLAG_scientific)
8244 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'E' : 'e';
8245 else if(type == (FMTFLAG_fixed|FMTFLAG_scientific))
8246 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'A' : 'a';
8247 else
8248 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'G' : 'g';
8250 *p++ = '\0';
8251 return fmt;
8254 /* ?_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 */
8255 /* ?_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 */
8256 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8257 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, size_t bef_point,
8258 size_t aft_point, size_t trailing, size_t count)
8260 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
8261 fill, buf, bef_point, aft_point, trailing, count);
8262 return NULL;
8265 /* ?_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 */
8266 /* ?_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 */
8267 ostreambuf_iterator_wchar* __cdecl num_put_short__Fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8268 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const char *buf, size_t bef_point,
8269 size_t aft_point, size_t trailing, size_t count)
8271 FIXME("(%p %p %p %d %p %Iu %Iu %Iu %Iu) stub\n", this, ret, base,
8272 fill, buf, bef_point, aft_point, trailing, count);
8273 return NULL;
8276 #if _MSVCP_VER < 110
8277 static void num_put_wchar_wide_put(const num_put *this,
8278 ostreambuf_iterator_wchar *dest, ios_base *base,
8279 const char *buf, size_t count)
8281 num_put_wchar__Putc(this, dest, *dest, buf, count);
8283 #else
8284 static void num_put_wchar_wide_put(const num_put *this,
8285 ostreambuf_iterator_wchar *dest, ios_base *base,
8286 const char *buf, size_t count)
8288 ctype_wchar *ctype;
8289 size_t i;
8291 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
8292 for(i=0; i<count; i++)
8293 ostreambuf_iterator_wchar_put(dest, ctype_wchar_widen_ch(ctype, buf[i]));
8295 #endif
8297 /* TODO: This function should be removed when num_put_wchar__Fput is implemented */
8298 static ostreambuf_iterator_wchar* num_put__fput(const num_put *this, ostreambuf_iterator_wchar *ret,
8299 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8300 size_t count, numpunct_wchar *numpunct)
8302 basic_string_char grouping_bstr;
8303 const char *grouping;
8304 char *p, dec_point = *localeconv()->decimal_point;
8305 wchar_t sep = 0;
8306 int cur_group = 0, group_size = 0;
8307 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8308 size_t i, pad;
8310 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
8312 for(p=buf; p<buf+count; p++) {
8313 if(*p == dec_point)
8314 break;
8316 p--;
8318 /* Add separators to number */
8319 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8320 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8321 #if _MSVCP_VER >= 70
8322 if (grouping[0]) sep = numpunct_wchar_thousands_sep(numpunct);
8323 #endif
8325 for(; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8326 group_size++;
8327 if(group_size == grouping[cur_group]) {
8328 group_size = 0;
8329 if(grouping[cur_group+1])
8330 cur_group++;
8332 memmove(p+1, p, buf+count-p);
8333 *p = '\0'; /* mark thousands separator positions */
8334 count++;
8337 MSVCP_basic_string_char_dtor(&grouping_bstr);
8339 /* Display number with padding */
8340 if(count >= base->wide)
8341 pad = 0;
8342 else
8343 pad = base->wide-count;
8344 base->wide = 0;
8346 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8347 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8348 buf++;
8350 if(adjustfield != FMTFLAG_left) {
8351 num_put_wchar__Rep(this, ret, dest, fill, pad);
8352 pad = 0;
8355 for(i=0; i<count; i++) {
8356 if(buf[i] == dec_point)
8357 num_put_wchar__Rep(this, &dest, dest, numpunct_wchar_decimal_point(numpunct), 1);
8358 else if(!buf[i])
8359 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8360 else
8361 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8364 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8367 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADPBDH@Z */
8368 /* ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8369 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADPBDH@Z */
8370 /* ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z */
8371 char* __cdecl num_put_wchar__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
8373 int base = fmtfl & FMTFLAG_basefield;
8374 char *p = fmt;
8376 TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
8378 *p++ = '%';
8379 if(fmtfl & FMTFLAG_showpos)
8380 *p++ = '+';
8381 if(fmtfl & FMTFLAG_showbase)
8382 *p++ = '#';
8384 *p++ = *spec++;
8385 if(*spec == 'l')
8386 *p++ = *spec++;
8388 if(base == FMTFLAG_oct)
8389 *p++ = 'o';
8390 else if(base == FMTFLAG_hex)
8391 *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
8392 else
8393 *p++ = *spec;
8395 *p++ = '\0';
8396 return fmt;
8399 static ostreambuf_iterator_wchar* num_put__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8400 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf,
8401 size_t count, numpunct_wchar *numpunct)
8403 basic_string_char grouping_bstr;
8404 const char *grouping;
8405 char *p;
8406 wchar_t sep;
8407 int cur_group = 0, group_size = 0;
8408 int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
8409 size_t i, pad;
8411 TRACE("(%p %p %p %d %s %Iu)\n", this, ret, base, fill, buf, count);
8413 /* Add separators to number */
8414 numpunct_wchar_grouping(numpunct, &grouping_bstr);
8415 grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
8416 sep = grouping[0] ? numpunct_wchar_thousands_sep(numpunct) : '\0';
8418 for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
8419 group_size++;
8420 if(group_size == grouping[cur_group]) {
8421 group_size = 0;
8422 if(grouping[cur_group+1])
8423 cur_group++;
8425 memmove(p+1, p, buf+count-p);
8426 *p = '\0'; /* mark thousands separator positions */
8427 count++;
8430 MSVCP_basic_string_char_dtor(&grouping_bstr);
8432 /* Display number with padding */
8433 if(count >= base->wide)
8434 pad = 0;
8435 else
8436 pad = base->wide-count;
8437 base->wide = 0;
8439 if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
8440 num_put_wchar_wide_put(this, &dest, base, buf, 1);
8441 buf++;
8442 }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
8443 num_put_wchar_wide_put(this, &dest, base, buf, 2);
8444 buf += 2;
8446 if(adjustfield != FMTFLAG_left) {
8447 num_put_wchar__Rep(this, ret, dest, fill, pad);
8448 pad = 0;
8451 for(i=0; i<count; i++) {
8452 if(!buf[i])
8453 num_put_wchar__Rep(this, &dest, dest, sep, 1);
8454 else
8455 num_put_wchar_wide_put(this, &dest, base, buf+i, 1);
8458 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8461 /* ?_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 */
8462 /* ?_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 */
8463 ostreambuf_iterator_wchar* __cdecl num_put_wchar__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8464 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, size_t count)
8466 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_wchar_use_facet(IOS_LOCALE(base)));
8469 /* ?_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 */
8470 /* ?_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 */
8471 ostreambuf_iterator_wchar* __cdecl num_put_short__Iput(const num_put *this, ostreambuf_iterator_wchar *ret,
8472 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, char *buf, size_t count)
8474 return num_put__Iput(this, ret, dest, base, fill, buf, count, numpunct_short_use_facet(IOS_LOCALE(base)));
8477 /* ?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 */
8478 /* ?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 */
8479 #if _MSVCP_VER <= 100
8480 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8481 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8482 (this, ret, dest, base, fill, v))
8483 #else
8484 #define call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 36, ostreambuf_iterator_wchar*, \
8485 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, LONG), \
8486 (this, ret, dest, base, fill, v))
8487 #endif
8488 #if _MSVCP_VER != 80
8489 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 28)
8490 #else
8491 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_long, 32)
8492 #endif
8493 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8494 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8496 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8497 char fmt[7]; /* strlen("%+#lld")+1 */
8499 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8501 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8502 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8505 /* ?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 */
8506 /* ?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 */
8507 #if _MSVCP_VER != 80
8508 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 28)
8509 #else
8510 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_long, 32)
8511 #endif
8512 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8513 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8515 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8516 char fmt[7]; /* strlen("%+#lld")+1 */
8518 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8520 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8521 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "ld", base->fmtfl), v));
8524 /* ?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 */
8525 /* ?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 */
8526 /* ?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 */
8527 /* ?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 */
8528 #if _MSVCP_VER != 80
8529 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 28)
8530 #else
8531 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_long, 32)
8532 #endif
8533 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_long(const num_put *this, ostreambuf_iterator_wchar *ret,
8534 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, LONG v)
8536 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8537 return call_num_put_wchar_do_put_long(this, ret, dest, base, fill, v);
8540 /* ?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 */
8541 /* ?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 */
8542 #if _MSVCP_VER <= 100
8543 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8544 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8545 (this, ret, dest, base, fill, v))
8546 #else
8547 #define call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8548 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, ULONG), \
8549 (this, ret, dest, base, fill, v))
8550 #endif
8551 #if _MSVCP_VER != 80
8552 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 28)
8553 #else
8554 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ulong, 32)
8555 #endif
8556 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8557 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8559 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8560 char fmt[7]; /* strlen("%+#lld")+1 */
8562 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8564 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8565 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8568 /* ?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 */
8569 /* ?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 */
8570 #if _MSVCP_VER != 80
8571 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 28)
8572 #else
8573 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ulong, 32)
8574 #endif
8575 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8576 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8578 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8579 char fmt[7]; /* strlen("%+#lld")+1 */
8581 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8583 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8584 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lu", base->fmtfl), v));
8587 /* ?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 */
8588 /* ?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 */
8589 /* ?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 */
8590 /* ?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 */
8591 #if _MSVCP_VER != 80
8592 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 28)
8593 #else
8594 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ulong, 32)
8595 #endif
8596 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ulong(const num_put *this, ostreambuf_iterator_wchar *ret,
8597 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, ULONG v)
8599 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8600 return call_num_put_wchar_do_put_ulong(this, ret, dest, base, fill, v);
8603 /* ?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 */
8604 /* ?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 */
8605 /* ?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 */
8606 /* ?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 */
8607 #if _MSVCP_VER <= 100
8608 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8609 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8610 (this, ret, dest, base, fill, v))
8611 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 8, ostreambuf_iterator_wchar*, \
8612 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8613 (this, ret, dest, base, fill, v))
8614 #else
8615 #define call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8616 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8617 (this, ret, dest, base, fill, v))
8618 #define call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8619 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, double), \
8620 (this, ret, dest, base, fill, v))
8621 #endif
8622 #if _MSVCP_VER != 80
8623 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 32)
8624 #else
8625 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_double, 36)
8626 #endif
8627 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8628 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8630 char *tmp;
8631 char fmt[8]; /* strlen("%+#.*lg")+1 */
8632 int size;
8633 unsigned prec;
8635 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8637 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8638 prec = get_precision(base);
8639 size = _scprintf(fmt, prec, v);
8641 /* TODO: don't use dynamic allocation */
8642 tmp = MSVCRT_operator_new(size*2);
8643 if(!tmp) {
8644 ERR("Out of memory\n");
8645 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8647 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8648 numpunct_wchar_use_facet(IOS_LOCALE(base)));
8649 MSVCRT_operator_delete(tmp);
8650 return ret;
8653 /* ?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 */
8654 /* ?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 */
8655 /* ?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 */
8656 /* ?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 */
8657 #if _MSVCP_VER != 80
8658 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 32)
8659 #else
8660 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_double, 36)
8661 #endif
8662 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8663 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8665 char *tmp;
8666 char fmt[8]; /* strlen("%+#.*lg")+1 */
8667 int size;
8668 unsigned prec;
8670 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8672 num_put_wchar__Ffmt(this, fmt, '\0', base->fmtfl);
8673 prec = get_precision(base);
8674 size = _scprintf(fmt, prec, v);
8676 /* TODO: don't use dynamic allocation */
8677 tmp = MSVCRT_operator_new(size*2);
8678 if(!tmp) {
8679 ERR("Out of memory\n");
8680 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
8682 num_put__fput(this, ret, dest, base, fill, tmp, sprintf(tmp, fmt, prec, v),
8683 numpunct_short_use_facet(IOS_LOCALE(base)));
8684 MSVCRT_operator_delete(tmp);
8685 return ret;
8688 /* ?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 */
8689 /* ?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 */
8690 /* ?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 */
8691 /* ?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 */
8692 #if _MSVCP_VER != 80
8693 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 32)
8694 #else
8695 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_double, 36)
8696 #endif
8697 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_double(const num_put *this, ostreambuf_iterator_wchar *ret,
8698 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8700 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8701 return call_num_put_wchar_do_put_double(this, ret, dest, base, fill, v);
8704 /* ?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 */
8705 /* ?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 */
8706 /* ?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 */
8707 /* ?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 */
8708 #if _MSVCP_VER != 80
8709 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 32)
8710 #else
8711 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ldouble, 36)
8712 #endif
8713 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ldouble(const num_put *this, ostreambuf_iterator_wchar *ret,
8714 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, double v)
8716 TRACE("(%p %p %p %d %lf)\n", this, ret, base, fill, v);
8717 return call_num_put_wchar_do_put_ldouble(this, ret, dest, base, fill, v);
8720 /* ?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 */
8721 /* ?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 */
8722 #if _MSVCP_VER <= 100
8723 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
8724 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8725 (this, ret, dest, base, fill, v))
8726 #else
8727 #define call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
8728 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const void*), \
8729 (this, ret, dest, base, fill, v))
8730 #endif
8731 #if _MSVCP_VER != 80
8732 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 28)
8733 #else
8734 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_ptr, 32)
8735 #endif
8736 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8737 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8739 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8741 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8743 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8746 /* ?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 */
8747 /* ?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 */
8748 #if _MSVCP_VER != 80
8749 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 28)
8750 #else
8751 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_ptr, 32)
8752 #endif
8753 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8754 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8756 char tmp[17]; /* 8(16^8==2^64)*2(separators between every digit) + 1 */
8758 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8760 return num_put_short__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
8763 /* ?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 */
8764 /* ?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 */
8765 /* ?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 */
8766 /* ?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 */
8767 #if _MSVCP_VER != 80
8768 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 28)
8769 #else
8770 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_ptr, 32)
8771 #endif
8772 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_ptr(const num_put *this, ostreambuf_iterator_wchar *ret,
8773 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, const void *v)
8775 TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
8776 return call_num_put_wchar_do_put_ptr(this, ret, dest, base, fill, v);
8779 /* ?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 */
8780 /* ?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 */
8781 #if _MSVCP_VER <= 100
8782 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 20, ostreambuf_iterator_wchar*, \
8783 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8784 (this, ret, dest, base, fill, v))
8785 #else
8786 #define call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 28, ostreambuf_iterator_wchar*, \
8787 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, __int64), \
8788 (this, ret, dest, base, fill, v))
8789 #endif
8790 #if _MSVCP_VER != 80
8791 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 32)
8792 #else
8793 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_int64, 36)
8794 #endif
8795 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8796 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8798 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8799 char fmt[7]; /* strlen("%+#lld")+1 */
8801 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8803 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8804 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8807 /* ?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 */
8808 /* ?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 */
8809 #if _MSVCP_VER != 80
8810 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 32)
8811 #else
8812 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_int64, 36)
8813 #endif
8814 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8815 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8817 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8818 char fmt[7]; /* strlen("%+#lld")+1 */
8820 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8822 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8823 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "lld", base->fmtfl), v));
8826 /* ?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 */
8827 /* ?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 */
8828 /* ?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 */
8829 /* ?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 */
8830 #if _MSVCP_VER != 80
8831 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 32)
8832 #else
8833 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_int64, 36)
8834 #endif
8835 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_int64(const num_put *this, ostreambuf_iterator_wchar *ret,
8836 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, __int64 v)
8838 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8839 return call_num_put_wchar_do_put_int64(this, ret, dest, base, fill, v);
8842 /* ?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 */
8843 /* ?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 */
8844 #if _MSVCP_VER <= 100
8845 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 16, ostreambuf_iterator_wchar*, \
8846 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8847 (this, ret, dest, base, fill, v))
8848 #else
8849 #define call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 24, ostreambuf_iterator_wchar*, \
8850 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, unsigned __int64), \
8851 (this, ret, dest, base, fill, v))
8852 #endif
8853 #if _MSVCP_VER != 80
8854 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 32)
8855 #else
8856 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_uint64, 36)
8857 #endif
8858 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8859 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8861 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8862 char fmt[7]; /* strlen("%+#lld")+1 */
8864 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8866 return num_put_wchar__Iput(this, ret, dest, base, fill, tmp,
8867 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8870 /* ?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 */
8871 /* ?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 */
8872 #if _MSVCP_VER != 80
8873 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 32)
8874 #else
8875 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_uint64, 36)
8876 #endif
8877 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8878 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8880 char tmp[48]; /* 22(8^22>2^64)*2(separators between every digit) + 3(strlen("+0x"))+1 */
8881 char fmt[7]; /* strlen("%+#lld")+1 */
8883 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8885 return num_put_short__Iput(this, ret, dest, base, fill, tmp,
8886 sprintf(tmp, num_put_wchar__Ifmt(this, fmt, "llu", base->fmtfl), v));
8889 /* ?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 */
8890 /* ?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 */
8891 /* ?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 */
8892 /* ?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 */
8893 #if _MSVCP_VER != 80
8894 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 32)
8895 #else
8896 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_uint64, 36)
8897 #endif
8898 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_uint64(const num_put *this, ostreambuf_iterator_wchar *ret,
8899 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, unsigned __int64 v)
8901 TRACE("(%p %p %p %d)\n", this, ret, base, fill);
8902 return call_num_put_wchar_do_put_uint64(this, ret, dest, base, fill, v);
8905 /* ?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 */
8906 /* ?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 */
8907 #if _MSVCP_VER <= 100
8908 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 32, ostreambuf_iterator_wchar*, \
8909 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, bool), \
8910 (this, ret, dest, base, fill, v))
8911 #else
8912 #define call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v) CALL_VTBL_FUNC(this, 40, ostreambuf_iterator_wchar*, \
8913 (const num_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, bool), \
8914 (this, ret, dest, base, fill, v))
8915 #endif
8916 #if _MSVCP_VER != 80
8917 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 28)
8918 #else
8919 DEFINE_THISCALL_WRAPPER(num_put_wchar_do_put_bool, 32)
8920 #endif
8921 ostreambuf_iterator_wchar* __thiscall num_put_wchar_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8922 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8924 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8926 if(base->fmtfl & FMTFLAG_boolalpha) {
8927 numpunct_wchar *numpunct = numpunct_wchar_use_facet(IOS_LOCALE(base));
8928 basic_string_wchar str;
8929 size_t pad, len;
8931 if(v)
8932 numpunct_wchar_truename(numpunct, &str);
8933 else
8934 numpunct_wchar_falsename(numpunct, &str);
8936 len = MSVCP_basic_string_wchar_length(&str);
8937 pad = (len>base->wide ? 0 : base->wide-len);
8938 base->wide = 0;
8940 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8941 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8942 pad = 0;
8944 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8945 MSVCP_basic_string_wchar_dtor(&str);
8946 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8949 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8952 /* ?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 */
8953 /* ?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 */
8954 #if _MSVCP_VER != 80
8955 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 28)
8956 #else
8957 DEFINE_THISCALL_WRAPPER(num_put_short_do_put_bool, 32)
8958 #endif
8959 ostreambuf_iterator_wchar* __thiscall num_put_short_do_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
8960 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
8962 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
8964 if(base->fmtfl & FMTFLAG_boolalpha) {
8965 numpunct_wchar *numpunct = numpunct_short_use_facet(IOS_LOCALE(base));
8966 basic_string_wchar str;
8967 size_t pad, len;
8969 if(v)
8970 numpunct_wchar_truename(numpunct, &str);
8971 else
8972 numpunct_wchar_falsename(numpunct, &str);
8974 len = MSVCP_basic_string_wchar_length(&str);
8975 pad = (len>base->wide ? 0 : base->wide-len);
8976 base->wide = 0;
8978 if((base->fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
8979 num_put_wchar__Rep(this, &dest, dest, fill, pad);
8980 pad = 0;
8982 num_put_wchar__Put(this, &dest, dest, MSVCP_basic_string_wchar_c_str(&str), len);
8983 MSVCP_basic_string_wchar_dtor(&str);
8984 return num_put_wchar__Rep(this, ret, dest, fill, pad);
8987 return num_put_wchar_put_long(this, ret, dest, base, fill, v);
8990 /* ?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 */
8991 /* ?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 */
8992 /* ?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 */
8993 /* ?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 */
8994 #if _MSVCP_VER != 80
8995 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 28)
8996 #else
8997 DEFINE_THISCALL_WRAPPER(num_put_wchar_put_bool, 32)
8998 #endif
8999 ostreambuf_iterator_wchar* __thiscall num_put_wchar_put_bool(const num_put *this, ostreambuf_iterator_wchar *ret,
9000 ostreambuf_iterator_wchar dest, ios_base *base, wchar_t fill, bool v)
9002 TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
9003 return call_num_put_wchar_do_put_bool(this, ret, dest, base, fill, v);
9006 /* ?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
9007 locale_id time_put_char_id = {0};
9009 /* ??_7?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
9010 extern const vtable_ptr time_put_char_vtable;
9012 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9013 /* ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9014 DEFINE_THISCALL_WRAPPER(time_put_char__Init, 8)
9015 void __thiscall time_put_char__Init(time_put *this, const _Locinfo *locinfo)
9017 TRACE("(%p %p)\n", this, locinfo);
9018 _Locinfo__Gettnames(locinfo, &this->time);
9019 #if _MSVCP_VER <= 100
9020 _Locinfo__Getcvt(locinfo, &this->cvt);
9021 #endif
9024 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9025 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9026 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_locinfo, 12)
9027 time_put* __thiscall time_put_char_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
9029 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
9030 locale_facet_ctor_refs(&this->facet, refs);
9031 this->facet.vtable = &time_put_char_vtable;
9032 time_put_char__Init(this, locinfo);
9033 return this;
9036 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
9037 /* ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
9038 DEFINE_THISCALL_WRAPPER(time_put_char_ctor_refs, 8)
9039 time_put* __thiscall time_put_char_ctor_refs(time_put *this, size_t refs)
9041 _Locinfo locinfo;
9043 TRACE("(%p %Iu)\n", this, refs);
9045 _Locinfo_ctor(&locinfo);
9046 time_put_char_ctor_locinfo(this, &locinfo, refs);
9047 _Locinfo_dtor(&locinfo);
9048 return this;
9051 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
9052 /* ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
9053 DEFINE_THISCALL_WRAPPER(time_put_char_ctor, 4)
9054 time_put* __thiscall time_put_char_ctor(time_put *this)
9056 return time_put_char_ctor_refs(this, 0);
9059 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
9060 /* ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
9061 DEFINE_THISCALL_WRAPPER(time_put_char_dtor, 4)
9062 void __thiscall time_put_char_dtor(time_put *this)
9064 TRACE("(%p)\n", this);
9065 _Timevec_dtor(&this->time);
9068 DEFINE_THISCALL_WRAPPER(time_put_char_vector_dtor, 8)
9069 time_put* __thiscall time_put_char_vector_dtor(time_put *this, unsigned int flags)
9071 TRACE("(%p %x)\n", this, flags);
9072 if(flags & 2) {
9073 /* we have an array, with the number of elements stored before the first object */
9074 INT_PTR i, *ptr = (INT_PTR *)this-1;
9076 for(i=*ptr-1; i>=0; i--)
9077 time_put_char_dtor(this+i);
9078 MSVCRT_operator_delete(ptr);
9079 } else {
9080 time_put_char_dtor(this);
9081 if(flags & 1)
9082 MSVCRT_operator_delete(this);
9085 return this;
9088 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9089 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9090 size_t __cdecl time_put_char__Getcat(const locale_facet **facet, const locale *loc)
9092 TRACE("(%p %p)\n", facet, loc);
9094 if(facet && !*facet) {
9095 _Locinfo locinfo;
9097 *facet = MSVCRT_operator_new(sizeof(time_put));
9098 if(!*facet) {
9099 ERR("Out of memory\n");
9100 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9101 return 0;
9104 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
9105 time_put_char_ctor_locinfo((time_put*)*facet, &locinfo, 0);
9106 _Locinfo_dtor(&locinfo);
9109 return LC_TIME;
9112 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9113 /* ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9114 size_t __cdecl time_put_char__Getcat_old(const locale_facet **facet)
9116 return time_put_char__Getcat(facet, locale_classic());
9119 static time_put* time_put_char_use_facet(const locale *loc)
9121 static time_put *obj = NULL;
9123 _Lockit lock;
9124 const locale_facet *fac;
9126 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9127 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_char_id));
9128 if(fac) {
9129 _Lockit_dtor(&lock);
9130 return (time_put*)fac;
9133 if(obj) {
9134 _Lockit_dtor(&lock);
9135 return obj;
9138 time_put_char__Getcat(&fac, loc);
9139 obj = (time_put*)fac;
9140 call_locale_facet__Incref(&obj->facet);
9141 locale_facet_register(&obj->facet);
9142 _Lockit_dtor(&lock);
9144 return obj;
9147 #if _MSVCP_VER >= 70
9149 /* ?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 */
9150 /* ?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 */
9151 #if _MSVCP_VER != 80
9152 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 36)
9153 #else
9154 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 40)
9155 #endif
9156 #if _MSVCP_VER <= 100
9157 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9158 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9159 (this, ret, dest, base, fill, t, spec, mod))
9160 #else
9161 #define call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_char*, \
9162 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, char, const struct tm*, char, char), \
9163 (this, ret, dest, base, fill, t, spec, mod))
9164 #endif
9165 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9166 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9168 char buf[64], fmt[4], *p = fmt;
9169 size_t i, len;
9171 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9173 *p++ = '%';
9174 if(mod)
9175 *p++ = mod;
9176 *p++ = spec;
9177 *p++ = 0;
9179 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9180 for(i=0; i<len; i++)
9181 ostreambuf_iterator_char_put(&dest, buf[i]);
9183 *ret = dest;
9184 return ret;
9187 /* ?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 */
9188 /* ?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 */
9189 #if _MSVCP_VER != 80
9190 DEFINE_THISCALL_WRAPPER(time_put_char_put, 36)
9191 #else
9192 DEFINE_THISCALL_WRAPPER(time_put_char_put, 40)
9193 #endif
9194 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9195 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, char spec, char mod)
9197 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9198 return call_time_put_char_do_put(this, ret, dest, base, fill, t, spec, mod);
9201 /* ?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 */
9202 /* ?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 */
9203 #if _MSVCP_VER != 80
9204 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 36)
9205 #else
9206 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 40)
9207 #endif
9208 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9209 ostreambuf_iterator_char dest, ios_base *base, char fill, const struct tm *t, const char *pat, const char *pat_end)
9211 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_an(pat, pat_end-pat));
9213 while(pat < pat_end) {
9214 if(*pat != '%') {
9215 ostreambuf_iterator_char_put(&dest, *pat++);
9216 }else if(++pat == pat_end) {
9217 ostreambuf_iterator_char_put(&dest, '%');
9218 }else if(*pat=='#' && pat+1==pat_end) {
9219 ostreambuf_iterator_char_put(&dest, '%');
9220 ostreambuf_iterator_char_put(&dest, *pat++);
9221 }else {
9222 char mod;
9224 if(*pat == '#') {
9225 mod = '#';
9226 pat++;
9227 }else {
9228 mod = 0;
9231 time_put_char_put(this, &dest, dest, base, fill, t, *pat++, mod);
9235 *ret = dest;
9236 return ret;
9239 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9241 /* ?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 */
9242 /* ?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 */
9243 DEFINE_THISCALL_WRAPPER(time_put_char_do_put, 32)
9244 #define call_time_put_char_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_char*, \
9245 (const time_put*, ostreambuf_iterator_char*, ostreambuf_iterator_char, ios_base*, const struct tm*, char, char), \
9246 (this, ret, dest, base, t, spec, mod))
9247 ostreambuf_iterator_char* __thiscall time_put_char_do_put(const time_put *this, ostreambuf_iterator_char *ret,
9248 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9250 char buf[64], fmt[4], *p = fmt;
9251 size_t i, len;
9253 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9255 *p++ = '%';
9256 if(mod)
9257 *p++ = mod;
9258 *p++ = spec;
9259 *p++ = 0;
9261 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9262 for(i=0; i<len; i++)
9263 ostreambuf_iterator_char_put(&dest, buf[i]);
9265 *ret = dest;
9266 return ret;
9269 /* ?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 */
9270 /* ?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 */
9271 DEFINE_THISCALL_WRAPPER(time_put_char_put, 32)
9272 ostreambuf_iterator_char* __thiscall time_put_char_put(const time_put *this, ostreambuf_iterator_char *ret,
9273 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, char spec, char mod)
9275 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9276 return call_time_put_char_do_put(this, ret, dest, base, t, spec, mod);
9279 /* ?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 */
9280 /* ?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 */
9281 DEFINE_THISCALL_WRAPPER(time_put_char_put_format, 32)
9282 ostreambuf_iterator_char* __thiscall time_put_char_put_format(const time_put *this, ostreambuf_iterator_char *ret,
9283 ostreambuf_iterator_char dest, ios_base *base, const struct tm *t, const char *pat, const char *pat_end)
9285 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_an(pat, pat_end-pat));
9287 while(pat < pat_end) {
9288 if(*pat != '%') {
9289 ostreambuf_iterator_char_put(&dest, *pat++);
9290 }else if(++pat == pat_end) {
9291 ostreambuf_iterator_char_put(&dest, '%');
9292 }else if(*pat=='#' && pat+1==pat_end) {
9293 ostreambuf_iterator_char_put(&dest, '%');
9294 ostreambuf_iterator_char_put(&dest, *pat++);
9295 }else {
9296 char mod;
9298 if(*pat == '#') {
9299 mod = '#';
9300 pat++;
9301 }else {
9302 mod = 0;
9305 time_put_char_put(this, &dest, dest, base, t, *pat++, mod);
9309 *ret = dest;
9310 return ret;
9313 #endif /* MSVCP_VER >= 70 */
9315 /* ?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
9316 locale_id time_put_wchar_id = {0};
9317 /* ?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A */
9318 locale_id time_put_short_id = {0};
9320 /* ??_7?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
9321 extern const vtable_ptr time_put_wchar_vtable;
9322 /* ??_7?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ */
9323 extern const vtable_ptr time_put_short_vtable;
9325 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9326 /* ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9327 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9328 /* ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9329 DEFINE_THISCALL_WRAPPER(time_put_wchar__Init, 8)
9330 void __thiscall time_put_wchar__Init(time_put *this, const _Locinfo *locinfo)
9332 TRACE("(%p %p)\n", this, locinfo);
9333 _Locinfo__Gettnames(locinfo, &this->time);
9334 #if _MSVCP_VER <= 100
9335 _Locinfo__Getcvt(locinfo, &this->cvt);
9336 #endif
9339 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9340 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9341 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_locinfo, 12)
9342 time_put* __thiscall time_put_wchar_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
9344 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
9345 locale_facet_ctor_refs(&this->facet, refs);
9346 this->facet.vtable = &time_put_wchar_vtable;
9347 time_put_wchar__Init(this, locinfo);
9348 return this;
9351 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9352 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9353 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_locinfo, 12)
9354 time_put* __thiscall time_put_short_ctor_locinfo(time_put *this, const _Locinfo *locinfo, size_t refs)
9356 time_put_wchar_ctor_locinfo(this, locinfo, refs);
9357 this->facet.vtable = &time_put_short_vtable;
9358 return this;
9361 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
9362 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
9363 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_name, 12)
9364 time_put* __thiscall time_put_wchar_ctor_name(time_put *this, const char *name, size_t refs)
9366 _Locinfo locinfo;
9368 TRACE("(%p %s %Iu)\n", this, debugstr_a(name), refs);
9370 _Locinfo_ctor_cstr(&locinfo, name);
9371 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9372 _Locinfo_dtor(&locinfo);
9373 return this;
9376 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAE@PBDI@Z */
9377 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z */
9378 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_name, 12)
9379 time_put* __thiscall time_put_short_ctor_name(time_put *this, const char *name, size_t refs)
9381 time_put_wchar_ctor_name(this, name, refs);
9382 this->facet.vtable = &time_put_short_vtable;
9383 return this;
9386 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
9387 /* ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
9388 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor_refs, 8)
9389 time_put* __thiscall time_put_wchar_ctor_refs(time_put *this, size_t refs)
9391 _Locinfo locinfo;
9393 TRACE("(%p %Iu)\n", this, refs);
9395 _Locinfo_ctor(&locinfo);
9396 time_put_wchar_ctor_locinfo(this, &locinfo, refs);
9397 _Locinfo_dtor(&locinfo);
9398 return this;
9401 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z */
9402 /* ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z */
9403 DEFINE_THISCALL_WRAPPER(time_put_short_ctor_refs, 8)
9404 time_put* __thiscall time_put_short_ctor_refs(time_put *this, size_t refs)
9406 time_put_wchar_ctor_refs(this, refs);
9407 this->facet.vtable = &time_put_short_vtable;
9408 return this;
9411 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
9412 /* ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
9413 DEFINE_THISCALL_WRAPPER(time_put_wchar_ctor, 4)
9414 time_put* __thiscall time_put_wchar_ctor(time_put *this)
9416 return time_put_wchar_ctor_refs(this, 0);
9419 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ */
9420 /* ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ */
9421 DEFINE_THISCALL_WRAPPER(time_put_short_ctor, 4)
9422 time_put* __thiscall time_put_short_ctor(time_put *this)
9424 time_put_wchar_ctor(this);
9425 this->facet.vtable = &time_put_short_vtable;
9426 return this;
9429 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ */
9430 /* ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ */
9431 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
9432 /* ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
9433 DEFINE_THISCALL_WRAPPER(time_put_wchar_dtor, 4)
9434 void __thiscall time_put_wchar_dtor(time_put *this)
9436 TRACE("(%p)\n", this);
9437 _Timevec_dtor(&this->time);
9440 DEFINE_THISCALL_WRAPPER(time_put_wchar_vector_dtor, 8)
9441 time_put* __thiscall time_put_wchar_vector_dtor(time_put *this, unsigned int flags)
9443 TRACE("(%p %x)\n", this, flags);
9444 if(flags & 2) {
9445 /* we have an array, with the number of elements stored before the first object */
9446 INT_PTR i, *ptr = (INT_PTR *)this-1;
9448 for(i=*ptr-1; i>=0; i--)
9449 time_put_wchar_dtor(this+i);
9450 MSVCRT_operator_delete(ptr);
9451 } else {
9452 time_put_wchar_dtor(this);
9453 if(flags & 1)
9454 MSVCRT_operator_delete(this);
9457 return this;
9460 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9461 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9462 size_t __cdecl time_put_wchar__Getcat(const locale_facet **facet, const locale *loc)
9464 TRACE("(%p %p)\n", facet, loc);
9466 if(facet && !*facet) {
9467 *facet = MSVCRT_operator_new(sizeof(time_put));
9468 if(!*facet) {
9469 ERR("Out of memory\n");
9470 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9471 return 0;
9473 time_put_wchar_ctor_name((time_put*)*facet,
9474 locale_string_char_c_str(&loc->ptr->name), 0);
9477 return LC_TIME;
9480 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9481 /* ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9482 size_t __cdecl time_put_wchar__Getcat_old(const locale_facet **facet)
9484 return time_put_wchar__Getcat(facet, locale_classic());
9487 static time_put* time_put_wchar_use_facet(const locale *loc)
9489 static time_put *obj = NULL;
9491 _Lockit lock;
9492 const locale_facet *fac;
9494 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9495 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_wchar_id));
9496 if(fac) {
9497 _Lockit_dtor(&lock);
9498 return (time_put*)fac;
9501 if(obj) {
9502 _Lockit_dtor(&lock);
9503 return obj;
9506 time_put_wchar__Getcat(&fac, loc);
9507 obj = (time_put*)fac;
9508 call_locale_facet__Incref(&obj->facet);
9509 locale_facet_register(&obj->facet);
9510 _Lockit_dtor(&lock);
9512 return obj;
9515 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9516 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9517 size_t __cdecl time_put_short__Getcat(const locale_facet **facet, const locale *loc)
9519 TRACE("(%p %p)\n", facet, loc);
9521 if(facet && !*facet) {
9522 *facet = MSVCRT_operator_new(sizeof(time_put));
9523 if(!*facet) {
9524 ERR("Out of memory\n");
9525 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9526 return 0;
9528 time_put_short_ctor_name((time_put*)*facet,
9529 locale_string_char_c_str(&loc->ptr->name), 0);
9532 return LC_TIME;
9535 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@@Z */
9536 /* ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@@Z */
9537 size_t __cdecl time_put_short__Getcat_old(const locale_facet **facet)
9539 return time_put_short__Getcat(facet, locale_classic());
9542 static time_put* time_put_short_use_facet(const locale *loc)
9544 static time_put *obj = NULL;
9546 _Lockit lock;
9547 const locale_facet *fac;
9549 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9550 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_put_short_id));
9551 if(fac) {
9552 _Lockit_dtor(&lock);
9553 return (time_put*)fac;
9556 if(obj) {
9557 _Lockit_dtor(&lock);
9558 return obj;
9561 time_put_short__Getcat(&fac, loc);
9562 obj = (time_put*)fac;
9563 call_locale_facet__Incref(&obj->facet);
9564 locale_facet_register(&obj->facet);
9565 _Lockit_dtor(&lock);
9567 return obj;
9570 #if _MSVCP_VER >= 70
9572 /* ?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 */
9573 /* ?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 */
9574 /* ?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 */
9575 /* ?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 */
9576 #if _MSVCP_VER != 80
9577 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 36)
9578 #else
9579 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 40)
9580 #endif
9581 #if _MSVCP_VER <= 100
9582 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9583 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9584 (this, ret, dest, base, fill, t, spec, mod))
9585 #else
9586 #define call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod) CALL_VTBL_FUNC(this, 12, ostreambuf_iterator_wchar*, \
9587 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, wchar_t, const struct tm*, char, char), \
9588 (this, ret, dest, base, fill, t, spec, mod))
9589 #endif
9590 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9591 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9592 wchar_t fill, const struct tm *t, char spec, char mod)
9594 char buf[64], fmt[4], *p = fmt;
9595 size_t i, len;
9596 const _Cvtvec *cvt;
9597 wchar_t c;
9599 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9601 *p++ = '%';
9602 if(mod)
9603 *p++ = mod;
9604 *p++ = spec;
9605 *p++ = 0;
9607 #if _MSVCP_VER <= 100
9608 cvt = &this->cvt;
9609 #else
9610 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9611 #endif
9613 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9614 for(i=0; i<len; i++) {
9615 c = mb_to_wc(buf[i], cvt);
9616 ostreambuf_iterator_wchar_put(&dest, c);
9619 *ret = dest;
9620 return ret;
9623 /* ?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 */
9624 /* ?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 */
9625 /* ?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 */
9626 /* ?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 */
9627 #if _MSVCP_VER != 80
9628 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 36)
9629 #else
9630 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 40)
9631 #endif
9632 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9633 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9634 wchar_t fill, const struct tm *t, char spec, char mod)
9636 TRACE("(%p %p %p %c %p %c %c)\n", this, ret, base, fill, t, spec, mod);
9637 return call_time_put_wchar_do_put(this, ret, dest, base, fill, t, spec, mod);
9640 /* ?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 */
9641 /* ?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 */
9642 /* ?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 */
9643 /* ?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 */
9644 #if _MSVCP_VER != 80
9645 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 36)
9646 #else
9647 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 40)
9648 #endif
9649 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9650 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9651 wchar_t fill, const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9653 wchar_t percent;
9654 char c[MB_LEN_MAX];
9655 const _Cvtvec *cvt;
9657 TRACE("(%p %p %p %c %p %s)\n", this, ret, base, fill, t, debugstr_wn(pat, pat_end-pat));
9659 #if _MSVCP_VER <= 100
9660 cvt = &this->cvt;
9661 #else
9662 cvt = &ctype_wchar_use_facet(base->loc)->cvt;
9663 #endif
9665 percent = mb_to_wc('%', cvt);
9666 while(pat < pat_end) {
9667 if(*pat != percent) {
9668 ostreambuf_iterator_wchar_put(&dest, *pat++);
9669 }else if(++pat == pat_end) {
9670 ostreambuf_iterator_wchar_put(&dest, percent);
9671 }else if(_Wcrtomb(c, *pat, NULL, cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9672 ostreambuf_iterator_wchar_put(&dest, percent);
9673 ostreambuf_iterator_wchar_put(&dest, *pat++);
9674 }else {
9675 pat++;
9676 if(*c == '#') {
9677 if(_Wcrtomb(c, *pat++, NULL, cvt) != 1) {
9678 ostreambuf_iterator_wchar_put(&dest, percent);
9679 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9680 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9681 }else {
9682 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, '#');
9684 }else {
9685 time_put_wchar_put(this, &dest, dest, base, fill, t, *c, 0);
9690 *ret = dest;
9691 return ret;
9694 #else /* _MSVCP_VER < 70 doesn't have the 'fill' parameter */
9696 /* ?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 */
9697 /* ?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 */
9698 DEFINE_THISCALL_WRAPPER(time_put_wchar_do_put, 32)
9699 #define call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod) CALL_VTBL_FUNC(this, 4, ostreambuf_iterator_wchar*, \
9700 (const time_put*, ostreambuf_iterator_wchar*, ostreambuf_iterator_wchar, ios_base*, const struct tm*, char, char), \
9701 (this, ret, dest, base, t, spec, mod))
9702 ostreambuf_iterator_wchar* __thiscall time_put_wchar_do_put(const time_put *this,
9703 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9704 const struct tm *t, char spec, char mod)
9706 char buf[64], fmt[4], *p = fmt;
9707 size_t i, len;
9708 wchar_t c;
9710 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9712 *p++ = '%';
9713 if(mod)
9714 *p++ = mod;
9715 *p++ = spec;
9716 *p++ = 0;
9718 len = _Strftime(buf, sizeof(buf), fmt, t, this->time.timeptr);
9719 for(i=0; i<len; i++) {
9720 c = mb_to_wc(buf[i], &this->cvt);
9721 ostreambuf_iterator_wchar_put(&dest, c);
9724 *ret = dest;
9725 return ret;
9728 /* ?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 */
9729 /* ?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 */
9730 DEFINE_THISCALL_WRAPPER(time_put_wchar_put, 32)
9731 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put(const time_put *this,
9732 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9733 const struct tm *t, char spec, char mod)
9735 TRACE("(%p %p %p %p %c %c)\n", this, ret, base, t, spec, mod);
9736 return call_time_put_wchar_do_put(this, ret, dest, base, t, spec, mod);
9739 /* ?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 */
9740 /* ?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 */
9741 DEFINE_THISCALL_WRAPPER(time_put_wchar_put_format, 32)
9742 ostreambuf_iterator_wchar* __thiscall time_put_wchar_put_format(const time_put *this,
9743 ostreambuf_iterator_wchar *ret, ostreambuf_iterator_wchar dest, ios_base *base,
9744 const struct tm *t, const wchar_t *pat, const wchar_t *pat_end)
9746 wchar_t percent = mb_to_wc('%', &this->cvt);
9747 char c[MB_LEN_MAX];
9749 TRACE("(%p %p %p %p %s)\n", this, ret, base, t, debugstr_wn(pat, pat_end-pat));
9751 while(pat < pat_end) {
9752 if(*pat != percent) {
9753 ostreambuf_iterator_wchar_put(&dest, *pat++);
9754 }else if(++pat == pat_end) {
9755 ostreambuf_iterator_wchar_put(&dest, percent);
9756 }else if(_Wcrtomb(c, *pat, NULL, &this->cvt)!=1 || (*c=='#' && pat+1==pat_end)) {
9757 ostreambuf_iterator_wchar_put(&dest, percent);
9758 ostreambuf_iterator_wchar_put(&dest, *pat++);
9759 }else {
9760 pat++;
9761 if(*c == '#') {
9762 if(_Wcrtomb(c, *pat++, NULL, &this->cvt) != 1) {
9763 ostreambuf_iterator_wchar_put(&dest, percent);
9764 ostreambuf_iterator_wchar_put(&dest, *(pat-2));
9765 ostreambuf_iterator_wchar_put(&dest, *(pat-1));
9766 }else {
9767 time_put_wchar_put(this, &dest, dest, base, t, *c, '#');
9769 }else {
9770 time_put_wchar_put(this, &dest, dest, base, t, *c, 0);
9775 *ret = dest;
9776 return ret;
9779 #endif /* _MSVCP_VER >= 70 */
9781 /* ?id@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A */
9782 locale_id time_get_char_id = {0};
9784 /* ??_7?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ */
9785 extern const vtable_ptr time_get_char_vtable;
9787 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
9788 /* ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
9789 DEFINE_THISCALL_WRAPPER(time_get_char__Init, 8)
9790 void __thiscall time_get_char__Init(time_get_char *this, const _Locinfo *locinfo)
9792 const char *months;
9793 const char *days;
9794 int len;
9796 TRACE("(%p %p)\n", this, locinfo);
9798 days = _Locinfo__Getdays(locinfo);
9799 len = strlen(days)+1;
9800 this->days = MSVCRT_operator_new(len);
9801 if(!this->days)
9803 ERR("Out of memory\n");
9804 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9806 memcpy((char*)this->days, days, len);
9808 months = _Locinfo__Getmonths(locinfo);
9809 len = strlen(months)+1;
9810 this->months = MSVCRT_operator_new(len);
9811 if(!this->months)
9813 MSVCRT_operator_delete((char*)this->days);
9815 ERR("Out of memory\n");
9816 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9818 memcpy((char*)this->months, months, len);
9820 this->dateorder = _Locinfo__Getdateorder(locinfo);
9821 _Locinfo__Getcvt(locinfo, &this->cvt);
9824 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
9825 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
9826 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_locinfo, 12)
9827 time_get_char* __thiscall time_get_char_ctor_locinfo(time_get_char *this,
9828 const _Locinfo *locinfo, size_t refs)
9830 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
9831 locale_facet_ctor_refs(&this->facet, refs);
9832 this->facet.vtable = &time_get_char_vtable;
9833 time_get_char__Init(this, locinfo);
9834 return this;
9837 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAE@PBDI@Z */
9838 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAA@PEBD_K@Z */
9839 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_name, 12)
9840 time_get_char* __thiscall time_get_char_ctor_name(time_get_char *this, const char *name, size_t refs)
9842 _Locinfo locinfo;
9844 TRACE("(%p %s %Iu)\n", this, name, refs);
9846 _Locinfo_ctor_cstr(&locinfo, name);
9847 time_get_char_ctor_locinfo(this, &locinfo, refs);
9848 _Locinfo_dtor(&locinfo);
9849 return this;
9852 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z */
9853 /* ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z */
9854 DEFINE_THISCALL_WRAPPER(time_get_char_ctor_refs, 8)
9855 time_get_char* __thiscall time_get_char_ctor_refs(time_get_char *this, size_t refs)
9857 _Locinfo locinfo;
9859 TRACE("(%p %Iu)\n", this, refs);
9861 _Locinfo_ctor(&locinfo);
9862 time_get_char_ctor_locinfo(this, &locinfo, refs);
9863 _Locinfo_dtor(&locinfo);
9864 return this;
9867 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ */
9868 /* ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ */
9869 DEFINE_THISCALL_WRAPPER(time_get_char_ctor, 4)
9870 time_get_char* __thiscall time_get_char_ctor(time_get_char *this)
9872 return time_get_char_ctor_refs(this, 0);
9875 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AAEXXZ */
9876 /* ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEAAXXZ */
9877 DEFINE_THISCALL_WRAPPER(time_get_char__Tidy, 4)
9878 void __thiscall time_get_char__Tidy(time_get_char *this)
9880 TRACE("(%p)\n", this);
9882 MSVCRT_operator_delete((char*)this->days);
9883 MSVCRT_operator_delete((char*)this->months);
9886 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ */
9887 /* ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ */
9888 DEFINE_THISCALL_WRAPPER(time_get_char_dtor, 4) /* virtual */
9889 void __thiscall time_get_char_dtor(time_get_char *this)
9891 TRACE("(%p)\n", this);
9893 time_get_char__Tidy(this);
9896 DEFINE_THISCALL_WRAPPER(time_get_char_vector_dtor, 8)
9897 time_get_char* __thiscall time_get_char_vector_dtor(time_get_char *this, unsigned int flags)
9899 TRACE("(%p %x)\n", this, flags);
9900 if(flags & 2) {
9901 /* we have an array, with the number of elements stored before the first object */
9902 INT_PTR i, *ptr = (INT_PTR *)this-1;
9904 for(i=*ptr-1; i>=0; i--)
9905 time_get_char_dtor(this+i);
9906 MSVCRT_operator_delete(ptr);
9907 } else {
9908 time_get_char_dtor(this);
9909 if(flags & 1)
9910 MSVCRT_operator_delete(this);
9913 return this;
9916 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
9917 /* ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
9918 unsigned int __cdecl time_get_char__Getcat(const locale_facet **facet, const locale *loc)
9920 TRACE("(%p %p)\n", facet, loc);
9922 if(facet && !*facet) {
9923 _Locinfo locinfo;
9925 *facet = MSVCRT_operator_new(sizeof(time_get_char));
9926 if(!*facet) {
9927 ERR("Out of memory\n");
9928 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
9929 return 0;
9932 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
9933 time_get_char_ctor_locinfo((time_get_char*)*facet, &locinfo, 0);
9934 _Locinfo_dtor(&locinfo);
9937 return LC_TIME;
9940 static time_get_char* time_get_char_use_facet(const locale *loc)
9942 static time_get_char *obj = NULL;
9944 _Lockit lock;
9945 const locale_facet *fac;
9947 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
9948 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_char_id));
9949 if(fac) {
9950 _Lockit_dtor(&lock);
9951 return (time_get_char*)fac;
9954 if(obj) {
9955 _Lockit_dtor(&lock);
9956 return obj;
9959 time_get_char__Getcat(&fac, loc);
9960 obj = (time_get_char*)fac;
9961 call_locale_facet__Incref(&obj->facet);
9962 locale_facet_register(&obj->facet);
9963 _Lockit_dtor(&lock);
9965 return obj;
9968 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAH@Z */
9969 /* ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAEAH@Z */
9970 int __cdecl time_get_char__Getint(const time_get_char *this,
9971 istreambuf_iterator_char *b, istreambuf_iterator_char *e,
9972 int min_val, int max_val, int *val)
9974 BOOL got_digit = FALSE;
9975 int len = 0, ret = 0;
9976 char buf[16];
9978 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
9980 istreambuf_iterator_char_val(b);
9981 if(b->strbuf && (b->val == '-' || b->val == '+'))
9983 buf[len++] = b->val;
9984 istreambuf_iterator_char_inc(b);
9987 if (b->strbuf && b->val == '0')
9989 got_digit = TRUE;
9990 buf[len++] = '0';
9991 istreambuf_iterator_char_inc(b);
9993 while (b->strbuf && b->val == '0')
9994 istreambuf_iterator_char_inc(b);
9996 for (; b->strbuf && b->val >= '0' && b->val <= '9';
9997 istreambuf_iterator_char_inc(b))
9999 if(len < ARRAY_SIZE(buf)-1)
10000 buf[len] = b->val;
10001 got_digit = TRUE;
10002 len++;
10005 if (!b->strbuf)
10006 ret |= IOSTATE_eofbit;
10007 if (got_digit && len < ARRAY_SIZE(buf)-1)
10009 int v, err;
10011 buf[len] = 0;
10012 v = _Stolx(buf, NULL, 10, &err);
10013 if(err || v < min_val || v > max_val)
10014 ret |= IOSTATE_failbit;
10015 else
10016 *val = v;
10018 else
10019 ret |= IOSTATE_failbit;
10020 return ret;
10023 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
10024 /* ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
10025 DEFINE_THISCALL_WRAPPER(time_get_char_do_date_order, 4) /* virtual */
10026 #if _MSVCP_VER <= 100
10027 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_char*), (this))
10028 #else
10029 #define call_time_get_char_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_char*), (this))
10030 #endif
10031 dateorder __thiscall time_get_char_do_date_order(const time_get_char *this)
10033 TRACE("(%p)\n", this);
10034 return this->dateorder;
10037 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
10038 /* ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
10039 DEFINE_THISCALL_WRAPPER(time_get_char_date_order, 4)
10040 dateorder __thiscall time_get_char_date_order(const time_get_char *this)
10042 return call_time_get_char_do_date_order(this);
10045 static int find_longest_match_char(istreambuf_iterator_char *iter, const char *str)
10047 int i, len = 0, last_match = -1, match = -1;
10048 const char *p, *end;
10049 char buf[64];
10051 for(istreambuf_iterator_char_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
10052 istreambuf_iterator_char_inc(iter))
10054 BOOL got_prefix = FALSE;
10056 buf[len++] = iter->val;
10057 last_match = match;
10058 match = -1;
10059 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
10061 end = strchr(p, ':');
10062 if (!end)
10063 end = p + strlen(p);
10065 if (end-p >= len && !memcmp(p, buf, len))
10067 if (end-p == len)
10068 match = i;
10069 else
10070 got_prefix = TRUE;
10074 if (!got_prefix)
10076 if (match != -1)
10078 istreambuf_iterator_char_inc(iter);
10079 return match;
10081 break;
10084 if (len == ARRAY_SIZE(buf))
10085 FIXME("temporary buffer is too small\n");
10086 if (!iter->strbuf)
10087 return match;
10088 return last_match;
10091 /* ?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 */
10092 /* ?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 */
10093 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_monthname, 36) /* virtual */
10094 #if _MSVCP_VER <= 100
10095 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
10096 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10097 (this, ret, s, e, base, err, t))
10098 #else
10099 #define call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
10100 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10101 (this, ret, s, e, base, err, t))
10102 #endif
10103 istreambuf_iterator_char* __thiscall time_get_char_do_get_monthname(const time_get_char *this,
10104 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10105 ios_base *base, int *err, struct tm *t)
10107 int match;
10109 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10111 if ((match = find_longest_match_char(&s, this->months)) != -1)
10112 t->tm_mon = match / 2;
10113 else
10114 *err |= IOSTATE_failbit;
10116 *ret = s;
10117 return ret;
10120 /* ?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 */
10121 /* ?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 */
10122 DEFINE_THISCALL_WRAPPER(time_get_char_get_monthname, 36)
10123 istreambuf_iterator_char* __thiscall time_get_char_get_monthname(const time_get_char *this,
10124 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10125 ios_base *base, int *err, struct tm *t)
10127 return call_time_get_char_do_get_monthname(this, ret, s, e, base, err, t);
10130 /* ?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 */
10131 /* ?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 */
10132 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_time, 36) /* virtual */
10133 #if _MSVCP_VER <= 100
10134 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_char*, \
10135 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10136 (this, ret, s, e, base, err, t))
10137 #else
10138 #define call_time_get_char_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
10139 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10140 (this, ret, s, e, base, err, t))
10141 #endif
10142 istreambuf_iterator_char* __thiscall time_get_char_do_get_time(const time_get_char *this,
10143 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10144 ios_base *base, int *err, struct tm *t)
10146 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10148 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10149 if (*err || istreambuf_iterator_char_val(&s)!=':')
10150 *err |= IOSTATE_failbit;
10152 if (!*err)
10154 istreambuf_iterator_char_inc(&s);
10155 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
10157 if (*err || istreambuf_iterator_char_val(&s)!=':')
10158 *err |= IOSTATE_failbit;
10160 if (!*err)
10162 istreambuf_iterator_char_inc(&s);
10163 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10166 *ret = s;
10167 return ret;
10170 /* ?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 */
10171 /* ?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 */
10172 DEFINE_THISCALL_WRAPPER(time_get_char_get_time, 36)
10173 istreambuf_iterator_char* __thiscall time_get_char_get_time(const time_get_char *this,
10174 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10175 ios_base *base, int *err, struct tm *t)
10177 return call_time_get_char_do_get_time(this, ret, s, e, base, err, t);
10180 /* ?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 */
10181 /* ?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 */
10182 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_weekday, 36) /* virtual */
10183 #if _MSVCP_VER <= 100
10184 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_char*, \
10185 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10186 (this, ret, s, e, base, err, t))
10187 #else
10188 #define call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10189 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10190 (this, ret, s, e, base, err, t))
10191 #endif
10192 istreambuf_iterator_char* __thiscall time_get_char_do_get_weekday(const time_get_char *this,
10193 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10194 ios_base *base, int *err, struct tm *t)
10196 int match;
10198 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10200 if ((match = find_longest_match_char(&s, this->days)) != -1)
10201 t->tm_wday = match / 2;
10202 else
10203 *err |= IOSTATE_failbit;
10205 *ret = s;
10206 return ret;
10209 /* ?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 */
10210 /* ?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 */
10211 DEFINE_THISCALL_WRAPPER(time_get_char_get_weekday, 36)
10212 istreambuf_iterator_char* __thiscall time_get_char_get_weekday(const time_get_char *this,
10213 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10214 ios_base *base, int *err, struct tm *t)
10216 return call_time_get_char_do_get_weekday(this, ret, s, e, base, err, t);
10219 /* ?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 */
10220 /* ?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 */
10221 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_year, 36) /* virtual */
10222 #if _MSVCP_VER <= 100
10223 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_char*, \
10224 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10225 (this, ret, s, e, base, err, t))
10226 #else
10227 #define call_time_get_char_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_char*, \
10228 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10229 (this, ret, s, e, base, err, t))
10230 #endif
10231 istreambuf_iterator_char* __thiscall time_get_char_do_get_year(const time_get_char *this,
10232 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10233 ios_base *base, int *err, struct tm *t)
10235 int year;
10237 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10239 /* The function supports only dates from [1900-2035] range */
10240 *err |= time_get_char__Getint(this, &s, &e, 0, 2035, &year);
10241 if (!(*err & IOSTATE_failbit))
10243 if (year >= 1900)
10244 year -= 1900;
10245 if (year > 135)
10246 *err |= IOSTATE_failbit;
10247 else
10248 t->tm_year = year;
10251 *ret = s;
10252 return ret;
10255 /* ?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 */
10256 /* ?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 */
10257 DEFINE_THISCALL_WRAPPER(time_get_char_get_year, 36)
10258 istreambuf_iterator_char* __thiscall time_get_char_get_year(const time_get_char *this,
10259 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10260 ios_base *base, int *err, struct tm *t)
10262 return call_time_get_char_do_get_year(this, ret, s, e, base, err, t);
10265 static void skip_ws_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10267 istreambuf_iterator_char_val(iter);
10268 while(iter->strbuf && ctype_char_is_ch(ctype, _SPACE, iter->val))
10269 istreambuf_iterator_char_inc(iter);
10272 static void skip_date_delim_char(ctype_char *ctype, istreambuf_iterator_char *iter)
10274 skip_ws_char(ctype, iter);
10275 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
10276 istreambuf_iterator_char_inc(iter);
10277 skip_ws_char(ctype, iter);
10280 /* ?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 */
10281 /* ?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 */
10282 DEFINE_THISCALL_WRAPPER(time_get_char_do_get_date, 36) /* virtual */
10283 #if _MSVCP_VER <= 100
10284 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_char*, \
10285 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10286 (this, ret, s, e, base, err, t))
10287 #else
10288 #define call_time_get_char_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_char*, \
10289 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*), \
10290 (this, ret, s, e, base, err, t))
10291 #endif
10292 istreambuf_iterator_char* __thiscall time_get_char_do_get_date(const time_get_char *this,
10293 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10294 ios_base *base, int *err, struct tm *t)
10296 ctype_char *ctype;
10297 dateorder order;
10299 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
10301 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10303 order = time_get_char_date_order(this);
10304 if(order == DATEORDER_no_order)
10305 order = DATEORDER_mdy;
10307 switch(order) {
10308 case DATEORDER_dmy:
10309 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10310 skip_date_delim_char(ctype, &s);
10311 if(!s.strbuf) {
10312 *err |= IOSTATE_failbit;
10313 break;
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 time_get_char_get_year(this, &s, s, e, base, err, t);
10327 break;
10328 case DATEORDER_mdy:
10329 istreambuf_iterator_char_val(&s);
10330 if(s.strbuf && ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10331 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10332 t->tm_mon--;
10333 } else {
10334 time_get_char_get_monthname(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 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10342 skip_date_delim_char(ctype, &s);
10343 if(!s.strbuf) {
10344 *err |= IOSTATE_failbit;
10345 break;
10347 time_get_char_get_year(this, &s, s, e, base, err, t);
10348 break;
10349 case DATEORDER_ymd:
10350 time_get_char_get_year(this, &s, s, e, base, err, t);
10351 skip_date_delim_char(ctype, &s);
10352 if(!s.strbuf) {
10353 *err |= IOSTATE_failbit;
10354 break;
10356 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10357 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10358 t->tm_mon--;
10359 } else {
10360 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10362 skip_date_delim_char(ctype, &s);
10363 if(!s.strbuf) {
10364 *err |= IOSTATE_failbit;
10365 break;
10367 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10368 break;
10369 case DATEORDER_ydm:
10370 time_get_char_get_year(this, &s, s, e, base, err, t);
10371 skip_date_delim_char(ctype, &s);
10372 if(!s.strbuf) {
10373 *err |= IOSTATE_failbit;
10374 break;
10376 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10377 skip_date_delim_char(ctype, &s);
10378 if(!s.strbuf) {
10379 *err |= IOSTATE_failbit;
10380 break;
10382 if(ctype_char_is_ch(ctype, _DIGIT, s.val)) {
10383 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10384 t->tm_mon--;
10385 } else {
10386 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10388 break;
10389 default:
10390 ERR("incorrect order value: %d\n", order);
10391 break;
10394 if(!s.strbuf)
10395 *err |= IOSTATE_eofbit;
10396 *ret = s;
10397 return ret;
10400 /* ?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 */
10401 /* ?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 */
10402 DEFINE_THISCALL_WRAPPER(time_get_char_get_date, 36)
10403 istreambuf_iterator_char* __thiscall time_get_char_get_date(const time_get_char *this,
10404 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10405 ios_base *base, int *err, struct tm *t)
10407 return call_time_get_char_do_get_date(this, ret, s, e, base, err, t);
10410 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char*,
10411 istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char,
10412 ios_base*, int*, struct tm*, char, char);
10414 /* ?_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 */
10415 /* ?_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 */
10416 DEFINE_THISCALL_WRAPPER(time_get_char__Getfmt, 40)
10417 istreambuf_iterator_char* __thiscall time_get_char__Getfmt(const time_get_char *this,
10418 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10419 ios_base *base, int *err, struct tm *t, const char *fmt)
10421 ctype_char *ctype;
10423 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
10425 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10426 istreambuf_iterator_char_val(&s);
10428 while(*fmt) {
10429 if(ctype_char_is_ch(ctype, _SPACE, *fmt)) {
10430 skip_ws_char(ctype, &s);
10431 fmt++;
10432 continue;
10435 if(!s.strbuf) {
10436 *err |= IOSTATE_failbit;
10437 break;
10440 if(*fmt == '%') {
10441 fmt++;
10442 time_get_char_get(this, &s, s, e, base, err, t, *fmt, 0);
10443 } else {
10444 if(s.val != *fmt)
10445 *err |= IOSTATE_failbit;
10446 else
10447 istreambuf_iterator_char_inc(&s);
10450 if(*err & IOSTATE_failbit)
10451 break;
10452 fmt++;
10455 if(!s.strbuf)
10456 *err |= IOSTATE_eofbit;
10457 *ret = s;
10458 return ret;
10461 /* ?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 */
10462 /* ?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 */
10463 DEFINE_THISCALL_WRAPPER(time_get_char_do_get, 44) /* virtual */
10464 #if _MSVCP_VER <= 100
10465 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_char*, \
10466 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10467 (this, ret, s, e, base, err, t, fmt, mod))
10468 #else
10469 #define call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_char*, \
10470 (const time_get_char*, istreambuf_iterator_char*, istreambuf_iterator_char, istreambuf_iterator_char, ios_base*, int*, struct tm*, char, char), \
10471 (this, ret, s, e, base, err, t, fmt, mod))
10472 #endif
10473 istreambuf_iterator_char* __thiscall time_get_char_do_get(const time_get_char *this,
10474 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10475 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10477 ctype_char *ctype;
10479 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
10481 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10483 switch(fmt) {
10484 case 'a':
10485 case 'A':
10486 time_get_char_get_weekday(this, &s, s, e, base, err, t);
10487 break;
10488 case 'b':
10489 case 'B':
10490 case 'h':
10491 time_get_char_get_monthname(this, &s, s, e, base, err, t);
10492 break;
10493 case 'c':
10494 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
10495 break;
10496 case 'C':
10497 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10498 if(!(*err & IOSTATE_failbit))
10499 t->tm_year = t->tm_year * 100 - 1900;
10500 break;
10501 case 'd':
10502 case 'e':
10503 if(fmt == 'e') skip_ws_char(ctype, &s);
10504 *err |= time_get_char__Getint(this, &s, &e, 1, 31, &t->tm_mday);
10505 break;
10506 case 'D':
10507 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
10508 break;
10509 case 'F':
10510 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
10511 break;
10512 case 'H':
10513 *err |= time_get_char__Getint(this, &s, &e, 0, 23, &t->tm_hour);
10514 break;
10515 case 'I':
10516 *err |= time_get_char__Getint(this, &s, &e, 0, 11, &t->tm_hour);
10517 break;
10518 case 'j':
10519 *err |= time_get_char__Getint(this, &s, &e, 1, 366, &t->tm_yday);
10520 break;
10521 case 'm':
10522 *err |= time_get_char__Getint(this, &s, &e, 1, 12, &t->tm_mon);
10523 if(!(*err & IOSTATE_failbit))
10524 t->tm_mon--;
10525 break;
10526 case 'M':
10527 *err = time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_min);
10528 break;
10529 case 'n':
10530 case 't':
10531 skip_ws_char(ctype, &s);
10532 break;
10533 case 'p': {
10534 BOOL pm = FALSE;
10536 istreambuf_iterator_char_val(&s);
10537 if(s.strbuf && (s.val=='P' || s.val=='p'))
10538 pm = TRUE;
10539 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
10540 *err |= IOSTATE_failbit;
10541 break;
10543 istreambuf_iterator_char_inc(&s);
10544 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
10545 *err |= IOSTATE_failbit;
10546 break;
10548 istreambuf_iterator_char_inc(&s);
10550 if(pm)
10551 t->tm_hour += 12;
10552 break;
10554 case 'r':
10555 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
10556 break;
10557 case 'R':
10558 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
10559 break;
10560 case 'S':
10561 *err |= time_get_char__Getint(this, &s, &e, 0, 59, &t->tm_sec);
10562 break;
10563 case 'T':
10564 case 'X':
10565 time_get_char__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
10566 break;
10567 case 'u':
10568 *err |= time_get_char__Getint(this, &s, &e, 1, 7, &t->tm_wday);
10569 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
10570 t->tm_wday = 0;
10571 break;
10572 case 'w':
10573 *err |= time_get_char__Getint(this, &s, &e, 0, 6, &t->tm_wday);
10574 break;
10575 case 'x':
10576 time_get_char_get_date(this, &s, s, e, base, err, t);
10577 break;
10578 case 'y':
10579 *err |= time_get_char__Getint(this, &s, &e, 0, 99, &t->tm_year);
10580 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
10581 t->tm_year += 100;
10582 break;
10583 case 'Y':
10584 time_get_char_get_year(this, &s, s, e, base, err, t);
10585 break;
10586 default:
10587 FIXME("unrecognized format: %c\n", fmt);
10588 *err |= IOSTATE_failbit;
10591 if(!s.strbuf)
10592 *err |= IOSTATE_eofbit;
10593 *ret = s;
10594 return ret;
10597 /* ?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 */
10598 /* ?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 */
10599 DEFINE_THISCALL_WRAPPER(time_get_char_get, 44)
10600 istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char *this,
10601 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10602 ios_base *base, int *err, struct tm *t, char fmt, char mod)
10604 return call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod);
10607 /* ?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 */
10608 /* ?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 */
10609 DEFINE_THISCALL_WRAPPER(time_get_char_get_fmt, 44)
10610 istreambuf_iterator_char* __thiscall time_get_char_get_fmt(const time_get_char *this,
10611 istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
10612 ios_base *base, int *err, struct tm *t, const char *fmtstart, const char *fmtend)
10614 ctype_char *ctype;
10616 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_an(fmtstart, fmtend-fmtstart));
10618 ctype = ctype_char_use_facet(IOS_LOCALE(base));
10619 istreambuf_iterator_char_val(&s);
10621 while(fmtstart < fmtend) {
10622 if(ctype_char_is_ch(ctype, _SPACE, *fmtstart)) {
10623 skip_ws_char(ctype, &s);
10624 fmtstart++;
10625 continue;
10628 if(!s.strbuf) {
10629 *err |= IOSTATE_failbit;
10630 break;
10633 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
10634 if(s.val != *fmtstart)
10635 *err |= IOSTATE_failbit;
10636 else
10637 istreambuf_iterator_char_inc(&s);
10638 if(*fmtstart == '%')
10639 fmtstart++;
10640 } else {
10641 fmtstart++;
10642 time_get_char_get(this, &s, s, e, base, err, t, *fmtstart, 0);
10645 if(*err & IOSTATE_failbit)
10646 break;
10647 fmtstart++;
10650 if(!s.strbuf)
10651 *err |= IOSTATE_eofbit;
10652 *ret = s;
10653 return ret;
10656 /* ?id@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A */
10657 locale_id time_get_wchar_id = {0};
10659 /* ??_7?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ */
10660 extern const vtable_ptr time_get_wchar_vtable;
10662 #if _MSVCP_VER >=110
10663 static wchar_t* create_time_get_str(const wchar_t *str)
10665 wchar_t *ret;
10666 int len;
10668 len = lstrlenW(str)+1;
10669 ret = MSVCRT_operator_new(len * sizeof(wchar_t));
10670 if(ret)
10671 memcpy(ret, str, len*sizeof(wchar_t));
10672 return ret;
10674 #else
10675 static wchar_t* create_time_get_str(const char *str, const _Locinfo *locinfo)
10677 wchar_t *ret;
10678 _Cvtvec cvt;
10679 int len;
10681 _Locinfo__Getcvt(locinfo, &cvt);
10682 len = MultiByteToWideChar(cvt.page, 0, str, -1, NULL, 0);
10683 ret = MSVCRT_operator_new(len*sizeof(WCHAR));
10684 if(ret)
10685 MultiByteToWideChar(cvt.page, 0, str, -1, ret, len);
10686 return ret;
10688 #endif
10690 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z */
10691 /* ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z */
10692 DEFINE_THISCALL_WRAPPER(time_get_wchar__Init, 8)
10693 void __thiscall time_get_wchar__Init(time_get_wchar *this, const _Locinfo *locinfo)
10695 TRACE("(%p %p)\n", this, locinfo);
10697 #if _MSVCP_VER >=110
10698 this->days = create_time_get_str(_Locinfo__W_Getdays(locinfo));
10699 #else
10700 this->days = create_time_get_str(_Locinfo__Getdays(locinfo), locinfo);
10701 #endif
10702 if(!this->days)
10704 ERR("Out of memory\n");
10705 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
10708 #if _MSVCP_VER >=110
10709 this->months = create_time_get_str(_Locinfo__W_Getmonths(locinfo));
10710 #else
10711 this->months = create_time_get_str(_Locinfo__Getmonths(locinfo), locinfo);
10712 #endif
10713 if(!this->months)
10715 MSVCRT_operator_delete((wchar_t*)this->days);
10717 ERR("Out of memory\n");
10718 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
10721 this->dateorder = _Locinfo__Getdateorder(locinfo);
10722 _Locinfo__Getcvt(locinfo, &this->cvt);
10725 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z */
10726 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z */
10727 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_locinfo, 12)
10728 time_get_wchar* __thiscall time_get_wchar_ctor_locinfo(time_get_wchar *this,
10729 const _Locinfo *locinfo, size_t refs)
10731 TRACE("(%p %p %Iu)\n", this, locinfo, refs);
10732 locale_facet_ctor_refs(&this->facet, refs);
10733 this->facet.vtable = &time_get_wchar_vtable;
10734 time_get_wchar__Init(this, locinfo);
10735 return this;
10738 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z */
10739 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z */
10740 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_name, 12)
10741 time_get_wchar* __thiscall time_get_wchar_ctor_name(time_get_wchar *this, const char *name, size_t refs)
10743 _Locinfo locinfo;
10745 TRACE("(%p %s %Iu)\n", this, name, refs);
10747 _Locinfo_ctor_cstr(&locinfo, name);
10748 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10749 _Locinfo_dtor(&locinfo);
10750 return this;
10753 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z */
10754 /* ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z */
10755 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor_refs, 8)
10756 time_get_wchar* __thiscall time_get_wchar_ctor_refs(time_get_wchar *this, size_t refs)
10758 _Locinfo locinfo;
10760 TRACE("(%p %Iu)\n", this, refs);
10762 _Locinfo_ctor(&locinfo);
10763 time_get_wchar_ctor_locinfo(this, &locinfo, refs);
10764 _Locinfo_dtor(&locinfo);
10765 return this;
10768 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ */
10769 /* ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ */
10770 DEFINE_THISCALL_WRAPPER(time_get_wchar_ctor, 4)
10771 time_get_wchar* __thiscall time_get_wchar_ctor(time_get_wchar *this)
10773 return time_get_wchar_ctor_refs(this, 0);
10776 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AAEXXZ */
10777 /* ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEAAXXZ */
10778 DEFINE_THISCALL_WRAPPER(time_get_wchar__Tidy, 4)
10779 void __thiscall time_get_wchar__Tidy(time_get_wchar *this)
10781 TRACE("(%p)\n", this);
10783 MSVCRT_operator_delete((wchar_t*)this->days);
10784 MSVCRT_operator_delete((wchar_t*)this->months);
10787 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ */
10788 /* ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ */
10789 DEFINE_THISCALL_WRAPPER(time_get_wchar_dtor, 4) /* virtual */
10790 void __thiscall time_get_wchar_dtor(time_get_wchar *this)
10792 TRACE("(%p)\n", this);
10794 time_get_wchar__Tidy(this);
10797 DEFINE_THISCALL_WRAPPER(time_get_wchar_vector_dtor, 8)
10798 time_get_wchar* __thiscall time_get_wchar_vector_dtor(time_get_wchar *this, unsigned int flags)
10800 TRACE("(%p %x)\n", this, flags);
10801 if(flags & 2) {
10802 /* we have an array, with the number of elements stored before the first object */
10803 INT_PTR i, *ptr = (INT_PTR *)this-1;
10805 for(i=*ptr-1; i>=0; i--)
10806 time_get_wchar_dtor(this+i);
10807 MSVCRT_operator_delete(ptr);
10808 } else {
10809 time_get_wchar_dtor(this);
10810 if(flags & 1)
10811 MSVCRT_operator_delete(this);
10814 return this;
10817 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
10818 /* ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
10819 unsigned int __cdecl time_get_wchar__Getcat(const locale_facet **facet, const locale *loc)
10821 TRACE("(%p %p)\n", facet, loc);
10823 if(facet && !*facet) {
10824 _Locinfo locinfo;
10826 *facet = MSVCRT_operator_new(sizeof(time_get_wchar));
10827 if(!*facet) {
10828 ERR("Out of memory\n");
10829 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
10830 return 0;
10833 _Locinfo_ctor_cstr(&locinfo, locale_string_char_c_str(&loc->ptr->name));
10834 time_get_wchar_ctor_locinfo((time_get_wchar*)*facet, &locinfo, 0);
10835 _Locinfo_dtor(&locinfo);
10838 return LC_TIME;
10841 static time_get_wchar* time_get_wchar_use_facet(const locale *loc)
10843 static time_get_wchar *obj = NULL;
10845 _Lockit lock;
10846 const locale_facet *fac;
10848 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
10849 fac = locale__Getfacet(loc, locale_id_operator_size_t(&time_get_wchar_id));
10850 if(fac) {
10851 _Lockit_dtor(&lock);
10852 return (time_get_wchar*)fac;
10855 if(obj) {
10856 _Lockit_dtor(&lock);
10857 return obj;
10860 time_get_wchar__Getcat(&fac, loc);
10861 obj = (time_get_wchar*)fac;
10862 call_locale_facet__Incref(&obj->facet);
10863 locale_facet_register(&obj->facet);
10864 _Lockit_dtor(&lock);
10866 return obj;
10869 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAAH@Z */
10870 /* ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAEAH@Z */
10871 int __cdecl time_get_wchar__Getint(const time_get_wchar *this,
10872 istreambuf_iterator_wchar *b, istreambuf_iterator_wchar *e,
10873 int min_val, int max_val, int *val)
10875 BOOL got_digit = FALSE;
10876 int len = 0, ret = 0;
10877 char buf[16];
10879 TRACE("(%p %p %p %d %d %p)\n", this, b, e, min_val, max_val, val);
10881 istreambuf_iterator_wchar_val(b);
10882 if(b->strbuf && (b->val == '-' || b->val == '+'))
10884 buf[len++] = b->val;
10885 istreambuf_iterator_wchar_inc(b);
10888 if (b->strbuf && b->val == '0')
10890 got_digit = TRUE;
10891 buf[len++] = '0';
10892 istreambuf_iterator_wchar_inc(b);
10894 while (b->strbuf && b->val == '0')
10895 istreambuf_iterator_wchar_inc(b);
10897 for (; b->strbuf && b->val >= '0' && b->val <= '9';
10898 istreambuf_iterator_wchar_inc(b))
10900 if(len < ARRAY_SIZE(buf)-1)
10901 buf[len] = b->val;
10902 got_digit = TRUE;
10903 len++;
10906 if (!b->strbuf)
10907 ret |= IOSTATE_eofbit;
10908 if (got_digit && len < ARRAY_SIZE(buf)-1)
10910 int v, err;
10912 buf[len] = 0;
10913 v = _Stolx(buf, NULL, 10, &err);
10914 if(err || v < min_val || v > max_val)
10915 ret |= IOSTATE_failbit;
10916 else
10917 *val = v;
10919 else
10920 ret |= IOSTATE_failbit;
10921 return ret;
10924 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ */
10925 /* ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ */
10926 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_date_order, 4) /* virtual */
10927 #if _MSVCP_VER <= 100
10928 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 4, dateorder, (const time_get_wchar*), (this))
10929 #else
10930 #define call_time_get_wchar_do_date_order(this) CALL_VTBL_FUNC(this, 12, dateorder, (const time_get_wchar*), (this))
10931 #endif
10932 dateorder __thiscall time_get_wchar_do_date_order(const time_get_wchar *this)
10934 TRACE("(%p)\n", this);
10935 return this->dateorder;
10938 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ */
10939 /* ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ */
10940 DEFINE_THISCALL_WRAPPER(time_get_wchar_date_order, 4)
10941 dateorder __thiscall time_get_wchar_date_order(const time_get_wchar *this)
10943 return call_time_get_wchar_do_date_order(this);
10946 static int find_longest_match_wchar(istreambuf_iterator_wchar *iter, const wchar_t *str)
10948 int i, len = 0, last_match = -1, match = -1;
10949 const wchar_t *p, *end;
10950 wchar_t buf[64];
10952 for(istreambuf_iterator_wchar_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
10953 istreambuf_iterator_wchar_inc(iter))
10955 BOOL got_prefix = FALSE;
10957 buf[len++] = iter->val;
10958 last_match = match;
10959 match = -1;
10960 for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
10962 end = wcschr(p, ':');
10963 if (!end)
10964 end = p + lstrlenW(p);
10966 if (end-p >= len && !memcmp(p, buf, len*sizeof(wchar_t)))
10968 if (end-p == len)
10969 match = i;
10970 else
10971 got_prefix = TRUE;
10975 if (!got_prefix)
10977 if (match != -1)
10979 istreambuf_iterator_wchar_inc(iter);
10980 return match;
10982 break;
10985 if (len == ARRAY_SIZE(buf))
10986 FIXME("temporary buffer is too small\n");
10987 if (!iter->strbuf)
10988 return match;
10989 return last_match;
10992 /* ?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 */
10993 /* ?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 */
10994 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_monthname, 36) /* virtual */
10995 #if _MSVCP_VER <= 100
10996 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
10997 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
10998 (this, ret, s, e, base, err, t))
10999 #else
11000 #define call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
11001 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11002 (this, ret, s, e, base, err, t))
11003 #endif
11004 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_monthname(const time_get_wchar *this,
11005 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11006 ios_base *base, int *err, struct tm *t)
11008 int match;
11010 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11012 if ((match = find_longest_match_wchar(&s, this->months)) != -1)
11013 t->tm_mon = match / 2;
11014 else
11015 *err |= IOSTATE_failbit;
11017 *ret = s;
11018 return ret;
11021 /* ?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 */
11022 /* ?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 */
11023 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_monthname, 36)
11024 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_monthname(const time_get_wchar *this,
11025 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11026 ios_base *base, int *err, struct tm *t)
11028 return call_time_get_wchar_do_get_monthname(this, ret, s, e, base, err, t);
11031 /* ?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 */
11032 /* ?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 */
11033 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_time, 36) /* virtual */
11034 #if _MSVCP_VER <= 100
11035 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 8, istreambuf_iterator_wchar*, \
11036 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11037 (this, ret, s, e, base, err, t))
11038 #else
11039 #define call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
11040 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11041 (this, ret, s, e, base, err, t))
11042 #endif
11043 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_time(const time_get_wchar *this,
11044 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11045 ios_base *base, int *err, struct tm *t)
11047 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11049 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
11050 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
11051 *err |= IOSTATE_failbit;
11053 if (!*err)
11055 istreambuf_iterator_wchar_inc(&s);
11056 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
11058 if (*err || istreambuf_iterator_wchar_val(&s)!=':')
11059 *err |= IOSTATE_failbit;
11061 if (!*err)
11063 istreambuf_iterator_wchar_inc(&s);
11064 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
11067 *ret = s;
11068 return ret;
11071 /* ?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 */
11072 /* ?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 */
11073 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_time, 36)
11074 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_time(const time_get_wchar *this,
11075 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11076 ios_base *base, int *err, struct tm *t)
11078 return call_time_get_wchar_do_get_time(this, ret, s, e, base, err, t);
11081 /* ?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 */
11082 /* ?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 */
11083 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_weekday, 36) /* virtual */
11084 #if _MSVCP_VER <= 100
11085 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 16, istreambuf_iterator_wchar*, \
11086 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11087 (this, ret, s, e, base, err, t))
11088 #else
11089 #define call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
11090 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11091 (this, ret, s, e, base, err, t))
11092 #endif
11093 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_weekday(const time_get_wchar *this,
11094 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11095 ios_base *base, int *err, struct tm *t)
11097 int match;
11099 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11101 if ((match = find_longest_match_wchar(&s, this->days)) != -1)
11102 t->tm_wday = match / 2;
11103 else
11104 *err |= IOSTATE_failbit;
11106 *ret = s;
11107 return ret;
11110 /* ?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 */
11111 /* ?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 */
11112 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_weekday, 36)
11113 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_weekday(const time_get_wchar *this,
11114 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11115 ios_base *base, int *err, struct tm *t)
11117 return call_time_get_wchar_do_get_weekday(this, ret, s, e, base, err, t);
11120 /* ?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 */
11121 /* ?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 */
11122 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_year, 36) /* virtual */
11123 #if _MSVCP_VER <= 100
11124 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 24, istreambuf_iterator_wchar*, \
11125 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11126 (this, ret, s, e, base, err, t))
11127 #else
11128 #define call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 32, istreambuf_iterator_wchar*, \
11129 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11130 (this, ret, s, e, base, err, t))
11131 #endif
11132 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_year(const time_get_wchar *this,
11133 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11134 ios_base *base, int *err, struct tm *t)
11136 int year;
11138 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11140 /* The function supports only dates from [1900-2035] range */
11141 *err |= time_get_wchar__Getint(this, &s, &e, 0, 2035, &year);
11142 if (!(*err & IOSTATE_failbit))
11144 if (year >= 1900)
11145 year -= 1900;
11146 if (year > 135)
11147 *err |= IOSTATE_failbit;
11148 else
11149 t->tm_year = year;
11152 *ret = s;
11153 return ret;
11156 /* ?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 */
11157 /* ?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 */
11158 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_year, 36)
11159 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_year(const time_get_wchar *this,
11160 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11161 ios_base *base, int *err, struct tm *t)
11163 return call_time_get_wchar_do_get_year(this, ret, s, e, base, err, t);
11166 static void skip_ws_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
11168 istreambuf_iterator_wchar_val(iter);
11169 while(iter->strbuf && ctype_wchar_is_ch(ctype, _SPACE, iter->val))
11170 istreambuf_iterator_wchar_inc(iter);
11173 static void skip_date_delim_wchar(ctype_wchar *ctype, istreambuf_iterator_wchar *iter)
11175 skip_ws_wchar(ctype, iter);
11176 if(iter->strbuf && (iter->val == '/' || iter->val == ':'))
11177 istreambuf_iterator_wchar_inc(iter);
11178 skip_ws_wchar(ctype, iter);
11181 /* ?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 */
11182 /* ?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 */
11183 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get_date, 36) /* virtual */
11184 #if _MSVCP_VER <= 100
11185 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 12, istreambuf_iterator_wchar*, \
11186 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11187 (this, ret, s, e, base, err, t))
11188 #else
11189 #define call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t) CALL_VTBL_FUNC(this, 20, istreambuf_iterator_wchar*, \
11190 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*), \
11191 (this, ret, s, e, base, err, t))
11192 #endif
11193 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get_date(const time_get_wchar *this,
11194 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11195 ios_base *base, int *err, struct tm *t)
11197 ctype_wchar *ctype;
11198 dateorder order;
11200 TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
11202 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11204 order = time_get_wchar_date_order(this);
11205 if(order == DATEORDER_no_order)
11206 order = DATEORDER_mdy;
11208 switch(order) {
11209 case DATEORDER_dmy:
11210 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11211 skip_date_delim_wchar(ctype, &s);
11212 if(!s.strbuf) {
11213 *err |= IOSTATE_failbit;
11214 break;
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 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11228 break;
11229 case DATEORDER_mdy:
11230 istreambuf_iterator_wchar_val(&s);
11231 if(s.strbuf && ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11232 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11233 t->tm_mon--;
11234 } else {
11235 time_get_wchar_get_monthname(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 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11243 skip_date_delim_wchar(ctype, &s);
11244 if(!s.strbuf) {
11245 *err |= IOSTATE_failbit;
11246 break;
11248 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11249 break;
11250 case DATEORDER_ymd:
11251 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11252 skip_date_delim_wchar(ctype, &s);
11253 if(!s.strbuf) {
11254 *err |= IOSTATE_failbit;
11255 break;
11257 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11258 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11259 t->tm_mon--;
11260 } else {
11261 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11263 skip_date_delim_wchar(ctype, &s);
11264 if(!s.strbuf) {
11265 *err |= IOSTATE_failbit;
11266 break;
11268 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11269 break;
11270 case DATEORDER_ydm:
11271 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11272 skip_date_delim_wchar(ctype, &s);
11273 if(!s.strbuf) {
11274 *err |= IOSTATE_failbit;
11275 break;
11277 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11278 skip_date_delim_wchar(ctype, &s);
11279 if(!s.strbuf) {
11280 *err |= IOSTATE_failbit;
11281 break;
11283 if(ctype_wchar_is_ch(ctype, _DIGIT, s.val)) {
11284 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11285 t->tm_mon--;
11286 } else {
11287 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11289 break;
11290 default:
11291 ERR("incorrect order value: %d\n", order);
11292 break;
11295 if(!s.strbuf)
11296 *err |= IOSTATE_eofbit;
11297 *ret = s;
11298 return ret;
11301 /* ?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 */
11302 /* ?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 */
11303 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_date, 36)
11304 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_date(const time_get_wchar *this,
11305 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11306 ios_base *base, int *err, struct tm *t)
11308 return call_time_get_wchar_do_get_date(this, ret, s, e, base, err, t);
11311 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar*,
11312 istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar,
11313 ios_base*, int*, struct tm*, char, char);
11315 /* ?_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 */
11316 /* ?_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 */
11317 DEFINE_THISCALL_WRAPPER(time_get_wchar__Getfmt, 40)
11318 istreambuf_iterator_wchar* __thiscall time_get_wchar__Getfmt(const time_get_wchar *this,
11319 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11320 ios_base *base, int *err, struct tm *t, const char *fmt)
11322 ctype_wchar *ctype;
11324 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, fmt);
11326 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11327 istreambuf_iterator_wchar_val(&s);
11329 while(*fmt) {
11330 if(*fmt == ' ') {
11331 skip_ws_wchar(ctype, &s);
11332 fmt++;
11333 continue;
11336 if(!s.strbuf) {
11337 *err |= IOSTATE_failbit;
11338 break;
11341 if(*fmt == '%') {
11342 fmt++;
11343 time_get_wchar_get(this, &s, s, e, base, err, t, *fmt, 0);
11344 } else {
11345 if(s.val != *fmt)
11346 *err |= IOSTATE_failbit;
11347 else
11348 istreambuf_iterator_wchar_inc(&s);
11351 if(*err & IOSTATE_failbit)
11352 break;
11353 fmt++;
11356 if(!s.strbuf)
11357 *err |= IOSTATE_eofbit;
11358 *ret = s;
11359 return ret;
11362 /* ?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 */
11363 /* ?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 */
11364 DEFINE_THISCALL_WRAPPER(time_get_wchar_do_get, 44) /* virtual */
11365 #if _MSVCP_VER <= 100
11366 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 28, istreambuf_iterator_wchar*, \
11367 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11368 (this, ret, s, e, base, err, t, fmt, mod))
11369 #else
11370 #define call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod) CALL_VTBL_FUNC(this, 36, istreambuf_iterator_wchar*, \
11371 (const time_get_wchar*, istreambuf_iterator_wchar*, istreambuf_iterator_wchar, istreambuf_iterator_wchar, ios_base*, int*, struct tm*, char, char), \
11372 (this, ret, s, e, base, err, t, fmt, mod))
11373 #endif
11374 istreambuf_iterator_wchar* __thiscall time_get_wchar_do_get(const time_get_wchar *this,
11375 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11376 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11378 ctype_wchar *ctype;
11380 TRACE("(%p %p %p %p %p %c %c)\n", this, ret, base, err, t, fmt, mod);
11382 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11384 switch(fmt) {
11385 case 'a':
11386 case 'A':
11387 time_get_wchar_get_weekday(this, &s, s, e, base, err, t);
11388 break;
11389 case 'b':
11390 case 'B':
11391 case 'h':
11392 time_get_wchar_get_monthname(this, &s, s, e, base, err, t);
11393 break;
11394 case 'c':
11395 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%b %d %H:%M:%S %Y");
11396 break;
11397 case 'C':
11398 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11399 if(!(*err & IOSTATE_failbit))
11400 t->tm_year = t->tm_year * 100 - 1900;
11401 break;
11402 case 'd':
11403 case 'e':
11404 if(fmt == 'e') skip_ws_wchar(ctype, &s);
11405 *err |= time_get_wchar__Getint(this, &s, &e, 1, 31, &t->tm_mday);
11406 break;
11407 case 'D':
11408 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%m/%d/%y");
11409 break;
11410 case 'F':
11411 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%Y-%m-%d");
11412 break;
11413 case 'H':
11414 *err |= time_get_wchar__Getint(this, &s, &e, 0, 23, &t->tm_hour);
11415 break;
11416 case 'I':
11417 *err |= time_get_wchar__Getint(this, &s, &e, 0, 11, &t->tm_hour);
11418 break;
11419 case 'j':
11420 *err |= time_get_wchar__Getint(this, &s, &e, 1, 366, &t->tm_yday);
11421 break;
11422 case 'm':
11423 *err |= time_get_wchar__Getint(this, &s, &e, 1, 12, &t->tm_mon);
11424 if(!(*err & IOSTATE_failbit))
11425 t->tm_mon--;
11426 break;
11427 case 'M':
11428 *err = time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_min);
11429 break;
11430 case 'n':
11431 case 't':
11432 skip_ws_wchar(ctype, &s);
11433 break;
11434 case 'p': {
11435 BOOL pm = FALSE;
11437 istreambuf_iterator_wchar_val(&s);
11438 if(s.strbuf && (s.val=='P' || s.val=='p'))
11439 pm = TRUE;
11440 else if (!s.strbuf || (s.val!='A' && s.val!='a')) {
11441 *err |= IOSTATE_failbit;
11442 break;
11444 istreambuf_iterator_wchar_inc(&s);
11445 if(!s.strbuf || (s.val!='M' && s.val!='m')) {
11446 *err |= IOSTATE_failbit;
11447 break;
11449 istreambuf_iterator_wchar_inc(&s);
11451 if(pm)
11452 t->tm_hour += 12;
11453 break;
11455 case 'r':
11456 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%I:%M:%S %p");
11457 break;
11458 case 'R':
11459 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M");
11460 break;
11461 case 'S':
11462 *err |= time_get_wchar__Getint(this, &s, &e, 0, 59, &t->tm_sec);
11463 break;
11464 case 'T':
11465 case 'X':
11466 time_get_wchar__Getfmt(this, &s, s, e, base, err, t, "%H:%M:%S");
11467 break;
11468 case 'u':
11469 *err |= time_get_wchar__Getint(this, &s, &e, 1, 7, &t->tm_wday);
11470 if(!(*err & IOSTATE_failbit) && t->tm_wday==7)
11471 t->tm_wday = 0;
11472 break;
11473 case 'w':
11474 *err |= time_get_wchar__Getint(this, &s, &e, 0, 6, &t->tm_wday);
11475 break;
11476 case 'x':
11477 time_get_wchar_get_date(this, &s, s, e, base, err, t);
11478 break;
11479 case 'y':
11480 *err |= time_get_wchar__Getint(this, &s, &e, 0, 99, &t->tm_year);
11481 if(!(*err & IOSTATE_failbit) && t->tm_year<69)
11482 t->tm_year += 100;
11483 break;
11484 case 'Y':
11485 time_get_wchar_get_year(this, &s, s, e, base, err, t);
11486 break;
11487 default:
11488 FIXME("unrecognized format: %c\n", fmt);
11489 *err |= IOSTATE_failbit;
11492 if(!s.strbuf)
11493 *err |= IOSTATE_eofbit;
11494 *ret = s;
11495 return ret;
11498 /* ?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 */
11499 /* ?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 */
11500 DEFINE_THISCALL_WRAPPER(time_get_wchar_get, 44)
11501 istreambuf_iterator_wchar* __thiscall time_get_wchar_get(const time_get_wchar *this,
11502 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11503 ios_base *base, int *err, struct tm *t, char fmt, char mod)
11505 return call_time_get_wchar_do_get(this, ret, s, e, base, err, t, fmt, mod);
11508 /* ?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 */
11509 /* ?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 */
11510 DEFINE_THISCALL_WRAPPER(time_get_wchar_get_fmt, 44)
11511 istreambuf_iterator_wchar* __thiscall time_get_wchar_get_fmt(const time_get_wchar *this,
11512 istreambuf_iterator_wchar *ret, istreambuf_iterator_wchar s, istreambuf_iterator_wchar e,
11513 ios_base *base, int *err, struct tm *t, const wchar_t *fmtstart, const wchar_t *fmtend)
11515 ctype_wchar *ctype;
11517 TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_wn(fmtstart, fmtend-fmtstart));
11519 ctype = ctype_wchar_use_facet(IOS_LOCALE(base));
11520 istreambuf_iterator_wchar_val(&s);
11522 while(fmtstart < fmtend) {
11523 if(ctype_wchar_is_ch(ctype, _SPACE, *fmtstart)) {
11524 skip_ws_wchar(ctype, &s);
11525 fmtstart++;
11526 continue;
11529 if(!s.strbuf) {
11530 *err |= IOSTATE_failbit;
11531 break;
11534 if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
11535 if(s.val != *fmtstart)
11536 *err |= IOSTATE_failbit;
11537 else
11538 istreambuf_iterator_wchar_inc(&s);
11539 if(*fmtstart == '%')
11540 fmtstart++;
11541 } else {
11542 fmtstart++;
11543 time_get_wchar_get(this, &s, s, e, base, err, t, *fmtstart, 0);
11546 if(*err & IOSTATE_failbit)
11547 break;
11548 fmtstart++;
11551 if(!s.strbuf)
11552 *err |= IOSTATE_eofbit;
11553 *ret = s;
11554 return ret;
11557 /* ??_7_Locimp@locale@std@@6B@ */
11558 extern const vtable_ptr locale__Locimp_vtable;
11560 /* ??0_Locimp@locale@std@@AAE@_N@Z */
11561 /* ??0_Locimp@locale@std@@AEAA@_N@Z */
11562 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor_transparent, 8)
11563 locale__Locimp* __thiscall locale__Locimp_ctor_transparent(locale__Locimp *this, bool transparent)
11565 TRACE("(%p %d)\n", this, transparent);
11567 memset(this, 0, sizeof(locale__Locimp));
11568 locale_facet_ctor_refs(&this->facet, 1);
11569 this->facet.vtable = &locale__Locimp_vtable;
11570 this->transparent = transparent;
11571 locale_string_char_ctor_cstr(&this->name, "*");
11572 return this;
11575 /* ??_F_Locimp@locale@std@@QAEXXZ */
11576 /* ??_F_Locimp@locale@std@@QEAAXXZ */
11577 DEFINE_THISCALL_WRAPPER(locale__Locimp_ctor, 4)
11578 locale__Locimp* __thiscall locale__Locimp_ctor(locale__Locimp *this)
11580 return locale__Locimp_ctor_transparent(this, FALSE);
11583 /* ??0_Locimp@locale@std@@AAE@ABV012@@Z */
11584 /* ??0_Locimp@locale@std@@AEAA@AEBV012@@Z */
11585 DEFINE_THISCALL_WRAPPER(locale__Locimp_copy_ctor, 8)
11586 locale__Locimp* __thiscall locale__Locimp_copy_ctor(locale__Locimp *this, const locale__Locimp *copy)
11588 _Lockit lock;
11589 size_t i;
11591 TRACE("(%p %p)\n", this, copy);
11593 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11594 memcpy(this, copy, sizeof(locale__Locimp));
11595 locale_facet_ctor_refs(&this->facet, 1);
11596 this->facet.vtable = &locale__Locimp_vtable;
11597 if(copy->facetvec) {
11598 this->facetvec = MSVCRT_operator_new(copy->facet_cnt*sizeof(locale_facet*));
11599 if(!this->facetvec) {
11600 _Lockit_dtor(&lock);
11601 ERR("Out of memory\n");
11602 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11603 return NULL;
11605 for(i=0; i<this->facet_cnt; i++)
11607 this->facetvec[i] = copy->facetvec[i];
11608 if(this->facetvec[i])
11609 call_locale_facet__Incref(this->facetvec[i]);
11612 locale_string_char_copy_ctor(&this->name, &copy->name);
11613 _Lockit_dtor(&lock);
11614 return this;
11617 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z */
11618 /* ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z */
11619 locale__Locimp* __cdecl locale__Locimp__Locimp_ctor(locale__Locimp *this, const locale__Locimp *copy)
11621 return locale__Locimp_copy_ctor(this, copy);
11624 /* ??1_Locimp@locale@std@@MAE@XZ */
11625 /* ??1_Locimp@locale@std@@MEAA@XZ */
11626 DEFINE_THISCALL_WRAPPER(locale__Locimp_dtor, 4)
11627 void __thiscall locale__Locimp_dtor(locale__Locimp *this)
11629 size_t i;
11631 TRACE("(%p)\n", this);
11633 locale_facet_dtor(&this->facet);
11634 for(i=0; i<this->facet_cnt; i++)
11635 if(this->facetvec[i] && call_locale_facet__Decref(this->facetvec[i]))
11636 call_locale_facet_vector_dtor(this->facetvec[i], 1);
11638 MSVCRT_operator_delete(this->facetvec);
11639 locale_string_char_dtor(&this->name);
11642 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z */
11643 /* ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z */
11644 void __cdecl locale__Locimp__Locimp_dtor(locale__Locimp *this)
11646 locale__Locimp_dtor(this);
11649 DEFINE_THISCALL_WRAPPER(locale__Locimp_vector_dtor, 8)
11650 locale__Locimp* __thiscall locale__Locimp_vector_dtor(locale__Locimp *this, unsigned int flags)
11652 TRACE("(%p %x)\n", this, flags);
11653 if(flags & 2) {
11654 /* we have an array, with the number of elements stored before the first object */
11655 INT_PTR i, *ptr = (INT_PTR *)this-1;
11657 for(i=*ptr-1; i>=0; i--)
11658 locale__Locimp_dtor(this+i);
11659 MSVCRT_operator_delete(ptr);
11660 } else {
11661 locale__Locimp_dtor(this);
11662 if(flags & 1)
11663 MSVCRT_operator_delete(this);
11666 return this;
11669 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@ABV123@@Z */
11670 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@AEBV123@@Z */
11671 locale__Locimp* __cdecl locale__Locimp__New_Locimp(const locale__Locimp *copy)
11673 locale__Locimp *ret;
11675 TRACE("(%p)\n", copy);
11677 ret = MSVCRT_operator_new(sizeof(locale__Locimp));
11678 if(!ret) {
11679 ERR("Out of memory\n");
11680 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11681 return NULL;
11683 return locale__Locimp_copy_ctor(ret, copy);
11686 /* ?_New_Locimp@_Locimp@locale@std@@CAPAV123@_N@Z */
11687 /* ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z */
11688 locale__Locimp* __cdecl locale__Locimp__New_Locimp_transparent(bool transparent)
11690 locale__Locimp *ret;
11692 TRACE("(%x)\n", transparent);
11694 ret = MSVCRT_operator_new(sizeof(locale__Locimp));
11695 if(!ret) {
11696 ERR("Out of memory\n");
11697 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11698 return NULL;
11700 return locale__Locimp_ctor_transparent(ret, transparent);
11703 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z */
11704 /* ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z */
11705 void __cdecl locale__Locimp__Locimp_Addfac(locale__Locimp *locimp, locale_facet *facet, size_t id)
11707 _Lockit lock;
11709 TRACE("(%p %p %Iu)\n", locimp, facet, id);
11711 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
11712 if(id >= locimp->facet_cnt) {
11713 size_t new_size = id+1;
11714 locale_facet **new_facetvec;
11716 if(new_size < 40)
11717 new_size = 40;
11719 new_facetvec = MSVCRT_operator_new(sizeof(locale_facet*)*new_size);
11720 if(!new_facetvec) {
11721 _Lockit_dtor(&lock);
11722 ERR("Out of memory\n");
11723 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11724 return;
11727 memset(new_facetvec, 0, sizeof(locale_facet*)*new_size);
11728 memcpy(new_facetvec, locimp->facetvec, sizeof(locale_facet*)*locimp->facet_cnt);
11729 MSVCRT_operator_delete(locimp->facetvec);
11730 locimp->facetvec = new_facetvec;
11731 locimp->facet_cnt = new_size;
11734 if(locimp->facetvec[id] && call_locale_facet__Decref(locimp->facetvec[id]))
11735 call_locale_facet_vector_dtor(locimp->facetvec[id], 1);
11737 locimp->facetvec[id] = facet;
11738 if(facet)
11739 call_locale_facet__Incref(facet);
11740 _Lockit_dtor(&lock);
11743 /* ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z */
11744 /* ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z */
11745 DEFINE_THISCALL_WRAPPER(locale__Locimp__Addfac, 12)
11746 void __thiscall locale__Locimp__Addfac(locale__Locimp *this, locale_facet *facet, size_t id)
11748 locale__Locimp__Locimp_Addfac(this, facet, id);
11751 /* ?_Clocptr_func@_Locimp@locale@std@@CAAAPAV123@XZ */
11752 /* ?_Clocptr_func@_Locimp@locale@std@@CAAEAPEAV123@XZ */
11753 locale__Locimp** __cdecl locale__Locimp__Clocptr_func(void)
11755 FIXME("stub\n");
11756 return NULL;
11759 /* ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11760 /* ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11761 /* List of missing facets:
11762 * messages, money_get, money_put, moneypunct, moneypunct, time_get
11764 void __cdecl locale__Locimp__Makeushloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11766 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11768 if(cat & (1<<(ctype_short__Getcat(NULL, NULL)-1))) {
11769 ctype_wchar *ctype;
11771 if(loc) {
11772 ctype = ctype_short_use_facet(loc);
11773 }else {
11774 ctype = MSVCRT_operator_new(sizeof(ctype_wchar));
11775 if(!ctype) {
11776 ERR("Out of memory\n");
11777 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11779 ctype_short_ctor_locinfo(ctype, locinfo, 0);
11781 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_short_id));
11784 if(cat & (1<<(num_get_short__Getcat(NULL, NULL)-1))) {
11785 num_get *numget;
11787 if(loc) {
11788 numget = num_get_short_use_facet(loc);
11789 }else {
11790 numget = MSVCRT_operator_new(sizeof(num_get));
11791 if(!numget) {
11792 ERR("Out of memory\n");
11793 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11795 num_get_short_ctor_locinfo(numget, locinfo, 0);
11797 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_short_id));
11800 if(cat & (1<<(num_put_short__Getcat(NULL, NULL)-1))) {
11801 num_put *numput;
11803 if(loc) {
11804 numput = num_put_short_use_facet(loc);
11805 }else {
11806 numput = MSVCRT_operator_new(sizeof(num_put));
11807 if(!numput) {
11808 ERR("Out of memory\n");
11809 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11811 num_put_short_ctor_locinfo(numput, locinfo, 0);
11813 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_short_id));
11816 if(cat & (1<<(numpunct_short__Getcat(NULL, NULL)-1))) {
11817 numpunct_wchar *numpunct;
11819 if(loc) {
11820 numpunct = numpunct_short_use_facet(loc);
11821 }else {
11822 numpunct = MSVCRT_operator_new(sizeof(numpunct_wchar));
11823 if(!numpunct) {
11824 ERR("Out of memory\n");
11825 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11827 numpunct_short_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11829 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_short_id));
11832 if(cat & (1<<(collate_short__Getcat(NULL, NULL)-1))) {
11833 collate *c;
11835 if(loc) {
11836 c = collate_short_use_facet(loc);
11837 }else {
11838 c = MSVCRT_operator_new(sizeof(collate));
11839 if(!c) {
11840 ERR("Out of memory\n");
11841 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11843 collate_short_ctor_locinfo(c, locinfo, 0);
11845 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_short_id));
11848 if(cat & (1<<(time_put_short__Getcat(NULL, NULL)-1))) {
11849 time_put *t;
11851 if(loc) {
11852 t = time_put_short_use_facet(loc);
11853 }else {
11854 t = MSVCRT_operator_new(sizeof(time_put));
11855 if(!t) {
11856 ERR("Out of memory\n");
11857 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11859 time_put_short_ctor_locinfo(t, locinfo, 0);
11861 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_short_id));
11864 if(cat & (1<<(codecvt_short__Getcat(NULL, NULL)-1))) {
11865 codecvt_wchar *codecvt;
11867 if(loc) {
11868 codecvt = codecvt_short_use_facet(loc);
11869 }else {
11870 codecvt = MSVCRT_operator_new(sizeof(codecvt_wchar));
11871 if(!codecvt) {
11872 ERR("Out of memory\n");
11873 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11875 codecvt_short_ctor_locinfo(codecvt, locinfo, 0);
11877 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_short_id));
11881 /* ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
11882 /* ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
11883 /* List of missing facets:
11884 * messages, money_get, money_put, moneypunct, moneypunct
11886 void __cdecl locale__Locimp__Makewloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
11888 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
11890 if(cat & (1<<(ctype_wchar__Getcat(NULL, NULL)-1))) {
11891 ctype_wchar *ctype;
11893 if(loc) {
11894 ctype = ctype_wchar_use_facet(loc);
11895 }else {
11896 ctype = MSVCRT_operator_new(sizeof(ctype_wchar));
11897 if(!ctype) {
11898 ERR("Out of memory\n");
11899 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11901 ctype_wchar_ctor_locinfo(ctype, locinfo, 0);
11903 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_wchar_id));
11906 if(cat & (1<<(num_get_wchar__Getcat(NULL, NULL)-1))) {
11907 num_get *numget;
11909 if(loc) {
11910 numget = num_get_wchar_use_facet(loc);
11911 }else {
11912 numget = MSVCRT_operator_new(sizeof(num_get));
11913 if(!numget) {
11914 ERR("Out of memory\n");
11915 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11917 num_get_wchar_ctor_locinfo(numget, locinfo, 0);
11919 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_wchar_id));
11922 if(cat & (1<<(num_put_wchar__Getcat(NULL, NULL)-1))) {
11923 num_put *numput;
11925 if(loc) {
11926 numput = num_put_wchar_use_facet(loc);
11927 }else {
11928 numput = MSVCRT_operator_new(sizeof(num_put));
11929 if(!numput) {
11930 ERR("Out of memory\n");
11931 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11933 num_put_wchar_ctor_locinfo(numput, locinfo, 0);
11935 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_wchar_id));
11938 if(cat & (1<<(numpunct_wchar__Getcat(NULL, NULL)-1))) {
11939 numpunct_wchar *numpunct;
11941 if(loc) {
11942 numpunct = numpunct_wchar_use_facet(loc);
11943 }else {
11944 numpunct = MSVCRT_operator_new(sizeof(numpunct_wchar));
11945 if(!numpunct) {
11946 ERR("Out of memory\n");
11947 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11949 numpunct_wchar_ctor_locinfo(numpunct, locinfo, 0, FALSE);
11951 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_wchar_id));
11954 if(cat & (1<<(collate_wchar__Getcat(NULL, NULL)-1))) {
11955 collate *c;
11957 if(loc) {
11958 c = collate_wchar_use_facet(loc);
11959 }else {
11960 c = MSVCRT_operator_new(sizeof(collate));
11961 if(!c) {
11962 ERR("Out of memory\n");
11963 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11965 collate_wchar_ctor_locinfo(c, locinfo, 0);
11967 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_wchar_id));
11970 if(cat & (1<<(time_get_wchar__Getcat(NULL, NULL)-1))) {
11971 time_get_wchar *t;
11973 if(loc) {
11974 t = time_get_wchar_use_facet(loc);
11975 }else {
11976 t = MSVCRT_operator_new(sizeof(time_get_wchar));
11977 if(!t) {
11978 ERR("Out of memory\n");
11979 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11981 time_get_wchar_ctor_locinfo(t, locinfo, 0);
11983 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_wchar_id));
11986 if(cat & (1<<(time_put_wchar__Getcat(NULL, NULL)-1))) {
11987 time_put *t;
11989 if(loc) {
11990 t = time_put_wchar_use_facet(loc);
11991 }else {
11992 t = MSVCRT_operator_new(sizeof(time_put));
11993 if(!t) {
11994 ERR("Out of memory\n");
11995 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
11997 time_put_wchar_ctor_locinfo(t, locinfo, 0);
11999 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_wchar_id));
12002 if(cat & (1<<(codecvt_wchar__Getcat(NULL, NULL)-1))) {
12003 codecvt_wchar *codecvt;
12005 if(loc) {
12006 codecvt = codecvt_wchar_use_facet(loc);
12007 }else {
12008 codecvt = MSVCRT_operator_new(sizeof(codecvt_wchar));
12009 if(!codecvt) {
12010 ERR("Out of memory\n");
12011 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12013 codecvt_wchar_ctor_locinfo(codecvt, locinfo, 0);
12015 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_wchar_id));
12019 /* ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z */
12020 /* ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
12021 /* List of missing facets:
12022 * messages, money_get, money_put, moneypunct, moneypunct
12024 void __cdecl locale__Locimp__Makexloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
12026 FIXME("(%p %d %p %p) semi-stub\n", locinfo, cat, locimp, loc);
12028 if(cat & (1<<(ctype_char__Getcat(NULL, NULL)-1))) {
12029 ctype_char *ctype;
12031 if(loc) {
12032 ctype = ctype_char_use_facet(loc);
12033 }else {
12034 ctype = MSVCRT_operator_new(sizeof(ctype_char));
12035 if(!ctype) {
12036 ERR("Out of memory\n");
12037 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12039 ctype_char_ctor_locinfo(ctype, locinfo, 0);
12041 locale__Locimp__Addfac(locimp, &ctype->base.facet, locale_id_operator_size_t(&ctype_char_id));
12044 if(cat & (1<<(num_get_char__Getcat(NULL, NULL)-1))) {
12045 num_get *numget;
12047 if(loc) {
12048 numget = num_get_char_use_facet(loc);
12049 }else {
12050 numget = MSVCRT_operator_new(sizeof(num_get));
12051 if(!numget) {
12052 ERR("Out of memory\n");
12053 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12055 num_get_char_ctor_locinfo(numget, locinfo, 0);
12057 locale__Locimp__Addfac(locimp, &numget->facet, locale_id_operator_size_t(&num_get_char_id));
12060 if(cat & (1<<(num_put_char__Getcat(NULL, NULL)-1))) {
12061 num_put *numput;
12063 if(loc) {
12064 numput = num_put_char_use_facet(loc);
12065 }else {
12066 numput = MSVCRT_operator_new(sizeof(num_put));
12067 if(!numput) {
12068 ERR("Out of memory\n");
12069 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12071 num_put_char_ctor_locinfo(numput, locinfo, 0);
12073 locale__Locimp__Addfac(locimp, &numput->facet, locale_id_operator_size_t(&num_put_char_id));
12076 if(cat & (1<<(numpunct_char__Getcat(NULL, NULL)-1))) {
12077 numpunct_char *numpunct;
12079 if(loc) {
12080 numpunct = numpunct_char_use_facet(loc);
12081 }else {
12082 numpunct = MSVCRT_operator_new(sizeof(numpunct_char));
12083 if(!numpunct) {
12084 ERR("Out of memory\n");
12085 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12087 numpunct_char_ctor_locinfo(numpunct, locinfo, 0, FALSE);
12089 locale__Locimp__Addfac(locimp, &numpunct->facet, locale_id_operator_size_t(&numpunct_char_id));
12092 if(cat & (1<<(collate_char__Getcat(NULL, NULL)-1))) {
12093 collate *c;
12095 if(loc) {
12096 c = collate_char_use_facet(loc);
12097 }else {
12098 c = MSVCRT_operator_new(sizeof(collate));
12099 if(!c) {
12100 ERR("Out of memory\n");
12101 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12103 collate_char_ctor_locinfo(c, locinfo, 0);
12105 locale__Locimp__Addfac(locimp, &c->facet, locale_id_operator_size_t(&collate_char_id));
12108 if(cat & (1<<(time_get_char__Getcat(NULL, NULL)-1))) {
12109 time_get_char *t;
12111 if(loc) {
12112 t = time_get_char_use_facet(loc);
12113 }else {
12114 t = MSVCRT_operator_new(sizeof(time_get_char));
12115 if(!t) {
12116 ERR("Out of memory\n");
12117 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12119 time_get_char_ctor_locinfo(t, locinfo, 0);
12121 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_get_char_id));
12124 if(cat & (1<<(time_put_char__Getcat(NULL, NULL)-1))) {
12125 time_put *t;
12127 if(loc) {
12128 t = time_put_char_use_facet(loc);
12129 }else {
12130 t = MSVCRT_operator_new(sizeof(time_put));
12131 if(!t) {
12132 ERR("Out of memory\n");
12133 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12135 time_put_char_ctor_locinfo(t, locinfo, 0);
12137 locale__Locimp__Addfac(locimp, &t->facet, locale_id_operator_size_t(&time_put_char_id));
12140 if(cat & (1<<(codecvt_char__Getcat(NULL, NULL)-1))) {
12141 codecvt_char *codecvt;
12143 if(loc) {
12144 codecvt = codecvt_char_use_facet(loc);
12145 }else {
12146 codecvt = MSVCRT_operator_new(sizeof(codecvt_char));
12147 if(!codecvt) {
12148 ERR("Out of memory\n");
12149 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12151 codecvt_char_ctor_locinfo(codecvt, locinfo, 0);
12153 locale__Locimp__Addfac(locimp, &codecvt->base.facet, locale_id_operator_size_t(&codecvt_char_id));
12157 /* ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z */
12158 /* ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z */
12159 locale__Locimp* __cdecl locale__Locimp__Makeloc(const _Locinfo *locinfo, category cat, locale__Locimp *locimp, const locale *loc)
12161 TRACE("(%p %d %p %p)\n", locinfo, cat, locimp, loc);
12163 locale__Locimp__Makexloc(locinfo, cat, locimp, loc);
12164 locale__Locimp__Makewloc(locinfo, cat, locimp, loc);
12165 locale__Locimp__Makeushloc(locinfo, cat, locimp, loc);
12167 locimp->catmask |= cat;
12168 locale_string_char_assign(&locimp->name, &locinfo->newlocname);
12169 return locimp;
12172 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
12173 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
12174 DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
12175 locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
12177 TRACE("(%p %p)\n", this, locimp);
12178 /* Don't change locimp reference counter */
12179 this->ptr = locimp;
12180 return this;
12183 /* ?_Init@locale@std@@CAPAV_Locimp@12@XZ */
12184 /* ?_Init@locale@std@@CAPEAV_Locimp@12@XZ */
12185 locale__Locimp* __cdecl locale__Init(void)
12187 _Lockit lock;
12189 TRACE("\n");
12191 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12192 if(global_locale) {
12193 _Lockit_dtor(&lock);
12194 return global_locale;
12197 global_locale = MSVCRT_operator_new(sizeof(locale__Locimp));
12198 if(!global_locale) {
12199 _Lockit_dtor(&lock);
12200 ERR("Out of memory\n");
12201 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12202 return NULL;
12205 locale__Locimp_ctor(global_locale);
12206 global_locale->catmask = (1<<(LC_MAX+1))-1;
12207 locale_string_char_dtor(&global_locale->name);
12208 locale_string_char_ctor_cstr(&global_locale->name, "C");
12210 locale__Locimp__Clocptr = global_locale;
12211 global_locale->facet.refs++;
12212 locale_ctor_locimp(&classic_locale, locale__Locimp__Clocptr);
12213 _Lockit_dtor(&lock);
12215 return global_locale;
12218 /* ?_Init@locale@std@@CAPAV_Locimp@12@_N@Z */
12219 /* ?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z */
12220 locale__Locimp* __cdecl locale__Init_ref(bool inc_ref)
12222 locale__Locimp *ret;
12223 _Lockit lock;
12225 TRACE("(%x)\n", inc_ref);
12227 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12228 if(inc_ref && global_locale) {
12229 call_locale_facet__Incref(&global_locale->facet);
12230 _Lockit_dtor(&lock);
12231 return global_locale;
12234 ret = locale__Init();
12235 _Lockit_dtor(&lock);
12236 return ret;
12239 /* ?_Iscloc@locale@std@@QBE_NXZ */
12240 /* ?_Iscloc@locale@std@@QEBA_NXZ */
12241 DEFINE_THISCALL_WRAPPER(locale__Iscloc, 4)
12242 bool __thiscall locale__Iscloc(const locale *this)
12244 TRACE("(%p)\n", this);
12245 return this->ptr == locale__Locimp__Clocptr;
12248 /* ??0locale@std@@QAE@ABV01@0H@Z */
12249 /* ??0locale@std@@QEAA@AEBV01@0H@Z */
12250 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
12251 locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
12253 _Locinfo locinfo;
12255 TRACE("(%p %p %p %d)\n", this, loc, other, cat);
12257 this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12258 if(!this->ptr) {
12259 ERR("Out of memory\n");
12260 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12262 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
12264 _Locinfo_ctor_cat_cstr(&locinfo, loc->ptr->catmask, locale_string_char_c_str(&loc->ptr->name));
12265 _Locinfo__Addcats(&locinfo, cat & other->ptr->catmask, locale_string_char_c_str(&other->ptr->name));
12266 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, other);
12267 _Locinfo_dtor(&locinfo);
12269 return this;
12272 /* ??0locale@std@@QAE@ABV01@@Z */
12273 /* ??0locale@std@@QEAA@AEBV01@@Z */
12274 DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
12275 locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
12277 TRACE("(%p %p)\n", this, copy);
12278 this->ptr = copy->ptr;
12279 call_locale_facet__Incref(&this->ptr->facet);
12280 return this;
12283 /* ??0locale@std@@QAE@ABV01@PBDH@Z */
12284 /* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
12285 DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
12286 locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
12288 _Locinfo locinfo;
12290 TRACE("(%p %p %s %d)\n", this, loc, locname, cat);
12292 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
12293 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
12294 _Locinfo_dtor(&locinfo);
12295 MSVCRT_operator_delete(this->ptr);
12296 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
12299 this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12300 if(!this->ptr) {
12301 ERR("Out of memory\n");
12302 _Locinfo_dtor(&locinfo);
12303 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12305 locale__Locimp_copy_ctor(this->ptr, loc->ptr);
12307 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
12308 _Locinfo_dtor(&locinfo);
12309 return this;
12312 /* ??0locale@std@@QAE@PBDH@Z */
12313 /* ??0locale@std@@QEAA@PEBDH@Z */
12314 DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
12315 locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
12317 _Locinfo locinfo;
12319 TRACE("(%p %s %d)\n", this, locname, cat);
12321 this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12322 if(!this->ptr) {
12323 ERR("Out of memory\n");
12324 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12326 locale__Locimp_ctor(this->ptr);
12328 locale__Init();
12330 _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
12331 if(!memcmp(locale_string_char_c_str(&locinfo.newlocname), "*", 2)) {
12332 _Locinfo_dtor(&locinfo);
12333 MSVCRT_operator_delete(this->ptr);
12334 throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
12337 locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
12338 _Locinfo_dtor(&locinfo);
12340 return this;
12343 /* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
12344 /* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
12345 DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
12346 locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
12348 TRACE("(%p)\n", this);
12349 this->ptr = NULL;
12350 return this;
12353 /* ??0locale@std@@QAE@XZ */
12354 /* ??0locale@std@@QEAA@XZ */
12355 DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
12356 locale* __thiscall locale_ctor(locale *this)
12358 TRACE("(%p)\n", this);
12359 this->ptr = locale__Init();
12360 call_locale_facet__Incref(&this->ptr->facet);
12361 return this;
12364 /* ??1locale@std@@QAE@XZ */
12365 /* ??1locale@std@@QEAA@XZ */
12366 DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
12367 void __thiscall locale_dtor(locale *this)
12369 TRACE("(%p)\n", this);
12370 if(this->ptr && call_locale_facet__Decref(&this->ptr->facet))
12372 locale__Locimp_dtor(this->ptr);
12373 MSVCRT_operator_delete(this->ptr);
12377 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
12378 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
12379 DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
12380 locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
12382 FIXME("(%p %p) stub\n", this, loc);
12383 return NULL;
12386 /* ??8locale@std@@QBE_NABV01@@Z */
12387 /* ??8locale@std@@QEBA_NAEBV01@@Z */
12388 DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
12389 bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
12391 FIXME("(%p %p) stub\n", this, loc);
12392 return 0;
12395 /* ??9locale@std@@QBE_NABV01@@Z */
12396 /* ??9locale@std@@QEBA_NAEBV01@@Z */
12397 DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
12398 bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
12400 FIXME("(%p %p) stub\n", this, loc);
12401 return 0;
12404 /* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
12405 /* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
12406 DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
12407 locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, size_t id, size_t catmask)
12409 TRACE("(%p %p %Iu %Iu)\n", this, facet, id, catmask);
12411 if(this->ptr->facet.refs > 1) {
12412 locale__Locimp *new_ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12413 if(!new_ptr) {
12414 ERR("Out of memory\n");
12415 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12416 return NULL;
12418 locale__Locimp_copy_ctor(new_ptr, this->ptr);
12419 call_locale_facet__Decref(&this->ptr->facet);
12420 this->ptr = new_ptr;
12423 locale__Locimp__Addfac(this->ptr, facet, id);
12425 if(catmask) {
12426 locale_string_char_dtor(&this->ptr->name);
12427 locale_string_char_ctor_cstr(&this->ptr->name, "*");
12429 return this;
12432 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I_N@Z */
12433 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K_N@Z */
12434 DEFINE_THISCALL_WRAPPER(locale__Getfacet_bool, 12)
12435 const locale_facet* __thiscall locale__Getfacet_bool(const locale *this,
12436 size_t id, bool allow_transparent)
12438 locale_facet *fac;
12440 TRACE("(%p %Iu)\n", this, id);
12442 fac = id < this->ptr->facet_cnt ? this->ptr->facetvec[id] : NULL;
12443 if(fac || !this->ptr->transparent || !allow_transparent)
12444 return fac;
12446 return id < global_locale->facet_cnt ? global_locale->facetvec[id] : NULL;
12449 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
12450 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
12451 DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
12452 const locale_facet* __thiscall locale__Getfacet(const locale *this, size_t id)
12454 return locale__Getfacet_bool( this, id, TRUE );
12457 /* ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ */
12458 /* ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ */
12459 locale__Locimp* __cdecl locale__Getgloballocale(void)
12461 TRACE("\n");
12462 return global_locale;
12465 /* ?_Setgloballocale@locale@std@@CAXPAX@Z */
12466 /* ?_Setgloballocale@locale@std@@CAXPEAX@Z */
12467 void __cdecl locale__Setgloballocale(void *locimp)
12469 TRACE("(%p)\n", locimp);
12470 global_locale = locimp;
12473 /* ?classic@locale@std@@SAABV12@XZ */
12474 /* ?classic@locale@std@@SAAEBV12@XZ */
12475 const locale* __cdecl locale_classic(void)
12477 TRACE("\n");
12478 locale__Init();
12479 return &classic_locale;
12482 /* ?empty@locale@std@@SA?AV12@XZ */
12483 locale* __cdecl locale_empty(locale *ret)
12485 TRACE("\n");
12487 locale__Init();
12489 ret->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
12490 if(!ret->ptr) {
12491 ERR("Out of memory\n");
12492 throw_exception(EXCEPTION_BAD_ALLOC, NULL);
12494 locale__Locimp_ctor_transparent(ret->ptr, TRUE);
12495 return ret;
12498 /* ?global@locale@std@@SA?AV12@ABV12@@Z */
12499 /* ?global@locale@std@@SA?AV12@AEBV12@@Z */
12500 locale* __cdecl locale_global(locale *ret, const locale *loc)
12502 _Lockit lock;
12503 int i;
12505 TRACE("(%p %p)\n", loc, ret);
12507 _Lockit_ctor_locktype(&lock, _LOCK_LOCALE);
12508 locale_ctor(ret);
12510 if(loc->ptr != global_locale) {
12511 call_locale_facet__Decref(&global_locale->facet);
12512 global_locale = loc->ptr;
12513 call_locale_facet__Incref(&global_locale->facet);
12515 for(i=LC_ALL+1; i<=LC_MAX; i++) {
12516 if((global_locale->catmask & (1<<(i-1))) == 0)
12517 continue;
12518 setlocale(i, locale_string_char_c_str(&global_locale->name));
12521 _Lockit_dtor(&lock);
12522 return ret;
12525 #if _MSVCP_VER < 100
12527 /* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12528 /* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12529 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
12530 basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
12532 TRACE("(%p)\n", this);
12534 MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
12535 return ret;
12538 /* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12539 /* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
12540 DEFINE_THISCALL_WRAPPER(locale_name, 8)
12541 basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
12543 TRACE( "(%p)\n", this);
12544 MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
12545 return ret;
12548 #else
12550 /* ?_Getname@_Locinfo@std@@QBEPBDXZ */
12551 /* ?_Getname@_Locinfo@std@@QEBAPEBDXZ */
12552 DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 4)
12553 const char * __thiscall _Locinfo__Getname( const _Locinfo *this )
12555 return locale_string_char_c_str( &this->newlocname );
12558 #endif /* _MSVCP_VER < 100 */
12560 /* wctrans */
12561 wctrans_t __cdecl wctrans(const char *property)
12563 static const char str_tolower[] = "tolower";
12564 static const char str_toupper[] = "toupper";
12566 if(!strcmp(property, str_tolower))
12567 return 2;
12568 if(!strcmp(property, str_toupper))
12569 return 1;
12570 return 0;
12573 /* towctrans */
12574 wint_t __cdecl towctrans(wint_t c, wctrans_t category)
12576 if(category == 1)
12577 return towupper(c);
12578 return towlower(c);
12581 #if _MSVCP_VER <= 71
12582 /* btowc */
12583 wint_t __cdecl btowc(int c)
12585 wchar_t ret;
12586 int state = 0;
12587 char ch = c;
12589 if (c == EOF || _Mbrtowc( &ret, &ch, 1, &state, NULL ) != 1) return WEOF;
12590 return ret;
12593 /* mbrlen */
12594 size_t __cdecl mbrlen(const char *str, size_t n, mbstate_t *state)
12596 static int local_state;
12598 if (!state) state = &local_state;
12599 return _Mbrtowc( NULL, str, n, state, NULL );
12602 /* mbrtowc */
12603 size_t __cdecl mbrtowc(wchar_t *dst, const char *str, size_t n, mbstate_t *state)
12605 static int local_state;
12607 if (!state) state = &local_state;
12608 return _Mbrtowc( dst, str, n, state, NULL );
12611 /* mbsrtowcs */
12612 size_t __cdecl mbsrtowcs(wchar_t *dst, const char **pstr, size_t n, mbstate_t *state)
12614 static int local_state;
12615 size_t ret = 0;
12616 wchar_t wc;
12617 const char *src;
12619 src = *pstr;
12620 if (!state) state = &local_state;
12622 while (!dst || n > ret)
12624 int len = _Mbrtowc( &wc, src, 2, state, NULL );
12625 if (len < 0) return -1;
12626 if (!len) break;
12627 if (dst) dst[ret] = wc;
12628 ret++;
12629 if (!wc) break;
12630 src += len;
12632 return ret;
12635 /* wctob */
12636 int __cdecl wctob(wint_t wc)
12638 char ret[MB_LEN_MAX];
12640 if (wc == WEOF || _Wcrtomb( ret, wc, NULL, NULL ) != 1) return EOF;
12641 return ret[0];
12644 /* wcrtomb */
12645 size_t __cdecl wcrtomb(char *dst, wchar_t wc, mbstate_t *state)
12647 return _Wcrtomb( dst, wc, state, NULL );
12650 /* wcsrtombs */
12651 size_t __cdecl wcsrtombs(char *dst, const wchar_t **pstr, size_t n, mbstate_t *state)
12653 const wchar_t *src;
12654 char buffer[MB_LEN_MAX];
12655 size_t ret = 0;
12657 src = *pstr;
12659 while (!dst || n > ret)
12661 int len = _Wcrtomb( buffer, *src, state, NULL );
12662 if (len <= 0) return -1;
12663 if (n < ret + len) break;
12664 memcpy( dst + ret, buffer, len );
12665 ret += len;
12666 if (!buffer[0]) break;
12667 src++;
12669 return ret;
12671 #endif
12673 int __cdecl _To_byte(const wchar_t *src, char *dst)
12675 TRACE("(%s %p)\n", debugstr_w(src), dst);
12676 return WideCharToMultiByte(CP_ACP, 0, src, -1, dst, MAX_PATH, NULL, NULL);
12679 int __cdecl _To_wide(const char *src, wchar_t *dst)
12681 TRACE("(%s %p)\n", debugstr_a(src), dst);
12682 return MultiByteToWideChar(CP_ACP, 0, src, -1, dst, MAX_PATH);
12685 size_t __cdecl _Strxfrm(char *dest, char *dest_end,
12686 const char *src, const char *src_end, _Collvec *coll)
12688 size_t dest_len = dest_end - dest;
12689 size_t src_len = src_end - src;
12690 _Collvec cv;
12691 WCHAR *buf;
12692 LCID lcid;
12693 int len;
12695 TRACE("(%p %p %p %p %p)\n", dest, dest_end, src, src_end, coll);
12697 if (coll) cv = *coll;
12698 else getcoll(&cv);
12700 #if _MSVCP_VER < 110
12701 lcid = cv.handle;
12702 #else
12703 lcid = LocaleNameToLCID(cv.lc_name, 0);
12704 #endif
12706 if (!lcid && !cv.page)
12708 if (src_len > dest_len) return src_len;
12709 memcpy(dest, src, src_len);
12710 return src_len;
12713 len = MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, NULL, 0);
12714 if (!len) return INT_MAX;
12715 buf = heap_alloc(len * sizeof(WCHAR));
12716 if (!buf) return INT_MAX;
12717 MultiByteToWideChar(cv.page, MB_ERR_INVALID_CHARS, src, src_len, buf, len);
12719 len = LCMapStringW(lcid, LCMAP_SORTKEY, buf, len, NULL, 0);
12720 if (len <= dest_len)
12721 LCMapStringW(lcid, LCMAP_SORTKEY, buf, len, (WCHAR*)dest, dest_len);
12722 heap_free(buf);
12723 return len;
12726 size_t __cdecl _Wcsxfrm(wchar_t *dest, wchar_t *dest_end,
12727 const wchar_t *src, const wchar_t *src_end, _Collvec *coll)
12729 size_t dest_len = dest_end - dest;
12730 size_t src_len = src_end - src;
12731 _Collvec cv;
12732 LCID lcid;
12733 int i, len;
12735 TRACE("(%p %p %p %p %p)\n", dest, dest_end, src, src_end, coll);
12737 if (coll) cv = *coll;
12738 else getcoll(&cv);
12740 #if _MSVCP_VER < 110
12741 lcid = cv.handle;
12742 #else
12743 lcid = LocaleNameToLCID(cv.lc_name, 0);
12744 #endif
12746 if (!lcid)
12748 if (src_len > dest_len) return src_len;
12749 memcpy(dest, src, src_len * sizeof(wchar_t));
12750 return src_len;
12753 len = LCMapStringW(lcid, LCMAP_SORTKEY, src, src_len, NULL, 0);
12754 if (!len) return INT_MAX;
12755 if (len > dest_len) return len;
12757 LCMapStringW(lcid, LCMAP_SORTKEY, src, src_len, dest, dest_len);
12758 for (i = len - 1; i >= 0; i--)
12759 dest[i] = ((BYTE*)dest)[i];
12760 return len;
12763 DEFINE_RTTI_DATA0(_Facet_base, 0, ".?AV_Facet_base@std@@")
12764 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@")
12765 DEFINE_RTTI_DATA1(locale__Locimp, 0, &locale_facet_rtti_base_descriptor, ".?AV_Locimp@locale@std@@")
12766 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@")
12767 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@")
12768 DEFINE_RTTI_DATA1(collate_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@G@std@@")
12769 DEFINE_RTTI_DATA1(ctype_base, 0, &locale_facet_rtti_base_descriptor, ".?AUctype_base@std@@")
12770 DEFINE_RTTI_DATA2(ctype_char, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@D@std@@")
12771 DEFINE_RTTI_DATA2(ctype_wchar, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@_W@std@@")
12772 DEFINE_RTTI_DATA2(ctype_short, 0, &ctype_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$ctype@G@std@@")
12773 DEFINE_RTTI_DATA1(codecvt_base, 0, &locale_facet_rtti_base_descriptor, ".?AVcodecvt_base@std@@")
12774 #if _MSVCP_VER >= 140
12775 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDU_Mbstatet@@@std@@")
12776 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDU_Mbstatet@@@std@@")
12777 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDU_Mbstatet@@@std@@")
12778 #else
12779 DEFINE_RTTI_DATA2(codecvt_char, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@DDH@std@@")
12780 DEFINE_RTTI_DATA2(codecvt_wchar, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@_WDH@std@@")
12781 DEFINE_RTTI_DATA2(codecvt_short, 0, &codecvt_base_rtti_base_descriptor, &locale_facet_rtti_base_descriptor, ".?AV?$codecvt@GDH@std@@")
12782 #endif
12783 DEFINE_RTTI_DATA1(numpunct_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@D@std@@")
12784 DEFINE_RTTI_DATA1(numpunct_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@_W@std@@")
12785 DEFINE_RTTI_DATA1(numpunct_short, 0, &locale_facet_rtti_base_descriptor, ".?AV?$numpunct@G@std@@")
12786 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@@")
12787 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@@")
12788 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@@")
12789 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@@")
12790 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@@")
12791 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@@")
12792 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@@")
12793 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@@")
12794 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@@")
12795 DEFINE_RTTI_DATA1(time_base, 0, &locale_facet_rtti_base_descriptor, ".?AUtime_base@std@@")
12796 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@@")
12797 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@@")
12799 __ASM_BLOCK_BEGIN(locale_vtables)
12800 __ASM_VTABLE(_Facet_base,
12801 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12802 VTABLE_ADD_FUNC(locale_facet__Incref)
12803 VTABLE_ADD_FUNC(locale_facet__Incref)
12805 __ASM_VTABLE(locale_facet,
12806 VTABLE_ADD_FUNC(locale_facet_vector_dtor)
12807 #if _MSVCP_VER >= 110
12808 VTABLE_ADD_FUNC(locale_facet__Incref)
12809 VTABLE_ADD_FUNC(locale_facet__Decref)
12810 #endif
12812 __ASM_VTABLE(locale__Locimp,
12813 VTABLE_ADD_FUNC(locale__Locimp_vector_dtor)
12814 #if _MSVCP_VER >= 110
12815 VTABLE_ADD_FUNC(locale_facet__Incref)
12816 VTABLE_ADD_FUNC(locale_facet__Decref)
12817 #endif
12819 __ASM_VTABLE(collate_char,
12820 VTABLE_ADD_FUNC(collate_char_vector_dtor)
12821 #if _MSVCP_VER >= 110
12822 VTABLE_ADD_FUNC(locale_facet__Incref)
12823 VTABLE_ADD_FUNC(locale_facet__Decref)
12824 #endif
12825 VTABLE_ADD_FUNC(collate_char_do_compare)
12826 VTABLE_ADD_FUNC(collate_char_do_transform)
12827 VTABLE_ADD_FUNC(collate_char_do_hash));
12828 __ASM_VTABLE(collate_wchar,
12829 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12830 #if _MSVCP_VER >= 110
12831 VTABLE_ADD_FUNC(locale_facet__Incref)
12832 VTABLE_ADD_FUNC(locale_facet__Decref)
12833 #endif
12834 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12835 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12836 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12837 __ASM_VTABLE(collate_short,
12838 VTABLE_ADD_FUNC(collate_wchar_vector_dtor)
12839 #if _MSVCP_VER >= 110
12840 VTABLE_ADD_FUNC(locale_facet__Incref)
12841 VTABLE_ADD_FUNC(locale_facet__Decref)
12842 #endif
12843 VTABLE_ADD_FUNC(collate_wchar_do_compare)
12844 VTABLE_ADD_FUNC(collate_wchar_do_transform)
12845 VTABLE_ADD_FUNC(collate_wchar_do_hash));
12846 __ASM_VTABLE(ctype_base,
12847 VTABLE_ADD_FUNC(ctype_base_vector_dtor)
12848 #if _MSVCP_VER >= 110
12849 VTABLE_ADD_FUNC(locale_facet__Incref)
12850 VTABLE_ADD_FUNC(locale_facet__Decref)
12851 #endif
12853 __ASM_VTABLE(ctype_char,
12854 VTABLE_ADD_FUNC(ctype_char_vector_dtor)
12855 #if _MSVCP_VER >= 110
12856 VTABLE_ADD_FUNC(locale_facet__Incref)
12857 VTABLE_ADD_FUNC(locale_facet__Decref)
12858 #endif
12859 VTABLE_ADD_FUNC(ctype_char_do_tolower)
12860 VTABLE_ADD_FUNC(ctype_char_do_tolower_ch)
12861 VTABLE_ADD_FUNC(ctype_char_do_toupper)
12862 VTABLE_ADD_FUNC(ctype_char_do_toupper_ch)
12863 VTABLE_ADD_FUNC(ctype_char_do_widen)
12864 VTABLE_ADD_FUNC(ctype_char_do_widen_ch)
12865 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12866 VTABLE_ADD_FUNC(ctype_char__Do_widen_s)
12867 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12868 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12869 VTABLE_ADD_FUNC(ctype_char__Do_narrow_s)
12870 #else
12871 VTABLE_ADD_FUNC(ctype_char_do_narrow)
12872 VTABLE_ADD_FUNC(ctype_char_do_narrow_ch)
12873 #endif
12875 __ASM_VTABLE(ctype_wchar,
12876 VTABLE_ADD_FUNC(ctype_wchar_vector_dtor)
12877 #if _MSVCP_VER >= 110
12878 VTABLE_ADD_FUNC(locale_facet__Incref)
12879 VTABLE_ADD_FUNC(locale_facet__Decref)
12880 #endif
12881 VTABLE_ADD_FUNC(ctype_wchar_do_is)
12882 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12883 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12884 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12885 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12886 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12887 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12888 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12889 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12890 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12891 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12892 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12893 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12894 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12895 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12896 #else
12897 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12898 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12899 #endif
12901 __ASM_VTABLE(ctype_short,
12902 VTABLE_ADD_FUNC(ctype_wchar_vector_dtor)
12903 #if _MSVCP_VER >= 110
12904 VTABLE_ADD_FUNC(locale_facet__Incref)
12905 VTABLE_ADD_FUNC(locale_facet__Decref)
12906 #endif
12907 VTABLE_ADD_FUNC(ctype_wchar_do_is)
12908 VTABLE_ADD_FUNC(ctype_wchar_do_is_ch)
12909 VTABLE_ADD_FUNC(ctype_wchar_do_scan_is)
12910 VTABLE_ADD_FUNC(ctype_wchar_do_scan_not)
12911 VTABLE_ADD_FUNC(ctype_wchar_do_tolower)
12912 VTABLE_ADD_FUNC(ctype_wchar_do_tolower_ch)
12913 VTABLE_ADD_FUNC(ctype_wchar_do_toupper)
12914 VTABLE_ADD_FUNC(ctype_wchar_do_toupper_ch)
12915 VTABLE_ADD_FUNC(ctype_wchar_do_widen)
12916 VTABLE_ADD_FUNC(ctype_wchar_do_widen_ch)
12917 #if _MSVCP_VER >= 80 && _MSVCP_VER <= 90
12918 VTABLE_ADD_FUNC(ctype_wchar__Do_widen_s)
12919 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12920 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12921 VTABLE_ADD_FUNC(ctype_wchar__Do_narrow_s)
12922 #else
12923 VTABLE_ADD_FUNC(ctype_wchar_do_narrow)
12924 VTABLE_ADD_FUNC(ctype_wchar_do_narrow_ch)
12925 #endif
12927 __ASM_VTABLE(codecvt_base,
12928 VTABLE_ADD_FUNC(codecvt_base_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(codecvt_base_do_always_noconv)
12934 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12935 VTABLE_ADD_FUNC(codecvt_base_do_encoding));
12936 __ASM_VTABLE(codecvt_char,
12937 VTABLE_ADD_FUNC(codecvt_char_vector_dtor)
12938 #if _MSVCP_VER >= 110
12939 VTABLE_ADD_FUNC(locale_facet__Incref)
12940 VTABLE_ADD_FUNC(locale_facet__Decref)
12941 VTABLE_ADD_FUNC(codecvt_char_do_always_noconv)
12942 #else
12943 VTABLE_ADD_FUNC(codecvt_base_do_always_noconv)
12944 #endif
12945 VTABLE_ADD_FUNC(codecvt_base_do_max_length)
12946 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12947 VTABLE_ADD_FUNC(codecvt_char_do_in)
12948 VTABLE_ADD_FUNC(codecvt_char_do_out)
12949 VTABLE_ADD_FUNC(codecvt_char_do_unshift)
12950 VTABLE_ADD_FUNC(codecvt_char_do_length));
12951 __ASM_VTABLE(codecvt_wchar,
12952 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12953 #if _MSVCP_VER >= 110
12954 VTABLE_ADD_FUNC(locale_facet__Incref)
12955 VTABLE_ADD_FUNC(locale_facet__Decref)
12956 #endif
12957 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12958 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12959 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12960 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12961 #else
12962 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12963 #endif
12964 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12965 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12966 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12967 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12968 __ASM_VTABLE(codecvt_short,
12969 VTABLE_ADD_FUNC(codecvt_wchar_vector_dtor)
12970 #if _MSVCP_VER >= 110
12971 VTABLE_ADD_FUNC(locale_facet__Incref)
12972 VTABLE_ADD_FUNC(locale_facet__Decref)
12973 #endif
12974 VTABLE_ADD_FUNC(codecvt_wchar_do_always_noconv)
12975 VTABLE_ADD_FUNC(codecvt_wchar_do_max_length)
12976 #if _MSVCP_VER >= 90 && _MSVCP_VER <= 100
12977 VTABLE_ADD_FUNC(codecvt_base_do_encoding)
12978 #else
12979 VTABLE_ADD_FUNC(codecvt_wchar_do_encoding)
12980 #endif
12981 VTABLE_ADD_FUNC(codecvt_wchar_do_in)
12982 VTABLE_ADD_FUNC(codecvt_wchar_do_out)
12983 VTABLE_ADD_FUNC(codecvt_wchar_do_unshift)
12984 VTABLE_ADD_FUNC(codecvt_wchar_do_length));
12985 __ASM_VTABLE(numpunct_char,
12986 VTABLE_ADD_FUNC(numpunct_char_vector_dtor)
12987 #if _MSVCP_VER >= 110
12988 VTABLE_ADD_FUNC(locale_facet__Incref)
12989 VTABLE_ADD_FUNC(locale_facet__Decref)
12990 #endif
12991 VTABLE_ADD_FUNC(numpunct_char_do_decimal_point)
12992 VTABLE_ADD_FUNC(numpunct_char_do_thousands_sep)
12993 VTABLE_ADD_FUNC(numpunct_char_do_grouping)
12994 VTABLE_ADD_FUNC(numpunct_char_do_falsename)
12995 VTABLE_ADD_FUNC(numpunct_char_do_truename));
12996 __ASM_VTABLE(numpunct_wchar,
12997 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
12998 #if _MSVCP_VER >= 110
12999 VTABLE_ADD_FUNC(locale_facet__Incref)
13000 VTABLE_ADD_FUNC(locale_facet__Decref)
13001 #endif
13002 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
13003 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
13004 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
13005 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
13006 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
13007 __ASM_VTABLE(numpunct_short,
13008 VTABLE_ADD_FUNC(numpunct_wchar_vector_dtor)
13009 #if _MSVCP_VER >= 110
13010 VTABLE_ADD_FUNC(locale_facet__Incref)
13011 VTABLE_ADD_FUNC(locale_facet__Decref)
13012 #endif
13013 VTABLE_ADD_FUNC(numpunct_wchar_do_decimal_point)
13014 VTABLE_ADD_FUNC(numpunct_wchar_do_thousands_sep)
13015 VTABLE_ADD_FUNC(numpunct_wchar_do_grouping)
13016 VTABLE_ADD_FUNC(numpunct_wchar_do_falsename)
13017 VTABLE_ADD_FUNC(numpunct_wchar_do_truename));
13018 __ASM_VTABLE(num_get_char,
13019 VTABLE_ADD_FUNC(num_get_char_vector_dtor)
13020 #if _MSVCP_VER >= 110
13021 VTABLE_ADD_FUNC(locale_facet__Incref)
13022 VTABLE_ADD_FUNC(locale_facet__Decref)
13023 #endif
13024 VTABLE_ADD_FUNC(num_get_char_do_get_void)
13025 VTABLE_ADD_FUNC(num_get_char_do_get_double)
13026 VTABLE_ADD_FUNC(num_get_char_do_get_double)
13027 VTABLE_ADD_FUNC(num_get_char_do_get_float)
13028 VTABLE_ADD_FUNC(num_get_char_do_get_uint64)
13029 VTABLE_ADD_FUNC(num_get_char_do_get_int64)
13030 VTABLE_ADD_FUNC(num_get_char_do_get_ulong)
13031 VTABLE_ADD_FUNC(num_get_char_do_get_long)
13032 VTABLE_ADD_FUNC(num_get_char_do_get_uint)
13033 VTABLE_ADD_FUNC(num_get_char_do_get_ushort)
13034 VTABLE_ADD_FUNC(num_get_char_do_get_bool));
13035 __ASM_VTABLE(num_get_short,
13036 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
13037 #if _MSVCP_VER >= 110
13038 VTABLE_ADD_FUNC(locale_facet__Incref)
13039 VTABLE_ADD_FUNC(locale_facet__Decref)
13040 #endif
13041 VTABLE_ADD_FUNC(num_get_short_do_get_void)
13042 VTABLE_ADD_FUNC(num_get_short_do_get_double)
13043 VTABLE_ADD_FUNC(num_get_short_do_get_double)
13044 VTABLE_ADD_FUNC(num_get_short_do_get_float)
13045 VTABLE_ADD_FUNC(num_get_short_do_get_uint64)
13046 VTABLE_ADD_FUNC(num_get_short_do_get_int64)
13047 VTABLE_ADD_FUNC(num_get_short_do_get_ulong)
13048 VTABLE_ADD_FUNC(num_get_short_do_get_long)
13049 VTABLE_ADD_FUNC(num_get_short_do_get_uint)
13050 VTABLE_ADD_FUNC(num_get_short_do_get_ushort)
13051 VTABLE_ADD_FUNC(num_get_short_do_get_bool));
13052 __ASM_VTABLE(num_get_wchar,
13053 VTABLE_ADD_FUNC(num_get_wchar_vector_dtor)
13054 #if _MSVCP_VER >= 110
13055 VTABLE_ADD_FUNC(locale_facet__Incref)
13056 VTABLE_ADD_FUNC(locale_facet__Decref)
13057 #endif
13058 VTABLE_ADD_FUNC(num_get_wchar_do_get_void)
13059 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
13060 VTABLE_ADD_FUNC(num_get_wchar_do_get_double)
13061 VTABLE_ADD_FUNC(num_get_wchar_do_get_float)
13062 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint64)
13063 VTABLE_ADD_FUNC(num_get_wchar_do_get_int64)
13064 VTABLE_ADD_FUNC(num_get_wchar_do_get_ulong)
13065 VTABLE_ADD_FUNC(num_get_wchar_do_get_long)
13066 VTABLE_ADD_FUNC(num_get_wchar_do_get_uint)
13067 VTABLE_ADD_FUNC(num_get_wchar_do_get_ushort)
13068 VTABLE_ADD_FUNC(num_get_wchar_do_get_bool));
13069 __ASM_VTABLE(num_put_char,
13070 VTABLE_ADD_FUNC(num_put_char_vector_dtor)
13071 #if _MSVCP_VER >= 110
13072 VTABLE_ADD_FUNC(locale_facet__Incref)
13073 VTABLE_ADD_FUNC(locale_facet__Decref)
13074 #endif
13075 VTABLE_ADD_FUNC(num_put_char_do_put_ptr)
13076 VTABLE_ADD_FUNC(num_put_char_do_put_double)
13077 VTABLE_ADD_FUNC(num_put_char_do_put_double)
13078 VTABLE_ADD_FUNC(num_put_char_do_put_uint64)
13079 VTABLE_ADD_FUNC(num_put_char_do_put_int64)
13080 VTABLE_ADD_FUNC(num_put_char_do_put_ulong)
13081 VTABLE_ADD_FUNC(num_put_char_do_put_long)
13082 VTABLE_ADD_FUNC(num_put_char_do_put_bool));
13083 __ASM_VTABLE(num_put_wchar,
13084 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
13085 #if _MSVCP_VER >= 110
13086 VTABLE_ADD_FUNC(locale_facet__Incref)
13087 VTABLE_ADD_FUNC(locale_facet__Decref)
13088 #endif
13089 VTABLE_ADD_FUNC(num_put_wchar_do_put_ptr)
13090 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
13091 VTABLE_ADD_FUNC(num_put_wchar_do_put_double)
13092 VTABLE_ADD_FUNC(num_put_wchar_do_put_uint64)
13093 VTABLE_ADD_FUNC(num_put_wchar_do_put_int64)
13094 VTABLE_ADD_FUNC(num_put_wchar_do_put_ulong)
13095 VTABLE_ADD_FUNC(num_put_wchar_do_put_long)
13096 VTABLE_ADD_FUNC(num_put_wchar_do_put_bool));
13097 __ASM_VTABLE(num_put_short,
13098 VTABLE_ADD_FUNC(num_put_wchar_vector_dtor)
13099 #if _MSVCP_VER >= 110
13100 VTABLE_ADD_FUNC(locale_facet__Incref)
13101 VTABLE_ADD_FUNC(locale_facet__Decref)
13102 #endif
13103 VTABLE_ADD_FUNC(num_put_short_do_put_ptr)
13104 VTABLE_ADD_FUNC(num_put_short_do_put_double)
13105 VTABLE_ADD_FUNC(num_put_short_do_put_double)
13106 VTABLE_ADD_FUNC(num_put_short_do_put_uint64)
13107 VTABLE_ADD_FUNC(num_put_short_do_put_int64)
13108 VTABLE_ADD_FUNC(num_put_short_do_put_ulong)
13109 VTABLE_ADD_FUNC(num_put_short_do_put_long)
13110 VTABLE_ADD_FUNC(num_put_short_do_put_bool));
13111 __ASM_VTABLE(time_put_char,
13112 VTABLE_ADD_FUNC(time_put_char_vector_dtor)
13113 #if _MSVCP_VER >= 110
13114 VTABLE_ADD_FUNC(locale_facet__Incref)
13115 VTABLE_ADD_FUNC(locale_facet__Decref)
13116 #endif
13117 VTABLE_ADD_FUNC(time_put_char_do_put));
13118 __ASM_VTABLE(time_put_wchar,
13119 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
13120 #if _MSVCP_VER >= 110
13121 VTABLE_ADD_FUNC(locale_facet__Incref)
13122 VTABLE_ADD_FUNC(locale_facet__Decref)
13123 #endif
13124 VTABLE_ADD_FUNC(time_put_wchar_do_put));
13125 __ASM_VTABLE(time_put_short,
13126 VTABLE_ADD_FUNC(time_put_wchar_vector_dtor)
13127 #if _MSVCP_VER >= 110
13128 VTABLE_ADD_FUNC(locale_facet__Incref)
13129 VTABLE_ADD_FUNC(locale_facet__Decref)
13130 #endif
13131 VTABLE_ADD_FUNC(time_put_wchar_do_put));
13132 __ASM_VTABLE(time_get_char,
13133 VTABLE_ADD_FUNC(time_get_char_vector_dtor)
13134 #if _MSVCP_VER >= 110
13135 VTABLE_ADD_FUNC(locale_facet__Incref)
13136 VTABLE_ADD_FUNC(locale_facet__Decref)
13137 #endif
13138 VTABLE_ADD_FUNC(time_get_char_do_date_order)
13139 VTABLE_ADD_FUNC(time_get_char_do_get_time)
13140 VTABLE_ADD_FUNC(time_get_char_do_get_date)
13141 VTABLE_ADD_FUNC(time_get_char_do_get_weekday)
13142 VTABLE_ADD_FUNC(time_get_char_do_get_monthname)
13143 VTABLE_ADD_FUNC(time_get_char_do_get_year)
13144 #if _MSVCP_VER >= 100
13145 VTABLE_ADD_FUNC(time_get_char_do_get)
13146 #endif
13148 __ASM_VTABLE(time_get_wchar,
13149 VTABLE_ADD_FUNC(time_get_wchar_vector_dtor)
13150 #if _MSVCP_VER >= 110
13151 VTABLE_ADD_FUNC(locale_facet__Incref)
13152 VTABLE_ADD_FUNC(locale_facet__Decref)
13153 #endif
13154 VTABLE_ADD_FUNC(time_get_wchar_do_date_order)
13155 VTABLE_ADD_FUNC(time_get_wchar_do_get_time)
13156 VTABLE_ADD_FUNC(time_get_wchar_do_get_date)
13157 VTABLE_ADD_FUNC(time_get_wchar_do_get_weekday)
13158 VTABLE_ADD_FUNC(time_get_wchar_do_get_monthname)
13159 VTABLE_ADD_FUNC(time_get_wchar_do_get_year)
13160 #if _MSVCP_VER >= 100
13161 VTABLE_ADD_FUNC(time_get_wchar_do_get)
13162 #endif
13164 __ASM_BLOCK_END
13166 void init_locale(void *base)
13168 #ifdef __x86_64__
13169 init__Facet_base_rtti(base);
13170 init_locale_facet_rtti(base);
13171 init_locale__Locimp_rtti(base);
13172 init_collate_char_rtti(base);
13173 init_collate_wchar_rtti(base);
13174 init_collate_short_rtti(base);
13175 init_ctype_base_rtti(base);
13176 init_ctype_char_rtti(base);
13177 init_ctype_wchar_rtti(base);
13178 init_ctype_short_rtti(base);
13179 init_codecvt_base_rtti(base);
13180 init_codecvt_char_rtti(base);
13181 init_codecvt_wchar_rtti(base);
13182 init_codecvt_short_rtti(base);
13183 init_numpunct_char_rtti(base);
13184 init_numpunct_wchar_rtti(base);
13185 init_numpunct_short_rtti(base);
13186 init_num_get_char_rtti(base);
13187 init_num_get_wchar_rtti(base);
13188 init_num_get_short_rtti(base);
13189 init_num_put_char_rtti(base);
13190 init_num_put_wchar_rtti(base);
13191 init_num_put_short_rtti(base);
13192 init_time_put_char_rtti(base);
13193 init_time_put_wchar_rtti(base);
13194 init_time_put_short_rtti(base);
13195 init_time_base_rtti(base);
13196 init_time_get_char_rtti(base);
13197 init_time_get_wchar_rtti(base);
13198 #endif
13201 void free_locale(void)
13203 facets_elem *iter, *safe;
13205 if(global_locale) {
13206 locale_dtor(&classic_locale);
13207 locale__Locimp_dtor(global_locale);
13208 MSVCRT_operator_delete(global_locale);
13211 LIST_FOR_EACH_ENTRY_SAFE(iter, safe, &lazy_facets, facets_elem, entry) {
13212 list_remove(&iter->entry);
13213 if(call_locale_facet__Decref(iter->fac))
13214 call_locale_facet_vector_dtor(iter->fac, 1);
13215 MSVCRT_operator_delete(iter);