From 4455250a98b32f6f87eca76d24f26184ffa30f2c Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Fri, 2 Nov 2012 17:18:20 +0100 Subject: [PATCH] msvcp71: Fixed basic_streambuf vtable. --- dlls/msvcp71/ios.c | 115 +++++++++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 45 deletions(-) diff --git a/dlls/msvcp71/ios.c b/dlls/msvcp71/ios.c index 12e217f5899..043ac64f81a 100644 --- a/dlls/msvcp71/ios.c +++ b/dlls/msvcp71/ios.c @@ -694,7 +694,6 @@ void __asm_dummy_vtables(void) { VTABLE_ADD_FUNC(basic_streambuf_wchar_underflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn) - VTABLE_ADD_FUNC(basic_streambuf_wchar__Xsgetn_s) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn) VTABLE_ADD_FUNC(basic_streambuf_wchar_seekoff) VTABLE_ADD_FUNC(basic_streambuf_wchar_seekpos) @@ -709,7 +708,6 @@ void __asm_dummy_vtables(void) { VTABLE_ADD_FUNC(basic_streambuf_wchar_underflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn) - VTABLE_ADD_FUNC(basic_streambuf_wchar__Xsgetn_s) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn) VTABLE_ADD_FUNC(basic_streambuf_wchar_seekoff) VTABLE_ADD_FUNC(basic_streambuf_wchar_seekpos) @@ -738,7 +736,6 @@ void __asm_dummy_vtables(void) { VTABLE_ADD_FUNC(basic_filebuf_wchar_underflow) VTABLE_ADD_FUNC(basic_filebuf_wchar_uflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn) - VTABLE_ADD_FUNC(basic_streambuf_wchar__Xsgetn_s) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn) VTABLE_ADD_FUNC(basic_filebuf_wchar_seekoff) VTABLE_ADD_FUNC(basic_filebuf_wchar_seekpos) @@ -753,7 +750,6 @@ void __asm_dummy_vtables(void) { VTABLE_ADD_FUNC(basic_filebuf_wchar_underflow) VTABLE_ADD_FUNC(basic_filebuf_wchar_uflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn) - VTABLE_ADD_FUNC(basic_streambuf_wchar__Xsgetn_s) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn) VTABLE_ADD_FUNC(basic_filebuf_wchar_seekoff) VTABLE_ADD_FUNC(basic_filebuf_wchar_seekpos) @@ -782,7 +778,6 @@ void __asm_dummy_vtables(void) { VTABLE_ADD_FUNC(basic_stringbuf_wchar_underflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn) - VTABLE_ADD_FUNC(basic_streambuf_wchar__Xsgetn_s) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn) VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekoff) VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekpos) @@ -797,7 +792,6 @@ void __asm_dummy_vtables(void) { VTABLE_ADD_FUNC(basic_stringbuf_wchar_underflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn) - VTABLE_ADD_FUNC(basic_streambuf_wchar__Xsgetn_s) VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn) VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekoff) VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekpos) @@ -1387,13 +1381,24 @@ int __thiscall basic_streambuf_char_pubsync(basic_streambuf_char *this) return call_basic_streambuf_char_sync(this); } +/* ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPADH@Z */ +/* ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z */ +DEFINE_THISCALL_WRAPPER(basic_streambuf_char_xsgetn, 12) +#define call_basic_streambuf_char_xsgetn(this, ptr, count) CALL_VTBL_FUNC(this, 24, \ + streamsize, (basic_streambuf_char*, char*, streamsize), (this, ptr, count)) +streamsize __thiscall basic_streambuf_char_xsgetn(basic_streambuf_char *this, char *ptr, streamsize count) +{ + TRACE("(%p %p %ld)\n", this, ptr, count); + return basic_streambuf_char__Xsgetn_s(this, ptr, -1, count); +} + /* ?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPADH@Z */ /* ?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z */ DEFINE_THISCALL_WRAPPER(basic_streambuf_char_sgetn, 12) streamsize __thiscall basic_streambuf_char_sgetn(basic_streambuf_char *this, char *ptr, streamsize count) { TRACE("(%p %p %ld)\n", this, ptr, count); - return basic_streambuf_char__Xsgetn_s(this, ptr, -1, count); + return call_basic_streambuf_char_xsgetn(this, ptr, count); } /* ?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ */ @@ -1506,17 +1511,6 @@ int __thiscall basic_streambuf_char_snextc(basic_streambuf_char *this) EOF : basic_streambuf_char_sgetc(this); } -/* ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPADH@Z */ -/* ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z */ -DEFINE_THISCALL_WRAPPER(basic_streambuf_char_xsgetn, 12) -#define call_basic_streambuf_char_xsgetn(this, ptr, count) CALL_VTBL_FUNC(this, 24, \ - streamsize, (basic_streambuf_char*, char*, streamsize), (this, ptr, count)) -streamsize __thiscall basic_streambuf_char_xsgetn(basic_streambuf_char *this, char *ptr, streamsize count) -{ - TRACE("(%p %p %ld)\n", this, ptr, count); - return basic_streambuf_char__Xsgetn_s(this, ptr, -1, count); -} - /* ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPBDH@Z */ /* ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z */ DEFINE_THISCALL_WRAPPER(basic_streambuf_char_xsputn, 12) @@ -1834,10 +1828,7 @@ unsigned short __thiscall basic_streambuf_wchar_uflow(basic_streambuf_wchar *thi /* ?_Xsgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_K_J@Z */ /* ?_Xsgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPAGIH@Z */ /* ?_Xsgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_K_J@Z */ -DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Xsgetn_s, 16) -#define call_basic_streambuf_wchar__Xsgetn_s(this, ptr, size, count) CALL_VTBL_FUNC(this, 28, \ - streamsize, (basic_streambuf_wchar*, wchar_t*, MSVCP_size_t, streamsize), (this, ptr, size, count)) -streamsize __thiscall basic_streambuf_wchar__Xsgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count) +static streamsize basic_streambuf_wchar__Xsgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count) { streamsize copied, chunk; unsigned short c; @@ -1874,7 +1865,7 @@ streamsize __thiscall basic_streambuf_wchar__Xsgetn_s(basic_streambuf_wchar *thi static streamsize basic_streambuf_wchar__Sgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count) { TRACE("(%p %p %lu %ld)\n", this, ptr, size, count); - return call_basic_streambuf_wchar__Xsgetn_s(this, ptr, size, count); + return basic_streambuf_wchar__Xsgetn_s(this, ptr, size, count); } /* ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ */ @@ -1960,7 +1951,7 @@ locale* __thiscall basic_streambuf_wchar_getloc(const basic_streambuf_wchar *thi /* ?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEXABVlocale@2@@Z */ /* ?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAXAEBVlocale@2@@Z */ DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_imbue, 8) -#define call_basic_streambuf_wchar_imbue(this, loc) CALL_VTBL_FUNC(this, 52, \ +#define call_basic_streambuf_wchar_imbue(this, loc) CALL_VTBL_FUNC(this, 48, \ void, (basic_streambuf_wchar*, const locale*), (this, loc)) void __thiscall basic_streambuf_wchar_imbue(basic_streambuf_wchar *this, const locale *loc) { @@ -2046,7 +2037,7 @@ locale* __thiscall basic_streambuf_wchar_pubimbue(basic_streambuf_wchar *this, l /* ?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@JHH@Z */ /* ?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */ DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_seekoff, 20) -#define call_basic_streambuf_wchar_seekoff(this, ret, off, way, mode) CALL_VTBL_FUNC(this, 36, \ +#define call_basic_streambuf_wchar_seekoff(this, ret, off, way, mode) CALL_VTBL_FUNC(this, 32, \ fpos_int*, (basic_streambuf_wchar*, fpos_int*, streamoff, int, int), (this, ret, off, way, mode)) fpos_int* __thiscall basic_streambuf_wchar_seekoff(basic_streambuf_wchar *this, fpos_int *ret, streamoff off, int way, int mode) @@ -2087,7 +2078,7 @@ fpos_int* __thiscall basic_streambuf_wchar_pubseekoff_old(basic_streambuf_wchar /* ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z */ /* ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */ DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_seekpos, 36) -#define call_basic_streambuf_wchar_seekpos(this, ret, pos, mode) CALL_VTBL_FUNC(this, 40, \ +#define call_basic_streambuf_wchar_seekpos(this, ret, pos, mode) CALL_VTBL_FUNC(this, 36, \ fpos_int*, (basic_streambuf_wchar*, fpos_int*, fpos_int, int), (this, ret, pos, mode)) fpos_int* __thiscall basic_streambuf_wchar_seekpos(basic_streambuf_wchar *this, fpos_int *ret, fpos_int pos, int mode) @@ -2128,7 +2119,7 @@ fpos_int* __thiscall basic_streambuf_wchar_pubseekpos_old(basic_streambuf_wchar /* ?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEPAV12@PAGH@Z */ /* ?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAPEAV12@PEAG_J@Z */ DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_setbuf, 12) -#define call_basic_streambuf_wchar_setbuf(this, buf, count) CALL_VTBL_FUNC(this, 44, \ +#define call_basic_streambuf_wchar_setbuf(this, buf, count) CALL_VTBL_FUNC(this, 40, \ basic_streambuf_wchar*, (basic_streambuf_wchar*, wchar_t*, streamsize), (this, buf, count)) basic_streambuf_wchar* __thiscall basic_streambuf_wchar_setbuf(basic_streambuf_wchar *this, wchar_t *buf, streamsize count) { @@ -2152,7 +2143,7 @@ basic_streambuf_wchar* __thiscall basic_streambuf_wchar_pubsetbuf(basic_streambu /* ?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHXZ */ /* ?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAHXZ */ DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sync, 4) -#define call_basic_streambuf_wchar_sync(this) CALL_VTBL_FUNC(this, 48, \ +#define call_basic_streambuf_wchar_sync(this) CALL_VTBL_FUNC(this, 44, \ int, (basic_streambuf_wchar*), (this)) int __thiscall basic_streambuf_wchar_sync(basic_streambuf_wchar *this) { @@ -2171,6 +2162,19 @@ int __thiscall basic_streambuf_wchar_pubsync(basic_streambuf_wchar *this) return call_basic_streambuf_wchar_sync(this); } +/* ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHPA_WH@Z */ +/* ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_J@Z */ +/* ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPAGH@Z */ +/* ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_J@Z */ +DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_xsgetn, 12) +#define call_basic_streambuf_wchar_xsgetn(this, ptr, count) CALL_VTBL_FUNC(this, 24, \ + streamsize, (basic_streambuf_wchar*, wchar_t*, streamsize), (this, ptr, count)) +streamsize __thiscall basic_streambuf_wchar_xsgetn(basic_streambuf_wchar *this, wchar_t *ptr, streamsize count) +{ + TRACE("(%p %p %ld)\n", this, ptr, count); + return call_basic_streambuf_wchar_xsgetn(this, ptr, count); +} + /* ?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHPA_WH@Z */ /* ?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z */ /* ?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHPAGH@Z */ @@ -2179,7 +2183,7 @@ DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_sgetn, 12) streamsize __thiscall basic_streambuf_wchar_sgetn(basic_streambuf_wchar *this, wchar_t *ptr, streamsize count) { TRACE("(%p %p %ld)\n", this, ptr, count); - return call_basic_streambuf_wchar__Xsgetn_s(this, ptr, -1, count); + return call_basic_streambuf_wchar_xsgetn(this, ptr, count); } /* ?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHXZ */ @@ -2310,25 +2314,12 @@ unsigned short __thiscall basic_streambuf_wchar_snextc(basic_streambuf_wchar *th WEOF : basic_streambuf_wchar_sgetc(this); } -/* ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHPA_WH@Z */ -/* ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_J@Z */ -/* ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPAGH@Z */ -/* ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_J@Z */ -DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_xsgetn, 12) -#define call_basic_streambuf_wchar_xsgetn(this, ptr, count) CALL_VTBL_FUNC(this, 24, \ - streamsize, (basic_streambuf_wchar*, wchar_t*, streamsize), (this, ptr, count)) -streamsize __thiscall basic_streambuf_wchar_xsgetn(basic_streambuf_wchar *this, wchar_t *ptr, streamsize count) -{ - TRACE("(%p %p %ld)\n", this, ptr, count); - return call_basic_streambuf_wchar__Xsgetn_s(this, ptr, -1, count); -} - /* ?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHPB_WH@Z */ /* ?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEB_W_J@Z */ /* ?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPBGH@Z */ /* ?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEBG_J@Z */ DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar_xsputn, 12) -#define call_basic_streambuf_wchar_xsputn(this, ptr, count) CALL_VTBL_FUNC(this, 32, \ +#define call_basic_streambuf_wchar_xsputn(this, ptr, count) CALL_VTBL_FUNC(this, 28, \ streamsize, (basic_streambuf_wchar*, const wchar_t*, streamsize), (this, ptr, count)) streamsize __thiscall basic_streambuf_wchar_xsputn(basic_streambuf_wchar *this, const wchar_t *ptr, streamsize count) { @@ -7583,7 +7574,24 @@ static basic_istream_char* basic_istream_char__Read_s(basic_istream_char *this, DEFINE_THISCALL_WRAPPER(basic_istream_char_read, 12) basic_istream_char* __thiscall basic_istream_char_read(basic_istream_char *this, char *str, streamsize count) { - return basic_istream_char__Read_s(this, str, count, count); + basic_ios_char *base = basic_istream_char_get_basic_ios(this); + IOSB_iostate state = IOSTATE_goodbit; + + TRACE("(%p %p %ld)\n", this, str, count); + + if(basic_istream_char_sentry_create(this, TRUE)) { + basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base); + + this->count = basic_streambuf_char_sgetn(strbuf, str, count); + if(this->count != count) + state |= IOSTATE_failbit | IOSTATE_eofbit; + }else { + this->count = 0; + } + basic_istream_char_sentry_destroy(this); + + basic_ios_char_setstate(base, state); + return this; } /* ?_Readsome_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHPADIH@Z */ @@ -8847,7 +8855,24 @@ static basic_istream_wchar* basic_istream_wchar__Read_s(basic_istream_wchar *thi DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read, 12) basic_istream_wchar* __thiscall basic_istream_wchar_read(basic_istream_wchar *this, wchar_t *str, streamsize count) { - return basic_istream_wchar__Read_s(this, str, count, count); + basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this); + IOSB_iostate state = IOSTATE_goodbit; + + TRACE("(%p %p %ld)\n", this, str, count); + + if(basic_istream_wchar_sentry_create(this, TRUE)) { + basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base); + + this->count = basic_streambuf_wchar_sgetn(strbuf, str, count); + if(this->count != count) + state |= IOSTATE_failbit | IOSTATE_eofbit; + }else { + this->count = 0; + } + basic_istream_wchar_sentry_destroy(this); + + basic_ios_wchar_setstate(base, state); + return this; } /* ?_Readsome_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHPA_WIH@Z */