---
dlls/msvcirt/msvcirt.c | 157 ++++++++++++++
dlls/msvcirt/msvcirt.spec | 52 ++---
dlls/msvcirt/tests/msvcirt.c | 397 ++++++++++++++++++++++++++++++++++-
dlls/msvcrt20/msvcrt20.spec | 52 ++---
dlls/msvcrt40/msvcrt40.spec | 52 ++---
5 files changed, 625 insertions(+), 85 deletions(-)
diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index a8f162e7f702..4d0dc1521f68 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -4811,6 +4811,66 @@ stdiobuf* __thiscall stdiostream_rdbuf(const iostream *this)
return (stdiobuf*) istream_get_ios(&this->base1)->sb;
}
+/* ??0fstream@@QAE@ABV0@@Z */
+/* ??0fstream@@QEAA@AEBV0@@Z */
+DEFINE_THISCALL_WRAPPER(fstream_copy_ctor, 12)
+iostream* __thiscall fstream_copy_ctor(iostream *this, const iostream *copy, BOOL virt_init)
+{
+ TRACE("(%p %p %d)\n", this, copy, virt_init);
+ iostream_internal_copy_ctor(this, copy, &MSVCP_fstream_vtable, virt_init);
+ return this;
+}
+
+/* ??0fstream@@QAE@HPADH@Z */
+/* ??0fstream@@QEAA@HPEADH@Z */
+DEFINE_THISCALL_WRAPPER(fstream_buffer_ctor, 20)
+iostream* __thiscall fstream_buffer_ctor(iostream *this, filedesc fd, char *buffer, int length, BOOL virt_init)
+{
+ ios *base;
+ filebuf *fb = MSVCRT_operator_new(sizeof(filebuf));
+
+ TRACE("(%p %d %p %d %d)\n", this, fd, buffer, length, virt_init);
+
+ if (!fb) {
+ FIXME("out of memory\n");
+ return NULL;
+ }
+
+ filebuf_fd_reserve_ctor(fb, fd, buffer, length);
+
+ iostream_internal_sb_ctor(this, &fb->base, &MSVCP_fstream_vtable, virt_init);
+
+ base = istream_get_ios(&this->base1);
+ base->delbuf = 1;
+
+ return this;
+}
+
+/* ??0fstream@@QAE@H@Z */
+/* ??0fstream@@QEAA@H@Z */
+DEFINE_THISCALL_WRAPPER(fstream_fd_ctor, 12)
+iostream* __thiscall fstream_fd_ctor(iostream *this, filedesc fd, BOOL virt_init)
+{
+ ios *base;
+ filebuf *fb = MSVCRT_operator_new(sizeof(filebuf));
+
+ TRACE("(%p %d %d)\n", this, fd, virt_init);
+
+ if (!fb) {
+ FIXME("out of memory\n");
+ return NULL;
+ }
+
+ filebuf_fd_ctor(fb, fd);
+
+ iostream_internal_sb_ctor(this, &fb->base, &MSVCP_fstream_vtable, virt_init);
+
+ base = istream_get_ios(&this->base1);
+ base->delbuf = 1;
+
+ return this;
+}
+
/* ??0fstream@@QAE@PBDHH@Z */
/* ??0fstream@@QEAA@PEBDHH@Z */
DEFINE_THISCALL_WRAPPER(fstream_open_ctor, 20)
@@ -4838,6 +4898,103 @@ iostream* __thiscall fstream_open_ctor(iostream *this, const char *name, ios_ope
return this;
}
+/* ??0fstream@@QAE@XZ */
+/* ??0fstream@@QEAA@XZ */
+DEFINE_THISCALL_WRAPPER(fstream_ctor, 8)
+iostream* __thiscall fstream_ctor(iostream *this, BOOL virt_init)
+{
+ return fstream_fd_ctor(this, -1, virt_init);
+}
+
+/* ?rdbuf@fstream@@QBEPAVfilebuf@@XZ */
+/* ?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ */
+DEFINE_THISCALL_WRAPPER(fstream_rdbuf, 4)
+filebuf* __thiscall fstream_rdbuf(const iostream *this)
+{
+ TRACE("(%p)\n", this);
+ return (filebuf*) istream_get_ios(&this->base1)->sb;
+}
+
+/* ?fd@fstream@@QBEHXZ */
+/* ?fd@fstream@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(fstream_fd, 4)
+filedesc __thiscall fstream_fd(iostream *this)
+{
+ TRACE("(%p)\n", this);
+ return filebuf_fd(fstream_rdbuf(this));
+}
+
+/* ?attach@fstream@@QAEXH@Z */
+/* ?attach@fstream@@QEAAXH@Z */
+DEFINE_THISCALL_WRAPPER(fstream_attach, 8)
+void __thiscall fstream_attach(iostream *this, filedesc fd)
+{
+ ios *base = istream_get_ios(&this->base1);
+ TRACE("(%p %d)\n", this, fd);
+ if (filebuf_attach(fstream_rdbuf(this), fd) == NULL)
+ ios_clear(base, base->state | IOSTATE_failbit);
+}
+
+/* ?close@fstream@@QAEXXZ */
+/* ?close@fstream@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(fstream_close, 4)
+void __thiscall fstream_close(iostream *this)
+{
+ ios *base = istream_get_ios(&this->base1);
+ TRACE("(%p)\n", this);
+ if (filebuf_close(fstream_rdbuf(this)) == NULL)
+ ios_clear(base, base->state | IOSTATE_failbit);
+ else
+ ios_clear(base, IOSTATE_goodbit);
+}
+
+/* ?is_open@fstream@@QBEHXZ */
+/* ?is_open@fstream@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(fstream_is_open, 4)
+int __thiscall fstream_is_open(const iostream *this)
+{
+ TRACE("(%p)\n", this);
+ return filebuf_is_open(fstream_rdbuf(this));
+}
+
+/* ?open@fstream@@QAEXPBDHH@Z */
+/* ?open@fstream@@QEAAXPEBDHH@Z */
+DEFINE_THISCALL_WRAPPER(fstream_open, 16)
+void __thiscall fstream_open(iostream *this, const char *name, ios_open_mode mode, int protection)
+{
+ ios *base = istream_get_ios(&this->base1);
+ TRACE("(%p %s %d %d)\n", this, name, mode, protection);
+ if (filebuf_open(fstream_rdbuf(this), name, mode|OPENMODE_out, protection) == NULL)
+ ios_clear(base, base->state | IOSTATE_failbit);
+}
+
+/* ?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z */
+/* ?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z */
+DEFINE_THISCALL_WRAPPER(fstream_setbuf, 12)
+streambuf* __thiscall fstream_setbuf(iostream *this, char *buffer, int length)
+{
+ ios *base = istream_get_ios(&this->base1);
+ filebuf* fb = fstream_rdbuf(this);
+
+ TRACE("(%p %p %d)\n", this, buffer, length);
+
+ if (filebuf_is_open(fb)) {
+ ios_clear(base, base->state | IOSTATE_failbit);
+ return NULL;
+ }
+
+ return filebuf_setbuf(fb, buffer, length);
+}
+
+/* ?setmode@fstream@@QAEHH@Z */
+/* ?setmode@fstream@@QEAAHH@Z */
+DEFINE_THISCALL_WRAPPER(fstream_setmode, 8)
+int __thiscall fstream_setmode(iostream *this, int mode)
+{
+ TRACE("(%p %d)\n", this, mode);
+ return filebuf_setmode(fstream_rdbuf(this), mode);
+}
+
/* ??0Iostream_init@@QAE@AAVios@@H@Z */
/* ??0Iostream_init@@QEAA@AEAVios@@H@Z */
DEFINE_THISCALL_WRAPPER(Iostream_init_ios_ctor, 12)
diff --git a/dlls/msvcirt/msvcirt.spec b/dlls/msvcirt/msvcirt.spec
index 804300f1a3ea..3d943e8a5c45 100644
--- a/dlls/msvcirt/msvcirt.spec
+++ b/dlls/msvcirt/msvcirt.spec
@@ -16,16 +16,16 @@
@ cdecl -arch=win64 ??0filebuf@@QEAA@HPEADH@Z(ptr long ptr long) filebuf_fd_reserve_ctor
@ thiscall -arch=win32 ??0filebuf@@QAE@XZ(ptr) filebuf_ctor
@ cdecl -arch=win64 ??0filebuf@@QEAA@XZ(ptr) filebuf_ctor
-@ stub -arch=win32 ??0fstream@@QAE@ABV0@@Z # __thiscall fstream::fstream(class fstream const &)
-@ stub -arch=win64 ??0fstream@@QEAA@AEBV0@@Z
-@ stub -arch=win32 ??0fstream@@QAE@H@Z # __thiscall fstream::fstream(int)
-@ stub -arch=win64 ??0fstream@@QEAA@H@Z
-@ stub -arch=win32 ??0fstream@@QAE@HPADH@Z # __thiscall fstream::fstream(int,char *,int)
-@ stub -arch=win64 ??0fstream@@QEAA@HPEADH@Z
+@ thiscall -arch=win32 ??0fstream@@QAE@ABV0@@Z(ptr ptr long) fstream_copy_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA@AEBV0@@Z(ptr ptr long) fstream_copy_ctor
+@ thiscall -arch=win32 ??0fstream@@QAE@H@Z(ptr long long) fstream_fd_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA@H@Z(ptr long long) fstream_fd_ctor
+@ thiscall -arch=win32 ??0fstream@@QAE@HPADH@Z(ptr long ptr long long) fstream_buffer_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA@HPEADH@Z(ptr long ptr long long) fstream_buffer_ctor
@ thiscall -arch=win32 ??0fstream@@QAE@PBDHH@Z(ptr str long long long) fstream_open_ctor
@ cdecl -arch=win64 ??0fstream@@QEAA@PEBDHH@Z(ptr str long long long) fstream_open_ctor
-@ stub -arch=win32 ??0fstream@@QAE@XZ # __thiscall fstream::fstream(void)
-@ stub -arch=win64 ??0fstream@@QEAA@XZ
+@ thiscall -arch=win32 ??0fstream@@QAE@XZ(ptr long) fstream_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA@XZ(ptr long) fstream_ctor
@ thiscall -arch=win32 ??0ifstream@@QAE@ABV0@@Z(ptr ptr long) ifstream_copy_ctor
@ cdecl -arch=win64 ??0ifstream@@QEAA@AEBV0@@Z(ptr ptr long) ifstream_copy_ctor
@ thiscall -arch=win32 ??0ifstream@@QAE@H@Z(ptr long long) ifstream_fd_ctor
@@ -176,8 +176,8 @@
@ cdecl -arch=win64 ??4exception@@QEAAAEAV0@AEBV0@@Z(ptr ptr) MSVCP_exception_assign
@ thiscall -arch=win32 ??4filebuf@@QAEAAV0@ABV0@@Z(ptr ptr) filebuf_assign
@ cdecl -arch=win64 ??4filebuf@@QEAAAEAV0@AEBV0@@Z(ptr ptr) filebuf_assign
-@ stub -arch=win32 ??4fstream@@QAEAAV0@AAV0@@Z # class fstream & __thiscall fstream::operator=(class fstream &)
-@ stub -arch=win64 ??4fstream@@QEAAAEAV0@AEAV0@@Z
+@ thiscall -arch=win32 ??4fstream@@QAEAAV0@AAV0@@Z(ptr ptr) iostream_assign
+@ cdecl -arch=win64 ??4fstream@@QEAAAEAV0@AEAV0@@Z(ptr ptr) iostream_assign
@ thiscall -arch=win32 ??4ifstream@@QAEAAV0@ABV0@@Z(ptr ptr) istream_assign
@ cdecl -arch=win64 ??4ifstream@@QEAAAEAV0@AEBV0@@Z(ptr ptr) istream_assign
@ thiscall -arch=win32 ??4ios@@IAEAAV0@ABV0@@Z(ptr ptr) ios_assign
@@ -404,8 +404,8 @@
@ cdecl -arch=win64 ?allocate@streambuf@@IEAAHXZ(ptr) streambuf_allocate
@ thiscall -arch=win32 ?attach@filebuf@@QAEPAV1@H@Z(ptr long) filebuf_attach
@ cdecl -arch=win64 ?attach@filebuf@@QEAAPEAV1@H@Z(ptr long) filebuf_attach
-@ stub -arch=win32 ?attach@fstream@@QAEXH@Z # void __thiscall fstream::attach(int)
-@ stub -arch=win64 ?attach@fstream@@QEAAXH@Z
+@ thiscall -arch=win32 ?attach@fstream@@QAEXH@Z(ptr long) fstream_attach
+@ cdecl -arch=win64 ?attach@fstream@@QEAAXH@Z(ptr long) fstream_attach
@ thiscall -arch=win32 ?attach@ifstream@@QAEXH@Z(ptr long) ifstream_attach
@ cdecl -arch=win64 ?attach@ifstream@@QEAAXH@Z(ptr long) ifstream_attach
@ thiscall -arch=win32 ?attach@ofstream@@QAEXH@Z(ptr long) ofstream_attach
@@ -426,8 +426,8 @@
@ extern ?clog@@3Vostream_withassign@@A MSVCP_clog
@ thiscall -arch=win32 ?close@filebuf@@QAEPAV1@XZ(ptr) filebuf_close
@ cdecl -arch=win64 ?close@filebuf@@QEAAPEAV1@XZ(ptr) filebuf_close
-@ stub -arch=win32 ?close@fstream@@QAEXXZ # void __thiscall fstream::close(void)
-@ stub -arch=win64 ?close@fstream@@QEAAXXZ
+@ thiscall -arch=win32 ?close@fstream@@QAEXXZ(ptr) fstream_close
+@ cdecl -arch=win64 ?close@fstream@@QEAAXXZ(ptr) fstream_close
@ thiscall -arch=win32 ?close@ifstream@@QAEXXZ(ptr) ifstream_close
@ cdecl -arch=win64 ?close@ifstream@@QEAAXXZ(ptr) ifstream_close
@ thiscall -arch=win32 ?close@ofstream@@QAEXXZ(ptr) ofstream_close
@@ -470,8 +470,8 @@
@ cdecl -arch=win64 ?fail@ios@@QEBAHXZ(ptr) ios_fail
@ thiscall -arch=win32 ?fd@filebuf@@QBEHXZ(ptr) filebuf_fd
@ cdecl -arch=win64 ?fd@filebuf@@QEBAHXZ(ptr) filebuf_fd
-@ stub -arch=win32 ?fd@fstream@@QBEHXZ # int __thiscall fstream::fd(void)const
-@ stub -arch=win64 ?fd@fstream@@QEBAHXZ
+@ thiscall -arch=win32 ?fd@fstream@@QBEHXZ(ptr) fstream_fd
+@ cdecl -arch=win64 ?fd@fstream@@QEBAHXZ(ptr) fstream_fd
@ thiscall -arch=win32 ?fd@ifstream@@QBEHXZ(ptr) ifstream_fd
@ cdecl -arch=win64 ?fd@ifstream@@QEBAHXZ(ptr) ifstream_fd
@ thiscall -arch=win32 ?fd@ofstream@@QBEHXZ(ptr) ofstream_fd
@@ -539,8 +539,8 @@
@ cdecl -arch=win64 ?ipfx@istream@@QEAAHH@Z(ptr long) istream_ipfx
@ thiscall -arch=win32 ?is_open@filebuf@@QBEHXZ(ptr) filebuf_is_open
@ cdecl -arch=win64 ?is_open@filebuf@@QEBAHXZ(ptr) filebuf_is_open
-@ stub -arch=win32 ?is_open@fstream@@QBEHXZ # int __thiscall fstream::is_open(void)const
-@ stub -arch=win64 ?is_open@fstream@@QEBAHXZ
+@ thiscall -arch=win32 ?is_open@fstream@@QBEHXZ(ptr) fstream_is_open
+@ cdecl -arch=win64 ?is_open@fstream@@QEBAHXZ(ptr) fstream_is_open
@ thiscall -arch=win32 ?is_open@ifstream@@QBEHXZ(ptr) ifstream_is_open
@ cdecl -arch=win64 ?is_open@ifstream@@QEBAHXZ(ptr) ifstream_is_open
@ thiscall -arch=win32 ?is_open@ofstream@@QBEHXZ(ptr) ofstream_is_open
@@ -564,8 +564,8 @@
@ cdecl -arch=win64 ?oct@@YAAEAVios@@AEAV1@@Z(ptr) ios_oct
@ thiscall -arch=win32 ?open@filebuf@@QAEPAV1@PBDHH@Z(ptr str long long) filebuf_open
@ cdecl -arch=win64 ?open@filebuf@@QEAAPEAV1@PEBDHH@Z(ptr str long long) filebuf_open
-@ stub -arch=win32 ?open@fstream@@QAEXPBDHH@Z # void __thiscall fstream::open(char const *,int,int)
-@ stub -arch=win64 ?open@fstream@@QEAAXPEBDHH@Z
+@ thiscall -arch=win32 ?open@fstream@@QAEXPBDHH@Z(ptr str long long) fstream_open
+@ cdecl -arch=win64 ?open@fstream@@QEAAXPEBDHH@Z(ptr str long long) fstream_open
@ thiscall -arch=win32 ?open@ifstream@@QAEXPBDHH@Z(ptr str long long) ifstream_open
@ cdecl -arch=win64 ?open@ifstream@@QEAAXPEBDHH@Z(ptr str long long) ifstream_open
@ thiscall -arch=win32 ?open@ofstream@@QAEXPBDHH@Z(ptr str long long) ofstream_open
@@ -613,8 +613,8 @@
@ cdecl -arch=win64 ?putback@istream@@QEAAAEAV1@D@Z(ptr long) istream_putback
@ thiscall -arch=win32 ?pword@ios@@QBEAAPAXH@Z(ptr long) ios_pword
@ cdecl -arch=win64 ?pword@ios@@QEBAAEAPEAXH@Z(ptr long) ios_pword
-@ stub -arch=win32 ?rdbuf@fstream@@QBEPAVfilebuf@@XZ # class filebuf * __thiscall fstream::rdbuf(void)const
-@ stub -arch=win64 ?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ
+@ thiscall -arch=win32 ?rdbuf@fstream@@QBEPAVfilebuf@@XZ(ptr) fstream_rdbuf
+@ cdecl -arch=win64 ?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ(ptr) fstream_rdbuf
@ thiscall -arch=win32 ?rdbuf@ifstream@@QBEPAVfilebuf@@XZ(ptr) ifstream_rdbuf
@ cdecl -arch=win64 ?rdbuf@ifstream@@QEBAPEAVfilebuf@@XZ(ptr) ifstream_rdbuf
@ thiscall -arch=win32 ?rdbuf@ios@@QBEPAVstreambuf@@XZ(ptr) ios_rdbuf
@@ -661,8 +661,8 @@
@ cdecl -arch=win64 ?setb@streambuf@@IEAAXPEAD0H@Z(ptr ptr ptr long) streambuf_setb
@ thiscall -arch=win32 ?setbuf@filebuf@@UAEPAVstreambuf@@PADH@Z(ptr ptr long) filebuf_setbuf
@ cdecl -arch=win64 ?setbuf@filebuf@@UEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) filebuf_setbuf
-@ stub -arch=win32 ?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z # class streambuf * __thiscall fstream::setbuf(char *,int)
-@ stub -arch=win64 ?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z
+@ thiscall -arch=win32 ?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) fstream_setbuf
+@ cdecl -arch=win64 ?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) fstream_setbuf
@ thiscall -arch=win32 ?setbuf@ifstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) ifstream_setbuf
@ cdecl -arch=win64 ?setbuf@ifstream@@QEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) ifstream_setbuf
@ thiscall -arch=win32 ?setbuf@ofstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) ofstream_setbuf
@@ -683,8 +683,8 @@
@ cdecl -arch=win64 ?setlock@streambuf@@QEAAXXZ(ptr) streambuf_setlock
@ thiscall -arch=win32 ?setmode@filebuf@@QAEHH@Z(ptr long) filebuf_setmode
@ cdecl -arch=win64 ?setmode@filebuf@@QEAAHH@Z(ptr long) filebuf_setmode
-@ stub -arch=win32 ?setmode@fstream@@QAEHH@Z # int __thiscall fstream::setmode(int)
-@ stub -arch=win64 ?setmode@fstream@@QEAAHH@Z
+@ thiscall -arch=win32 ?setmode@fstream@@QAEHH@Z(ptr long) fstream_setmode
+@ cdecl -arch=win64 ?setmode@fstream@@QEAAHH@Z(ptr long) fstream_setmode
@ thiscall -arch=win32 ?setmode@ifstream@@QAEHH@Z(ptr long) ifstream_setmode
@ cdecl -arch=win64 ?setmode@ifstream@@QEAAHH@Z(ptr long) ifstream_setmode
@ thiscall -arch=win32 ?setmode@ofstream@@QAEHH@Z(ptr long) ofstream_setmode
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index 8ee880480a04..21d513c0fd90 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -455,9 +455,21 @@ static void (*__thiscall p_stdiostream_vbase_dtor)(iostream*);
static iostream* (*__thiscall p_stdiostream_assign)(iostream*, const iostream*);
/* fstream */
-static iostream* (*__thiscall p_fstream_open_ctor)(iostream*, const char*, ios_open_mode, int, BOOL);
+static iostream* (*__thiscall p_fstream_copy_ctor)(iostream*, const iostream*, BOOL);
+static iostream* (*__thiscall p_fstream_buffer_ctor)(iostream*, filedesc, char*, int, BOOL);
+static iostream* (*__thiscall p_fstream_fd_ctor)(iostream*, filedesc fd, BOOL virt_init);
+static iostream* (*__thiscall p_fstream_open_ctor)(iostream*, const char *name, ios_open_mode, int, BOOL);
+static iostream* (*__thiscall p_fstream_ctor)(iostream*, BOOL);
static void (*__thiscall p_fstream_dtor)(ios*);
static void (*__thiscall p_fstream_vbase_dtor)(iostream*);
+static void (*__thiscall p_fstream_attach)(iostream*, filedesc);
+static void (*__thiscall p_fstream_close)(iostream*);
+static filedesc (*__thiscall p_fstream_fd)(iostream*);
+static int (*__thiscall p_fstream_is_open)(const iostream*);
+static void (*__thiscall p_fstream_open)(iostream*, const char*, ios_open_mode, int);
+static filebuf* (*__thiscall p_fstream_rdbuf)(const iostream*);
+static streambuf* (*__thiscall p_fstream_setbuf)(iostream*, char*, int);
+static int (*__thiscall p_fstream_setmode)(iostream*, int);
/* Iostream_init */
static void* (*__thiscall p_Iostream_init_ios_ctor)(void*, ios*, int);
@@ -794,9 +806,21 @@ static BOOL init(void)
SET(p_stdiostream_vbase_dtor, "??_Dstdiostream@@QEAAXXZ");
SET(p_stdiostream_assign, "??4stdiostream@@QEAAAEAV0@AEAV0@@Z");
+ SET(p_fstream_copy_ctor, "??0fstream@@QEAA@AEBV0@@Z");
+ SET(p_fstream_buffer_ctor, "??0fstream@@QEAA@HPEADH@Z");
+ SET(p_fstream_fd_ctor, "??0fstream@@QEAA@H@Z");
SET(p_fstream_open_ctor, "??0fstream@@QEAA@PEBDHH@Z");
+ SET(p_fstream_ctor, "??0fstream@@QEAA@XZ");
SET(p_fstream_dtor, "??1fstream@@UEAA@XZ");
SET(p_fstream_vbase_dtor, "??_Dfstream@@QEAAXXZ");
+ SET(p_fstream_attach, "?attach@fstream@@QEAAXH@Z");
+ SET(p_fstream_close, "?close@fstream@@QEAAXXZ");
+ SET(p_fstream_fd, "?fd@fstream@@QEBAHXZ");
+ SET(p_fstream_is_open, "?is_open@fstream@@QEBAHXZ");
+ SET(p_fstream_open, "?open@fstream@@QEAAXPEBDHH@Z");
+ SET(p_fstream_rdbuf, "?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ");
+ SET(p_fstream_setbuf, "?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z");
+ SET(p_fstream_setmode, "?setmode@fstream@@QEAAHH@Z");
SET(p_Iostream_init_ios_ctor, "??0Iostream_init@@QEAA@AEAVios@@H@Z");
@@ -1045,9 +1069,21 @@ static BOOL init(void)
SET(p_stdiostream_vbase_dtor, "??_Dstdiostream@@QAEXXZ");
SET(p_stdiostream_assign, "??4stdiostream@@QAEAAV0@AAV0@@Z");
+ SET(p_fstream_copy_ctor, "??0fstream@@QAE@ABV0@@Z");
+ SET(p_fstream_fd_ctor, "??0fstream@@QAE@H@Z");
+ SET(p_fstream_buffer_ctor, "??0fstream@@QAE@HPADH@Z");
SET(p_fstream_open_ctor, "??0fstream@@QAE@PBDHH@Z");
+ SET(p_fstream_ctor, "??0fstream@@QAE@XZ");
SET(p_fstream_dtor, "??1fstream@@UAE@XZ");
SET(p_fstream_vbase_dtor, "??_Dfstream@@QAEXXZ");
+ SET(p_fstream_attach, "?attach@fstream@@QAEXH@Z");
+ SET(p_fstream_close, "?close@fstream@@QAEXXZ");
+ SET(p_fstream_fd, "?fd@fstream@@QBEHXZ");
+ SET(p_fstream_is_open, "?is_open@fstream@@QBEHXZ");
+ SET(p_fstream_open, "?open@fstream@@QAEXPBDHH@Z");
+ SET(p_fstream_rdbuf, "?rdbuf@fstream@@QBEPAVfilebuf@@XZ");
+ SET(p_fstream_setbuf, "?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z");
+ SET(p_fstream_setmode, "?setmode@fstream@@QAEHH@Z");
SET(p_Iostream_init_ios_ctor, "??0Iostream_init@@QAE@AAVios@@H@Z");
@@ -4651,7 +4687,7 @@ static void test_ofstream(void)
call_func5(p_ofstream_buffer_ctor, &ofs, -1, NULL, 0, TRUE);
ok(ofs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", ofs.base_ios.sb->base);
ok(ofs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", ofs.base_ios.sb->ebuf);
- ok(ofs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", pfb->base.unbuffered);
+ ok(ofs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", ofs.base_ios.sb->unbuffered);
ok(ofs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", ofs.base_ios.sb->allocated);
psb = call_func3(p_ofstream_setbuf, &ofs, buffer, ARRAY_SIZE(buffer));
@@ -8341,21 +8377,368 @@ static void test_std_streams(void)
static void test_fstream(void)
{
- iostream fs, *pfs;
+ const char *filename = "fstream_test";
+ iostream fs, fs_copy, *pfs;
+ char buffer[64];
+ streambuf *psb;
filebuf *pfb;
ostream *pos;
istream *pis;
- int i;
char st[8];
- const char *filename = "fstream_test";
+ int i, ret, fd;
+
+ memset(&fs, 0xab, sizeof(iostream));
+
+ /* constructors/destructors */
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base1.extract_delim == 0, "expected 0 got %d\n", fs.base1.extract_delim);
+ ok(fs.base1.count == 0, "expected 0 got %d\n", fs.base1.count);
+ ok(fs.base2.unknown == 0, "expected 0 got %d\n", fs.base2.unknown);
+ ok(fs.base_ios.sb != NULL, "expected not %p got %p\n", NULL, fs.base_ios.sb);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.tie == NULL, "expected %p got %p\n", NULL, fs.base_ios.tie);
+ ok(fs.base_ios.flags == FLAGS_skipws, "expected %x got %x\n", FLAGS_skipws, fs.base_ios.flags);
+ ok(fs.base_ios.precision == 6, "expected 6 got %d\n", fs.base_ios.precision);
+ ok(fs.base_ios.fill == ' ', "expected 32 got %d\n", fs.base_ios.fill);
+ ok(fs.base_ios.width == 0, "expected 0 got %d\n", fs.base_ios.width);
+ ok(fs.base_ios.do_lock == -1, "expected -1 got %d\n", fs.base_ios.do_lock);
+ ok(pfb->fd == -1, "wrong fd, expected -1 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf == NULL, "wrong ebuf, expected %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd == -1, "wrong fd, expected 0 got %d\n", pfb->fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func3(p_fstream_fd_ctor, &fs, 42, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf == NULL, "wrong ebuf, expected %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd == 42, "wrong fd, expected 42 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+
+ pfs = call_func3(p_fstream_copy_ctor, &fs_copy, &fs, TRUE);
+ pfb = (filebuf*) fs_copy.base_ios.sb;
+ ok(pfs == &fs_copy, "wrong return, expected %p got %p\n", &fs_copy, pfs);
+ ok(fs_copy.base_ios.sb == fs.base_ios.sb, "expected shared streambuf\n");
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fs_copy.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs_copy.base_ios.state);
+
+ call_func1(p_fstream_vbase_dtor, &fs_copy);
+ call_func1(p_fstream_dtor, &fs.base_ios);
+
+ pfs = call_func5(p_fstream_buffer_ctor, &fs, 53, buffer, ARRAY_SIZE(buffer), TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, pfb->base.base);
+ ok(pfb->base.ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), pfb->base.ebuf);
+ ok(pfb->fd == 53, "wrong fd, expected 53 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+ call_func1(p_fstream_dtor, &fs.base_ios);
+
+ pfs = call_func5(p_fstream_buffer_ctor, &fs, 64, NULL, 0, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf == NULL, "wrong ebuf, expected %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd == 64, "wrong fd, expected 64 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(pfb->base.allocated == 1, "wrong allocate value, expected 1 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base != NULL, "wrong buffer, expected not %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf != NULL, "wrong ebuf, expected not %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd != -1, "wrong fd, expected not -1 got %d\n", pfb->fd);
+ fd = pfb->fd;
+ ok(pfb->close == 1, "wrong value, expected 1 got %d\n", pfb->close);
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_close(fd) == -1, "expected fstream to close opened file\n");
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(pfb->base.allocated == 1, "wrong allocate value, expected 1 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base != NULL, "wrong buffer, expected not %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf != NULL, "wrong ebuf, expected not %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd != -1, "wrong fd, expected not -1 got %d\n", pfb->fd);
+ fd = pfb->fd;
+ ok(pfb->close == 1, "wrong value, expected 1 got %d\n", pfb->close);
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_close(fd) == -1, "expected fstream to close opened file\n");
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ /* setbuf */
+ call_func5(p_fstream_buffer_ctor, &fs, -1, NULL, 0, TRUE);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ call_func2(p_fstream_ctor, &fs, TRUE);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer + 8, ARRAY_SIZE(buffer) - 8);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 8, "wrong buffer, expected %p got %p\n", buffer + 8, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer + 8, 0);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 8, "wrong buffer, expected %p got %p\n", buffer + 8, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer + 4, ARRAY_SIZE(buffer) - 4);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 4, "wrong buffer, expected %p got %p\n", buffer + 4, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 5);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 4, "wrong buffer, expected %p got %p\n", buffer + 4, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ /* setbuf - seems to be a nop and always return NULL in those other cases */
+ pfs = call_func5(p_fstream_buffer_ctor, &fs, 42, NULL, 0, TRUE);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf != NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->base != buffer, "wrong base value, expected not %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf != NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->base != buffer, "wrong base value, expected not %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ /* attach */
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ call_func2(p_fstream_attach, &fs, 42);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "attaching on vanilla stream set some state bits\n");
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fd == 42, "wrong fd, expected 42 got %d\n", fd);
+ ok(pfb->close == 0, "wrong close value, expected 0 got %d\n", pfb->close);
+ fs.base_ios.state = IOSTATE_eofbit;
+ call_func2(p_fstream_attach, &fs, 53);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ ok(fd == 42, "wrong fd, expected 42 got %d\n", fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ /* fd */
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == -1, "wrong fd, expected -1 but got %d\n", fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == pfb->fd, "wrong fd, expected %d but got %d\n", pfb->fd, fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == -1, "wrong fd, expected -1 but got %d\n", fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == pfb->fd, "wrong fd, expected %d but got %d\n", pfb->fd, fd);
+
+ /* rdbuf */
+ pfb = (filebuf*) call_func1(p_fstream_rdbuf, &fs);
+ ok((streambuf*) pfb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, pfb);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ /* setmode */
+ ret = (int) call_func2(p_fstream_setmode, &fs, filebuf_binary);
+ ok(ret == filebuf_text, "wrong return, expected %d got %d\n", filebuf_text, ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ret = (int) call_func2(p_fstream_setmode, &fs, filebuf_binary);
+ ok(ret == filebuf_binary, "wrong return, expected %d got %d\n", filebuf_binary, ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ret = (int) call_func2(p_fstream_setmode, &fs, filebuf_text);
+ ok(ret == filebuf_binary, "wrong return, expected %d got %d\n", filebuf_binary, ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ret = (int) call_func2(p_fstream_setmode, &fs, 0x9000);
+ ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ /* close && is_open */
+ ok((int) call_func1(p_fstream_is_open, &fs) == 1, "expected fstream to be open\n");
+ fs.base_ios.state = IOSTATE_eofbit | IOSTATE_failbit;
+ call_func1(p_fstream_close, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "close did not clear state = %d\n", fs.base_ios.state);
+ fs.base_ios.state = IOSTATE_eofbit;
+ call_func1(p_fstream_close, &fs);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "close on a closed stream did not set failbit\n");
+ ok((int) call_func1(p_fstream_is_open, &fs) == 0, "expected fstream to not be open\n");
+ ok(_close(fd) == -1, "expected close to close the opened file\n");
+
+ /* open */
+ fs.base_ios.state = IOSTATE_eofbit;
+ call_func4(p_fstream_open, &fs, filename, OPENMODE_out, filebuf_openprot);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fd != -1, "wrong fd, expected not -1 got %d\n", fd);
+ ok(fs.base_ios.state == IOSTATE_eofbit, "open did not succeed\n");
+ call_func4(p_fstream_open, &fs, filename, OPENMODE_out, filebuf_openprot);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "second open did not set failbit\n");
+ call_func1(p_fstream_close, &fs);
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
- /* constructors */
pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
ok(pfs == &fs, "constructor returned wrong pointer, expected %p got %p\n", &fs, pfs);
ok(fs.base_ios.state == IOSTATE_goodbit, "wrong stream state, expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
pfb = (filebuf*) fs.base_ios.sb;
ok((int) call_func1(p_filebuf_is_open, pfb) == TRUE, "expected filebuf to be open\n");
- ok(fs.base_ios.delbuf == 1, "internal filebuf not makred for deletion\n");
+ ok(fs.base_ios.delbuf == 1, "internal filebuf not marked for deletion\n");
/* integration with ostream */
pos = call_func2(p_ostream_print_str, (ostream*) &fs.base2, "ftest ");
diff --git a/dlls/msvcrt20/msvcrt20.spec b/dlls/msvcrt20/msvcrt20.spec
index e386ed8511d8..8c4e4a233cb4 100644
--- a/dlls/msvcrt20/msvcrt20.spec
+++ b/dlls/msvcrt20/msvcrt20.spec
@@ -10,16 +10,16 @@
@ cdecl -arch=win64 ??0filebuf@@QEAA@HPEADH@Z(ptr long ptr long) msvcirt.??0filebuf@@QEAA@HPEADH@Z
@ thiscall -arch=win32 ??0filebuf@@QAE@XZ(ptr) msvcirt.??0filebuf@@QAE@XZ
@ cdecl -arch=win64 ??0filebuf@@QEAA@XZ(ptr) msvcirt.??0filebuf@@QEAA@XZ
-@ stub -arch=win32 ??0fstream@@QAE@ABV0@@Z
-@ stub -arch=win64 ??0fstream@@QEAA@AEBV0@@Z
-@ stub -arch=win32 ??0fstream@@QAE@H@Z
-@ stub -arch=win64 ??0fstream@@QEAA@H@Z
-@ stub -arch=win32 ??0fstream@@QAE@HPADH@Z
-@ stub -arch=win64 ??0fstream@@QEAA@HPEADH@Z
+@ thiscall -arch=win32 ??0fstream@@QAE@ABV0@@Z(ptr ptr long) msvcirt.??0fstream@@QAE@ABV0@@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA@AEBV0@@Z(ptr ptr long) msvcirt.??0fstream@@QEAA@AEBV0@@Z
+@ thiscall -arch=win32 ??0fstream@@QAE@H@Z(ptr long long) msvcirt.??0fstream@@QAE@H@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA@H@Z(ptr long long) msvcirt.??0fstream@@QEAA@H@Z
+@ thiscall -arch=win32 ??0fstream@@QAE@HPADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QAE@HPADH@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA@HPEADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QEAA@HPEADH@Z
@ thiscall -arch=win32 ??0fstream@@QAE@PBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QAE@PBDHH@Z
@ cdecl -arch=win64 ??0fstream@@QEAA@PEBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QEAA@PEBDHH@Z
-@ stub -arch=win32 ??0fstream@@QAE@XZ
-@ stub -arch=win64 ??0fstream@@QEAA@XZ
+@ thiscall -arch=win32 ??0fstream@@QAE@XZ(ptr long) msvcirt.??0fstream@@QAE@XZ
+@ cdecl -arch=win64 ??0fstream@@QEAA@XZ(ptr long) msvcirt.??0fstream@@QEAA@XZ
@ thiscall -arch=win32 ??0ifstream@@QAE@ABV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QAE@ABV0@@Z
@ cdecl -arch=win64 ??0ifstream@@QEAA@AEBV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QEAA@AEBV0@@Z
@ thiscall -arch=win32 ??0ifstream@@QAE@H@Z(ptr long long) msvcirt.??0ifstream@@QAE@H@Z
@@ -162,8 +162,8 @@
@ cdecl -arch=win64 ??4Iostream_init@@QEAAAEAV0@AEBV0@@Z(ptr ptr) msvcirt.??4Iostream_init@@QEAAAEAV0@AEBV0@@Z
@ thiscall -arch=win32 ??4filebuf@@QAEAAV0@ABV0@@Z(ptr ptr) msvcirt.??4filebuf@@QAEAAV0@ABV0@@Z
@ cdecl -arch=win64 ??4filebuf@@QEAAAEAV0@AEBV0@@Z(ptr ptr) msvcirt.??4filebuf@@QEAAAEAV0@AEBV0@@Z
-@ stub -arch=win32 ??4fstream@@QAEAAV0@AAV0@@Z
-@ stub -arch=win64 ??4fstream@@QEAAAEAV0@AEAV0@@Z
+@ thiscall -arch=win32 ??4fstream@@QAEAAV0@AAV0@@Z(ptr ptr) msvcirt.??4fstream@@QAEAAV0@AAV0@@Z
+@ cdecl -arch=win64 ??4fstream@@QEAAAEAV0@AEAV0@@Z(ptr ptr) msvcirt.??4fstream@@QEAAAEAV0@AEAV0@@Z
@ thiscall -arch=win32 ??4ifstream@@QAEAAV0@ABV0@@Z(ptr ptr) msvcirt.??4ifstream@@QAEAAV0@ABV0@@Z
@ cdecl -arch=win64 ??4ifstream@@QEAAAEAV0@AEBV0@@Z(ptr ptr) msvcirt.??4ifstream@@QEAAAEAV0@AEBV0@@Z
@ thiscall -arch=win32 ??4ios@@IAEAAV0@ABV0@@Z(ptr ptr) msvcirt.??4ios@@IAEAAV0@ABV0@@Z
@@ -392,8 +392,8 @@
@ cdecl -arch=win64 ?allocate@streambuf@@IEAAHXZ(ptr) msvcirt.?allocate@streambuf@@IEAAHXZ
@ thiscall -arch=win32 ?attach@filebuf@@QAEPAV1@H@Z(ptr long) msvcirt.?attach@filebuf@@QAEPAV1@H@Z
@ cdecl -arch=win64 ?attach@filebuf@@QEAAPEAV1@H@Z(ptr long) msvcirt.?attach@filebuf@@QEAAPEAV1@H@Z
-@ stub -arch=win32 ?attach@fstream@@QAEXH@Z
-@ stub -arch=win64 ?attach@fstream@@QEAAXH@Z
+@ thiscall -arch=win32 ?attach@fstream@@QAEXH@Z(ptr long) msvcirt.?attach@fstream@@QAEXH@Z
+@ cdecl -arch=win64 ?attach@fstream@@QEAAXH@Z(ptr long) msvcirt.?attach@fstream@@QEAAXH@Z
@ thiscall -arch=win32 ?attach@ifstream@@QAEXH@Z(ptr long) msvcirt.?attach@ifstream@@QAEXH@Z
@ cdecl -arch=win64 ?attach@ifstream@@QEAAXH@Z(ptr long) msvcirt.?attach@ifstream@@QEAAXH@Z
@ thiscall -arch=win32 ?attach@ofstream@@QAEXH@Z(ptr long) msvcirt.?attach@ofstream@@QAEXH@Z
@@ -414,8 +414,8 @@
@ extern ?clog@@3Vostream_withassign@@A msvcirt.?clog@@3Vostream_withassign@@A
@ thiscall -arch=win32 ?close@filebuf@@QAEPAV1@XZ(ptr) msvcirt.?close@filebuf@@QAEPAV1@XZ
@ cdecl -arch=win64 ?close@filebuf@@QEAAPEAV1@XZ(ptr) msvcirt.?close@filebuf@@QEAAPEAV1@XZ
-@ stub -arch=win32 ?close@fstream@@QAEXXZ
-@ stub -arch=win64 ?close@fstream@@QEAAXXZ
+@ thiscall -arch=win32 ?close@fstream@@QAEXXZ(ptr) msvcirt.?close@fstream@@QAEXXZ
+@ cdecl -arch=win64 ?close@fstream@@QEAAXXZ(ptr) msvcirt.?close@fstream@@QEAAXXZ
@ thiscall -arch=win32 ?close@ifstream@@QAEXXZ(ptr) msvcirt.?close@ifstream@@QAEXXZ
@ cdecl -arch=win64 ?close@ifstream@@QEAAXXZ(ptr) msvcirt.?close@ifstream@@QEAAXXZ
@ thiscall -arch=win32 ?close@ofstream@@QAEXXZ(ptr) msvcirt.?close@ofstream@@QAEXXZ
@@ -458,8 +458,8 @@
@ cdecl -arch=win64 ?fail@ios@@QEBAHXZ(ptr) msvcirt.?fail@ios@@QEBAHXZ
@ thiscall -arch=win32 ?fd@filebuf@@QBEHXZ(ptr) msvcirt.?fd@filebuf@@QBEHXZ
@ cdecl -arch=win64 ?fd@filebuf@@QEBAHXZ(ptr) msvcirt.?fd@filebuf@@QEBAHXZ
-@ stub -arch=win32 ?fd@fstream@@QBEHXZ
-@ stub -arch=win64 ?fd@fstream@@QEBAHXZ
+@ thiscall -arch=win32 ?fd@fstream@@QBEHXZ(ptr) msvcirt.?fd@fstream@@QBEHXZ
+@ cdecl -arch=win64 ?fd@fstream@@QEBAHXZ(ptr) msvcirt.?fd@fstream@@QEBAHXZ
@ thiscall -arch=win32 ?fd@ifstream@@QBEHXZ(ptr) msvcirt.?fd@ifstream@@QBEHXZ
@ cdecl -arch=win64 ?fd@ifstream@@QEBAHXZ(ptr) msvcirt.?fd@ifstream@@QEBAHXZ
@ thiscall -arch=win32 ?fd@ofstream@@QBEHXZ(ptr) msvcirt.?fd@ofstream@@QBEHXZ
@@ -525,8 +525,8 @@
@ cdecl -arch=win64 ?ipfx@istream@@QEAAHH@Z(ptr long) msvcirt.?ipfx@istream@@QEAAHH@Z
@ thiscall -arch=win32 ?is_open@filebuf@@QBEHXZ(ptr) msvcirt.?is_open@filebuf@@QBEHXZ
@ cdecl -arch=win64 ?is_open@filebuf@@QEBAHXZ(ptr) msvcirt.?is_open@filebuf@@QEBAHXZ
-@ stub -arch=win32 ?is_open@fstream@@QBEHXZ
-@ stub -arch=win64 ?is_open@fstream@@QEBAHXZ
+@ thiscall -arch=win32 ?is_open@fstream@@QBEHXZ(ptr) msvcirt.?is_open@fstream@@QBEHXZ
+@ cdecl -arch=win64 ?is_open@fstream@@QEBAHXZ(ptr) msvcirt.?is_open@fstream@@QEBAHXZ
@ thiscall -arch=win32 ?is_open@ifstream@@QBEHXZ(ptr) msvcirt.?is_open@ifstream@@QBEHXZ
@ cdecl -arch=win64 ?is_open@ifstream@@QEBAHXZ(ptr) msvcirt.?is_open@ifstream@@QEBAHXZ
@ thiscall -arch=win32 ?is_open@ofstream@@QBEHXZ(ptr) msvcirt.?is_open@ofstream@@QBEHXZ
@@ -550,8 +550,8 @@
@ cdecl -arch=win64 ?oct@@YAAEAVios@@AEAV1@@Z(ptr) msvcirt.?oct@@YAAEAVios@@AEAV1@@Z
@ thiscall -arch=win32 ?open@filebuf@@QAEPAV1@PBDHH@Z(ptr str long long) msvcirt.?open@filebuf@@QAEPAV1@PBDHH@Z
@ cdecl -arch=win64 ?open@filebuf@@QEAAPEAV1@PEBDHH@Z(ptr str long long) msvcirt.?open@filebuf@@QEAAPEAV1@PEBDHH@Z
-@ stub -arch=win32 ?open@fstream@@QAEXPBDHH@Z
-@ stub -arch=win64 ?open@fstream@@QEAAXPEBDHH@Z
+@ thiscall -arch=win32 ?open@fstream@@QAEXPBDHH@Z(ptr str long long) msvcirt.?open@fstream@@QAEXPBDHH@Z
+@ cdecl -arch=win64 ?open@fstream@@QEAAXPEBDHH@Z(ptr str long long) msvcirt.?open@fstream@@QEAAXPEBDHH@Z
@ thiscall -arch=win32 ?open@ifstream@@QAEXPBDHH@Z(ptr str long long) msvcirt.?open@ifstream@@QAEXPBDHH@Z
@ cdecl -arch=win64 ?open@ifstream@@QEAAXPEBDHH@Z(ptr str long long) msvcirt.?open@ifstream@@QEAAXPEBDHH@Z
@ thiscall -arch=win32 ?open@ofstream@@QAEXPBDHH@Z(ptr str long long) msvcirt.?open@ofstream@@QAEXPBDHH@Z
@@ -599,8 +599,8 @@
@ cdecl -arch=win64 ?putback@istream@@QEAAAEAV1@D@Z(ptr long) msvcirt.?putback@istream@@QEAAAEAV1@D@Z
@ thiscall -arch=win32 ?pword@ios@@QBEAAPAXH@Z(ptr long) msvcirt.?pword@ios@@QBEAAPAXH@Z
@ cdecl -arch=win64 ?pword@ios@@QEBAAEAPEAXH@Z(ptr long) msvcirt.?pword@ios@@QEBAAEAPEAXH@Z
-@ stub -arch=win32 ?rdbuf@fstream@@QBEPAVfilebuf@@XZ
-@ stub -arch=win64 ?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ
+@ thiscall -arch=win32 ?rdbuf@fstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@fstream@@QBEPAVfilebuf@@XZ
+@ cdecl -arch=win64 ?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ
@ thiscall -arch=win32 ?rdbuf@ifstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@ifstream@@QBEPAVfilebuf@@XZ
@ cdecl -arch=win64 ?rdbuf@ifstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@ifstream@@QEBAPEAVfilebuf@@XZ
@ thiscall -arch=win32 ?rdbuf@ios@@QBEPAVstreambuf@@XZ(ptr) msvcirt.?rdbuf@ios@@QBEPAVstreambuf@@XZ
@@ -649,8 +649,8 @@
@ cdecl -arch=win64 ?setb@streambuf@@IEAAXPEAD0H@Z(ptr ptr ptr long) msvcirt.?setb@streambuf@@IEAAXPEAD0H@Z
@ thiscall -arch=win32 ?setbuf@filebuf@@UAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@filebuf@@UAEPAVstreambuf@@PADH@Z
@ cdecl -arch=win64 ?setbuf@filebuf@@UEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) msvcirt.?setbuf@filebuf@@UEAAPEAVstreambuf@@PEADH@Z
-@ stub -arch=win32 ?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z
-@ stub -arch=win64 ?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z
+@ thiscall -arch=win32 ?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z
+@ cdecl -arch=win64 ?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) msvcirt.?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z
@ thiscall -arch=win32 ?setbuf@ifstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@ifstream@@QAEPAVstreambuf@@PADH@Z
@ cdecl -arch=win64 ?setbuf@ifstream@@QEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) msvcirt.?setbuf@ifstream@@QEAAPEAVstreambuf@@PEADH@Z
@ thiscall -arch=win32 ?setbuf@ofstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@ofstream@@QAEPAVstreambuf@@PADH@Z
@@ -671,8 +671,8 @@
@ cdecl -arch=win64 ?setlock@streambuf@@QEAAXXZ(ptr) msvcirt.?setlock@streambuf@@QEAAXXZ
@ thiscall -arch=win32 ?setmode@filebuf@@QAEHH@Z(ptr long) msvcirt.?setmode@filebuf@@QAEHH@Z
@ cdecl -arch=win64 ?setmode@filebuf@@QEAAHH@Z(ptr long) msvcirt.?setmode@filebuf@@QEAAHH@Z
-@ stub -arch=win32 ?setmode@fstream@@QAEHH@Z
-@ stub -arch=win64 ?setmode@fstream@@QEAAHH@Z
+@ thiscall -arch=win32 ?setmode@fstream@@QAEHH@Z(ptr long) msvcirt.?setmode@fstream@@QAEHH@Z
+@ cdecl -arch=win64 ?setmode@fstream@@QEAAHH@Z(ptr long) msvcirt.?setmode@fstream@@QEAAHH@Z
@ thiscall -arch=win32 ?setmode@ifstream@@QAEHH@Z(ptr long) msvcirt.?setmode@ifstream@@QAEHH@Z
@ cdecl -arch=win64 ?setmode@ifstream@@QEAAHH@Z(ptr long) msvcirt.?setmode@ifstream@@QEAAHH@Z
@ thiscall -arch=win32 ?setmode@ofstream@@QAEHH@Z(ptr long) msvcirt.?setmode@ofstream@@QAEHH@Z
diff --git a/dlls/msvcrt40/msvcrt40.spec b/dlls/msvcrt40/msvcrt40.spec
index 1024644b29cd..943dcc537018 100644
--- a/dlls/msvcrt40/msvcrt40.spec
+++ b/dlls/msvcrt40/msvcrt40.spec
@@ -28,16 +28,16 @@
@ cdecl -arch=win64 ??0filebuf@@QEAA@HPEADH@Z(ptr long ptr long) msvcirt.??0filebuf@@QEAA@HPEADH@Z
@ thiscall -arch=win32 ??0filebuf@@QAE@XZ(ptr) msvcirt.??0filebuf@@QAE@XZ
@ cdecl -arch=win64 ??0filebuf@@QEAA@XZ(ptr) msvcirt.??0filebuf@@QEAA@XZ
-@ stub -arch=win32 ??0fstream@@QAE@ABV0@@Z
-@ stub -arch=win64 ??0fstream@@QEAA@AEBV0@@Z
-@ stub -arch=win32 ??0fstream@@QAE@H@Z
-@ stub -arch=win64 ??0fstream@@QEAA@H@Z
-@ stub -arch=win32 ??0fstream@@QAE@HPADH@Z
-@ stub -arch=win64 ??0fstream@@QEAA@HPEADH@Z
+@ thiscall -arch=win32 ??0fstream@@QAE@ABV0@@Z(ptr ptr long) msvcirt.??0fstream@@QAE@ABV0@@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA@AEBV0@@Z(ptr ptr long) msvcirt.??0fstream@@QEAA@AEBV0@@Z
+@ thiscall -arch=win32 ??0fstream@@QAE@H@Z(ptr long long) msvcirt.??0fstream@@QAE@H@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA@H@Z(ptr long long) msvcirt.??0fstream@@QEAA@H@Z
+@ thiscall -arch=win32 ??0fstream@@QAE@HPADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QAE@HPADH@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA@HPEADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QEAA@HPEADH@Z
@ thiscall -arch=win32 ??0fstream@@QAE@PBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QAE@PBDHH@Z
@ cdecl -arch=win64 ??0fstream@@QEAA@PEBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QEAA@PEBDHH@Z
-@ stub -arch=win32 ??0fstream@@QAE@XZ
-@ stub -arch=win64 ??0fstream@@QEAA@XZ
+@ thiscall -arch=win32 ??0fstream@@QAE@XZ(ptr long) msvcirt.??0fstream@@QAE@XZ
+@ cdecl -arch=win64 ??0fstream@@QEAA@XZ(ptr long) msvcirt.??0fstream@@QEAA@XZ
@ thiscall -arch=win32 ??0ifstream@@QAE@ABV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QAE@ABV0@@Z
@ cdecl -arch=win64 ??0ifstream@@QEAA@AEBV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QEAA@AEBV0@@Z
@ thiscall -arch=win32 ??0ifstream@@QAE@H@Z(ptr long long) msvcirt.??0ifstream@@QAE@H@Z
@@ -204,8 +204,8 @@
@ cdecl -arch=win64 ??4exception@@QEAAAEAV0@AEBV0@@Z(ptr ptr) msvcrt.??4exception@@QEAAAEAV0@AEBV0@@Z
@ thiscall -arch=win32 ??4filebuf@@QAEAAV0@ABV0@@Z(ptr ptr) msvcirt.??4filebuf@@QAEAAV0@ABV0@@Z
@ cdecl -arch=win64 ??4filebuf@@QEAAAEAV0@AEBV0@@Z(ptr ptr) msvcirt.??4filebuf@@QEAAAEAV0@AEBV0@@Z
-@ stub -arch=win32 ??4fstream@@QAEAAV0@AAV0@@Z
-@ stub -arch=win64 ??4fstream@@QEAAAEAV0@AEAV0@@Z
+@ thiscall -arch=win32 ??4fstream@@QAEAAV0@AAV0@@Z(ptr ptr) msvcirt.??4fstream@@QAEAAV0@AAV0@@Z
+@ cdecl -arch=win64 ??4fstream@@QEAAAEAV0@AEAV0@@Z(ptr ptr) msvcirt.??4fstream@@QEAAAEAV0@AEAV0@@Z
@ thiscall -arch=win32 ??4ifstream@@QAEAAV0@ABV0@@Z(ptr ptr) msvcirt.??4ifstream@@QAEAAV0@ABV0@@Z
@ cdecl -arch=win64 ??4ifstream@@QEAAAEAV0@AEBV0@@Z(ptr ptr) msvcirt.??4ifstream@@QEAAAEAV0@AEBV0@@Z
@ thiscall -arch=win32 ??4ios@@IAEAAV0@ABV0@@Z(ptr ptr) msvcirt.??4ios@@IAEAAV0@ABV0@@Z
@@ -455,8 +455,8 @@
@ cdecl -arch=win64 ?allocate@streambuf@@IEAAHXZ(ptr) msvcirt.?allocate@streambuf@@IEAAHXZ
@ thiscall -arch=win32 ?attach@filebuf@@QAEPAV1@H@Z(ptr long) msvcirt.?attach@filebuf@@QAEPAV1@H@Z
@ cdecl -arch=win64 ?attach@filebuf@@QEAAPEAV1@H@Z(ptr long) msvcirt.?attach@filebuf@@QEAAPEAV1@H@Z
-@ stub -arch=win32 ?attach@fstream@@QAEXH@Z
-@ stub -arch=win64 ?attach@fstream@@QEAAXH@Z
+@ thiscall -arch=win32 ?attach@fstream@@QAEXH@Z(ptr long) msvcirt.?attach@fstream@@QAEXH@Z
+@ cdecl -arch=win64 ?attach@fstream@@QEAAXH@Z(ptr long) msvcirt.?attach@fstream@@QEAAXH@Z
@ thiscall -arch=win32 ?attach@ifstream@@QAEXH@Z(ptr long) msvcirt.?attach@ifstream@@QAEXH@Z
@ cdecl -arch=win64 ?attach@ifstream@@QEAAXH@Z(ptr long) msvcirt.?attach@ifstream@@QEAAXH@Z
@ thiscall -arch=win32 ?attach@ofstream@@QAEXH@Z(ptr long) msvcirt.?attach@ofstream@@QAEXH@Z
@@ -479,8 +479,8 @@
@ extern ?clog@@3Vostream_withassign@@A msvcirt.?clog@@3Vostream_withassign@@A
@ thiscall -arch=win32 ?close@filebuf@@QAEPAV1@XZ(ptr) msvcirt.?close@filebuf@@QAEPAV1@XZ
@ cdecl -arch=win64 ?close@filebuf@@QEAAPEAV1@XZ(ptr) msvcirt.?close@filebuf@@QEAAPEAV1@XZ
-@ stub -arch=win32 ?close@fstream@@QAEXXZ
-@ stub -arch=win64 ?close@fstream@@QEAAXXZ
+@ thiscall -arch=win32 ?close@fstream@@QAEXXZ(ptr) msvcirt.?close@fstream@@QAEXXZ
+@ cdecl -arch=win64 ?close@fstream@@QEAAXXZ(ptr) msvcirt.?close@fstream@@QEAAXXZ
@ thiscall -arch=win32 ?close@ifstream@@QAEXXZ(ptr) msvcirt.?close@ifstream@@QAEXXZ
@ cdecl -arch=win64 ?close@ifstream@@QEAAXXZ(ptr) msvcirt.?close@ifstream@@QEAAXXZ
@ thiscall -arch=win32 ?close@ofstream@@QAEXXZ(ptr) msvcirt.?close@ofstream@@QAEXXZ
@@ -523,8 +523,8 @@
@ cdecl -arch=win64 ?fail@ios@@QEBAHXZ(ptr) msvcirt.?fail@ios@@QEBAHXZ
@ thiscall -arch=win32 ?fd@filebuf@@QBEHXZ(ptr) msvcirt.?fd@filebuf@@QBEHXZ
@ cdecl -arch=win64 ?fd@filebuf@@QEBAHXZ(ptr) msvcirt.?fd@filebuf@@QEBAHXZ
-@ stub -arch=win32 ?fd@fstream@@QBEHXZ
-@ stub -arch=win64 ?fd@fstream@@QEBAHXZ
+@ thiscall -arch=win32 ?fd@fstream@@QBEHXZ(ptr) msvcirt.?fd@fstream@@QBEHXZ
+@ cdecl -arch=win64 ?fd@fstream@@QEBAHXZ(ptr) msvcirt.?fd@fstream@@QEBAHXZ
@ thiscall -arch=win32 ?fd@ifstream@@QBEHXZ(ptr) msvcirt.?fd@ifstream@@QBEHXZ
@ cdecl -arch=win64 ?fd@ifstream@@QEBAHXZ(ptr) msvcirt.?fd@ifstream@@QEBAHXZ
@ thiscall -arch=win32 ?fd@ofstream@@QBEHXZ(ptr) msvcirt.?fd@ofstream@@QBEHXZ
@@ -592,8 +592,8 @@
@ cdecl -arch=win64 ?ipfx@istream@@QEAAHH@Z(ptr long) msvcirt.?ipfx@istream@@QEAAHH@Z
@ thiscall -arch=win32 ?is_open@filebuf@@QBEHXZ(ptr) msvcirt.?is_open@filebuf@@QBEHXZ
@ cdecl -arch=win64 ?is_open@filebuf@@QEBAHXZ(ptr) msvcirt.?is_open@filebuf@@QEBAHXZ
-@ stub -arch=win32 ?is_open@fstream@@QBEHXZ
-@ stub -arch=win64 ?is_open@fstream@@QEBAHXZ
+@ thiscall -arch=win32 ?is_open@fstream@@QBEHXZ(ptr) msvcirt.?is_open@fstream@@QBEHXZ
+@ cdecl -arch=win64 ?is_open@fstream@@QEBAHXZ(ptr) msvcirt.?is_open@fstream@@QEBAHXZ
@ thiscall -arch=win32 ?is_open@ifstream@@QBEHXZ(ptr) msvcirt.?is_open@ifstream@@QBEHXZ
@ cdecl -arch=win64 ?is_open@ifstream@@QEBAHXZ(ptr) msvcirt.?is_open@ifstream@@QEBAHXZ
@ thiscall -arch=win32 ?is_open@ofstream@@QBEHXZ(ptr) msvcirt.?is_open@ofstream@@QBEHXZ
@@ -619,8 +619,8 @@
@ cdecl -arch=win64 ?oct@@YAAEAVios@@AEAV1@@Z(ptr) msvcirt.?oct@@YAAEAVios@@AEAV1@@Z
@ thiscall -arch=win32 ?open@filebuf@@QAEPAV1@PBDHH@Z(ptr str long long) msvcirt.?open@filebuf@@QAEPAV1@PBDHH@Z
@ cdecl -arch=win64 ?open@filebuf@@QEAAPEAV1@PEBDHH@Z(ptr str long long) msvcirt.?open@filebuf@@QEAAPEAV1@PEBDHH@Z
-@ stub -arch=win32 ?open@fstream@@QAEXPBDHH@Z
-@ stub -arch=win64 ?open@fstream@@QEAAXPEBDHH@Z
+@ thiscall -arch=win32 ?open@fstream@@QAEXPBDHH@Z(ptr str long long) msvcirt.?open@fstream@@QAEXPBDHH@Z
+@ cdecl -arch=win64 ?open@fstream@@QEAAXPEBDHH@Z(ptr str long long) msvcirt.?open@fstream@@QEAAXPEBDHH@Z
@ thiscall -arch=win32 ?open@ifstream@@QAEXPBDHH@Z(ptr str long long) msvcirt.?open@ifstream@@QAEXPBDHH@Z
@ cdecl -arch=win64 ?open@ifstream@@QEAAXPEBDHH@Z(ptr str long long) msvcirt.?open@ifstream@@QEAAXPEBDHH@Z
@ thiscall -arch=win32 ?open@ofstream@@QAEXPBDHH@Z(ptr str long long) msvcirt.?open@ofstream@@QAEXPBDHH@Z
@@ -670,8 +670,8 @@
@ cdecl -arch=win64 ?pword@ios@@QEBAAEAPEAXH@Z(ptr long) msvcirt.?pword@ios@@QEBAAEAPEAXH@Z
@ thiscall -arch=i386 ?raw_name@type_info@@QBEPBDXZ(ptr) msvcrt.?raw_name@type_info@@QBEPBDXZ
@ cdecl -arch=win64 ?raw_name@type_info@@QEBAPEBDXZ(ptr) msvcrt.?raw_name@type_info@@QEBAPEBDXZ
-@ stub -arch=win32 ?rdbuf@fstream@@QBEPAVfilebuf@@XZ
-@ stub -arch=win64 ?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ
+@ thiscall -arch=win32 ?rdbuf@fstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@fstream@@QBEPAVfilebuf@@XZ
+@ cdecl -arch=win64 ?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@fstream@@QEBAPEAVfilebuf@@XZ
@ thiscall -arch=win32 ?rdbuf@ifstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@ifstream@@QBEPAVfilebuf@@XZ
@ cdecl -arch=win64 ?rdbuf@ifstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf@ifstream@@QEBAPEAVfilebuf@@XZ
@ thiscall -arch=win32 ?rdbuf@ios@@QBEPAVstreambuf@@XZ(ptr) msvcirt.?rdbuf@ios@@QBEPAVstreambuf@@XZ
@@ -721,8 +721,8 @@
@ cdecl -arch=win64 ?setb@streambuf@@IEAAXPEAD0H@Z(ptr ptr ptr long) msvcirt.?setb@streambuf@@IEAAXPEAD0H@Z
@ thiscall -arch=win32 ?setbuf@filebuf@@UAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@filebuf@@UAEPAVstreambuf@@PADH@Z
@ cdecl -arch=win64 ?setbuf@filebuf@@UEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) msvcirt.?setbuf@filebuf@@UEAAPEAVstreambuf@@PEADH@Z
-@ stub -arch=win32 ?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z
-@ stub -arch=win64 ?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z
+@ thiscall -arch=win32 ?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@fstream@@QAEPAVstreambuf@@PADH@Z
+@ cdecl -arch=win64 ?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) msvcirt.?setbuf@fstream@@QEAAPEAVstreambuf@@PEADH@Z
@ thiscall -arch=win32 ?setbuf@ifstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@ifstream@@QAEPAVstreambuf@@PADH@Z
@ cdecl -arch=win64 ?setbuf@ifstream@@QEAAPEAVstreambuf@@PEADH@Z(ptr ptr long) msvcirt.?setbuf@ifstream@@QEAAPEAVstreambuf@@PEADH@Z
@ thiscall -arch=win32 ?setbuf@ofstream@@QAEPAVstreambuf@@PADH@Z(ptr ptr long) msvcirt.?setbuf@ofstream@@QAEPAVstreambuf@@PADH@Z
@@ -743,8 +743,8 @@
@ cdecl -arch=win64 ?setlock@streambuf@@QEAAXXZ(ptr) msvcirt.?setlock@streambuf@@QEAAXXZ
@ thiscall -arch=win32 ?setmode@filebuf@@QAEHH@Z(ptr long) msvcirt.?setmode@filebuf@@QAEHH@Z
@ cdecl -arch=win64 ?setmode@filebuf@@QEAAHH@Z(ptr long) msvcirt.?setmode@filebuf@@QEAAHH@Z
-@ stub -arch=win32 ?setmode@fstream@@QAEHH@Z
-@ stub -arch=win64 ?setmode@fstream@@QEAAHH@Z
+@ thiscall -arch=win32 ?setmode@fstream@@QAEHH@Z(ptr long) msvcirt.?setmode@fstream@@QAEHH@Z
+@ cdecl -arch=win64 ?setmode@fstream@@QEAAHH@Z(ptr long) msvcirt.?setmode@fstream@@QEAAHH@Z
@ thiscall -arch=win32 ?setmode@ifstream@@QAEHH@Z(ptr long) msvcirt.?setmode@ifstream@@QAEHH@Z
@ cdecl -arch=win64 ?setmode@ifstream@@QEAAHH@Z(ptr long) msvcirt.?setmode@ifstream@@QEAAHH@Z
@ thiscall -arch=win32 ?setmode@ofstream@@QAEHH@Z(ptr long) msvcirt.?setmode@ofstream@@QAEHH@Z
--
2.30.1