msvcp: Sync istream<>::_ignore.
[wine] / dlls / msvcp60 / ios.c
1 /*
2  * Copyright 2011 Piotr Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <limits.h>
24 #include <share.h>
25
26 #include "msvcp.h"
27 #include "windef.h"
28 #include "winbase.h"
29 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
31
32 /* ?_Index@ios_base@std@@0HA */
33 int ios_base_Index = 0;
34 /* ?_Sync@ios_base@std@@0_NA */
35 MSVCP_bool ios_base_Sync = FALSE;
36
37 typedef struct {
38     streamoff off;
39     __int64 DECLSPEC_ALIGN(8) pos;
40     int state;
41 } fpos_int;
42
43 static inline const char* debugstr_fpos_int(fpos_int *fpos)
44 {
45     return wine_dbg_sprintf("fpos(%ld %s %d)", fpos->off, wine_dbgstr_longlong(fpos->pos), fpos->state);
46 }
47
48 typedef struct {
49     void (__cdecl *pfunc)(ios_base*, streamsize);
50     streamsize arg;
51 } manip_streamsize;
52
53 typedef struct {
54     void (__cdecl *pfunc)(ios_base*, int);
55     int arg;
56 } manip_int;
57
58 typedef enum {
59     INITFL_new   = 0,
60     INITFL_open  = 1,
61     INITFL_close = 2
62 } basic_filebuf__Initfl;
63
64 typedef struct {
65     basic_streambuf_char base;
66     codecvt_char *cvt;
67     char putback;
68     MSVCP_bool wrotesome;
69     int state;
70     MSVCP_bool close;
71     FILE *file;
72 } basic_filebuf_char;
73
74 typedef struct {
75     basic_streambuf_wchar base;
76     codecvt_wchar *cvt;
77     wchar_t putback;
78     MSVCP_bool wrotesome;
79     int state;
80     MSVCP_bool close;
81     FILE *file;
82 } basic_filebuf_wchar;
83
84 typedef enum {
85     STRINGBUF_allocated = 1,
86     STRINGBUF_no_write = 2,
87     STRINGBUF_no_read = 4,
88     STRINGBUF_append = 8,
89     STRINGBUF_at_end = 16
90 } basic_stringbuf_state;
91
92 typedef struct {
93     basic_streambuf_char base;
94     char *pendsave;
95     char *seekhigh;
96     int alsize;
97     int state;
98     char allocator; /* empty struct */
99 } basic_stringbuf_char;
100
101 typedef struct {
102     basic_streambuf_wchar base;
103     wchar_t *pendsave;
104     wchar_t *seekhigh;
105     int alsize;
106     int state;
107     char allocator; /* empty struct */
108 } basic_stringbuf_wchar;
109
110 typedef struct {
111     ios_base base;
112     basic_streambuf_char *strbuf;
113     struct _basic_ostream_char *stream;
114     char fillch;
115 } basic_ios_char;
116
117 typedef struct {
118     ios_base base;
119     basic_streambuf_wchar *strbuf;
120     struct _basic_ostream_wchar *stream;
121     wchar_t fillch;
122 } basic_ios_wchar;
123
124 typedef struct _basic_ostream_char {
125     const int *vbtable;
126     /* virtual inheritance
127      * basic_ios_char basic_ios;
128      */
129 } basic_ostream_char;
130
131 typedef struct _basic_ostream_wchar {
132     const int *vbtable;
133     /* virtual inheritance
134      * basic_ios_wchar basic_ios;
135      */
136 } basic_ostream_wchar;
137
138 typedef struct {
139     const int *vbtable;
140     streamsize count;
141     /* virtual inheritance
142      * basic_ios_char basic_ios;
143      */
144 } basic_istream_char;
145
146 typedef struct {
147     const int *vbtable;
148     streamsize count;
149     /* virtual inheritance
150      * basic_ios_wchar basic_ios;
151      */
152 } basic_istream_wchar;
153
154 typedef struct {
155     basic_istream_char base1;
156     basic_ostream_char base2;
157     /* virtual inheritance
158      * basic_ios_char basic_ios;
159      */
160 } basic_iostream_char;
161
162 typedef struct {
163     basic_istream_wchar base1;
164     basic_ostream_wchar base2;
165     /* virtual inheritance
166      * basic_ios_wchar basic_ios;
167      */
168 } basic_iostream_wchar;
169
170 typedef struct {
171     basic_ostream_char base;
172     basic_filebuf_char filebuf;
173     /* virtual inheritance
174      * basic_ios_char basic_ios;
175      */
176 } basic_ofstream_char;
177
178 typedef struct {
179     basic_ostream_wchar base;
180     basic_filebuf_wchar filebuf;
181     /* virtual inheritance
182      * basic_ios_wchar basic_ios;
183      */
184 } basic_ofstream_wchar;
185
186 typedef struct {
187     basic_istream_char base;
188     basic_filebuf_char filebuf;
189     /* virtual inheritance
190      * basic_ios_char basic_ios;
191      */
192 } basic_ifstream_char;
193
194 typedef struct {
195     basic_istream_wchar base;
196     basic_filebuf_wchar filebuf;
197     /* virtual inheritance
198      * basic_ios_wchar basic_ios;
199      */
200 } basic_ifstream_wchar;
201
202 typedef struct {
203     basic_iostream_char base;
204     basic_filebuf_char filebuf;
205     /* virtual inheritance
206      * basic_ios_char basic_ios;
207      */
208 } basic_fstream_char;
209
210 typedef struct {
211     basic_iostream_wchar base;
212     basic_filebuf_wchar filebuf;
213     /* virtual inheritance
214      * basic_ios_char basic_ios;
215      */
216 } basic_fstream_wchar;
217
218 typedef struct {
219     basic_ostream_char base;
220     basic_stringbuf_char strbuf;
221     /* virtual inheritance
222      * basic_ios_char basic_ios;
223      */
224 } basic_ostringstream_char;
225
226 typedef struct {
227     basic_ostream_wchar base;
228     basic_stringbuf_wchar strbuf;
229     /* virtual inheritance
230      * basic_ios_wchar basic_ios;
231      */
232 } basic_ostringstream_wchar;
233
234 typedef struct {
235     basic_istream_char base;
236     basic_stringbuf_char strbuf;
237     /* virtual inheritance
238      * basic_ios_char basic_ios;
239      */
240 } basic_istringstream_char;
241
242 typedef struct {
243     basic_istream_wchar base;
244     basic_stringbuf_wchar strbuf;
245     /* virtual inheritance
246      * basic_ios_wchar basic_ios;
247      */
248 } basic_istringstream_wchar;
249
250 typedef struct {
251     basic_iostream_char base;
252     basic_stringbuf_char strbuf;
253     /* virtual inheritance
254      * basic_ios_char basic_ios;
255      */
256 } basic_stringstream_char;
257
258 typedef struct {
259     basic_iostream_wchar base;
260     basic_stringbuf_wchar strbuf;
261     /* virtual inheritance
262      * basic_ios_wchar basic_ios;
263      */
264 } basic_stringstream_wchar;
265
266 typedef enum {
267     STRSTATE_Allocated = 1,
268     STRSTATE_Constant = 2,
269     STRSTATE_Dynamic = 4,
270     STRSTATE_Frozen = 8
271 } strstreambuf__Strstate;
272
273 typedef struct {
274     basic_streambuf_char base;
275     streamsize minsize;
276     char *endsave;
277     char *seekhigh;
278     int strmode;
279     void* (__cdecl *palloc)(MSVCP_size_t);
280     void (__cdecl *pfree)(void*);
281 } strstreambuf;
282
283 typedef struct {
284     basic_ostream_char base;
285     strstreambuf buf;
286     /* virtual inheritance
287      * basic_ios_char basic_ios;
288      */
289 } ostrstream;
290
291 typedef struct {
292     basic_istream_char base;
293     strstreambuf buf;
294     /* virtual inheritance
295      * basic_ios_char basic_ios;
296      */
297 } istrstream;
298
299 typedef struct {
300     basic_iostream_char base;
301     strstreambuf buf;
302     /* virtual inheritance
303      * basic_ios_char basic_ios;
304      */
305 } strstream;
306
307 extern const vtable_ptr MSVCP_iosb_vtable;
308
309 /* ??_7ios_base@std@@6B@ */
310 extern const vtable_ptr MSVCP_ios_base_vtable;
311
312 /* ??_7?$basic_ios@DU?$char_traits@D@std@@@std@@6B@ */
313 extern const vtable_ptr MSVCP_basic_ios_char_vtable;
314
315 /* ??_7?$basic_ios@_WU?$char_traits@_W@std@@@std@@6B@ */
316 extern const vtable_ptr MSVCP_basic_ios_wchar_vtable;
317
318 /* ??_7?$basic_ios@GU?$char_traits@G@std@@@std@@6B@ */
319 extern const vtable_ptr MSVCP_basic_ios_short_vtable;
320
321 /* ??_7?$basic_streambuf@DU?$char_traits@D@std@@@std@@6B@ */
322 extern const vtable_ptr MSVCP_basic_streambuf_char_vtable;
323
324 /* ??_7?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@6B@ */
325 extern const vtable_ptr MSVCP_basic_streambuf_wchar_vtable;
326
327 /* ??_7?$basic_streambuf@GU?$char_traits@G@std@@@std@@6B@ */
328 extern const vtable_ptr MSVCP_basic_streambuf_short_vtable;
329
330 /* ??_7?$basic_filebuf@DU?$char_traits@D@std@@@std@@6B@ */
331 extern const vtable_ptr MSVCP_basic_filebuf_char_vtable;
332
333 /* ??_7?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@6B@ */
334 extern const vtable_ptr MSVCP_basic_filebuf_wchar_vtable;
335
336 /* ??_7?$basic_filebuf@GU?$char_traits@G@std@@@std@@6B@ */
337 extern const vtable_ptr MSVCP_basic_filebuf_short_vtable;
338
339 /* ??_7?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
340 extern const vtable_ptr MSVCP_basic_stringbuf_char_vtable;
341
342 /* ??_7?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
343 extern const vtable_ptr MSVCP_basic_stringbuf_wchar_vtable;
344
345 /* ??_7?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
346 extern const vtable_ptr MSVCP_basic_stringbuf_short_vtable;
347
348 /* ??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@ */
349 const int basic_ostream_char_vbtable[] = {0, sizeof(basic_ostream_char)};
350 /* ??_7?$basic_ostream@DU?$char_traits@D@std@@@std@@6B@ */
351 extern const vtable_ptr MSVCP_basic_ostream_char_vtable;
352
353 /* ??_8?$basic_ostream@_WU?$char_traits@_W@std@@@std@@7B@ */
354 const int basic_ostream_wchar_vbtable[] = {0, sizeof(basic_ostream_wchar)};
355 /* ??_7?$basic_ostream@_WU?$char_traits@_W@std@@@std@@6B@ */
356 extern const vtable_ptr MSVCP_basic_ostream_wchar_vtable;
357
358 /* ??_8?$basic_ostream@GU?$char_traits@G@std@@@std@@7B@ */
359 const int basic_ostream_short_vbtable[] = {0, sizeof(basic_ostream_wchar)};
360 /* ??_7?$basic_ostream@GU?$char_traits@G@std@@@std@@6B@ */
361 extern const vtable_ptr MSVCP_basic_ostream_short_vtable;
362
363 /* ??_8?$basic_istream@DU?$char_traits@D@std@@@std@@7B@ */
364 const int basic_istream_char_vbtable[] = {0, sizeof(basic_istream_char)};
365 /* ??_7?$basic_istream@DU?$char_traits@D@std@@@std@@6B@ */
366 extern const vtable_ptr MSVCP_basic_istream_char_vtable;
367
368 /* ??_8?$basic_istream@_WU?$char_traits@_W@std@@@std@@7B@ */
369 const int basic_istream_wchar_vbtable[] = {0, sizeof(basic_istream_wchar)};
370 /* ??_7?$basic_istream@_WU?$char_traits@_W@std@@@std@@6B@ */
371 extern const vtable_ptr MSVCP_basic_istream_wchar_vtable;
372
373 /* ??_8?$basic_istream@GU?$char_traits@G@std@@@std@@7B@ */
374 const int basic_istream_short_vbtable[] = {0, sizeof(basic_istream_wchar)};
375 /* ??_7?$basic_istream@GU?$char_traits@G@std@@@std@@6B@ */
376 extern const vtable_ptr MSVCP_basic_istream_short_vtable;
377
378 /* ??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
379 const int basic_iostream_char_vbtable1[] = {0, sizeof(basic_iostream_char)};
380 /* ??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
381 const int basic_iostream_char_vbtable2[] = {0, sizeof(basic_iostream_char)-FIELD_OFFSET(basic_iostream_char, base2)};
382 /* ??_7?$basic_iostream@DU?$char_traits@D@std@@@std@@6B@ */
383 extern const vtable_ptr MSVCP_basic_iostream_char_vtable;
384
385 /* ??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
386 /* ??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
387 const int basic_iostream_wchar_vbtable1[] = {0, sizeof(basic_iostream_wchar)};
388 /* ??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
389 /* ??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
390 const int basic_iostream_wchar_vbtable2[] = {0, sizeof(basic_iostream_wchar)-FIELD_OFFSET(basic_iostream_wchar, base2)};
391 /* ??_7?$basic_iostream@_WU?$char_traits@_W@std@@@std@@6B@ */
392 extern const vtable_ptr MSVCP_basic_iostream_wchar_vtable;
393 /* ??_7?$basic_iostream@GU?$char_traits@G@std@@@std@@6B@ */
394 extern const vtable_ptr MSVCP_basic_iostream_short_vtable;
395
396 /* ??_8?$basic_ofstream@DU?$char_traits@D@std@@@std@@7B@ */
397 const int basic_ofstream_char_vbtable[] = {0, sizeof(basic_ofstream_char)};
398 /* ??_7?$basic_ofstream@DU?$char_traits@D@std@@@std@@6B@ */
399 extern const vtable_ptr MSVCP_basic_ofstream_char_vtable;
400
401 /* ??_8?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@7B@ */
402 const int basic_ofstream_wchar_vbtable[] = {0, sizeof(basic_ofstream_wchar)};
403 /* ??_7?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@6B@ */
404 extern const vtable_ptr MSVCP_basic_ofstream_wchar_vtable;
405
406 /* ??_8?$basic_ofstream@GU?$char_traits@G@std@@@std@@7B@ */
407 const int basic_ofstream_short_vbtable[] = {0, sizeof(basic_ofstream_wchar)};
408 /* ??_7?$basic_ofstream@GU?$char_traits@G@std@@@std@@6B@ */
409 extern const vtable_ptr MSVCP_basic_ofstream_short_vtable;
410
411 /* ??_8?$basic_ifstream@DU?$char_traits@D@std@@@std@@7B@ */
412 const int basic_ifstream_char_vbtable[] = {0, sizeof(basic_ifstream_char)};
413 /* ??_7?$basic_ifstream@DU?$char_traits@D@std@@@std@@6B@ */
414 extern const vtable_ptr MSVCP_basic_ifstream_char_vtable;
415
416 /* ??_8?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@7B@ */
417 const int basic_ifstream_wchar_vbtable[] = {0, sizeof(basic_ifstream_wchar)};
418 /* ??_7?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@6B@ */
419 extern const vtable_ptr MSVCP_basic_ifstream_wchar_vtable;
420
421 /* ??_8?$basic_ifstream@GU?$char_traits@G@std@@@std@@7B@ */
422 const int basic_ifstream_short_vbtable[] = {0, sizeof(basic_ifstream_wchar)};
423 /* ??_7?$basic_ifstream@GU?$char_traits@G@std@@@std@@6B@ */
424 extern const vtable_ptr MSVCP_basic_ifstream_short_vtable;
425
426 /* ??_8?$basic_fstream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
427 const int basic_fstream_char_vbtable1[] = {0, sizeof(basic_fstream_char)};
428 /* ??_8?$basic_fstream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
429 const int basic_fstream_char_vbtable2[] = {0, sizeof(basic_fstream_char)-FIELD_OFFSET(basic_fstream_char, base.base2)};
430 /* ??_7?$basic_fstream@DU?$char_traits@D@std@@@std@@6B@ */
431 extern const vtable_ptr MSVCP_basic_fstream_char_vtable;
432
433 /* ??_8?$basic_fstream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
434 /* ??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
435 const int basic_fstream_wchar_vbtable1[] = {0, sizeof(basic_fstream_wchar)};
436 /* ??_8?$basic_fstream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
437 /* ??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
438 const int basic_fstream_wchar_vbtable2[] = {0, sizeof(basic_fstream_wchar)-FIELD_OFFSET(basic_fstream_wchar, base.base2)};
439 /* ??_7?$basic_fstream@_WU?$char_traits@_W@std@@@std@@6B@ */
440 extern const vtable_ptr MSVCP_basic_fstream_wchar_vtable;
441 /* ??_7?$basic_fstream@GU?$char_traits@G@std@@@std@@6B@ */
442 extern const vtable_ptr MSVCP_basic_fstream_short_vtable;
443
444 /* ??_8?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@ */
445 const int basic_ostringstream_char_vbtable[] = {0, sizeof(basic_ostringstream_char)};
446 /* ??_7?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
447 extern const vtable_ptr MSVCP_basic_ostringstream_char_vtable;
448
449 /* ??_8?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B@ */
450 const int basic_ostringstream_wchar_vbtable[] = {0, sizeof(basic_ostringstream_wchar)};
451 /* ??_7?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
452 extern const vtable_ptr MSVCP_basic_ostringstream_wchar_vtable;
453
454 /* ??_8?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B@ */
455 const int basic_ostringstream_short_vbtable[] = {0, sizeof(basic_ostringstream_wchar)};
456 /* ??_7?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
457 extern const vtable_ptr MSVCP_basic_ostringstream_short_vtable;
458
459 /* ??_8?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@ */
460 const int basic_istringstream_char_vbtable[] = {0, sizeof(basic_istringstream_char)};
461 /* ??_7?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
462 extern const vtable_ptr MSVCP_basic_istringstream_char_vtable;
463
464 /* ??_8?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B@ */
465 const int basic_istringstream_wchar_vbtable[] = {0, sizeof(basic_istringstream_wchar)};
466 /* ??_7?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
467 extern const vtable_ptr MSVCP_basic_istringstream_wchar_vtable;
468
469 /* ??_8?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B@ */
470 const int basic_istringstream_short_vbtable[] = {0, sizeof(basic_istringstream_wchar)};
471 /* ??_7?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
472 extern const vtable_ptr MSVCP_basic_istringstream_short_vtable;
473
474 /* ??_8?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
475 const int basic_stringstream_char_vbtable1[] = {0, sizeof(basic_stringstream_char)};
476 /* ??_8?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
477 const int basic_stringstream_char_vbtable2[] = {0, sizeof(basic_stringstream_char)-FIELD_OFFSET(basic_stringstream_char, base.base2)};
478 /* ??_7?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
479 extern const vtable_ptr MSVCP_basic_stringstream_char_vtable;
480
481 /* ??_8?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
482 const int basic_stringstream_wchar_vbtable1[] = {0, sizeof(basic_stringstream_wchar)};
483 /* ??_8?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
484 const int basic_stringstream_wchar_vbtable2[] = {0, sizeof(basic_stringstream_wchar)-FIELD_OFFSET(basic_stringstream_wchar, base.base2)};
485 /* ??_7?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
486 extern const vtable_ptr MSVCP_basic_stringstream_wchar_vtable;
487
488 /* ??_8?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
489 const int basic_stringstream_short_vbtable1[] = {0, sizeof(basic_stringstream_wchar)};
490 /* ??_8?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
491 const int basic_stringstream_short_vbtable2[] = {0, sizeof(basic_stringstream_wchar)-FIELD_OFFSET(basic_stringstream_wchar, base.base2)};
492 /* ??_7?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
493 extern const vtable_ptr MSVCP_basic_stringstream_short_vtable;
494
495 /* ??_7strstreambuf@std@@6B */
496 extern const vtable_ptr MSVCP_strstreambuf_vtable;
497
498 static const int ostrstream_vbtable[] = {0, sizeof(ostrstream)};
499 extern const vtable_ptr MSVCP_ostrstream_vtable;
500
501 static const int istrstream_vbtable[] = {0, sizeof(istrstream)};
502
503 static const int strstream_vbtable1[] = {0, sizeof(strstream)};
504 static const int strstream_vbtable2[] = {0, sizeof(strstream)-FIELD_OFFSET(strstream, base.base2)};
505 extern const vtable_ptr MSVCP_strstream_vtable;
506
507 DEFINE_RTTI_DATA0(iosb, 0, ".?AV?$_Iosb@H@std@@");
508 DEFINE_RTTI_DATA1(ios_base, 0, &iosb_rtti_base_descriptor, ".?AV?$_Iosb@H@std@@");
509 DEFINE_RTTI_DATA2(basic_ios_char, 0, &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
510         ".?AV?$basic_ios@DU?$char_traits@D@std@@@std@@");
511 DEFINE_RTTI_DATA2(basic_ios_wchar, 0, &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
512         ".?AV?$basic_ios@_WU?$char_traits@_W@std@@@std@@");
513 DEFINE_RTTI_DATA2(basic_ios_short, 0, &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
514         ".?AV?$basic_ios@GU?$char_traits@G@std@@@std@@");
515 DEFINE_RTTI_DATA0(basic_streambuf_char, 0,
516         ".?AV?$basic_streambuf@DU?$char_traits@D@std@@@std@@");
517 DEFINE_RTTI_DATA0(basic_streambuf_wchar, 0,
518         ".?AV?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@");
519 DEFINE_RTTI_DATA0(basic_streambuf_short, 0,
520         ".?AV?$basic_streambuf@GU?$char_traits@G@std@@@std@@");
521 DEFINE_RTTI_DATA1(basic_filebuf_char, 0, &basic_streambuf_char_rtti_base_descriptor,
522         ".?AV?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@");
523 DEFINE_RTTI_DATA1(basic_filebuf_wchar, 0, &basic_streambuf_wchar_rtti_base_descriptor,
524         ".?AV?$basic_filebuf@GU?$char_traits@G@std@@@std@@");
525 DEFINE_RTTI_DATA1(basic_filebuf_short, 0, &basic_streambuf_short_rtti_base_descriptor,
526         ".?AV?$basic_filebuf@DU?$char_traits@D@std@@@std@@");
527 DEFINE_RTTI_DATA1(basic_stringbuf_char, 0, &basic_streambuf_char_rtti_base_descriptor,
528         ".?AV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
529 DEFINE_RTTI_DATA1(basic_stringbuf_wchar, 0, &basic_streambuf_wchar_rtti_base_descriptor,
530         ".?AV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
531 DEFINE_RTTI_DATA1(basic_stringbuf_short, 0, &basic_streambuf_short_rtti_base_descriptor,
532         ".?AV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
533 DEFINE_RTTI_DATA3(basic_ostream_char, sizeof(basic_ostream_char), &basic_ios_char_rtti_base_descriptor,
534         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
535         ".?AV?$basic_ostream@DU?$char_traits@D@std@@@std@@");
536 DEFINE_RTTI_DATA3(basic_ostream_wchar, sizeof(basic_ostream_wchar), &basic_ios_wchar_rtti_base_descriptor,
537         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
538         ".?AV?$basic_ostream@_WU?$char_traits@_W@std@@@std@@");
539 DEFINE_RTTI_DATA3(basic_ostream_short, sizeof(basic_ostream_wchar), &basic_ios_short_rtti_base_descriptor,
540         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
541         ".?AV?$basic_ostream@GU?$char_traits@G@std@@@std@@");
542 DEFINE_RTTI_DATA3(basic_istream_char, sizeof(basic_istream_char), &basic_ios_char_rtti_base_descriptor,
543         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
544         ".?AV?$basic_istream@DU?$char_traits@D@std@@@std@@");
545 DEFINE_RTTI_DATA3(basic_istream_wchar, sizeof(basic_istream_wchar), &basic_ios_wchar_rtti_base_descriptor,
546         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
547         ".?AV?$basic_istream@_WU?$char_traits@_W@std@@@std@@");
548 DEFINE_RTTI_DATA3(basic_istream_short, sizeof(basic_istream_wchar), &basic_ios_short_rtti_base_descriptor,
549         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
550         ".?AV?$basic_istream@GU?$char_traits@G@std@@@std@@");
551 DEFINE_RTTI_DATA8(basic_iostream_char, sizeof(basic_iostream_char),
552         &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
553         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
554         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
555         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
556         ".?AV?$basic_iostream@DU?$char_traits@D@std@@@std@@");
557 DEFINE_RTTI_DATA8(basic_iostream_wchar, sizeof(basic_iostream_wchar),
558         &basic_istream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
559         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
560         &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
561         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
562         ".?AV?$basic_iostream@_WU?$char_traits@_W@std@@@std@@");
563 DEFINE_RTTI_DATA8(basic_iostream_short, sizeof(basic_iostream_wchar),
564         &basic_istream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
565         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
566         &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
567         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
568         ".?AV?$basic_iostream@GU?$char_traits@G@std@@@std@@");
569 DEFINE_RTTI_DATA4(basic_ofstream_char, sizeof(basic_ofstream_char),
570         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
571         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
572         ".?AV?$basic_ofstream@DU?$char_traits@D@std@@@std@@");
573 DEFINE_RTTI_DATA4(basic_ofstream_wchar, sizeof(basic_ofstream_wchar),
574         &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
575         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
576         ".?AV?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@");
577 DEFINE_RTTI_DATA4(basic_ofstream_short, sizeof(basic_ofstream_wchar),
578         &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
579         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
580         ".?AV?$basic_ofstream@GU?$char_traits@G@std@@@std@@");
581 DEFINE_RTTI_DATA4(basic_ifstream_char, sizeof(basic_ifstream_char),
582         &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
583         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
584         ".?AV?$basic_ifstream@DU?$char_traits@D@std@@@std@@");
585 DEFINE_RTTI_DATA4(basic_ifstream_wchar, sizeof(basic_ifstream_wchar),
586         &basic_istream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
587         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
588         ".?AV?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@");
589 DEFINE_RTTI_DATA4(basic_ifstream_short, sizeof(basic_ifstream_wchar),
590         &basic_istream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
591         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
592         ".?AV?$basic_ifstream@GU?$char_traits@G@std@@@std@@");
593 DEFINE_RTTI_DATA8(basic_fstream_char, sizeof(basic_fstream_char),
594         &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
595         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
596         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
597         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
598         ".?AV?$basic_fstream@DU?$char_traits@D@std@@@std@@");
599 DEFINE_RTTI_DATA8(basic_fstream_wchar, sizeof(basic_fstream_wchar),
600         &basic_istream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
601         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
602         &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
603         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
604         ".?AV?$basic_fstream@_WU?$char_traits@_W@std@@@std@@");
605 DEFINE_RTTI_DATA8(basic_fstream_short, sizeof(basic_fstream_wchar),
606         &basic_istream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
607         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
608         &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
609         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
610         ".?AV?$basic_fstream@GU?$char_traits@G@std@@@std@@");
611 DEFINE_RTTI_DATA4(basic_ostringstream_char, sizeof(basic_ostringstream_char),
612         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
613         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
614         ".?AV?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
615 DEFINE_RTTI_DATA4(basic_ostringstream_wchar, sizeof(basic_ostringstream_wchar),
616         &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
617         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
618         ".?AV?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
619 DEFINE_RTTI_DATA4(basic_ostringstream_short, sizeof(basic_ostringstream_wchar),
620         &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
621         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
622         ".?AV?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
623 DEFINE_RTTI_DATA4(basic_istringstream_char, sizeof(basic_istringstream_char),
624         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
625         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
626         ".?AV?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
627 DEFINE_RTTI_DATA4(basic_istringstream_wchar, sizeof(basic_istringstream_wchar),
628         &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
629         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
630         ".?AV?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
631 DEFINE_RTTI_DATA4(basic_istringstream_short, sizeof(basic_istringstream_wchar),
632         &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
633         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
634         ".?AV?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
635 DEFINE_RTTI_DATA8(basic_stringstream_char, sizeof(basic_stringstream_char),
636         &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
637         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
638         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
639         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
640         ".?AV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
641 DEFINE_RTTI_DATA8(basic_stringstream_wchar, sizeof(basic_stringstream_wchar),
642         &basic_istream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
643         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
644         &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
645         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
646         ".?AV?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
647 DEFINE_RTTI_DATA8(basic_stringstream_short, sizeof(basic_stringstream_wchar),
648         &basic_istream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
649         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
650         &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
651         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
652         ".?AV?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
653 DEFINE_RTTI_DATA1(strstreambuf, sizeof(strstreambuf),
654         &basic_streambuf_char_rtti_base_descriptor, ".?AVstrstreambuf@std@@");
655 DEFINE_RTTI_DATA4(ostrstream, sizeof(ostrstream),
656         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
657         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
658         "?AVostrstream@std@@");
659 DEFINE_RTTI_DATA8(strstream, sizeof(strstream),
660         &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
661         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
662         &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
663         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
664         "?AVstrstream@std@@");
665
666 #ifndef __GNUC__
667 void __asm_dummy_vtables(void) {
668 #endif
669     __ASM_VTABLE(iosb,
670             VTABLE_ADD_FUNC(iosb_vector_dtor));
671     __ASM_VTABLE(ios_base,
672             VTABLE_ADD_FUNC(ios_base_vector_dtor));
673     __ASM_VTABLE(basic_ios_char,
674             VTABLE_ADD_FUNC(basic_ios_char_vector_dtor));
675     __ASM_VTABLE(basic_ios_wchar,
676             VTABLE_ADD_FUNC(basic_ios_wchar_vector_dtor));
677     __ASM_VTABLE(basic_ios_short,
678             VTABLE_ADD_FUNC(basic_ios_wchar_vector_dtor));
679     __ASM_VTABLE(basic_streambuf_char,
680             VTABLE_ADD_FUNC(basic_streambuf_char_vector_dtor)
681             VTABLE_ADD_FUNC(basic_streambuf_char_overflow)
682             VTABLE_ADD_FUNC(basic_streambuf_char_pbackfail)
683             VTABLE_ADD_FUNC(basic_streambuf_char_showmanyc)
684             VTABLE_ADD_FUNC(basic_streambuf_char_underflow)
685             VTABLE_ADD_FUNC(basic_streambuf_char_uflow)
686             VTABLE_ADD_FUNC(basic_streambuf_char_xsgetn)
687             VTABLE_ADD_FUNC(basic_streambuf_char_xsputn)
688             VTABLE_ADD_FUNC(basic_streambuf_char_seekoff)
689             VTABLE_ADD_FUNC(basic_streambuf_char_seekpos)
690             VTABLE_ADD_FUNC(basic_streambuf_char_setbuf)
691             VTABLE_ADD_FUNC(basic_streambuf_char_sync)
692             VTABLE_ADD_FUNC(basic_streambuf_char_imbue));
693     __ASM_VTABLE(basic_streambuf_wchar,
694             VTABLE_ADD_FUNC(basic_streambuf_wchar_vector_dtor)
695             VTABLE_ADD_FUNC(basic_streambuf_wchar_overflow)
696             VTABLE_ADD_FUNC(basic_streambuf_wchar_pbackfail)
697             VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
698             VTABLE_ADD_FUNC(basic_streambuf_wchar_underflow)
699             VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow)
700             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
701             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
702             VTABLE_ADD_FUNC(basic_streambuf_wchar_seekoff)
703             VTABLE_ADD_FUNC(basic_streambuf_wchar_seekpos)
704             VTABLE_ADD_FUNC(basic_streambuf_wchar_setbuf)
705             VTABLE_ADD_FUNC(basic_streambuf_wchar_sync)
706             VTABLE_ADD_FUNC(basic_streambuf_wchar_imbue));
707     __ASM_VTABLE(basic_streambuf_short,
708             VTABLE_ADD_FUNC(basic_streambuf_wchar_vector_dtor)
709             VTABLE_ADD_FUNC(basic_streambuf_wchar_overflow)
710             VTABLE_ADD_FUNC(basic_streambuf_wchar_pbackfail)
711             VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
712             VTABLE_ADD_FUNC(basic_streambuf_wchar_underflow)
713             VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow)
714             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
715             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
716             VTABLE_ADD_FUNC(basic_streambuf_wchar_seekoff)
717             VTABLE_ADD_FUNC(basic_streambuf_wchar_seekpos)
718             VTABLE_ADD_FUNC(basic_streambuf_wchar_setbuf)
719             VTABLE_ADD_FUNC(basic_streambuf_wchar_sync)
720             VTABLE_ADD_FUNC(basic_streambuf_wchar_imbue));
721     __ASM_VTABLE(basic_filebuf_char,
722             VTABLE_ADD_FUNC(basic_filebuf_char_vector_dtor)
723             VTABLE_ADD_FUNC(basic_filebuf_char_overflow)
724             VTABLE_ADD_FUNC(basic_filebuf_char_pbackfail)
725             VTABLE_ADD_FUNC(basic_streambuf_char_showmanyc)
726             VTABLE_ADD_FUNC(basic_filebuf_char_underflow)
727             VTABLE_ADD_FUNC(basic_filebuf_char_uflow)
728             VTABLE_ADD_FUNC(basic_streambuf_char_xsgetn)
729             VTABLE_ADD_FUNC(basic_streambuf_char_xsputn)
730             VTABLE_ADD_FUNC(basic_filebuf_char_seekoff)
731             VTABLE_ADD_FUNC(basic_filebuf_char_seekpos)
732             VTABLE_ADD_FUNC(basic_filebuf_char_setbuf)
733             VTABLE_ADD_FUNC(basic_filebuf_char_sync)
734             VTABLE_ADD_FUNC(basic_filebuf_char_imbue));
735     __ASM_VTABLE(basic_filebuf_wchar,
736             VTABLE_ADD_FUNC(basic_filebuf_wchar_vector_dtor)
737             VTABLE_ADD_FUNC(basic_filebuf_wchar_overflow)
738             VTABLE_ADD_FUNC(basic_filebuf_wchar_pbackfail)
739             VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
740             VTABLE_ADD_FUNC(basic_filebuf_wchar_underflow)
741             VTABLE_ADD_FUNC(basic_filebuf_wchar_uflow)
742             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
743             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
744             VTABLE_ADD_FUNC(basic_filebuf_wchar_seekoff)
745             VTABLE_ADD_FUNC(basic_filebuf_wchar_seekpos)
746             VTABLE_ADD_FUNC(basic_filebuf_wchar_setbuf)
747             VTABLE_ADD_FUNC(basic_filebuf_wchar_sync)
748             VTABLE_ADD_FUNC(basic_filebuf_wchar_imbue));
749     __ASM_VTABLE(basic_filebuf_short,
750             VTABLE_ADD_FUNC(basic_filebuf_wchar_vector_dtor)
751             VTABLE_ADD_FUNC(basic_filebuf_wchar_overflow)
752             VTABLE_ADD_FUNC(basic_filebuf_wchar_pbackfail)
753             VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
754             VTABLE_ADD_FUNC(basic_filebuf_wchar_underflow)
755             VTABLE_ADD_FUNC(basic_filebuf_wchar_uflow)
756             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
757             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
758             VTABLE_ADD_FUNC(basic_filebuf_wchar_seekoff)
759             VTABLE_ADD_FUNC(basic_filebuf_wchar_seekpos)
760             VTABLE_ADD_FUNC(basic_filebuf_short_setbuf)
761             VTABLE_ADD_FUNC(basic_filebuf_wchar_sync)
762             VTABLE_ADD_FUNC(basic_filebuf_short_imbue));
763     __ASM_VTABLE(basic_stringbuf_char,
764             VTABLE_ADD_FUNC(basic_stringbuf_char_vector_dtor)
765             VTABLE_ADD_FUNC(basic_stringbuf_char_overflow)
766             VTABLE_ADD_FUNC(basic_stringbuf_char_pbackfail)
767             VTABLE_ADD_FUNC(basic_streambuf_char_showmanyc)
768             VTABLE_ADD_FUNC(basic_stringbuf_char_underflow)
769             VTABLE_ADD_FUNC(basic_streambuf_char_uflow)
770             VTABLE_ADD_FUNC(basic_streambuf_char_xsgetn)
771             VTABLE_ADD_FUNC(basic_streambuf_char_xsputn)
772             VTABLE_ADD_FUNC(basic_stringbuf_char_seekoff)
773             VTABLE_ADD_FUNC(basic_stringbuf_char_seekpos)
774             VTABLE_ADD_FUNC(basic_streambuf_char_setbuf)
775             VTABLE_ADD_FUNC(basic_streambuf_char_sync)
776             VTABLE_ADD_FUNC(basic_streambuf_char_imbue));
777     __ASM_VTABLE(basic_stringbuf_wchar,
778             VTABLE_ADD_FUNC(basic_stringbuf_wchar_vector_dtor)
779             VTABLE_ADD_FUNC(basic_stringbuf_wchar_overflow)
780             VTABLE_ADD_FUNC(basic_stringbuf_wchar_pbackfail)
781             VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
782             VTABLE_ADD_FUNC(basic_stringbuf_wchar_underflow)
783             VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow)
784             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
785             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
786             VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekoff)
787             VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekpos)
788             VTABLE_ADD_FUNC(basic_streambuf_wchar_setbuf)
789             VTABLE_ADD_FUNC(basic_streambuf_wchar_sync)
790             VTABLE_ADD_FUNC(basic_streambuf_wchar_imbue));
791     __ASM_VTABLE(basic_stringbuf_short,
792             VTABLE_ADD_FUNC(basic_stringbuf_wchar_vector_dtor)
793             VTABLE_ADD_FUNC(basic_stringbuf_wchar_overflow)
794             VTABLE_ADD_FUNC(basic_stringbuf_wchar_pbackfail)
795             VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
796             VTABLE_ADD_FUNC(basic_stringbuf_wchar_underflow)
797             VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow)
798             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
799             VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
800             VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekoff)
801             VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekpos)
802             VTABLE_ADD_FUNC(basic_streambuf_wchar_setbuf)
803             VTABLE_ADD_FUNC(basic_streambuf_wchar_sync)
804             VTABLE_ADD_FUNC(basic_streambuf_wchar_imbue));
805     __ASM_VTABLE(basic_ostream_char,
806             VTABLE_ADD_FUNC(basic_ostream_char_vector_dtor));
807     __ASM_VTABLE(basic_ostream_wchar,
808             VTABLE_ADD_FUNC(basic_ostream_wchar_vector_dtor));
809     __ASM_VTABLE(basic_ostream_short,
810             VTABLE_ADD_FUNC(basic_ostream_wchar_vector_dtor));
811     __ASM_VTABLE(basic_istream_char,
812             VTABLE_ADD_FUNC(basic_istream_char_vector_dtor));
813     __ASM_VTABLE(basic_istream_wchar,
814             VTABLE_ADD_FUNC(basic_istream_wchar_vector_dtor));
815     __ASM_VTABLE(basic_istream_short,
816             VTABLE_ADD_FUNC(basic_istream_wchar_vector_dtor));
817     __ASM_VTABLE(basic_iostream_char,
818             VTABLE_ADD_FUNC(basic_iostream_char_vector_dtor));
819     __ASM_VTABLE(basic_iostream_wchar,
820             VTABLE_ADD_FUNC(basic_iostream_wchar_vector_dtor));
821     __ASM_VTABLE(basic_iostream_short,
822             VTABLE_ADD_FUNC(basic_iostream_wchar_vector_dtor));
823     __ASM_VTABLE(basic_ofstream_char,
824             VTABLE_ADD_FUNC(basic_ofstream_char_vector_dtor));
825     __ASM_VTABLE(basic_ofstream_wchar,
826             VTABLE_ADD_FUNC(basic_ofstream_wchar_vector_dtor));
827     __ASM_VTABLE(basic_ofstream_short,
828             VTABLE_ADD_FUNC(basic_ofstream_wchar_vector_dtor));
829     __ASM_VTABLE(basic_ifstream_char,
830             VTABLE_ADD_FUNC(basic_ifstream_char_vector_dtor));
831     __ASM_VTABLE(basic_ifstream_wchar,
832             VTABLE_ADD_FUNC(basic_ifstream_wchar_vector_dtor));
833     __ASM_VTABLE(basic_ifstream_short,
834             VTABLE_ADD_FUNC(basic_ifstream_wchar_vector_dtor));
835     __ASM_VTABLE(basic_fstream_char,
836             VTABLE_ADD_FUNC(basic_fstream_char_vector_dtor));
837     __ASM_VTABLE(basic_fstream_wchar,
838             VTABLE_ADD_FUNC(basic_fstream_wchar_vector_dtor));
839     __ASM_VTABLE(basic_fstream_short,
840             VTABLE_ADD_FUNC(basic_fstream_wchar_vector_dtor));
841     __ASM_VTABLE(basic_ostringstream_char,
842             VTABLE_ADD_FUNC(basic_ostringstream_char_vector_dtor));
843     __ASM_VTABLE(basic_ostringstream_wchar,
844             VTABLE_ADD_FUNC(basic_ostringstream_wchar_vector_dtor));
845     __ASM_VTABLE(basic_ostringstream_short,
846             VTABLE_ADD_FUNC(basic_ostringstream_wchar_vector_dtor));
847     __ASM_VTABLE(basic_istringstream_char,
848             VTABLE_ADD_FUNC(basic_istringstream_char_vector_dtor));
849     __ASM_VTABLE(basic_istringstream_wchar,
850             VTABLE_ADD_FUNC(basic_istringstream_wchar_vector_dtor));
851     __ASM_VTABLE(basic_istringstream_short,
852             VTABLE_ADD_FUNC(basic_istringstream_wchar_vector_dtor));
853     __ASM_VTABLE(basic_stringstream_char,
854             VTABLE_ADD_FUNC(basic_stringstream_char_vector_dtor));
855     __ASM_VTABLE(basic_stringstream_wchar,
856             VTABLE_ADD_FUNC(basic_stringstream_wchar_vector_dtor));
857     __ASM_VTABLE(basic_stringstream_short,
858             VTABLE_ADD_FUNC(basic_stringstream_wchar_vector_dtor));
859     __ASM_VTABLE(strstreambuf,
860             VTABLE_ADD_FUNC(strstreambuf_vector_dtor)
861             VTABLE_ADD_FUNC(strstreambuf_overflow)
862             VTABLE_ADD_FUNC(strstreambuf_pbackfail)
863             VTABLE_ADD_FUNC(basic_streambuf_char_showmanyc)
864             VTABLE_ADD_FUNC(strstreambuf_underflow)
865             VTABLE_ADD_FUNC(basic_streambuf_char_uflow)
866             VTABLE_ADD_FUNC(basic_streambuf_char_xsgetn)
867             VTABLE_ADD_FUNC(basic_streambuf_char_xsputn)
868             VTABLE_ADD_FUNC(strstreambuf_seekoff)
869             VTABLE_ADD_FUNC(strstreambuf_seekpos)
870             VTABLE_ADD_FUNC(basic_streambuf_char_setbuf)
871             VTABLE_ADD_FUNC(basic_streambuf_char_sync)
872             VTABLE_ADD_FUNC(basic_streambuf_char_imbue));
873     __ASM_VTABLE(ostrstream,
874             VTABLE_ADD_FUNC(ostrstream_vector_dtor));
875     __ASM_VTABLE(strstream,
876             VTABLE_ADD_FUNC(strstream_vector_dtor));
877 #ifndef __GNUC__
878 }
879 #endif
880
881 /* ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD00@Z */
882 /* ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z */
883 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_setp_next, 16)
884 void __thiscall basic_streambuf_char_setp_next(basic_streambuf_char *this, char *first, char *next, char *last)
885 {
886     TRACE("(%p %p %p %p)\n", this, first, next, last);
887
888     this->wbuf = first;
889     this->wpos = next;
890     this->wsize = last-next;
891 }
892
893 /* ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD0@Z */
894 /* ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD0@Z */
895 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_setp, 12)
896 void __thiscall basic_streambuf_char_setp(basic_streambuf_char *this, char *first, char *last)
897 {
898     basic_streambuf_char_setp_next(this, first, first, last);
899 }
900
901 /* ?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD00@Z */
902 /* ?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z */
903 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_setg, 16)
904 void __thiscall basic_streambuf_char_setg(basic_streambuf_char *this, char *first, char *next, char *last)
905 {
906     TRACE("(%p %p %p %p)\n", this, first, next, last);
907
908     this->rbuf = first;
909     this->rpos = next;
910     this->rsize = last-next;
911 }
912
913 /* ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXXZ */
914 /* ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXXZ */
915 DEFINE_THISCALL_WRAPPER(basic_streambuf_char__Init_empty, 4)
916 void __thiscall basic_streambuf_char__Init_empty(basic_streambuf_char *this)
917 {
918     TRACE("(%p)\n", this);
919
920     this->prbuf = &this->rbuf;
921     this->pwbuf = &this->wbuf;
922     this->prpos = &this->rpos;
923     this->pwpos = &this->wpos;
924     this->prsize = &this->rsize;
925     this->pwsize = &this->wsize;
926
927     basic_streambuf_char_setp(this, NULL, NULL);
928     basic_streambuf_char_setg(this, NULL, NULL, NULL);
929 }
930
931 /* ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@W4_Uninitialized@1@@Z */
932 /* ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@W4_Uninitialized@1@@Z */
933 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_ctor_uninitialized, 8)
934 basic_streambuf_char* __thiscall basic_streambuf_char_ctor_uninitialized(basic_streambuf_char *this, int uninitialized)
935 {
936     TRACE("(%p %d)\n", this, uninitialized);
937     this->vtable = &MSVCP_basic_streambuf_char_vtable;
938     return this;
939 }
940
941 /* ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@XZ */
942 /* ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ */
943 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_ctor, 4)
944 basic_streambuf_char* __thiscall basic_streambuf_char_ctor(basic_streambuf_char *this)
945 {
946     TRACE("(%p)\n", this);
947
948     this->vtable = &MSVCP_basic_streambuf_char_vtable;
949     this->loc = MSVCRT_operator_new(sizeof(locale));
950     locale_ctor(this->loc);
951     basic_streambuf_char__Init_empty(this);
952
953     return this;
954 }
955
956 /* ??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAE@XZ */
957 /* ??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAA@XZ */
958 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_dtor, 4)
959 void __thiscall basic_streambuf_char_dtor(basic_streambuf_char *this)
960 {
961     TRACE("(%p)\n", this);
962
963     locale_dtor(this->loc);
964     MSVCRT_operator_delete(this->loc);
965 }
966
967 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_vector_dtor, 8)
968 basic_streambuf_char* __thiscall basic_streambuf_char_vector_dtor(basic_streambuf_char *this, unsigned int flags)
969 {
970     TRACE("(%p %x)\n", this, flags);
971     if(flags & 2) {
972         /* we have an array, with the number of elements stored before the first object */
973         INT_PTR i, *ptr = (INT_PTR *)this-1;
974
975         for(i=*ptr-1; i>=0; i--)
976             basic_streambuf_char_dtor(this+i);
977         MSVCRT_operator_delete(ptr);
978     } else {
979         basic_streambuf_char_dtor(this);
980         if(flags & 1)
981             MSVCRT_operator_delete(this);
982     }
983
984     return this;
985 }
986
987 /* ?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEHXZ */
988 /* ?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ */
989 static streamsize basic_streambuf_char__Gnavail(const basic_streambuf_char *this)
990 {
991     TRACE("(%p)\n", this);
992     return *this->prpos ? *this->prsize : 0;
993 }
994
995 /* ?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ */
996 /* ?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ */
997 DEFINE_THISCALL_WRAPPER(basic_streambuf_char__Gndec, 4)
998 char* __thiscall basic_streambuf_char__Gndec(basic_streambuf_char *this)
999 {
1000     TRACE("(%p)\n", this);
1001     (*this->prsize)++;
1002     (*this->prpos)--;
1003     return *this->prpos;
1004 }
1005
1006 /* ?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ */
1007 /* ?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ */
1008 DEFINE_THISCALL_WRAPPER(basic_streambuf_char__Gninc, 4)
1009 char* __thiscall basic_streambuf_char__Gninc(basic_streambuf_char *this)
1010 {
1011     TRACE("(%p)\n", this);
1012     (*this->prsize)--;
1013     return (*this->prpos)++;
1014 }
1015
1016 /* ?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ */
1017 /* ?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ */
1018 static char* basic_streambuf_char__Gnpreinc(basic_streambuf_char *this)
1019 {
1020     TRACE("(%p)\n", this);
1021     (*this->prsize)--;
1022     (*this->prpos)++;
1023     return *this->prpos;
1024 }
1025
1026 /* ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAPAD0PAH001@Z */
1027 /* ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAPEAD0PEAH001@Z */
1028 DEFINE_THISCALL_WRAPPER(basic_streambuf_char__Init, 28)
1029 void __thiscall basic_streambuf_char__Init(basic_streambuf_char *this, char **gf, char **gn, int *gc, char **pf, char **pn, int *pc)
1030 {
1031     TRACE("(%p %p %p %p %p %p %p)\n", this, gf, gn, gc, pf, pn, pc);
1032
1033     this->prbuf = gf;
1034     this->pwbuf = pf;
1035     this->prpos = gn;
1036     this->pwpos = pn;
1037     this->prsize = gc;
1038     this->pwsize = pc;
1039 }
1040
1041 /* ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ */
1042 /* ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAXXZ */
1043 static void basic_streambuf_char__Lock(basic_streambuf_char *this)
1044 {
1045     TRACE("(%p)\n", this);
1046 }
1047
1048 /* ?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEHXZ */
1049 /* ?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ */
1050 static streamsize basic_streambuf_char__Pnavail(const basic_streambuf_char *this)
1051 {
1052     TRACE("(%p)\n", this);
1053     return *this->pwpos ? *this->pwsize : 0;
1054 }
1055
1056 /* ?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ */
1057 /* ?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ */
1058 DEFINE_THISCALL_WRAPPER(basic_streambuf_char__Pninc, 4)
1059 char* __thiscall basic_streambuf_char__Pninc(basic_streambuf_char *this)
1060 {
1061     TRACE("(%p)\n", this);
1062     (*this->pwsize)--;
1063     return (*this->pwpos)++;
1064 }
1065
1066 /* ?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ */
1067 /* ?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ */
1068 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_underflow, 4)
1069 #define call_basic_streambuf_char_underflow(this) CALL_VTBL_FUNC(this, 16, \
1070         int, (basic_streambuf_char*), (this))
1071 int __thiscall basic_streambuf_char_underflow(basic_streambuf_char *this)
1072 {
1073     TRACE("(%p)\n", this);
1074     return EOF;
1075 }
1076
1077 /* ?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ */
1078 /* ?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ */
1079 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_uflow, 4)
1080 #define call_basic_streambuf_char_uflow(this) CALL_VTBL_FUNC(this, 20, \
1081         int, (basic_streambuf_char*), (this))
1082 int __thiscall basic_streambuf_char_uflow(basic_streambuf_char *this)
1083 {
1084     int ret;
1085
1086     TRACE("(%p)\n", this);
1087
1088     if(call_basic_streambuf_char_underflow(this)==EOF)
1089         return EOF;
1090
1091     ret = (unsigned char)**this->prpos;
1092     (*this->prsize)--;
1093     (*this->prpos)++;
1094     return ret;
1095 }
1096
1097 /* ?_Xsgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPADIH@Z */
1098 /* ?_Xsgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_K_J@Z */
1099 static streamsize basic_streambuf_char__Xsgetn_s(basic_streambuf_char *this, char *ptr, MSVCP_size_t size, streamsize count)
1100 {
1101     streamsize copied, chunk;
1102     int c;
1103
1104     TRACE("(%p %p %lu %ld)\n", this, ptr, size, count);
1105
1106     for(copied=0; copied<count && size;) {
1107         chunk = basic_streambuf_char__Gnavail(this);
1108         if(chunk > count-copied)
1109             chunk = count-copied;
1110
1111         if(chunk > 0) {
1112             memcpy_s(ptr+copied, size, *this->prpos, chunk);
1113             *this->prpos += chunk;
1114             *this->prsize -= chunk;
1115             copied += chunk;
1116             size -= chunk;
1117         }else if((c = call_basic_streambuf_char_uflow(this)) != EOF) {
1118             ptr[copied] = c;
1119             copied++;
1120             size--;
1121         }else {
1122             break;
1123         }
1124     }
1125
1126     return copied;
1127 }
1128
1129 /* ?_Sgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPADIH@Z */
1130 /* ?_Sgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_K_J@Z */
1131 static streamsize basic_streambuf_char__Sgetn_s(basic_streambuf_char *this, char *ptr, MSVCP_size_t size, streamsize count)
1132 {
1133     TRACE("(%p %p %lu %ld)\n", this, ptr, size, count);
1134     return basic_streambuf_char__Xsgetn_s(this, ptr, size, count);
1135 }
1136
1137 /* ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ */
1138 /* ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAXXZ */
1139 static void basic_streambuf_char__Unlock(basic_streambuf_char *this)
1140 {
1141     TRACE("(%p)\n", this);
1142 }
1143
1144 /* ?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ */
1145 /* ?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ */
1146 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_eback, 4)
1147 char* __thiscall basic_streambuf_char_eback(const basic_streambuf_char *this)
1148 {
1149     TRACE("(%p)\n", this);
1150     return *this->prbuf;
1151 }
1152
1153 /* ?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ */
1154 /* ?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ */
1155 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_gptr, 4)
1156 char* __thiscall basic_streambuf_char_gptr(const basic_streambuf_char *this)
1157 {
1158     TRACE("(%p)\n", this);
1159     return *this->prpos;
1160 }
1161
1162 /* ?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ */
1163 /* ?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ */
1164 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_egptr, 4)
1165 char* __thiscall basic_streambuf_char_egptr(const basic_streambuf_char *this)
1166 {
1167     TRACE("(%p)\n", this);
1168     return *this->prpos+*this->prsize;
1169 }
1170
1171 /* ?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ */
1172 /* ?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ */
1173 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_epptr, 4)
1174 char* __thiscall basic_streambuf_char_epptr(const basic_streambuf_char *this)
1175 {
1176     TRACE("(%p)\n", this);
1177     return *this->pwpos+*this->pwsize;
1178 }
1179
1180 /* ?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z */
1181 /* ?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z */
1182 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_gbump, 8)
1183 void __thiscall basic_streambuf_char_gbump(basic_streambuf_char *this, int off)
1184 {
1185     TRACE("(%p %d)\n", this, off);
1186     *this->prpos += off;
1187     *this->prsize -= off;
1188 }
1189
1190 /* ?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEXABVlocale@2@@Z */
1191 /* ?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAXAEBVlocale@2@@Z */
1192 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_imbue, 8)
1193 #define call_basic_streambuf_char_imbue(this, loc) CALL_VTBL_FUNC(this, 48, \
1194         void, (basic_streambuf_char*, const locale*), (this, loc))
1195 void __thiscall basic_streambuf_char_imbue(basic_streambuf_char *this, const locale *loc)
1196 {
1197     TRACE("(%p %p)\n", this, loc);
1198 }
1199
1200 /* ?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHH@Z */
1201 /* ?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z */
1202 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_overflow, 8)
1203 #define call_basic_streambuf_char_overflow(this, ch) CALL_VTBL_FUNC(this, 4, \
1204         int, (basic_streambuf_char*, int), (this, ch))
1205 int __thiscall basic_streambuf_char_overflow(basic_streambuf_char *this, int ch)
1206 {
1207     TRACE("(%p %d)\n", this, ch);
1208     return EOF;
1209 }
1210
1211 /* ?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHH@Z */
1212 /* ?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z */
1213 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pbackfail, 8)
1214 #define call_basic_streambuf_char_pbackfail(this, ch) CALL_VTBL_FUNC(this, 8, \
1215         int, (basic_streambuf_char*, int), (this, ch))
1216 int __thiscall basic_streambuf_char_pbackfail(basic_streambuf_char *this, int ch)
1217 {
1218     TRACE("(%p %d)\n", this, ch);
1219     return EOF;
1220 }
1221
1222 /* ?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ */
1223 /* ?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ */
1224 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pbase, 4)
1225 char* __thiscall basic_streambuf_char_pbase(const basic_streambuf_char *this)
1226 {
1227     TRACE("(%p)\n", this);
1228     return *this->pwbuf;
1229 }
1230
1231 /* ?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z */
1232 /* ?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z */
1233 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pbump, 8)
1234 void __thiscall basic_streambuf_char_pbump(basic_streambuf_char *this, int off)
1235 {
1236     TRACE("(%p %d)\n", this, off);
1237     *this->pwpos += off;
1238     *this->pwsize -= off;
1239 }
1240
1241 /* ?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ */
1242 /* ?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ */
1243 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pptr, 4)
1244 char* __thiscall basic_streambuf_char_pptr(const basic_streambuf_char *this)
1245 {
1246     TRACE("(%p)\n", this);
1247     return *this->pwpos;
1248 }
1249
1250 /* ?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
1251 /* ?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
1252 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pubimbue, 12)
1253 locale* __thiscall basic_streambuf_char_pubimbue(basic_streambuf_char *this, locale *ret, const locale *loc)
1254 {
1255     TRACE("(%p %p)\n", this, loc);
1256     memcpy(ret, this->loc, sizeof(locale));
1257     call_basic_streambuf_char_imbue(this, loc);
1258     locale_copy_ctor(this->loc, loc);
1259     return ret;
1260 }
1261
1262 /* ?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@JHH@Z */
1263 /* ?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
1264 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_seekoff, 20)
1265 #define call_basic_streambuf_char_seekoff(this, ret, off, way, mode) CALL_VTBL_FUNC(this, 32, \
1266         fpos_int*, (basic_streambuf_char*, fpos_int*, streamoff, int, int), (this, ret, off, way, mode))
1267 fpos_int* __thiscall basic_streambuf_char_seekoff(basic_streambuf_char *this,
1268         fpos_int *ret, streamoff off, int way, int mode)
1269 {
1270     TRACE("(%p %ld %d %d)\n", this, off, way, mode);
1271     ret->off = 0;
1272     ret->pos = -1;
1273     ret->state = 0;
1274     return ret;
1275 }
1276
1277 /* ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@JHH@Z */
1278 /* ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z */
1279 static fpos_int* basic_streambuf_char_pubseekoff(basic_streambuf_char *this,
1280         fpos_int *ret, streamoff off, int way, int mode)
1281 {
1282     TRACE("(%p %ld %d %d)\n", this, off, way, mode);
1283     return call_basic_streambuf_char_seekoff(this, ret, off, way, mode);
1284 }
1285
1286 /* ?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
1287 /* ?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
1288 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_seekpos, 36)
1289 #define call_basic_streambuf_char_seekpos(this, ret, pos, mode) CALL_VTBL_FUNC(this, 36, \
1290         fpos_int*, (basic_streambuf_char*, fpos_int*, fpos_int, int), (this, ret, pos, mode))
1291 fpos_int* __thiscall basic_streambuf_char_seekpos(basic_streambuf_char *this,
1292         fpos_int *ret, fpos_int pos, int mode)
1293 {
1294     TRACE("(%p %s %d)\n", this, debugstr_fpos_int(&pos), mode);
1295     ret->off = 0;
1296     ret->pos = -1;
1297     ret->state = 0;
1298     return ret;
1299 }
1300
1301 /* ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z */
1302 /* ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z */
1303 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pubseekpos, 36)
1304 fpos_int* __thiscall basic_streambuf_char_pubseekpos(basic_streambuf_char *this,
1305         fpos_int *ret, fpos_int pos, int mode)
1306 {
1307     TRACE("(%p %s %d)\n", this, debugstr_fpos_int(&pos), mode);
1308     return call_basic_streambuf_char_seekpos(this, ret, pos, mode);
1309 }
1310
1311 /* ?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEPAV12@PADH@Z */
1312 /* ?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAPEAV12@PEAD_J@Z */
1313 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_setbuf, 12)
1314 #define call_basic_streambuf_char_setbuf(this, buf, count) CALL_VTBL_FUNC(this, 40, \
1315         basic_streambuf_char*, (basic_streambuf_char*, char*, streamsize), (this, buf, count))
1316 basic_streambuf_char* __thiscall basic_streambuf_char_setbuf(basic_streambuf_char *this, char *buf, streamsize count)
1317 {
1318     TRACE("(%p %p %ld)\n", this, buf, count);
1319     return this;
1320 }
1321
1322 /* ?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PADH@Z */
1323 /* ?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEAD_J@Z */
1324 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pubsetbuf, 12)
1325 basic_streambuf_char* __thiscall basic_streambuf_char_pubsetbuf(basic_streambuf_char *this, char *buf, streamsize count)
1326 {
1327     TRACE("(%p %p %ld)\n", this, buf, count);
1328     return call_basic_streambuf_char_setbuf(this, buf, count);
1329 }
1330
1331 /* ?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ */
1332 /* ?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ */
1333 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sync, 4)
1334 #define call_basic_streambuf_char_sync(this) CALL_VTBL_FUNC(this, 44, \
1335         int, (basic_streambuf_char*), (this))
1336 int __thiscall basic_streambuf_char_sync(basic_streambuf_char *this)
1337 {
1338     TRACE("(%p)\n", this);
1339     return 0;
1340 }
1341
1342 /* ?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ */
1343 /* ?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ */
1344 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_pubsync, 4)
1345 int __thiscall basic_streambuf_char_pubsync(basic_streambuf_char *this)
1346 {
1347     TRACE("(%p)\n", this);
1348     return call_basic_streambuf_char_sync(this);
1349 }
1350
1351 /* ?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPADH@Z */
1352 /* ?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z */
1353 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sgetn, 12)
1354 streamsize __thiscall basic_streambuf_char_sgetn(basic_streambuf_char *this, char *ptr, streamsize count)
1355 {
1356     TRACE("(%p %p %ld)\n", this, ptr, count);
1357     return basic_streambuf_char__Xsgetn_s(this, ptr, -1, count);
1358 }
1359
1360 /* ?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ */
1361 /* ?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JXZ */
1362 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_showmanyc, 4)
1363 #define call_basic_streambuf_char_showmanyc(this) CALL_VTBL_FUNC(this, 12, \
1364         streamsize, (basic_streambuf_char*), (this))
1365 streamsize __thiscall basic_streambuf_char_showmanyc(basic_streambuf_char *this)
1366 {
1367     TRACE("(%p)\n", this);
1368     return 0;
1369 }
1370
1371 /* ?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ */
1372 /* ?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JXZ */
1373 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_in_avail, 4)
1374 streamsize __thiscall basic_streambuf_char_in_avail(basic_streambuf_char *this)
1375 {
1376     streamsize ret;
1377
1378     TRACE("(%p)\n", this);
1379
1380     ret = basic_streambuf_char__Gnavail(this);
1381     return ret ? ret : call_basic_streambuf_char_showmanyc(this);
1382 }
1383
1384 /* ?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z */
1385 /* ?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z */
1386 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sputbackc, 8)
1387 int __thiscall basic_streambuf_char_sputbackc(basic_streambuf_char *this, char ch)
1388 {
1389     TRACE("(%p %d)\n", this, ch);
1390     if(*this->prpos && *this->prpos>*this->prbuf && (*this->prpos)[-1]==ch) {
1391         (*this->prsize)++;
1392         (*this->prpos)--;
1393         return (unsigned char)ch;
1394     }
1395
1396     return call_basic_streambuf_char_pbackfail(this, (unsigned char)ch);
1397 }
1398
1399 /* ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z */
1400 /* ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z */
1401 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sputc, 8)
1402 int __thiscall basic_streambuf_char_sputc(basic_streambuf_char *this, char ch)
1403 {
1404     TRACE("(%p %d)\n", this, ch);
1405     return basic_streambuf_char__Pnavail(this) ?
1406         (*basic_streambuf_char__Pninc(this) = ch) :
1407         call_basic_streambuf_char_overflow(this, (unsigned char)ch);
1408 }
1409
1410 /* ?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ */
1411 /* ?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ */
1412 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sungetc, 4)
1413 int __thiscall basic_streambuf_char_sungetc(basic_streambuf_char *this)
1414 {
1415     TRACE("(%p)\n", this);
1416     if(*this->prpos && *this->prpos>*this->prbuf) {
1417         (*this->prsize)++;
1418         (*this->prpos)--;
1419         return (unsigned char)**this->prpos;
1420     }
1421
1422     return call_basic_streambuf_char_pbackfail(this, EOF);
1423 }
1424
1425 /* ?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ */
1426 /* ?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAXXZ */
1427 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_stossc, 4)
1428 void __thiscall basic_streambuf_char_stossc(basic_streambuf_char *this)
1429 {
1430     TRACE("(%p)\n", this);
1431     if(basic_streambuf_char__Gnavail(this))
1432         basic_streambuf_char__Gninc(this);
1433     else
1434         call_basic_streambuf_char_uflow(this);
1435 }
1436
1437 /* ?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ */
1438 /* ?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ */
1439 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sbumpc, 4)
1440 int __thiscall basic_streambuf_char_sbumpc(basic_streambuf_char *this)
1441 {
1442     TRACE("(%p)\n", this);
1443     return basic_streambuf_char__Gnavail(this) ?
1444         (int)(unsigned char)*basic_streambuf_char__Gninc(this) : call_basic_streambuf_char_uflow(this);
1445 }
1446
1447 /* ?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ */
1448 /* ?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ */
1449 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sgetc, 4)
1450 int __thiscall basic_streambuf_char_sgetc(basic_streambuf_char *this)
1451 {
1452     TRACE("(%p)\n", this);
1453     return basic_streambuf_char__Gnavail(this) ?
1454         (int)(unsigned char)*basic_streambuf_char_gptr(this) : call_basic_streambuf_char_underflow(this);
1455 }
1456
1457 /* ?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ */
1458 /* ?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ */
1459 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_snextc, 4)
1460 int __thiscall basic_streambuf_char_snextc(basic_streambuf_char *this)
1461 {
1462     TRACE("(%p)\n", this);
1463
1464     if(basic_streambuf_char__Gnavail(this) > 1)
1465         return (unsigned char)*basic_streambuf_char__Gnpreinc(this);
1466     return basic_streambuf_char_sbumpc(this)==EOF ?
1467         EOF : basic_streambuf_char_sgetc(this);
1468 }
1469
1470 /* ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPADH@Z */
1471 /* ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z */
1472 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_xsgetn, 12)
1473 #define call_basic_streambuf_char_xsgetn(this, ptr, count) CALL_VTBL_FUNC(this, 24, \
1474         streamsize, (basic_streambuf_char*, char*, streamsize), (this, ptr, count))
1475 streamsize __thiscall basic_streambuf_char_xsgetn(basic_streambuf_char *this, char *ptr, streamsize count)
1476 {
1477     TRACE("(%p %p %ld)\n", this, ptr, count);
1478     return basic_streambuf_char__Xsgetn_s(this, ptr, -1, count);
1479 }
1480
1481 /* ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPBDH@Z */
1482 /* ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z */
1483 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_xsputn, 12)
1484 #define call_basic_streambuf_char_xsputn(this, ptr, count) CALL_VTBL_FUNC(this, 28, \
1485         streamsize, (basic_streambuf_char*, const char*, streamsize), (this, ptr, count))
1486 streamsize __thiscall basic_streambuf_char_xsputn(basic_streambuf_char *this, const char *ptr, streamsize count)
1487 {
1488     streamsize copied, chunk;
1489
1490     TRACE("(%p %p %ld)\n", this, ptr, count);
1491
1492     for(copied=0; copied<count;) {
1493         chunk = basic_streambuf_char__Pnavail(this);
1494         if(chunk > count-copied)
1495             chunk = count-copied;
1496
1497         if(chunk > 0) {
1498             memcpy(*this->pwpos, ptr+copied, chunk);
1499             *this->pwpos += chunk;
1500             *this->pwsize -= chunk;
1501             copied += chunk;
1502         }else if(call_basic_streambuf_char_overflow(this, (unsigned char)ptr[copied]) != EOF) {
1503             copied++;
1504         }else {
1505             break;
1506         }
1507     }
1508
1509     return copied;
1510 }
1511
1512 /* ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z */
1513 /* ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEBD_J@Z */
1514 DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sputn, 12)
1515 streamsize __thiscall basic_streambuf_char_sputn(basic_streambuf_char *this, const char *ptr, streamsize count)
1516 {
1517     TRACE("(%p %p %ld)\n", this, ptr, count);
1518     return call_basic_streambuf_char_xsputn(this, ptr, count);
1519 }
1520
1521 /* ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z */
1522 /* ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z */
1523 /* ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG00@Z */
1524 /* ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z */
1525 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_setp_next, 16)
1526 void __thiscall basic_streambuf_wchar_setp_next(basic_streambuf_wchar *this, wchar_t *first, wchar_t *next, wchar_t *last)
1527 {
1528     TRACE("(%p %p %p %p)\n", this, first, next, last);
1529
1530     this->wbuf = first;
1531     this->wpos = next;
1532     this->wsize = last-next;
1533 }
1534
1535 /* ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W0@Z */
1536 /* ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W0@Z */
1537 /* ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG0@Z */
1538 /* ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG0@Z */
1539 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_setp, 12)
1540 void __thiscall basic_streambuf_wchar_setp(basic_streambuf_wchar *this, wchar_t *first, wchar_t *last)
1541 {
1542     basic_streambuf_wchar_setp_next(this, first, first, last);
1543 }
1544
1545 /* ?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z */
1546 /* ?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z */
1547 /* ?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG00@Z */
1548 /* ?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z */
1549 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_setg, 16)
1550 void __thiscall basic_streambuf_wchar_setg(basic_streambuf_wchar *this, wchar_t *first, wchar_t *next, wchar_t *last)
1551 {
1552     TRACE("(%p %p %p %p)\n", this, first, next, last);
1553
1554     this->rbuf = first;
1555     this->rpos = next;
1556     this->rsize = last-next;
1557 }
1558
1559 /* ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXXZ */
1560 /* ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXXZ */
1561 /* ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXXZ */
1562 /* ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXXZ */
1563 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Init_empty, 4)
1564 void __thiscall basic_streambuf_wchar__Init_empty(basic_streambuf_wchar *this)
1565 {
1566     TRACE("(%p)\n", this);
1567
1568     this->prbuf = &this->rbuf;
1569     this->pwbuf = &this->wbuf;
1570     this->prpos = &this->rpos;
1571     this->pwpos = &this->wpos;
1572     this->prsize = &this->rsize;
1573     this->pwsize = &this->wsize;
1574
1575     basic_streambuf_wchar_setp(this, NULL, NULL);
1576     basic_streambuf_wchar_setg(this, NULL, NULL, NULL);
1577 }
1578
1579 /* ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@W4_Uninitialized@1@@Z */
1580 /* ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@W4_Uninitialized@1@@Z */
1581 static basic_streambuf_wchar* basic_streambuf_wchar_ctor_uninitialized(basic_streambuf_wchar *this, int uninitialized)
1582 {
1583     TRACE("(%p %d)\n", this, uninitialized);
1584     this->vtable = &MSVCP_basic_streambuf_wchar_vtable;
1585     mutex_ctor(&this->lock);
1586     return this;
1587 }
1588
1589 /* ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAE@W4_Uninitialized@1@@Z */
1590 /* ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@W4_Uninitialized@1@@Z */
1591 DEFINE_THISCALL_WRAPPER(basic_streambuf_short_ctor_uninitialized, 8)
1592 basic_streambuf_wchar* __thiscall basic_streambuf_short_ctor_uninitialized(basic_streambuf_wchar *this, int uninitialized)
1593 {
1594     TRACE("(%p %d)\n", this, uninitialized);
1595     basic_streambuf_wchar_ctor_uninitialized(this, uninitialized);
1596     this->vtable = &MSVCP_basic_streambuf_short_vtable;
1597     return this;
1598 }
1599
1600 /* ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@XZ */
1601 /* ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@XZ */
1602 static basic_streambuf_wchar* basic_streambuf_wchar_ctor(basic_streambuf_wchar *this)
1603 {
1604     TRACE("(%p)\n", this);
1605
1606     this->vtable = &MSVCP_basic_streambuf_wchar_vtable;
1607     mutex_ctor(&this->lock);
1608     this->loc = MSVCRT_operator_new(sizeof(locale));
1609     locale_ctor(this->loc);
1610     basic_streambuf_wchar__Init_empty(this);
1611
1612     return this;
1613 }
1614
1615 /* ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAE@XZ */
1616 /* ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@XZ */
1617 DEFINE_THISCALL_WRAPPER(basic_streambuf_short_ctor, 4)
1618 basic_streambuf_wchar* __thiscall basic_streambuf_short_ctor(basic_streambuf_wchar *this)
1619 {
1620     TRACE("(%p)\n", this);
1621     basic_streambuf_wchar_ctor(this);
1622     this->vtable = &MSVCP_basic_streambuf_short_vtable;
1623     return this;
1624 }
1625
1626 /* ??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
1627 /* ??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
1628 /* ??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAE@XZ */
1629 /* ??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAA@XZ */
1630 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_dtor, 4)
1631 void __thiscall basic_streambuf_wchar_dtor(basic_streambuf_wchar *this)
1632 {
1633     TRACE("(%p)\n", this);
1634
1635     mutex_dtor(&this->lock);
1636     locale_dtor(this->loc);
1637     MSVCRT_operator_delete(this->loc);
1638 }
1639
1640 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_vector_dtor, 8)
1641 basic_streambuf_wchar* __thiscall basic_streambuf_wchar_vector_dtor(basic_streambuf_wchar *this, unsigned int flags)
1642 {
1643     TRACE("(%p %x)\n", this, flags);
1644     if(flags & 2) {
1645         /* we have an array, with the number of elements stored before the first object */
1646         INT_PTR i, *ptr = (INT_PTR *)this-1;
1647
1648         for(i=*ptr-1; i>=0; i--)
1649             basic_streambuf_wchar_dtor(this+i);
1650         MSVCRT_operator_delete(ptr);
1651     } else {
1652         basic_streambuf_wchar_dtor(this);
1653         if(flags & 1)
1654             MSVCRT_operator_delete(this);
1655     }
1656
1657     return this;
1658 }
1659
1660 /* ?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEHXZ */
1661 /* ?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ */
1662 /* ?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEHXZ */
1663 /* ?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ */
1664 static streamsize basic_streambuf_wchar__Gnavail(const basic_streambuf_wchar *this)
1665 {
1666     TRACE("(%p)\n", this);
1667     return *this->prpos ? *this->prsize : 0;
1668 }
1669
1670 /* ?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ */
1671 /* ?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ */
1672 /* ?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ */
1673 /* ?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ */
1674 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Gndec, 4)
1675 wchar_t* __thiscall basic_streambuf_wchar__Gndec(basic_streambuf_wchar *this)
1676 {
1677     TRACE("(%p)\n", this);
1678     (*this->prsize)++;
1679     (*this->prpos)--;
1680     return *this->prpos;
1681 }
1682
1683 /* ?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ */
1684 /* ?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ */
1685 /* ?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ */
1686 /* ?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ */
1687 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Gninc, 4)
1688 wchar_t* __thiscall basic_streambuf_wchar__Gninc(basic_streambuf_wchar *this)
1689 {
1690     TRACE("(%p)\n", this);
1691     (*this->prsize)--;
1692     return (*this->prpos)++;
1693 }
1694
1695 /* ?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ */
1696 /* ?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ */
1697 /* ?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ */
1698 /* ?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ */
1699 static wchar_t* basic_streambuf_wchar__Gnpreinc(basic_streambuf_wchar *this)
1700 {
1701     TRACE("(%p)\n", this);
1702     (*this->prsize)--;
1703     (*this->prpos)++;
1704     return *this->prpos;
1705 }
1706
1707 /* ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPAPA_W0PAH001@Z */
1708 /* ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAPEA_W0PEAH001@Z */
1709 /* ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAPAG0PAH001@Z */
1710 /* ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAPEAG0PEAH001@Z */
1711 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Init, 28)
1712 void __thiscall basic_streambuf_wchar__Init(basic_streambuf_wchar *this, wchar_t **gf, wchar_t **gn, int *gc, wchar_t **pf, wchar_t **pn, int *pc)
1713 {
1714     TRACE("(%p %p %p %p %p %p %p)\n", this, gf, gn, gc, pf, pn, pc);
1715
1716     this->prbuf = gf;
1717     this->pwbuf = pf;
1718     this->prpos = gn;
1719     this->pwpos = pn;
1720     this->prsize = gc;
1721     this->pwsize = pc;
1722 }
1723
1724 /* ?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
1725 /* ?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
1726 /* ?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEXXZ */
1727 /* ?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAXXZ */
1728 static void basic_streambuf_wchar__Lock(basic_streambuf_wchar *this)
1729 {
1730     TRACE("(%p)\n", this);
1731     mutex_lock(&this->lock);
1732 }
1733
1734 /* ?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEHXZ */
1735 /* ?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ */
1736 /* ?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEHXZ */
1737 /* ?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ */
1738 static streamsize basic_streambuf_wchar__Pnavail(const basic_streambuf_wchar *this)
1739 {
1740     TRACE("(%p)\n", this);
1741     return *this->pwpos ? *this->pwsize : 0;
1742 }
1743
1744 /* ?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ */
1745 /* ?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ */
1746 /* ?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ */
1747 /* ?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ */
1748 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Pninc, 4)
1749 wchar_t* __thiscall basic_streambuf_wchar__Pninc(basic_streambuf_wchar *this)
1750 {
1751     TRACE("(%p)\n", this);
1752     (*this->pwsize)--;
1753     return (*this->pwpos)++;
1754 }
1755
1756 /* ?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ */
1757 /* ?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ */
1758 /* ?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGXZ */
1759 /* ?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ */
1760 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_underflow, 4)
1761 #define call_basic_streambuf_wchar_underflow(this) CALL_VTBL_FUNC(this, 16, \
1762         unsigned short, (basic_streambuf_wchar*), (this))
1763 unsigned short __thiscall basic_streambuf_wchar_underflow(basic_streambuf_wchar *this)
1764 {
1765     TRACE("(%p)\n", this);
1766     return WEOF;
1767 }
1768
1769 /* ?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ */
1770 /* ?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ */
1771 /* ?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGXZ */
1772 /* ?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ */
1773 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_uflow, 4)
1774 #define call_basic_streambuf_wchar_uflow(this) CALL_VTBL_FUNC(this, 20, \
1775         unsigned short, (basic_streambuf_wchar*), (this))
1776 unsigned short __thiscall basic_streambuf_wchar_uflow(basic_streambuf_wchar *this)
1777 {
1778     int ret;
1779
1780     TRACE("(%p)\n", this);
1781
1782     if(call_basic_streambuf_wchar_underflow(this)==WEOF)
1783         return WEOF;
1784
1785     ret = **this->prpos;
1786     (*this->prsize)--;
1787     (*this->prpos)++;
1788     return ret;
1789 }
1790
1791 /* ?_Xsgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHPA_WIH@Z */
1792 /* ?_Xsgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_K_J@Z */
1793 /* ?_Xsgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPAGIH@Z */
1794 /* ?_Xsgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_K_J@Z */
1795 static streamsize basic_streambuf_wchar__Xsgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count)
1796 {
1797     streamsize copied, chunk;
1798     unsigned short c;
1799
1800     TRACE("(%p %p %lu %ld)\n", this, ptr, size, count);
1801
1802     for(copied=0; copied<count && size;) {
1803         chunk = basic_streambuf_wchar__Gnavail(this);
1804         if(chunk > count-copied)
1805             chunk = count-copied;
1806
1807         if(chunk > 0) {
1808             memcpy_s(ptr+copied, size, *this->prpos, chunk*sizeof(wchar_t));
1809             *this->prpos += chunk;
1810             *this->prsize -= chunk;
1811             copied += chunk;
1812             size -= chunk*sizeof(wchar_t);
1813         }else if((c = call_basic_streambuf_wchar_uflow(this)) != WEOF) {
1814             ptr[copied] = c;
1815             copied++;
1816             size--;
1817         }else {
1818             break;
1819         }
1820     }
1821
1822     return copied;
1823 }
1824
1825 /* ?_Sgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHPA_WIH@Z */
1826 /* ?_Sgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_K_J@Z */
1827 /* ?_Sgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHPAGIH@Z */
1828 /* ?_Sgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_K_J@Z */
1829 static streamsize basic_streambuf_wchar__Sgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count)
1830 {
1831     TRACE("(%p %p %lu %ld)\n", this, ptr, size, count);
1832     return basic_streambuf_wchar__Xsgetn_s(this, ptr, size, count);
1833 }
1834
1835 /* ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
1836 /* ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
1837 /* ?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEXXZ */
1838 /* ?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAXXZ */
1839 static void basic_streambuf_wchar__Unlock(basic_streambuf_wchar *this)
1840 {
1841     TRACE("(%p)\n", this);
1842     mutex_unlock(&this->lock);
1843 }
1844
1845 /* ?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ */
1846 /* ?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ */
1847 /* ?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ */
1848 /* ?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ */
1849 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_eback, 4)
1850 wchar_t* __thiscall basic_streambuf_wchar_eback(const basic_streambuf_wchar *this)
1851 {
1852     TRACE("(%p)\n", this);
1853     return *this->prbuf;
1854 }
1855
1856 /* ?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ */
1857 /* ?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ */
1858 /* ?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ */
1859 /* ?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ */
1860 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_gptr, 4)
1861 wchar_t* __thiscall basic_streambuf_wchar_gptr(const basic_streambuf_wchar *this)
1862 {
1863     TRACE("(%p)\n", this);
1864     return *this->prpos;
1865 }
1866
1867 /* ?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ */
1868 /* ?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ */
1869 /* ?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ */
1870 /* ?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ */
1871 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_egptr, 4)
1872 wchar_t* __thiscall basic_streambuf_wchar_egptr(const basic_streambuf_wchar *this)
1873 {
1874     TRACE("(%p)\n", this);
1875     return *this->prpos+*this->prsize;
1876 }
1877
1878 /* ?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ */
1879 /* ?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ */
1880 /* ?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ */
1881 /* ?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ */
1882 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_epptr, 4)
1883 wchar_t* __thiscall basic_streambuf_wchar_epptr(const basic_streambuf_wchar *this)
1884 {
1885     TRACE("(%p)\n", this);
1886     return *this->pwpos+*this->pwsize;
1887 }
1888
1889 /* ?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z */
1890 /* ?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z */
1891 /* ?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXH@Z */
1892 /* ?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z */
1893 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_gbump, 8)
1894 void __thiscall basic_streambuf_wchar_gbump(basic_streambuf_wchar *this, int off)
1895 {
1896     TRACE("(%p %d)\n", this, off);
1897     *this->prpos += off;
1898     *this->prsize -= off;
1899 }
1900
1901 /* ?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEXABVlocale@2@@Z */
1902 /* ?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAXAEBVlocale@2@@Z */
1903 /* ?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEXABVlocale@2@@Z */
1904 /* ?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAXAEBVlocale@2@@Z */
1905 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_imbue, 8)
1906 #define call_basic_streambuf_wchar_imbue(this, loc) CALL_VTBL_FUNC(this, 48, \
1907         void, (basic_streambuf_wchar*, const locale*), (this, loc))
1908 void __thiscall basic_streambuf_wchar_imbue(basic_streambuf_wchar *this, const locale *loc)
1909 {
1910     TRACE("(%p %p)\n", this, loc);
1911 }
1912
1913 /* ?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z */
1914 /* ?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z */
1915 /* ?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGG@Z */
1916 /* ?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z */
1917 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_overflow, 8)
1918 #define call_basic_streambuf_wchar_overflow(this, ch) CALL_VTBL_FUNC(this, 4, \
1919         unsigned short, (basic_streambuf_wchar*, unsigned short), (this, ch))
1920 unsigned short __thiscall basic_streambuf_wchar_overflow(basic_streambuf_wchar *this, unsigned short ch)
1921 {
1922     TRACE("(%p %d)\n", this, ch);
1923     return WEOF;
1924 }
1925
1926 /* ?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z */
1927 /* ?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z */
1928 /* ?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGG@Z */
1929 /* ?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z */
1930 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pbackfail, 8)
1931 #define call_basic_streambuf_wchar_pbackfail(this, ch) CALL_VTBL_FUNC(this, 8, \
1932         unsigned short, (basic_streambuf_wchar*, unsigned short), (this, ch))
1933 unsigned short __thiscall basic_streambuf_wchar_pbackfail(basic_streambuf_wchar *this, unsigned short ch)
1934 {
1935     TRACE("(%p %d)\n", this, ch);
1936     return WEOF;
1937 }
1938
1939 /* ?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ */
1940 /* ?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ */
1941 /* ?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ */
1942 /* ?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ */
1943 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pbase, 4)
1944 wchar_t* __thiscall basic_streambuf_wchar_pbase(const basic_streambuf_wchar *this)
1945 {
1946     TRACE("(%p)\n", this);
1947     return *this->pwbuf;
1948 }
1949
1950 /* ?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z */
1951 /* ?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z */
1952 /* ?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXH@Z */
1953 /* ?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z */
1954 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pbump, 8)
1955 void __thiscall basic_streambuf_wchar_pbump(basic_streambuf_wchar *this, int off)
1956 {
1957     TRACE("(%p %d)\n", this, off);
1958     *this->pwpos += off;
1959     *this->pwsize -= off;
1960 }
1961
1962 /* ?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ */
1963 /* ?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ */
1964 /* ?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ */
1965 /* ?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ */
1966 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pptr, 4)
1967 wchar_t* __thiscall basic_streambuf_wchar_pptr(const basic_streambuf_wchar *this)
1968 {
1969     TRACE("(%p)\n", this);
1970     return *this->pwpos;
1971 }
1972
1973 /* ?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
1974 /* ?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
1975 /* ?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
1976 /* ?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
1977 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pubimbue, 12)
1978 locale* __thiscall basic_streambuf_wchar_pubimbue(basic_streambuf_wchar *this, locale *ret, const locale *loc)
1979 {
1980     TRACE("(%p %p)\n", this, loc);
1981     memcpy(ret, this->loc, sizeof(locale));
1982     call_basic_streambuf_wchar_imbue(this, loc);
1983     locale_copy_ctor(this->loc, loc);
1984     return ret;
1985 }
1986
1987 /* ?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@JHH@Z */
1988 /* ?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
1989 /* ?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@JHH@Z */
1990 /* ?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
1991 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_seekoff, 20)
1992 #define call_basic_streambuf_wchar_seekoff(this, ret, off, way, mode) CALL_VTBL_FUNC(this, 32, \
1993         fpos_int*, (basic_streambuf_wchar*, fpos_int*, streamoff, int, int), (this, ret, off, way, mode))
1994 fpos_int* __thiscall basic_streambuf_wchar_seekoff(basic_streambuf_wchar *this,
1995         fpos_int *ret, streamoff off, int way, int mode)
1996 {
1997     TRACE("(%p %ld %d %d)\n", this, off, way, mode);
1998     ret->off = 0;
1999     ret->pos = -1;
2000     ret->state = 0;
2001     return ret;
2002 }
2003
2004 /* ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@JHH@Z */
2005 /* ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z */
2006 /* ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@JHH@Z */
2007 /* ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z */
2008 static fpos_int* basic_streambuf_wchar_pubseekoff(basic_streambuf_wchar *this,
2009         fpos_int *ret, streamoff off, int way, int mode)
2010 {
2011     TRACE("(%p %ld %d %d)\n", this, off, way, mode);
2012     return call_basic_streambuf_wchar_seekoff(this, ret, off, way, mode);
2013 }
2014
2015 /* ?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
2016 /* ?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
2017 /* ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
2018 /* ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
2019 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_seekpos, 36)
2020 #define call_basic_streambuf_wchar_seekpos(this, ret, pos, mode) CALL_VTBL_FUNC(this, 36, \
2021         fpos_int*, (basic_streambuf_wchar*, fpos_int*, fpos_int, int), (this, ret, pos, mode))
2022 fpos_int* __thiscall basic_streambuf_wchar_seekpos(basic_streambuf_wchar *this,
2023         fpos_int *ret, fpos_int pos, int mode)
2024 {
2025     TRACE("(%p %s %d)\n", this, debugstr_fpos_int(&pos), mode);
2026     ret->off = 0;
2027     ret->pos = -1;
2028     ret->state = 0;
2029     return ret;
2030 }
2031
2032 /* ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z */
2033 /* ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z */
2034 /* ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z */
2035 /* ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z */
2036 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pubseekpos, 36)
2037 fpos_int* __thiscall basic_streambuf_wchar_pubseekpos(basic_streambuf_wchar *this,
2038         fpos_int *ret, fpos_int pos, int mode)
2039 {
2040     TRACE("(%p %s %d)\n", this, debugstr_fpos_int(&pos), mode);
2041     return call_basic_streambuf_wchar_seekpos(this, ret, pos, mode);
2042 }
2043
2044 /* ?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEPAV12@PA_WH@Z */
2045 /* ?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAPEAV12@PEA_W_J@Z */
2046 /* ?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEPAV12@PAGH@Z */
2047 /* ?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAPEAV12@PEAG_J@Z */
2048 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_setbuf, 12)
2049 #define call_basic_streambuf_wchar_setbuf(this, buf, count) CALL_VTBL_FUNC(this, 40, \
2050         basic_streambuf_wchar*, (basic_streambuf_wchar*, wchar_t*, streamsize), (this, buf, count))
2051 basic_streambuf_wchar* __thiscall basic_streambuf_wchar_setbuf(basic_streambuf_wchar *this, wchar_t *buf, streamsize count)
2052 {
2053     TRACE("(%p %p %ld)\n", this, buf, count);
2054     return this;
2055 }
2056
2057 /* ?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PA_WH@Z */
2058 /* ?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEA_W_J@Z */
2059 /* ?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PAGH@Z */
2060 /* ?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEAG_J@Z */
2061 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pubsetbuf, 12)
2062 basic_streambuf_wchar* __thiscall basic_streambuf_wchar_pubsetbuf(basic_streambuf_wchar *this, wchar_t *buf, streamsize count)
2063 {
2064     TRACE("(%p %p %ld)\n", this, buf, count);
2065     return call_basic_streambuf_wchar_setbuf(this, buf, count);
2066 }
2067
2068 /* ?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHXZ */
2069 /* ?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAHXZ */
2070 /* ?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHXZ */
2071 /* ?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAHXZ */
2072 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sync, 4)
2073 #define call_basic_streambuf_wchar_sync(this) CALL_VTBL_FUNC(this, 44, \
2074         int, (basic_streambuf_wchar*), (this))
2075 int __thiscall basic_streambuf_wchar_sync(basic_streambuf_wchar *this)
2076 {
2077     TRACE("(%p)\n", this);
2078     return 0;
2079 }
2080
2081 /* ?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHXZ */
2082 /* ?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAHXZ */
2083 /* ?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHXZ */
2084 /* ?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAHXZ */
2085 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_pubsync, 4)
2086 int __thiscall basic_streambuf_wchar_pubsync(basic_streambuf_wchar *this)
2087 {
2088     TRACE("(%p)\n", this);
2089     return call_basic_streambuf_wchar_sync(this);
2090 }
2091
2092 /* ?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHPA_WH@Z */
2093 /* ?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z */
2094 /* ?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHPAGH@Z */
2095 /* ?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z */
2096 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sgetn, 12)
2097 streamsize __thiscall basic_streambuf_wchar_sgetn(basic_streambuf_wchar *this, wchar_t *ptr, streamsize count)
2098 {
2099     TRACE("(%p %p %ld)\n", this, ptr, count);
2100     return basic_streambuf_wchar__Xsgetn_s(this, ptr, -1, count);
2101 }
2102
2103 /* ?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHXZ */
2104 /* ?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JXZ */
2105 /* ?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHXZ */
2106 /* ?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JXZ */
2107 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_showmanyc, 4)
2108 #define call_basic_streambuf_wchar_showmanyc(this) CALL_VTBL_FUNC(this, 12, \
2109         streamsize, (basic_streambuf_wchar*), (this))
2110 streamsize __thiscall basic_streambuf_wchar_showmanyc(basic_streambuf_wchar *this)
2111 {
2112     TRACE("(%p)\n", this);
2113     return 0;
2114 }
2115
2116 /* ?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHXZ */
2117 /* ?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JXZ */
2118 /* ?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHXZ */
2119 /* ?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JXZ */
2120 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_in_avail, 4)
2121 streamsize __thiscall basic_streambuf_wchar_in_avail(basic_streambuf_wchar *this)
2122 {
2123     streamsize ret;
2124
2125     TRACE("(%p)\n", this);
2126
2127     ret = basic_streambuf_wchar__Gnavail(this);
2128     return ret ? ret : call_basic_streambuf_wchar_showmanyc(this);
2129 }
2130
2131 /* ?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z */
2132 /* ?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z */
2133 /* ?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGG@Z */
2134 /* ?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGG@Z */
2135 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sputbackc, 8)
2136 unsigned short __thiscall basic_streambuf_wchar_sputbackc(basic_streambuf_wchar *this, wchar_t ch)
2137 {
2138     TRACE("(%p %d)\n", this, ch);
2139     if(*this->prpos && *this->prpos>*this->prbuf && (*this->prpos)[-1]==ch) {
2140         (*this->prsize)++;
2141         (*this->prpos)--;
2142         return ch;
2143     }
2144
2145     return call_basic_streambuf_wchar_pbackfail(this, ch);
2146 }
2147
2148 /* ?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z */
2149 /* ?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z */
2150 /* ?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGG@Z */
2151 /* ?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAHG@Z */
2152 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sputc, 8)
2153 unsigned short __thiscall basic_streambuf_wchar_sputc(basic_streambuf_wchar *this, wchar_t ch)
2154 {
2155     TRACE("(%p %d)\n", this, ch);
2156     return basic_streambuf_wchar__Pnavail(this) ?
2157         (*basic_streambuf_wchar__Pninc(this) = ch) :
2158         call_basic_streambuf_wchar_overflow(this, ch);
2159 }
2160
2161 /* ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
2162 /* ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
2163 /* ?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ */
2164 /* ?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ */
2165 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sungetc, 4)
2166 unsigned short __thiscall basic_streambuf_wchar_sungetc(basic_streambuf_wchar *this)
2167 {
2168     TRACE("(%p)\n", this);
2169     if(*this->prpos && *this->prpos>*this->prbuf) {
2170         (*this->prsize)++;
2171         (*this->prpos)--;
2172         return **this->prpos;
2173     }
2174
2175     return call_basic_streambuf_wchar_pbackfail(this, WEOF);
2176 }
2177
2178 /* ?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
2179 /* ?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
2180 /* ?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEXXZ */
2181 /* ?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAXXZ */
2182 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_stossc, 4)
2183 void __thiscall basic_streambuf_wchar_stossc(basic_streambuf_wchar *this)
2184 {
2185     TRACE("(%p)\n", this);
2186     if(basic_streambuf_wchar__Gnavail(this))
2187         basic_streambuf_wchar__Gninc(this);
2188     else
2189         call_basic_streambuf_wchar_uflow(this);
2190 }
2191
2192 /* ?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
2193 /* ?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
2194 /* ?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ */
2195 /* ?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ */
2196 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sbumpc, 4)
2197 unsigned short __thiscall basic_streambuf_wchar_sbumpc(basic_streambuf_wchar *this)
2198 {
2199     TRACE("(%p)\n", this);
2200     return basic_streambuf_wchar__Gnavail(this) ?
2201         *basic_streambuf_wchar__Gninc(this) : call_basic_streambuf_wchar_uflow(this);
2202 }
2203
2204 /* ?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
2205 /* ?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
2206 /* ?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ */
2207 /* ?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ */
2208 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sgetc, 4)
2209 unsigned short __thiscall basic_streambuf_wchar_sgetc(basic_streambuf_wchar *this)
2210 {
2211     TRACE("(%p)\n", this);
2212     return basic_streambuf_wchar__Gnavail(this) ?
2213         *basic_streambuf_wchar_gptr(this) : call_basic_streambuf_wchar_underflow(this);
2214 }
2215
2216 /* ?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
2217 /* ?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
2218 /* ?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ */
2219 /* ?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ */
2220 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_snextc, 4)
2221 unsigned short __thiscall basic_streambuf_wchar_snextc(basic_streambuf_wchar *this)
2222 {
2223     TRACE("(%p)\n", this);
2224
2225     if(basic_streambuf_wchar__Gnavail(this) > 1)
2226         return *basic_streambuf_wchar__Gnpreinc(this);
2227     return basic_streambuf_wchar_sbumpc(this)==WEOF ?
2228         WEOF : basic_streambuf_wchar_sgetc(this);
2229 }
2230
2231 /* ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHPA_WH@Z */
2232 /* ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_J@Z */
2233 /* ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPAGH@Z */
2234 /* ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_J@Z */
2235 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_xsgetn, 12)
2236 #define call_basic_streambuf_wchar_xsgetn(this, ptr, count) CALL_VTBL_FUNC(this, 24, \
2237         streamsize, (basic_streambuf_wchar*, wchar_t*, streamsize), (this, ptr, count))
2238 streamsize __thiscall basic_streambuf_wchar_xsgetn(basic_streambuf_wchar *this, wchar_t *ptr, streamsize count)
2239 {
2240     TRACE("(%p %p %ld)\n", this, ptr, count);
2241     return basic_streambuf_wchar__Xsgetn_s(this, ptr, -1, count);
2242 }
2243
2244 /* ?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHPB_WH@Z */
2245 /* ?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEB_W_J@Z */
2246 /* ?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPBGH@Z */
2247 /* ?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEBG_J@Z */
2248 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_xsputn, 12)
2249 #define call_basic_streambuf_wchar_xsputn(this, ptr, count) CALL_VTBL_FUNC(this, 28, \
2250         streamsize, (basic_streambuf_wchar*, const wchar_t*, streamsize), (this, ptr, count))
2251 streamsize __thiscall basic_streambuf_wchar_xsputn(basic_streambuf_wchar *this, const wchar_t *ptr, streamsize count)
2252 {
2253     streamsize copied, chunk;
2254
2255     TRACE("(%p %p %ld)\n", this, ptr, count);
2256
2257     for(copied=0; copied<count;) {
2258         chunk = basic_streambuf_wchar__Pnavail(this);
2259         if(chunk > count-copied)
2260             chunk = count-copied;
2261
2262         if(chunk > 0) {
2263             memcpy(*this->pwpos, ptr+copied, chunk*sizeof(wchar_t));
2264             *this->pwpos += chunk;
2265             *this->pwsize -= chunk;
2266             copied += chunk;
2267         }else if(call_basic_streambuf_wchar_overflow(this, ptr[copied]) != WEOF) {
2268             copied++;
2269         }else {
2270             break;
2271         }
2272     }
2273
2274     return copied;
2275 }
2276
2277 /* ?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHPB_WH@Z */
2278 /* ?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEB_W_J@Z */
2279 /* ?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHPBGH@Z */
2280 /* ?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEBG_J@Z */
2281 DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sputn, 12)
2282 streamsize __thiscall basic_streambuf_wchar_sputn(basic_streambuf_wchar *this, const wchar_t *ptr, streamsize count)
2283 {
2284     TRACE("(%p %p %ld)\n", this, ptr, count);
2285     return call_basic_streambuf_wchar_xsputn(this, ptr, count);
2286 }
2287
2288 /* ?_Stinit@?1??_Init@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@23@@Z@4HA */
2289 /* ?_Stinit@?1??_Init@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@23@@Z@4HA */
2290 int basic_filebuf_char__Init__Stinit = 0;
2291
2292 /* ?_Init@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@12@@Z */
2293 /* ?_Init@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@12@@Z */
2294 DEFINE_THISCALL_WRAPPER(basic_filebuf_char__Init, 12)
2295 void __thiscall basic_filebuf_char__Init(basic_filebuf_char *this, FILE *file, basic_filebuf__Initfl which)
2296 {
2297     TRACE("(%p %p %d)\n", this, file, which);
2298
2299     this->cvt = NULL;
2300     this->wrotesome = FALSE;
2301     this->state = basic_filebuf_char__Init__Stinit;
2302     this->close = (which == INITFL_open);
2303     this->file = file;
2304
2305     basic_streambuf_char__Init_empty(&this->base);
2306     if(file)
2307         basic_streambuf_char__Init(&this->base, &file->_base, &file->_ptr,
2308                 &file->_cnt, &file->_base, &file->_ptr, &file->_cnt);
2309 }
2310
2311 /* ?_Initcvt@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IAEXPAV?$codecvt@DDH@2@@Z */
2312 /* ?_Initcvt@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$codecvt@DDH@2@@Z */
2313 static void basic_filebuf_char__Initcvt(basic_filebuf_char *this, codecvt_char *cvt)
2314 {
2315     TRACE("(%p %p)\n", this, cvt);
2316
2317     if(codecvt_base_always_noconv(&cvt->base)) {
2318         this->cvt = NULL;
2319     }else {
2320         basic_streambuf_char__Init_empty(&this->base);
2321         this->cvt = cvt;
2322     }
2323 }
2324
2325 /* ?_Endwrite@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IAE_NXZ */
2326 /* ?_Endwrite@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IEAA_NXZ */
2327 static MSVCP_bool basic_filebuf_char__Endwrite(basic_filebuf_char *this)
2328 {
2329     TRACE("(%p)\n", this);
2330
2331     if(!this->wrotesome || !this->cvt)
2332         return TRUE;
2333
2334
2335     if(call_basic_streambuf_char_overflow(&this->base, EOF) == EOF)
2336         return FALSE;
2337
2338     while(1) {
2339         /* TODO: check if we need a dynamic buffer here */
2340         char buf[128];
2341         char *next;
2342         int ret;
2343
2344         ret = codecvt_char_unshift(this->cvt, &this->state, buf, buf+sizeof(buf), &next);
2345         switch(ret) {
2346         case CODECVT_ok:
2347             this->wrotesome = FALSE;
2348             /* fall through */
2349         case CODECVT_partial:
2350             if(!fwrite(buf, next-buf, 1, this->file))
2351                 return FALSE;
2352             if(this->wrotesome)
2353                 break;
2354             /* fall through */
2355         case CODECVT_noconv:
2356             if(call_basic_streambuf_char_overflow(&this->base, EOF) == EOF)
2357                 return FALSE;
2358             return TRUE;
2359         default:
2360             return FALSE;
2361         }
2362     }
2363 }
2364
2365 /* ?close@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@XZ */
2366 /* ?close@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@XZ */
2367 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_close, 4)
2368 basic_filebuf_char* __thiscall basic_filebuf_char_close(basic_filebuf_char *this)
2369 {
2370     basic_filebuf_char *ret = this;
2371
2372     TRACE("(%p)\n", this);
2373
2374     if(!this->file)
2375         return NULL;
2376
2377     /* TODO: handle exceptions */
2378     if(!basic_filebuf_char__Endwrite(this))
2379         ret = NULL;
2380     if(fclose(this->file))
2381         ret  = NULL;
2382
2383     basic_filebuf_char__Init(this, NULL, INITFL_close);
2384     return ret;
2385 }
2386
2387 /* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
2388 /* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
2389 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_ctor_file, 8)
2390 basic_filebuf_char* __thiscall basic_filebuf_char_ctor_file(basic_filebuf_char *this, FILE *file)
2391 {
2392     TRACE("(%p %p)\n", this, file);
2393
2394     basic_streambuf_char_ctor(&this->base);
2395     this->base.vtable = &MSVCP_basic_filebuf_char_vtable;
2396
2397     basic_filebuf_char__Init(this, file, INITFL_new);
2398     return this;
2399 }
2400
2401 /* ??_F?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEXXZ */
2402 /* ??_F?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAXXZ */
2403 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_ctor, 4)
2404 basic_filebuf_char* __thiscall basic_filebuf_char_ctor(basic_filebuf_char *this)
2405 {
2406     return basic_filebuf_char_ctor_file(this, NULL);
2407 }
2408
2409 /* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z */
2410 /* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
2411 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_ctor_uninitialized, 8)
2412 basic_filebuf_char* __thiscall basic_filebuf_char_ctor_uninitialized(basic_filebuf_char *this, int uninitialized)
2413 {
2414     TRACE("(%p %d)\n", this, uninitialized);
2415
2416     basic_streambuf_char_ctor(&this->base);
2417     this->base.vtable = &MSVCP_basic_filebuf_char_vtable;
2418     return this;
2419 }
2420
2421 /* ??1?$basic_filebuf@DU?$char_traits@D@std@@@std@@UAE@XZ */
2422 /* ??1?$basic_filebuf@DU?$char_traits@D@std@@@std@@UEAA@XZ */
2423 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_dtor, 4)
2424 void __thiscall basic_filebuf_char_dtor(basic_filebuf_char *this)
2425 {
2426     TRACE("(%p)\n", this);
2427
2428     if(this->close)
2429         basic_filebuf_char_close(this);
2430     basic_streambuf_char_dtor(&this->base);
2431 }
2432
2433 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_vector_dtor, 8)
2434 basic_filebuf_char* __thiscall basic_filebuf_char_vector_dtor(basic_filebuf_char *this, unsigned int flags)
2435 {
2436     TRACE("(%p %x)\n", this, flags);
2437     if(flags & 2) {
2438         /* we have an array, with the number of elements stored before the first object */
2439         INT_PTR i, *ptr = (INT_PTR *)this-1;
2440
2441         for(i=*ptr-1; i>=0; i--)
2442             basic_filebuf_char_dtor(this+i);
2443         MSVCRT_operator_delete(ptr);
2444     } else {
2445         basic_filebuf_char_dtor(this);
2446         if(flags & 1)
2447             MSVCRT_operator_delete(this);
2448     }
2449
2450     return this;
2451 }
2452
2453 /* ?is_open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QBE_NXZ */
2454 /* ?is_open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
2455 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_is_open, 4)
2456 MSVCP_bool __thiscall basic_filebuf_char_is_open(const basic_filebuf_char *this)
2457 {
2458     TRACE("(%p)\n", this);
2459     return this->file != NULL;
2460 }
2461
2462 /* ?_Fiopen@std@@YAPAU_iobuf@@PB_WHH@Z */
2463 /* ?_Fiopen@std@@YAPEAU_iobuf@@PEB_WHH@Z */
2464 static FILE* _Fiopen_wchar(const wchar_t *name, int mode, int prot)
2465 {
2466     static const wchar_t rW[] = {'r',0};
2467     static const struct {
2468         int mode;
2469         const wchar_t str[4];
2470         const wchar_t str_bin[4];
2471     } str_mode[] = {
2472         {OPENMODE_out,                            {'w',0},     {'w','b',0}},
2473         {OPENMODE_out|OPENMODE_app,               {'a',0},     {'a','b',0}},
2474         {OPENMODE_app,                            {'a',0},     {'a','b',0}},
2475         {OPENMODE_out|OPENMODE_trunc,             {'w',0},     {'w','b',0}},
2476         {OPENMODE_in,                             {'r',0},     {'r','b',0}},
2477         {OPENMODE_in|OPENMODE_out,                {'r','+',0}, {'r','+','b',0}},
2478         {OPENMODE_in|OPENMODE_out|OPENMODE_trunc, {'w','+',0}, {'w','+','b',0}},
2479         {OPENMODE_in|OPENMODE_out|OPENMODE_app,   {'a','+',0}, {'a','+','b',0}},
2480         {OPENMODE_in|OPENMODE_app,                {'a','+',0}, {'a','+','b',0}}
2481     };
2482
2483     int real_mode = mode & ~(OPENMODE_ate|OPENMODE__Nocreate|OPENMODE__Noreplace|OPENMODE_binary);
2484     int mode_idx;
2485     FILE *f = NULL;
2486
2487     TRACE("(%s %d %d)\n", debugstr_w(name), mode, prot);
2488
2489     for(mode_idx=0; mode_idx<sizeof(str_mode)/sizeof(str_mode[0]); mode_idx++)
2490         if(str_mode[mode_idx].mode == real_mode)
2491             break;
2492     if(mode_idx == sizeof(str_mode)/sizeof(str_mode[0]))
2493         return NULL;
2494
2495     if((mode & OPENMODE__Nocreate) && !(f = _wfopen(name, rW)))
2496         return NULL;
2497     else if(f)
2498         fclose(f);
2499
2500     if((mode & OPENMODE__Noreplace) && (mode & (OPENMODE_out|OPENMODE_app))
2501             && (f = _wfopen(name, rW))) {
2502         fclose(f);
2503         return NULL;
2504     }
2505
2506     f = _wfsopen(name, (mode & OPENMODE_binary) ? str_mode[mode_idx].str_bin
2507             : str_mode[mode_idx].str, prot);
2508     if(!f)
2509         return NULL;
2510
2511     if((mode & OPENMODE_ate) && fseek(f, 0, SEEK_END)) {
2512         fclose(f);
2513         return NULL;
2514     }
2515
2516     return f;
2517 }
2518
2519 /* ?_Fiopen@std@@YAPAU_iobuf@@PBDHH@Z */
2520 /* ?_Fiopen@std@@YAPEAU_iobuf@@PEBDHH@Z */
2521 static FILE* _Fiopen(const char *name, int mode, int prot)
2522 {
2523     wchar_t nameW[FILENAME_MAX];
2524
2525     TRACE("(%s %d %d)\n", name, mode, prot);
2526
2527     if(mbstowcs_s(NULL, nameW, FILENAME_MAX, name, FILENAME_MAX-1) != 0)
2528         return NULL;
2529     return _Fiopen_wchar(nameW, mode, prot);
2530 }
2531
2532 /* ?__Fiopen@std@@YAPAU_iobuf@@PBDH@Z */
2533 /* ?__Fiopen@std@@YAPEAU_iobuf@@PEBDH@Z */
2534 FILE* __cdecl ___Fiopen(const char *name, int mode)
2535 {
2536     TRACE("(%p %d)\n", name, mode);
2537     return _Fiopen(name, mode, _SH_DENYNO);
2538 }
2539
2540 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PB_WHH@Z */
2541 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEB_WHH@Z */
2542 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBGHH@Z */
2543 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBGHH@Z */
2544 static basic_filebuf_char* basic_filebuf_char_open_wchar(basic_filebuf_char *this, const wchar_t *name, int mode, int prot)
2545 {
2546     FILE *f = NULL;
2547
2548     TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
2549
2550     if(basic_filebuf_char_is_open(this))
2551         return NULL;
2552
2553     if(!(f = _Fiopen_wchar(name, mode, prot)))
2554         return NULL;
2555
2556     basic_filebuf_char__Init(this, f, INITFL_open);
2557     basic_filebuf_char__Initcvt(this, codecvt_char_use_facet(this->base.loc));
2558     return this;
2559 }
2560
2561 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBDHH@Z */
2562 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBDHH@Z */
2563 static basic_filebuf_char* basic_filebuf_char_open(basic_filebuf_char *this, const char *name, int mode, int prot)
2564 {
2565     wchar_t nameW[FILENAME_MAX];
2566
2567     TRACE("(%p %s %d %d)\n", this, name, mode, prot);
2568
2569     if(mbstowcs_s(NULL, nameW, FILENAME_MAX, name, FILENAME_MAX-1) != 0)
2570         return NULL;
2571     return basic_filebuf_char_open_wchar(this, nameW, mode, prot);
2572 }
2573
2574 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBDF@Z */
2575 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBDF@Z */
2576 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_open_mode_old, 12)
2577 basic_filebuf_char* __thiscall basic_filebuf_char_open_mode_old(basic_filebuf_char *this, const char *name, short mode)
2578 {
2579     TRACE("(%p %p %d)\n", this, name, mode);
2580     return basic_filebuf_char_open(this, name, mode, _SH_DENYNO);
2581 }
2582
2583 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBDH@Z */
2584 /* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBDH@Z */
2585 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_open_mode, 12)
2586 basic_filebuf_char* __thiscall basic_filebuf_char_open_mode(basic_filebuf_char *this, const char *name, int mode)
2587 {
2588     TRACE("(%p %p %d)\n", this, name, mode);
2589     return basic_filebuf_char_open(this, name, mode, _SH_DENYNO);
2590 }
2591
2592 /* ?overflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEHH@Z */
2593 /* ?overflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z */
2594 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_overflow, 8)
2595 int __thiscall basic_filebuf_char_overflow(basic_filebuf_char *this, int c)
2596 {
2597     char buf[8], *dyn_buf;
2598     char ch = c, *to_next;
2599     const char *from_next;
2600     int ret, max_size;
2601
2602
2603     TRACE("(%p %d)\n", this, c);
2604
2605     if(!basic_filebuf_char_is_open(this))
2606         return EOF;
2607     if(c == EOF)
2608         return !c;
2609
2610     if(!this->cvt)
2611         return fwrite(&ch, sizeof(char), 1, this->file) ? c : EOF;
2612
2613     from_next = &ch;
2614     do {
2615         ret = codecvt_char_out(this->cvt, &this->state, from_next, &ch+1,
2616                 &from_next, buf, buf+sizeof(buf), &to_next);
2617
2618         switch(ret) {
2619         case CODECVT_partial:
2620             if(to_next == buf)
2621                 break;
2622             /* fall through */
2623         case CODECVT_ok:
2624             if(!fwrite(buf, to_next-buf, 1, this->file))
2625                 return EOF;
2626             if(ret == CODECVT_partial)
2627                 continue;
2628             return c;
2629         case CODECVT_noconv:
2630             return fwrite(&ch, sizeof(char), 1, this->file) ? c : EOF;
2631         default:
2632             return EOF;
2633         }
2634
2635         break;
2636     } while(1);
2637
2638     max_size = codecvt_base_max_length(&this->cvt->base);
2639     dyn_buf = malloc(max_size);
2640     if(!dyn_buf)
2641         return EOF;
2642
2643     ret = codecvt_char_out(this->cvt, &this->state, from_next, &ch+1,
2644             &from_next, dyn_buf, dyn_buf+max_size, &to_next);
2645
2646     switch(ret) {
2647     case CODECVT_ok:
2648         ret = fwrite(dyn_buf, to_next-dyn_buf, 1, this->file);
2649         free(dyn_buf);
2650         return ret ? c : EOF;
2651     case CODECVT_partial:
2652         ERR("buffer should be big enough to store all output\n");
2653         /* fall through */
2654     default:
2655         free(dyn_buf);
2656         return EOF;
2657     }
2658 }
2659
2660 /* ?pbackfail@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEHH@Z */
2661 /* ?pbackfail@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z */
2662 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_pbackfail, 8)
2663 int __thiscall basic_filebuf_char_pbackfail(basic_filebuf_char *this, int c)
2664 {
2665     TRACE("(%p %d)\n", this, c);
2666
2667     if(!basic_filebuf_char_is_open(this))
2668         return EOF;
2669
2670     if(basic_streambuf_char_gptr(&this->base)>basic_streambuf_char_eback(&this->base)
2671             && (c==EOF || (int)(unsigned char)basic_streambuf_char_gptr(&this->base)[-1]==c)) {
2672         basic_streambuf_char__Gndec(&this->base);
2673         return c==EOF ? !c : c;
2674     }else if(c!=EOF && !this->cvt) {
2675         return ungetc(c, this->file);
2676     }
2677
2678     return EOF;
2679 }
2680
2681 /* ?uflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEHXZ */
2682 /* ?uflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAHXZ */
2683 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_uflow, 4)
2684 int __thiscall basic_filebuf_char_uflow(basic_filebuf_char *this)
2685 {
2686     char ch, buf[128], *to_next;
2687     const char *buf_next;
2688     int c, i;
2689
2690     TRACE("(%p)\n", this);
2691
2692     if(!basic_filebuf_char_is_open(this))
2693         return EOF;
2694
2695     if(basic_streambuf_char_gptr(&this->base) < basic_streambuf_char_egptr(&this->base))
2696         return (unsigned char)*basic_streambuf_char__Gninc(&this->base);
2697
2698     c = fgetc(this->file);
2699     if(!this->cvt || c==EOF)
2700         return c;
2701
2702     buf_next = buf;
2703     for(i=0; i < sizeof(buf)/sizeof(buf[0]); i++) {
2704         buf[i] = c;
2705
2706         switch(codecvt_char_in(this->cvt, &this->state, buf_next,
2707                     buf+i+1, &buf_next, &ch, &ch+1, &to_next)) {
2708         case CODECVT_partial:
2709         case CODECVT_ok:
2710             if(to_next == &ch) {
2711                 c = fgetc(this->file);
2712                 if(c == EOF)
2713                     return EOF;
2714                 continue;
2715             }
2716
2717             for(i--; i>=buf_next-buf; i--)
2718                 ungetc(buf[i], this->file);
2719             return ch;
2720         case CODECVT_noconv:
2721             return (unsigned char)buf[0];
2722         default:
2723             return EOF;
2724         }
2725     }
2726
2727     FIXME("buffer is too small\n");
2728     return EOF;
2729 }
2730
2731 /* ?underflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEHXZ */
2732 /* ?underflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAHXZ */
2733 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_underflow, 4)
2734 int __thiscall basic_filebuf_char_underflow(basic_filebuf_char *this)
2735 {
2736     int ret;
2737
2738     TRACE("(%p)\n", this);
2739
2740     if(basic_streambuf_char_gptr(&this->base) < basic_streambuf_char_egptr(&this->base))
2741         return (unsigned char)*basic_streambuf_char_gptr(&this->base);
2742
2743     ret = call_basic_streambuf_char_uflow(&this->base);
2744     if(ret != EOF)
2745         ret = call_basic_streambuf_char_pbackfail(&this->base, ret);
2746     return ret;
2747 }
2748
2749 /* ?seekoff@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@JHH@Z */
2750 /* ?seekoff@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
2751 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_seekoff, 20)
2752 fpos_int* __thiscall basic_filebuf_char_seekoff(basic_filebuf_char *this,
2753         fpos_int *ret, streamoff off, int way, int mode)
2754 {
2755     fpos_t pos;
2756
2757     TRACE("(%p %p %ld %d %d)\n", this, ret, off, way, mode);
2758
2759     if(!basic_filebuf_char_is_open(this) || !basic_filebuf_char__Endwrite(this)
2760             || fseek(this->file, off, way)) {
2761         ret->off = 0;
2762         ret->pos = -1;
2763         ret->state = 0;
2764         return ret;
2765     }
2766
2767     fgetpos(this->file, &pos);
2768     ret->off = 0;
2769     ret->pos = pos;
2770     ret->state = this->state;
2771     return ret;
2772 }
2773
2774 /* ?seekpos@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
2775 /* ?seekpos@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
2776 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_seekpos, 36)
2777 fpos_int* __thiscall basic_filebuf_char_seekpos(basic_filebuf_char *this,
2778         fpos_int *ret, fpos_int pos, int mode)
2779 {
2780     fpos_t fpos;
2781
2782     TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
2783
2784     if(!basic_filebuf_char_is_open(this) || !basic_filebuf_char__Endwrite(this)
2785             || fseek(this->file, (LONG)pos.pos, SEEK_SET)
2786             || (pos.off && fseek(this->file, pos.off, SEEK_CUR))) {
2787         ret->off = 0;
2788         ret->pos = -1;
2789         ret->state = 0;
2790         return ret;
2791     }
2792
2793     fgetpos(this->file, &fpos);
2794     ret->off = 0;
2795     ret->pos = fpos;
2796     ret->state = this->state;
2797     return ret;
2798 }
2799
2800 /* ?setbuf@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PADH@Z */
2801 /* ?setbuf@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PEAD_J@Z */
2802 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_setbuf, 12)
2803 basic_streambuf_char* __thiscall basic_filebuf_char_setbuf(basic_filebuf_char *this, char *buf, streamsize count)
2804 {
2805     TRACE("(%p %p %ld)\n", this, buf, count);
2806
2807     if(!basic_filebuf_char_is_open(this))
2808         return NULL;
2809
2810     if(setvbuf(this->file, buf, (buf==NULL && count==0) ? _IONBF : _IOFBF, count))
2811         return NULL;
2812
2813     basic_filebuf_char__Init(this, this->file, INITFL_open);
2814     return &this->base;
2815 }
2816
2817 /* ?sync@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEHXZ */
2818 /* ?sync@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAHXZ */
2819 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_sync, 4)
2820 int __thiscall basic_filebuf_char_sync(basic_filebuf_char *this)
2821 {
2822     TRACE("(%p)\n", this);
2823
2824     if(!basic_filebuf_char_is_open(this))
2825         return 0;
2826
2827     if(call_basic_streambuf_char_overflow(&this->base, EOF) == EOF)
2828         return 0;
2829     return fflush(this->file);
2830 }
2831
2832 /* ?imbue@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEXABVlocale@2@@Z */
2833 /* ?imbue@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAXAEBVlocale@2@@Z */
2834 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_imbue, 8)
2835 void __thiscall basic_filebuf_char_imbue(basic_filebuf_char *this, const locale *loc)
2836 {
2837     TRACE("(%p %p)\n", this, loc);
2838     basic_filebuf_char__Initcvt(this, codecvt_char_use_facet(loc));
2839 }
2840
2841 /* ?_Stinit@?1??_Init@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@23@@Z@4HA */
2842 /* ?_Stinit@?1??_Init@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@23@@Z@4HA */
2843 int basic_filebuf_short__Init__Stinit = 0;
2844
2845 /* ?_Init@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@12@@Z */
2846 /* ?_Init@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@12@@Z */
2847 static void basic_filebuf_wchar__Init(basic_filebuf_wchar *this, FILE *file, basic_filebuf__Initfl which)
2848 {
2849     TRACE("(%p %p %d)\n", this, file, which);
2850
2851     this->cvt = NULL;
2852     this->wrotesome = FALSE;
2853     this->state = 0;
2854     this->close = (which == INITFL_open);
2855     this->file = file;
2856
2857     basic_streambuf_wchar__Init_empty(&this->base);
2858 }
2859
2860 /* ?_Init@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@12@@Z */
2861 /* ?_Init@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@12@@Z */
2862 DEFINE_THISCALL_WRAPPER(basic_filebuf_short__Init, 12)
2863 void __thiscall basic_filebuf_short__Init(basic_filebuf_wchar *this, FILE *file, basic_filebuf__Initfl which)
2864 {
2865     TRACE("(%p %p %d)\n", this, file, which);
2866
2867     this->cvt = NULL;
2868     this->wrotesome = FALSE;
2869     this->state = basic_filebuf_short__Init__Stinit;
2870     this->close = (which == INITFL_open);
2871     this->file = file;
2872
2873     basic_streambuf_wchar__Init_empty(&this->base);
2874 }
2875
2876 /* ?_Initcvt@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IAEXPAV?$codecvt@_WDH@2@@Z */
2877 /* ?_Initcvt@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$codecvt@_WDH@2@@Z */
2878 /* ?_Initcvt@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IAEXPAV?$codecvt@GDH@2@@Z */
2879 /* ?_Initcvt@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$codecvt@GDH@2@@Z */
2880 static void basic_filebuf_wchar__Initcvt(basic_filebuf_wchar *this, codecvt_wchar *cvt)
2881 {
2882     TRACE("(%p %p)\n", this, cvt);
2883
2884     if(codecvt_base_always_noconv(&cvt->base)) {
2885         this->cvt = NULL;
2886     }else {
2887         basic_streambuf_wchar__Init_empty(&this->base);
2888         this->cvt = cvt;
2889     }
2890 }
2891
2892 /* ?_Endwrite@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IAE_NXZ */
2893 /* ?_Endwrite@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IEAA_NXZ */
2894 /* ?_Endwrite@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IAE_NXZ */
2895 /* ?_Endwrite@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IEAA_NXZ */
2896 static MSVCP_bool basic_filebuf_wchar__Endwrite(basic_filebuf_wchar *this)
2897 {
2898     TRACE("(%p)\n", this);
2899
2900     if(!this->wrotesome || !this->cvt)
2901         return TRUE;
2902
2903     if(call_basic_streambuf_wchar_overflow(&this->base, WEOF) == WEOF)
2904         return FALSE;
2905
2906     while(1) {
2907         /* TODO: check if we need a dynamic buffer here */
2908         char buf[128];
2909         char *next;
2910         int ret;
2911
2912         ret = codecvt_wchar_unshift(this->cvt, &this->state, buf, buf+sizeof(buf), &next);
2913         switch(ret) {
2914         case CODECVT_ok:
2915             this->wrotesome = FALSE;
2916             /* fall through */
2917         case CODECVT_partial:
2918             if(!fwrite(buf, next-buf, 1, this->file))
2919                 return FALSE;
2920             if(this->wrotesome)
2921                 break;
2922             /* fall through */
2923         case CODECVT_noconv:
2924             if(call_basic_streambuf_wchar_overflow(&this->base, WEOF) == WEOF)
2925                 return FALSE;
2926             return TRUE;
2927         default:
2928             return FALSE;
2929         }
2930     }
2931 }
2932
2933 /* ?close@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@XZ */
2934 /* ?close@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@XZ */
2935 /* ?close@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@XZ */
2936 /* ?close@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@XZ */
2937 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_close, 4)
2938 basic_filebuf_wchar* __thiscall basic_filebuf_wchar_close(basic_filebuf_wchar *this)
2939 {
2940     basic_filebuf_wchar *ret = this;
2941
2942     TRACE("(%p)\n", this);
2943
2944     if(!this->file)
2945         return NULL;
2946
2947     /* TODO: handle exceptions */
2948     if(!basic_filebuf_wchar__Endwrite(this))
2949         ret = NULL;
2950     if(fclose(this->file))
2951         ret  = NULL;
2952
2953     basic_filebuf_wchar__Init(this, NULL, INITFL_close);
2954     return ret;
2955 }
2956
2957 /* ??0?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
2958 /* ??0?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
2959 static basic_filebuf_wchar* basic_filebuf_wchar_ctor_file(basic_filebuf_wchar *this, FILE *file)
2960 {
2961     TRACE("(%p %p)\n", this, file);
2962
2963     basic_streambuf_wchar_ctor(&this->base);
2964     this->base.vtable = &MSVCP_basic_filebuf_wchar_vtable;
2965
2966     basic_filebuf_wchar__Init(this, file, INITFL_new);
2967     return this;
2968 }
2969
2970 /* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
2971 /* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
2972 DEFINE_THISCALL_WRAPPER(basic_filebuf_short_ctor_file, 8)
2973 basic_filebuf_wchar* __thiscall basic_filebuf_short_ctor_file(basic_filebuf_wchar *this, FILE *file)
2974 {
2975     TRACE("(%p %p)\n", this, file);
2976
2977     basic_streambuf_short_ctor(&this->base);
2978     this->base.vtable = &MSVCP_basic_filebuf_short_vtable;
2979
2980     basic_filebuf_short__Init(this, file, INITFL_new);
2981     return this;
2982 }
2983
2984 /* ??_F?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
2985 /* ??_F?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
2986 static basic_filebuf_wchar* basic_filebuf_wchar_ctor(basic_filebuf_wchar *this)
2987 {
2988     return basic_filebuf_wchar_ctor_file(this, NULL);
2989 }
2990
2991 /* ??_F?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEXXZ */
2992 /* ??_F?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAXXZ */
2993 DEFINE_THISCALL_WRAPPER(basic_filebuf_short_ctor, 4)
2994 basic_filebuf_wchar* __thiscall basic_filebuf_short_ctor(basic_filebuf_wchar *this)
2995 {
2996     return basic_filebuf_short_ctor_file(this, NULL);
2997 }
2998
2999 /* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z */
3000 /* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
3001 DEFINE_THISCALL_WRAPPER(basic_filebuf_short_ctor_uninitialized, 8)
3002 basic_filebuf_wchar* __thiscall basic_filebuf_short_ctor_uninitialized(basic_filebuf_wchar *this, int uninitialized)
3003 {
3004     TRACE("(%p %d)\n", this, uninitialized);
3005
3006     basic_streambuf_short_ctor(&this->base);
3007     this->base.vtable = &MSVCP_basic_filebuf_short_vtable;
3008     return this;
3009 }
3010
3011 /* ??1?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
3012 /* ??1?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
3013 /* ??1?$basic_filebuf@GU?$char_traits@G@std@@@std@@UAE@XZ */
3014 /* ??1?$basic_filebuf@GU?$char_traits@G@std@@@std@@UEAA@XZ */
3015 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_dtor, 4)
3016 void __thiscall basic_filebuf_wchar_dtor(basic_filebuf_wchar *this)
3017 {
3018     TRACE("(%p)\n", this);
3019
3020     if(this->close)
3021         basic_filebuf_wchar_close(this);
3022     basic_streambuf_wchar_dtor(&this->base);
3023 }
3024
3025 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_vector_dtor, 8)
3026 basic_filebuf_wchar* __thiscall basic_filebuf_wchar_vector_dtor(basic_filebuf_wchar *this, unsigned int flags)
3027 {
3028     TRACE("(%p %x)\n", this, flags);
3029     if(flags & 2) {
3030         /* we have an array, with the number of elements stored before the first object */
3031         INT_PTR i, *ptr = (INT_PTR *)this-1;
3032
3033         for(i=*ptr-1; i>=0; i--)
3034             basic_filebuf_wchar_dtor(this+i);
3035         MSVCRT_operator_delete(ptr);
3036     } else {
3037         basic_filebuf_wchar_dtor(this);
3038         if(flags & 1)
3039             MSVCRT_operator_delete(this);
3040     }
3041
3042     return this;
3043 }
3044
3045 /* ?is_open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QBE_NXZ */
3046 /* ?is_open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
3047 /* ?is_open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QBE_NXZ */
3048 /* ?is_open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
3049 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_is_open, 4)
3050 MSVCP_bool __thiscall basic_filebuf_wchar_is_open(const basic_filebuf_wchar *this)
3051 {
3052     TRACE("(%p)\n", this);
3053     return this->file != NULL;
3054 }
3055
3056 /* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PB_WHH@Z */
3057 /* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEB_WHH@Z */
3058 /* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PBGHH@Z */
3059 /* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEBGHH@Z */
3060 static basic_filebuf_wchar* basic_filebuf_wchar_open_wchar(basic_filebuf_wchar *this, const wchar_t *name, int mode, int prot)
3061 {
3062     FILE *f = NULL;
3063
3064     TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
3065
3066     if(basic_filebuf_wchar_is_open(this))
3067         return NULL;
3068
3069     if(!(f = _Fiopen_wchar(name, mode, prot)))
3070         return NULL;
3071
3072     basic_filebuf_wchar__Init(this, f, INITFL_open);
3073     basic_filebuf_wchar__Initcvt(this, codecvt_wchar_use_facet(this->base.loc));
3074     return this;
3075 }
3076
3077 /* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PBDHH@Z */
3078 /* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEBDHH@Z */
3079 static basic_filebuf_wchar* basic_filebuf_wchar_open(basic_filebuf_wchar *this, const char *name, int mode, int prot)
3080 {
3081     wchar_t nameW[FILENAME_MAX];
3082
3083     TRACE("(%p %s %d %d)\n", this, name, mode, prot);
3084
3085     if(mbstowcs_s(NULL, nameW, FILENAME_MAX, name, FILENAME_MAX-1) != 0)
3086         return NULL;
3087     return basic_filebuf_wchar_open_wchar(this, nameW, mode, prot);
3088 }
3089
3090 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBDF@Z */
3091 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBDF@Z */
3092 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_open_mode_old, 12)
3093 basic_filebuf_wchar* __thiscall basic_filebuf_wchar_open_mode_old(basic_filebuf_wchar *this, const char *name, short mode)
3094 {
3095     TRACE("(%p %p %d)\n", this, name, mode);
3096     return basic_filebuf_wchar_open(this, name, mode, _SH_DENYNO);
3097 }
3098
3099 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBDH@Z */
3100 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBDH@Z */
3101 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_open_mode, 12)
3102 basic_filebuf_wchar* __thiscall basic_filebuf_wchar_open_mode(basic_filebuf_wchar *this, const char *name, int mode)
3103 {
3104     TRACE("(%p %p %d)\n", this, name, mode);
3105     return basic_filebuf_wchar_open(this, name, mode, _SH_DENYNO);
3106 }
3107
3108 /* ?overflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z */
3109 /* ?overflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z */
3110 /* ?overflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEGG@Z */
3111 /* ?overflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z */
3112 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_overflow, 8)
3113 unsigned short __thiscall basic_filebuf_wchar_overflow(basic_filebuf_wchar *this, unsigned short c)
3114 {
3115     char buf[8], *dyn_buf, *to_next;
3116     wchar_t ch = c;
3117     const wchar_t *from_next;
3118     int max_size;
3119     unsigned short ret;
3120
3121
3122     TRACE("(%p %d)\n", this, c);
3123
3124     if(!basic_filebuf_wchar_is_open(this))
3125         return WEOF;
3126     if(c == WEOF)
3127         return !c;
3128
3129     if(!this->cvt)
3130         return fwrite(&ch, sizeof(wchar_t), 1, this->file) ? c : WEOF;
3131
3132     from_next = &ch;
3133     do {
3134         ret = codecvt_wchar_out(this->cvt, &this->state, from_next, &ch+1,
3135                 &from_next, buf, buf+sizeof(buf), &to_next);
3136
3137         switch(ret) {
3138         case CODECVT_partial:
3139             if(to_next == buf)
3140                 break;
3141             /* fall through */
3142         case CODECVT_ok:
3143             if(!fwrite(buf, to_next-buf, 1, this->file))
3144                 return WEOF;
3145             if(ret == CODECVT_partial)
3146                 continue;
3147             return c;
3148         case CODECVT_noconv:
3149             return fwrite(&ch, sizeof(wchar_t), 1, this->file) ? c : WEOF;
3150         default:
3151             return WEOF;
3152         }
3153
3154         break;
3155     } while(1);
3156
3157     max_size = codecvt_base_max_length(&this->cvt->base);
3158     dyn_buf = malloc(max_size);
3159     if(!dyn_buf)
3160         return WEOF;
3161
3162     ret = codecvt_wchar_out(this->cvt, &this->state, from_next, &ch+1,
3163             &from_next, dyn_buf, dyn_buf+max_size, &to_next);
3164
3165     switch(ret) {
3166     case CODECVT_ok:
3167         ret = fwrite(dyn_buf, to_next-dyn_buf, 1, this->file);
3168         free(dyn_buf);
3169         return ret ? c : WEOF;
3170     case CODECVT_partial:
3171         ERR("buffer should be big enough to store all output\n");
3172         /* fall through */
3173     default:
3174         free(dyn_buf);
3175         return WEOF;
3176     }
3177 }
3178
3179 /* ?pbackfail@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z */
3180 /* ?pbackfail@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z */
3181 /* ?pbackfail@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEGG@Z */
3182 /* ?pbackfail@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z */
3183 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_pbackfail, 8)
3184 unsigned short __thiscall basic_filebuf_wchar_pbackfail(basic_filebuf_wchar *this, unsigned short c)
3185 {
3186     TRACE("(%p %d)\n", this, c);
3187
3188     if(!basic_filebuf_wchar_is_open(this))
3189         return WEOF;
3190
3191     if(basic_streambuf_wchar_gptr(&this->base)>basic_streambuf_wchar_eback(&this->base)
3192             && (c==WEOF || basic_streambuf_wchar_gptr(&this->base)[-1]==c)) {
3193         basic_streambuf_wchar__Gndec(&this->base);
3194         return c==WEOF ? !c : c;
3195     }else if(c!=WEOF && !this->cvt) {
3196         return ungetwc(c, this->file);
3197     }else if(c!=WEOF && basic_streambuf_wchar_gptr(&this->base)!=&this->putback) {
3198         this->putback = c;
3199         basic_streambuf_wchar_setg(&this->base, &this->putback, &this->putback, &this->putback+1);
3200         return c;
3201     }
3202
3203     return WEOF;
3204 }
3205
3206 /* ?uflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ */
3207 /* ?uflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ */
3208 /* ?uflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEGXZ */
3209 /* ?uflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAGXZ */
3210 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_uflow, 4)
3211 unsigned short __thiscall basic_filebuf_wchar_uflow(basic_filebuf_wchar *this)
3212 {
3213     wchar_t ch, *to_next;
3214     char buf[128];
3215     const char *buf_next;
3216     int c, i;
3217
3218     TRACE("(%p)\n", this);
3219
3220     if(!basic_filebuf_wchar_is_open(this))
3221         return WEOF;
3222
3223     if(basic_streambuf_wchar_gptr(&this->base) < basic_streambuf_wchar_egptr(&this->base))
3224         return *basic_streambuf_wchar__Gninc(&this->base);
3225
3226     if(!this->cvt)
3227         return fgetwc(this->file);
3228
3229     buf_next = buf;
3230     for(i=0; i < sizeof(buf)/sizeof(buf[0]); i++) {
3231         if((c = fgetc(this->file)) == EOF)
3232             return WEOF;
3233         buf[i] = c;
3234
3235         switch(codecvt_wchar_in(this->cvt, &this->state, buf_next,
3236                     buf+i+1, &buf_next, &ch, &ch+1, &to_next)) {
3237         case CODECVT_partial:
3238         case CODECVT_ok:
3239             if(to_next == &ch)
3240                 continue;
3241
3242             for(i--; i>=buf_next-buf; i--)
3243                 ungetc(buf[i], this->file);
3244             return ch;
3245         case CODECVT_noconv:
3246             if(i+1 < sizeof(wchar_t))
3247                 continue;
3248
3249             memcpy(&ch, buf, sizeof(wchar_t));
3250             return ch;
3251         default:
3252             return WEOF;
3253         }
3254     }
3255
3256     FIXME("buffer is too small\n");
3257     return WEOF;
3258 }
3259
3260 /* ?underflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ */
3261 /* ?underflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ */
3262 /* ?underflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEGXZ */
3263 /* ?underflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAGXZ */
3264 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_underflow, 4)
3265 unsigned short __thiscall basic_filebuf_wchar_underflow(basic_filebuf_wchar *this)
3266 {
3267     unsigned short ret;
3268
3269     TRACE("(%p)\n", this);
3270
3271     if(basic_streambuf_wchar_gptr(&this->base) < basic_streambuf_wchar_egptr(&this->base))
3272         return *basic_streambuf_wchar_gptr(&this->base);
3273
3274     ret = call_basic_streambuf_wchar_uflow(&this->base);
3275     if(ret != WEOF)
3276         ret = call_basic_streambuf_wchar_pbackfail(&this->base, ret);
3277     return ret;
3278 }
3279
3280 /* ?seekoff@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@JHH@Z */
3281 /* ?seekoff@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
3282 /* ?seekoff@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@JHH@Z */
3283 /* ?seekoff@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
3284 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_seekoff, 20)
3285 fpos_int* __thiscall basic_filebuf_wchar_seekoff(basic_filebuf_wchar *this,
3286         fpos_int *ret, streamoff off, int way, int mode)
3287 {
3288     fpos_t pos;
3289
3290     TRACE("(%p %p %ld %d %d)\n", this, ret, off, way, mode);
3291
3292     if(basic_streambuf_wchar_gptr(&this->base) == &this->putback) {
3293         if(way == SEEKDIR_cur)
3294             off -= sizeof(wchar_t);
3295
3296         basic_streambuf_wchar_setg(&this->base, &this->putback, &this->putback+1, &this->putback+1);
3297     }
3298
3299     if(!basic_filebuf_wchar_is_open(this) || !basic_filebuf_wchar__Endwrite(this)
3300             || fseek(this->file, off, way)) {
3301         ret->off = 0;
3302         ret->pos = -1;
3303         ret->state = 0;
3304         return ret;
3305     }
3306
3307     fgetpos(this->file, &pos);
3308     ret->off = 0;
3309     ret->pos = pos;
3310     ret->state = this->state;
3311     return ret;
3312 }
3313
3314 /* ?seekpos@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
3315 /* ?seekpos@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
3316 /* ?seekpos@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
3317 /* ?seekpos@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
3318 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_seekpos, 36)
3319 fpos_int* __thiscall basic_filebuf_wchar_seekpos(basic_filebuf_wchar *this,
3320         fpos_int *ret, fpos_int pos, int mode)
3321 {
3322     fpos_t fpos;
3323
3324     TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
3325
3326     if(!basic_filebuf_wchar_is_open(this) || !basic_filebuf_wchar__Endwrite(this)
3327             || fseek(this->file, (LONG)pos.pos, SEEK_SET)
3328             || (pos.off && fseek(this->file, pos.off, SEEK_CUR))) {
3329         ret->off = 0;
3330         ret->pos = -1;
3331         ret->state = 0;
3332         return ret;
3333     }
3334
3335     if(basic_streambuf_wchar_gptr(&this->base) == &this->putback)
3336         basic_streambuf_wchar_setg(&this->base, &this->putback, &this->putback+1, &this->putback+1);
3337
3338     fgetpos(this->file, &fpos);
3339     ret->off = 0;
3340     ret->pos = fpos;
3341     ret->state = this->state;
3342     return ret;
3343 }
3344
3345 /* ?setbuf@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PA_WH@Z */
3346 /* ?setbuf@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PEA_W_J@Z */
3347 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_setbuf, 12)
3348 basic_streambuf_wchar* __thiscall basic_filebuf_wchar_setbuf(basic_filebuf_wchar *this, wchar_t *buf, streamsize count)
3349 {
3350     TRACE("(%p %p %ld)\n", this, buf, count);
3351
3352     if(!basic_filebuf_wchar_is_open(this))
3353         return NULL;
3354
3355     if(setvbuf(this->file, (char*)buf, (buf==NULL && count==0) ? _IONBF : _IOFBF, count*sizeof(wchar_t)))
3356         return NULL;
3357
3358     basic_filebuf_wchar__Init(this, this->file, INITFL_open);
3359     return &this->base;
3360 }
3361
3362 /* ?setbuf@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAGH@Z */
3363 /* ?setbuf@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PEAG_J@Z */
3364 DEFINE_THISCALL_WRAPPER(basic_filebuf_short_setbuf, 12)
3365 basic_streambuf_wchar* __thiscall basic_filebuf_short_setbuf(basic_filebuf_wchar *this, wchar_t *buf, streamsize count)
3366 {
3367     TRACE("(%p %p %ld)\n", this, buf, count);
3368
3369     if(!basic_filebuf_wchar_is_open(this))
3370         return NULL;
3371
3372     if(setvbuf(this->file, (char*)buf, (buf==NULL && count==0) ? _IONBF : _IOFBF, count*sizeof(wchar_t)))
3373         return NULL;
3374
3375     basic_filebuf_short__Init(this, this->file, INITFL_open);
3376     return &this->base;
3377 }
3378
3379 /* ?sync@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEHXZ */
3380 /* ?sync@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAHXZ */
3381 /* ?sync@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEHXZ */
3382 /* ?sync@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAHXZ */
3383 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_sync, 4)
3384 int __thiscall basic_filebuf_wchar_sync(basic_filebuf_wchar *this)
3385 {
3386     TRACE("(%p)\n", this);
3387
3388     if(!basic_filebuf_wchar_is_open(this))
3389         return 0;
3390
3391     if(call_basic_streambuf_wchar_overflow(&this->base, WEOF) == WEOF)
3392         return 0;
3393     return fflush(this->file);
3394 }
3395
3396 /* ?imbue@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEXABVlocale@2@@Z */
3397 /* ?imbue@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAXAEBVlocale@2@@Z */
3398 DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_imbue, 8)
3399 void __thiscall basic_filebuf_wchar_imbue(basic_filebuf_wchar *this, const locale *loc)
3400 {
3401     TRACE("(%p %p)\n", this, loc);
3402     basic_filebuf_wchar__Initcvt(this, codecvt_wchar_use_facet(loc));
3403 }
3404
3405 /* ?imbue@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEXABVlocale@2@@Z */
3406 /* ?imbue@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAXAEBVlocale@2@@Z */
3407 DEFINE_THISCALL_WRAPPER(basic_filebuf_short_imbue, 8)
3408 void __thiscall basic_filebuf_short_imbue(basic_filebuf_wchar *this, const locale *loc)
3409 {
3410     TRACE("(%p %p)\n", this, loc);
3411     basic_filebuf_wchar__Initcvt(this, codecvt_short_use_facet(loc));
3412 }
3413
3414 /* ?_Getstate@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAEHH@Z */
3415 /* ?_Getstate@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAHH@Z */
3416 static int basic_stringbuf_char__Getstate(basic_stringbuf_char *this, IOSB_openmode mode)
3417 {
3418     int state = 0;
3419
3420     if(!(mode & OPENMODE_in))
3421         state |= STRINGBUF_no_read;
3422
3423     if(!(mode & OPENMODE_out))
3424         state |= STRINGBUF_no_write;
3425
3426     if(mode & OPENMODE_ate)
3427         state |= STRINGBUF_at_end;
3428
3429     if(mode & OPENMODE_app)
3430         state |= STRINGBUF_append;
3431
3432     return state;
3433 }
3434
3435 /* ?_Init@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXPBDIH@Z */
3436 /* ?_Init@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAXPEBD_KH@Z */
3437 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char__Init, 16)
3438 void __thiscall basic_stringbuf_char__Init(basic_stringbuf_char *this, const char *str, MSVCP_size_t count, int state)
3439 {
3440     TRACE("(%p, %p, %ld, %d)\n", this, str, count, state);
3441
3442     basic_streambuf_char__Init_empty(&this->base);
3443
3444     this->state = state;
3445     this->seekhigh = NULL;
3446
3447     if(count && str) {
3448         char *buf = MSVCRT_operator_new(count);
3449         if(!buf) {
3450             ERR("Out of memory\n");
3451             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3452         }
3453
3454         memcpy(buf, str, count);
3455         this->seekhigh = buf + count;
3456
3457         this->state |= STRINGBUF_allocated;
3458
3459         if(!(state & STRINGBUF_no_read))
3460             basic_streambuf_char_setg(&this->base, buf, buf, buf + count);
3461
3462         if(!(state & STRINGBUF_no_write)) {
3463             basic_streambuf_char_setp_next(&this->base, buf, (state & STRINGBUF_at_end) ? buf + count : buf, buf + count);
3464
3465             if(!basic_streambuf_char_gptr(&this->base))
3466                 basic_streambuf_char_setg(&this->base, buf, 0, buf);
3467         }
3468     }
3469 }
3470
3471 /* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
3472 /* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
3473 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_ctor_str, 12)
3474 basic_stringbuf_char* __thiscall basic_stringbuf_char_ctor_str(basic_stringbuf_char *this,
3475         const basic_string_char *str, IOSB_openmode mode)
3476 {
3477     TRACE("(%p %p %d)\n", this, str, mode);
3478
3479     basic_streambuf_char_ctor(&this->base);
3480     this->base.vtable = &MSVCP_basic_stringbuf_char_vtable;
3481
3482     basic_stringbuf_char__Init(this, basic_string_char_c_str(str),
3483             str->size, basic_stringbuf_char__Getstate(this, mode));
3484     return this;
3485 }
3486
3487 /* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
3488 /* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
3489 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_ctor_mode, 8)
3490 basic_stringbuf_char* __thiscall basic_stringbuf_char_ctor_mode(
3491         basic_stringbuf_char *this, IOSB_openmode mode)
3492 {
3493     TRACE("(%p %d)\n", this, mode);
3494
3495     basic_streambuf_char_ctor(&this->base);
3496     this->base.vtable = &MSVCP_basic_stringbuf_char_vtable;
3497
3498     basic_stringbuf_char__Init(this, NULL, 0, basic_stringbuf_char__Getstate(this, mode));
3499     return this;
3500 }
3501
3502 /* ??_F?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
3503 /* ??_F?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
3504 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_ctor, 4)
3505 basic_stringbuf_char* __thiscall basic_stringbuf_char_ctor(basic_stringbuf_char *this)
3506 {
3507     return basic_stringbuf_char_ctor_mode(this, OPENMODE_in|OPENMODE_out);
3508 }
3509
3510 /* ?_Tidy@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXXZ */
3511 /* ?_Tidy@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAXXZ */
3512 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char__Tidy, 4)
3513 void __thiscall basic_stringbuf_char__Tidy(basic_stringbuf_char *this)
3514 {
3515     TRACE("(%p)\n", this);
3516
3517     if(this->state & STRINGBUF_allocated) {
3518         MSVCRT_operator_delete(basic_streambuf_char_eback(&this->base));
3519         this->seekhigh = NULL;
3520         this->state &= ~STRINGBUF_allocated;
3521     }
3522
3523     basic_streambuf_char__Init_empty(&this->base);
3524 }
3525
3526 /* ??1?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
3527 /* ??1?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
3528 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_dtor, 4)
3529 void __thiscall basic_stringbuf_char_dtor(basic_stringbuf_char *this)
3530 {
3531     TRACE("(%p)\n", this);
3532
3533     basic_stringbuf_char__Tidy(this);
3534     basic_streambuf_char_dtor(&this->base);
3535 }
3536
3537 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_vector_dtor, 8)
3538 basic_stringbuf_char* __thiscall basic_stringbuf_char_vector_dtor(basic_stringbuf_char *this, unsigned int flags)
3539 {
3540     TRACE("(%p %x)\n", this, flags);
3541
3542     if(flags & 2) {
3543         /* we have an array, with the number of elements stored before the first object */
3544         INT_PTR i, *ptr = (INT_PTR *) this - 1;
3545
3546         for (i = *ptr - 1; i >= 0; i--)
3547             basic_stringbuf_char_dtor(this+i);
3548
3549         MSVCRT_operator_delete(ptr);
3550     }else {
3551         basic_stringbuf_char_dtor(this);
3552
3553         if(flags & 1)
3554             MSVCRT_operator_delete(this);
3555     }
3556
3557     return this;
3558 }
3559
3560 /* ?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAEHH@Z */
3561 /* ?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z */
3562 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_overflow, 8)
3563 int __thiscall basic_stringbuf_char_overflow(basic_stringbuf_char *this, int meta)
3564 {
3565     MSVCP_size_t oldsize, size;
3566     char *ptr, *buf;
3567
3568     TRACE("(%p %x)\n", this, meta);
3569
3570     if(meta == EOF)
3571         return !EOF;
3572     if(this->state & STRINGBUF_no_write)
3573         return EOF;
3574
3575     ptr = basic_streambuf_char_pptr(&this->base);
3576     if((this->state&STRINGBUF_append) && ptr<this->seekhigh)
3577         basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base),
3578                 this->seekhigh, basic_streambuf_char_epptr(&this->base));
3579
3580     if(ptr && ptr<basic_streambuf_char_epptr(&this->base))
3581         return (*basic_streambuf_char__Pninc(&this->base) = meta);
3582
3583     oldsize = (ptr ? basic_streambuf_char_epptr(&this->base)-basic_streambuf_char_eback(&this->base): 0);
3584     size = oldsize|0xf;
3585     size += size/2;
3586     buf = MSVCRT_operator_new(size);
3587     if(!buf) {
3588         ERR("Out of memory\n");
3589         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3590     }
3591
3592     if(!oldsize) {
3593         this->seekhigh = buf;
3594         basic_streambuf_char_setp(&this->base, buf, buf+size);
3595         if(this->state & STRINGBUF_no_read)
3596             basic_streambuf_char_setg(&this->base, buf, NULL, buf);
3597         else
3598             basic_streambuf_char_setg(&this->base, buf, buf, buf+1);
3599
3600         this->state |= STRINGBUF_allocated;
3601     }else {
3602         ptr = basic_streambuf_char_eback(&this->base);
3603         memcpy(buf, ptr, oldsize);
3604
3605         this->seekhigh = buf+(this->seekhigh-ptr);
3606         basic_streambuf_char_setp_next(&this->base, buf,
3607                 buf+(basic_streambuf_char_pptr(&this->base)-ptr), buf+size);
3608         if(this->state & STRINGBUF_no_read)
3609             basic_streambuf_char_setg(&this->base, buf, NULL, buf);
3610         else
3611             basic_streambuf_char_setg(&this->base, buf,
3612                     buf+(basic_streambuf_char_gptr(&this->base)-ptr),
3613                     basic_streambuf_char_pptr(&this->base)+1);
3614
3615         MSVCRT_operator_delete(ptr);
3616     }
3617
3618     return (*basic_streambuf_char__Pninc(&this->base) = meta);
3619 }
3620
3621 /* ?pbackfail@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAEHH@Z */
3622 /* ?pbackfail@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z */
3623 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_pbackfail, 8)
3624 int __thiscall basic_stringbuf_char_pbackfail(basic_stringbuf_char *this, int c)
3625 {
3626     char *cur;
3627
3628     TRACE("(%p %x)\n", this, c);
3629
3630     cur = basic_streambuf_char_gptr(&this->base);
3631     if(!cur || cur==basic_streambuf_char_eback(&this->base)
3632             || (c!=EOF && c!=cur[-1] && this->state&STRINGBUF_no_write))
3633         return EOF;
3634
3635     if(c != EOF)
3636         cur[-1] = c;
3637     basic_streambuf_char_gbump(&this->base, -1);
3638     return c==EOF ? !EOF : c;
3639 }
3640
3641 /* ?underflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAEHXZ */
3642 /* ?underflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHXZ */
3643 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_underflow, 4)
3644 int __thiscall basic_stringbuf_char_underflow(basic_stringbuf_char *this)
3645 {
3646     char *ptr, *cur;
3647
3648     TRACE("(%p)\n", this);
3649
3650     cur = basic_streambuf_char_gptr(&this->base);
3651     if(!cur || this->state&STRINGBUF_no_read)
3652         return EOF;
3653
3654     ptr  = basic_streambuf_char_pptr(&this->base);
3655     if(this->seekhigh < ptr)
3656         this->seekhigh = ptr;
3657
3658     ptr = basic_streambuf_char_egptr(&this->base);
3659     if(this->seekhigh > ptr)
3660         basic_streambuf_char_setg(&this->base, basic_streambuf_char_eback(&this->base), cur, this->seekhigh);
3661
3662     if(cur < this->seekhigh)
3663         return (unsigned char)*cur;
3664     return EOF;
3665 }
3666
3667 /* ?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAE?AV?$fpos@H@2@JHH@Z */
3668 /* ?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
3669 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_seekoff, 20)
3670 fpos_int* __thiscall basic_stringbuf_char_seekoff(basic_stringbuf_char *this,
3671         fpos_int *ret, streamoff off, int way, int mode)
3672 {
3673     char *beg, *cur_r, *cur_w;
3674
3675     TRACE("(%p %p %ld %d %d)\n", this, ret, off, way, mode);
3676
3677     cur_w = basic_streambuf_char_pptr(&this->base);
3678     if(cur_w > this->seekhigh)
3679         this->seekhigh = cur_w;
3680
3681     ret->off = 0;
3682     ret->state = 0;
3683
3684     beg = basic_streambuf_char_eback(&this->base);
3685     cur_r = basic_streambuf_char_gptr(&this->base);
3686     if((mode & OPENMODE_in) && cur_r) {
3687         if(way==SEEKDIR_cur && !(mode & OPENMODE_out))
3688             off += cur_r-beg;
3689         else if(way == SEEKDIR_end)
3690             off += this->seekhigh-beg;
3691         else if(way != SEEKDIR_beg)
3692             off = -1;
3693
3694         if(off<0 || off>this->seekhigh-beg) {
3695             off = -1;
3696         }else {
3697             basic_streambuf_char_gbump(&this->base, beg-cur_r+off);
3698             if((mode & OPENMODE_out) && cur_w) {
3699                 basic_streambuf_char_setp_next(&this->base, beg,
3700                         basic_streambuf_char_gptr(&this->base),
3701                         basic_streambuf_char_epptr(&this->base));
3702             }
3703         }
3704     }else if((mode & OPENMODE_out) && cur_w) {
3705         if(way == SEEKDIR_cur)
3706             off += cur_w-beg;
3707         else if(way == SEEKDIR_end)
3708             off += this->seekhigh-beg;
3709         else if(way != SEEKDIR_beg)
3710             off = -1;
3711
3712         if(off<0 || off>this->seekhigh-beg)
3713             off = -1;
3714         else
3715             basic_streambuf_char_pbump(&this->base, beg-cur_w+off);
3716     }else {
3717         off = -1;
3718     }
3719
3720     ret->pos = off;
3721     return ret;
3722 }
3723
3724 /* ?seekpos@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
3725 /* ?seekpos@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
3726 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_seekpos, 36)
3727 fpos_int* __thiscall basic_stringbuf_char_seekpos(basic_stringbuf_char *this,
3728         fpos_int *ret, fpos_int pos, int mode)
3729 {
3730     TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
3731
3732     if(pos.off==0 && pos.pos==-1 && pos.state==0) {
3733         *ret = pos;
3734         return ret;
3735     }
3736
3737     return basic_stringbuf_char_seekoff(this, ret, pos.off, SEEKDIR_beg, mode);
3738 }
3739
3740 /* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
3741 /* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
3742 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_str_set, 8)
3743 void __thiscall basic_stringbuf_char_str_set(basic_stringbuf_char *this, const basic_string_char *str)
3744 {
3745     TRACE("(%p %p)\n", this, str);
3746
3747     basic_stringbuf_char__Tidy(this);
3748     basic_stringbuf_char__Init(this, basic_string_char_c_str(str), str->size, this->state);
3749 }
3750
3751 /* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3752 /* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
3753 DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_str_get, 8)
3754 basic_string_char* __thiscall basic_stringbuf_char_str_get(const basic_stringbuf_char *this, basic_string_char *ret)
3755 {
3756     char *ptr;
3757
3758     TRACE("(%p)\n", this);
3759
3760     if(!(this->state & STRINGBUF_no_write) && basic_streambuf_char_pptr(&this->base)) {
3761         char *pptr;
3762
3763         ptr = basic_streambuf_char_pbase(&this->base);
3764         pptr = basic_streambuf_char_pptr(&this->base);
3765
3766         return basic_string_char_ctor_cstr_len(ret, ptr, (this->seekhigh < pptr ? pptr : this->seekhigh) - ptr);
3767     }
3768
3769     if(!(this->state & STRINGBUF_no_read) && basic_streambuf_char_gptr(&this->base)) {
3770         ptr = basic_streambuf_char_eback(&this->base);
3771         return basic_string_char_ctor_cstr_len(ret, ptr, basic_streambuf_char_egptr(&this->base) - ptr);
3772     }
3773
3774     return basic_string_char_ctor(ret);
3775 }
3776
3777 /* ?_Getstate@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@AAEHH@Z */
3778 /* ?_Getstate@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@AEAAHH@Z */
3779 /* ?_Getstate@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@AAEHH@Z */
3780 /* ?_Getstate@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@AEAAHH@Z */
3781 static int basic_stringbuf_wchar__Getstate(basic_stringbuf_wchar *this, IOSB_openmode mode)
3782 {
3783     int state = 0;
3784
3785     if(!(mode & OPENMODE_in))
3786         state |= STRINGBUF_no_read;
3787
3788     if(!(mode & OPENMODE_out))
3789         state |= STRINGBUF_no_write;
3790
3791     if(mode & OPENMODE_ate)
3792         state |= STRINGBUF_at_end;
3793
3794     if(mode & OPENMODE_app)
3795         state |= STRINGBUF_append;
3796
3797     return state;
3798 }
3799
3800 /* ?_Init@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXPB_WIH@Z */
3801 /* ?_Init@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAXPEB_W_KH@Z */
3802 /* ?_Init@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXPBGIH@Z */
3803 /* ?_Init@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAXPEBG_KH@Z */
3804 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar__Init, 16)
3805 void __thiscall basic_stringbuf_wchar__Init(basic_stringbuf_wchar *this, const wchar_t *str, MSVCP_size_t count, int state)
3806 {
3807     TRACE("(%p, %p, %lu, %d)\n", this, str, count, state);
3808
3809     basic_streambuf_wchar__Init_empty(&this->base);
3810
3811     this->state = state;
3812     this->seekhigh = NULL;
3813
3814     if(count && str) {
3815         wchar_t *buf = MSVCRT_operator_new(count*sizeof(wchar_t));
3816         if(!buf) {
3817             ERR("Out of memory\n");
3818             throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3819         }
3820
3821         memcpy(buf, str, count*sizeof(wchar_t));
3822         this->seekhigh = buf + count;
3823
3824         this->state |= STRINGBUF_allocated;
3825
3826         if(!(state & STRINGBUF_no_read))
3827             basic_streambuf_wchar_setg(&this->base, buf, buf, buf + count);
3828
3829         if(!(state & STRINGBUF_no_write)) {
3830             basic_streambuf_wchar_setp_next(&this->base, buf, (state & STRINGBUF_at_end) ? buf + count : buf, buf + count);
3831
3832             if(!basic_streambuf_wchar_gptr(&this->base))
3833                 basic_streambuf_wchar_setg(&this->base, buf, 0, buf);
3834         }
3835     }
3836 }
3837
3838 /* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
3839 /* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
3840 static basic_stringbuf_wchar* basic_stringbuf_wchar_ctor_str(basic_stringbuf_wchar *this,
3841         const basic_string_wchar *str, IOSB_openmode mode)
3842 {
3843     TRACE("(%p %p %d)\n", this, str, mode);
3844
3845     basic_streambuf_wchar_ctor(&this->base);
3846     this->base.vtable = &MSVCP_basic_stringbuf_wchar_vtable;
3847
3848     basic_stringbuf_wchar__Init(this, basic_string_wchar_c_str(str),
3849             str->size, basic_stringbuf_wchar__Getstate(this, mode));
3850     return this;
3851 }
3852
3853 /* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
3854 /* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
3855 DEFINE_THISCALL_WRAPPER(basic_stringbuf_short_ctor_str, 12)
3856 basic_stringbuf_wchar* __thiscall basic_stringbuf_short_ctor_str(basic_stringbuf_wchar *this,
3857         const basic_string_wchar *str, IOSB_openmode mode)
3858 {
3859     basic_stringbuf_wchar_ctor_str(this, str, mode);
3860     this->base.vtable = &MSVCP_basic_stringbuf_short_vtable;
3861     return this;
3862 }
3863
3864 /* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
3865 /* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
3866 static basic_stringbuf_wchar* basic_stringbuf_wchar_ctor_mode(
3867         basic_stringbuf_wchar *this, IOSB_openmode mode)
3868 {
3869     TRACE("(%p %d)\n", this, mode);
3870
3871     basic_streambuf_wchar_ctor(&this->base);
3872     this->base.vtable = &MSVCP_basic_stringbuf_wchar_vtable;
3873
3874     basic_stringbuf_wchar__Init(this, NULL, 0, basic_stringbuf_wchar__Getstate(this, mode));
3875     return this;
3876 }
3877
3878 /* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
3879 /* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
3880 DEFINE_THISCALL_WRAPPER(basic_stringbuf_short_ctor_mode, 8)
3881 basic_stringbuf_wchar* __thiscall basic_stringbuf_short_ctor_mode(
3882         basic_stringbuf_wchar *this, IOSB_openmode mode)
3883 {
3884     basic_stringbuf_wchar_ctor_mode(this, mode);
3885     this->base.vtable = &MSVCP_basic_stringbuf_short_vtable;
3886     return this;
3887 }
3888
3889 /* ??_F?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
3890 /* ??_F?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
3891 DEFINE_THISCALL_WRAPPER(basic_stringbuf_short_ctor, 4)
3892 basic_stringbuf_wchar* __thiscall basic_stringbuf_short_ctor(basic_stringbuf_wchar *this)
3893 {
3894     return basic_stringbuf_short_ctor_mode(this, OPENMODE_in|OPENMODE_out);
3895 }
3896
3897 /* ?_Tidy@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXXZ */
3898 /* ?_Tidy@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAXXZ */
3899 /* ?_Tidy@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXXZ */
3900 /* ?_Tidy@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAXXZ */
3901 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar__Tidy, 4)
3902 void __thiscall basic_stringbuf_wchar__Tidy(basic_stringbuf_wchar *this)
3903 {
3904     TRACE("(%p)\n", this);
3905
3906     if(this->state & STRINGBUF_allocated) {
3907         MSVCRT_operator_delete(basic_streambuf_wchar_eback(&this->base));
3908         this->seekhigh = NULL;
3909         this->state &= ~STRINGBUF_allocated;
3910     }
3911
3912     basic_streambuf_wchar__Init_empty(&this->base);
3913 }
3914
3915 /* ??1?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
3916 /* ??1?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
3917 /* ??1?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
3918 /* ??1?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
3919 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_dtor, 4)
3920 void __thiscall basic_stringbuf_wchar_dtor(basic_stringbuf_wchar *this)
3921 {
3922     TRACE("(%p)\n", this);
3923
3924     basic_stringbuf_wchar__Tidy(this);
3925     basic_streambuf_wchar_dtor(&this->base);
3926 }
3927
3928 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_vector_dtor, 8)
3929 basic_stringbuf_wchar* __thiscall basic_stringbuf_wchar_vector_dtor(basic_stringbuf_wchar *this, unsigned int flags)
3930 {
3931     TRACE("(%p %x)\n", this, flags);
3932
3933     if(flags & 2) {
3934         /* we have an array, with the number of elements stored before the first object */
3935         INT_PTR i, *ptr = (INT_PTR *) this - 1;
3936
3937         for (i = *ptr - 1; i >= 0; i--)
3938             basic_stringbuf_wchar_dtor(this+i);
3939
3940         MSVCRT_operator_delete(ptr);
3941     }else {
3942         basic_stringbuf_wchar_dtor(this);
3943
3944         if(flags & 1)
3945             MSVCRT_operator_delete(this);
3946     }
3947
3948     return this;
3949 }
3950
3951 /* ?overflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAEGG@Z */
3952 /* ?overflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAAGG@Z */
3953 /* ?overflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAEGG@Z */
3954 /* ?overflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAAGG@Z */
3955 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_overflow, 8)
3956 unsigned short __thiscall basic_stringbuf_wchar_overflow(basic_stringbuf_wchar *this, unsigned short meta)
3957 {
3958     MSVCP_size_t oldsize, size;
3959     wchar_t *ptr, *buf;
3960
3961     TRACE("(%p %x)\n", this, meta);
3962
3963     if(meta == WEOF)
3964         return !WEOF;
3965     if(this->state & STRINGBUF_no_write)
3966         return WEOF;
3967
3968     ptr = basic_streambuf_wchar_pptr(&this->base);
3969     if((this->state&STRINGBUF_append) && ptr<this->seekhigh)
3970         basic_streambuf_wchar_setp_next(&this->base, basic_streambuf_wchar_pbase(&this->base),
3971                 this->seekhigh, basic_streambuf_wchar_epptr(&this->base));
3972
3973     if(ptr && ptr<basic_streambuf_wchar_epptr(&this->base))
3974         return (*basic_streambuf_wchar__Pninc(&this->base) = meta);
3975
3976     oldsize = (ptr ? basic_streambuf_wchar_epptr(&this->base)-basic_streambuf_wchar_eback(&this->base): 0);
3977     size = oldsize|0xf;
3978     size += size/2;
3979     buf = MSVCRT_operator_new(size*sizeof(wchar_t));
3980     if(!buf) {
3981         ERR("Out of memory\n");
3982         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
3983     }
3984
3985     if(!oldsize) {
3986         this->seekhigh = buf;
3987         basic_streambuf_wchar_setp(&this->base, buf, buf+size);
3988         if(this->state & STRINGBUF_no_read)
3989             basic_streambuf_wchar_setg(&this->base, buf, NULL, buf);
3990         else
3991             basic_streambuf_wchar_setg(&this->base, buf, buf, buf+1);
3992
3993         this->state |= STRINGBUF_allocated;
3994     }else {
3995         ptr = basic_streambuf_wchar_eback(&this->base);
3996         memcpy(buf, ptr, oldsize*sizeof(wchar_t));
3997
3998         this->seekhigh = buf+(this->seekhigh-ptr);
3999         basic_streambuf_wchar_setp_next(&this->base, buf,
4000                 buf+(basic_streambuf_wchar_pptr(&this->base)-ptr), buf+size);
4001         if(this->state & STRINGBUF_no_read)
4002             basic_streambuf_wchar_setg(&this->base, buf, NULL, buf);
4003         else
4004             basic_streambuf_wchar_setg(&this->base, buf,
4005                     buf+(basic_streambuf_wchar_gptr(&this->base)-ptr),
4006                     basic_streambuf_wchar_pptr(&this->base)+1);
4007
4008         MSVCRT_operator_delete(ptr);
4009     }
4010
4011     return (*basic_streambuf_wchar__Pninc(&this->base) = meta);
4012 }
4013
4014 /* ?pbackfail@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAEGG@Z */
4015 /* ?pbackfail@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAAGG@Z */
4016 /* ?pbackfail@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAEGG@Z */
4017 /* ?pbackfail@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAAGG@Z */
4018 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_pbackfail, 8)
4019 unsigned short __thiscall basic_stringbuf_wchar_pbackfail(basic_stringbuf_wchar *this, unsigned short c)
4020 {
4021     wchar_t *cur;
4022
4023     TRACE("(%p %x)\n", this, c);
4024
4025     cur = basic_streambuf_wchar_gptr(&this->base);
4026     if(!cur || cur==basic_streambuf_wchar_eback(&this->base)
4027             || (c!=WEOF && c!=cur[-1] && this->state&STRINGBUF_no_write))
4028         return WEOF;
4029
4030     if(c != WEOF)
4031         cur[-1] = c;
4032     basic_streambuf_wchar_gbump(&this->base, -1);
4033     return c==WEOF ? !WEOF : c;
4034 }
4035
4036 /* ?underflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAEGXZ */
4037 /* ?underflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAAGXZ */
4038 /* ?underflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAEGXZ */
4039 /* ?underflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAAGXZ */
4040 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_underflow, 4)
4041 unsigned short __thiscall basic_stringbuf_wchar_underflow(basic_stringbuf_wchar *this)
4042 {
4043     wchar_t *ptr, *cur;
4044
4045     TRACE("(%p)\n", this);
4046
4047     cur = basic_streambuf_wchar_gptr(&this->base);
4048     if(!cur || this->state&STRINGBUF_no_read)
4049         return WEOF;
4050
4051     ptr  = basic_streambuf_wchar_pptr(&this->base);
4052     if(this->seekhigh < ptr)
4053         this->seekhigh = ptr;
4054
4055     ptr = basic_streambuf_wchar_egptr(&this->base);
4056     if(this->seekhigh > ptr)
4057         basic_streambuf_wchar_setg(&this->base, basic_streambuf_wchar_eback(&this->base), cur, this->seekhigh);
4058
4059     if(cur < this->seekhigh)
4060         return *cur;
4061     return WEOF;
4062 }
4063
4064 /* ?seekoff@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAE?AV?$fpos@H@2@JHH@Z */
4065 /* ?seekoff@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
4066 /* ?seekoff@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAE?AV?$fpos@H@2@JHH@Z */
4067 /* ?seekoff@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
4068 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_seekoff, 20)
4069 fpos_int* __thiscall basic_stringbuf_wchar_seekoff(basic_stringbuf_wchar *this,
4070         fpos_int *ret, streamoff off, int way, int mode)
4071 {
4072     wchar_t *beg, *cur_r, *cur_w;
4073
4074     TRACE("(%p %p %ld %d %d)\n", this, ret, off, way, mode);
4075
4076     cur_w = basic_streambuf_wchar_pptr(&this->base);
4077     if(cur_w > this->seekhigh)
4078         this->seekhigh = cur_w;
4079
4080     ret->off = 0;
4081     ret->state = 0;
4082
4083     beg = basic_streambuf_wchar_eback(&this->base);
4084     cur_r = basic_streambuf_wchar_gptr(&this->base);
4085     if((mode & OPENMODE_in) && cur_r) {
4086         if(way==SEEKDIR_cur && !(mode & OPENMODE_out))
4087             off += cur_r-beg;
4088         else if(way == SEEKDIR_end)
4089             off += this->seekhigh-beg;
4090         else if(way != SEEKDIR_beg)
4091             off = -1;
4092
4093         if(off<0 || off>this->seekhigh-beg) {
4094             off = -1;
4095         }else {
4096             basic_streambuf_wchar_gbump(&this->base, beg-cur_r+off);
4097             if((mode & OPENMODE_out) && cur_w) {
4098                 basic_streambuf_wchar_setp_next(&this->base, beg,
4099                         basic_streambuf_wchar_gptr(&this->base),
4100                         basic_streambuf_wchar_epptr(&this->base));
4101             }
4102         }
4103     }else if((mode & OPENMODE_out) && cur_w) {
4104         if(way == SEEKDIR_cur)
4105             off += cur_w-beg;
4106         else if(way == SEEKDIR_end)
4107             off += this->seekhigh-beg;
4108         else if(way != SEEKDIR_beg)
4109             off = -1;
4110
4111         if(off<0 || off>this->seekhigh-beg)
4112             off = -1;
4113         else
4114             basic_streambuf_wchar_pbump(&this->base, beg-cur_w+off);
4115     }else {
4116         off = -1;
4117     }
4118
4119     ret->pos = off;
4120     return ret;
4121 }
4122
4123 /* ?seekpos@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
4124 /* ?seekpos@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
4125 /* ?seekpos@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
4126 /* ?seekpos@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
4127 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_seekpos, 36)
4128 fpos_int* __thiscall basic_stringbuf_wchar_seekpos(basic_stringbuf_wchar *this,
4129         fpos_int *ret, fpos_int pos, int mode)
4130 {
4131     TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
4132
4133     if(pos.off==0 && pos.pos==-1 && pos.state==0) {
4134         *ret = pos;
4135         return ret;
4136     }
4137
4138     return basic_stringbuf_wchar_seekoff(this, ret, pos.off, SEEKDIR_beg, mode);
4139 }
4140
4141 /* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
4142 /* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
4143 /* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
4144 /* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
4145 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_str_set, 8)
4146 void __thiscall basic_stringbuf_wchar_str_set(basic_stringbuf_wchar *this, const basic_string_wchar *str)
4147 {
4148     TRACE("(%p %p)\n", this, str);
4149
4150     basic_stringbuf_wchar__Tidy(this);
4151     basic_stringbuf_wchar__Init(this, basic_string_wchar_c_str(str), str->size, this->state);
4152 }
4153
4154 /* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4155 /* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
4156 /* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4157 /* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
4158 DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_str_get, 8)
4159 basic_string_wchar* __thiscall basic_stringbuf_wchar_str_get(const basic_stringbuf_wchar *this, basic_string_wchar *ret)
4160 {
4161     wchar_t *ptr;
4162
4163     TRACE("(%p)\n", this);
4164
4165     if(!(this->state & STRINGBUF_no_write) && basic_streambuf_wchar_pptr(&this->base)) {
4166         wchar_t *pptr;
4167
4168         ptr = basic_streambuf_wchar_pbase(&this->base);
4169         pptr = basic_streambuf_wchar_pptr(&this->base);
4170
4171         return basic_string_wchar_ctor_cstr_len(ret, ptr, (this->seekhigh < pptr ? pptr : this->seekhigh) - ptr);
4172     }
4173
4174     if(!(this->state & STRINGBUF_no_read) && basic_streambuf_wchar_gptr(&this->base)) {
4175         ptr = basic_streambuf_wchar_eback(&this->base);
4176         return basic_string_wchar_ctor_cstr_len(ret, ptr, basic_streambuf_wchar_egptr(&this->base) - ptr);
4177     }
4178
4179     return basic_string_wchar_ctor(ret);
4180 }
4181
4182 /* ??0ios_base@std@@IAE@XZ */
4183 /* ??0ios_base@std@@IEAA@XZ */
4184 DEFINE_THISCALL_WRAPPER(ios_base_ctor, 4)
4185 ios_base* __thiscall ios_base_ctor(ios_base *this)
4186 {
4187     TRACE("(%p)\n", this);
4188     this->vtable = &MSVCP_ios_base_vtable;
4189     return this;
4190 }
4191
4192 /* ??0ios_base@std@@QAE@ABV01@@Z */
4193 /* ??0ios_base@std@@QEAA@AEBV01@@Z */
4194 DEFINE_THISCALL_WRAPPER(ios_base_copy_ctor, 8)
4195 ios_base* __thiscall ios_base_copy_ctor(ios_base *this, const ios_base *copy)
4196 {
4197     TRACE("(%p %p)\n", this, copy);
4198     *this = *copy;
4199     this->vtable = &MSVCP_ios_base_vtable;
4200     return this;
4201 }
4202
4203 /* ?_Callfns@ios_base@std@@AAEXW4event@12@@Z */
4204 /* ?_Callfns@ios_base@std@@AEAAXW4event@12@@Z */
4205 DEFINE_THISCALL_WRAPPER(ios_base_Callfns, 8)
4206 void __thiscall ios_base_Callfns(ios_base *this, IOS_BASE_event event)
4207 {
4208     IOS_BASE_fnarray *cur;
4209
4210     TRACE("(%p %x)\n", this, event);
4211
4212     for(cur=this->calls; cur; cur=cur->next)
4213         cur->event_handler(event, this, cur->index);
4214 }
4215
4216 /* ?_Tidy@ios_base@std@@AAAXXZ */
4217 /* ?_Tidy@ios_base@std@@AEAAXXZ */
4218 void CDECL ios_base_Tidy(ios_base *this)
4219 {
4220     IOS_BASE_iosarray *arr_cur, *arr_next;
4221     IOS_BASE_fnarray *event_cur, *event_next;
4222
4223     TRACE("(%p)\n", this);
4224
4225     ios_base_Callfns(this, EVENT_erase_event);
4226
4227     for(arr_cur=this->arr; arr_cur; arr_cur=arr_next) {
4228         arr_next = arr_cur->next;
4229         MSVCRT_operator_delete(arr_cur);
4230     }
4231     this->arr = NULL;
4232
4233     for(event_cur=this->calls; event_cur; event_cur=event_next) {
4234         event_next = event_cur->next;
4235         MSVCRT_operator_delete(event_cur);
4236     }
4237     this->calls = NULL;
4238 }
4239
4240 /* ?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z */
4241 /* ?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z */
4242 static void ios_base_Ios_base_dtor(ios_base *obj)
4243 {
4244     TRACE("(%p)\n", obj);
4245     if(obj->loc) {
4246         locale_dtor(obj->loc);
4247         MSVCRT_operator_delete(obj->loc);
4248     }
4249     ios_base_Tidy(obj);
4250 }
4251
4252 /* ??1ios_base@std@@UAE@XZ */
4253 /* ??1ios_base@std@@UEAA@XZ */
4254 DEFINE_THISCALL_WRAPPER(ios_base_dtor, 4)
4255 void __thiscall ios_base_dtor(ios_base *this)
4256 {
4257     ios_base_Ios_base_dtor(this);
4258 }
4259
4260 DEFINE_THISCALL_WRAPPER(ios_base_vector_dtor, 8)
4261 ios_base* __thiscall ios_base_vector_dtor(ios_base *this, unsigned int flags)
4262 {
4263     TRACE("(%p %x)\n", this, flags);
4264     if(flags & 2) {
4265         /* we have an array, with the number of elements stored before the first object */
4266         INT_PTR i, *ptr = (INT_PTR *)this-1;
4267
4268         for(i=*ptr-1; i>=0; i--)
4269             ios_base_dtor(this+i);
4270         MSVCRT_operator_delete(ptr);
4271     } else {
4272         ios_base_dtor(this);
4273         if(flags & 1)
4274             MSVCRT_operator_delete(this);
4275     }
4276
4277     return this;
4278 }
4279
4280 DEFINE_THISCALL_WRAPPER(iosb_vector_dtor, 8)
4281 void* __thiscall iosb_vector_dtor(void *this, unsigned int flags)
4282 {
4283     TRACE("(%p %x)\n", this, flags);
4284     if(flags & 2) {
4285         INT_PTR *ptr = (INT_PTR *)this-1;
4286         MSVCRT_operator_delete(ptr);
4287     } else {
4288         if(flags & 1)
4289             MSVCRT_operator_delete(this);
4290     }
4291
4292     return this;
4293 }
4294
4295 /* ?_Findarr@ios_base@std@@AAEAAU_Iosarray@12@H@Z */
4296 /* ?_Findarr@ios_base@std@@AEAAAEAU_Iosarray@12@H@Z */
4297 DEFINE_THISCALL_WRAPPER(ios_base_Findarr, 8)
4298 IOS_BASE_iosarray* __thiscall ios_base_Findarr(ios_base *this, int index)
4299 {
4300     IOS_BASE_iosarray *p;
4301
4302     TRACE("(%p %d)\n", this, index);
4303
4304     for(p=this->arr; p; p=p->next) {
4305         if(p->index == index)
4306             return p;
4307     }
4308
4309     for(p=this->arr; p; p=p->next) {
4310         if(!p->long_val && !p->ptr_val) {
4311             p->index = index;
4312             return p;
4313         }
4314     }
4315
4316     p = MSVCRT_operator_new(sizeof(IOS_BASE_iosarray));
4317     p->next = this->arr;
4318     p->index = index;
4319     p->long_val = 0;
4320     p->ptr_val = NULL;
4321     this->arr = p;
4322     return p;
4323 }
4324
4325 /* ?iword@ios_base@std@@QAEAAJH@Z */
4326 /* ?iword@ios_base@std@@QEAAAEAJH@Z */
4327 DEFINE_THISCALL_WRAPPER(ios_base_iword, 8)
4328 LONG* __thiscall ios_base_iword(ios_base *this, int index)
4329 {
4330     TRACE("(%p %d)\n", this, index);
4331     return &ios_base_Findarr(this, index)->long_val;
4332 }
4333
4334 /* ?pword@ios_base@std@@QAEAAPAXH@Z */
4335 /* ?pword@ios_base@std@@QEAAAEAPEAXH@Z */
4336 DEFINE_THISCALL_WRAPPER(ios_base_pword, 8)
4337 void** __thiscall ios_base_pword(ios_base *this, int index)
4338 {
4339     TRACE("(%p %d)\n", this, index);
4340     return &ios_base_Findarr(this, index)->ptr_val;
4341 }
4342
4343 /* ?register_callback@ios_base@std@@QAEXP6AXW4event@12@AAV12@H@ZH@Z */
4344 /* ?register_callback@ios_base@std@@QEAAXP6AXW4event@12@AEAV12@H@ZH@Z */
4345 DEFINE_THISCALL_WRAPPER(ios_base_register_callback, 12)
4346 void __thiscall ios_base_register_callback(ios_base *this, IOS_BASE_event_callback callback, int index)
4347 {
4348     IOS_BASE_fnarray *event;
4349
4350     TRACE("(%p %p %d)\n", this, callback, index);
4351
4352     event = MSVCRT_operator_new(sizeof(IOS_BASE_fnarray));
4353     event->next = this->calls;
4354     event->index = index;
4355     event->event_handler = callback;
4356     this->calls = event;
4357 }
4358
4359 /* ?clear@ios_base@std@@QAEXH_N@Z */
4360 /* ?clear@ios_base@std@@QEAAXH_N@Z */
4361 DEFINE_THISCALL_WRAPPER(ios_base_clear_reraise, 12)
4362 void __thiscall ios_base_clear_reraise(ios_base *this, IOSB_iostate state, MSVCP_bool reraise)
4363 {
4364     TRACE("(%p %x %x)\n", this, state, reraise);
4365
4366     this->state = state & IOSTATE_mask;
4367     if(!(this->state & this->except))
4368         return;
4369
4370     if(reraise)
4371         throw_exception(EXCEPTION_RERAISE, NULL);
4372     else if(this->state & this->except & IOSTATE_eofbit)
4373         throw_exception(EXCEPTION_FAILURE, "eofbit is set");
4374     else if(this->state & this->except & IOSTATE_failbit)
4375         throw_exception(EXCEPTION_FAILURE, "failbit is set");
4376     else if(this->state & this->except & IOSTATE_badbit)
4377         throw_exception(EXCEPTION_FAILURE, "badbit is set");
4378     else if(this->state & this->except & IOSTATE__Hardfail)
4379         throw_exception(EXCEPTION_FAILURE, "_Hardfail is set");
4380 }
4381
4382 /* ?clear@ios_base@std@@QAEXH@Z */
4383 /* ?clear@ios_base@std@@QEAAXH@Z */
4384 static void ios_base_clear(ios_base *this, IOSB_iostate state)
4385 {
4386     ios_base_clear_reraise(this, state, FALSE);
4387 }
4388
4389 /* ?exceptions@ios_base@std@@QAEXH@Z */
4390 /* ?exceptions@ios_base@std@@QEAAXH@Z */
4391 DEFINE_THISCALL_WRAPPER(ios_base_exceptions_set, 8)
4392 void __thiscall ios_base_exceptions_set(ios_base *this, IOSB_iostate state)
4393 {
4394     TRACE("(%p %x)\n", this, state);
4395     this->except = state & IOSTATE_mask;
4396     ios_base_clear(this, this->state);
4397 }
4398
4399 /* ?exceptions@ios_base@std@@QBEHXZ */
4400 /* ?exceptions@ios_base@std@@QEBAHXZ */
4401 DEFINE_THISCALL_WRAPPER(ios_base_exceptions_get, 4)
4402 IOSB_iostate __thiscall ios_base_exceptions_get(ios_base *this)
4403 {
4404     TRACE("(%p)\n", this);
4405     return this->except;
4406 }
4407
4408 /* ?copyfmt@ios_base@std@@QAEAAV12@ABV12@@Z */
4409 /* ?copyfmt@ios_base@std@@QEAAAEAV12@AEBV12@@Z */
4410 DEFINE_THISCALL_WRAPPER(ios_base_copyfmt, 8)
4411 ios_base* __thiscall ios_base_copyfmt(ios_base *this, const ios_base *rhs)
4412 {
4413     TRACE("(%p %p)\n", this, rhs);
4414
4415     if(this != rhs) {
4416         IOS_BASE_iosarray *arr_cur;
4417         IOS_BASE_fnarray *event_cur;
4418
4419         ios_base_Tidy(this);
4420
4421         for(arr_cur=rhs->arr; arr_cur; arr_cur=arr_cur->next) {
4422             if(arr_cur->long_val)
4423                 *ios_base_iword(this, arr_cur->index) = arr_cur->long_val;
4424             if(arr_cur->ptr_val)
4425                 *ios_base_pword(this, arr_cur->index) = arr_cur->ptr_val;
4426         }
4427         this->stdstr = rhs->stdstr;
4428         this->fmtfl = rhs->fmtfl;
4429         this->prec = rhs->prec;
4430         this->wide = rhs->wide;
4431         locale_operator_assign(this->loc, rhs->loc);
4432
4433         for(event_cur=rhs->calls; event_cur; event_cur=event_cur->next)
4434             ios_base_register_callback(this, event_cur->event_handler, event_cur->index);
4435
4436         ios_base_Callfns(this, EVENT_copyfmt_event);
4437         ios_base_exceptions_set(this, rhs->except);
4438     }
4439
4440     return this;
4441 }
4442
4443 /* ??4ios_base@std@@QAEAAV01@ABV01@@Z */
4444 /* ??4ios_base@std@@QEAAAEAV01@AEBV01@@Z */
4445 DEFINE_THISCALL_WRAPPER(ios_base_assign, 8)
4446 ios_base* __thiscall ios_base_assign(ios_base *this, const ios_base *right)
4447 {
4448     TRACE("(%p %p)\n", this, right);
4449
4450     if(this != right) {
4451         this->state = right->state;
4452         ios_base_copyfmt(this, right);
4453     }
4454
4455     return this;
4456 }
4457
4458 /* ?fail@ios_base@std@@QBE_NXZ */
4459 /* ?fail@ios_base@std@@QEBA_NXZ */
4460 DEFINE_THISCALL_WRAPPER(ios_base_fail, 4)
4461 MSVCP_bool __thiscall ios_base_fail(const ios_base *this)
4462 {
4463     TRACE("(%p)\n", this);
4464     return (this->state & (IOSTATE_failbit|IOSTATE_badbit)) != 0;
4465 }
4466
4467 /* ??7ios_base@std@@QBE_NXZ */
4468 /* ??7ios_base@std@@QEBA_NXZ */
4469 DEFINE_THISCALL_WRAPPER(ios_base_op_succ, 4)
4470 MSVCP_bool __thiscall ios_base_op_succ(const ios_base *this)
4471 {
4472     TRACE("(%p)\n", this);
4473     return ios_base_fail(this);
4474 }
4475
4476 /* ??Bios_base@std@@QBEPAXXZ */
4477 /* ??Bios_base@std@@QEBAPEAXXZ */
4478 DEFINE_THISCALL_WRAPPER(ios_base_op_fail, 4)
4479 void* __thiscall ios_base_op_fail(const ios_base *this)
4480 {
4481     TRACE("(%p)\n", this);
4482     return ios_base_fail(this) ? NULL : (void*)this;
4483 }
4484
4485 /* ?_Addstd@ios_base@std@@SAXPAV12@@Z */
4486 /* ?_Addstd@ios_base@std@@SAXPEAV12@@Z */
4487 static void ios_base_Addstd(ios_base *add)
4488 {
4489     FIXME("(%p) stub\n", add);
4490 }
4491
4492 /* ?_Init@ios_base@std@@IAEXXZ */
4493 /* ?_Init@ios_base@std@@IEAAXXZ */
4494 DEFINE_THISCALL_WRAPPER(ios_base__Init, 4)
4495 void __thiscall ios_base__Init(ios_base *this)
4496 {
4497     TRACE("(%p)\n", this);
4498
4499     this->stdstr = 0;
4500     this->state = this->except = IOSTATE_goodbit;
4501     this->fmtfl = FMTFLAG_skipws | FMTFLAG_dec;
4502     this->prec = 6;
4503     this->wide = 0;
4504     this->arr = NULL;
4505     this->calls = NULL;
4506     this->loc = MSVCRT_operator_new(sizeof(locale));
4507     locale_ctor(this->loc);
4508 }
4509
4510 /* ?bad@ios_base@std@@QBE_NXZ */
4511 /* ?bad@ios_base@std@@QEBA_NXZ */
4512 DEFINE_THISCALL_WRAPPER(ios_base_bad, 4)
4513 MSVCP_bool __thiscall ios_base_bad(const ios_base *this)
4514 {
4515     TRACE("(%p)\n", this);
4516     return (this->state & IOSTATE_badbit) != 0;
4517 }
4518
4519 /* ?eof@ios_base@std@@QBE_NXZ */
4520 /* ?eof@ios_base@std@@QEBA_NXZ */
4521 DEFINE_THISCALL_WRAPPER(ios_base_eof, 4)
4522 MSVCP_bool __thiscall ios_base_eof(const ios_base *this)
4523 {
4524     TRACE("(%p)\n", this);
4525     return (this->state & IOSTATE_eofbit) != 0;
4526 }
4527
4528 /* ?flags@ios_base@std@@QAEHH@Z */
4529 /* ?flags@ios_base@std@@QEAAHH@Z */
4530 DEFINE_THISCALL_WRAPPER(ios_base_flags_set, 8)
4531 IOSB_fmtflags __thiscall ios_base_flags_set(ios_base *this, IOSB_fmtflags flags)
4532 {
4533     IOSB_fmtflags ret = this->fmtfl;
4534
4535     TRACE("(%p %x)\n", this, flags);
4536
4537     this->fmtfl = flags & FMTFLAG_mask;
4538     return ret;
4539 }
4540
4541 /* ?flags@ios_base@std@@QBEHXZ */
4542 /* ?flags@ios_base@std@@QEBAHXZ */
4543 DEFINE_THISCALL_WRAPPER(ios_base_flags_get, 4)
4544 IOSB_fmtflags __thiscall ios_base_flags_get(const ios_base *this)
4545 {
4546     TRACE("(%p)\n", this);
4547     return this->fmtfl;
4548 }
4549
4550 /* ?getloc@ios_base@std@@QBE?AVlocale@2@XZ */
4551 /* ?getloc@ios_base@std@@QEBA?AVlocale@2@XZ */
4552 DEFINE_THISCALL_WRAPPER(ios_base_getloc, 8)
4553 locale* __thiscall ios_base_getloc(const ios_base *this, locale *ret)
4554 {
4555     TRACE("(%p)\n", this);
4556     return locale_copy_ctor(ret, this->loc);
4557 }
4558
4559 /* ?good@ios_base@std@@QBE_NXZ */
4560 /* ?good@ios_base@std@@QEBA_NXZ */
4561 DEFINE_THISCALL_WRAPPER(ios_base_good, 4)
4562 MSVCP_bool __thiscall ios_base_good(const ios_base *this)
4563 {
4564     TRACE("(%p)\n", this);
4565     return this->state == IOSTATE_goodbit;
4566 }
4567
4568 /* ?imbue@ios_base@std@@QAE?AVlocale@2@ABV32@@Z */
4569 /* ?imbue@ios_base@std@@QEAA?AVlocale@2@AEBV32@@Z */
4570 DEFINE_THISCALL_WRAPPER(ios_base_imbue, 12)
4571 locale* __thiscall ios_base_imbue(ios_base *this, locale *ret, const locale *loc)
4572 {
4573     TRACE("(%p %p)\n", this, loc);
4574     *ret = *this->loc;
4575     locale_copy_ctor(this->loc, loc);
4576     return ret;
4577 }
4578
4579 /* ?precision@ios_base@std@@QAEHH@Z */
4580 /* ?precision@ios_base@std@@QEAA_J_J@Z */
4581 DEFINE_THISCALL_WRAPPER(ios_base_precision_set, 8)
4582 streamsize __thiscall ios_base_precision_set(ios_base *this, streamsize precision)
4583 {
4584     streamsize ret = this->prec;
4585
4586     TRACE("(%p %ld)\n", this, precision);
4587
4588     this->prec = precision;
4589     return ret;
4590 }
4591
4592 /* ?precision@ios_base@std@@QBEHXZ */
4593 /* ?precision@ios_base@std@@QEBA_JXZ */
4594 DEFINE_THISCALL_WRAPPER(ios_base_precision_get, 4)
4595 streamsize __thiscall ios_base_precision_get(const ios_base *this)
4596 {
4597     TRACE("(%p)\n", this);
4598     return this->prec;
4599 }
4600
4601 /* ?rdstate@ios_base@std@@QBEHXZ */
4602 /* ?rdstate@ios_base@std@@QEBAHXZ */
4603 DEFINE_THISCALL_WRAPPER(ios_base_rdstate, 4)
4604 IOSB_iostate __thiscall ios_base_rdstate(const ios_base *this)
4605 {
4606     TRACE("(%p)\n", this);
4607     return this->state;
4608 }
4609
4610 /* ?setf@ios_base@std@@QAEHHH@Z */
4611 /* ?setf@ios_base@std@@QEAAHHH@Z */
4612 DEFINE_THISCALL_WRAPPER(ios_base_setf_mask, 12)
4613 IOSB_fmtflags __thiscall ios_base_setf_mask(ios_base *this, IOSB_fmtflags flags, IOSB_fmtflags mask)
4614 {
4615     IOSB_fmtflags ret = this->fmtfl;
4616
4617     TRACE("(%p %x %x)\n", this, flags, mask);
4618
4619     this->fmtfl = (this->fmtfl & (~mask)) | (flags & mask & FMTFLAG_mask);
4620     return ret;
4621 }
4622
4623 /* ?setf@ios_base@std@@QAEHH@Z */
4624 /* ?setf@ios_base@std@@QEAAHH@Z */
4625 DEFINE_THISCALL_WRAPPER(ios_base_setf, 8)
4626 IOSB_fmtflags __thiscall ios_base_setf(ios_base *this, IOSB_fmtflags flags)
4627 {
4628     return ios_base_setf_mask(this, flags, ~0);
4629 }
4630
4631 /* ?setstate@ios_base@std@@QAEXH_N@Z */
4632 /* ?setstate@ios_base@std@@QEAAXH_N@Z */
4633 DEFINE_THISCALL_WRAPPER(ios_base_setstate_reraise, 12)
4634 void __thiscall ios_base_setstate_reraise(ios_base *this, IOSB_iostate state, MSVCP_bool reraise)
4635 {
4636     TRACE("(%p %x %x)\n", this, state, reraise);
4637
4638     if(state != IOSTATE_goodbit)
4639         ios_base_clear_reraise(this, this->state | state, reraise);
4640 }
4641
4642 /* ?setstate@ios_base@std@@QAEXH@Z */
4643 /* ?setstate@ios_base@std@@QEAAXH@Z */
4644 static void ios_base_setstate(ios_base *this, IOSB_iostate state)
4645 {
4646     ios_base_setstate_reraise(this, state, FALSE);
4647 }
4648
4649 /* ?sync_with_stdio@ios_base@std@@SA_N_N@Z */
4650 MSVCP_bool CDECL ios_base_sync_with_stdio(MSVCP_bool sync)
4651 {
4652     _Lockit lock;
4653     MSVCP_bool ret;
4654
4655     TRACE("(%x)\n", sync);
4656
4657     _Lockit_ctor_locktype(&lock, _LOCK_STREAM);
4658     ret = ios_base_Sync;
4659     ios_base_Sync = sync;
4660     _Lockit_dtor(&lock);
4661     return ret;
4662 }
4663
4664 /* ?unsetf@ios_base@std@@QAEXH@Z */
4665 /* ?unsetf@ios_base@std@@QEAAXH@Z */
4666 DEFINE_THISCALL_WRAPPER(ios_base_unsetf, 8)
4667 void __thiscall ios_base_unsetf(ios_base *this, IOSB_fmtflags flags)
4668 {
4669     TRACE("(%p %x)\n", this, flags);
4670     this->fmtfl &= ~flags;
4671 }
4672
4673 /* ?width@ios_base@std@@QAEHH@Z */
4674 /* ?width@ios_base@std@@QEAA_J_J@Z */
4675 DEFINE_THISCALL_WRAPPER(ios_base_width_set, 8)
4676 streamsize __thiscall ios_base_width_set(ios_base *this, streamsize width)
4677 {
4678     streamsize ret = this->wide;
4679
4680     TRACE("(%p %ld)\n", this, width);
4681
4682     this->wide = width;
4683     return ret;
4684 }
4685
4686 /* ?width@ios_base@std@@QBEHXZ */
4687 /* ?width@ios_base@std@@QEBA_JXZ */
4688 DEFINE_THISCALL_WRAPPER(ios_base_width_get, 4)
4689 streamsize __thiscall ios_base_width_get(ios_base *this)
4690 {
4691     TRACE("(%p)\n", this);
4692     return this->wide;
4693 }
4694
4695 /* ?xalloc@ios_base@std@@SAHXZ */
4696 int CDECL ios_base_xalloc(void)
4697 {
4698     _Lockit lock;
4699     int ret;
4700
4701     TRACE("\n");
4702
4703     _Lockit_ctor_locktype(&lock, _LOCK_STREAM);
4704     ret = ios_base_Index++;
4705     _Lockit_dtor(&lock);
4706     return ret;
4707 }
4708
4709 /* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAE@XZ */
4710 /* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IEAA@XZ */
4711 DEFINE_THISCALL_WRAPPER(basic_ios_char_ctor, 4)
4712 basic_ios_char* __thiscall basic_ios_char_ctor(basic_ios_char *this)
4713 {
4714     TRACE("(%p)\n", this);
4715
4716     ios_base_ctor(&this->base);
4717     this->base.vtable = &MSVCP_basic_ios_char_vtable;
4718     return this;
4719 }
4720
4721 /* ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IAEXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z */
4722 /* ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z */
4723 DEFINE_THISCALL_WRAPPER(basic_ios_char_init, 12)
4724 void __thiscall basic_ios_char_init(basic_ios_char *this, basic_streambuf_char *streambuf, MSVCP_bool isstd)
4725 {
4726     TRACE("(%p %p %x)\n", this, streambuf, isstd);
4727     ios_base__Init(&this->base);
4728     this->strbuf = streambuf;
4729     this->stream = NULL;
4730     this->fillch = ' ';
4731
4732     if(!streambuf)
4733         ios_base_setstate(&this->base, IOSTATE_badbit);
4734
4735     if(isstd)
4736         FIXME("standard streams not handled yet\n");
4737 }
4738
4739 /* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
4740 /* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
4741 DEFINE_THISCALL_WRAPPER(basic_ios_char_ctor_streambuf, 8)
4742 basic_ios_char* __thiscall basic_ios_char_ctor_streambuf(basic_ios_char *this, basic_streambuf_char *strbuf)
4743 {
4744     TRACE("(%p %p)\n", this, strbuf);
4745
4746     basic_ios_char_ctor(this);
4747     basic_ios_char_init(this, strbuf, FALSE);
4748     return this;
4749 }
4750
4751 /* ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAE@XZ */
4752 /* ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UEAA@XZ */
4753 DEFINE_THISCALL_WRAPPER(basic_ios_char_dtor, 4)
4754 void __thiscall basic_ios_char_dtor(basic_ios_char *this)
4755 {
4756     TRACE("(%p)\n", this);
4757     ios_base_dtor(&this->base);
4758 }
4759
4760 DEFINE_THISCALL_WRAPPER(basic_ios_char_vector_dtor, 8)
4761 basic_ios_char* __thiscall basic_ios_char_vector_dtor(basic_ios_char *this, unsigned int flags)
4762 {
4763     TRACE("(%p %x)\n", this, flags);
4764     if(flags & 2) {
4765         /* we have an array, with the number of elements stored before the first object */
4766         INT_PTR i, *ptr = (INT_PTR *)this-1;
4767
4768         for(i=*ptr-1; i>=0; i--)
4769             basic_ios_char_dtor(this+i);
4770         MSVCRT_operator_delete(ptr);
4771     } else {
4772         basic_ios_char_dtor(this);
4773         if(flags & 1)
4774             MSVCRT_operator_delete(this);
4775     }
4776
4777     return this;
4778 }
4779
4780 /* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z */
4781 /* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z */
4782 DEFINE_THISCALL_WRAPPER(basic_ios_char_clear_reraise, 12)
4783 void __thiscall basic_ios_char_clear_reraise(basic_ios_char *this, IOSB_iostate state, MSVCP_bool reraise)
4784 {
4785     TRACE("(%p %x %x)\n", this, state, reraise);
4786     ios_base_clear_reraise(&this->base, state | (this->strbuf ? IOSTATE_goodbit : IOSTATE_badbit), reraise);
4787 }
4788
4789 /* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z */
4790 /* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z */
4791 static void basic_ios_char_clear(basic_ios_char *this, unsigned int state)
4792 {
4793     basic_ios_char_clear_reraise(this, (IOSB_iostate)state, FALSE);
4794 }
4795
4796 /* ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEAAV12@ABV12@@Z */
4797 /* ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEBV12@@Z */
4798 DEFINE_THISCALL_WRAPPER(basic_ios_char_copyfmt, 8)
4799 basic_ios_char* __thiscall basic_ios_char_copyfmt(basic_ios_char *this, basic_ios_char *copy)
4800 {
4801     TRACE("(%p %p)\n", this, copy);
4802     if(this == copy)
4803         return this;
4804
4805     this->stream = copy->stream;
4806     this->fillch = copy->fillch;
4807     ios_base_copyfmt(&this->base, &copy->base);
4808     return this;
4809 }
4810
4811 /* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEDD@Z */
4812 /* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAADD@Z */
4813 DEFINE_THISCALL_WRAPPER(basic_ios_char_fill_set, 8)
4814 char __thiscall basic_ios_char_fill_set(basic_ios_char *this, char fill)
4815 {
4816     char ret = this->fillch;
4817
4818     TRACE("(%p %c)\n", this, fill);
4819
4820     this->fillch = fill;
4821     return ret;
4822 }
4823
4824 /* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ */
4825 /* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ */
4826 DEFINE_THISCALL_WRAPPER(basic_ios_char_fill_get, 4)
4827 char __thiscall basic_ios_char_fill_get(basic_ios_char *this)
4828 {
4829     TRACE("(%p)\n", this);
4830     return this->fillch;
4831 }
4832
4833 /* ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
4834 /* ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
4835 DEFINE_THISCALL_WRAPPER(basic_ios_char_imbue, 12)
4836 locale *__thiscall basic_ios_char_imbue(basic_ios_char *this, locale *ret, const locale *loc)
4837 {
4838     TRACE("(%p %p %p)\n", this, ret, loc);
4839
4840     if(this->strbuf) {
4841         basic_streambuf_char_pubimbue(this->strbuf, ret, loc);
4842         locale_dtor(ret);
4843     }
4844
4845     return ios_base_imbue(&this->base, ret, loc);
4846 }
4847
4848 /* ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDDD@Z */
4849 /* ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADDD@Z */
4850 DEFINE_THISCALL_WRAPPER(basic_ios_char_narrow, 12)
4851 char __thiscall basic_ios_char_narrow(basic_ios_char *this, char ch, char def)
4852 {
4853     TRACE("(%p %c %c)\n", this, ch, def);
4854     return ctype_char_narrow_ch(ctype_char_use_facet(this->strbuf->loc), ch, def);
4855 }
4856
4857 /* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PAV32@@Z */
4858 /* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PEAV32@@Z */
4859 DEFINE_THISCALL_WRAPPER(basic_ios_char_rdbuf_set, 8)
4860 basic_streambuf_char* __thiscall basic_ios_char_rdbuf_set(basic_ios_char *this, basic_streambuf_char *streambuf)
4861 {
4862     basic_streambuf_char *ret = this->strbuf;
4863
4864     TRACE("(%p %p)\n", this, streambuf);
4865
4866     this->strbuf = streambuf;
4867     basic_ios_char_clear(this, IOSTATE_goodbit);
4868     return ret;
4869 }
4870
4871 /* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ */
4872 /* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ */
4873 DEFINE_THISCALL_WRAPPER(basic_ios_char_rdbuf_get, 4)
4874 basic_streambuf_char* __thiscall basic_ios_char_rdbuf_get(const basic_ios_char *this)
4875 {
4876     TRACE("(%p)\n", this);
4877     return this->strbuf;
4878 }
4879
4880 /* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z */
4881 /* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z */
4882 DEFINE_THISCALL_WRAPPER(basic_ios_char_setstate_reraise, 12)
4883 void __thiscall basic_ios_char_setstate_reraise(basic_ios_char *this, IOSB_iostate state, MSVCP_bool reraise)
4884 {
4885     TRACE("(%p %x %x)\n", this, state, reraise);
4886
4887     if(state != IOSTATE_goodbit)
4888         basic_ios_char_clear_reraise(this, this->base.state | state, reraise);
4889 }
4890
4891 /* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z */
4892 /* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z */
4893 static void basic_ios_char_setstate(basic_ios_char *this, unsigned int state)
4894 {
4895     basic_ios_char_setstate_reraise(this, (IOSB_iostate)state, FALSE);
4896 }
4897
4898 /* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@PAV32@@Z */
4899 /* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@PEAV32@@Z */
4900 DEFINE_THISCALL_WRAPPER(basic_ios_char_tie_set, 8)
4901 basic_ostream_char* __thiscall basic_ios_char_tie_set(basic_ios_char *this, basic_ostream_char *ostream)
4902 {
4903     basic_ostream_char *ret = this->stream;
4904
4905     TRACE("(%p %p)\n", this, ostream);
4906
4907     this->stream = ostream;
4908     return ret;
4909 }
4910
4911 /* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ */
4912 /* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ */
4913 DEFINE_THISCALL_WRAPPER(basic_ios_char_tie_get, 4)
4914 basic_ostream_char* __thiscall basic_ios_char_tie_get(const basic_ios_char *this)
4915 {
4916     TRACE("(%p)\n", this);
4917     return this->stream;
4918 }
4919
4920 /* ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z */
4921 /* ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z */
4922 DEFINE_THISCALL_WRAPPER(basic_ios_char_widen, 8)
4923 char __thiscall basic_ios_char_widen(basic_ios_char *this, char ch)
4924 {
4925     TRACE("(%p %c)\n", this, ch);
4926     return ctype_char_widen_ch(ctype_char_use_facet(this->strbuf->loc), ch);
4927 }
4928
4929
4930 /* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAE@XZ */
4931 /* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ */
4932 static basic_ios_wchar* basic_ios_wchar_ctor(basic_ios_wchar *this)
4933 {
4934     TRACE("(%p)\n", this);
4935
4936     ios_base_ctor(&this->base);
4937     this->base.vtable = &MSVCP_basic_ios_wchar_vtable;
4938     return this;
4939 }
4940
4941 /* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IAE@XZ */
4942 /* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IEAA@XZ */
4943 DEFINE_THISCALL_WRAPPER(basic_ios_short_ctor, 4)
4944 basic_ios_wchar* __thiscall basic_ios_short_ctor(basic_ios_wchar *this)
4945 {
4946     basic_ios_wchar_ctor(this);
4947     this->base.vtable = &MSVCP_basic_ios_short_vtable;
4948     return this;
4949 }
4950
4951 /* ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAEXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z */
4952 /* ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z */
4953 /* ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IAEXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z */
4954 /* ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z */
4955 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_init, 12)
4956 void __thiscall basic_ios_wchar_init(basic_ios_wchar *this, basic_streambuf_wchar *streambuf, MSVCP_bool isstd)
4957 {
4958     TRACE("(%p %p %x)\n", this, streambuf, isstd);
4959     ios_base__Init(&this->base);
4960     this->strbuf = streambuf;
4961     this->stream = NULL;
4962     this->fillch = ' ';
4963
4964     if(!streambuf)
4965         ios_base_setstate(&this->base, IOSTATE_badbit);
4966
4967     if(isstd)
4968         FIXME("standard streams not handled yet\n");
4969 }
4970
4971 /* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
4972 /* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
4973 static basic_ios_wchar* basic_ios_wchar_ctor_streambuf(basic_ios_wchar *this, basic_streambuf_wchar *strbuf)
4974 {
4975     TRACE("(%p %p)\n", this, strbuf);
4976
4977     basic_ios_wchar_ctor(this);
4978     basic_ios_wchar_init(this, strbuf, FALSE);
4979     return this;
4980 }
4981
4982 /* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
4983 /* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
4984 DEFINE_THISCALL_WRAPPER(basic_ios_short_ctor_streambuf, 8)
4985 basic_ios_wchar* __thiscall basic_ios_short_ctor_streambuf(basic_ios_wchar *this, basic_streambuf_wchar *strbuf)
4986 {
4987     basic_ios_wchar_ctor_streambuf(this, strbuf);
4988     this->base.vtable = &MSVCP_basic_ios_short_vtable;
4989     return this;
4990 }
4991
4992 /* ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
4993 /* ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
4994 /* ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UAE@XZ */
4995 /* ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UEAA@XZ */
4996 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_dtor, 4)
4997 void __thiscall basic_ios_wchar_dtor(basic_ios_wchar *this)
4998 {
4999     TRACE("(%p)\n", this);
5000     ios_base_dtor(&this->base);
5001 }
5002
5003 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_vector_dtor, 8)
5004 basic_ios_wchar* __thiscall basic_ios_wchar_vector_dtor(basic_ios_wchar *this, unsigned int flags)
5005 {
5006     TRACE("(%p %x)\n", this, flags);
5007     if(flags & 2) {
5008         /* we have an array, with the number of elements stored before the first object */
5009         INT_PTR i, *ptr = (INT_PTR *)this-1;
5010
5011         for(i=*ptr-1; i>=0; i--)
5012             basic_ios_wchar_dtor(this+i);
5013         MSVCRT_operator_delete(ptr);
5014     } else {
5015         basic_ios_wchar_dtor(this);
5016         if(flags & 1)
5017             MSVCRT_operator_delete(this);
5018     }
5019
5020     return this;
5021 }
5022
5023 /* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z */
5024 /* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z */
5025 /* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z */
5026 /* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z */
5027 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_clear_reraise, 12)
5028 void __thiscall basic_ios_wchar_clear_reraise(basic_ios_wchar *this, IOSB_iostate state, MSVCP_bool reraise)
5029 {
5030     TRACE("(%p %x %x)\n", this, state, reraise);
5031     ios_base_clear_reraise(&this->base, state | (this->strbuf ? IOSTATE_goodbit : IOSTATE_badbit), reraise);
5032 }
5033
5034 /* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z */
5035 /* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z */
5036 /* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z */
5037 /* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z */
5038 static void basic_ios_wchar_clear(basic_ios_wchar *this, unsigned int state)
5039 {
5040     basic_ios_wchar_clear_reraise(this, (IOSB_iostate)state, FALSE);
5041 }
5042
5043 /* ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEAAV12@ABV12@@Z */
5044 /* ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEBV12@@Z */
5045 /* ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEAAV12@ABV12@@Z */
5046 /* ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEBV12@@Z */
5047 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_copyfmt, 8)
5048 basic_ios_wchar* __thiscall basic_ios_wchar_copyfmt(basic_ios_wchar *this, basic_ios_wchar *copy)
5049 {
5050     TRACE("(%p %p)\n", this, copy);
5051     if(this == copy)
5052         return this;
5053
5054     this->stream = copy->stream;
5055     this->fillch = copy->fillch;
5056     ios_base_copyfmt(&this->base, &copy->base);
5057     return this;
5058 }
5059
5060 /* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE_W_W@Z */
5061 /* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA_W_W@Z */
5062 /* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEGG@Z */
5063 /* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAGG@Z */
5064 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_fill_set, 8)
5065 wchar_t __thiscall basic_ios_wchar_fill_set(basic_ios_wchar *this, wchar_t fill)
5066 {
5067     wchar_t ret = this->fillch;
5068
5069     TRACE("(%p %c)\n", this, fill);
5070
5071     this->fillch = fill;
5072     return ret;
5073 }
5074
5075 /* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ */
5076 /* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WXZ */
5077 /* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGXZ */
5078 /* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGXZ */
5079 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_fill_get, 4)
5080 wchar_t __thiscall basic_ios_wchar_fill_get(basic_ios_wchar *this)
5081 {
5082     TRACE("(%p)\n", this);
5083     return this->fillch;
5084 }
5085
5086 /* ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
5087 /* ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
5088 /* ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
5089 /* ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
5090 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_imbue, 12)
5091 locale *__thiscall basic_ios_wchar_imbue(basic_ios_wchar *this, locale *ret, const locale *loc)
5092 {
5093     TRACE("(%p %p %p)\n", this, ret, loc);
5094
5095     if(this->strbuf) {
5096         basic_streambuf_wchar_pubimbue(this->strbuf, ret, loc);
5097         locale_dtor(ret);
5098     }
5099
5100     return ios_base_imbue(&this->base, ret, loc);
5101 }
5102
5103 /* ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBED_WD@Z */
5104 /* ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAD_WD@Z */
5105 /* ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEDGD@Z */
5106 /* ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBADGD@Z */
5107 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_narrow, 12)
5108 char __thiscall basic_ios_wchar_narrow(basic_ios_wchar *this, wchar_t ch, char def)
5109 {
5110     TRACE("(%p %c %c)\n", this, ch, def);
5111     return ctype_wchar_narrow_ch(ctype_wchar_use_facet(this->strbuf->loc), ch, def);
5112 }
5113
5114 /* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PAV32@@Z */
5115 /* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PEAV32@@Z */
5116 /* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAV32@@Z */
5117 /* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PEAV32@@Z */
5118 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_rdbuf_set, 8)
5119 basic_streambuf_wchar* __thiscall basic_ios_wchar_rdbuf_set(basic_ios_wchar *this, basic_streambuf_wchar *streambuf)
5120 {
5121     basic_streambuf_wchar *ret = this->strbuf;
5122
5123     TRACE("(%p %p)\n", this, streambuf);
5124
5125     this->strbuf = streambuf;
5126     basic_ios_wchar_clear(this, IOSTATE_goodbit);
5127     return ret;
5128 }
5129
5130 /* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ */
5131 /* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ */
5132 /* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ */
5133 /* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ */
5134 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_rdbuf_get, 4)
5135 basic_streambuf_wchar* __thiscall basic_ios_wchar_rdbuf_get(const basic_ios_wchar *this)
5136 {
5137     TRACE("(%p)\n", this);
5138     return this->strbuf;
5139 }
5140
5141 /* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z */
5142 /* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z */
5143 /* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z */
5144 /* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z */
5145 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_setstate_reraise, 12)
5146 void __thiscall basic_ios_wchar_setstate_reraise(basic_ios_wchar *this, IOSB_iostate state, MSVCP_bool reraise)
5147 {
5148     TRACE("(%p %x %x)\n", this, state, reraise);
5149
5150     if(state != IOSTATE_goodbit)
5151         basic_ios_wchar_clear_reraise(this, this->base.state | state, reraise);
5152 }
5153
5154 /* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z */
5155 /* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z */
5156 /* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z */
5157 /* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z */
5158 static void basic_ios_wchar_setstate(basic_ios_wchar *this, IOSB_iostate state)
5159 {
5160     basic_ios_wchar_setstate_reraise(this, state, FALSE);
5161 }
5162
5163 /* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PAV32@@Z */
5164 /* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PEAV32@@Z */
5165 /* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@PAV32@@Z */
5166 /* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@PEAV32@@Z */
5167 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_tie_set, 8)
5168 basic_ostream_wchar* __thiscall basic_ios_wchar_tie_set(basic_ios_wchar *this, basic_ostream_wchar *ostream)
5169 {
5170     basic_ostream_wchar *ret = this->stream;
5171
5172     TRACE("(%p %p)\n", this, ostream);
5173
5174     this->stream = ostream;
5175     return ret;
5176 }
5177
5178 /* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ */
5179 /* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ */
5180 /* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ */
5181 /* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ */
5182 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_tie_get, 4)
5183 basic_ostream_wchar* __thiscall basic_ios_wchar_tie_get(const basic_ios_wchar *this)
5184 {
5185     TRACE("(%p)\n", this);
5186     return this->stream;
5187 }
5188
5189 /* ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WD@Z */
5190 /* ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WD@Z */
5191 /* ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGD@Z */
5192 /* ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGD@Z */
5193 DEFINE_THISCALL_WRAPPER(basic_ios_wchar_widen, 8)
5194 wchar_t __thiscall basic_ios_wchar_widen(basic_ios_wchar *this, char ch)
5195 {
5196     TRACE("(%p %c)\n", this, ch);
5197     return ctype_wchar_widen_ch(ctype_wchar_use_facet(this->strbuf->loc), ch);
5198 }
5199
5200 /* Caution: basic_ostream uses virtual inheritance.
5201  * All constructors have additional parameter that says if base class should be initialized.
5202  * Base class needs to be accessed using vbtable.
5203  */
5204 static inline basic_ios_char* basic_ostream_char_get_basic_ios(basic_ostream_char *this)
5205 {
5206     return (basic_ios_char*)((char*)this+this->vbtable[1]);
5207 }
5208
5209 static inline basic_ios_char* basic_ostream_char_to_basic_ios(basic_ostream_char *ptr)
5210 {
5211     return (basic_ios_char*)((char*)ptr+basic_ostream_char_vbtable[1]);
5212 }
5213
5214 static inline basic_ostream_char* basic_ostream_char_from_basic_ios(basic_ios_char *ptr)
5215 {
5216     return (basic_ostream_char*)((char*)ptr-basic_ostream_char_vbtable[1]);
5217 }
5218
5219 /* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
5220 /* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
5221 static basic_ostream_char* basic_ostream_char_ctor(basic_ostream_char *this,
5222         basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
5223 {
5224     basic_ios_char *base;
5225
5226     TRACE("(%p %p %d %d)\n", this, strbuf, isstd, virt_init);
5227
5228     if(virt_init) {
5229         this->vbtable = basic_ostream_char_vbtable;
5230         base = basic_ostream_char_get_basic_ios(this);
5231         basic_ios_char_ctor(base);
5232     }else {
5233         base = basic_ostream_char_get_basic_ios(this);
5234     }
5235
5236     base->base.vtable = &MSVCP_basic_ostream_char_vtable;
5237     basic_ios_char_init(base, strbuf, isstd);
5238     return this;
5239 }
5240
5241 /* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
5242 /* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
5243 static basic_ostream_char* basic_ostream_char_ctor_uninitialized(basic_ostream_char *this,
5244         int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
5245 {
5246     basic_ios_char *base;
5247
5248     TRACE("(%p %d %x)\n", this, uninitialized, addstd);
5249
5250     if(virt_init) {
5251         this->vbtable = basic_ostream_char_vbtable;
5252         base = basic_ostream_char_get_basic_ios(this);
5253         basic_ios_char_ctor(base);
5254     }else {
5255         base = basic_ostream_char_get_basic_ios(this);
5256     }
5257
5258     base->base.vtable = &MSVCP_basic_ostream_char_vtable;
5259     if(addstd)
5260         ios_base_Addstd(&base->base);
5261     return this;
5262 }
5263
5264 /* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAE@XZ */
5265 /* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
5266 DEFINE_THISCALL_WRAPPER(basic_ostream_char_dtor, 4)
5267 void __thiscall basic_ostream_char_dtor(basic_ios_char *base)
5268 {
5269     basic_ostream_char *this = basic_ostream_char_from_basic_ios(base);
5270
5271     /* don't destroy virtual base here */
5272     TRACE("(%p)\n", this);
5273 }
5274
5275 /* ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
5276 /* ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
5277 DEFINE_THISCALL_WRAPPER(basic_ostream_char_vbase_dtor, 4)
5278 void __thiscall basic_ostream_char_vbase_dtor(basic_ostream_char *this)
5279 {
5280     TRACE("(%p)\n", this);
5281     basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(this));
5282     basic_ios_char_dtor(basic_ostream_char_get_basic_ios(this));
5283 }
5284
5285 DEFINE_THISCALL_WRAPPER(basic_ostream_char_vector_dtor, 8)
5286 basic_ostream_char* __thiscall basic_ostream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
5287 {
5288     basic_ostream_char *this = basic_ostream_char_from_basic_ios(base);
5289
5290     TRACE("(%p %x)\n", this, flags);
5291
5292     if(flags & 2) {
5293         /* we have an array, with the number of elements stored before the first object */
5294         INT_PTR i, *ptr = (INT_PTR *)this-1;
5295
5296         for(i=*ptr-1; i>=0; i--)
5297             basic_ostream_char_vbase_dtor(this+i);
5298         MSVCRT_operator_delete(ptr);
5299     } else {
5300         basic_ostream_char_vbase_dtor(this);
5301         if(flags & 1)
5302             MSVCRT_operator_delete(this);
5303     }
5304
5305     return this;
5306 }
5307
5308 /* ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ */
5309 /* ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ */
5310 DEFINE_THISCALL_WRAPPER(basic_ostream_char_flush, 4)
5311 basic_ostream_char* __thiscall basic_ostream_char_flush(basic_ostream_char *this)
5312 {
5313     /* this function is not matching C++ specification */
5314     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5315
5316     TRACE("(%p)\n", this);
5317
5318     if(basic_ios_char_rdbuf_get(base) && ios_base_good(&base->base)
5319             && basic_streambuf_char_pubsync(basic_ios_char_rdbuf_get(base))==-1)
5320         basic_ios_char_setstate(base, IOSTATE_badbit);
5321     return this;
5322 }
5323
5324 /* ?flush@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z */
5325 /* ?flush@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
5326 basic_ostream_char* __cdecl flush_ostream_char(basic_ostream_char *ostream)
5327 {
5328     return basic_ostream_char_flush(ostream);
5329 }
5330
5331 /* ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
5332 /* ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
5333 static void basic_ostream_char__Osfx(basic_ostream_char *this)
5334 {
5335     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5336
5337     TRACE("(%p)\n", this);
5338
5339     if(base->base.fmtfl & FMTFLAG_unitbuf)
5340         basic_ostream_char_flush(this);
5341 }
5342
5343 /* ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
5344 /* ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
5345 DEFINE_THISCALL_WRAPPER(basic_ostream_char_osfx, 4)
5346 void __thiscall basic_ostream_char_osfx(basic_ostream_char *this)
5347 {
5348     TRACE("(%p)\n", this);
5349     basic_ostream_char__Osfx(this);
5350 }
5351
5352 static BOOL basic_ostream_char_sentry_create(basic_ostream_char *ostr)
5353 {
5354     basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
5355
5356     if(basic_ios_char_rdbuf_get(base))
5357         basic_streambuf_char__Lock(base->strbuf);
5358
5359     if(ios_base_good(&base->base) && base->stream)
5360         basic_ostream_char_flush(base->stream);
5361
5362     return ios_base_good(&base->base);
5363 }
5364
5365 static void basic_ostream_char_sentry_destroy(basic_ostream_char *ostr)
5366 {
5367     basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
5368
5369     if(ios_base_good(&base->base) && !__uncaught_exception())
5370         basic_ostream_char_osfx(ostr);
5371
5372     if(basic_ios_char_rdbuf_get(base))
5373         basic_streambuf_char__Unlock(base->strbuf);
5374 }
5375
5376 /* ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE_NXZ */
5377 /* ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA_NXZ */
5378 DEFINE_THISCALL_WRAPPER(basic_ostream_char_opfx, 4)
5379 MSVCP_bool __thiscall basic_ostream_char_opfx(basic_ostream_char *this)
5380 {
5381     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5382
5383     TRACE("(%p)\n", this);
5384
5385     if(ios_base_good(&base->base) && base->stream)
5386         basic_ostream_char_flush(base->stream);
5387     return ios_base_good(&base->base);
5388 }
5389
5390 /* ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z */
5391 /* ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z */
5392 DEFINE_THISCALL_WRAPPER(basic_ostream_char_put, 8)
5393 basic_ostream_char* __thiscall basic_ostream_char_put(basic_ostream_char *this, char ch)
5394 {
5395     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5396
5397     TRACE("(%p %c)\n", this, ch);
5398
5399     if(!basic_ostream_char_sentry_create(this)
5400             || basic_streambuf_char_sputc(base->strbuf, ch)==EOF) {
5401         basic_ostream_char_sentry_destroy(this);
5402         basic_ios_char_setstate(base, IOSTATE_badbit);
5403         return this;
5404     }
5405
5406     basic_ostream_char_sentry_destroy(this);
5407     return this;
5408 }
5409
5410 /* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
5411 /* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
5412 DEFINE_THISCALL_WRAPPER(basic_ostream_char_seekp_fpos, 28)
5413 basic_ostream_char* __thiscall basic_ostream_char_seekp_fpos(basic_ostream_char *this, fpos_int pos)
5414 {
5415     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5416
5417     TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
5418
5419     if(!ios_base_fail(&base->base)) {
5420         fpos_int seek;
5421
5422         basic_streambuf_char_pubseekpos(basic_ios_char_rdbuf_get(base),
5423                 &seek, pos, OPENMODE_out);
5424         if(seek.off==0 && seek.pos==-1 && seek.state==0)
5425             basic_ios_char_setstate(base, IOSTATE_failbit);
5426     }
5427     return this;
5428 }
5429
5430 /* ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ */
5431 /* ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
5432 DEFINE_THISCALL_WRAPPER(basic_ostream_char_tellp, 8)
5433 fpos_int* __thiscall basic_ostream_char_tellp(basic_ostream_char *this, fpos_int *ret)
5434 {
5435     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5436
5437     TRACE("(%p)\n", this);
5438
5439     if(!ios_base_fail(&base->base)) {
5440         basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
5441                 ret, 0, SEEKDIR_cur, OPENMODE_out);
5442     }else {
5443         ret->off = 0;
5444         ret->pos = -1;
5445         ret->state = 0;
5446     }
5447     return ret;
5448 }
5449
5450 /* ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@PBDH@Z */
5451 /* ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEBD_J@Z */
5452 DEFINE_THISCALL_WRAPPER(basic_ostream_char_write, 12)
5453 basic_ostream_char* __thiscall basic_ostream_char_write(basic_ostream_char *this, const char *str, streamsize count)
5454 {
5455     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5456
5457     TRACE("(%p %s %ld)\n", this, debugstr_a(str), count);
5458
5459     if(!basic_ostream_char_sentry_create(this)
5460             || basic_streambuf_char_sputn(base->strbuf, str, count)!=count) {
5461         basic_ostream_char_sentry_destroy(this);
5462         basic_ios_char_setstate(base, IOSTATE_badbit);
5463         return this;
5464     }
5465
5466     basic_ostream_char_sentry_destroy(this);
5467     return this;
5468 }
5469
5470 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@F@Z */
5471 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@F@Z */
5472 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_short, 8)
5473 basic_ostream_char* __thiscall basic_ostream_char_print_short(basic_ostream_char *this, short val)
5474 {
5475     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5476     int state = IOSTATE_goodbit;
5477
5478     TRACE("(%p %d)\n", this, val);
5479
5480     if(basic_ostream_char_sentry_create(this)) {
5481         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5482         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5483         ostreambuf_iterator_char dest = {0, strbuf};
5484
5485         num_put_char_put_long(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base),
5486                 (ios_base_flags_get(&base->base) & FMTFLAG_basefield & (FMTFLAG_oct | FMTFLAG_hex))
5487                 ? (LONG)((unsigned short)val) : (LONG)val);
5488     }
5489     basic_ostream_char_sentry_destroy(this);
5490
5491     basic_ios_char_setstate(base, state);
5492     return this;
5493 }
5494
5495 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@G@Z */
5496 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@G@Z */
5497 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ushort, 8)
5498 basic_ostream_char* __thiscall basic_ostream_char_print_ushort(basic_ostream_char *this, unsigned short val)
5499 {
5500     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5501     int state = IOSTATE_goodbit;
5502
5503     TRACE("(%p %u)\n", this, val);
5504
5505     if(basic_ostream_char_sentry_create(this)) {
5506         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5507         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5508         ostreambuf_iterator_char dest = {0, strbuf};
5509
5510         num_put_char_put_ulong(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5511     }
5512     basic_ostream_char_sentry_destroy(this);
5513
5514     basic_ios_char_setstate(base, state);
5515     return this;
5516 }
5517
5518 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z */
5519 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z */
5520 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@J@Z */
5521 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@J@Z */
5522 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_int, 8)
5523 basic_ostream_char* __thiscall basic_ostream_char_print_int(basic_ostream_char *this, int val)
5524 {
5525     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5526     int state = IOSTATE_goodbit;
5527
5528     TRACE("(%p %d)\n", this, val);
5529
5530     if(basic_ostream_char_sentry_create(this)) {
5531         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5532         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5533         ostreambuf_iterator_char dest = {0, strbuf};
5534
5535         num_put_char_put_long(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5536     }
5537     basic_ostream_char_sentry_destroy(this);
5538
5539     basic_ios_char_setstate(base, state);
5540     return this;
5541 }
5542
5543 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@I@Z */
5544 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@I@Z */
5545 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@K@Z */
5546 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z */
5547 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_uint, 8)
5548 basic_ostream_char* __thiscall basic_ostream_char_print_uint(basic_ostream_char *this, unsigned int val)
5549 {
5550     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5551     int state = IOSTATE_goodbit;
5552
5553     TRACE("(%p %u)\n", this, val);
5554
5555     if(basic_ostream_char_sentry_create(this)) {
5556         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5557         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5558         ostreambuf_iterator_char dest = {0, strbuf};
5559
5560         num_put_char_put_ulong(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5561     }
5562     basic_ostream_char_sentry_destroy(this);
5563
5564     basic_ios_char_setstate(base, state);
5565     return this;
5566 }
5567
5568 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@M@Z */
5569 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@M@Z */
5570 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_float, 8)
5571 basic_ostream_char* __thiscall basic_ostream_char_print_float(basic_ostream_char *this, float val)
5572 {
5573     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5574     int state = IOSTATE_goodbit;
5575
5576     TRACE("(%p %f)\n", this, val);
5577
5578     if(basic_ostream_char_sentry_create(this)) {
5579         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5580         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5581         ostreambuf_iterator_char dest = {0, strbuf};
5582
5583         num_put_char_put_double(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5584     }
5585     basic_ostream_char_sentry_destroy(this);
5586
5587     basic_ios_char_setstate(base, state);
5588     return this;
5589 }
5590
5591 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z */
5592 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@N@Z */
5593 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_double, 12)
5594 basic_ostream_char* __thiscall basic_ostream_char_print_double(basic_ostream_char *this, double val)
5595 {
5596     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5597     int state = IOSTATE_goodbit;
5598
5599     TRACE("(%p %lf)\n", this, val);
5600
5601     if(basic_ostream_char_sentry_create(this)) {
5602         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5603         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5604         ostreambuf_iterator_char dest = {0, strbuf};
5605
5606         num_put_char_put_double(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5607     }
5608     basic_ostream_char_sentry_destroy(this);
5609
5610     basic_ios_char_setstate(base, state);
5611     return this;
5612 }
5613
5614 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@O@Z */
5615 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@O@Z */
5616 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ldouble, 12)
5617 basic_ostream_char* __thiscall basic_ostream_char_print_ldouble(basic_ostream_char *this, double val)
5618 {
5619     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5620     int state = IOSTATE_goodbit;
5621
5622     TRACE("(%p %lf)\n", this, val);
5623
5624     if(basic_ostream_char_sentry_create(this)) {
5625         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5626         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5627         ostreambuf_iterator_char dest = {0, strbuf};
5628
5629         num_put_char_put_ldouble(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5630     }
5631     basic_ostream_char_sentry_destroy(this);
5632
5633     basic_ios_char_setstate(base, state);
5634     return this;
5635 }
5636
5637 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
5638 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
5639 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_streambuf, 8)
5640 basic_ostream_char* __thiscall basic_ostream_char_print_streambuf(basic_ostream_char *this, basic_streambuf_char *val)
5641 {
5642     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5643     IOSB_iostate state = IOSTATE_badbit;
5644     int c = '\n';
5645
5646     TRACE("(%p %p)\n", this, val);
5647
5648     if(basic_ostream_char_sentry_create(this)) {
5649         for(c = basic_streambuf_char_sgetc(val); c!=EOF;
5650                 c = basic_streambuf_char_snextc(val)) {
5651             state = IOSTATE_goodbit;
5652
5653             if(basic_streambuf_char_sputc(base->strbuf, c) == EOF) {
5654                 state = IOSTATE_badbit;
5655                 break;
5656             }
5657         }
5658     }else {
5659         state = IOSTATE_badbit;
5660     }
5661     basic_ostream_char_sentry_destroy(this);
5662
5663     ios_base_width_set(&base->base, 0);
5664     basic_ios_char_setstate(base, state);
5665     return this;
5666 }
5667
5668 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PBX@Z */
5669 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEBX@Z */
5670 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ptr, 8)
5671 basic_ostream_char* __thiscall basic_ostream_char_print_ptr(basic_ostream_char *this, const void *val)
5672 {
5673     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5674     int state = IOSTATE_goodbit;
5675
5676     TRACE("(%p %p)\n", this, val);
5677
5678     if(basic_ostream_char_sentry_create(this)) {
5679         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5680         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5681         ostreambuf_iterator_char dest = {0, strbuf};
5682
5683         num_put_char_put_ptr(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5684     }
5685     basic_ostream_char_sentry_destroy(this);
5686
5687     basic_ios_char_setstate(base, state);
5688     return this;
5689 }
5690
5691 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_J@Z */
5692 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_J@Z */
5693 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_int64, 12)
5694 basic_ostream_char* __thiscall basic_ostream_char_print_int64(basic_ostream_char *this, __int64 val)
5695 {
5696     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5697     int state = IOSTATE_goodbit;
5698
5699     TRACE("(%p)\n", this);
5700
5701     if(basic_ostream_char_sentry_create(this)) {
5702         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5703         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5704         ostreambuf_iterator_char dest = {0, strbuf};
5705
5706         num_put_char_put_int64(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5707     }
5708     basic_ostream_char_sentry_destroy(this);
5709
5710     basic_ios_char_setstate(base, state);
5711     return this;
5712 }
5713
5714 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_K@Z */
5715 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z */
5716 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_uint64, 12)
5717 basic_ostream_char* __thiscall basic_ostream_char_print_uint64(basic_ostream_char *this, unsigned __int64 val)
5718 {
5719     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5720     int state = IOSTATE_goodbit;
5721
5722     TRACE("(%p)\n", this);
5723
5724     if(basic_ostream_char_sentry_create(this)) {
5725         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5726         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5727         ostreambuf_iterator_char dest = {0, strbuf};
5728
5729         num_put_char_put_uint64(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5730     }
5731     basic_ostream_char_sentry_destroy(this);
5732
5733     basic_ios_char_setstate(base, state);
5734     return this;
5735 }
5736
5737 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_N@Z */
5738 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z */
5739 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_bool, 8)
5740 basic_ostream_char* __thiscall basic_ostream_char_print_bool(basic_ostream_char *this, MSVCP_bool val)
5741 {
5742     basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
5743     int state = IOSTATE_goodbit;
5744
5745     TRACE("(%p %x)\n", this, val);
5746
5747     if(basic_ostream_char_sentry_create(this)) {
5748         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
5749         const num_put *numput = num_put_char_use_facet(strbuf->loc);
5750         ostreambuf_iterator_char dest = {0, strbuf};
5751
5752         num_put_char_put_bool(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
5753     }
5754     basic_ostream_char_sentry_destroy(this);
5755
5756     basic_ios_char_setstate(base, state);
5757     return this;
5758 }
5759
5760 /* ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z */
5761 /* ?endl@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
5762 basic_ostream_char* __cdecl basic_ostream_char_endl(basic_ostream_char *ostr)
5763 {
5764     TRACE("(%p)\n", ostr);
5765
5766     basic_ostream_char_put(ostr, '\n');
5767     basic_ostream_char_flush(ostr);
5768     return ostr;
5769 }
5770
5771 /* $?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */
5772 /* ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */
5773 basic_ostream_char* __cdecl basic_ostream_char_print_bstr(basic_ostream_char *ostr, const basic_string_char *str)
5774 {
5775     basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
5776     IOSB_iostate state = IOSTATE_goodbit;
5777
5778     TRACE("(%p %p)\n", ostr, str);
5779
5780     if(basic_ostream_char_sentry_create(ostr)) {
5781         MSVCP_size_t len = basic_string_char_length(str);
5782         streamsize pad = (base->base.wide>len ? base->base.wide-len : 0);
5783
5784         if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
5785             for(; pad!=0; pad--) {
5786                 if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
5787                     state = IOSTATE_badbit;
5788                     break;
5789                 }
5790             }
5791         }
5792
5793         if(state == IOSTATE_goodbit) {
5794             if(basic_streambuf_char_sputn(base->strbuf, basic_string_char_c_str(str), len) != len)
5795                     state = IOSTATE_badbit;
5796         }
5797
5798         if(state == IOSTATE_goodbit) {
5799             for(; pad!=0; pad--) {
5800                 if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
5801                     state = IOSTATE_badbit;
5802                     break;
5803                 }
5804             }
5805         }
5806
5807         base->base.wide = 0;
5808     }else {
5809         state = IOSTATE_badbit;
5810     }
5811     basic_ostream_char_sentry_destroy(ostr);
5812
5813     basic_ios_char_setstate(base, state);
5814     return ostr;
5815 }
5816
5817 /* ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@C@Z */
5818 /* ??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@C@Z */
5819 /* ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@D@Z */
5820 /* ??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@D@Z */
5821 /* ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@E@Z */
5822 /* ??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@E@Z */
5823 basic_ostream_char* __cdecl basic_ostream_char_print_ch(basic_ostream_char *ostr, char ch)
5824 {
5825     basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
5826     IOSB_iostate state = IOSTATE_goodbit;
5827
5828     TRACE("(%p %d)\n", ostr, ch);
5829
5830     if(basic_ostream_char_sentry_create(ostr)) {
5831         streamsize pad = (base->base.wide>1 ? base->base.wide-1 : 0);
5832
5833         if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
5834             for(; pad!=0; pad--) {
5835                 if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
5836                     state = IOSTATE_badbit;
5837                     break;
5838                 }
5839             }
5840         }
5841
5842         if(state == IOSTATE_goodbit) {
5843             if(basic_streambuf_char_sputc(base->strbuf, ch) == EOF)
5844                 state = IOSTATE_badbit;
5845         }
5846
5847         if(state == IOSTATE_goodbit) {
5848             for(; pad!=0; pad--) {
5849                 if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
5850                     state = IOSTATE_badbit;
5851                     break;
5852                 }
5853             }
5854         }
5855
5856         base->base.wide = 0;
5857     }else {
5858         state = IOSTATE_badbit;
5859     }
5860     basic_ostream_char_sentry_destroy(ostr);
5861
5862     basic_ios_char_setstate(base, state);
5863     return ostr;
5864 }
5865
5866 /* ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBC@Z */
5867 /* ??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBC@Z */
5868 /* ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z */
5869 /* ??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z */
5870 /* ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBE@Z */
5871 /* ??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBE@Z */
5872 basic_ostream_char* __cdecl basic_ostream_char_print_str(basic_ostream_char *ostr, const char *str)
5873 {
5874     basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
5875     IOSB_iostate state = IOSTATE_goodbit;
5876
5877     TRACE("(%p %s)\n", ostr, str);
5878
5879     if(basic_ostream_char_sentry_create(ostr)) {
5880         MSVCP_size_t len = strlen(str);
5881         streamsize pad = (base->base.wide>len ? base->base.wide-len : 0);
5882
5883         if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
5884             for(; pad!=0; pad--) {
5885                 if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
5886                     state = IOSTATE_badbit;
5887                     break;
5888                 }
5889             }
5890         }
5891
5892         if(state == IOSTATE_goodbit) {
5893             if(basic_streambuf_char_sputn(base->strbuf, str, len) != len)
5894                 state = IOSTATE_badbit;
5895         }
5896
5897         if(state == IOSTATE_goodbit) {
5898             for(; pad!=0; pad--) {
5899                 if(basic_streambuf_char_sputc(base->strbuf, base->fillch) == EOF) {
5900                     state = IOSTATE_badbit;
5901                     break;
5902                 }
5903             }
5904         }
5905
5906         base->base.wide = 0;
5907     }else {
5908         state = IOSTATE_badbit;
5909     }
5910     basic_ostream_char_sentry_destroy(ostr);
5911
5912     basic_ios_char_setstate(base, state);
5913     return ostr;
5914 }
5915
5916 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
5917 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
5918 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func, 8)
5919 basic_ostream_char* __thiscall basic_ostream_char_print_func(basic_ostream_char *this,
5920         basic_ostream_char* (__cdecl *pfunc)(basic_ostream_char*))
5921 {
5922     TRACE("(%p %p)\n", this, pfunc);
5923     pfunc(this);
5924     return this;
5925 }
5926
5927 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z */
5928 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z */
5929 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func_basic_ios, 8)
5930 basic_ostream_char* __thiscall basic_ostream_char_print_func_basic_ios(basic_ostream_char *this,
5931         basic_ios_char* (__cdecl *pfunc)(basic_ios_char*))
5932 {
5933     TRACE("(%p %p)\n", this, pfunc);
5934     pfunc(basic_ostream_char_get_basic_ios(this));
5935     return this;
5936 }
5937
5938 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
5939 /* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
5940 DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func_ios_base, 8)
5941 basic_ostream_char* __thiscall basic_ostream_char_print_func_ios_base(
5942         basic_ostream_char *this, ios_base* (__cdecl *pfunc)(ios_base*))
5943 {
5944     TRACE("(%p %p)\n", this, pfunc);
5945     pfunc(&basic_ostream_char_get_basic_ios(this)->base);
5946     return this;
5947 }
5948
5949 /* Caution: basic_ostream uses virtual inheritance. */
5950 static inline basic_ios_wchar* basic_ostream_wchar_get_basic_ios(basic_ostream_wchar *this)
5951 {
5952     return (basic_ios_wchar*)((char*)this+this->vbtable[1]);
5953 }
5954
5955 static inline basic_ios_wchar* basic_ostream_wchar_to_basic_ios(basic_ostream_wchar *ptr)
5956 {
5957     return (basic_ios_wchar*)((char*)ptr+basic_ostream_wchar_vbtable[1]);
5958 }
5959
5960 static inline basic_ostream_wchar* basic_ostream_wchar_from_basic_ios(basic_ios_wchar *ptr)
5961 {
5962     return (basic_ostream_wchar*)((char*)ptr-basic_ostream_wchar_vbtable[1]);
5963 }
5964
5965 /* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
5966 /* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
5967 static basic_ostream_wchar* basic_ostream_wchar_ctor(basic_ostream_wchar *this,
5968         basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
5969 {
5970     basic_ios_wchar *base;
5971
5972     TRACE("(%p %p %d %d)\n", this, strbuf, isstd, virt_init);
5973
5974     if(virt_init) {
5975         this->vbtable = basic_ostream_wchar_vbtable;
5976         base = basic_ostream_wchar_get_basic_ios(this);
5977         basic_ios_wchar_ctor(base);
5978     }else {
5979         base = basic_ostream_wchar_get_basic_ios(this);
5980     }
5981
5982     base->base.vtable = &MSVCP_basic_ostream_wchar_vtable;
5983     basic_ios_wchar_init(base, strbuf, isstd);
5984     return this;
5985 }
5986
5987 /* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
5988 /* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
5989 static basic_ostream_wchar* basic_ostream_short_ctor(basic_ostream_wchar *this,
5990         basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
5991 {
5992     basic_ostream_wchar_ctor(this, strbuf, isstd, virt_init);
5993     basic_ostream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_ostream_short_vtable;
5994     return this;
5995 }
5996
5997 /* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
5998 /* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
5999 static basic_ostream_wchar* basic_ostream_wchar_ctor_uninitialized(basic_ostream_wchar *this,
6000         int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
6001 {
6002     basic_ios_wchar *base;
6003
6004     TRACE("(%p %d %x)\n", this, uninitialized, addstd);
6005
6006     if(virt_init) {
6007         this->vbtable = basic_ostream_wchar_vbtable;
6008         base = basic_ostream_wchar_get_basic_ios(this);
6009         basic_ios_wchar_ctor(base);
6010     }else {
6011         base = basic_ostream_wchar_get_basic_ios(this);
6012     }
6013
6014     base->base.vtable = &MSVCP_basic_ostream_wchar_vtable;
6015     if(addstd)
6016         ios_base_Addstd(&base->base);
6017     return this;
6018 }
6019
6020 /* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
6021 /* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
6022 /* ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UAE@XZ */
6023 /* ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
6024 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_dtor, 4)
6025 void __thiscall basic_ostream_wchar_dtor(basic_ios_wchar *base)
6026 {
6027     basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base);
6028
6029     /* don't destroy virtual base here */
6030     TRACE("(%p)\n", this);
6031 }
6032
6033 /* ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
6034 /* ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
6035 /* ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
6036 /* ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
6037 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_vbase_dtor, 4)
6038 void __thiscall basic_ostream_wchar_vbase_dtor(basic_ostream_wchar *this)
6039 {
6040     TRACE("(%p)\n", this);
6041     basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(this));
6042     basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(this));
6043 }
6044
6045 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_vector_dtor, 8)
6046 basic_ostream_wchar* __thiscall basic_ostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
6047 {
6048     basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base);
6049
6050     TRACE("(%p %x)\n", this, flags);
6051
6052     if(flags & 2) {
6053         /* we have an array, with the number of elements stored before the first object */
6054         INT_PTR i, *ptr = (INT_PTR *)this-1;
6055
6056         for(i=*ptr-1; i>=0; i--)
6057             basic_ostream_wchar_vbase_dtor(this+i);
6058         MSVCRT_operator_delete(ptr);
6059     } else {
6060         basic_ostream_wchar_vbase_dtor(this);
6061         if(flags & 1)
6062             MSVCRT_operator_delete(this);
6063     }
6064
6065     return this;
6066 }
6067
6068 /* ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ */
6069 /* ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ */
6070 /* ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ */
6071 /* ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ */
6072 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_flush, 4)
6073 basic_ostream_wchar* __thiscall basic_ostream_wchar_flush(basic_ostream_wchar *this)
6074 {
6075     /* this function is not matching C++ specification */
6076     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6077
6078     TRACE("(%p)\n", this);
6079
6080     if(basic_ios_wchar_rdbuf_get(base) && ios_base_good(&base->base)
6081             && basic_streambuf_wchar_pubsync(basic_ios_wchar_rdbuf_get(base))==-1)
6082         basic_ios_wchar_setstate(base, IOSTATE_badbit);
6083     return this;
6084 }
6085
6086 /* ?flush@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
6087 /* ?flush@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
6088 /* ?flush@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@1@AAV21@@Z */
6089 /* ?flush@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
6090 basic_ostream_wchar* __cdecl flush_ostream_wchar(basic_ostream_wchar *ostream)
6091 {
6092     return basic_ostream_wchar_flush(ostream);
6093 }
6094
6095 /* ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
6096 /* ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
6097 /* ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
6098 /* ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
6099 static void basic_ostream_wchar__Osfx(basic_ostream_wchar *this)
6100 {
6101     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6102
6103     TRACE("(%p)\n", this);
6104
6105     if(base->base.fmtfl & FMTFLAG_unitbuf)
6106         basic_ostream_wchar_flush(this);
6107 }
6108
6109 /* ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
6110 /* ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
6111 /* ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
6112 /* ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
6113 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_osfx, 4)
6114 void __thiscall basic_ostream_wchar_osfx(basic_ostream_wchar *this)
6115 {
6116     TRACE("(%p)\n", this);
6117     basic_ostream_wchar__Osfx(this);
6118 }
6119
6120 static BOOL basic_ostream_wchar_sentry_create(basic_ostream_wchar *ostr)
6121 {
6122     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
6123
6124     if(basic_ios_wchar_rdbuf_get(base))
6125         basic_streambuf_wchar__Lock(base->strbuf);
6126
6127     if(ios_base_good(&base->base) && base->stream)
6128         basic_ostream_wchar_flush(base->stream);
6129
6130     return ios_base_good(&base->base);
6131 }
6132
6133 static void basic_ostream_wchar_sentry_destroy(basic_ostream_wchar *ostr)
6134 {
6135     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
6136
6137     if(ios_base_good(&base->base) && !__uncaught_exception())
6138         basic_ostream_wchar_osfx(ostr);
6139
6140     if(basic_ios_wchar_rdbuf_get(base))
6141         basic_streambuf_wchar__Unlock(base->strbuf);
6142 }
6143
6144 /* ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE_NXZ */
6145 /* ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA_NXZ */
6146 /* ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE_NXZ */
6147 /* ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA_NXZ */
6148 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_opfx, 4)
6149 MSVCP_bool __thiscall basic_ostream_wchar_opfx(basic_ostream_wchar *this)
6150 {
6151     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6152
6153     TRACE("(%p)\n", this);
6154
6155     if(ios_base_good(&base->base) && base->stream)
6156         basic_ostream_wchar_flush(base->stream);
6157     return ios_base_good(&base->base);
6158 }
6159
6160 /* ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z */
6161 /* ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z */
6162 /* ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z */
6163 /* ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z */
6164 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_put, 8)
6165 basic_ostream_wchar* __thiscall basic_ostream_wchar_put(basic_ostream_wchar *this, wchar_t ch)
6166 {
6167     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6168
6169     TRACE("(%p %c)\n", this, ch);
6170
6171     if(!basic_ostream_wchar_sentry_create(this)
6172             || basic_streambuf_wchar_sputc(base->strbuf, ch)==WEOF) {
6173         basic_ostream_wchar_sentry_destroy(this);
6174         basic_ios_wchar_setstate(base, IOSTATE_badbit);
6175         return this;
6176     }
6177
6178     basic_ostream_wchar_sentry_destroy(this);
6179     return this;
6180 }
6181
6182 /* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
6183 /* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
6184 /* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
6185 /* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
6186 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_seekp_fpos, 28)
6187 basic_ostream_wchar* __thiscall basic_ostream_wchar_seekp_fpos(basic_ostream_wchar *this, fpos_int pos)
6188 {
6189     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6190
6191     TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
6192
6193     if(!ios_base_fail(&base->base)) {
6194         fpos_int seek;
6195
6196         basic_streambuf_wchar_pubseekpos(basic_ios_wchar_rdbuf_get(base),
6197                 &seek, pos, OPENMODE_out);
6198         if(seek.off==0 && seek.pos==-1 && seek.state==0)
6199             basic_ios_wchar_setstate(base, IOSTATE_failbit);
6200     }
6201     return this;
6202 }
6203
6204 /* ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ */
6205 /* ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
6206 /* ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ */
6207 /* ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
6208 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_tellp, 8)
6209 fpos_int* __thiscall basic_ostream_wchar_tellp(basic_ostream_wchar *this, fpos_int *ret)
6210 {
6211     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6212
6213     TRACE("(%p)\n", this);
6214
6215     if(!ios_base_fail(&base->base)) {
6216         basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
6217                 ret, 0, SEEKDIR_cur, OPENMODE_out);
6218     }else {
6219         ret->off = 0;
6220         ret->pos = -1;
6221         ret->state = 0;
6222     }
6223     return ret;
6224 }
6225
6226 /* ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PB_WH@Z */
6227 /* ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEB_W_J@Z */
6228 /* ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@PBGH@Z */
6229 /* ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEBG_J@Z */
6230 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_write, 12)
6231 basic_ostream_wchar* __thiscall basic_ostream_wchar_write(basic_ostream_wchar *this, const wchar_t *str, streamsize count)
6232 {
6233     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6234
6235     TRACE("(%p %s %ld)\n", this, debugstr_w(str), count);
6236
6237     if(!basic_ostream_wchar_sentry_create(this)
6238             || basic_streambuf_wchar_sputn(base->strbuf, str, count)!=count) {
6239         basic_ostream_wchar_sentry_destroy(this);
6240         basic_ios_wchar_setstate(base, IOSTATE_badbit);
6241         return this;
6242     }
6243
6244     basic_ostream_wchar_sentry_destroy(this);
6245     return this;
6246 }
6247
6248 static basic_ostream_wchar* basic_ostream_print_short(basic_ostream_wchar *this, short val, const num_put *numput)
6249 {
6250     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6251     int state = IOSTATE_goodbit;
6252
6253     TRACE("(%p %d)\n", this, val);
6254
6255     if(basic_ostream_wchar_sentry_create(this)) {
6256         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6257         ostreambuf_iterator_wchar dest = {0, strbuf};
6258
6259         num_put_wchar_put_long(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base),
6260                 (ios_base_flags_get(&base->base) & FMTFLAG_basefield & (FMTFLAG_oct | FMTFLAG_hex))
6261                 ? (LONG)((unsigned short)val) : (LONG)val);
6262     }
6263     basic_ostream_wchar_sentry_destroy(this);
6264
6265     basic_ios_wchar_setstate(base, state);
6266     return this;
6267 }
6268
6269 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@F@Z */
6270 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@F@Z */
6271 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_short, 8)
6272 basic_ostream_wchar* __thiscall basic_ostream_short_print_short(basic_ostream_wchar *this, short val)
6273 {
6274     return basic_ostream_print_short(this, val, num_put_short_use_facet(
6275                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6276 }
6277
6278 static basic_ostream_wchar* basic_ostream_print_int(basic_ostream_wchar *this, int val, const num_put *numput)
6279 {
6280     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6281     int state = IOSTATE_goodbit;
6282
6283     TRACE("(%p %d)\n", this, val);
6284
6285     if(basic_ostream_wchar_sentry_create(this)) {
6286         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6287         ostreambuf_iterator_wchar dest = {0, strbuf};
6288
6289         num_put_wchar_put_long(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6290     }
6291     basic_ostream_wchar_sentry_destroy(this);
6292
6293     basic_ios_wchar_setstate(base, state);
6294     return this;
6295 }
6296
6297 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@H@Z */
6298 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@H@Z */
6299 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@J@Z */
6300 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@J@Z */
6301 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_int, 8)
6302 basic_ostream_wchar* __thiscall basic_ostream_short_print_int(basic_ostream_wchar *this, int val)
6303 {
6304     return basic_ostream_print_int(this, val, num_put_short_use_facet(
6305                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6306 }
6307
6308 static basic_ostream_wchar* basic_ostream_print_uint(basic_ostream_wchar *this, unsigned int val, const num_put *numput)
6309 {
6310     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6311     int state = IOSTATE_goodbit;
6312
6313     TRACE("(%p %u)\n", this, val);
6314
6315     if(basic_ostream_wchar_sentry_create(this)) {
6316         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6317         ostreambuf_iterator_wchar dest = {0, strbuf};
6318
6319         num_put_wchar_put_ulong(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6320     }
6321     basic_ostream_wchar_sentry_destroy(this);
6322
6323     basic_ios_wchar_setstate(base, state);
6324     return this;
6325 }
6326
6327 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@I@Z */
6328 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@I@Z */
6329 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@K@Z */
6330 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@K@Z */
6331 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_uint, 8)
6332 basic_ostream_wchar* __thiscall basic_ostream_short_print_uint(basic_ostream_wchar *this, unsigned int val)
6333 {
6334     return basic_ostream_print_uint(this, val, num_put_short_use_facet(
6335                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6336 }
6337
6338 static basic_ostream_wchar* basic_ostream_print_float(basic_ostream_wchar *this, float val, const num_put *numput)
6339 {
6340     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6341     int state = IOSTATE_goodbit;
6342
6343     TRACE("(%p %f)\n", this, val);
6344
6345     if(basic_ostream_wchar_sentry_create(this)) {
6346         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6347         ostreambuf_iterator_wchar dest = {0, strbuf};
6348
6349         num_put_wchar_put_double(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6350     }
6351     basic_ostream_wchar_sentry_destroy(this);
6352
6353     basic_ios_wchar_setstate(base, state);
6354     return this;
6355 }
6356
6357 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@M@Z */
6358 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@M@Z */
6359 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_float, 8)
6360 basic_ostream_wchar* __thiscall basic_ostream_short_print_float(basic_ostream_wchar *this, float val)
6361 {
6362     return basic_ostream_print_float(this, val, num_put_short_use_facet(
6363                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6364 }
6365
6366 static basic_ostream_wchar* basic_ostream_print_double(basic_ostream_wchar *this, double val, const num_put *numput)
6367 {
6368     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6369     int state = IOSTATE_goodbit;
6370
6371     TRACE("(%p %lf)\n", this, val);
6372
6373     if(basic_ostream_wchar_sentry_create(this)) {
6374         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6375         ostreambuf_iterator_wchar dest = {0, strbuf};
6376
6377         num_put_wchar_put_double(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6378     }
6379     basic_ostream_wchar_sentry_destroy(this);
6380
6381     basic_ios_wchar_setstate(base, state);
6382     return this;
6383 }
6384
6385 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@N@Z */
6386 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@N@Z */
6387 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_double, 12)
6388 basic_ostream_wchar* __thiscall basic_ostream_short_print_double(basic_ostream_wchar *this, double val)
6389 {
6390     return basic_ostream_print_double(this, val, num_put_short_use_facet(
6391                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6392 }
6393
6394 static basic_ostream_wchar* basic_ostream_print_ldouble(basic_ostream_wchar *this, double val, const num_put *numput)
6395 {
6396     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6397     int state = IOSTATE_goodbit;
6398
6399     TRACE("(%p %lf)\n", this, val);
6400
6401     if(basic_ostream_wchar_sentry_create(this)) {
6402         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6403         ostreambuf_iterator_wchar dest = {0, strbuf};
6404
6405         num_put_wchar_put_ldouble(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6406     }
6407     basic_ostream_wchar_sentry_destroy(this);
6408
6409     basic_ios_wchar_setstate(base, state);
6410     return this;
6411 }
6412
6413 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@O@Z */
6414 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@O@Z */
6415 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_ldouble, 12)
6416 basic_ostream_wchar* __thiscall basic_ostream_short_print_ldouble(basic_ostream_wchar *this, double val)
6417 {
6418     return basic_ostream_print_ldouble(this, val, num_put_short_use_facet(
6419                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6420 }
6421
6422 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
6423 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
6424 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
6425 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
6426 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_streambuf, 8)
6427 basic_ostream_wchar* __thiscall basic_ostream_wchar_print_streambuf(basic_ostream_wchar *this, basic_streambuf_wchar *val)
6428 {
6429     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6430     IOSB_iostate state = IOSTATE_badbit;
6431     unsigned short c = '\n';
6432
6433     TRACE("(%p %p)\n", this, val);
6434
6435     if(basic_ostream_wchar_sentry_create(this)) {
6436         for(c = basic_streambuf_wchar_sgetc(val); c!=WEOF;
6437                 c = basic_streambuf_wchar_snextc(val)) {
6438             state = IOSTATE_goodbit;
6439
6440             if(basic_streambuf_wchar_sputc(base->strbuf, c) == WEOF) {
6441                 state = IOSTATE_badbit;
6442                 break;
6443             }
6444         }
6445     }else {
6446         state = IOSTATE_badbit;
6447     }
6448     basic_ostream_wchar_sentry_destroy(this);
6449
6450     ios_base_width_set(&base->base, 0);
6451     basic_ios_wchar_setstate(base, state);
6452     return this;
6453 }
6454
6455 static basic_ostream_wchar* basic_ostream_print_ptr(basic_ostream_wchar *this, const void *val, const num_put *numput)
6456 {
6457     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6458     int state = IOSTATE_goodbit;
6459
6460     TRACE("(%p %p)\n", this, val);
6461
6462     if(basic_ostream_wchar_sentry_create(this)) {
6463         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6464         ostreambuf_iterator_wchar dest = {0, strbuf};
6465
6466         num_put_wchar_put_ptr(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6467     }
6468     basic_ostream_wchar_sentry_destroy(this);
6469
6470     basic_ios_wchar_setstate(base, state);
6471     return this;
6472 }
6473
6474 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PBX@Z */
6475 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEBX@Z */
6476 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_ptr, 8)
6477 basic_ostream_wchar* __thiscall basic_ostream_short_print_ptr(basic_ostream_wchar *this, const void *val)
6478 {
6479     return basic_ostream_print_ptr(this, val, num_put_short_use_facet(
6480                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6481 }
6482
6483 static basic_ostream_wchar* basic_ostream_print_int64(basic_ostream_wchar *this, __int64 val, const num_put *numput)
6484 {
6485     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6486     int state = IOSTATE_goodbit;
6487
6488     TRACE("(%p)\n", this);
6489
6490     if(basic_ostream_wchar_sentry_create(this)) {
6491         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6492         ostreambuf_iterator_wchar dest = {0, strbuf};
6493
6494         num_put_wchar_put_int64(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6495     }
6496     basic_ostream_wchar_sentry_destroy(this);
6497
6498     basic_ios_wchar_setstate(base, state);
6499     return this;
6500 }
6501
6502 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_J@Z */
6503 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_J@Z */
6504 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_int64, 12)
6505 basic_ostream_wchar* __thiscall basic_ostream_short_print_int64(basic_ostream_wchar *this, __int64 val)
6506 {
6507     return basic_ostream_print_int64(this, val, num_put_short_use_facet(
6508                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6509 }
6510
6511 static basic_ostream_wchar* basic_ostream_print_uint64(basic_ostream_wchar *this, unsigned __int64 val, const num_put *numput)
6512 {
6513     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6514     int state = IOSTATE_goodbit;
6515
6516     TRACE("(%p)\n", this);
6517
6518     if(basic_ostream_wchar_sentry_create(this)) {
6519         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6520         ostreambuf_iterator_wchar dest = {0, strbuf};
6521
6522         num_put_wchar_put_uint64(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6523     }
6524     basic_ostream_wchar_sentry_destroy(this);
6525
6526     basic_ios_wchar_setstate(base, state);
6527     return this;
6528 }
6529
6530 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_K@Z */
6531 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_K@Z */
6532 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_uint64, 12)
6533 basic_ostream_wchar* __thiscall basic_ostream_short_print_uint64(basic_ostream_wchar *this, unsigned __int64 val)
6534 {
6535     return basic_ostream_print_uint64(this, val, num_put_short_use_facet(
6536                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6537 }
6538
6539 static basic_ostream_wchar* basic_ostream_print_bool(basic_ostream_wchar *this, MSVCP_bool val, const num_put *numput)
6540 {
6541     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
6542     int state = IOSTATE_goodbit;
6543
6544     TRACE("(%p %x)\n", this, val);
6545
6546     if(basic_ostream_wchar_sentry_create(this)) {
6547         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
6548         ostreambuf_iterator_wchar dest = {0, strbuf};
6549
6550         num_put_wchar_put_bool(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
6551     }
6552     basic_ostream_wchar_sentry_destroy(this);
6553
6554     basic_ios_wchar_setstate(base, state);
6555     return this;
6556 }
6557
6558 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_N@Z */
6559 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_N@Z */
6560 DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_bool, 8)
6561 basic_ostream_wchar* __thiscall basic_ostream_short_print_bool(basic_ostream_wchar *this, MSVCP_bool val)
6562 {
6563     return basic_ostream_print_bool(this, val, num_put_short_use_facet(
6564                 basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
6565 }
6566
6567 /* ?endl@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
6568 /* ?endl@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
6569 /* ?endl@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@1@AAV21@@Z */
6570 /* ?endl@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
6571 basic_ostream_wchar* __cdecl basic_ostream_wchar_endl(basic_ostream_wchar *ostr)
6572 {
6573     TRACE("(%p)\n", ostr);
6574
6575     basic_ostream_wchar_put(ostr, '\n');
6576     basic_ostream_wchar_flush(ostr);
6577     return ostr;
6578 }
6579
6580 /* ??$?6_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AAV10@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z */
6581 /* ??$?6_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AEAV10@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z */
6582 /* ??$?6GU?$char_traits@G@std@@V?$allocator@G@1@@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@0@AAV10@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@@Z */
6583 /* ??$?6GU?$char_traits@G@std@@V?$allocator@G@1@@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@0@AEAV10@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@@Z */
6584 basic_ostream_wchar* __cdecl basic_ostream_wchar_print_bstr(basic_ostream_wchar *ostr, const basic_string_wchar *str)
6585 {
6586     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
6587     IOSB_iostate state = IOSTATE_goodbit;
6588
6589     TRACE("(%p %p)\n", ostr, str);
6590
6591     if(basic_ostream_wchar_sentry_create(ostr)) {
6592         MSVCP_size_t len = basic_string_wchar_length(str);
6593         streamsize pad = (base->base.wide>len ? base->base.wide-len : 0);
6594
6595         if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
6596             for(; pad!=0; pad--) {
6597                 if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
6598                     state = IOSTATE_badbit;
6599                     break;
6600                 }
6601             }
6602         }
6603
6604         if(state == IOSTATE_goodbit) {
6605             if(basic_streambuf_wchar_sputn(base->strbuf, basic_string_wchar_c_str(str), len) != len)
6606                 state = IOSTATE_badbit;
6607         }
6608
6609         if(state == IOSTATE_goodbit) {
6610             for(; pad!=0; pad--) {
6611                 if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
6612                     state = IOSTATE_badbit;
6613                     break;
6614                 }
6615             }
6616         }
6617
6618         base->base.wide = 0;
6619     }else {
6620         state = IOSTATE_badbit;
6621     }
6622     basic_ostream_wchar_sentry_destroy(ostr);
6623
6624     basic_ios_wchar_setstate(base, state);
6625     return ostr;
6626 }
6627
6628 /* ??$?6_WU?$char_traits@_W@std@@@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AAV10@_W@Z */
6629 /* ??$?6_WU?$char_traits@_W@std@@@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AEAV10@_W@Z */
6630 /* ??$?6GU?$char_traits@G@std@@@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@0@AAV10@G@Z */
6631 /* ??$?6GU?$char_traits@G@std@@@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@0@AEAV10@G@Z */
6632 basic_ostream_wchar* __cdecl basic_ostream_wchar_print_ch(basic_ostream_wchar *ostr, wchar_t ch)
6633 {
6634     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
6635     IOSB_iostate state = IOSTATE_goodbit;
6636
6637     TRACE("(%p %d)\n", ostr, ch);
6638
6639     if(basic_ostream_wchar_sentry_create(ostr)) {
6640         streamsize pad = (base->base.wide>1 ? base->base.wide-1 : 0);
6641
6642         if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
6643             for(; pad!=0; pad--) {
6644                 if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
6645                     state = IOSTATE_badbit;
6646                     break;
6647                 }
6648             }
6649         }
6650
6651         if(state == IOSTATE_goodbit) {
6652             if(basic_streambuf_wchar_sputc(base->strbuf, ch) == WEOF)
6653                 state = IOSTATE_badbit;
6654         }
6655
6656         if(state == IOSTATE_goodbit) {
6657             for(; pad!=0; pad--) {
6658                 if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
6659                     state = IOSTATE_badbit;
6660                     break;
6661                 }
6662             }
6663         }
6664
6665         base->base.wide = 0;
6666     }else {
6667         state = IOSTATE_badbit;
6668     }
6669     basic_ostream_wchar_sentry_destroy(ostr);
6670
6671     basic_ios_wchar_setstate(base, state);
6672     return ostr;
6673 }
6674
6675 /* ??$?6_WU?$char_traits@_W@std@@@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AAV10@PB_W@Z */
6676 /* ??$?6_WU?$char_traits@_W@std@@@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AEAV10@PEB_W@Z */
6677 /* ??$?6GU?$char_traits@G@std@@@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@0@AAV10@PBG@Z */
6678 /* ??$?6GU?$char_traits@G@std@@@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@0@AEAV10@PEBG@Z */
6679 basic_ostream_wchar* __cdecl basic_ostream_wchar_print_str(basic_ostream_wchar *ostr, const wchar_t *str)
6680 {
6681     basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
6682     IOSB_iostate state = IOSTATE_goodbit;
6683
6684     TRACE("(%p %s)\n", ostr, debugstr_w(str));
6685
6686     if(basic_ostream_wchar_sentry_create(ostr)) {
6687         MSVCP_size_t len = wcslen(str);
6688         streamsize pad = (base->base.wide>len ? base->base.wide-len : 0);
6689
6690         if((base->base.fmtfl & FMTFLAG_adjustfield) != FMTFLAG_left) {
6691             for(; pad!=0; pad--) {
6692                 if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
6693                     state = IOSTATE_badbit;
6694                     break;
6695                 }
6696             }
6697         }
6698
6699         if(state == IOSTATE_goodbit) {
6700             if(basic_streambuf_wchar_sputn(base->strbuf, str, len) != len)
6701                                         state = IOSTATE_badbit;
6702         }
6703
6704         if(state == IOSTATE_goodbit) {
6705             for(; pad!=0; pad--) {
6706                 if(basic_streambuf_wchar_sputc(base->strbuf, base->fillch) == WEOF) {
6707                     state = IOSTATE_badbit;
6708                     break;
6709                 }
6710             }
6711         }
6712
6713         base->base.wide = 0;
6714     }else {
6715         state = IOSTATE_badbit;
6716     }
6717     basic_ostream_wchar_sentry_destroy(ostr);
6718
6719     basic_ios_wchar_setstate(base, state);
6720     return ostr;
6721 }
6722
6723 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
6724 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
6725 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
6726 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
6727 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func, 8)
6728 basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func(basic_ostream_wchar *this,
6729         basic_ostream_wchar* (__cdecl *pfunc)(basic_ostream_wchar*))
6730 {
6731     TRACE("(%p %p)\n", this, pfunc);
6732     pfunc(this);
6733     return this;
6734 }
6735
6736 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z */
6737 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z */
6738 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z */
6739 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z */
6740 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func_basic_ios, 8)
6741 basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func_basic_ios(basic_ostream_wchar *this,
6742         basic_ios_wchar* (__cdecl *pfunc)(basic_ios_wchar*))
6743 {
6744     TRACE("(%p %p)\n", this, pfunc);
6745     pfunc(basic_ostream_wchar_get_basic_ios(this));
6746     return this;
6747 }
6748
6749 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
6750 /* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
6751 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
6752 /* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
6753 DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func_ios_base, 8)
6754 basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func_ios_base(
6755         basic_ostream_wchar *this, ios_base* (__cdecl *pfunc)(ios_base*))
6756 {
6757     TRACE("(%p %p)\n", this, pfunc);
6758     pfunc(&basic_ostream_wchar_get_basic_ios(this)->base);
6759     return this;
6760 }
6761
6762 /* Caution: basic_istream uses virtual inheritance. */
6763 static inline basic_ios_char* basic_istream_char_get_basic_ios(basic_istream_char *this)
6764 {
6765     return (basic_ios_char*)((char*)this+this->vbtable[1]);
6766 }
6767
6768 static inline basic_ios_char* basic_istream_char_to_basic_ios(basic_istream_char *ptr)
6769 {
6770     return (basic_ios_char*)((char*)ptr+basic_istream_char_vbtable[1]);
6771 }
6772
6773 static inline basic_istream_char* basic_istream_char_from_basic_ios(basic_ios_char *ptr)
6774 {
6775     return (basic_istream_char*)((char*)ptr-basic_istream_char_vbtable[1]);
6776 }
6777
6778 /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */
6779 /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */
6780 static basic_istream_char* basic_istream_char_ctor_init(basic_istream_char *this, basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
6781 {
6782     basic_ios_char *base;
6783
6784     TRACE("(%p %p %d %d %d)\n", this, strbuf, isstd, noinit, virt_init);
6785
6786     if(virt_init) {
6787         this->vbtable = basic_istream_char_vbtable;
6788         base = basic_istream_char_get_basic_ios(this);
6789         basic_ios_char_ctor(base);
6790     }else {
6791         base = basic_istream_char_get_basic_ios(this);
6792     }
6793
6794     base->base.vtable = &MSVCP_basic_istream_char_vtable;
6795     this->count = 0;
6796     if(!noinit)
6797         basic_ios_char_init(base, strbuf, isstd);
6798     return this;
6799 }
6800
6801 /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
6802 /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
6803 DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor, 16)
6804 basic_istream_char* __thiscall basic_istream_char_ctor(basic_istream_char *this, basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
6805 {
6806     return basic_istream_char_ctor_init(this, strbuf, isstd, FALSE, virt_init);
6807 }
6808
6809 /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z */
6810 /* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
6811 DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor_uninitialized, 12)
6812 basic_istream_char* __thiscall basic_istream_char_ctor_uninitialized(basic_istream_char *this, int uninitialized, MSVCP_bool virt_init)
6813 {
6814     basic_ios_char *base;
6815
6816     TRACE("(%p %d %d)\n", this, uninitialized, virt_init);
6817
6818     if(virt_init) {
6819         this->vbtable = basic_istream_char_vbtable;
6820         base = basic_istream_char_get_basic_ios(this);
6821         basic_ios_char_ctor(base);
6822     }else {
6823         base = basic_istream_char_get_basic_ios(this);
6824     }
6825
6826     base->base.vtable = &MSVCP_basic_istream_char_vtable;
6827     ios_base_Addstd(&base->base);
6828     return this;
6829 }
6830
6831 /* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ */
6832 /* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
6833 DEFINE_THISCALL_WRAPPER(basic_istream_char_dtor, 4)
6834 void __thiscall basic_istream_char_dtor(basic_ios_char *base)
6835 {
6836     basic_istream_char *this = basic_istream_char_from_basic_ios(base);
6837
6838     /* don't destroy virtual base here */
6839     TRACE("(%p)\n", this);
6840 }
6841
6842 /* ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ */
6843 /* ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
6844 DEFINE_THISCALL_WRAPPER(basic_istream_char_vbase_dtor, 4)
6845 void __thiscall basic_istream_char_vbase_dtor(basic_istream_char *this)
6846 {
6847     TRACE("(%p)\n", this);
6848     basic_istream_char_dtor(basic_istream_char_to_basic_ios(this));
6849     basic_ios_char_dtor(basic_istream_char_get_basic_ios(this));
6850 }
6851
6852 DEFINE_THISCALL_WRAPPER(basic_istream_char_vector_dtor, 8)
6853 basic_istream_char* __thiscall basic_istream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
6854 {
6855     basic_istream_char *this = basic_istream_char_from_basic_ios(base);
6856
6857     TRACE("(%p %x)\n", this, flags);
6858
6859     if(flags & 2) {
6860         /* we have an array, with the number of elements stored before the first object */
6861         INT_PTR i, *ptr = (INT_PTR *)this-1;
6862
6863         for(i=*ptr-1; i>=0; i--)
6864             basic_istream_char_vbase_dtor(this+i);
6865         MSVCRT_operator_delete(ptr);
6866     } else {
6867         basic_istream_char_vbase_dtor(this);
6868         if(flags & 1)
6869             MSVCRT_operator_delete(this);
6870     }
6871
6872     return this;
6873 }
6874
6875 /* ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z */
6876 /* ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z */
6877 static MSVCP_bool basic_istream_char__Ipfx(basic_istream_char *this, MSVCP_bool noskip)
6878 {
6879     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
6880
6881     TRACE("(%p %d)\n", this, noskip);
6882
6883     if(ios_base_good(&base->base)) {
6884         if(basic_ios_char_tie_get(base))
6885             basic_ostream_char_flush(basic_ios_char_tie_get(base));
6886
6887         if(!noskip && (ios_base_flags_get(&base->base) & FMTFLAG_skipws)) {
6888             basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
6889             const ctype_char *ctype = ctype_char_use_facet(base->strbuf->loc);
6890             int ch;
6891
6892             for(ch = basic_streambuf_char_sgetc(strbuf); ;
6893                     ch = basic_streambuf_char_snextc(strbuf)) {
6894                 if(ch == EOF) {
6895                     basic_ios_char_setstate(base, IOSTATE_eofbit);
6896                     break;
6897                 }
6898
6899                 if(!ctype_char_is_ch(ctype, _SPACE|_BLANK, ch))
6900                     break;
6901             }
6902         }
6903     }
6904
6905     if(!ios_base_good(&base->base)) {
6906         basic_ios_char_setstate(base, IOSTATE_failbit);
6907         return FALSE;
6908     }
6909
6910     return TRUE;
6911 }
6912
6913 /* ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z */
6914 /* ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z */
6915 DEFINE_THISCALL_WRAPPER(basic_istream_char_ipfx, 8)
6916 MSVCP_bool __thiscall basic_istream_char_ipfx(basic_istream_char *this, MSVCP_bool noskip)
6917 {
6918     return basic_istream_char__Ipfx(this, noskip);
6919 }
6920
6921 /* ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ */
6922 /* ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
6923 DEFINE_THISCALL_WRAPPER(basic_istream_char_isfx, 4)
6924 void __thiscall basic_istream_char_isfx(basic_istream_char *this)
6925 {
6926     TRACE("(%p)\n", this);
6927 }
6928
6929 static BOOL basic_istream_char_sentry_create(basic_istream_char *istr, MSVCP_bool noskip)
6930 {
6931     basic_ios_char *base = basic_istream_char_get_basic_ios(istr);
6932
6933     if(basic_ios_char_rdbuf_get(base))
6934         basic_streambuf_char__Lock(base->strbuf);
6935
6936     return basic_istream_char_ipfx(istr, noskip);
6937 }
6938
6939 static void basic_istream_char_sentry_destroy(basic_istream_char *istr)
6940 {
6941     basic_ios_char *base = basic_istream_char_get_basic_ios(istr);
6942
6943     if(basic_ios_char_rdbuf_get(base))
6944         basic_streambuf_char__Unlock(base->strbuf);
6945 }
6946
6947 /* ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QBEHXZ */
6948 /* ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QEBA_JXZ */
6949 DEFINE_THISCALL_WRAPPER(basic_istream_char_gcount, 4)
6950 int __thiscall basic_istream_char_gcount(const basic_istream_char *this)
6951 {
6952     TRACE("(%p)\n", this);
6953     return this->count;
6954 }
6955
6956 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
6957 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
6958 DEFINE_THISCALL_WRAPPER(basic_istream_char_get, 4)
6959 int __thiscall basic_istream_char_get(basic_istream_char *this)
6960 {
6961     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
6962     int ret;
6963
6964     TRACE("(%p)\n", this);
6965
6966     this->count = 0;
6967
6968     if(!basic_istream_char_sentry_create(this, TRUE)) {
6969         basic_istream_char_sentry_destroy(this);
6970         return EOF;
6971     }
6972
6973     ret = basic_streambuf_char_sbumpc(basic_ios_char_rdbuf_get(base));
6974     basic_istream_char_sentry_destroy(this);
6975     if(ret == EOF)
6976         basic_ios_char_setstate(base, IOSTATE_eofbit|IOSTATE_failbit);
6977     else
6978         this->count++;
6979
6980     return ret;
6981 }
6982
6983 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAD@Z */
6984 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAD@Z */
6985 DEFINE_THISCALL_WRAPPER(basic_istream_char_get_ch, 8)
6986 basic_istream_char* __thiscall basic_istream_char_get_ch(basic_istream_char *this, char *ch)
6987 {
6988     int ret;
6989
6990     TRACE("(%p %p)\n", this, ch);
6991
6992     ret = basic_istream_char_get(this);
6993     if(ret != EOF)
6994         *ch = (char)ret;
6995     return this;
6996 }
6997
6998 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADHD@Z */
6999 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z */
7000 DEFINE_THISCALL_WRAPPER(basic_istream_char_get_str_delim, 16)
7001 basic_istream_char* __thiscall basic_istream_char_get_str_delim(basic_istream_char *this, char *str, streamsize count, char delim)
7002 {
7003     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7004     int ch = delim;
7005
7006     TRACE("(%p %p %ld %c)\n", this, str, count, delim);
7007
7008     this->count = 0;
7009
7010     if(basic_istream_char_sentry_create(this, TRUE)) {
7011         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7012
7013         for(ch = basic_streambuf_char_sgetc(strbuf); count>1;
7014                 ch = basic_streambuf_char_snextc(strbuf)) {
7015             if(ch==EOF || ch==delim)
7016                 break;
7017
7018             *str++ = ch;
7019             this->count++;
7020             count--;
7021         }
7022     }
7023     basic_istream_char_sentry_destroy(this);
7024
7025     basic_ios_char_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
7026             (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
7027     if(count > 0)
7028         *str = 0;
7029     return this;
7030 }
7031
7032 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
7033 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
7034 DEFINE_THISCALL_WRAPPER(basic_istream_char_get_str, 12)
7035 basic_istream_char* __thiscall basic_istream_char_get_str(basic_istream_char *this, char *str, streamsize count)
7036 {
7037     return basic_istream_char_get_str_delim(this, str, count, '\n');
7038 }
7039
7040 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z */
7041 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z */
7042 DEFINE_THISCALL_WRAPPER(basic_istream_char_get_streambuf_delim, 12)
7043 basic_istream_char* __thiscall basic_istream_char_get_streambuf_delim(basic_istream_char *this, basic_streambuf_char *strbuf, char delim)
7044 {
7045     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7046     int ch = delim;
7047
7048     TRACE("(%p %p %c)\n", this, strbuf, delim);
7049
7050     this->count = 0;
7051
7052     if(basic_istream_char_sentry_create(this, TRUE)) {
7053         basic_streambuf_char *strbuf_read = basic_ios_char_rdbuf_get(base);
7054
7055         for(ch = basic_streambuf_char_sgetc(strbuf_read); ;
7056                 ch = basic_streambuf_char_snextc(strbuf_read)) {
7057             if(ch==EOF || ch==delim)
7058                 break;
7059
7060             if(basic_streambuf_char_sputc(strbuf, ch) == EOF)
7061                 break;
7062             this->count++;
7063         }
7064     }
7065     basic_istream_char_sentry_destroy(this);
7066
7067     basic_ios_char_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
7068             (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
7069     return this;
7070 }
7071
7072 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z */
7073 /* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z */
7074 DEFINE_THISCALL_WRAPPER(basic_istream_char_get_streambuf, 8)
7075 basic_istream_char* __thiscall basic_istream_char_get_streambuf(basic_istream_char *this, basic_streambuf_char *strbuf)
7076 {
7077     return basic_istream_char_get_streambuf_delim(this, strbuf, '\n');
7078 }
7079
7080 /* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADHD@Z */
7081 /* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z */
7082 DEFINE_THISCALL_WRAPPER(basic_istream_char_getline_delim, 16)
7083 basic_istream_char* __thiscall basic_istream_char_getline_delim(basic_istream_char *this, char *str, streamsize count, char delim)
7084 {
7085     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7086     int ch = (unsigned char)delim;
7087
7088     TRACE("(%p %p %ld %c)\n", this, str, count, delim);
7089
7090     this->count = 0;
7091
7092     if(basic_istream_char_sentry_create(this, TRUE) && count>0) {
7093         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7094
7095         while(count > 1) {
7096             ch = basic_streambuf_char_sbumpc(strbuf);
7097
7098             if(ch==EOF || ch==(unsigned char)delim)
7099                 break;
7100
7101             *str++ = ch;
7102             this->count++;
7103             count--;
7104         }
7105
7106         if(ch == (unsigned char)delim)
7107             this->count++;
7108         else if(ch != EOF) {
7109             ch = basic_streambuf_char_sgetc(strbuf);
7110
7111             if(ch == (unsigned char)delim) {
7112                 basic_streambuf_char__Gninc(strbuf);
7113                 this->count++;
7114             }
7115         }
7116     }
7117     basic_istream_char_sentry_destroy(this);
7118
7119     basic_ios_char_setstate(base, (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit) |
7120             (!this->count || (ch!=(unsigned char)delim && ch!=EOF) ? IOSTATE_failbit : IOSTATE_goodbit));
7121     if(count > 0)
7122         *str = 0;
7123     return this;
7124 }
7125
7126 /* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
7127 /* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
7128 DEFINE_THISCALL_WRAPPER(basic_istream_char_getline, 12)
7129 basic_istream_char* __thiscall basic_istream_char_getline(basic_istream_char *this, char *str, streamsize count)
7130 {
7131     return basic_istream_char_getline_delim(this, str, count, '\n');
7132 }
7133
7134 /* ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@HH@Z */
7135 /* ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z */
7136 DEFINE_THISCALL_WRAPPER(basic_istream_char_ignore, 12)
7137 basic_istream_char* __thiscall basic_istream_char_ignore(basic_istream_char *this, streamsize count, int delim)
7138 {
7139     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7140     int ch = (unsigned char)delim;
7141     unsigned int state;
7142
7143     TRACE("(%p %ld %d)\n", this, count, delim);
7144
7145     this->count = 0;
7146
7147     if(basic_istream_char_sentry_create(this, TRUE)) {
7148         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7149         state = IOSTATE_goodbit;
7150
7151         while(count > 0) {
7152             ch = basic_streambuf_char_sbumpc(strbuf);
7153
7154             if(ch==EOF) {
7155                 state = IOSTATE_eofbit;
7156                 break;
7157             }
7158
7159             if(ch==(unsigned char)delim)
7160                 break;
7161
7162             this->count++;
7163             if(count != INT_MAX)
7164                 count--;
7165         }
7166     }else
7167         state = IOSTATE_failbit;
7168     basic_istream_char_sentry_destroy(this);
7169
7170     basic_ios_char_setstate(base, state);
7171     return this;
7172 }
7173
7174 /* ?ws@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@1@AAV21@@Z */
7175 /* ?ws@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
7176 basic_istream_char* __cdecl ws_basic_istream_char(basic_istream_char *istream)
7177 {
7178     basic_ios_char *base = basic_istream_char_get_basic_ios(istream);
7179     int ch = '\n';
7180
7181     TRACE("(%p)\n", istream);
7182
7183     if(basic_istream_char_sentry_create(istream, TRUE)) {
7184         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7185         const ctype_char *ctype = ctype_char_use_facet(strbuf->loc);
7186
7187         for(ch = basic_streambuf_char_sgetc(strbuf); ctype_char_is_ch(ctype, _SPACE, ch);
7188                 ch = basic_streambuf_char_snextc(strbuf)) {
7189             if(ch == EOF)
7190                 break;
7191         }
7192     }
7193     basic_istream_char_sentry_destroy(istream);
7194
7195     if(ch == EOF)
7196         basic_ios_char_setstate(base, IOSTATE_eofbit);
7197     return istream;
7198 }
7199
7200 /* ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
7201 /* ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
7202 DEFINE_THISCALL_WRAPPER(basic_istream_char_peek, 4)
7203 int __thiscall basic_istream_char_peek(basic_istream_char *this)
7204 {
7205     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7206     int ret = EOF;
7207
7208     TRACE("(%p)\n", this);
7209
7210     this->count = 0;
7211
7212     if(basic_istream_char_sentry_create(this, TRUE))
7213         ret = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base));
7214     basic_istream_char_sentry_destroy(this);
7215     return ret;
7216 }
7217
7218 /* ?_Read_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADIH@Z */
7219 /* ?_Read_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_K_J@Z */
7220 static basic_istream_char* basic_istream_char__Read_s(basic_istream_char *this, char *str, MSVCP_size_t size, streamsize count)
7221 {
7222     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7223     IOSB_iostate state = IOSTATE_goodbit;
7224
7225     TRACE("(%p %p %lu %ld)\n", this, str, size, count);
7226
7227     if(basic_istream_char_sentry_create(this, TRUE)) {
7228         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7229
7230         this->count = basic_streambuf_char__Sgetn_s(strbuf, str, size, count);
7231         if(this->count != count)
7232             state |= IOSTATE_failbit | IOSTATE_eofbit;
7233     }else {
7234         this->count = 0;
7235     }
7236     basic_istream_char_sentry_destroy(this);
7237
7238     basic_ios_char_setstate(base, state);
7239     return this;
7240 }
7241
7242 /* ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
7243 /* ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
7244 DEFINE_THISCALL_WRAPPER(basic_istream_char_read, 12)
7245 basic_istream_char* __thiscall basic_istream_char_read(basic_istream_char *this, char *str, streamsize count)
7246 {
7247     return basic_istream_char__Read_s(this, str, count, count);
7248 }
7249
7250 /* ?_Readsome_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHPADIH@Z */
7251 /* ?_Readsome_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_K_J@Z */
7252 static streamsize basic_istream_char__Readsome_s(basic_istream_char *this, char *str, MSVCP_size_t size, streamsize count)
7253 {
7254     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7255     IOSB_iostate state = IOSTATE_goodbit;
7256
7257     TRACE("(%p %p %lu %ld)\n", this, str, size, count);
7258
7259     this->count = 0;
7260
7261     if(basic_istream_char_sentry_create(this, TRUE)) {
7262         streamsize avail = basic_streambuf_char_in_avail(basic_ios_char_rdbuf_get(base));
7263         if(avail > count)
7264             avail = count;
7265
7266         if(avail == -1)
7267             state |= IOSTATE_eofbit;
7268         else if(avail > 0)
7269             basic_istream_char__Read_s(this, str, size, avail);
7270     }else {
7271         state |= IOSTATE_failbit;
7272     }
7273     basic_istream_char_sentry_destroy(this);
7274
7275     basic_ios_char_setstate(base, state);
7276     return this->count;
7277 }
7278
7279 /* ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHPADH@Z */
7280 /* ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z */
7281 DEFINE_THISCALL_WRAPPER(basic_istream_char_readsome, 12)
7282 streamsize __thiscall basic_istream_char_readsome(basic_istream_char *this, char *str, streamsize count)
7283 {
7284     return basic_istream_char__Readsome_s(this, str, count, count);
7285 }
7286
7287 /* ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z */
7288 /* ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z */
7289 DEFINE_THISCALL_WRAPPER(basic_istream_char_putback, 8)
7290 basic_istream_char* __thiscall basic_istream_char_putback(basic_istream_char *this, char ch)
7291 {
7292     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7293     IOSB_iostate state = IOSTATE_goodbit;
7294
7295     TRACE("(%p %c)\n", this, ch);
7296
7297     this->count = 0;
7298
7299     if(basic_istream_char_sentry_create(this, TRUE)) {
7300         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7301
7302         if(!ios_base_good(&base->base))
7303             state |= IOSTATE_failbit;
7304         else if(!strbuf || basic_streambuf_char_sputbackc(strbuf, ch)==EOF)
7305             state |= IOSTATE_badbit;
7306     }
7307     basic_istream_char_sentry_destroy(this);
7308
7309     basic_ios_char_setstate(base, state);
7310     return this;
7311 }
7312
7313 /* ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ */
7314 /* ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ */
7315 DEFINE_THISCALL_WRAPPER(basic_istream_char_unget, 4)
7316 basic_istream_char* __thiscall basic_istream_char_unget(basic_istream_char *this)
7317 {
7318     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7319     IOSB_iostate state = IOSTATE_goodbit;
7320
7321     TRACE("(%p)\n", this);
7322
7323     this->count = 0;
7324
7325     if(basic_istream_char_sentry_create(this, TRUE)) {
7326         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7327
7328         if(!ios_base_good(&base->base))
7329             state |= IOSTATE_failbit;
7330         else if(!strbuf || basic_streambuf_char_sungetc(strbuf)==EOF)
7331             state |= IOSTATE_badbit;
7332     }
7333     basic_istream_char_sentry_destroy(this);
7334
7335     basic_ios_char_setstate(base, state);
7336     return this;
7337 }
7338
7339 /* ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
7340 /* ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
7341 DEFINE_THISCALL_WRAPPER(basic_istream_char_sync, 4)
7342 int __thiscall basic_istream_char_sync(basic_istream_char *this)
7343 {
7344     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7345     basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7346
7347     TRACE("(%p)\n", this);
7348
7349     if(!strbuf)
7350         return -1;
7351
7352     if(basic_istream_char_sentry_create(this, TRUE)) {
7353         if(basic_streambuf_char_pubsync(strbuf) != -1) {
7354             basic_istream_char_sentry_destroy(this);
7355             return 0;
7356         }
7357     }
7358     basic_istream_char_sentry_destroy(this);
7359
7360     basic_ios_char_setstate(base, IOSTATE_badbit);
7361     return -1;
7362 }
7363
7364 /* ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ */
7365 /* ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
7366 DEFINE_THISCALL_WRAPPER(basic_istream_char_tellg, 8)
7367 fpos_int* __thiscall basic_istream_char_tellg(basic_istream_char *this, fpos_int *ret)
7368 {
7369     TRACE("(%p %p)\n", this, ret);
7370
7371     if(basic_istream_char_sentry_create(this, TRUE)) {
7372         basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7373         if(!ios_base_fail(&base->base)) {
7374             basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
7375                     ret, 0, SEEKDIR_cur, OPENMODE_in);
7376             basic_istream_char_sentry_destroy(this);
7377
7378             if(ret->off==0 && ret->pos==-1 && ret->state==0)
7379                 basic_ios_char_setstate(base, IOSTATE_failbit);
7380             return ret;
7381         }
7382     }
7383     basic_istream_char_sentry_destroy(this);
7384
7385     ret->off = 0;
7386     ret->pos = -1;
7387     ret->state = 0;
7388     return ret;
7389 }
7390
7391 /* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@JW4seekdir@ios_base@2@@Z */
7392 /* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JW4seekdir@ios_base@2@@Z */
7393 DEFINE_THISCALL_WRAPPER(basic_istream_char_seekg, 12)
7394 basic_istream_char* __thiscall basic_istream_char_seekg(basic_istream_char *this, streamoff off, int dir)
7395 {
7396     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7397
7398     TRACE("(%p %ld %d)\n", this, off, dir);
7399
7400     if(basic_istream_char_sentry_create(this, TRUE)) {
7401         if(!ios_base_fail(&base->base)) {
7402             basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7403             fpos_int ret;
7404
7405             basic_streambuf_char_pubseekoff(strbuf, &ret, off, dir, OPENMODE_in);
7406             basic_istream_char_sentry_destroy(this);
7407
7408             if(ret.off==0 && ret.pos==-1 && ret.state==0)
7409                 basic_ios_char_setstate(base, IOSTATE_failbit);
7410             else
7411                 basic_ios_char_clear(base, IOSTATE_goodbit);
7412             return this;
7413         }
7414     }
7415     basic_istream_char_sentry_destroy(this);
7416
7417     basic_ios_char_setstate(base, IOSTATE_failbit);
7418     return this;
7419 }
7420
7421 /* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
7422 /* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
7423 DEFINE_THISCALL_WRAPPER(basic_istream_char_seekg_fpos, 28)
7424 basic_istream_char* __thiscall basic_istream_char_seekg_fpos(basic_istream_char *this, fpos_int pos)
7425 {
7426     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7427
7428     TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
7429
7430     if(basic_istream_char_sentry_create(this, TRUE)) {
7431         if(!ios_base_fail(&base->base)) {
7432             basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7433             fpos_int ret;
7434
7435             basic_streambuf_char_pubseekpos(strbuf, &ret, pos, OPENMODE_in);
7436             basic_istream_char_sentry_destroy(this);
7437
7438             if(ret.off==0 && ret.pos==-1 && ret.state==0)
7439                 basic_ios_char_setstate(base, IOSTATE_failbit);
7440             else
7441                 basic_ios_char_clear(base, IOSTATE_goodbit);
7442             return this;
7443         }
7444     }
7445     basic_istream_char_sentry_destroy(this);
7446
7447     basic_ios_char_setstate(base, IOSTATE_failbit);
7448     return this;
7449 }
7450
7451 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAF@Z */
7452 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAF@Z */
7453 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_short, 8)
7454 basic_istream_char* __thiscall basic_istream_char_read_short(basic_istream_char *this, short *v)
7455 {
7456     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7457     int state = IOSTATE_goodbit;
7458
7459     TRACE("(%p %p)\n", this, v);
7460
7461     if(basic_istream_char_sentry_create(this, FALSE)) {
7462         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7463         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7464         istreambuf_iterator_char first={0}, last={0};
7465         LONG tmp;
7466
7467         first.strbuf = strbuf;
7468         num_get_char_get_long(numget, &last, first, last, &base->base, &state, &tmp);
7469
7470         if(!(state&IOSTATE_failbit) && tmp==(LONG)((short)tmp))
7471             *v = tmp;
7472         else
7473             state |= IOSTATE_failbit;
7474     }
7475     basic_istream_char_sentry_destroy(this);
7476
7477     basic_ios_char_setstate(base, state);
7478     return this;
7479 }
7480
7481 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAG@Z */
7482 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAG@Z */
7483 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ushort, 8)
7484 basic_istream_char* __thiscall basic_istream_char_read_ushort(basic_istream_char *this, unsigned short *v)
7485 {
7486     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7487     int state = IOSTATE_goodbit;
7488
7489     TRACE("(%p %p)\n", this, v);
7490
7491     if(basic_istream_char_sentry_create(this, FALSE)) {
7492         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7493         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7494         istreambuf_iterator_char first={0}, last={0};
7495
7496         first.strbuf = strbuf;
7497         num_get_char_get_ushort(numget, &last, first, last, &base->base, &state, v);
7498     }
7499     basic_istream_char_sentry_destroy(this);
7500
7501     basic_ios_char_setstate(base, state);
7502     return this;
7503 }
7504
7505 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAH@Z */
7506 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAH@Z */
7507 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_int, 8)
7508 basic_istream_char* __thiscall basic_istream_char_read_int(basic_istream_char *this, int *v)
7509 {
7510     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7511     int state = IOSTATE_goodbit;
7512
7513     TRACE("(%p %p)\n", this, v);
7514
7515     if(basic_istream_char_sentry_create(this, FALSE)) {
7516         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7517         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7518         istreambuf_iterator_char first={0}, last={0};
7519
7520         first.strbuf = strbuf;
7521         num_get_char_get_long(numget, &last, first, last, &base->base, &state, v);
7522     }
7523     basic_istream_char_sentry_destroy(this);
7524
7525     basic_ios_char_setstate(base, state);
7526     return this;
7527 }
7528
7529 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAI@Z */
7530 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAI@Z */
7531 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_uint, 8)
7532 basic_istream_char* __thiscall basic_istream_char_read_uint(basic_istream_char *this, unsigned int *v)
7533 {
7534     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7535     int state = IOSTATE_goodbit;
7536
7537     TRACE("(%p %p)\n", this, v);
7538
7539     if(basic_istream_char_sentry_create(this, FALSE)) {
7540         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7541         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7542         istreambuf_iterator_char first={0}, last={0};
7543
7544         first.strbuf = strbuf;
7545         num_get_char_get_uint(numget, &last, first, last, &base->base, &state, v);
7546     }
7547     basic_istream_char_sentry_destroy(this);
7548
7549     basic_ios_char_setstate(base, state);
7550     return this;
7551 }
7552
7553 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAJ@Z */
7554 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAJ@Z */
7555 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_long, 8)
7556 basic_istream_char* __thiscall basic_istream_char_read_long(basic_istream_char *this, LONG *v)
7557 {
7558     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7559     int state = IOSTATE_goodbit;
7560
7561     TRACE("(%p %p)\n", this, v);
7562
7563     if(basic_istream_char_sentry_create(this, FALSE)) {
7564         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7565         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7566         istreambuf_iterator_char first={0}, last={0};
7567
7568         first.strbuf = strbuf;
7569         num_get_char_get_long(numget, &last, first, last, &base->base, &state, v);
7570     }
7571     basic_istream_char_sentry_destroy(this);
7572
7573     basic_ios_char_setstate(base, state);
7574     return this;
7575 }
7576
7577 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAK@Z */
7578 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAK@Z */
7579 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ulong, 8)
7580 basic_istream_char* __thiscall basic_istream_char_read_ulong(basic_istream_char *this, ULONG *v)
7581 {
7582     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7583     int state = IOSTATE_goodbit;
7584
7585     TRACE("(%p %p)\n", this, v);
7586
7587     if(basic_istream_char_sentry_create(this, FALSE)) {
7588         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7589         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7590         istreambuf_iterator_char first={0}, last={0};
7591
7592         first.strbuf = strbuf;
7593         num_get_char_get_ulong(numget, &last, first, last, &base->base, &state, v);
7594     }
7595     basic_istream_char_sentry_destroy(this);
7596
7597     basic_ios_char_setstate(base, state);
7598     return this;
7599 }
7600
7601 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAM@Z */
7602 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAM@Z */
7603 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_float, 8)
7604 basic_istream_char* __thiscall basic_istream_char_read_float(basic_istream_char *this, float *v)
7605 {
7606     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7607     int state = IOSTATE_goodbit;
7608
7609     TRACE("(%p %p)\n", this, v);
7610
7611     if(basic_istream_char_sentry_create(this, FALSE)) {
7612         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7613         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7614         istreambuf_iterator_char first={0}, last={0};
7615
7616         first.strbuf = strbuf;
7617         num_get_char_get_float(numget, &last, first, last, &base->base, &state, v);
7618     }
7619     basic_istream_char_sentry_destroy(this);
7620
7621     basic_ios_char_setstate(base, state);
7622     return this;
7623 }
7624
7625 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAN@Z */
7626 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAN@Z */
7627 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_double, 8)
7628 basic_istream_char* __thiscall basic_istream_char_read_double(basic_istream_char *this, double *v)
7629 {
7630     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7631     int state = IOSTATE_goodbit;
7632
7633     TRACE("(%p %p)\n", this, v);
7634
7635     if(basic_istream_char_sentry_create(this, FALSE)) {
7636         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7637         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7638         istreambuf_iterator_char first={0}, last={0};
7639
7640         first.strbuf = strbuf;
7641         num_get_char_get_double(numget, &last, first, last, &base->base, &state, v);
7642     }
7643     basic_istream_char_sentry_destroy(this);
7644
7645     basic_ios_char_setstate(base, state);
7646     return this;
7647 }
7648
7649 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAO@Z */
7650 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAO@Z */
7651 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ldouble, 8)
7652 basic_istream_char* __thiscall basic_istream_char_read_ldouble(basic_istream_char *this, double *v)
7653 {
7654     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7655     int state = IOSTATE_goodbit;
7656
7657     TRACE("(%p %p)\n", this, v);
7658
7659     if(basic_istream_char_sentry_create(this, FALSE)) {
7660         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7661         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7662         istreambuf_iterator_char first={0}, last={0};
7663
7664         first.strbuf = strbuf;
7665         num_get_char_get_ldouble(numget, &last, first, last, &base->base, &state, v);
7666     }
7667     basic_istream_char_sentry_destroy(this);
7668
7669     basic_ios_char_setstate(base, state);
7670     return this;
7671 }
7672
7673 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAPAX@Z */
7674 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
7675 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ptr, 8)
7676 basic_istream_char* __thiscall basic_istream_char_read_ptr(basic_istream_char *this, void **v)
7677 {
7678     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7679     int state = IOSTATE_goodbit;
7680
7681     TRACE("(%p %p)\n", this, v);
7682
7683     if(basic_istream_char_sentry_create(this, FALSE)) {
7684         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7685         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7686         istreambuf_iterator_char first={0}, last={0};
7687
7688         first.strbuf = strbuf;
7689         num_get_char_get_void(numget, &last, first, last, &base->base, &state, v);
7690     }
7691     basic_istream_char_sentry_destroy(this);
7692
7693     basic_ios_char_setstate(base, state);
7694     return this;
7695 }
7696
7697 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_J@Z */
7698 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_J@Z */
7699 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_int64, 8)
7700 basic_istream_char* __thiscall basic_istream_char_read_int64(basic_istream_char *this, __int64 *v)
7701 {
7702     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7703     int state = IOSTATE_goodbit;
7704
7705     TRACE("(%p %p)\n", this, v);
7706
7707     if(basic_istream_char_sentry_create(this, FALSE)) {
7708         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7709         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7710         istreambuf_iterator_char first={0}, last={0};
7711
7712         first.strbuf = strbuf;
7713         num_get_char_get_int64(numget, &last, first, last, &base->base, &state, v);
7714     }
7715     basic_istream_char_sentry_destroy(this);
7716
7717     basic_ios_char_setstate(base, state);
7718     return this;
7719 }
7720
7721 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_K@Z */
7722 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_K@Z */
7723 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_uint64, 8)
7724 basic_istream_char* __thiscall basic_istream_char_read_uint64(basic_istream_char *this, unsigned __int64 *v)
7725 {
7726     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7727     int state = IOSTATE_goodbit;
7728
7729     TRACE("(%p %p)\n", this, v);
7730
7731     if(basic_istream_char_sentry_create(this, FALSE)) {
7732         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7733         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7734         istreambuf_iterator_char first={0}, last={0};
7735
7736         first.strbuf = strbuf;
7737         num_get_char_get_uint64(numget, &last, first, last, &base->base, &state, v);
7738     }
7739     basic_istream_char_sentry_destroy(this);
7740
7741     basic_ios_char_setstate(base, state);
7742     return this;
7743 }
7744
7745 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_N@Z */
7746 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_N@Z */
7747 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_bool, 8)
7748 basic_istream_char* __thiscall basic_istream_char_read_bool(basic_istream_char *this, MSVCP_bool *v)
7749 {
7750     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7751     int state = IOSTATE_goodbit;
7752
7753     TRACE("(%p %p)\n", this, v);
7754
7755     if(basic_istream_char_sentry_create(this, FALSE)) {
7756         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
7757         const num_get *numget = num_get_char_use_facet(strbuf->loc);
7758         istreambuf_iterator_char first={0}, last={0};
7759
7760         first.strbuf = strbuf;
7761         num_get_char_get_bool(numget, &last, first, last, &base->base, &state, v);
7762     }
7763     basic_istream_char_sentry_destroy(this);
7764
7765     basic_ios_char_setstate(base, state);
7766     return this;
7767 }
7768
7769 /* ??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@D@Z */
7770 /* ??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@D@Z */
7771 basic_istream_char* __cdecl basic_istream_char_getline_bstr_delim(
7772         basic_istream_char *istream, basic_string_char *str, char delim)
7773 {
7774     IOSB_iostate state = IOSTATE_failbit;
7775     int c = (unsigned char)delim;
7776
7777     TRACE("(%p %p %c)\n", istream, str, delim);
7778
7779     if(basic_istream_char_sentry_create(istream, TRUE)) {
7780         basic_string_char_clear(str);
7781
7782         c = basic_istream_char_get(istream);
7783         if(c != EOF)
7784             state = IOSTATE_goodbit;
7785
7786         for(; c!=(unsigned char)delim && c!=EOF; c = basic_istream_char_get(istream)) {
7787             state = IOSTATE_goodbit;
7788             basic_string_char_append_ch(str, c);
7789         }
7790     }
7791     basic_istream_char_sentry_destroy(istream);
7792
7793     basic_ios_char_setstate(basic_istream_char_get_basic_ios(istream),
7794         state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
7795     return istream;
7796 }
7797
7798 /* ??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */
7799 /* ??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */
7800 basic_istream_char* __cdecl basic_istream_char_getline_bstr(
7801         basic_istream_char *istream, basic_string_char *str)
7802 {
7803     return basic_istream_char_getline_bstr_delim(istream, str, '\n');
7804 }
7805
7806 /* ??$?5DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */
7807 /* ??$?5DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z */
7808 basic_istream_char* __cdecl basic_istream_char_read_bstr(
7809         basic_istream_char *istream, basic_string_char *str)
7810 {
7811     basic_ios_char *base = basic_istream_char_get_basic_ios(istream);
7812     IOSB_iostate state = IOSTATE_failbit;
7813     int c = '\n';
7814
7815     TRACE("(%p %p)\n", istream, str);
7816
7817     if(basic_istream_char_sentry_create(istream, FALSE)) {
7818         const ctype_char *ctype = ctype_char_use_facet(base->strbuf->loc);
7819         MSVCP_size_t count = ios_base_width_get(&base->base);
7820
7821         if(!count)
7822             count = -1;
7823
7824         basic_string_char_clear(str);
7825
7826         for(c = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base));
7827                 c!=EOF && !ctype_char_is_ch(ctype, _SPACE|_BLANK, c) && count>0;
7828                 c = basic_streambuf_char_snextc(basic_ios_char_rdbuf_get(base)), count--) {
7829             state = IOSTATE_goodbit;
7830             basic_string_char_append_ch(str, c);
7831         }
7832     }
7833     basic_istream_char_sentry_destroy(istream);
7834
7835     ios_base_width_set(&base->base, 0);
7836     basic_ios_char_setstate(base, state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
7837     return istream;
7838 }
7839
7840 /* ??$?5DU?$char_traits@D@std@@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@PAD@Z */
7841 /* ??$?5DU?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@PEAD@Z */
7842 /* ??$?5U?$char_traits@D@std@@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@PAC@Z */
7843 /* ??$?5U?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@PEAC@Z */
7844 /* ??$?5U?$char_traits@D@std@@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@PAE@Z */
7845 /* ??$?5U?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@PEAE@Z */
7846 basic_istream_char* __cdecl basic_istream_char_read_str(basic_istream_char *istream, char *str)
7847 {
7848     basic_ios_char *base = basic_istream_char_get_basic_ios(istream);
7849     IOSB_iostate state = IOSTATE_failbit;
7850     int c = '\n';
7851
7852     TRACE("(%p %p)\n", istream, str);
7853
7854     if(basic_istream_char_sentry_create(istream, FALSE)) {
7855         const ctype_char *ctype = ctype_char_use_facet(base->strbuf->loc);
7856         MSVCP_size_t count = ios_base_width_get(&base->base)-1;
7857
7858         for(c = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base));
7859                 c!=EOF && !ctype_char_is_ch(ctype, _SPACE|_BLANK, c) && count>0;
7860                 c = basic_streambuf_char_snextc(basic_ios_char_rdbuf_get(base)), count--) {
7861             state = IOSTATE_goodbit;
7862             *str++ = c;
7863         }
7864     }
7865     basic_istream_char_sentry_destroy(istream);
7866
7867     *str = 0;
7868     ios_base_width_set(&base->base, 0);
7869     basic_ios_char_setstate(base, state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
7870     return istream;
7871 }
7872
7873 /* ??$?5DU?$char_traits@D@std@@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAD@Z */
7874 /* ??$?5DU?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAD@Z */
7875 /* ??$?5U?$char_traits@D@std@@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAC@Z */
7876 /* ??$?5U?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAC@Z */
7877 /* ??$?5U?$char_traits@D@std@@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAE@Z */
7878 /* ??$?5U?$char_traits@D@std@@@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@0@AEAV10@AEAE@Z */
7879 basic_istream_char* __cdecl basic_istream_char_read_ch(basic_istream_char *istream, char *ch)
7880 {
7881     IOSB_iostate state = IOSTATE_failbit;
7882     int c = 0;
7883
7884     TRACE("(%p %p)\n", istream, ch);
7885
7886     if(basic_istream_char_sentry_create(istream, FALSE)) {
7887         c = basic_streambuf_char_sbumpc(basic_ios_char_rdbuf_get(
7888                     basic_istream_char_get_basic_ios(istream)));
7889         if(c != EOF) {
7890             state = IOSTATE_goodbit;
7891             *ch = c;
7892         }
7893     }
7894     basic_istream_char_sentry_destroy(istream);
7895
7896     basic_ios_char_setstate(basic_istream_char_get_basic_ios(istream),
7897             state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
7898     return istream;
7899 }
7900
7901 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
7902 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
7903 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_streambuf, 8)
7904 basic_istream_char* __thiscall basic_istream_char_read_streambuf(
7905         basic_istream_char *this, basic_streambuf_char *streambuf)
7906 {
7907     basic_ios_char *base = basic_istream_char_get_basic_ios(this);
7908     IOSB_iostate state = IOSTATE_failbit;
7909     int c = '\n';
7910
7911     TRACE("(%p %p)\n", this, streambuf);
7912
7913     if(basic_istream_char_sentry_create(this, FALSE)) {
7914         for(c = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base)); c!=EOF;
7915                 c = basic_streambuf_char_snextc(basic_ios_char_rdbuf_get(base))) {
7916             state = IOSTATE_goodbit;
7917             if(basic_streambuf_char_sputc(streambuf, c) == EOF)
7918                 break;
7919         }
7920     }
7921     basic_istream_char_sentry_destroy(this);
7922
7923     basic_ios_char_setstate(base, state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
7924     return this;
7925 }
7926
7927 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
7928 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
7929 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func, 8)
7930 basic_istream_char* __thiscall basic_istream_char_read_func(basic_istream_char *this,
7931         basic_istream_char* (__cdecl *pfunc)(basic_istream_char*))
7932 {
7933     TRACE("(%p %p)\n", this, pfunc);
7934     pfunc(this);
7935     return this;
7936 }
7937
7938 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z */
7939 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z */
7940 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func_basic_ios, 8)
7941 basic_istream_char* __thiscall basic_istream_char_read_func_basic_ios(basic_istream_char *this,
7942         basic_ios_char* (__cdecl *pfunc)(basic_ios_char*))
7943 {
7944     TRACE("(%p %p)\n", this, pfunc);
7945     pfunc(basic_istream_char_get_basic_ios(this));
7946     return this;
7947 }
7948
7949 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
7950 /* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
7951 DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func_ios_base, 8)
7952 basic_istream_char* __thiscall basic_istream_char_read_func_ios_base(basic_istream_char *this,
7953         ios_base* (__cdecl *pfunc)(ios_base*))
7954 {
7955     TRACE("(%p %p)\n", this, pfunc);
7956     pfunc(&basic_istream_char_get_basic_ios(this)->base);
7957     return this;
7958 }
7959
7960 /* Caution: basic_istream uses virtual inheritance. */
7961 static inline basic_ios_wchar* basic_istream_wchar_get_basic_ios(basic_istream_wchar *this)
7962 {
7963     return (basic_ios_wchar*)((char*)this+this->vbtable[1]);
7964 }
7965
7966 static inline basic_ios_wchar* basic_istream_wchar_to_basic_ios(basic_istream_wchar *ptr)
7967 {
7968     return (basic_ios_wchar*)((char*)ptr+basic_istream_wchar_vbtable[1]);
7969 }
7970
7971 static inline basic_istream_wchar* basic_istream_wchar_from_basic_ios(basic_ios_wchar *ptr)
7972 {
7973     return (basic_istream_wchar*)((char*)ptr-basic_istream_wchar_vbtable[1]);
7974 }
7975
7976 /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */
7977 /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */
7978 static basic_istream_wchar* basic_istream_wchar_ctor_init(basic_istream_wchar *this,
7979         basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
7980 {
7981     basic_ios_wchar *base;
7982
7983     TRACE("(%p %p %d %d %d)\n", this, strbuf, isstd, noinit, virt_init);
7984
7985     if(virt_init) {
7986         this->vbtable = basic_istream_wchar_vbtable;
7987         base = basic_istream_wchar_get_basic_ios(this);
7988         basic_ios_wchar_ctor(base);
7989     }else {
7990         base = basic_istream_wchar_get_basic_ios(this);
7991     }
7992
7993     base->base.vtable = &MSVCP_basic_istream_wchar_vtable;
7994     this->count = 0;
7995     if(!noinit)
7996         basic_ios_wchar_init(base, strbuf, isstd);
7997     return this;
7998 }
7999
8000 /* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z */
8001 /* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z */
8002 static basic_istream_wchar* basic_istream_short_ctor_init(basic_istream_wchar *this,
8003         basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
8004 {
8005     basic_istream_wchar_ctor_init(this, strbuf, isstd, noinit, virt_init);
8006     basic_istream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_istream_short_vtable;
8007     return this;
8008 }
8009
8010 /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
8011 /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
8012 static basic_istream_wchar* basic_istream_wchar_ctor(basic_istream_wchar *this,
8013         basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
8014 {
8015     return basic_istream_wchar_ctor_init(this, strbuf, isstd, FALSE, virt_init);
8016 }
8017
8018 /* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
8019 /* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
8020 DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor, 16)
8021 basic_istream_wchar* __thiscall basic_istream_short_ctor(basic_istream_wchar *this,
8022         basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
8023 {
8024     return basic_istream_short_ctor_init(this, strbuf, isstd, FALSE, virt_init);
8025 }
8026
8027 /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@@Z */
8028 /* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
8029 static basic_istream_wchar* basic_istream_wchar_ctor_uninitialized(
8030         basic_istream_wchar *this, int uninitialized, MSVCP_bool virt_init)
8031 {
8032     basic_ios_wchar *base;
8033
8034     TRACE("(%p %d %d)\n", this, uninitialized, virt_init);
8035
8036     if(virt_init) {
8037         this->vbtable = basic_istream_wchar_vbtable;
8038         base = basic_istream_wchar_get_basic_ios(this);
8039         basic_ios_wchar_ctor(base);
8040     }else {
8041         base = basic_istream_wchar_get_basic_ios(this);
8042     }
8043
8044     base->base.vtable = &MSVCP_basic_istream_wchar_vtable;
8045     ios_base_Addstd(&base->base);
8046     return this;
8047 }
8048
8049 /* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z */
8050 /* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
8051 DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor_uninitialized, 12)
8052 basic_istream_wchar* __thiscall basic_istream_short_ctor_uninitialized(
8053         basic_istream_wchar *this, int uninitialized, MSVCP_bool virt_init)
8054 {
8055     basic_istream_wchar_ctor_uninitialized(this, uninitialized, virt_init);
8056     basic_istream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_istream_short_vtable;
8057     return this;
8058 }
8059
8060 /* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
8061 /* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
8062 /* ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UAE@XZ */
8063 /* ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
8064 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_dtor, 4)
8065 void __thiscall basic_istream_wchar_dtor(basic_ios_wchar *base)
8066 {
8067     basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base);
8068
8069     /* don't destroy virtual base here */
8070     TRACE("(%p)\n", this);
8071 }
8072
8073 /* ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
8074 /* ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
8075 /* ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ */
8076 /* ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
8077 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_vbase_dtor, 4)
8078 void __thiscall basic_istream_wchar_vbase_dtor(basic_istream_wchar *this)
8079 {
8080     TRACE("(%p)\n", this);
8081     basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(this));
8082     basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(this));
8083 }
8084
8085 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_vector_dtor, 8)
8086 basic_istream_wchar* __thiscall basic_istream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
8087 {
8088     basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base);
8089
8090     TRACE("(%p %x)\n", this, flags);
8091
8092     if(flags & 2) {
8093         /* we have an array, with the number of elements stored before the first object */
8094         INT_PTR i, *ptr = (INT_PTR *)this-1;
8095
8096         for(i=*ptr-1; i>=0; i--)
8097             basic_istream_wchar_vbase_dtor(this+i);
8098         MSVCRT_operator_delete(ptr);
8099     } else {
8100         basic_istream_wchar_vbase_dtor(this);
8101         if(flags & 1)
8102             MSVCRT_operator_delete(this);
8103     }
8104
8105     return this;
8106 }
8107
8108 /* ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z */
8109 /* ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z */
8110 /* ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z */
8111 /* ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z */
8112 static MSVCP_bool basic_istream_wchar__Ipfx(basic_istream_wchar *this, MSVCP_bool noskip)
8113 {
8114     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8115
8116     TRACE("(%p %d)\n", this, noskip);
8117
8118     if(ios_base_good(&base->base)) {
8119         if(basic_ios_wchar_tie_get(base))
8120             basic_ostream_wchar_flush(basic_ios_wchar_tie_get(base));
8121
8122         if(!noskip && (ios_base_flags_get(&base->base) & FMTFLAG_skipws)) {
8123             basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8124             const ctype_wchar *ctype = ctype_wchar_use_facet(base->strbuf->loc);
8125             int ch;
8126
8127             for(ch = basic_streambuf_wchar_sgetc(strbuf); ;
8128                     ch = basic_streambuf_wchar_snextc(strbuf)) {
8129                 if(ch == WEOF) {
8130                     basic_ios_wchar_setstate(base, IOSTATE_eofbit);
8131                     break;
8132                 }
8133
8134                 if(!ctype_wchar_is_ch(ctype, _SPACE|_BLANK, ch))
8135                     break;
8136             }
8137         }
8138     }
8139
8140     if(!ios_base_good(&base->base)) {
8141         basic_ios_wchar_setstate(base, IOSTATE_failbit);
8142         return FALSE;
8143     }
8144     return TRUE;
8145 }
8146
8147 /* ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z */
8148 /* ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z */
8149 /* ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z */
8150 /* ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z */
8151 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ipfx, 8)
8152 MSVCP_bool __thiscall basic_istream_wchar_ipfx(basic_istream_wchar *this, MSVCP_bool noskip)
8153 {
8154     return basic_istream_wchar__Ipfx(this, noskip);
8155 }
8156
8157 /* ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
8158 /* ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
8159 /* ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ */
8160 /* ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
8161 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_isfx, 4)
8162 void __thiscall basic_istream_wchar_isfx(basic_istream_wchar *this)
8163 {
8164     TRACE("(%p)\n", this);
8165 }
8166
8167 static BOOL basic_istream_wchar_sentry_create(basic_istream_wchar *istr, MSVCP_bool noskip)
8168 {
8169     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istr);
8170
8171     if(basic_ios_wchar_rdbuf_get(base))
8172         basic_streambuf_wchar__Lock(base->strbuf);
8173
8174     return basic_istream_wchar_ipfx(istr, noskip);
8175 }
8176
8177 static void basic_istream_wchar_sentry_destroy(basic_istream_wchar *istr)
8178 {
8179     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istr);
8180
8181     if(basic_ios_wchar_rdbuf_get(base))
8182         basic_streambuf_wchar__Unlock(base->strbuf);
8183 }
8184
8185 /* ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QBEHXZ */
8186 /* ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEBA_JXZ */
8187 /* ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QBEHXZ */
8188 /* ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QEBA_JXZ */
8189 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_gcount, 4)
8190 int __thiscall basic_istream_wchar_gcount(const basic_istream_wchar *this)
8191 {
8192     TRACE("(%p)\n", this);
8193     return this->count;
8194 }
8195
8196 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
8197 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
8198 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ */
8199 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ */
8200 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get, 4)
8201 unsigned short __thiscall basic_istream_wchar_get(basic_istream_wchar *this)
8202 {
8203     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8204     int ret;
8205
8206     TRACE("(%p)\n", this);
8207
8208     this->count = 0;
8209
8210     if(!basic_istream_wchar_sentry_create(this, TRUE)) {
8211         basic_istream_wchar_sentry_destroy(this);
8212         return WEOF;
8213     }
8214
8215     ret = basic_streambuf_wchar_sbumpc(basic_ios_wchar_rdbuf_get(base));
8216     basic_istream_wchar_sentry_destroy(this);
8217     if(ret == WEOF)
8218         basic_ios_wchar_setstate(base, IOSTATE_eofbit|IOSTATE_failbit);
8219     else
8220         this->count++;
8221
8222     return ret;
8223 }
8224
8225 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AA_W@Z */
8226 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEA_W@Z */
8227 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAG@Z */
8228 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAG@Z */
8229 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_ch, 8)
8230 basic_istream_wchar* __thiscall basic_istream_wchar_get_ch(basic_istream_wchar *this, wchar_t *ch)
8231 {
8232     unsigned short ret;
8233
8234     TRACE("(%p %p)\n", this, ch);
8235
8236     ret = basic_istream_wchar_get(this);
8237     if(ret != WEOF)
8238         *ch = (wchar_t)ret;
8239     return this;
8240 }
8241
8242 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH_W@Z */
8243 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z */
8244 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGHG@Z */
8245 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z */
8246 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_str_delim, 16)
8247 basic_istream_wchar* __thiscall basic_istream_wchar_get_str_delim(basic_istream_wchar *this, wchar_t *str, streamsize count, wchar_t delim)
8248 {
8249     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8250     unsigned short ch = delim;
8251
8252     TRACE("(%p %p %ld %c)\n", this, str, count, delim);
8253
8254     this->count = 0;
8255
8256     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8257         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8258
8259         for(ch = basic_streambuf_wchar_sgetc(strbuf); count>1;
8260                 ch = basic_streambuf_wchar_snextc(strbuf)) {
8261             if(ch==WEOF || ch==delim)
8262                 break;
8263
8264             *str++ = ch;
8265             this->count++;
8266             count--;
8267         }
8268     }
8269     basic_istream_wchar_sentry_destroy(this);
8270
8271     basic_ios_wchar_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
8272             (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
8273     if(count > 0)
8274         *str = 0;
8275     return this;
8276 }
8277
8278 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
8279 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
8280 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
8281 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
8282 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_str, 12)
8283 basic_istream_wchar* __thiscall basic_istream_wchar_get_str(basic_istream_wchar *this, wchar_t *str, streamsize count)
8284 {
8285     return basic_istream_wchar_get_str_delim(this, str, count, '\n');
8286 }
8287
8288 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z */
8289 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z */
8290 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z */
8291 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z */
8292 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_streambuf_delim, 12)
8293 basic_istream_wchar* __thiscall basic_istream_wchar_get_streambuf_delim(basic_istream_wchar *this, basic_streambuf_wchar *strbuf, wchar_t delim)
8294 {
8295     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8296     unsigned short ch = delim;
8297
8298     TRACE("(%p %p %c)\n", this, strbuf, delim);
8299
8300     this->count = 0;
8301
8302     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8303         basic_streambuf_wchar *strbuf_read = basic_ios_wchar_rdbuf_get(base);
8304
8305         for(ch = basic_streambuf_wchar_sgetc(strbuf_read); ;
8306                 ch = basic_streambuf_wchar_snextc(strbuf_read)) {
8307             if(ch==WEOF || ch==delim)
8308                 break;
8309
8310             if(basic_streambuf_wchar_sputc(strbuf, ch) == WEOF)
8311                 break;
8312             this->count++;
8313         }
8314     }
8315     basic_istream_wchar_sentry_destroy(this);
8316
8317     basic_ios_wchar_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
8318             (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
8319     return this;
8320 }
8321
8322 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z */
8323 /* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z */
8324 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z */
8325 /* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z */
8326 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_streambuf, 8)
8327 basic_istream_wchar* __thiscall basic_istream_wchar_get_streambuf(basic_istream_wchar *this, basic_streambuf_wchar *strbuf)
8328 {
8329     return basic_istream_wchar_get_streambuf_delim(this, strbuf, '\n');
8330 }
8331
8332 /* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH_W@Z */
8333 /* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z */
8334 /* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGHG@Z */
8335 /* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z */
8336 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_getline_delim, 16)
8337 basic_istream_wchar* __thiscall basic_istream_wchar_getline_delim(basic_istream_wchar *this, wchar_t *str, streamsize count, wchar_t delim)
8338 {
8339     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8340     unsigned short ch = delim;
8341
8342     TRACE("(%p %p %ld %c)\n", this, str, count, delim);
8343
8344     this->count = 0;
8345
8346     if(basic_istream_wchar_sentry_create(this, TRUE) && count>0) {
8347         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8348
8349         while(count > 1) {
8350             ch = basic_streambuf_wchar_sbumpc(strbuf);
8351
8352             if(ch==WEOF || ch==delim)
8353                 break;
8354
8355             *str++ = ch;
8356             this->count++;
8357             count--;
8358         }
8359
8360         if(ch == delim)
8361             this->count++;
8362         else if(ch != WEOF) {
8363             ch = basic_streambuf_wchar_sgetc(strbuf);
8364
8365             if(ch == delim) {
8366                 basic_streambuf_wchar__Gninc(strbuf);
8367                 this->count++;
8368             }
8369         }
8370     }
8371     basic_istream_wchar_sentry_destroy(this);
8372
8373     basic_ios_wchar_setstate(base, (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit) |
8374             (!this->count || (ch!=delim && ch!=WEOF) ? IOSTATE_failbit : IOSTATE_goodbit));
8375     if(count > 0)
8376         *str = 0;
8377     return this;
8378 }
8379
8380 /* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
8381 /* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
8382 /* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
8383 /* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
8384 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_getline, 12)
8385 basic_istream_wchar* __thiscall basic_istream_wchar_getline(basic_istream_wchar *this, wchar_t *str, streamsize count)
8386 {
8387     return basic_istream_wchar_getline_delim(this, str, count, '\n');
8388 }
8389
8390 /* ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@HG@Z */
8391 /* ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JG@Z */
8392 /* ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@HG@Z */
8393 /* ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JG@Z */
8394 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ignore, 12)
8395 basic_istream_wchar* __thiscall basic_istream_wchar_ignore(basic_istream_wchar *this, streamsize count, unsigned short delim)
8396 {
8397     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8398     unsigned short ch = delim;
8399     unsigned int state;
8400
8401     TRACE("(%p %ld %d)\n", this, count, delim);
8402
8403     this->count = 0;
8404
8405     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8406         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8407         state = IOSTATE_goodbit;
8408
8409         while(count > 0) {
8410             ch = basic_streambuf_wchar_sbumpc(strbuf);
8411
8412             if(ch==WEOF) {
8413                 state = IOSTATE_eofbit;
8414                 break;
8415             }
8416
8417             if(ch==delim)
8418                 break;
8419
8420             this->count++;
8421             if(count != INT_MAX)
8422                 count--;
8423         }
8424     }else
8425         state = IOSTATE_failbit;
8426     basic_istream_wchar_sentry_destroy(this);
8427
8428     basic_ios_wchar_setstate(base, state);
8429     return this;
8430 }
8431
8432 /* ?ws@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
8433 /* ?ws@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
8434 /* ?ws@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@1@AAV21@@Z */
8435 /* ?ws@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
8436 basic_istream_wchar* __cdecl ws_basic_istream_wchar(basic_istream_wchar *istream)
8437 {
8438     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istream);
8439     unsigned short ch = '\n';
8440
8441     TRACE("(%p)\n", istream);
8442
8443     if(basic_istream_wchar_sentry_create(istream, TRUE)) {
8444         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8445         const ctype_wchar *ctype = ctype_wchar_use_facet(strbuf->loc);
8446
8447         for(ch = basic_streambuf_wchar_sgetc(strbuf); ctype_wchar_is_ch(ctype, _SPACE, ch);
8448                 ch = basic_streambuf_wchar_snextc(strbuf)) {
8449             if(ch == WEOF)
8450                 break;
8451         }
8452     }
8453     basic_istream_wchar_sentry_destroy(istream);
8454
8455     if(ch == WEOF)
8456         basic_ios_wchar_setstate(base, IOSTATE_eofbit);
8457     return istream;
8458 }
8459
8460 /* ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
8461 /* ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
8462 /* ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ */
8463 /* ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ */
8464 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_peek, 4)
8465 unsigned short __thiscall basic_istream_wchar_peek(basic_istream_wchar *this)
8466 {
8467     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8468     unsigned short ret = WEOF;
8469
8470     TRACE("(%p)\n", this);
8471
8472     this->count = 0;
8473
8474     if(basic_istream_wchar_sentry_create(this, TRUE))
8475         ret = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base));
8476     basic_istream_wchar_sentry_destroy(this);
8477     return ret;
8478 }
8479
8480 /* ?_Read_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WIH@Z */
8481 /* ?_Read_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_K_J@Z */
8482 /* ?_Read_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGIH@Z */
8483 /* ?_Read_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_K_J@Z */
8484 static basic_istream_wchar* basic_istream_wchar__Read_s(basic_istream_wchar *this, wchar_t *str, MSVCP_size_t size, streamsize count)
8485 {
8486     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8487     IOSB_iostate state = IOSTATE_goodbit;
8488
8489     TRACE("(%p %p %lu %ld)\n", this, str, size, count);
8490
8491     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8492         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8493
8494         this->count = basic_streambuf_wchar__Sgetn_s(strbuf, str, size, count);
8495         if(this->count != count)
8496             state |= IOSTATE_failbit | IOSTATE_eofbit;
8497     }else {
8498         this->count = 0;
8499     }
8500     basic_istream_wchar_sentry_destroy(this);
8501
8502     basic_ios_wchar_setstate(base, state);
8503     return this;
8504 }
8505
8506 /* ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
8507 /* ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
8508 /* ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
8509 /* ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
8510 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read, 12)
8511 basic_istream_wchar* __thiscall basic_istream_wchar_read(basic_istream_wchar *this, wchar_t *str, streamsize count)
8512 {
8513     return basic_istream_wchar__Read_s(this, str, count, count);
8514 }
8515
8516 /* ?_Readsome_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHPA_WIH@Z */
8517 /* ?_Readsome_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_K_J@Z */
8518 /* ?_Readsome_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHPAGIH@Z */
8519 /* ?_Readsome_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_K_J@Z */
8520 static streamsize basic_istream_wchar__Readsome_s(basic_istream_wchar *this, wchar_t *str, MSVCP_size_t size, streamsize count)
8521 {
8522     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8523     IOSB_iostate state = IOSTATE_goodbit;
8524
8525     TRACE("(%p %p %lu %ld)\n", this, str, size, count);
8526
8527     this->count = 0;
8528
8529     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8530         streamsize avail = basic_streambuf_wchar_in_avail(basic_ios_wchar_rdbuf_get(base));
8531         if(avail > count)
8532             avail = count;
8533
8534         if(avail == -1)
8535             state |= IOSTATE_eofbit;
8536         else if(avail > 0)
8537             basic_istream_wchar__Read_s(this, str, size, avail);
8538     }else {
8539         state |= IOSTATE_failbit;
8540     }
8541     basic_istream_wchar_sentry_destroy(this);
8542
8543     basic_ios_wchar_setstate(base, state);
8544     return this->count;
8545 }
8546
8547 /* ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHPA_WH@Z */
8548 /* ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z */
8549 /* ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHPAGH@Z */
8550 /* ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z */
8551 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_readsome, 12)
8552 streamsize __thiscall basic_istream_wchar_readsome(basic_istream_wchar *this, wchar_t *str, streamsize count)
8553 {
8554     return basic_istream_wchar__Readsome_s(this, str, count, count);
8555 }
8556
8557 /* ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z */
8558 /* ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z */
8559 /* ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z */
8560 /* ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z */
8561 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_putback, 8)
8562 basic_istream_wchar* __thiscall basic_istream_wchar_putback(basic_istream_wchar *this, wchar_t ch)
8563 {
8564     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8565     IOSB_iostate state = IOSTATE_goodbit;
8566
8567     TRACE("(%p %c)\n", this, ch);
8568
8569     this->count = 0;
8570
8571     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8572         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8573
8574         if(!ios_base_good(&base->base))
8575             state |= IOSTATE_failbit;
8576         else if(!strbuf || basic_streambuf_wchar_sputbackc(strbuf, ch)==WEOF)
8577             state |= IOSTATE_badbit;
8578     }
8579     basic_istream_wchar_sentry_destroy(this);
8580
8581     basic_ios_wchar_setstate(base, state);
8582     return this;
8583 }
8584
8585 /* ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ */
8586 /* ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ */
8587 /* ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ */
8588 /* ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ */
8589 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_unget, 4)
8590 basic_istream_wchar* __thiscall basic_istream_wchar_unget(basic_istream_wchar *this)
8591 {
8592     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8593     IOSB_iostate state = IOSTATE_goodbit;
8594
8595     TRACE("(%p)\n", this);
8596
8597     this->count = 0;
8598
8599     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8600         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8601
8602         if(!ios_base_good(&base->base))
8603             state |= IOSTATE_failbit;
8604         else if(!strbuf || basic_streambuf_wchar_sungetc(strbuf)==WEOF)
8605             state |= IOSTATE_badbit;
8606     }
8607     basic_istream_wchar_sentry_destroy(this);
8608
8609     basic_ios_wchar_setstate(base, state);
8610     return this;
8611 }
8612
8613 /* ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHXZ */
8614 /* ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAHXZ */
8615 /* ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHXZ */
8616 /* ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAHXZ */
8617 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_sync, 4)
8618 int __thiscall basic_istream_wchar_sync(basic_istream_wchar *this)
8619 {
8620     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8621     basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8622
8623     TRACE("(%p)\n", this);
8624
8625     if(!strbuf)
8626         return -1;
8627
8628     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8629         if(basic_streambuf_wchar_pubsync(strbuf) != -1) {
8630             basic_istream_wchar_sentry_destroy(this);
8631             return 0;
8632         }
8633     }
8634     basic_istream_wchar_sentry_destroy(this);
8635
8636     basic_ios_wchar_setstate(base, IOSTATE_badbit);
8637     return -1;
8638 }
8639
8640 /* ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ */
8641 /* ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
8642 /* ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ */
8643 /* ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
8644 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_tellg, 8)
8645 fpos_int* __thiscall basic_istream_wchar_tellg(basic_istream_wchar *this, fpos_int *ret)
8646 {
8647     TRACE("(%p %p)\n", this, ret);
8648
8649     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8650         basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8651         if(!ios_base_fail(&base->base)) {
8652             basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
8653                     ret, 0, SEEKDIR_cur, OPENMODE_in);
8654             basic_istream_wchar_sentry_destroy(this);
8655
8656             if(ret->off==0 && ret->pos==-1 && ret->state==0)
8657                 basic_ios_wchar_setstate(base, IOSTATE_failbit);
8658             return ret;
8659         }
8660     }
8661     basic_istream_wchar_sentry_destroy(this);
8662
8663     ret->off = 0;
8664     ret->pos = -1;
8665     ret->state = 0;
8666     return ret;
8667 }
8668
8669 /* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@JW4seekdir@ios_base@2@@Z */
8670 /* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JW4seekdir@ios_base@2@@Z */
8671 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_seekg, 12)
8672 basic_istream_wchar* __thiscall basic_istream_wchar_seekg(basic_istream_wchar *this, streamoff off, int dir)
8673 {
8674     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8675
8676     TRACE("(%p %ld %d)\n", this, off, dir);
8677
8678     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8679         if(!ios_base_fail(&base->base)) {
8680             basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8681             fpos_int ret;
8682
8683             basic_streambuf_wchar_pubseekoff(strbuf, &ret, off, dir, OPENMODE_in);
8684             basic_istream_wchar_sentry_destroy(this);
8685
8686             if(ret.off==0 && ret.pos==-1 && ret.state==0)
8687                 basic_ios_wchar_setstate(base, IOSTATE_failbit);
8688             else
8689                 basic_ios_wchar_clear(base, IOSTATE_goodbit);
8690             return this;
8691         }
8692     }
8693     basic_istream_wchar_sentry_destroy(this);
8694
8695     basic_ios_wchar_setstate(base, IOSTATE_failbit);
8696     return this;
8697 }
8698
8699 /* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
8700 /* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
8701 /* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
8702 /* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
8703 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_seekg_fpos, 28)
8704 basic_istream_wchar* __thiscall basic_istream_wchar_seekg_fpos(basic_istream_wchar *this, fpos_int pos)
8705 {
8706     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8707
8708     TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
8709
8710     if(basic_istream_wchar_sentry_create(this, TRUE)) {
8711         if(!ios_base_fail(&base->base)) {
8712             basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8713             fpos_int ret;
8714
8715             basic_streambuf_wchar_pubseekpos(strbuf, &ret, pos, OPENMODE_in);
8716             basic_istream_wchar_sentry_destroy(this);
8717
8718             if(ret.off==0 && ret.pos==-1 && ret.state==0)
8719                 basic_ios_wchar_setstate(base, IOSTATE_failbit);
8720             else
8721                 basic_ios_wchar_clear(base, IOSTATE_goodbit);
8722             return this;
8723         }
8724     }
8725     basic_istream_wchar_sentry_destroy(this);
8726
8727     basic_ios_wchar_setstate(base, IOSTATE_failbit);
8728     return this;
8729 }
8730
8731 static basic_istream_wchar* basic_istream_read_short(basic_istream_wchar *this, short *v, const num_get *numget)
8732 {
8733     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8734     int state = IOSTATE_goodbit;
8735
8736     TRACE("(%p %p)\n", this, v);
8737
8738     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8739         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8740         istreambuf_iterator_wchar first={0}, last={0};
8741         LONG tmp;
8742
8743         first.strbuf = strbuf;
8744         num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, &tmp);
8745
8746         if(!(state&IOSTATE_failbit) && tmp==(LONG)((short)tmp))
8747             *v = tmp;
8748         else
8749             state |= IOSTATE_failbit;
8750     }
8751     basic_istream_wchar_sentry_destroy(this);
8752
8753     basic_ios_wchar_setstate(base, state);
8754     return this;
8755 }
8756
8757 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAF@Z */
8758 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAF@Z */
8759 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_short, 8)
8760 basic_istream_wchar* __thiscall basic_istream_short_read_short(basic_istream_wchar *this, short *v)
8761 {
8762     return basic_istream_read_short(this, v, num_get_short_use_facet(
8763                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8764 }
8765
8766 static basic_istream_wchar* basic_istream_read_int(basic_istream_wchar *this, int *v, const num_get *numget)
8767 {
8768     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8769     int state = IOSTATE_goodbit;
8770
8771     TRACE("(%p %p)\n", this, v);
8772
8773     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8774         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8775         istreambuf_iterator_wchar first={0}, last={0};
8776
8777         first.strbuf = strbuf;
8778         num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, v);
8779     }
8780     basic_istream_wchar_sentry_destroy(this);
8781
8782     basic_ios_wchar_setstate(base, state);
8783     return this;
8784 }
8785
8786 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAH@Z */
8787 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAH@Z */
8788 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_int, 8)
8789 basic_istream_wchar* __thiscall basic_istream_short_read_int(basic_istream_wchar *this, int *v)
8790 {
8791     return basic_istream_read_int(this, v, num_get_short_use_facet(
8792                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8793 }
8794
8795 static basic_istream_wchar* basic_istream_read_uint(basic_istream_wchar *this, unsigned int *v, const num_get *numget)
8796 {
8797     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8798     int state = IOSTATE_goodbit;
8799
8800     TRACE("(%p %p)\n", this, v);
8801
8802     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8803         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8804         istreambuf_iterator_wchar first={0}, last={0};
8805
8806         first.strbuf = strbuf;
8807         num_get_wchar_get_uint(numget, &last, first, last, &base->base, &state, v);
8808     }
8809     basic_istream_wchar_sentry_destroy(this);
8810
8811     basic_ios_wchar_setstate(base, state);
8812     return this;
8813 }
8814
8815 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAI@Z */
8816 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAI@Z */
8817 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_uint, 8)
8818 basic_istream_wchar* __thiscall basic_istream_short_read_uint(basic_istream_wchar *this, unsigned int *v)
8819 {
8820     return basic_istream_read_uint(this, v, num_get_short_use_facet(
8821                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8822 }
8823
8824 static basic_istream_wchar* basic_istream_read_long(basic_istream_wchar *this, LONG *v, const num_get *numget)
8825 {
8826     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8827     int state = IOSTATE_goodbit;
8828
8829     TRACE("(%p %p)\n", this, v);
8830
8831     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8832         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8833         istreambuf_iterator_wchar first={0}, last={0};
8834
8835         first.strbuf = strbuf;
8836         num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, v);
8837     }
8838     basic_istream_wchar_sentry_destroy(this);
8839
8840     basic_ios_wchar_setstate(base, state);
8841     return this;
8842 }
8843
8844 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAJ@Z */
8845 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z */
8846 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_long, 8)
8847 basic_istream_wchar* __thiscall basic_istream_short_read_long(basic_istream_wchar *this, LONG *v)
8848 {
8849     return basic_istream_read_long(this, v, num_get_short_use_facet(
8850                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8851 }
8852
8853 static basic_istream_wchar* basic_istream_read_ulong(basic_istream_wchar *this, ULONG *v, const num_get *numget)
8854 {
8855     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8856     int state = IOSTATE_goodbit;
8857
8858     TRACE("(%p %p)\n", this, v);
8859
8860     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8861         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8862         istreambuf_iterator_wchar first={0}, last={0};
8863
8864         first.strbuf = strbuf;
8865         num_get_wchar_get_ulong(numget, &last, first, last, &base->base, &state, v);
8866     }
8867     basic_istream_wchar_sentry_destroy(this);
8868
8869     basic_ios_wchar_setstate(base, state);
8870     return this;
8871 }
8872
8873 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAK@Z */
8874 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAK@Z */
8875 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ulong, 8)
8876 basic_istream_wchar* __thiscall basic_istream_short_read_ulong(basic_istream_wchar *this, ULONG *v)
8877 {
8878     return basic_istream_read_ulong(this, v, num_get_short_use_facet(
8879                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8880 }
8881
8882 static basic_istream_wchar* basic_istream_read_float(basic_istream_wchar *this, float *v, const num_get *numget)
8883 {
8884     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8885     int state = IOSTATE_goodbit;
8886
8887     TRACE("(%p %p)\n", this, v);
8888
8889     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8890         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8891         istreambuf_iterator_wchar first={0}, last={0};
8892
8893         first.strbuf = strbuf;
8894         num_get_wchar_get_float(numget, &last, first, last, &base->base, &state, v);
8895     }
8896     basic_istream_wchar_sentry_destroy(this);
8897
8898     basic_ios_wchar_setstate(base, state);
8899     return this;
8900 }
8901
8902 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAM@Z */
8903 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAM@Z */
8904 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_float, 8)
8905 basic_istream_wchar* __thiscall basic_istream_short_read_float(basic_istream_wchar *this, float *v)
8906 {
8907     return basic_istream_read_float(this, v, num_get_short_use_facet(
8908                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8909 }
8910
8911 static basic_istream_wchar* basic_istream_read_double(basic_istream_wchar *this, double *v, const num_get *numget)
8912 {
8913     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8914     int state = IOSTATE_goodbit;
8915
8916     TRACE("(%p %p)\n", this, v);
8917
8918     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8919         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8920         istreambuf_iterator_wchar first={0}, last={0};
8921
8922         first.strbuf = strbuf;
8923         num_get_wchar_get_double(numget, &last, first, last, &base->base, &state, v);
8924     }
8925     basic_istream_wchar_sentry_destroy(this);
8926
8927     basic_ios_wchar_setstate(base, state);
8928     return this;
8929 }
8930
8931 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAN@Z */
8932 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAN@Z */
8933 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_double, 8)
8934 basic_istream_wchar* __thiscall basic_istream_short_read_double(basic_istream_wchar *this, double *v)
8935 {
8936     return basic_istream_read_double(this, v, num_get_short_use_facet(
8937                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8938 }
8939
8940 static basic_istream_wchar* basic_istream_read_ldouble(basic_istream_wchar *this, double *v, const num_get *numget)
8941 {
8942     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8943     int state = IOSTATE_goodbit;
8944
8945     TRACE("(%p %p)\n", this, v);
8946
8947     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8948         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8949         istreambuf_iterator_wchar first={0}, last={0};
8950
8951         first.strbuf = strbuf;
8952         num_get_wchar_get_ldouble(numget, &last, first, last, &base->base, &state, v);
8953     }
8954     basic_istream_wchar_sentry_destroy(this);
8955
8956     basic_ios_wchar_setstate(base, state);
8957     return this;
8958 }
8959
8960 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAO@Z */
8961 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAO@Z */
8962 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ldouble, 8)
8963 basic_istream_wchar* __thiscall basic_istream_short_read_ldouble(basic_istream_wchar *this, double *v)
8964 {
8965     return basic_istream_read_ldouble(this, v, num_get_short_use_facet(
8966                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8967 }
8968
8969 static basic_istream_wchar* basic_istream_read_ptr(basic_istream_wchar *this, void **v, const num_get *numget)
8970 {
8971     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
8972     int state = IOSTATE_goodbit;
8973
8974     TRACE("(%p %p)\n", this, v);
8975
8976     if(basic_istream_wchar_sentry_create(this, FALSE)) {
8977         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
8978         istreambuf_iterator_wchar first={0}, last={0};
8979
8980         first.strbuf = strbuf;
8981         num_get_wchar_get_void(numget, &last, first, last, &base->base, &state, v);
8982     }
8983     basic_istream_wchar_sentry_destroy(this);
8984
8985     basic_ios_wchar_setstate(base, state);
8986     return this;
8987 }
8988
8989 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAPAX@Z */
8990 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
8991 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ptr, 8)
8992 basic_istream_wchar* __thiscall basic_istream_short_read_ptr(basic_istream_wchar *this, void **v)
8993 {
8994     return basic_istream_read_ptr(this, v, num_get_short_use_facet(
8995                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
8996 }
8997
8998 static basic_istream_wchar* basic_istream_read_int64(basic_istream_wchar *this, __int64 *v, const num_get *numget)
8999 {
9000     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
9001     int state = IOSTATE_goodbit;
9002
9003     TRACE("(%p %p)\n", this, v);
9004
9005     if(basic_istream_wchar_sentry_create(this, FALSE)) {
9006         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
9007         istreambuf_iterator_wchar first={0}, last={0};
9008
9009         first.strbuf = strbuf;
9010         num_get_wchar_get_int64(numget, &last, first, last, &base->base, &state, v);
9011     }
9012     basic_istream_wchar_sentry_destroy(this);
9013
9014     basic_ios_wchar_setstate(base, state);
9015     return this;
9016 }
9017
9018 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_J@Z */
9019 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_J@Z */
9020 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_int64, 8)
9021 basic_istream_wchar* __thiscall basic_istream_short_read_int64(basic_istream_wchar *this, __int64 *v)
9022 {
9023     return basic_istream_read_int64(this, v, num_get_short_use_facet(
9024                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
9025 }
9026
9027 static basic_istream_wchar* basic_istream_read_uint64(basic_istream_wchar *this, unsigned __int64 *v, const num_get *numget)
9028 {
9029     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
9030     int state = IOSTATE_goodbit;
9031
9032     TRACE("(%p %p)\n", this, v);
9033
9034     if(basic_istream_wchar_sentry_create(this, FALSE)) {
9035         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
9036         istreambuf_iterator_wchar first={0}, last={0};
9037
9038         first.strbuf = strbuf;
9039         num_get_wchar_get_uint64(numget, &last, first, last, &base->base, &state, v);
9040     }
9041     basic_istream_wchar_sentry_destroy(this);
9042
9043     basic_ios_wchar_setstate(base, state);
9044     return this;
9045 }
9046
9047 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_K@Z */
9048 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_K@Z */
9049 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_uint64, 8)
9050 basic_istream_wchar* __thiscall basic_istream_short_read_uint64(basic_istream_wchar *this, unsigned __int64 *v)
9051 {
9052     return basic_istream_read_uint64(this, v, num_get_short_use_facet(
9053                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
9054 }
9055
9056 static basic_istream_wchar* basic_istream_read_bool(basic_istream_wchar *this, MSVCP_bool *v, const num_get *numget)
9057 {
9058     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
9059     int state = IOSTATE_goodbit;
9060
9061     TRACE("(%p %p)\n", this, v);
9062
9063     if(basic_istream_wchar_sentry_create(this, FALSE)) {
9064         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
9065         istreambuf_iterator_wchar first={0}, last={0};
9066
9067         first.strbuf = strbuf;
9068         num_get_wchar_get_bool(numget, &last, first, last, &base->base, &state, v);
9069     }
9070     basic_istream_wchar_sentry_destroy(this);
9071
9072     basic_ios_wchar_setstate(base, state);
9073     return this;
9074 }
9075
9076 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_N@Z */
9077 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_N@Z */
9078 DEFINE_THISCALL_WRAPPER(basic_istream_short_read_bool, 8)
9079 basic_istream_wchar* __thiscall basic_istream_short_read_bool(basic_istream_wchar *this, MSVCP_bool *v)
9080 {
9081     return basic_istream_read_bool(this, v, num_get_short_use_facet(
9082                 basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
9083 }
9084
9085 /* ??$getline@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AAV10@AAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@_W@Z */
9086 /* ??$getline@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AEAV10@AEAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@_W@Z */
9087 /* ??$getline@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@0@AAV10@AAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@G@Z */
9088 /* ??$getline@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@0@AEAV10@AEAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@G@Z */
9089 basic_istream_wchar* __cdecl basic_istream_wchar_getline_bstr_delim(
9090         basic_istream_wchar *istream, basic_string_wchar *str, wchar_t delim)
9091 {
9092     IOSB_iostate state = IOSTATE_failbit;
9093     int c = delim;
9094
9095     TRACE("(%p %p %c)\n", istream, str, delim);
9096
9097     if(basic_istream_wchar_sentry_create(istream, TRUE)) {
9098         basic_string_wchar_clear(str);
9099
9100         c = basic_istream_wchar_get(istream);
9101         if(c != WEOF)
9102             state = IOSTATE_goodbit;
9103
9104         for(; c!=delim && c!=WEOF; c = basic_istream_wchar_get(istream)) {
9105             state = IOSTATE_goodbit;
9106             basic_string_wchar_append_ch(str, c);
9107         }
9108     }
9109     basic_istream_wchar_sentry_destroy(istream);
9110
9111     basic_ios_wchar_setstate(basic_istream_wchar_get_basic_ios(istream),
9112             state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
9113     return istream;
9114 }
9115
9116 /* ??$getline@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AAV10@AAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z */
9117 /* ??$getline@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AEAV10@AEAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z */
9118 /* ??$getline@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@0@AAV10@AAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@@Z */
9119 /* ??$getline@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@0@AEAV10@AEAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@@Z */
9120 basic_istream_wchar* __cdecl basic_istream_wchar_getline_bstr(
9121         basic_istream_wchar *istream, basic_string_wchar *str)
9122 {
9123     return basic_istream_wchar_getline_bstr_delim(istream, str, '\n');
9124 }
9125
9126 static basic_istream_wchar* basic_istream_read_bstr(basic_istream_wchar *istream,
9127         basic_string_wchar *str, const ctype_wchar *ctype)
9128 {
9129     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istream);
9130     IOSB_iostate state = IOSTATE_failbit;
9131     int c = '\n';
9132
9133     TRACE("(%p %p)\n", istream, str);
9134
9135     if(basic_istream_wchar_sentry_create(istream, FALSE)) {
9136         MSVCP_size_t count = ios_base_width_get(&base->base);
9137
9138         if(!count)
9139             count = -1;
9140
9141         basic_string_wchar_clear(str);
9142
9143         for(c = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base));
9144                 c!=WEOF && !ctype_wchar_is_ch(ctype, _SPACE|_BLANK, c) && count>0;
9145                 c = basic_streambuf_wchar_snextc(basic_ios_wchar_rdbuf_get(base)), count--) {
9146             state = IOSTATE_goodbit;
9147             basic_string_wchar_append_ch(str, c);
9148         }
9149     }
9150     basic_istream_wchar_sentry_destroy(istream);
9151
9152     ios_base_width_set(&base->base, 0);
9153     basic_ios_wchar_setstate(base, state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
9154     return istream;
9155 }
9156
9157 /* ??$?5_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AAV10@AAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z */
9158 /* ??$?5_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AEAV10@AEAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z */
9159 basic_istream_wchar* __cdecl basic_istream_wchar_read_bstr(
9160         basic_istream_wchar *istream, basic_string_wchar *str)
9161 {
9162     return basic_istream_read_bstr(istream, str, ctype_wchar_use_facet(
9163                 basic_istream_wchar_get_basic_ios(istream)->strbuf->loc));
9164 }
9165
9166 /* ??$?5GU?$char_traits@G@std@@V?$allocator@G@1@@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@0@AAV10@AAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@@Z */
9167 /* ??$?5GU?$char_traits@G@std@@V?$allocator@G@1@@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@0@AEAV10@AEAV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@0@@Z */
9168 basic_istream_wchar* __cdecl basic_istream_short_read_bstr(
9169         basic_istream_wchar *istream, basic_string_wchar *str)
9170 {
9171     return basic_istream_read_bstr(istream, str, ctype_short_use_facet(
9172                 basic_istream_wchar_get_basic_ios(istream)->strbuf->loc));
9173 }
9174
9175 static basic_istream_wchar* basic_istream_read_str(basic_istream_wchar *istream, wchar_t *str, const ctype_wchar *ctype)
9176 {
9177     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istream);
9178     IOSB_iostate state = IOSTATE_failbit;
9179     unsigned short c = '\n';
9180
9181     TRACE("(%p %p)\n", istream, str);
9182
9183     if(basic_istream_wchar_sentry_create(istream, FALSE)) {
9184         MSVCP_size_t count = ios_base_width_get(&base->base)-1;
9185
9186         for(c = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base));
9187                 c!=WEOF && !ctype_wchar_is_ch(ctype, _SPACE|_BLANK, c) && count>0;
9188                 c = basic_streambuf_wchar_snextc(basic_ios_wchar_rdbuf_get(base)), count--) {
9189             state = IOSTATE_goodbit;
9190             *str++ = c;
9191         }
9192     }
9193     basic_istream_wchar_sentry_destroy(istream);
9194
9195     *str = 0;
9196     ios_base_width_set(&base->base, 0);
9197     basic_ios_wchar_setstate(base, state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
9198     return istream;
9199 }
9200
9201 /* ??$?5GU?$char_traits@G@std@@@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@0@AAV10@PAG@Z */
9202 /* ??$?5GU?$char_traits@G@std@@@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@0@AEAV10@PEAG@Z */
9203 basic_istream_wchar* __cdecl basic_istream_short_read_str(basic_istream_wchar *istream, wchar_t *str)
9204 {
9205     return basic_istream_read_str(istream, str, ctype_short_use_facet(
9206                 basic_istream_wchar_get_basic_ios(istream)->strbuf->loc));
9207 }
9208
9209 /* ??$?5_WU?$char_traits@_W@std@@@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AAV10@AA_W@Z */
9210 /* ??$?5_WU?$char_traits@_W@std@@@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@0@AEAV10@AEA_W@Z */
9211 /* ??$?5GU?$char_traits@G@std@@@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@0@AAV10@AAG@Z */
9212 /* ??$?5GU?$char_traits@G@std@@@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@0@AEAV10@AEAG@Z */
9213 basic_istream_wchar* __cdecl basic_istream_wchar_read_ch(basic_istream_wchar *istream, wchar_t *ch)
9214 {
9215     IOSB_iostate state = IOSTATE_failbit;
9216     unsigned short c = 0;
9217
9218     TRACE("(%p %p)\n", istream, ch);
9219
9220     if(basic_istream_wchar_sentry_create(istream, FALSE)) {
9221         c = basic_streambuf_wchar_sbumpc(basic_ios_wchar_rdbuf_get(
9222                     basic_istream_wchar_get_basic_ios(istream)));
9223         if(c != WEOF) {
9224             state = IOSTATE_goodbit;
9225             *ch = c;
9226         }
9227     }
9228     basic_istream_wchar_sentry_destroy(istream);
9229
9230     basic_ios_wchar_setstate(basic_istream_wchar_get_basic_ios(istream),
9231             state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
9232     return istream;
9233 }
9234
9235 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
9236 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
9237 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
9238 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
9239 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_streambuf, 8)
9240 basic_istream_wchar* __thiscall basic_istream_wchar_read_streambuf(
9241         basic_istream_wchar *this, basic_streambuf_wchar *streambuf)
9242 {
9243     basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
9244     IOSB_iostate state = IOSTATE_failbit;
9245     unsigned short c = '\n';
9246
9247     TRACE("(%p %p)\n", this, streambuf);
9248
9249     if(basic_istream_wchar_sentry_create(this, FALSE)) {
9250         for(c = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base)); c!=WEOF;
9251                 c = basic_streambuf_wchar_snextc(basic_ios_wchar_rdbuf_get(base))) {
9252             state = IOSTATE_goodbit;
9253             if(basic_streambuf_wchar_sputc(streambuf, c) == WEOF)
9254                 break;
9255         }
9256     }
9257     basic_istream_wchar_sentry_destroy(this);
9258
9259     basic_ios_wchar_setstate(base, state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
9260     return this;
9261 }
9262
9263 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
9264 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
9265 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
9266 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
9267 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func, 8)
9268 basic_istream_wchar* __thiscall basic_istream_wchar_read_func(basic_istream_wchar *this,
9269         basic_istream_wchar* (__cdecl *pfunc)(basic_istream_wchar*))
9270 {
9271     TRACE("(%p %p)\n", this, pfunc);
9272     pfunc(this);
9273     return this;
9274 }
9275
9276 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z */
9277 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z */
9278 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z */
9279 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z */
9280 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func_basic_ios, 8)
9281 basic_istream_wchar* __thiscall basic_istream_wchar_read_func_basic_ios(basic_istream_wchar *this,
9282         basic_ios_wchar* (__cdecl *pfunc)(basic_ios_wchar*))
9283 {
9284     TRACE("(%p %p)\n", this, pfunc);
9285     pfunc(basic_istream_wchar_get_basic_ios(this));
9286     return this;
9287 }
9288
9289 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
9290 /* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
9291 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
9292 /* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
9293 DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func_ios_base, 8)
9294 basic_istream_wchar* __thiscall basic_istream_wchar_read_func_ios_base(
9295         basic_istream_wchar *this, ios_base* (__cdecl *pfunc)(ios_base*))
9296 {
9297     TRACE("(%p %p)\n", this, pfunc);
9298     pfunc(&basic_istream_wchar_get_basic_ios(this)->base);
9299     return this;
9300 }
9301
9302 static inline basic_ios_char* basic_iostream_char_to_basic_ios(basic_iostream_char *ptr)
9303 {
9304     return (basic_ios_char*)((char*)ptr+basic_iostream_char_vbtable1[1]);
9305 }
9306
9307 static inline basic_iostream_char* basic_iostream_char_from_basic_ios(basic_ios_char *ptr)
9308 {
9309     return (basic_iostream_char*)((char*)ptr-basic_iostream_char_vbtable1[1]);
9310 }
9311
9312 /* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
9313 /* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
9314 DEFINE_THISCALL_WRAPPER(basic_iostream_char_ctor, 12)
9315 basic_iostream_char* __thiscall basic_iostream_char_ctor(basic_iostream_char *this, basic_streambuf_char *strbuf, MSVCP_bool virt_init)
9316 {
9317     basic_ios_char *basic_ios;
9318
9319     TRACE("(%p %p %d)\n", this, strbuf, virt_init);
9320
9321     if(virt_init) {
9322         this->base1.vbtable = basic_iostream_char_vbtable1;
9323         this->base2.vbtable = basic_iostream_char_vbtable2;
9324         basic_ios = basic_istream_char_get_basic_ios(&this->base1);
9325         basic_ios_char_ctor(basic_ios);
9326     }else {
9327         basic_ios = basic_istream_char_get_basic_ios(&this->base1);
9328     }
9329
9330     basic_ios->base.vtable = &MSVCP_basic_iostream_char_vtable;
9331
9332     basic_istream_char_ctor(&this->base1, strbuf, FALSE, FALSE);
9333     basic_ostream_char_ctor_uninitialized(&this->base2, 0, FALSE, FALSE);
9334     return this;
9335 }
9336
9337 /* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ */
9338 /* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
9339 DEFINE_THISCALL_WRAPPER(basic_iostream_char_dtor, 4)
9340 void __thiscall basic_iostream_char_dtor(basic_ios_char *base)
9341 {
9342     basic_iostream_char *this = basic_iostream_char_from_basic_ios(base);
9343
9344     TRACE("(%p)\n", this);
9345     basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base2));
9346     basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base1));
9347 }
9348
9349 /* ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
9350 /* ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
9351 DEFINE_THISCALL_WRAPPER(basic_iostream_char_vbase_dtor, 4)
9352 void __thiscall basic_iostream_char_vbase_dtor(basic_iostream_char *this)
9353 {
9354     TRACE("(%p)\n", this);
9355     basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(this));
9356     basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base1));
9357 }
9358
9359 DEFINE_THISCALL_WRAPPER(basic_iostream_char_vector_dtor, 8)
9360 basic_iostream_char* __thiscall basic_iostream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
9361 {
9362     basic_iostream_char *this = basic_iostream_char_from_basic_ios(base);
9363
9364     TRACE("(%p %x)\n", this, flags);
9365
9366     if(flags & 2) {
9367         /* we have an array, with the number of elements stored before the first object */
9368         INT_PTR i, *ptr = (INT_PTR *)this-1;
9369
9370         for(i=*ptr-1; i>=0; i--)
9371             basic_iostream_char_vbase_dtor(this+i);
9372         MSVCRT_operator_delete(ptr);
9373     } else {
9374         basic_iostream_char_vbase_dtor(this);
9375         if(flags & 1)
9376             MSVCRT_operator_delete(this);
9377     }
9378
9379     return this;
9380 }
9381
9382 static inline basic_ios_wchar* basic_iostream_wchar_to_basic_ios(basic_iostream_wchar *ptr)
9383 {
9384     return (basic_ios_wchar*)((char*)ptr+basic_iostream_wchar_vbtable1[1]);
9385 }
9386
9387 static inline basic_iostream_wchar* basic_iostream_wchar_from_basic_ios(basic_ios_wchar *ptr)
9388 {
9389     return (basic_iostream_wchar*)((char*)ptr-basic_iostream_wchar_vbtable1[1]);
9390 }
9391
9392 /* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
9393 /* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
9394 static basic_iostream_wchar* basic_iostream_wchar_ctor(basic_iostream_wchar *this,
9395         basic_streambuf_wchar *strbuf, MSVCP_bool virt_init)
9396 {
9397     basic_ios_wchar *basic_ios;
9398
9399     TRACE("(%p %p %d)\n", this, strbuf, virt_init);
9400
9401     if(virt_init) {
9402         this->base1.vbtable = basic_iostream_wchar_vbtable1;
9403         this->base2.vbtable = basic_iostream_wchar_vbtable2;
9404         basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
9405         basic_ios_wchar_ctor(basic_ios);
9406     }else {
9407         basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
9408     }
9409
9410     basic_istream_wchar_ctor(&this->base1, strbuf, FALSE, FALSE);
9411     basic_ostream_wchar_ctor_uninitialized(&this->base2, 0, FALSE, FALSE);
9412
9413     basic_ios->base.vtable = &MSVCP_basic_iostream_wchar_vtable;
9414     return this;
9415 }
9416
9417 /* ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
9418 /* ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
9419 DEFINE_THISCALL_WRAPPER(basic_iostream_short_ctor, 12)
9420 basic_iostream_wchar* __thiscall basic_iostream_short_ctor(basic_iostream_wchar *this,
9421         basic_streambuf_wchar *strbuf, MSVCP_bool virt_init)
9422 {
9423     basic_iostream_wchar_ctor(this, strbuf, virt_init);
9424     basic_istream_wchar_get_basic_ios(&this->base1)->base.vtable = &MSVCP_basic_iostream_short_vtable;
9425     return this;
9426 }
9427
9428 /* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
9429 /* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
9430 /* ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UAE@XZ */
9431 /* ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
9432 DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_dtor, 4)
9433 void __thiscall basic_iostream_wchar_dtor(basic_ios_wchar *base)
9434 {
9435     basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base);
9436
9437     TRACE("(%p)\n", this);
9438     basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base2));
9439     basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base1));
9440 }
9441
9442 /* ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
9443 /* ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
9444 /* ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
9445 /* ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
9446 DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_vbase_dtor, 4)
9447 void __thiscall basic_iostream_wchar_vbase_dtor(basic_iostream_wchar *this)
9448 {
9449     TRACE("(%p)\n", this);
9450     basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(this));
9451     basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base1));
9452 }
9453
9454 DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_vector_dtor, 8)
9455 basic_iostream_wchar* __thiscall basic_iostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
9456 {
9457     basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base);
9458
9459     TRACE("(%p %x)\n", this, flags);
9460
9461     if(flags & 2) {
9462         /* we have an array, with the number of elements stored before the first object */
9463         INT_PTR i, *ptr = (INT_PTR *)this-1;
9464
9465         for(i=*ptr-1; i>=0; i--)
9466             basic_iostream_wchar_vbase_dtor(this+i);
9467         MSVCRT_operator_delete(ptr);
9468     } else {
9469         basic_iostream_wchar_vbase_dtor(this);
9470         if(flags & 1)
9471             MSVCRT_operator_delete(this);
9472     }
9473
9474     return this;
9475 }
9476
9477 static inline basic_ios_char* basic_ofstream_char_to_basic_ios(basic_ofstream_char *ptr)
9478 {
9479     return (basic_ios_char*)((char*)ptr+basic_ofstream_char_vbtable[1]);
9480 }
9481
9482 static inline basic_ofstream_char* basic_ofstream_char_from_basic_ios(basic_ios_char *ptr)
9483 {
9484     return (basic_ofstream_char*)((char*)ptr-basic_ofstream_char_vbtable[1]);
9485 }
9486
9487 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@XZ */
9488 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */
9489 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_ctor, 8)
9490 basic_ofstream_char* __thiscall basic_ofstream_char_ctor(basic_ofstream_char *this, MSVCP_bool virt_init)
9491 {
9492     basic_ios_char *basic_ios;
9493
9494     TRACE("(%p %d)\n", this, virt_init);
9495
9496     if(virt_init) {
9497         this->base.vbtable = basic_ofstream_char_vbtable;
9498         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
9499         basic_ios_char_ctor(basic_ios);
9500     }else {
9501         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
9502     }
9503
9504     basic_filebuf_char_ctor(&this->filebuf);
9505     basic_ostream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
9506     basic_ios->base.vtable = &MSVCP_basic_ofstream_char_vtable;
9507     return this;
9508 }
9509
9510 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
9511 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
9512 static basic_ofstream_char* basic_ofstream_char_ctor_file(
9513         basic_ofstream_char *this, FILE *file, MSVCP_bool virt_init)
9514 {
9515     basic_ios_char *basic_ios;
9516
9517     TRACE("(%p %p %d)\n", this, file, virt_init);
9518
9519     if(virt_init) {
9520         this->base.vbtable = basic_ofstream_char_vbtable;
9521         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
9522         basic_ios_char_ctor(basic_ios);
9523     }else {
9524         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
9525     }
9526
9527     basic_filebuf_char_ctor_file(&this->filebuf, file);
9528     basic_ostream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
9529     basic_ios->base.vtable = &MSVCP_basic_ofstream_char_vtable;
9530     return this;
9531 }
9532
9533 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@ABV01@@Z */
9534 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@AEBV01@@Z */
9535 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_copy_ctor, 12)
9536 basic_ofstream_char* __thiscall basic_ofstream_char_copy_ctor(basic_ofstream_char *this,
9537         basic_ofstream_char *copy, MSVCP_bool virt_init)
9538 {
9539     TRACE("(%p %p %d)\n", this, copy, virt_init);
9540     return basic_ofstream_char_ctor_file(this, copy->filebuf.file, virt_init);
9541 }
9542
9543 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBDH@Z */
9544 /* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@PEBDH@Z */
9545 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_ctor_name, 16)
9546 basic_ofstream_char* __thiscall basic_ofstream_char_ctor_name(basic_ofstream_char *this,
9547         const char *name, int mode, MSVCP_bool virt_init)
9548 {
9549     TRACE("(%p %s %d %d)\n", this, name, mode, virt_init);
9550
9551     basic_ofstream_char_ctor(this, virt_init);
9552
9553     if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_out, _SH_DENYNO)) {
9554         basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
9555         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
9556     }
9557     return this;
9558 }
9559
9560 /* ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UAE@XZ */
9561 /* ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
9562 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_dtor, 4)
9563 void __thiscall basic_ofstream_char_dtor(basic_ios_char *base)
9564 {
9565     basic_ofstream_char *this = basic_ofstream_char_from_basic_ios(base);
9566
9567     TRACE("(%p)\n", this);
9568
9569     basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base));
9570     basic_filebuf_char_dtor(&this->filebuf);
9571 }
9572
9573 /* ??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
9574 /* ??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
9575 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_vbase_dtor, 4)
9576 void __thiscall basic_ofstream_char_vbase_dtor(basic_ofstream_char *this)
9577 {
9578     TRACE("(%p)\n", this);
9579
9580     basic_ofstream_char_dtor(basic_ofstream_char_to_basic_ios(this));
9581     basic_ios_char_dtor(basic_ostream_char_get_basic_ios(&this->base));
9582 }
9583
9584 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_vector_dtor, 8)
9585 basic_ofstream_char* __thiscall basic_ofstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
9586 {
9587     basic_ofstream_char *this = basic_ofstream_char_from_basic_ios(base);
9588
9589     TRACE("(%p %x)\n", this, flags);
9590
9591     if(flags & 2) {
9592         /* we have an array, with the number of elements stored before the first object */
9593         INT_PTR i, *ptr = (INT_PTR *)this-1;
9594
9595         for(i=*ptr-1; i>=0; i--)
9596             basic_ofstream_char_vbase_dtor(this+i);
9597         MSVCRT_operator_delete(ptr);
9598     } else {
9599         basic_ofstream_char_vbase_dtor(this);
9600         if(flags & 1)
9601             MSVCRT_operator_delete(this);
9602     }
9603
9604     return this;
9605 }
9606
9607 /* ?close@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
9608 /* ?close@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
9609 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_close, 4)
9610 void __thiscall basic_ofstream_char_close(basic_ofstream_char *this)
9611 {
9612     TRACE("(%p)\n", this);
9613
9614     if(!basic_filebuf_char_close(&this->filebuf)) {
9615         basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
9616         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
9617     }
9618 }
9619
9620 /* ?is_open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QBE_NXZ */
9621 /* ?is_open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
9622 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_is_open, 4)
9623 MSVCP_bool __thiscall basic_ofstream_char_is_open(const basic_ofstream_char *this)
9624 {
9625     TRACE("(%p)\n", this);
9626     return basic_filebuf_char_is_open(&this->filebuf);
9627 }
9628
9629 /* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPBDH@Z */
9630 /* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDH@Z */
9631 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_open, 12)
9632 void __thiscall basic_ofstream_char_open(basic_ofstream_char *this,
9633         const char *name, int mode)
9634 {
9635     TRACE("(%p %s %d)\n", this, name, mode);
9636
9637     if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_out, _SH_DENYNO)) {
9638         basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
9639         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
9640     }
9641 }
9642
9643 /* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPBDF@Z */
9644 /* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDF@Z */
9645 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_open_old, 12)
9646 void __thiscall basic_ofstream_char_open_old(basic_ofstream_char *this,
9647         const char *name, short mode)
9648 {
9649     basic_ofstream_char_open(this, name, mode);
9650 }
9651
9652 /* ?rdbuf@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
9653 /* ?rdbuf@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
9654 DEFINE_THISCALL_WRAPPER(basic_ofstream_char_rdbuf, 4)
9655 basic_filebuf_char* __thiscall basic_ofstream_char_rdbuf(const basic_ofstream_char *this)
9656 {
9657     TRACE("(%p)\n", this);
9658     return (basic_filebuf_char*)&this->filebuf;
9659 }
9660
9661 static inline basic_ios_wchar* basic_ofstream_wchar_to_basic_ios(basic_ofstream_wchar *ptr)
9662 {
9663     return (basic_ios_wchar*)((char*)ptr+basic_ofstream_wchar_vbtable[1]);
9664 }
9665
9666 static inline basic_ofstream_wchar* basic_ofstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
9667 {
9668     return (basic_ofstream_wchar*)((char*)ptr-basic_ofstream_wchar_vbtable[1]);
9669 }
9670
9671 /* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAE@XZ */
9672 /* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAA@XZ */
9673 static basic_ofstream_wchar* basic_ofstream_wchar_ctor(basic_ofstream_wchar *this, MSVCP_bool virt_init)
9674 {
9675     basic_ios_wchar *basic_ios;
9676
9677     TRACE("(%p %d)\n", this, virt_init);
9678
9679     if(virt_init) {
9680         this->base.vbtable = basic_ofstream_wchar_vbtable;
9681         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
9682         basic_ios_wchar_ctor(basic_ios);
9683     }else {
9684         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
9685     }
9686
9687     basic_filebuf_wchar_ctor(&this->filebuf);
9688     basic_ostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
9689     basic_ios->base.vtable = &MSVCP_basic_ofstream_wchar_vtable;
9690     return this;
9691 }
9692
9693 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@XZ */
9694 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@XZ */
9695 DEFINE_THISCALL_WRAPPER(basic_ofstream_short_ctor, 8)
9696 basic_ofstream_wchar* __thiscall basic_ofstream_short_ctor(basic_ofstream_wchar *this, MSVCP_bool virt_init)
9697 {
9698     basic_ofstream_wchar_ctor(this, virt_init);
9699     basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ofstream_short_vtable;
9700     return this;
9701 }
9702
9703 /* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
9704 /* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
9705 static basic_ofstream_wchar* basic_ofstream_wchar_ctor_file(
9706         basic_ofstream_wchar *this, FILE *file, MSVCP_bool virt_init)
9707 {
9708     basic_ios_wchar *basic_ios;
9709
9710     TRACE("(%p %p %d)\n", this, file, virt_init);
9711
9712     if(virt_init) {
9713         this->base.vbtable = basic_ofstream_wchar_vbtable;
9714         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
9715         basic_ios_wchar_ctor(basic_ios);
9716     }else {
9717         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
9718     }
9719
9720     basic_filebuf_wchar_ctor_file(&this->filebuf, file);
9721     basic_ostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
9722     basic_ios->base.vtable = &MSVCP_basic_ofstream_wchar_vtable;
9723     return this;
9724 }
9725
9726 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
9727 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
9728 static basic_ofstream_wchar* basic_ofstream_short_ctor_file(
9729         basic_ofstream_wchar *this, FILE *file, MSVCP_bool virt_init)
9730 {
9731     basic_ofstream_wchar_ctor_file(this, file, virt_init);
9732     basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ofstream_short_vtable;
9733     return this;
9734 }
9735
9736 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@ABV01@@Z */
9737 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@AEBV01@@Z */
9738 DEFINE_THISCALL_WRAPPER(basic_ofstream_short_copy_ctor, 12)
9739 basic_ofstream_wchar* __thiscall basic_ofstream_short_copy_ctor(basic_ofstream_wchar *this,
9740         basic_ofstream_wchar *copy, MSVCP_bool virt_init)
9741 {
9742     TRACE("(%p %p %d)\n", this, copy, virt_init);
9743     return basic_ofstream_short_ctor_file(this, copy->filebuf.file, virt_init);
9744 }
9745
9746 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@PBDH@Z */
9747 /* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@PEBDH@Z */
9748 DEFINE_THISCALL_WRAPPER(basic_ofstream_short_ctor_name, 16)
9749 basic_ofstream_wchar* __thiscall basic_ofstream_short_ctor_name(basic_ofstream_wchar *this,
9750         const char *name, int mode, MSVCP_bool virt_init)
9751 {
9752     TRACE("(%p %s %d %d)\n", this, name, mode, virt_init);
9753
9754     basic_ofstream_short_ctor(this, virt_init);
9755
9756     if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_out, _SH_DENYNO)) {
9757         basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
9758         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
9759     }
9760     return this;
9761 }
9762
9763 /* ??1?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
9764 /* ??1?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
9765 /* ??1?$basic_ofstream@GU?$char_traits@G@std@@@std@@UAE@XZ */
9766 /* ??1?$basic_ofstream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
9767 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_dtor, 4)
9768 void __thiscall basic_ofstream_wchar_dtor(basic_ios_wchar *base)
9769 {
9770     basic_ofstream_wchar *this = basic_ofstream_wchar_from_basic_ios(base);
9771
9772     TRACE("(%p)\n", this);
9773
9774     basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base));
9775     basic_filebuf_wchar_dtor(&this->filebuf);
9776 }
9777
9778 /* ??_D?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
9779 /* ??_D?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
9780 /* ??_D?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
9781 /* ??_D?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
9782 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_vbase_dtor, 4)
9783 void __thiscall basic_ofstream_wchar_vbase_dtor(basic_ofstream_wchar *this)
9784 {
9785     TRACE("(%p)\n", this);
9786
9787     basic_ofstream_wchar_dtor(basic_ofstream_wchar_to_basic_ios(this));
9788     basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(&this->base));
9789 }
9790
9791 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_vector_dtor, 8)
9792 basic_ofstream_wchar* __thiscall basic_ofstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
9793 {
9794     basic_ofstream_wchar *this = basic_ofstream_wchar_from_basic_ios(base);
9795
9796     TRACE("(%p %x)\n", this, flags);
9797
9798     if(flags & 2) {
9799         /* we have an array, with the number of elements stored before the first object */
9800         INT_PTR i, *ptr = (INT_PTR *)this-1;
9801
9802         for(i=*ptr-1; i>=0; i--)
9803             basic_ofstream_wchar_vbase_dtor(this+i);
9804         MSVCRT_operator_delete(ptr);
9805     } else {
9806         basic_ofstream_wchar_vbase_dtor(this);
9807         if(flags & 1)
9808             MSVCRT_operator_delete(this);
9809     }
9810
9811     return this;
9812 }
9813
9814 /* ?close@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
9815 /* ?close@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
9816 /* ?close@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
9817 /* ?close@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
9818 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_close, 4)
9819 void __thiscall basic_ofstream_wchar_close(basic_ofstream_wchar *this)
9820 {
9821     TRACE("(%p)\n", this);
9822
9823     if(!basic_filebuf_wchar_close(&this->filebuf)) {
9824         basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
9825         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
9826     }
9827 }
9828
9829 /* ?is_open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QBE_NXZ */
9830 /* ?is_open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
9831 /* ?is_open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QBE_NXZ */
9832 /* ?is_open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
9833 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_is_open, 4)
9834 MSVCP_bool __thiscall basic_ofstream_wchar_is_open(const basic_ofstream_wchar *this)
9835 {
9836     TRACE("(%p)\n", this);
9837     return basic_filebuf_wchar_is_open(&this->filebuf);
9838 }
9839
9840 /* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPBDH@Z */
9841 /* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDH@Z */
9842 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_open, 12)
9843 void __thiscall basic_ofstream_wchar_open(basic_ofstream_wchar *this,
9844         const char *name, int mode)
9845 {
9846     TRACE("(%p %s %d)\n", this, name, mode);
9847
9848     if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_out, _SH_DENYNO)) {
9849         basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
9850         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
9851     }
9852 }
9853
9854 /* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPBDF@Z */
9855 /* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDF@Z */
9856 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_open_old, 12)
9857 void __thiscall basic_ofstream_wchar_open_old(basic_ofstream_wchar *this,
9858         const char *name, int mode)
9859 {
9860     basic_ofstream_wchar_open(this, name, mode);
9861 }
9862
9863 /* ?rdbuf@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
9864 /* ?rdbuf@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
9865 /* ?rdbuf@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
9866 /* ?rdbuf@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
9867 DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_rdbuf, 4)
9868 basic_filebuf_wchar* __thiscall basic_ofstream_wchar_rdbuf(const basic_ofstream_wchar *this)
9869 {
9870     TRACE("(%p)\n", this);
9871     return (basic_filebuf_wchar*)&this->filebuf;
9872 }
9873
9874 static inline basic_ios_char* basic_ifstream_char_to_basic_ios(basic_ifstream_char *ptr)
9875 {
9876     return (basic_ios_char*)((char*)ptr+basic_ifstream_char_vbtable[1]);
9877 }
9878
9879 static inline basic_ifstream_char* basic_ifstream_char_from_basic_ios(basic_ios_char *ptr)
9880 {
9881     return (basic_ifstream_char*)((char*)ptr-basic_ifstream_char_vbtable[1]);
9882 }
9883
9884 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@XZ */
9885 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */
9886 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_ctor, 8)
9887 basic_ifstream_char* __thiscall basic_ifstream_char_ctor(basic_ifstream_char *this, MSVCP_bool virt_init)
9888 {
9889     basic_ios_char *basic_ios;
9890
9891     TRACE("(%p %d)\n", this, virt_init);
9892
9893     if(virt_init) {
9894         this->base.vbtable = basic_ifstream_char_vbtable;
9895         basic_ios = basic_istream_char_get_basic_ios(&this->base);
9896         basic_ios_char_ctor(basic_ios);
9897     }else {
9898         basic_ios = basic_istream_char_get_basic_ios(&this->base);
9899     }
9900
9901     basic_filebuf_char_ctor(&this->filebuf);
9902     basic_istream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
9903     basic_ios->base.vtable = &MSVCP_basic_ifstream_char_vtable;
9904     return this;
9905 }
9906
9907 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
9908 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
9909 static basic_ifstream_char* basic_ifstream_char_ctor_file(
9910         basic_ifstream_char *this, FILE *file, MSVCP_bool virt_init)
9911 {
9912     basic_ios_char *basic_ios;
9913
9914     TRACE("(%p %p %d)\n", this, file, virt_init);
9915
9916     if(virt_init) {
9917         this->base.vbtable = basic_ifstream_char_vbtable;
9918         basic_ios = basic_istream_char_get_basic_ios(&this->base);
9919         basic_ios_char_ctor(basic_ios);
9920     }else {
9921         basic_ios = basic_istream_char_get_basic_ios(&this->base);
9922     }
9923
9924     basic_filebuf_char_ctor_file(&this->filebuf, file);
9925     basic_istream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
9926     basic_ios->base.vtable = &MSVCP_basic_ifstream_char_vtable;
9927     return this;
9928 }
9929
9930 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@ABV01@@Z */
9931 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@AEBV01@@Z */
9932 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_copy_ctor, 12)
9933 basic_ifstream_char* __thiscall basic_ifstream_char_copy_ctor(basic_ifstream_char *this,
9934         const basic_ifstream_char *copy, MSVCP_bool virt_init)
9935 {
9936     TRACE("(%p %p %d)\n", this, copy, virt_init);
9937     return basic_ifstream_char_ctor_file(this, copy->filebuf.file, virt_init);
9938 }
9939
9940 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@PBDH@Z */
9941 /* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@PEBDH@Z */
9942 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_ctor_name, 16)
9943 basic_ifstream_char* __thiscall basic_ifstream_char_ctor_name(basic_ifstream_char *this,
9944         const char *name, int mode, MSVCP_bool virt_init)
9945 {
9946     TRACE("(%p %s %d %d)\n", this, name, mode, virt_init);
9947
9948     basic_ifstream_char_ctor(this, virt_init);
9949
9950     if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_in, _SH_DENYNO)) {
9951         basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
9952         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
9953     }
9954     return this;
9955 }
9956
9957 /* ??1?$basic_ifstream@DU?$char_traits@D@std@@@std@@UAE@XZ */
9958 /* ??1?$basic_ifstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
9959 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_dtor, 4)
9960 void __thiscall basic_ifstream_char_dtor(basic_ios_char *base)
9961 {
9962     basic_ifstream_char *this = basic_ifstream_char_from_basic_ios(base);
9963
9964     TRACE("(%p)\n", this);
9965
9966     basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base));
9967     basic_filebuf_char_dtor(&this->filebuf);
9968 }
9969
9970 /* ??_D?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
9971 /* ??_D?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
9972 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_vbase_dtor, 4)
9973 void __thiscall basic_ifstream_char_vbase_dtor(basic_ifstream_char *this)
9974 {
9975     TRACE("(%p)\n", this);
9976
9977     basic_ifstream_char_dtor(basic_ifstream_char_to_basic_ios(this));
9978     basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base));
9979 }
9980
9981 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_vector_dtor, 8)
9982 basic_ifstream_char* __thiscall basic_ifstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
9983 {
9984     basic_ifstream_char *this = basic_ifstream_char_from_basic_ios(base);
9985
9986     TRACE("(%p %x)\n", this, flags);
9987
9988     if(flags & 2) {
9989         /* we have an array, with the number of elements stored before the first object */
9990         INT_PTR i, *ptr = (INT_PTR *)this-1;
9991
9992         for(i=*ptr-1; i>=0; i--)
9993             basic_ifstream_char_vbase_dtor(this+i);
9994         MSVCRT_operator_delete(ptr);
9995     } else {
9996         basic_ifstream_char_vbase_dtor(this);
9997         if(flags & 1)
9998             MSVCRT_operator_delete(this);
9999     }
10000
10001     return this;
10002 }
10003
10004 /* ?close@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
10005 /* ?close@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
10006 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_close, 4)
10007 void __thiscall basic_ifstream_char_close(basic_ifstream_char *this)
10008 {
10009     TRACE("(%p)\n", this);
10010
10011     if(!basic_filebuf_char_close(&this->filebuf)) {
10012         basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
10013         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
10014     }
10015 }
10016
10017 /* ?is_open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QBE_NXZ */
10018 /* ?is_open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
10019 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_is_open, 4)
10020 MSVCP_bool __thiscall basic_ifstream_char_is_open(const basic_ifstream_char *this)
10021 {
10022     TRACE("(%p)\n", this);
10023     return basic_filebuf_char_is_open(&this->filebuf);
10024 }
10025
10026 /* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPBDH@Z */
10027 /* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDH@Z */
10028 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_open, 12)
10029 void __thiscall basic_ifstream_char_open(basic_ifstream_char *this,
10030         const char *name, int mode)
10031 {
10032     TRACE("(%p %s %d)\n", this, name, mode);
10033
10034     if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_in, _SH_DENYNO)) {
10035         basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
10036         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
10037     }
10038 }
10039
10040 /* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPBDF@Z */
10041 /* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDF@Z */
10042 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_open_old, 12)
10043 void __thiscall basic_ifstream_char_open_old(basic_ifstream_char *this,
10044         const char *name, short mode)
10045 {
10046     basic_ifstream_char_open(this, name, mode);
10047 }
10048
10049 /* ?rdbuf@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
10050 /* ?rdbuf@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
10051 DEFINE_THISCALL_WRAPPER(basic_ifstream_char_rdbuf, 4)
10052 basic_filebuf_char* __thiscall basic_ifstream_char_rdbuf(const basic_ifstream_char *this)
10053 {
10054     TRACE("(%p)\n", this);
10055     return (basic_filebuf_char*)&this->filebuf;
10056 }
10057
10058 static inline basic_ios_wchar* basic_ifstream_wchar_to_basic_ios(basic_ifstream_wchar *ptr)
10059 {
10060     return (basic_ios_wchar*)((char*)ptr+basic_ifstream_wchar_vbtable[1]);
10061 }
10062
10063 static inline basic_ifstream_wchar* basic_ifstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
10064 {
10065     return (basic_ifstream_wchar*)((char*)ptr-basic_ifstream_wchar_vbtable[1]);
10066 }
10067
10068 /* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAE@XZ */
10069 /* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAA@XZ */
10070 static basic_ifstream_wchar* basic_ifstream_wchar_ctor(basic_ifstream_wchar *this, MSVCP_bool virt_init)
10071 {
10072     basic_ios_wchar *basic_ios;
10073
10074     TRACE("(%p %d)\n", this, virt_init);
10075
10076     if(virt_init) {
10077         this->base.vbtable = basic_ifstream_wchar_vbtable;
10078         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
10079         basic_ios_wchar_ctor(basic_ios);
10080     }else {
10081         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
10082     }
10083
10084     basic_filebuf_wchar_ctor(&this->filebuf);
10085     basic_istream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
10086     basic_ios->base.vtable = &MSVCP_basic_ifstream_wchar_vtable;
10087     return this;
10088 }
10089
10090 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@XZ */
10091 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@XZ */
10092 DEFINE_THISCALL_WRAPPER(basic_ifstream_short_ctor, 8)
10093 basic_ifstream_wchar* __thiscall basic_ifstream_short_ctor(basic_ifstream_wchar *this, MSVCP_bool virt_init)
10094 {
10095     basic_ifstream_wchar_ctor(this, virt_init);
10096     basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ifstream_short_vtable;
10097     return this;
10098 }
10099
10100 /* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
10101 /* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
10102 static basic_ifstream_wchar* basic_ifstream_wchar_ctor_file(
10103         basic_ifstream_wchar *this, FILE *file, MSVCP_bool virt_init)
10104 {
10105     basic_ios_wchar *basic_ios;
10106
10107     TRACE("(%p %p %d)\n", this, file, virt_init);
10108
10109     if(virt_init) {
10110         this->base.vbtable = basic_ifstream_wchar_vbtable;
10111         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
10112         basic_ios_wchar_ctor(basic_ios);
10113     }else {
10114         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
10115     }
10116
10117     basic_filebuf_wchar_ctor_file(&this->filebuf, file);
10118     basic_istream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
10119     basic_ios->base.vtable = &MSVCP_basic_ifstream_wchar_vtable;
10120     return this;
10121 }
10122
10123 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
10124 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
10125 static basic_ifstream_wchar* basic_ifstream_short_ctor_file(
10126         basic_ifstream_wchar *this, FILE *file, MSVCP_bool virt_init)
10127 {
10128     basic_ifstream_wchar_ctor_file(this, file, virt_init);
10129     basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ifstream_short_vtable;
10130     return this;
10131 }
10132
10133 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@ABV01@@Z */
10134 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@AEBV01@@Z */
10135 DEFINE_THISCALL_WRAPPER(basic_ifstream_short_copy_ctor, 12)
10136 basic_ifstream_wchar* __thiscall basic_ifstream_short_copy_ctor(basic_ifstream_wchar *this,
10137         basic_ifstream_wchar *copy, MSVCP_bool virt_init)
10138 {
10139     TRACE("(%p %p %d)\n", this, copy, virt_init);
10140     return basic_ifstream_short_ctor_file(this, copy->filebuf.file, virt_init);
10141 }
10142
10143 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@PBDH@Z */
10144 /* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@PEBDH@Z */
10145 DEFINE_THISCALL_WRAPPER(basic_ifstream_short_ctor_name, 16)
10146 basic_ifstream_wchar* __thiscall basic_ifstream_short_ctor_name(basic_ifstream_wchar *this,
10147         const char *name, int mode, MSVCP_bool virt_init)
10148 {
10149     TRACE("(%p %s %d %d)\n", this, name, mode, virt_init);
10150
10151     basic_ifstream_short_ctor(this, virt_init);
10152
10153     if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_in, _SH_DENYNO)) {
10154         basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
10155         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
10156     }
10157     return this;
10158 }
10159
10160 /* ??1?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
10161 /* ??1?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
10162 /* ??1?$basic_ifstream@GU?$char_traits@G@std@@@std@@UAE@XZ */
10163 /* ??1?$basic_ifstream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
10164 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_dtor, 4)
10165 void __thiscall basic_ifstream_wchar_dtor(basic_ios_wchar *base)
10166 {
10167     basic_ifstream_wchar *this = basic_ifstream_wchar_from_basic_ios(base);
10168
10169     TRACE("(%p)\n", this);
10170
10171     basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base));
10172     basic_filebuf_wchar_dtor(&this->filebuf);
10173 }
10174
10175 /* ??_D?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
10176 /* ??_D?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
10177 /* ??_D?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
10178 /* ??_D?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
10179 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_vbase_dtor, 4)
10180 void __thiscall basic_ifstream_wchar_vbase_dtor(basic_ifstream_wchar *this)
10181 {
10182     TRACE("(%p)\n", this);
10183
10184     basic_ifstream_wchar_dtor(basic_ifstream_wchar_to_basic_ios(this));
10185     basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base));
10186 }
10187
10188 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_vector_dtor, 8)
10189 basic_ifstream_wchar* __thiscall basic_ifstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
10190 {
10191     basic_ifstream_wchar *this = basic_ifstream_wchar_from_basic_ios(base);
10192
10193     TRACE("(%p %x)\n", this, flags);
10194
10195     if(flags & 2) {
10196         /* we have an array, with the number of elements stored before the first object */
10197         INT_PTR i, *ptr = (INT_PTR *)this-1;
10198
10199         for(i=*ptr-1; i>=0; i--)
10200             basic_ifstream_wchar_vbase_dtor(this+i);
10201         MSVCRT_operator_delete(ptr);
10202     } else {
10203         basic_ifstream_wchar_vbase_dtor(this);
10204         if(flags & 1)
10205             MSVCRT_operator_delete(this);
10206     }
10207
10208     return this;
10209 }
10210
10211 /* ?close@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
10212 /* ?close@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
10213 /* ?close@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
10214 /* ?close@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
10215 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_close, 4)
10216 void __thiscall basic_ifstream_wchar_close(basic_ifstream_wchar *this)
10217 {
10218     TRACE("(%p)\n", this);
10219
10220     if(!basic_filebuf_wchar_close(&this->filebuf)) {
10221         basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
10222         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
10223     }
10224 }
10225
10226 /* ?is_open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QBE_NXZ */
10227 /* ?is_open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
10228 /* ?is_open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QBE_NXZ */
10229 /* ?is_open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
10230 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_is_open, 4)
10231 MSVCP_bool __thiscall basic_ifstream_wchar_is_open(const basic_ifstream_wchar *this)
10232 {
10233     TRACE("(%p)\n", this);
10234     return basic_filebuf_wchar_is_open(&this->filebuf);
10235 }
10236
10237 /* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPBDH@Z */
10238 /* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDH@Z */
10239 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_open, 12)
10240 void __thiscall basic_ifstream_wchar_open(basic_ifstream_wchar *this,
10241         const char *name, int mode)
10242 {
10243     TRACE("(%p %s %d)\n", this, name, mode);
10244
10245     if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_in, _SH_DENYNO)) {
10246         basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
10247         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
10248     }
10249 }
10250
10251 /* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPBDF@Z */
10252 /* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDF@Z */
10253 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_open_old, 12)
10254 void __thiscall basic_ifstream_wchar_open_old(basic_ifstream_wchar *this,
10255         const char *name, short mode)
10256 {
10257     basic_ifstream_wchar_open(this, name, mode);
10258 }
10259
10260 /* ?rdbuf@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
10261 /* ?rdbuf@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
10262 /* ?rdbuf@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
10263 /* ?rdbuf@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
10264 DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_rdbuf, 4)
10265 basic_filebuf_wchar* __thiscall basic_ifstream_wchar_rdbuf(const basic_ifstream_wchar *this)
10266 {
10267     TRACE("(%p)\n", this);
10268     return (basic_filebuf_wchar*)&this->filebuf;
10269 }
10270
10271 static inline basic_ios_char* basic_fstream_char_to_basic_ios(basic_fstream_char *ptr)
10272 {
10273     return (basic_ios_char*)((char*)ptr+basic_fstream_char_vbtable1[1]);
10274 }
10275
10276 static inline basic_fstream_char* basic_fstream_char_from_basic_ios(basic_ios_char *ptr)
10277 {
10278     return (basic_fstream_char*)((char*)ptr-basic_fstream_char_vbtable1[1]);
10279 }
10280
10281 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@XZ */
10282 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */
10283 DEFINE_THISCALL_WRAPPER(basic_fstream_char_ctor, 8)
10284 basic_fstream_char* __thiscall basic_fstream_char_ctor(basic_fstream_char *this, MSVCP_bool virt_init)
10285 {
10286     basic_ios_char *basic_ios;
10287
10288     TRACE("(%p %d)\n", this, virt_init);
10289
10290     if(virt_init) {
10291         this->base.base1.vbtable = basic_fstream_char_vbtable1;
10292         this->base.base2.vbtable = basic_fstream_char_vbtable2;
10293         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
10294         basic_ios_char_ctor(basic_ios);
10295     }else {
10296         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
10297     }
10298
10299     basic_filebuf_char_ctor(&this->filebuf);
10300     basic_iostream_char_ctor(&this->base, &this->filebuf.base, FALSE);
10301     basic_ios->base.vtable = &MSVCP_basic_fstream_char_vtable;
10302     return this;
10303 }
10304
10305 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
10306 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
10307 static basic_fstream_char* basic_fstream_char_ctor_file(basic_fstream_char *this,
10308         FILE *file, MSVCP_bool virt_init)
10309 {
10310     basic_ios_char *basic_ios;
10311
10312     TRACE("(%p %p %d)\n", this, file, virt_init);
10313
10314     if(virt_init) {
10315         this->base.base1.vbtable = basic_fstream_char_vbtable1;
10316         this->base.base2.vbtable = basic_fstream_char_vbtable2;
10317         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
10318         basic_ios_char_ctor(basic_ios);
10319     }else {
10320         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
10321     }
10322
10323     basic_filebuf_char_ctor_file(&this->filebuf, file);
10324     basic_iostream_char_ctor(&this->base, &this->filebuf.base, FALSE);
10325     basic_ios->base.vtable = &MSVCP_basic_fstream_char_vtable;
10326     return this;
10327 }
10328
10329 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@ABV01@@Z */
10330 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@AEBV01@@Z */
10331 DEFINE_THISCALL_WRAPPER(basic_fstream_char_copy_ctor, 12)
10332 basic_fstream_char* __thiscall basic_fstream_char_copy_ctor(basic_fstream_char *this,
10333         basic_fstream_char *copy, MSVCP_bool virt_init)
10334 {
10335     TRACE("(%p %p %d)\n", this, copy, virt_init);
10336     return basic_fstream_char_ctor_file(this, copy->filebuf.file, virt_init);
10337 }
10338
10339 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@PBDH@Z */
10340 /* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@PEBDH@Z */
10341 DEFINE_THISCALL_WRAPPER(basic_fstream_char_ctor_name, 16)
10342 basic_fstream_char* __thiscall basic_fstream_char_ctor_name(basic_fstream_char *this,
10343         const char *name, int mode, MSVCP_bool virt_init)
10344 {
10345     TRACE("(%p %s %d %d)\n", this, name, mode, virt_init);
10346
10347     basic_fstream_char_ctor(this, virt_init);
10348
10349     if(!basic_filebuf_char_open(&this->filebuf, name, mode, _SH_DENYNO)) {
10350         basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
10351         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
10352     }
10353     return this;
10354 }
10355
10356 /* ??1?$basic_fstream@DU?$char_traits@D@std@@@std@@UAE@XZ */
10357 /* ??1?$basic_fstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
10358 DEFINE_THISCALL_WRAPPER(basic_fstream_char_dtor, 4)
10359 void __thiscall basic_fstream_char_dtor(basic_ios_char *base)
10360 {
10361     basic_fstream_char *this = basic_fstream_char_from_basic_ios(base);
10362
10363     TRACE("(%p)\n", this);
10364
10365     basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(&this->base));
10366     basic_filebuf_char_dtor(&this->filebuf);
10367 }
10368
10369 /* ??_D?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
10370 /* ??_D?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
10371 DEFINE_THISCALL_WRAPPER(basic_fstream_char_vbase_dtor, 4)
10372 void __thiscall basic_fstream_char_vbase_dtor(basic_fstream_char *this)
10373 {
10374     TRACE("(%p)\n", this);
10375
10376     basic_fstream_char_dtor(basic_fstream_char_to_basic_ios(this));
10377     basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base.base1));
10378 }
10379
10380 DEFINE_THISCALL_WRAPPER(basic_fstream_char_vector_dtor, 8)
10381 basic_fstream_char* __thiscall basic_fstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
10382 {
10383     basic_fstream_char *this = basic_fstream_char_from_basic_ios(base);
10384
10385     TRACE("(%p %x)\n", this, flags);
10386
10387     if(flags & 2) {
10388         /* we have an array, with the number of elements stored before the first object */
10389         INT_PTR i, *ptr = (INT_PTR *)this-1;
10390
10391         for(i=*ptr-1; i>=0; i--)
10392             basic_fstream_char_vbase_dtor(this+i);
10393         MSVCRT_operator_delete(ptr);
10394     } else {
10395         basic_fstream_char_vbase_dtor(this);
10396         if(flags & 1)
10397             MSVCRT_operator_delete(this);
10398     }
10399
10400     return this;
10401 }
10402
10403 /* ?close@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
10404 /* ?close@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
10405 DEFINE_THISCALL_WRAPPER(basic_fstream_char_close, 4)
10406 void __thiscall basic_fstream_char_close(basic_fstream_char *this)
10407 {
10408     TRACE("(%p)\n", this);
10409
10410     if(!basic_filebuf_char_close(&this->filebuf)) {
10411         basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
10412         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
10413     }
10414 }
10415
10416 /* ?is_open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QBE_NXZ */
10417 /* ?is_open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
10418 DEFINE_THISCALL_WRAPPER(basic_fstream_char_is_open, 4)
10419 MSVCP_bool __thiscall basic_fstream_char_is_open(const basic_fstream_char *this)
10420 {
10421     TRACE("(%p)\n", this);
10422     return basic_filebuf_char_is_open(&this->filebuf);
10423 }
10424
10425 /* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPBDH@Z */
10426 /* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDH@Z */
10427 DEFINE_THISCALL_WRAPPER(basic_fstream_char_open, 12)
10428 void __thiscall basic_fstream_char_open(basic_fstream_char *this,
10429         const char *name, int mode)
10430 {
10431     TRACE("(%p %s %d)\n", this, name, mode);
10432
10433     if(!basic_filebuf_char_open(&this->filebuf, name, mode, _SH_DENYNO)) {
10434         basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
10435         basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
10436     }
10437 }
10438
10439 /* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPBDF@Z */
10440 /* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDF@Z */
10441 DEFINE_THISCALL_WRAPPER(basic_fstream_char_open_old, 12)
10442 void __thiscall basic_fstream_char_open_old(basic_fstream_char *this,
10443         const char *name, int mode)
10444 {
10445     basic_fstream_char_open(this, name, mode);
10446 }
10447
10448 /* ?rdbuf@?$basic_fstream@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
10449 /* ?rdbuf@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
10450 DEFINE_THISCALL_WRAPPER(basic_fstream_char_rdbuf, 4)
10451 basic_filebuf_char* __thiscall basic_fstream_char_rdbuf(const basic_fstream_char *this)
10452 {
10453     TRACE("(%p)\n", this);
10454     return (basic_filebuf_char*)&this->filebuf;
10455 }
10456
10457 static inline basic_ios_wchar* basic_fstream_wchar_to_basic_ios(basic_fstream_wchar *ptr)
10458 {
10459     return (basic_ios_wchar*)((char*)ptr+basic_fstream_wchar_vbtable1[1]);
10460 }
10461
10462 static inline basic_fstream_wchar* basic_fstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
10463 {
10464     return (basic_fstream_wchar*)((char*)ptr-basic_fstream_wchar_vbtable1[1]);
10465 }
10466
10467 /* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@XZ */
10468 /* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@XZ */
10469 static basic_fstream_wchar* basic_fstream_wchar_ctor(basic_fstream_wchar *this, MSVCP_bool virt_init)
10470 {
10471     basic_ios_wchar *basic_ios;
10472
10473     TRACE("(%p %d)\n", this, virt_init);
10474
10475     if(virt_init) {
10476         this->base.base1.vbtable = basic_fstream_wchar_vbtable1;
10477         this->base.base2.vbtable = basic_fstream_wchar_vbtable2;
10478         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
10479         basic_ios_wchar_ctor(basic_ios);
10480     }else {
10481         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
10482     }
10483
10484     basic_filebuf_wchar_ctor(&this->filebuf);
10485     basic_iostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE);
10486     basic_ios->base.vtable = &MSVCP_basic_fstream_wchar_vtable;
10487     return this;
10488 }
10489
10490 /* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@XZ */
10491 /* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@XZ */
10492 DEFINE_THISCALL_WRAPPER(basic_fstream_short_ctor, 8)
10493 basic_fstream_wchar* __thiscall basic_fstream_short_ctor(basic_fstream_wchar *this, MSVCP_bool virt_init)
10494 {
10495     basic_fstream_wchar_ctor(this, virt_init);
10496     basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_fstream_short_vtable;
10497     return this;
10498 }
10499
10500 /* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
10501 /* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
10502 static basic_fstream_wchar* basic_fstream_wchar_ctor_file(basic_fstream_wchar *this,
10503         FILE *file, MSVCP_bool virt_init)
10504 {
10505     basic_ios_wchar *basic_ios;
10506
10507     TRACE("(%p %p %d)\n", this, file, virt_init);
10508
10509     if(virt_init) {
10510         this->base.base1.vbtable = basic_fstream_wchar_vbtable1;
10511         this->base.base2.vbtable = basic_fstream_wchar_vbtable2;
10512         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
10513         basic_ios_wchar_ctor(basic_ios);
10514     }else {
10515         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
10516     }
10517
10518     basic_filebuf_wchar_ctor_file(&this->filebuf, file);
10519     basic_iostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE);
10520     basic_ios->base.vtable = &MSVCP_basic_fstream_wchar_vtable;
10521     return this;
10522 }
10523
10524 /* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
10525 /* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
10526 static basic_fstream_wchar* basic_fstream_short_ctor_file(basic_fstream_wchar *this,
10527         FILE *file, MSVCP_bool virt_init)
10528 {
10529     basic_fstream_wchar_ctor_file(this, file, virt_init);
10530     basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_fstream_short_vtable;
10531     return this;
10532 }
10533
10534 /* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@ABV01@@Z */
10535 /* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@AEBV01@@Z */
10536 DEFINE_THISCALL_WRAPPER(basic_fstream_short_copy_ctor, 12)
10537 basic_fstream_wchar* __thiscall basic_fstream_short_copy_ctor(basic_fstream_wchar *this,
10538         basic_fstream_wchar *copy, MSVCP_bool virt_init)
10539 {
10540     TRACE("(%p %p %d)\n", this, copy, virt_init);
10541     return basic_fstream_short_ctor_file(this, copy->filebuf.file, virt_init);
10542 }
10543
10544 /* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@PB_WHH@Z */
10545 /* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEB_WHH@Z */
10546 DEFINE_THISCALL_WRAPPER(basic_fstream_short_ctor_name, 16)
10547 basic_fstream_wchar* __thiscall basic_fstream_short_ctor_name(basic_fstream_wchar *this,
10548         const char *name, int mode, MSVCP_bool virt_init)
10549 {
10550     TRACE("(%p %s %d %d)\n", this, name, mode, virt_init);
10551
10552     basic_fstream_short_ctor(this, virt_init);
10553
10554     if(!basic_filebuf_wchar_open(&this->filebuf, name, mode, _SH_DENYNO)) {
10555         basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
10556         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
10557     }
10558     return this;
10559 }
10560
10561 /* ??1?$basic_fstream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
10562 /* ??1?$basic_fstream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
10563 /* ??1?$basic_fstream@GU?$char_traits@G@std@@@std@@UAE@XZ */
10564 /* ??1?$basic_fstream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
10565 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_dtor, 4)
10566 void __thiscall basic_fstream_wchar_dtor(basic_ios_wchar *base)
10567 {
10568     basic_fstream_wchar *this = basic_fstream_wchar_from_basic_ios(base);
10569
10570     TRACE("(%p)\n", this);
10571
10572     basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(&this->base));
10573     basic_filebuf_wchar_dtor(&this->filebuf);
10574 }
10575
10576 /* ??_D?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
10577 /* ??_D?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
10578 /* ??_D?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
10579 /* ??_D?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
10580 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_vbase_dtor, 4)
10581 void __thiscall basic_fstream_wchar_vbase_dtor(basic_fstream_wchar *this)
10582 {
10583     TRACE("(%p)\n", this);
10584
10585     basic_fstream_wchar_dtor(basic_fstream_wchar_to_basic_ios(this));
10586     basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base.base1));
10587 }
10588
10589 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_vector_dtor, 8)
10590 basic_fstream_wchar* __thiscall basic_fstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
10591 {
10592     basic_fstream_wchar *this = basic_fstream_wchar_from_basic_ios(base);
10593
10594     TRACE("(%p %x)\n", this, flags);
10595
10596     if(flags & 2) {
10597         /* we have an array, with the number of elements stored before the first object */
10598         INT_PTR i, *ptr = (INT_PTR *)this-1;
10599
10600         for(i=*ptr-1; i>=0; i--)
10601             basic_fstream_wchar_vbase_dtor(this+i);
10602         MSVCRT_operator_delete(ptr);
10603     } else {
10604         basic_fstream_wchar_vbase_dtor(this);
10605         if(flags & 1)
10606             MSVCRT_operator_delete(this);
10607     }
10608
10609     return this;
10610 }
10611
10612 /* ?close@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
10613 /* ?close@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
10614 /* ?close@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
10615 /* ?close@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
10616 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_close, 4)
10617 void __thiscall basic_fstream_wchar_close(basic_fstream_wchar *this)
10618 {
10619     TRACE("(%p)\n", this);
10620
10621     if(!basic_filebuf_wchar_close(&this->filebuf)) {
10622         basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
10623         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
10624     }
10625 }
10626
10627 /* ?is_open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QBE_NXZ */
10628 /* ?is_open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
10629 /* ?is_open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QBE_NXZ */
10630 /* ?is_open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
10631 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_is_open, 4)
10632 MSVCP_bool __thiscall basic_fstream_wchar_is_open(const basic_fstream_wchar *this)
10633 {
10634     TRACE("(%p)\n", this);
10635     return basic_filebuf_wchar_is_open(&this->filebuf);
10636 }
10637
10638 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBDH@Z */
10639 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBDH@Z */
10640 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_open, 12)
10641 void __thiscall basic_fstream_wchar_open(basic_fstream_wchar *this,
10642         const char *name, int mode)
10643 {
10644     TRACE("(%p %s %d)\n", this, name, mode);
10645
10646     if(!basic_filebuf_wchar_open(&this->filebuf, name, mode, _SH_DENYNO)) {
10647         basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
10648         basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
10649     }
10650 }
10651
10652 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBDF@Z */
10653 /* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBDF@Z */
10654 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_open_old, 12)
10655 void __thiscall basic_fstream_wchar_open_old(basic_fstream_wchar *this,
10656         const char *name, int mode)
10657 {
10658     basic_fstream_wchar_open(this, name, mode);
10659 }
10660
10661 /* ?rdbuf@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
10662 /* ?rdbuf@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
10663 /* ?rdbuf@?$basic_fstream@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
10664 /* ?rdbuf@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
10665 DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_rdbuf, 4)
10666 basic_filebuf_wchar* __thiscall basic_fstream_wchar_rdbuf(const basic_fstream_wchar *this)
10667 {
10668     TRACE("(%p)\n", this);
10669     return (basic_filebuf_wchar*)&this->filebuf;
10670 }
10671
10672 static inline basic_ios_char* basic_ostringstream_char_to_basic_ios(basic_ostringstream_char *ptr)
10673 {
10674     return (basic_ios_char*)((char*)ptr+basic_ostringstream_char_vbtable[1]);
10675 }
10676
10677 static inline basic_ostringstream_char* basic_ostringstream_char_from_basic_ios(basic_ios_char *ptr)
10678 {
10679     return (basic_ostringstream_char*)((char*)ptr-basic_ostringstream_char_vbtable[1]);
10680 }
10681
10682 /* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
10683 /* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
10684 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_ctor_str, 16)
10685 basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor_str(basic_ostringstream_char *this,
10686         const basic_string_char *str, int mode, MSVCP_bool virt_init)
10687 {
10688     basic_ios_char *basic_ios;
10689
10690     TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
10691
10692     if(virt_init) {
10693         this->base.vbtable = basic_ostringstream_char_vbtable;
10694         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
10695         basic_ios_char_ctor(basic_ios);
10696     }else {
10697         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
10698     }
10699
10700     basic_stringbuf_char_ctor_str(&this->strbuf, str, mode|OPENMODE_out);
10701     basic_ostream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
10702     basic_ios->base.vtable = &MSVCP_basic_ostringstream_char_vtable;
10703     return this;
10704 }
10705
10706 /* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
10707 /* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
10708 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_ctor_mode, 12)
10709 basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor_mode(
10710         basic_ostringstream_char *this, int mode, MSVCP_bool virt_init)
10711 {
10712     basic_ios_char *basic_ios;
10713
10714     TRACE("(%p %d %d)\n", this, mode, virt_init);
10715
10716     if(virt_init) {
10717         this->base.vbtable = basic_ostringstream_char_vbtable;
10718         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
10719         basic_ios_char_ctor(basic_ios);
10720     }else {
10721         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
10722     }
10723
10724     basic_stringbuf_char_ctor_mode(&this->strbuf, mode|OPENMODE_out);
10725     basic_ostream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
10726     basic_ios->base.vtable = &MSVCP_basic_ostringstream_char_vtable;
10727     return this;
10728 }
10729
10730 /* ??_F?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
10731 /* ??_F?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
10732 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_ctor, 8)
10733 basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor(
10734         basic_ostringstream_char *this, MSVCP_bool virt_init)
10735 {
10736     return basic_ostringstream_char_ctor_mode(this, 0, virt_init);
10737 }
10738
10739 /* ??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
10740 /* ??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
10741 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_dtor, 4)
10742 void __thiscall basic_ostringstream_char_dtor(basic_ios_char *base)
10743 {
10744     basic_ostringstream_char *this = basic_ostringstream_char_from_basic_ios(base);
10745
10746     TRACE("(%p)\n", this);
10747
10748     basic_stringbuf_char_dtor(&this->strbuf);
10749     basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base));
10750 }
10751
10752 /* ??_D?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
10753 /* ??_D?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
10754 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_vbase_dtor, 4)
10755 void __thiscall basic_ostringstream_char_vbase_dtor(basic_ostringstream_char *this)
10756 {
10757     TRACE("(%p)\n", this);
10758
10759     basic_ostringstream_char_dtor(basic_ostringstream_char_to_basic_ios(this));
10760     basic_ios_char_dtor(basic_ostream_char_get_basic_ios(&this->base));
10761 }
10762
10763 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_vector_dtor, 8)
10764 basic_ostringstream_char* __thiscall basic_ostringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
10765 {
10766     basic_ostringstream_char *this = basic_ostringstream_char_from_basic_ios(base);
10767
10768     TRACE("(%p %x)\n", this, flags);
10769
10770     if(flags & 2) {
10771         /* we have an array, with the number of elements stored before the first object */
10772         INT_PTR i, *ptr = (INT_PTR *)this-1;
10773
10774         for(i=*ptr-1; i>=0; i--)
10775             basic_ostringstream_char_vbase_dtor(this+i);
10776         MSVCRT_operator_delete(ptr);
10777     } else {
10778         basic_ostringstream_char_vbase_dtor(this);
10779         if(flags & 1)
10780             MSVCRT_operator_delete(this);
10781     }
10782
10783     return this;
10784 }
10785
10786 /* ?rdbuf@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
10787 /* ?rdbuf@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
10788 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_rdbuf, 4)
10789 basic_stringbuf_char* __thiscall basic_ostringstream_char_rdbuf(const basic_ostringstream_char *this)
10790 {
10791     TRACE("(%p)\n", this);
10792     return (basic_stringbuf_char*)&this->strbuf;
10793 }
10794
10795 /* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
10796 /* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
10797 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_str_set, 8)
10798 void __thiscall basic_ostringstream_char_str_set(basic_ostringstream_char *this, const basic_string_char *str)
10799 {
10800     TRACE("(%p %p)\n", this, str);
10801     basic_stringbuf_char_str_set(&this->strbuf, str);
10802 }
10803
10804 /* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
10805 /* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
10806 DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_str_get, 8)
10807 basic_string_char* __thiscall basic_ostringstream_char_str_get(const basic_ostringstream_char *this, basic_string_char *ret)
10808 {
10809     TRACE("(%p %p)\n", this, ret);
10810     return basic_stringbuf_char_str_get(&this->strbuf, ret);
10811 }
10812
10813 static inline basic_ios_wchar* basic_ostringstream_wchar_to_basic_ios(basic_ostringstream_wchar *ptr)
10814 {
10815     return (basic_ios_wchar*)((char*)ptr+basic_ostringstream_wchar_vbtable[1]);
10816 }
10817
10818 static inline basic_ostringstream_wchar* basic_ostringstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
10819 {
10820     return (basic_ostringstream_wchar*)((char*)ptr-basic_ostringstream_wchar_vbtable[1]);
10821 }
10822
10823 /* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
10824 /* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
10825 static basic_ostringstream_wchar* basic_ostringstream_wchar_ctor_str(basic_ostringstream_wchar *this,
10826         const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
10827 {
10828     basic_ios_wchar *basic_ios;
10829
10830     TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
10831
10832     if(virt_init) {
10833         this->base.vbtable = basic_ostringstream_wchar_vbtable;
10834         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
10835         basic_ios_wchar_ctor(basic_ios);
10836     }else {
10837         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
10838     }
10839
10840     basic_stringbuf_wchar_ctor_str(&this->strbuf, str, mode|OPENMODE_out);
10841     basic_ostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
10842     basic_ios->base.vtable = &MSVCP_basic_ostringstream_wchar_vtable;
10843     return this;
10844 }
10845
10846 /* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
10847 /* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
10848 DEFINE_THISCALL_WRAPPER(basic_ostringstream_short_ctor_str, 16)
10849 basic_ostringstream_wchar* __thiscall basic_ostringstream_short_ctor_str(basic_ostringstream_wchar *this,
10850         const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
10851 {
10852     basic_ostringstream_wchar_ctor_str(this, str, mode, virt_init);
10853     basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ostringstream_short_vtable;
10854     return this;
10855 }
10856
10857 /* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
10858 /* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
10859 static basic_ostringstream_wchar* basic_ostringstream_wchar_ctor_mode(
10860         basic_ostringstream_wchar *this, int mode, MSVCP_bool virt_init)
10861 {
10862     basic_ios_wchar *basic_ios;
10863
10864     TRACE("(%p %d %d)\n", this, mode, virt_init);
10865
10866     if(virt_init) {
10867         this->base.vbtable = basic_ostringstream_wchar_vbtable;
10868         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
10869         basic_ios_wchar_ctor(basic_ios);
10870     }else {
10871         basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
10872     }
10873
10874     basic_stringbuf_wchar_ctor_mode(&this->strbuf, mode|OPENMODE_out);
10875     basic_ostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
10876     basic_ios->base.vtable = &MSVCP_basic_ostringstream_wchar_vtable;
10877     return this;
10878 }
10879
10880 /* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
10881 /* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
10882 DEFINE_THISCALL_WRAPPER(basic_ostringstream_short_ctor_mode, 12)
10883 basic_ostringstream_wchar* __thiscall basic_ostringstream_short_ctor_mode(
10884         basic_ostringstream_wchar *this, int mode, MSVCP_bool virt_init)
10885 {
10886     basic_ostringstream_wchar_ctor_mode(this, mode, virt_init);
10887     basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ostringstream_short_vtable;
10888     return this;
10889 }
10890
10891 /* ??_F?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
10892 /* ??_F?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
10893 DEFINE_THISCALL_WRAPPER(basic_ostringstream_short_ctor, 8)
10894 basic_ostringstream_wchar* __thiscall basic_ostringstream_short_ctor(
10895         basic_ostringstream_wchar *this, MSVCP_bool virt_init)
10896 {
10897     return basic_ostringstream_short_ctor_mode(this, 0, virt_init);
10898 }
10899
10900 /* ??1?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
10901 /* ??1?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
10902 /* ??1?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
10903 /* ??1?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
10904 DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_dtor, 4)
10905 void __thiscall basic_ostringstream_wchar_dtor(basic_ios_wchar *base)
10906 {
10907     basic_ostringstream_wchar *this = basic_ostringstream_wchar_from_basic_ios(base);
10908
10909     TRACE("(%p)\n", this);
10910
10911     basic_stringbuf_wchar_dtor(&this->strbuf);
10912     basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base));
10913 }
10914
10915 /* ??_D?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
10916 /* ??_D?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
10917 /* ??_D?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
10918 /* ??_D?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
10919 DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_vbase_dtor, 4)
10920 void __thiscall basic_ostringstream_wchar_vbase_dtor(basic_ostringstream_wchar *this)
10921 {
10922     TRACE("(%p)\n", this);
10923
10924     basic_ostringstream_wchar_dtor(basic_ostringstream_wchar_to_basic_ios(this));
10925     basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(&this->base));
10926 }
10927
10928 DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_vector_dtor, 8)
10929 basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
10930 {
10931     basic_ostringstream_wchar *this = basic_ostringstream_wchar_from_basic_ios(base);
10932
10933     TRACE("(%p %x)\n", this, flags);
10934
10935     if(flags & 2) {
10936         /* we have an array, with the number of elements stored before the first object */
10937         INT_PTR i, *ptr = (INT_PTR *)this-1;
10938
10939         for(i=*ptr-1; i>=0; i--)
10940             basic_ostringstream_wchar_vbase_dtor(this+i);
10941         MSVCRT_operator_delete(ptr);
10942     } else {
10943         basic_ostringstream_wchar_vbase_dtor(this);
10944         if(flags & 1)
10945             MSVCRT_operator_delete(this);
10946     }
10947
10948     return this;
10949 }
10950
10951 /* ?rdbuf@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
10952 /* ?rdbuf@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
10953 /* ?rdbuf@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
10954 /* ?rdbuf@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
10955 DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_rdbuf, 4)
10956 basic_stringbuf_wchar* __thiscall basic_ostringstream_wchar_rdbuf(const basic_ostringstream_wchar *this)
10957 {
10958     TRACE("(%p)\n", this);
10959     return (basic_stringbuf_wchar*)&this->strbuf;
10960 }
10961
10962 /* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
10963 /* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
10964 /* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
10965 /* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
10966 DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_str_set, 8)
10967 void __thiscall basic_ostringstream_wchar_str_set(basic_ostringstream_wchar *this, const basic_string_wchar *str)
10968 {
10969     TRACE("(%p %p)\n", this, str);
10970     basic_stringbuf_wchar_str_set(&this->strbuf, str);
10971 }
10972
10973 /* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
10974 /* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
10975 /* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
10976 /* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
10977 DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_str_get, 8)
10978 basic_string_wchar* __thiscall basic_ostringstream_wchar_str_get(const basic_ostringstream_wchar *this, basic_string_wchar *ret)
10979 {
10980     TRACE("(%p %p)\n", this, ret);
10981     return basic_stringbuf_wchar_str_get(&this->strbuf, ret);
10982 }
10983
10984 static inline basic_ios_char* basic_istringstream_char_to_basic_ios(basic_istringstream_char *ptr)
10985 {
10986     return (basic_ios_char*)((char*)ptr+basic_istringstream_char_vbtable[1]);
10987 }
10988
10989 static inline basic_istringstream_char* basic_istringstream_char_from_basic_ios(basic_ios_char *ptr)
10990 {
10991     return (basic_istringstream_char*)((char*)ptr-basic_istringstream_char_vbtable[1]);
10992 }
10993
10994 /* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
10995 /* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
10996 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_ctor_str, 16)
10997 basic_istringstream_char* __thiscall basic_istringstream_char_ctor_str(basic_istringstream_char *this,
10998         const basic_string_char *str, int mode, MSVCP_bool virt_init)
10999 {
11000     basic_ios_char *basic_ios;
11001
11002     TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
11003
11004     if(virt_init) {
11005         this->base.vbtable = basic_istringstream_char_vbtable;
11006         basic_ios = basic_istream_char_get_basic_ios(&this->base);
11007         basic_ios_char_ctor(basic_ios);
11008     }else {
11009         basic_ios = basic_istream_char_get_basic_ios(&this->base);
11010     }
11011
11012     basic_stringbuf_char_ctor_str(&this->strbuf, str, mode|OPENMODE_in);
11013     basic_istream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
11014     basic_ios->base.vtable = &MSVCP_basic_istringstream_char_vtable;
11015     return this;
11016 }
11017
11018 /* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
11019 /* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
11020 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_ctor_mode, 12)
11021 basic_istringstream_char* __thiscall basic_istringstream_char_ctor_mode(
11022         basic_istringstream_char *this, int mode, MSVCP_bool virt_init)
11023 {
11024     basic_ios_char *basic_ios;
11025
11026     TRACE("(%p %d %d)\n", this, mode, virt_init);
11027
11028     if(virt_init) {
11029         this->base.vbtable = basic_istringstream_char_vbtable;
11030         basic_ios = basic_istream_char_get_basic_ios(&this->base);
11031         basic_ios_char_ctor(basic_ios);
11032     }else {
11033         basic_ios = basic_istream_char_get_basic_ios(&this->base);
11034     }
11035
11036     basic_stringbuf_char_ctor_mode(&this->strbuf, mode|OPENMODE_in);
11037     basic_istream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
11038     basic_ios->base.vtable = &MSVCP_basic_istringstream_char_vtable;
11039     return this;
11040 }
11041
11042 /* ??_F?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
11043 /* ??_F?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
11044 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_ctor, 8)
11045 basic_istringstream_char* __thiscall basic_istringstream_char_ctor(
11046         basic_istringstream_char *this, MSVCP_bool virt_init)
11047 {
11048     return basic_istringstream_char_ctor_mode(this, 0, virt_init);
11049 }
11050
11051 /* ??1?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
11052 /* ??1?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
11053 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_dtor, 4)
11054 void __thiscall basic_istringstream_char_dtor(basic_ios_char *base)
11055 {
11056     basic_istringstream_char *this = basic_istringstream_char_from_basic_ios(base);
11057
11058     TRACE("(%p)\n", this);
11059
11060     basic_stringbuf_char_dtor(&this->strbuf);
11061     basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base));
11062 }
11063
11064 /* ??_D?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
11065 /* ??_D?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
11066 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_vbase_dtor, 4)
11067 void __thiscall basic_istringstream_char_vbase_dtor(basic_istringstream_char *this)
11068 {
11069     TRACE("(%p)\n", this);
11070
11071     basic_istringstream_char_dtor(basic_istringstream_char_to_basic_ios(this));
11072     basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base));
11073 }
11074
11075 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_vector_dtor, 8)
11076 basic_istringstream_char* __thiscall basic_istringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
11077 {
11078     basic_istringstream_char *this = basic_istringstream_char_from_basic_ios(base);
11079
11080     TRACE("(%p %x)\n", this, flags);
11081
11082     if(flags & 2) {
11083         /* we have an array, with the number of elements stored before the first object */
11084         INT_PTR i, *ptr = (INT_PTR *)this-1;
11085
11086         for(i=*ptr-1; i>=0; i--)
11087             basic_istringstream_char_vbase_dtor(this+i);
11088         MSVCRT_operator_delete(ptr);
11089     } else {
11090         basic_istringstream_char_vbase_dtor(this);
11091         if(flags & 1)
11092             MSVCRT_operator_delete(this);
11093     }
11094
11095     return this;
11096 }
11097
11098 /* ?rdbuf@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11099 /* ?rdbuf@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11100 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_rdbuf, 4)
11101 basic_stringbuf_char* __thiscall basic_istringstream_char_rdbuf(const basic_istringstream_char *this)
11102 {
11103     TRACE("(%p)\n", this);
11104     return (basic_stringbuf_char*)&this->strbuf;
11105 }
11106
11107 /* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
11108 /* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
11109 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_str_set, 8)
11110 void __thiscall basic_istringstream_char_str_set(basic_istringstream_char *this, const basic_string_char *str)
11111 {
11112     TRACE("(%p %p)\n", this, str);
11113     basic_stringbuf_char_str_set(&this->strbuf, str);
11114 }
11115
11116 /* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11117 /* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11118 DEFINE_THISCALL_WRAPPER(basic_istringstream_char_str_get, 8)
11119 basic_string_char* __thiscall basic_istringstream_char_str_get(const basic_istringstream_char *this, basic_string_char *ret)
11120 {
11121     TRACE("(%p %p)\n", this, ret);
11122     return basic_stringbuf_char_str_get(&this->strbuf, ret);
11123 }
11124
11125 static inline basic_ios_wchar* basic_istringstream_wchar_to_basic_ios(basic_istringstream_wchar *ptr)
11126 {
11127     return (basic_ios_wchar*)((char*)ptr+basic_istringstream_wchar_vbtable[1]);
11128 }
11129
11130 static inline basic_istringstream_wchar* basic_istringstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
11131 {
11132     return (basic_istringstream_wchar*)((char*)ptr-basic_istringstream_wchar_vbtable[1]);
11133 }
11134
11135 /* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
11136 /* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
11137 static basic_istringstream_wchar* basic_istringstream_wchar_ctor_str(basic_istringstream_wchar *this,
11138         const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
11139 {
11140     basic_ios_wchar *basic_ios;
11141
11142     TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
11143
11144     if(virt_init) {
11145         this->base.vbtable = basic_istringstream_wchar_vbtable;
11146         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
11147         basic_ios_wchar_ctor(basic_ios);
11148     }else {
11149         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
11150     }
11151
11152     basic_stringbuf_wchar_ctor_str(&this->strbuf, str, mode|OPENMODE_in);
11153     basic_istream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
11154     basic_ios->base.vtable = &MSVCP_basic_istringstream_wchar_vtable;
11155     return this;
11156 }
11157
11158 /* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
11159 /* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
11160 DEFINE_THISCALL_WRAPPER(basic_istringstream_short_ctor_str, 16)
11161 basic_istringstream_wchar* __thiscall basic_istringstream_short_ctor_str(basic_istringstream_wchar *this,
11162         const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
11163 {
11164     basic_istringstream_wchar_ctor_str(this, str, mode, virt_init);
11165     basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_istringstream_short_vtable;
11166     return this;
11167 }
11168
11169 /* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
11170 /* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
11171 static basic_istringstream_wchar* basic_istringstream_wchar_ctor_mode(
11172         basic_istringstream_wchar *this, int mode, MSVCP_bool virt_init)
11173 {
11174     basic_ios_wchar *basic_ios;
11175
11176     TRACE("(%p %d %d)\n", this, mode, virt_init);
11177
11178     if(virt_init) {
11179         this->base.vbtable = basic_istringstream_wchar_vbtable;
11180         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
11181         basic_ios_wchar_ctor(basic_ios);
11182     }else {
11183         basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
11184     }
11185
11186     basic_stringbuf_wchar_ctor_mode(&this->strbuf, mode|OPENMODE_in);
11187     basic_istream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
11188     basic_ios->base.vtable = &MSVCP_basic_istringstream_wchar_vtable;
11189     return this;
11190 }
11191
11192 /* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
11193 /* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
11194 DEFINE_THISCALL_WRAPPER(basic_istringstream_short_ctor_mode, 12)
11195 basic_istringstream_wchar* __thiscall basic_istringstream_short_ctor_mode(
11196         basic_istringstream_wchar *this, int mode, MSVCP_bool virt_init)
11197 {
11198     basic_istringstream_wchar_ctor_mode(this, mode, virt_init);
11199     basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_istringstream_short_vtable;
11200     return this;
11201 }
11202
11203 /* ??_F?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
11204 /* ??_F?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
11205 DEFINE_THISCALL_WRAPPER(basic_istringstream_short_ctor, 8)
11206 basic_istringstream_wchar* __thiscall basic_istringstream_short_ctor(
11207         basic_istringstream_wchar *this, MSVCP_bool virt_init)
11208 {
11209     return basic_istringstream_short_ctor_mode(this, 0, virt_init);
11210 }
11211
11212 /* ??1?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
11213 /* ??1?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
11214 /* ??1?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
11215 /* ??1?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
11216 DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_dtor, 4)
11217 void __thiscall basic_istringstream_wchar_dtor(basic_ios_wchar *base)
11218 {
11219     basic_istringstream_wchar *this = basic_istringstream_wchar_from_basic_ios(base);
11220
11221     TRACE("(%p)\n", this);
11222
11223     basic_stringbuf_wchar_dtor(&this->strbuf);
11224     basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base));
11225 }
11226
11227 /* ??_D?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
11228 /* ??_D?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
11229 /* ??_D?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
11230 /* ??_D?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
11231 DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_vbase_dtor, 4)
11232 void __thiscall basic_istringstream_wchar_vbase_dtor(basic_istringstream_wchar *this)
11233 {
11234     TRACE("(%p)\n", this);
11235
11236     basic_istringstream_wchar_dtor(basic_istringstream_wchar_to_basic_ios(this));
11237     basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base));
11238 }
11239
11240 DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_vector_dtor, 8)
11241 basic_istringstream_wchar* __thiscall basic_istringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
11242 {
11243     basic_istringstream_wchar *this = basic_istringstream_wchar_from_basic_ios(base);
11244
11245     TRACE("(%p %x)\n", this, flags);
11246
11247     if(flags & 2) {
11248         /* we have an array, with the number of elements stored before the first object */
11249         INT_PTR i, *ptr = (INT_PTR *)this-1;
11250
11251         for(i=*ptr-1; i>=0; i--)
11252             basic_istringstream_wchar_vbase_dtor(this+i);
11253         MSVCRT_operator_delete(ptr);
11254     } else {
11255         basic_istringstream_wchar_vbase_dtor(this);
11256         if(flags & 1)
11257             MSVCRT_operator_delete(this);
11258     }
11259
11260     return this;
11261 }
11262
11263 /* ?rdbuf@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11264 /* ?rdbuf@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11265 /* ?rdbuf@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11266 /* ?rdbuf@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11267 DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_rdbuf, 4)
11268 basic_stringbuf_wchar* __thiscall basic_istringstream_wchar_rdbuf(const basic_istringstream_wchar *this)
11269 {
11270     TRACE("(%p)\n", this);
11271     return (basic_stringbuf_wchar*)&this->strbuf;
11272 }
11273
11274 /* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
11275 /* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
11276 /* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
11277 /* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
11278 DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_str_set, 8)
11279 void __thiscall basic_istringstream_wchar_str_set(basic_istringstream_wchar *this, const basic_string_wchar *str)
11280 {
11281     TRACE("(%p %p)\n", this, str);
11282     basic_stringbuf_wchar_str_set(&this->strbuf, str);
11283 }
11284
11285 /* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11286 /* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11287 /* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11288 /* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11289 DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_str_get, 8)
11290 basic_string_wchar* __thiscall basic_istringstream_wchar_str_get(const basic_istringstream_wchar *this, basic_string_wchar *ret)
11291 {
11292     TRACE("(%p %p)\n", this, ret);
11293     return basic_stringbuf_wchar_str_get(&this->strbuf, ret);
11294 }
11295
11296 static inline basic_ios_char* basic_stringstream_char_to_basic_ios(basic_stringstream_char *ptr)
11297 {
11298     return (basic_ios_char*)((char*)ptr+basic_stringstream_char_vbtable1[1]);
11299 }
11300
11301 static inline basic_stringstream_char* basic_stringstream_char_from_basic_ios(basic_ios_char *ptr)
11302 {
11303     return (basic_stringstream_char*)((char*)ptr-basic_stringstream_char_vbtable1[1]);
11304 }
11305
11306 /* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
11307 /* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
11308 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_ctor_str, 16)
11309 basic_stringstream_char* __thiscall basic_stringstream_char_ctor_str(basic_stringstream_char *this,
11310         const basic_string_char *str, int mode, MSVCP_bool virt_init)
11311 {
11312     basic_ios_char *basic_ios;
11313
11314     TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
11315
11316     if(virt_init) {
11317         this->base.base1.vbtable = basic_stringstream_char_vbtable1;
11318         this->base.base2.vbtable = basic_stringstream_char_vbtable2;
11319         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
11320         basic_ios_char_ctor(basic_ios);
11321     }else {
11322         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
11323     }
11324
11325     basic_stringbuf_char_ctor_str(&this->strbuf, str, mode);
11326     basic_iostream_char_ctor(&this->base, &this->strbuf.base, FALSE);
11327     basic_ios->base.vtable = &MSVCP_basic_stringstream_char_vtable;
11328     return this;
11329 }
11330
11331 /* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
11332 /* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
11333 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_ctor_mode, 12)
11334 basic_stringstream_char* __thiscall basic_stringstream_char_ctor_mode(
11335         basic_stringstream_char *this, int mode, MSVCP_bool virt_init)
11336 {
11337     basic_ios_char *basic_ios;
11338
11339     TRACE("(%p %d %d)\n", this, mode, virt_init);
11340
11341     if(virt_init) {
11342         this->base.base1.vbtable = basic_stringstream_char_vbtable1;
11343         this->base.base2.vbtable = basic_stringstream_char_vbtable2;
11344         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
11345         basic_ios_char_ctor(basic_ios);
11346     }else {
11347         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
11348     }
11349
11350     basic_stringbuf_char_ctor_mode(&this->strbuf, mode);
11351     basic_iostream_char_ctor(&this->base, &this->strbuf.base, FALSE);
11352     basic_ios->base.vtable = &MSVCP_basic_stringstream_char_vtable;
11353     return this;
11354 }
11355
11356 /* ??_F?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
11357 /* ??_F?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
11358 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_ctor, 8)
11359 basic_stringstream_char* __thiscall basic_stringstream_char_ctor(
11360         basic_stringstream_char *this, MSVCP_bool virt_init)
11361 {
11362     return basic_stringstream_char_ctor_mode(
11363             this, OPENMODE_out|OPENMODE_in, virt_init);
11364 }
11365
11366 /* ??1?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
11367 /* ??1?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
11368 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_dtor, 4)
11369 void __thiscall basic_stringstream_char_dtor(basic_ios_char *base)
11370 {
11371     basic_stringstream_char *this = basic_stringstream_char_from_basic_ios(base);
11372
11373     TRACE("(%p)\n", this);
11374
11375     basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(&this->base));
11376     basic_stringbuf_char_dtor(&this->strbuf);
11377 }
11378
11379 /* ??_D?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
11380 /* ??_D?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
11381 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_vbase_dtor, 4)
11382 void __thiscall basic_stringstream_char_vbase_dtor(basic_stringstream_char *this)
11383 {
11384     TRACE("(%p)\n", this);
11385
11386     basic_stringstream_char_dtor(basic_stringstream_char_to_basic_ios(this));
11387     basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base.base1));
11388 }
11389
11390 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_vector_dtor, 8)
11391 basic_stringstream_char* __thiscall basic_stringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
11392 {
11393     basic_stringstream_char *this = basic_stringstream_char_from_basic_ios(base);
11394
11395     TRACE("(%p %x)\n", this, flags);
11396
11397     if(flags & 2) {
11398         /* we have an array, with the number of elements stored before the first object */
11399         INT_PTR i, *ptr = (INT_PTR *)this-1;
11400
11401         for(i=*ptr-1; i>=0; i--)
11402             basic_stringstream_char_vbase_dtor(this+i);
11403         MSVCRT_operator_delete(ptr);
11404     } else {
11405         basic_stringstream_char_vbase_dtor(this);
11406         if(flags & 1)
11407             MSVCRT_operator_delete(this);
11408     }
11409
11410     return this;
11411 }
11412
11413 /* ?rdbuf@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11414 /* ?rdbuf@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11415 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_rdbuf, 4)
11416 basic_stringbuf_char* __thiscall basic_stringstream_char_rdbuf(const basic_stringstream_char *this)
11417 {
11418     TRACE("(%p)\n", this);
11419     return (basic_stringbuf_char*)&this->strbuf;
11420 }
11421
11422 /* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
11423 /* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
11424 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_str_set, 8)
11425 void __thiscall basic_stringstream_char_str_set(basic_stringstream_char *this, const basic_string_char *str)
11426 {
11427     TRACE("(%p %p)\n", this, str);
11428     basic_stringbuf_char_str_set(&this->strbuf, str);
11429 }
11430
11431 /* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11432 /* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
11433 DEFINE_THISCALL_WRAPPER(basic_stringstream_char_str_get, 8)
11434 basic_string_char* __thiscall basic_stringstream_char_str_get(const basic_stringstream_char *this, basic_string_char *ret)
11435 {
11436     TRACE("(%p %p)\n", this, ret);
11437     return basic_stringbuf_char_str_get(&this->strbuf, ret);
11438 }
11439
11440 static inline basic_ios_wchar* basic_stringstream_wchar_to_basic_ios(basic_stringstream_wchar *ptr)
11441 {
11442     return (basic_ios_wchar*)((char*)ptr+basic_stringstream_wchar_vbtable1[1]);
11443 }
11444
11445 static inline basic_stringstream_wchar* basic_stringstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
11446 {
11447     return (basic_stringstream_wchar*)((char*)ptr-basic_stringstream_wchar_vbtable1[1]);
11448 }
11449
11450 /* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
11451 /* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
11452 static basic_stringstream_wchar* basic_stringstream_wchar_ctor_str(basic_stringstream_wchar *this,
11453         const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
11454 {
11455     basic_ios_wchar *basic_ios;
11456
11457     TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
11458
11459     if(virt_init) {
11460         this->base.base1.vbtable = basic_stringstream_wchar_vbtable1;
11461         this->base.base2.vbtable = basic_stringstream_wchar_vbtable2;
11462         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
11463         basic_ios_wchar_ctor(basic_ios);
11464     }else {
11465         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
11466     }
11467
11468     basic_stringbuf_wchar_ctor_str(&this->strbuf, str, mode);
11469     basic_iostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE);
11470     basic_ios->base.vtable = &MSVCP_basic_stringstream_wchar_vtable;
11471     return this;
11472 }
11473
11474 /* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
11475 /* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
11476 DEFINE_THISCALL_WRAPPER(basic_stringstream_short_ctor_str, 16)
11477 basic_stringstream_wchar* __thiscall basic_stringstream_short_ctor_str(basic_stringstream_wchar *this,
11478         const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
11479 {
11480     basic_stringstream_wchar_ctor_str(this, str, mode, virt_init);
11481     basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_stringstream_short_vtable;
11482     return this;
11483 }
11484
11485 /* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
11486 /* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
11487 static basic_stringstream_wchar* basic_stringstream_wchar_ctor_mode(
11488         basic_stringstream_wchar *this, int mode, MSVCP_bool virt_init)
11489 {
11490     basic_ios_wchar *basic_ios;
11491
11492     TRACE("(%p %d %d)\n", this, mode, virt_init);
11493
11494     if(virt_init) {
11495         this->base.base1.vbtable = basic_stringstream_wchar_vbtable1;
11496         this->base.base2.vbtable = basic_stringstream_wchar_vbtable2;
11497         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
11498         basic_ios_wchar_ctor(basic_ios);
11499     }else {
11500         basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
11501     }
11502
11503     basic_stringbuf_wchar_ctor_mode(&this->strbuf, mode);
11504     basic_iostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE);
11505     basic_ios->base.vtable = &MSVCP_basic_stringstream_wchar_vtable;
11506     return this;
11507 }
11508
11509 /* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
11510 /* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
11511 DEFINE_THISCALL_WRAPPER(basic_stringstream_short_ctor_mode, 12)
11512 basic_stringstream_wchar* __thiscall basic_stringstream_short_ctor_mode(
11513         basic_stringstream_wchar *this, int mode, MSVCP_bool virt_init)
11514 {
11515     basic_stringstream_wchar_ctor_mode(this, mode, virt_init);
11516     basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_stringstream_short_vtable;
11517     return this;
11518 }
11519
11520 /* ??_F?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
11521 /* ??_F?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
11522 DEFINE_THISCALL_WRAPPER(basic_stringstream_short_ctor, 8)
11523 basic_stringstream_wchar* __thiscall basic_stringstream_short_ctor(
11524         basic_stringstream_wchar *this, MSVCP_bool virt_init)
11525 {
11526     return basic_stringstream_short_ctor_mode(
11527             this, OPENMODE_out|OPENMODE_in, virt_init);
11528 }
11529
11530 /* ??1?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
11531 /* ??1?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
11532 /* ??1?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
11533 /* ??1?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
11534 DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_dtor, 4)
11535 void __thiscall basic_stringstream_wchar_dtor(basic_ios_wchar *base)
11536 {
11537     basic_stringstream_wchar *this = basic_stringstream_wchar_from_basic_ios(base);
11538
11539     TRACE("(%p)\n", this);
11540
11541     basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(&this->base));
11542     basic_stringbuf_wchar_dtor(&this->strbuf);
11543 }
11544
11545 /* ??_D?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
11546 /* ??_D?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
11547 /* ??_D?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
11548 /* ??_D?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
11549 DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_vbase_dtor, 4)
11550 void __thiscall basic_stringstream_wchar_vbase_dtor(basic_stringstream_wchar *this)
11551 {
11552     TRACE("(%p)\n", this);
11553
11554     basic_stringstream_wchar_dtor(basic_stringstream_wchar_to_basic_ios(this));
11555     basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base.base1));
11556 }
11557
11558 DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_vector_dtor, 8)
11559 basic_stringstream_wchar* __thiscall basic_stringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
11560 {
11561     basic_stringstream_wchar *this = basic_stringstream_wchar_from_basic_ios(base);
11562
11563     TRACE("(%p %x)\n", this, flags);
11564
11565     if(flags & 2) {
11566         /* we have an array, with the number of elements stored before the first object */
11567         INT_PTR i, *ptr = (INT_PTR *)this-1;
11568
11569         for(i=*ptr-1; i>=0; i--)
11570             basic_stringstream_wchar_vbase_dtor(this+i);
11571         MSVCRT_operator_delete(ptr);
11572     } else {
11573         basic_stringstream_wchar_vbase_dtor(this);
11574         if(flags & 1)
11575             MSVCRT_operator_delete(this);
11576     }
11577
11578     return this;
11579 }
11580
11581 /* ?rdbuf@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11582 /* ?rdbuf@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11583 /* ?rdbuf@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11584 /* ?rdbuf@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11585 DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_rdbuf, 4)
11586 basic_stringbuf_wchar* __thiscall basic_stringstream_wchar_rdbuf(const basic_stringstream_wchar *this)
11587 {
11588     TRACE("(%p)\n", this);
11589     return (basic_stringbuf_wchar*)&this->strbuf;
11590 }
11591
11592 /* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
11593 /* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
11594 /* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
11595 /* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
11596 DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_str_set, 8)
11597 void __thiscall basic_stringstream_wchar_str_set(basic_stringstream_wchar *this, const basic_string_wchar *str)
11598 {
11599     TRACE("(%p %p)\n", this, str);
11600     basic_stringbuf_wchar_str_set(&this->strbuf, str);
11601 }
11602
11603 /* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11604 /* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
11605 /* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11606 /* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
11607 DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_str_get, 8)
11608 basic_string_wchar* __thiscall basic_stringstream_wchar_str_get(const basic_stringstream_wchar *this, basic_string_wchar *ret)
11609 {
11610     TRACE("(%p %p)\n", this, ret);
11611     return basic_stringbuf_wchar_str_get(&this->strbuf, ret);
11612 }
11613
11614 /* ?_Init@strstreambuf@std@@IAEXHPAD0H@Z */
11615 /* ?_Init@strstreambuf@std@@IEAAX_JPEAD1H@Z */
11616 DEFINE_THISCALL_WRAPPER(strstreambuf__Init, 20)
11617 void __thiscall strstreambuf__Init(strstreambuf *this, streamsize len, char *g, char *p, int mode)
11618 {
11619     TRACE("(%p %ld %p %p %d)\n", this, len, g, p, mode);
11620
11621     this->minsize = 32;
11622     this->endsave = NULL;
11623     this->strmode = mode;
11624     this->palloc = NULL;
11625     this->pfree = NULL;
11626
11627     if(!g) {
11628         this->strmode |= STRSTATE_Dynamic;
11629         if(len > this->minsize)
11630             this->minsize = len;
11631         this->seekhigh = NULL;
11632         return;
11633     }
11634
11635     if(len < 0)
11636         len = INT_MAX;
11637     else if(!len)
11638         len = strlen(g);
11639
11640     this->seekhigh = g+len;
11641     basic_streambuf_char_setg(&this->base, g, g, p ? p : this->seekhigh);
11642     if(p)
11643         basic_streambuf_char_setp(&this->base, p, this->seekhigh);
11644 }
11645
11646 /* ??0strstreambuf@std@@QAE@PACH0@Z */
11647 /* ??0strstreambuf@std@@QEAA@PEAC_J0@Z */
11648 /* ??0strstreambuf@std@@QAE@PADH0@Z */
11649 /* ??0strstreambuf@std@@QEAA@PEAD_J0@Z */
11650 /* ??0strstreambuf@std@@QAE@PAEH0@Z */
11651 /* ??0strstreambuf@std@@QEAA@PEAE_J0@Z */
11652 static strstreambuf* strstreambuf_ctor_get_put(strstreambuf *this, char *g, streamsize len, char *p)
11653 {
11654     TRACE("(%p %p %ld %p)\n", this, g, len, p);
11655
11656     basic_streambuf_char_ctor(&this->base);
11657     this->base.vtable = &MSVCP_strstreambuf_vtable;
11658
11659     strstreambuf__Init(this, len, g, p, 0);
11660     return this;
11661 }
11662
11663 /* ?_Tidy@strstreambuf@std@@IAEXXZ */
11664 /* ?_Tidy@strstreambuf@std@@IEAAXXZ */
11665 DEFINE_THISCALL_WRAPPER(strstreambuf__Tidy, 4)
11666 void __thiscall strstreambuf__Tidy(strstreambuf *this)
11667 {
11668     TRACE("(%p)\n", this);
11669
11670     if((this->strmode & STRSTATE_Allocated) && !(this->strmode & STRSTATE_Frozen)) {
11671         if(this->pfree)
11672             this->pfree(basic_streambuf_char_eback(&this->base));
11673         else
11674             MSVCRT_operator_delete(basic_streambuf_char_eback(&this->base));
11675     }
11676
11677     this->endsave = NULL;
11678     this->seekhigh = NULL;
11679     this->strmode &= ~(STRSTATE_Allocated | STRSTATE_Frozen);
11680     basic_streambuf_char_setg(&this->base, NULL, NULL, NULL);
11681     basic_streambuf_char_setp(&this->base, NULL, NULL);
11682 }
11683
11684 /* ??1strstreambuf@std@@UAE@XZ */
11685 /* ??1strstreambuf@std@@UEAA@XZ */
11686 DEFINE_THISCALL_WRAPPER(strstreambuf_dtor, 4)
11687 void __thiscall strstreambuf_dtor(strstreambuf *this)
11688 {
11689     TRACE("(%p)\n", this);
11690
11691     strstreambuf__Tidy(this);
11692     basic_streambuf_char_dtor(&this->base);
11693 }
11694
11695 DEFINE_THISCALL_WRAPPER(strstreambuf_vector_dtor, 8)
11696 strstreambuf* __thiscall strstreambuf_vector_dtor(strstreambuf *this, unsigned int flags)
11697 {
11698     TRACE("(%p %x)\n", this, flags);
11699     if(flags & 2) {
11700         /* we have an array, with the number of elements stored before the first object */
11701         INT_PTR i, *ptr = (INT_PTR *)this-1;
11702
11703         for(i=*ptr-1; i>=0; i--)
11704             strstreambuf_dtor(this+i);
11705         MSVCRT_operator_delete(ptr);
11706     } else {
11707         strstreambuf_dtor(this);
11708         if(flags & 1)
11709             MSVCRT_operator_delete(this);
11710     }
11711
11712     return this;
11713 }
11714
11715 /* ?freeze@strstreambuf@std@@QAEX_N@Z */
11716 /* ?freeze@strstreambuf@std@@QEAAX_N@Z */
11717 DEFINE_THISCALL_WRAPPER(strstreambuf_freeze, 8)
11718 void __thiscall strstreambuf_freeze(strstreambuf *this, MSVCP_bool freeze)
11719 {
11720     TRACE("(%p %d)\n", this, freeze);
11721
11722     if(!freeze == !(this->strmode *STRSTATE_Frozen))
11723         return;
11724
11725     if(freeze) {
11726         this->strmode |= STRSTATE_Frozen;
11727         this->endsave = basic_streambuf_char_epptr(&this->base);
11728         basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base),
11729                 basic_streambuf_char_pptr(&this->base), basic_streambuf_char_eback(&this->base));
11730     }else {
11731         this->strmode &= ~STRSTATE_Frozen;
11732         basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base),
11733                 basic_streambuf_char_pptr(&this->base), this->endsave);
11734     }
11735 }
11736
11737 /* ?overflow@strstreambuf@std@@MAEHH@Z */
11738 /* ?overflow@strstreambuf@std@@MEAAHH@Z */
11739 DEFINE_THISCALL_WRAPPER(strstreambuf_overflow, 8)
11740 int __thiscall strstreambuf_overflow(strstreambuf *this, int c)
11741 {
11742     MSVCP_size_t old_size, size;
11743     char *ptr, *buf;
11744
11745     TRACE("(%p %d)\n", this, c);
11746
11747     if(c == EOF)
11748         return !EOF;
11749
11750     if(this->strmode & STRSTATE_Frozen)
11751         return EOF;
11752
11753     ptr = basic_streambuf_char_pptr(&this->base);
11754     if(ptr && ptr<basic_streambuf_char_epptr(&this->base))
11755         return (unsigned char)(*basic_streambuf_char__Pninc(&this->base) = c);
11756
11757     if(!(this->strmode & STRSTATE_Dynamic) || (this->strmode & STRSTATE_Constant))
11758         return EOF;
11759
11760     ptr = basic_streambuf_char_eback(&this->base);
11761     old_size = ptr ? basic_streambuf_char_epptr(&this->base) - ptr : 0;
11762
11763     size = old_size + old_size/2;
11764     if(size < this->minsize)
11765         size = this->minsize;
11766
11767     if(this->palloc)
11768         buf = this->palloc(size);
11769     else
11770         buf = MSVCRT_operator_new(size);
11771     if(!buf)
11772         return EOF;
11773
11774     memcpy(buf, ptr, old_size);
11775     if(this->strmode & STRSTATE_Allocated) {
11776         if(this->pfree)
11777             this->pfree(ptr);
11778         else
11779             MSVCRT_operator_delete(ptr);
11780     }
11781
11782     this->strmode |= STRSTATE_Allocated;
11783     if(!old_size) {
11784         this->seekhigh = buf;
11785         basic_streambuf_char_setp(&this->base, buf, buf+size);
11786         basic_streambuf_char_setg(&this->base, buf, buf, buf);
11787     }else {
11788         this->seekhigh = this->seekhigh-ptr+buf;
11789         basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base)-ptr+buf,
11790                 basic_streambuf_char_pptr(&this->base)-ptr+buf, buf+size);
11791         basic_streambuf_char_setg(&this->base, buf, basic_streambuf_char_gptr(&this->base)-ptr+buf,
11792                 basic_streambuf_char_pptr(&this->base));
11793     }
11794
11795     return (unsigned char)(*basic_streambuf_char__Pninc(&this->base) = c);
11796 }
11797
11798 /* ?pbackfail@strstreambuf@std@@MAEHH@Z */
11799 /* ?pbackfail@strstreambuf@std@@MEAAHH@Z */
11800 DEFINE_THISCALL_WRAPPER(strstreambuf_pbackfail, 8)
11801 int __thiscall strstreambuf_pbackfail(strstreambuf *this, int c)
11802 {
11803     char *ptr = basic_streambuf_char_gptr(&this->base);
11804
11805     TRACE("(%p %d)\n", this, c);
11806
11807     if(ptr<=basic_streambuf_char_eback(&this->base)
11808             || ((this->strmode & STRSTATE_Constant) && c!=ptr[-1]))
11809         return EOF;
11810
11811     basic_streambuf_char_gbump(&this->base, -1);
11812     if(c == EOF)
11813         return !EOF;
11814     if(this->strmode & STRSTATE_Constant)
11815         return (unsigned char)c;
11816
11817     return (unsigned char)(ptr[0] = c);
11818 }
11819
11820 /* ?seekoff@strstreambuf@std@@MAE?AV?$fpos@H@2@JHH@Z */
11821 /* ?seekoff@strstreambuf@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
11822 DEFINE_THISCALL_WRAPPER(strstreambuf_seekoff, 20)
11823 fpos_int* __thiscall strstreambuf_seekoff(strstreambuf *this, fpos_int *ret, streamoff off, int way, int mode)
11824 {
11825     char *eback = basic_streambuf_char_eback(&this->base);
11826     char *pptr = basic_streambuf_char_pptr(&this->base);
11827     char *gptr = basic_streambuf_char_gptr(&this->base);
11828
11829     TRACE("(%p %p %ld %d %d)\n", this, ret, off, way, mode);
11830
11831     ret->off = 0;
11832     ret->state = 0;
11833
11834     if(pptr > this->seekhigh)
11835         this->seekhigh = pptr;
11836
11837     if((mode & OPENMODE_in) && gptr) {
11838         if(way==SEEKDIR_cur && !(mode & OPENMODE_out))
11839             off += gptr-eback;
11840         else if(way == SEEKDIR_end)
11841             off += this->seekhigh-eback;
11842         else if(way != SEEKDIR_beg)
11843             off = -1;
11844
11845         if(off<0 || off>this->seekhigh-eback) {
11846             off = -1;
11847         }else {
11848             basic_streambuf_char_gbump(&this->base, eback-gptr+off);
11849             if((mode & OPENMODE_out) && pptr) {
11850                 basic_streambuf_char_setp_next(&this->base, eback,
11851                         gptr, basic_streambuf_char_epptr(&this->base));
11852             }
11853         }
11854     }else if((mode & OPENMODE_out) && pptr) {
11855         if(way == SEEKDIR_cur)
11856             off += pptr-eback;
11857         else if(way == SEEKDIR_end)
11858             off += this->seekhigh-eback;
11859         else if(way != SEEKDIR_beg)
11860             off = -1;
11861
11862          if(off<0 || off>this->seekhigh-eback)
11863              off = -1;
11864          else
11865              basic_streambuf_char_pbump(&this->base, eback-pptr+off);
11866     }else {
11867         off = -1;
11868     }
11869
11870     ret->pos = off;
11871     return ret;
11872 }
11873
11874 /* ?seekpos@strstreambuf@std@@MAE?AV?$fpos@H@2@V32@H@Z */
11875 /* ?seekpos@strstreambuf@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
11876 DEFINE_THISCALL_WRAPPER(strstreambuf_seekpos, 36)
11877 fpos_int* __thiscall strstreambuf_seekpos(strstreambuf *this, fpos_int *ret, fpos_int pos, int mode)
11878 {
11879     TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
11880
11881     if(pos.off==0 && pos.pos==-1 && pos.state==0) {
11882         *ret = pos;
11883         return ret;
11884     }
11885
11886     return strstreambuf_seekoff(this, ret, pos.off, SEEKDIR_beg, mode);
11887 }
11888
11889 /* ?underflow@strstreambuf@std@@MAEHXZ */
11890 /* ?underflow@strstreambuf@std@@MEAAHXZ */
11891 DEFINE_THISCALL_WRAPPER(strstreambuf_underflow, 4)
11892 int __thiscall strstreambuf_underflow(strstreambuf *this)
11893 {
11894     char *gptr = basic_streambuf_char_gptr(&this->base);
11895     char *pptr;
11896
11897     TRACE("(%p)\n", this);
11898
11899     if(!gptr)
11900         return EOF;
11901
11902     if(gptr < basic_streambuf_char_egptr(&this->base))
11903         return (unsigned char)(*gptr);
11904
11905     pptr = basic_streambuf_char_gptr(&this->base);
11906     if(pptr > this->seekhigh)
11907         this->seekhigh = pptr;
11908
11909     if(this->seekhigh <= gptr)
11910         return EOF;
11911
11912     basic_streambuf_char_setg(&this->base, basic_streambuf_char_eback(&this->base),
11913             gptr, this->seekhigh);
11914     return (unsigned char)(*gptr);
11915 }
11916
11917 static inline basic_ios_char* ostrstream_to_basic_ios(ostrstream *ptr)
11918 {
11919     return (basic_ios_char*)((char*)ptr+ostrstream_vbtable[1]);
11920 }
11921
11922 static inline ostrstream* ostrstream_from_basic_ios(basic_ios_char *ptr)
11923 {
11924     return (ostrstream*)((char*)ptr-ostrstream_vbtable[1]);
11925 }
11926
11927 /* ??0ostrstream@std@@QAE@PADHH@Z */
11928 DEFINE_THISCALL_WRAPPER(ostrstream_ctor, 20)
11929 ostrstream* __thiscall ostrstream_ctor(ostrstream *this, char *buf, streamsize size, int mode, MSVCP_bool virt_init)
11930 {
11931     basic_ios_char *basic_ios;
11932
11933     TRACE("(%p %p %ld %d %d)\n", this, buf, size, mode, virt_init);
11934
11935     if(virt_init) {
11936         this->base.vbtable = ostrstream_vbtable;
11937         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
11938         basic_ios_char_ctor(basic_ios);
11939     }else {
11940         basic_ios = basic_ostream_char_get_basic_ios(&this->base);
11941     }
11942
11943     strstreambuf_ctor_get_put(&this->buf, buf, size,
11944             buf && (mode & OPENMODE_app) ? buf+strlen(buf) : buf);
11945     basic_ostream_char_ctor(&this->base, &this->buf.base, FALSE, FALSE);
11946     basic_ios->base.vtable = &MSVCP_ostrstream_vtable;
11947     return this;
11948 }
11949
11950 /* ??1ostrstream@std@@UAE@XZ */
11951 /* ??1ostrstream@std@@UEAA@XZ */
11952 DEFINE_THISCALL_WRAPPER(ostrstream_dtor, 4)
11953 void __thiscall ostrstream_dtor(basic_ios_char *base)
11954 {
11955     ostrstream *this = ostrstream_from_basic_ios(base);
11956
11957     TRACE("(%p)\n", this);
11958
11959     basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base));
11960     strstreambuf_dtor(&this->buf);
11961 }
11962
11963 static void ostrstream_vbase_dtor(ostrstream *this)
11964 {
11965     TRACE("(%p)\n", this);
11966
11967     ostrstream_dtor(ostrstream_to_basic_ios(this));
11968     basic_ios_char_dtor(basic_ostream_char_get_basic_ios(&this->base));
11969 }
11970
11971 DEFINE_THISCALL_WRAPPER(ostrstream_vector_dtor, 8)
11972 ostrstream* __thiscall ostrstream_vector_dtor(basic_ios_char *base, unsigned int flags)
11973 {
11974     ostrstream *this = ostrstream_from_basic_ios(base);
11975
11976     TRACE("(%p %x)\n", this, flags);
11977
11978     if(flags & 2) {
11979         /* we have an array, with the number of elements stored before the first object */
11980         INT_PTR i, *ptr = (INT_PTR *)this-1;
11981
11982         for(i=*ptr-1; i>=0; i--)
11983             ostrstream_vbase_dtor(this+i);
11984         MSVCRT_operator_delete(ptr);
11985     } else {
11986         ostrstream_vbase_dtor(this);
11987         if(flags & 1)
11988             MSVCRT_operator_delete(this);
11989     }
11990
11991     return this;
11992 }
11993
11994 static inline istrstream* istrstream_from_basic_ios(basic_ios_char *ptr)
11995 {
11996     return (istrstream*)((char*)ptr-istrstream_vbtable[1]);
11997 }
11998
11999 /* ??1istrstream@std@@UAE@XZ */
12000 /* ??1istrstream@std@@UEAA@XZ */
12001 DEFINE_THISCALL_WRAPPER(istrstream_dtor, 4)
12002 void __thiscall istrstream_dtor(basic_ios_char *base)
12003 {
12004     istrstream *this = istrstream_from_basic_ios(base);
12005
12006     TRACE("(%p)\n", this);
12007
12008     basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base));
12009     strstreambuf_dtor(&this->buf);
12010 }
12011
12012 static inline basic_ios_char* strstream_to_basic_ios(strstream *ptr)
12013 {
12014     return (basic_ios_char*)((char*)ptr+strstream_vbtable1[1]);
12015 }
12016
12017 static inline strstream* strstream_from_basic_ios(basic_ios_char *ptr)
12018 {
12019     return (strstream*)((char*)ptr-strstream_vbtable1[1]);
12020 }
12021
12022 /* ??0strstream@std@@QAE@PADHH@Z */
12023 /* ??0strstream@std@@QEAA@PEAD_JH@Z */
12024 DEFINE_THISCALL_WRAPPER(strstream_ctor, 20)
12025 strstream* __thiscall strstream_ctor(strstream *this, char *buf, streamsize size, int mode, MSVCP_bool virt_init)
12026 {
12027     basic_ios_char *basic_ios;
12028
12029     TRACE("(%p %p %ld %d %d)\n", this, buf, size, mode, virt_init);
12030
12031     if(virt_init) {
12032         this->base.base1.vbtable = strstream_vbtable1;
12033         this->base.base2.vbtable = strstream_vbtable2;
12034         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
12035         basic_ios_char_ctor(basic_ios);
12036     }else {
12037         basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
12038     }
12039
12040     strstreambuf_ctor_get_put(&this->buf, buf, size,
12041             buf && (mode & OPENMODE_app) ? buf+strlen(buf) : buf);
12042     basic_iostream_char_ctor(&this->base, &this->buf.base, FALSE);
12043     basic_ios->base.vtable = &MSVCP_strstream_vtable;
12044     return this;
12045 }
12046
12047 /* ??1strstream@std@@UAE@XZ */
12048 /* ??1strstream@std@@UEAA@XZ */
12049 DEFINE_THISCALL_WRAPPER(strstream_dtor, 4)
12050 void __thiscall strstream_dtor(basic_ios_char *base)
12051 {
12052     strstream *this = strstream_from_basic_ios(base);
12053
12054     TRACE("(%p)\n", this);
12055
12056     basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(&this->base));
12057     strstreambuf_dtor(&this->buf);
12058 }
12059
12060 static void strstream_vbase_dtor(strstream *this)
12061 {
12062     TRACE("(%p)\n", this);
12063
12064     strstream_dtor(strstream_to_basic_ios(this));
12065     basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base.base1));
12066 }
12067
12068 DEFINE_THISCALL_WRAPPER(strstream_vector_dtor, 8)
12069 strstream* __thiscall strstream_vector_dtor(basic_ios_char *base, unsigned int flags)
12070 {
12071     strstream *this = strstream_from_basic_ios(base);
12072
12073     TRACE("(%p %x)\n", this, flags);
12074
12075     if(flags & 2) {
12076         /* we have an array, with the number of elements stored before the first object */
12077         INT_PTR i, *ptr = (INT_PTR *)this-1;
12078
12079         for(i=*ptr-1; i>=0; i--)
12080             strstream_vbase_dtor(this+i);
12081         MSVCRT_operator_delete(ptr);
12082     } else {
12083         strstream_vbase_dtor(this);
12084         if(flags & 1)
12085             MSVCRT_operator_delete(this);
12086     }
12087
12088     return this;
12089 }
12090
12091 static void __cdecl setprecision_func(ios_base *base, streamsize prec)
12092 {
12093     ios_base_precision_set(base, prec);
12094 }
12095
12096 /* ?setprecision@std@@YA?AU?$_Smanip@H@1@H@Z */
12097 /* ?setprecision@std@@YA?AU?$_Smanip@_J@1@_J@Z */
12098 manip_streamsize* __cdecl setprecision(manip_streamsize *ret, streamsize prec)
12099 {
12100     TRACE("(%p %ld)\n", ret, prec);
12101
12102     ret->pfunc = setprecision_func;
12103     ret->arg = prec;
12104     return ret;
12105 }
12106
12107 static void __cdecl setw_func(ios_base *base, streamsize width)
12108 {
12109     ios_base_width_set(base, width);
12110 }
12111
12112 /* ?setw@std@@YA?AU?$_Smanip@H@1@H@Z */
12113 /* ?setw@std@@YA?AU?$_Smanip@_J@1@_J@Z */
12114 manip_streamsize* __cdecl setw(manip_streamsize *ret, streamsize width)
12115 {
12116     TRACE("(%p %ld)\n", ret, width);
12117
12118     ret->pfunc = setw_func;
12119     ret->arg = width;
12120     return ret;
12121 }
12122
12123 static void __cdecl resetioflags_func(ios_base *base, int mask)
12124 {
12125     ios_base_setf_mask(base, 0, mask);
12126 }
12127
12128 /* ?resetiosflags@std@@YA?AU?$_Smanip@H@1@H@Z */
12129 manip_int* __cdecl resetiosflags(manip_int *ret, int mask)
12130 {
12131     TRACE("(%p %d)\n", ret, mask);
12132
12133     ret->pfunc = resetioflags_func;
12134     ret->arg = mask;
12135     return ret;
12136 }
12137
12138 static void __cdecl setiosflags_func(ios_base *base, int mask)
12139 {
12140     ios_base_setf_mask(base, FMTFLAG_mask, mask);
12141 }
12142
12143 /* ?setiosflags@std@@YA?AU?$_Smanip@H@1@H@Z */
12144 manip_int* __cdecl setiosflags(manip_int *ret, int mask)
12145 {
12146     TRACE("(%p %d)\n", ret, mask);
12147
12148     ret->pfunc = setiosflags_func;
12149     ret->arg = mask;
12150     return ret;
12151 }
12152
12153 static void __cdecl setbase_func(ios_base *base, int set_base)
12154 {
12155     if(set_base == 10)
12156         set_base = FMTFLAG_dec;
12157     else if(set_base == 8)
12158         set_base = FMTFLAG_oct;
12159     else if(set_base == 16)
12160         set_base = FMTFLAG_hex;
12161     else
12162         set_base = 0;
12163
12164     ios_base_setf_mask(base, set_base, FMTFLAG_basefield);
12165 }
12166
12167 /* ?setbase@std@@YA?AU?$_Smanip@H@1@H@Z */
12168 manip_int* __cdecl setbase(manip_int *ret, int base)
12169 {
12170     TRACE("(%p %d)\n", ret, base);
12171
12172     ret->pfunc = setbase_func;
12173     ret->arg = base;
12174     return ret;
12175 }
12176
12177 static basic_filebuf_char filebuf_char_stdin;
12178 /* ?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A */
12179 struct {
12180     basic_istream_char obj;
12181     basic_ios_char vbase;
12182 } cin = { { 0 } };
12183 /* ?_Ptr_cin@std@@3PAV?$basic_istream@DU?$char_traits@D@std@@@1@A */
12184 /* ?_Ptr_cin@std@@3PEAV?$basic_istream@DU?$char_traits@D@std@@@1@EA */
12185 basic_istream_char *_Ptr_cin = &cin.obj;
12186
12187 static basic_filebuf_wchar filebuf_short_stdin;
12188 /* ?wcin@std@@3V?$basic_istream@GU?$char_traits@G@std@@@1@A */
12189 struct {
12190     basic_istream_wchar obj;
12191     basic_ios_wchar vbase;
12192 } ucin = { { 0 } };
12193 /* ?_Ptr_wcin@std@@3PAV?$basic_istream@GU?$char_traits@G@std@@@1@A */
12194 /* ?_Ptr_wcin@std@@3PEAV?$basic_istream@GU?$char_traits@G@std@@@1@EA */
12195 basic_istream_wchar *_Ptr_ucin = &ucin.obj;
12196
12197 static basic_filebuf_wchar filebuf_wchar_stdin;
12198 /* ?wcin@std@@3V?$basic_istream@_WU?$char_traits@_W@std@@@1@A */
12199 struct {
12200     basic_istream_wchar obj;
12201     basic_ios_wchar vbase;
12202 } wcin = { { 0 } };
12203 /* ?_Ptr_wcin@std@@3PAV?$basic_istream@_WU?$char_traits@_W@std@@@1@A */
12204 /* ?_Ptr_wcin@std@@3PEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@EA */
12205 basic_istream_wchar *_Ptr_wcin = &wcin.obj;
12206
12207 static basic_filebuf_char filebuf_char_stdout;
12208 /* ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A */
12209 struct {
12210     basic_ostream_char obj;
12211     basic_ios_char vbase;
12212 } cout = { { 0 } };
12213 /* ?_Ptr_cout@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A */
12214 /* ?_Ptr_cout@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA */
12215 basic_ostream_char *_Ptr_cout = &cout.obj;
12216
12217 static basic_filebuf_wchar filebuf_short_stdout;
12218 /* ?wcout@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A */
12219 struct {
12220     basic_ostream_wchar obj;
12221     basic_ios_wchar vbase;
12222 } ucout = { { 0 } };
12223 /* ?_Ptr_wcout@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A */
12224 /* ?_Ptr_wcout@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA */
12225 basic_ostream_wchar *_Ptr_ucout = &ucout.obj;
12226
12227 static basic_filebuf_wchar filebuf_wchar_stdout;
12228 /* ?wcout@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A */
12229 struct {
12230     basic_ostream_wchar obj;
12231     basic_ios_wchar vbase;
12232 } wcout = { { 0 } };
12233 /* ?_Ptr_wcout@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A */
12234 /* ?_Ptr_wcout@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA */
12235 basic_ostream_wchar *_Ptr_wcout = &wcout.obj;
12236
12237 static basic_filebuf_char filebuf_char_stderr;
12238 /* ?cerr@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A */
12239 struct {
12240     basic_ostream_char obj;
12241     basic_ios_char vbase;
12242 } cerr = { { 0 } };
12243 /* ?_Ptr_cerr@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A */
12244 /* ?_Ptr_cerr@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA */
12245 basic_ostream_char *_Ptr_cerr = &cerr.obj;
12246
12247 static basic_filebuf_wchar filebuf_short_stderr;
12248 /* ?wcerr@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A */
12249 struct {
12250     basic_ostream_wchar obj;
12251     basic_ios_wchar vbase;
12252 } ucerr = { { 0 } };
12253 /* ?_Ptr_wcerr@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A */
12254 /* ?_Ptr_wcerr@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA */
12255 basic_ostream_wchar *_Ptr_ucerr = &ucerr.obj;
12256
12257 static basic_filebuf_wchar filebuf_wchar_stderr;
12258 /* ?wcerr@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A */
12259 struct {
12260     basic_ostream_wchar obj;
12261     basic_ios_wchar vbase;
12262 } wcerr = { { 0 } };
12263 /* ?_Ptr_wcerr@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A */
12264 /* ?_Ptr_wcerr@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA */
12265 basic_ostream_wchar *_Ptr_wcerr = &wcerr.obj;
12266
12267 static basic_filebuf_char filebuf_char_log;
12268 /* ?clog@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A */
12269 struct {
12270     basic_ostream_char obj;
12271     basic_ios_char vbase;
12272 } clog = { { 0 } };
12273 /* ?_Ptr_clog@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A */
12274 /* ?_Ptr_clog@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA */
12275 basic_ostream_char *_Ptr_clog = &clog.obj;
12276
12277 static basic_filebuf_wchar filebuf_short_log;
12278 /* ?wclog@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A */
12279 struct {
12280     basic_ostream_wchar obj;
12281     basic_ios_wchar vbase;
12282 } uclog = { { 0 } };
12283 /* ?_Ptr_wclog@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A */
12284 /* ?_Ptr_wclog@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA */
12285 basic_ostream_wchar *_Ptr_uclog = &uclog.obj;
12286
12287 static basic_filebuf_wchar filebuf_wchar_log;
12288 /* ?wclog@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A */
12289 struct {
12290     basic_ostream_wchar obj;
12291     basic_ios_wchar vbase;
12292 } wclog = { { 0 } };
12293 /* ?_Ptr_wclog@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A */
12294 /* ?_Ptr_wclog@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA */
12295 basic_ostream_wchar *_Ptr_wclog = &wclog.obj;
12296
12297 /* ?_Init_cnt@Init@ios_base@std@@0HA */
12298 int ios_base_Init__Init_cnt = -1;
12299
12300 /* ?_Init_ctor@Init@ios_base@std@@CAXPAV123@@Z */
12301 /* ?_Init_ctor@Init@ios_base@std@@CAXPEAV123@@Z */
12302 static void ios_base_Init__Init_ctor(void *this)
12303 {
12304     TRACE("(%p)\n", this);
12305
12306     if(ios_base_Init__Init_cnt < 0)
12307         ios_base_Init__Init_cnt = 1;
12308     else
12309         ios_base_Init__Init_cnt++;
12310 }
12311
12312 /* ??0Init@ios_base@std@@QAE@XZ */
12313 /* ??0Init@ios_base@std@@QEAA@XZ */
12314 DEFINE_THISCALL_WRAPPER(ios_base_Init_ctor, 4)
12315 void* __thiscall ios_base_Init_ctor(void *this)
12316 {
12317     ios_base_Init__Init_ctor(this);
12318     return this;
12319 }
12320
12321 /* ?_Init_dtor@Init@ios_base@std@@CAXPAV123@@Z */
12322 /* ?_Init_dtor@Init@ios_base@std@@CAXPEAV123@@Z */
12323 static void ios_base_Init__Init_dtor(void *this)
12324 {
12325     TRACE("(%p)\n", this);
12326
12327     ios_base_Init__Init_cnt--;
12328     if(!ios_base_Init__Init_cnt) {
12329         basic_ostream_char_flush(&cout.obj);
12330         basic_ostream_char_flush(&cerr.obj);
12331         basic_ostream_char_flush(&clog.obj);
12332     }
12333 }
12334
12335 /* ??1Init@ios_base@std@@QAE@XZ */
12336 /* ??1Init@ios_base@std@@QEAA@XZ */
12337 DEFINE_THISCALL_WRAPPER(ios_base_Init_dtor, 4)
12338 void __thiscall ios_base_Init_dtor(void *this)
12339 {
12340     ios_base_Init__Init_dtor(this);
12341 }
12342
12343 /* ??4Init@ios_base@std@@QAEAAV012@ABV012@@Z */
12344 /* ??4Init@ios_base@std@@QEAAAEAV012@AEBV012@@Z */
12345 DEFINE_THISCALL_WRAPPER(ios_base_Init_op_assign, 8)
12346 void* __thiscall ios_base_Init_op_assign(void *this, void *rhs)
12347 {
12348     TRACE("(%p %p)\n", this, rhs);
12349     return this;
12350 }
12351
12352 /* ?_Init_cnt@_Winit@std@@0HA */
12353 int _Winit__Init_cnt = -1;
12354
12355 /* ??0_Winit@std@@QAE@XZ */
12356 /* ??0_Winit@std@@QEAA@XZ */
12357 DEFINE_THISCALL_WRAPPER(_Winit_ctor, 4)
12358 void* __thiscall _Winit_ctor(void *this)
12359 {
12360     TRACE("(%p)\n", this);
12361
12362     if(_Winit__Init_cnt < 0)
12363         _Winit__Init_cnt = 1;
12364     else
12365         _Winit__Init_cnt++;
12366
12367     return this;
12368 }
12369
12370 /* ??1_Winit@std@@QAE@XZ */
12371 /* ??1_Winit@std@@QAE@XZ */
12372 DEFINE_THISCALL_WRAPPER(_Winit_dtor, 4)
12373 void __thiscall _Winit_dtor(void *this)
12374 {
12375     TRACE("(%p)\n", this);
12376
12377     _Winit__Init_cnt--;
12378     if(!_Winit__Init_cnt) {
12379         basic_ostream_wchar_flush(&wcout.obj);
12380         basic_ostream_wchar_flush(&wcerr.obj);
12381         basic_ostream_wchar_flush(&wclog.obj);
12382     }
12383 }
12384
12385 /* ??4_Winit@std@@QAEAAV01@ABV01@@Z */
12386 /* ??4_Winit@std@@QEAAAEAV01@AEBV01@@Z */
12387 DEFINE_THISCALL_WRAPPER(_Winit_op_assign, 8)
12388 void* __thiscall _Winit_op_assign(void *this, void *rhs)
12389 {
12390     TRACE("(%p %p)\n", this, rhs);
12391     return this;
12392 }
12393
12394 void init_io(void *base)
12395 {
12396 #ifdef __x86_64__
12397     init_iosb_rtti(base);
12398     init_ios_base_rtti(base);
12399     init_basic_ios_char_rtti(base);
12400     init_basic_ios_wchar_rtti(base);
12401     init_basic_ios_short_rtti(base);
12402     init_basic_streambuf_char_rtti(base);
12403     init_basic_streambuf_wchar_rtti(base);
12404     init_basic_streambuf_short_rtti(base);
12405     init_basic_filebuf_char_rtti(base);
12406     init_basic_filebuf_wchar_rtti(base);
12407     init_basic_filebuf_short_rtti(base);
12408     init_basic_stringbuf_char_rtti(base);
12409     init_basic_stringbuf_wchar_rtti(base);
12410     init_basic_stringbuf_short_rtti(base);
12411     init_basic_ostream_char_rtti(base);
12412     init_basic_ostream_wchar_rtti(base);
12413     init_basic_ostream_short_rtti(base);
12414     init_basic_istream_char_rtti(base);
12415     init_basic_istream_wchar_rtti(base);
12416     init_basic_istream_short_rtti(base);
12417     init_basic_iostream_char_rtti(base);
12418     init_basic_iostream_wchar_rtti(base);
12419     init_basic_iostream_short_rtti(base);
12420     init_basic_ofstream_char_rtti(base);
12421     init_basic_ofstream_wchar_rtti(base);
12422     init_basic_ofstream_short_rtti(base);
12423     init_basic_ifstream_char_rtti(base);
12424     init_basic_ifstream_wchar_rtti(base);
12425     init_basic_ifstream_short_rtti(base);
12426     init_basic_fstream_char_rtti(base);
12427     init_basic_fstream_wchar_rtti(base);
12428     init_basic_fstream_short_rtti(base);
12429     init_basic_ostringstream_char_rtti(base);
12430     init_basic_ostringstream_wchar_rtti(base);
12431     init_basic_ostringstream_short_rtti(base);
12432     init_basic_istringstream_char_rtti(base);
12433     init_basic_istringstream_wchar_rtti(base);
12434     init_basic_istringstream_short_rtti(base);
12435     init_basic_stringstream_char_rtti(base);
12436     init_basic_stringstream_wchar_rtti(base);
12437     init_basic_stringstream_short_rtti(base);
12438     init_strstreambuf_rtti(base);
12439     init_strstream_rtti(base);
12440     init_ostrstream_rtti(base);
12441 #endif
12442
12443     basic_filebuf_char_ctor_file(&filebuf_char_stdin, stdin);
12444     basic_istream_char_ctor(&cin.obj, &filebuf_char_stdin.base, FALSE/*FIXME*/, TRUE);
12445
12446     basic_filebuf_short_ctor_file(&filebuf_short_stdin, stdin);
12447     basic_istream_short_ctor(&ucin.obj, &filebuf_short_stdin.base, FALSE/*FIXME*/, TRUE);
12448
12449     basic_filebuf_wchar_ctor_file(&filebuf_wchar_stdin, stdin);
12450     basic_istream_wchar_ctor(&wcin.obj, &filebuf_wchar_stdin.base, FALSE/*FIXME*/, TRUE);
12451
12452     basic_filebuf_char_ctor_file(&filebuf_char_stdout, stdout);
12453     basic_ostream_char_ctor(&cout.obj, &filebuf_char_stdout.base, FALSE/*FIXME*/, TRUE);
12454
12455     basic_filebuf_short_ctor_file(&filebuf_short_stdout, stdout);
12456     basic_ostream_short_ctor(&ucout.obj, &filebuf_short_stdout.base, FALSE/*FIXME*/, TRUE);
12457
12458     basic_filebuf_wchar_ctor_file(&filebuf_wchar_stdout, stdout);
12459     basic_ostream_wchar_ctor(&wcout.obj, &filebuf_wchar_stdout.base, FALSE/*FIXME*/, TRUE);
12460
12461     basic_filebuf_char_ctor_file(&filebuf_char_stderr, stderr);
12462     basic_ostream_char_ctor(&cerr.obj, &filebuf_char_stderr.base, FALSE/*FIXME*/, TRUE);
12463
12464     basic_filebuf_short_ctor_file(&filebuf_short_stderr, stderr);
12465     basic_ostream_short_ctor(&ucerr.obj, &filebuf_short_stderr.base, FALSE/*FIXME*/, TRUE);
12466
12467     basic_filebuf_wchar_ctor_file(&filebuf_wchar_stderr, stderr);
12468     basic_ostream_wchar_ctor(&wcerr.obj, &filebuf_wchar_stderr.base, FALSE/*FIXME*/, TRUE);
12469
12470     basic_filebuf_char_ctor_file(&filebuf_char_log, stderr);
12471     basic_ostream_char_ctor(&clog.obj, &filebuf_char_log.base, FALSE/*FIXME*/, TRUE);
12472
12473     basic_filebuf_short_ctor_file(&filebuf_short_log, stderr);
12474     basic_ostream_short_ctor(&uclog.obj, &filebuf_short_log.base, FALSE/*FIXME*/, TRUE);
12475
12476     basic_filebuf_wchar_ctor_file(&filebuf_wchar_log, stderr);
12477     basic_ostream_wchar_ctor(&wclog.obj, &filebuf_wchar_log.base, FALSE/*FIXME*/, TRUE);
12478 }
12479
12480 void free_io(void)
12481 {
12482     basic_istream_char_vbase_dtor(&cin.obj);
12483     basic_filebuf_char_dtor(&filebuf_char_stdin);
12484
12485     basic_istream_wchar_vbase_dtor(&ucin.obj);
12486     basic_filebuf_wchar_dtor(&filebuf_short_stdin);
12487
12488     basic_istream_wchar_vbase_dtor(&wcin.obj);
12489     basic_filebuf_wchar_dtor(&filebuf_wchar_stdin);
12490
12491     basic_ostream_char_vbase_dtor(&cout.obj);
12492     basic_filebuf_char_dtor(&filebuf_char_stdout);
12493
12494     basic_ostream_wchar_vbase_dtor(&ucout.obj);
12495     basic_filebuf_wchar_dtor(&filebuf_short_stdout);
12496
12497     basic_ostream_wchar_vbase_dtor(&wcout.obj);
12498     basic_filebuf_wchar_dtor(&filebuf_wchar_stdout);
12499
12500     basic_ostream_char_vbase_dtor(&cerr.obj);
12501     basic_filebuf_char_dtor(&filebuf_char_stderr);
12502
12503     basic_ostream_wchar_vbase_dtor(&ucerr.obj);
12504     basic_filebuf_wchar_dtor(&filebuf_short_stderr);
12505
12506     basic_ostream_wchar_vbase_dtor(&wcerr.obj);
12507     basic_filebuf_wchar_dtor(&filebuf_wchar_stderr);
12508
12509     basic_ostream_char_vbase_dtor(&clog.obj);
12510     basic_filebuf_char_dtor(&filebuf_char_log);
12511
12512     basic_ostream_wchar_vbase_dtor(&uclog.obj);
12513     basic_filebuf_wchar_dtor(&filebuf_short_log);
12514
12515     basic_ostream_wchar_vbase_dtor(&wclog.obj);
12516     basic_filebuf_wchar_dtor(&filebuf_wchar_log);
12517 }