[3/5] msvcirt: Implement filebuf constructors and destructor
Iván Matellanes
matellanesivan at gmail.com
Mon Aug 3 09:48:53 CDT 2015
---
dlls/msvcirt/msvcirt.c | 39 +++++++++++++++++-------------
dlls/msvcirt/tests/msvcirt.c | 56 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+), 16 deletions(-)
diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index f860c95..8e9f93a 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -778,16 +778,9 @@ void __thiscall streambuf_dbp(streambuf *this)
DEFINE_THISCALL_WRAPPER(filebuf_copy_ctor, 8)
filebuf* __thiscall filebuf_copy_ctor(filebuf* this, const filebuf *copy)
{
- FIXME("(%p %p) stub\n", this, copy);
- return this;
-}
-
-/* ??0filebuf@@QAE at H@Z */
-/* ??0filebuf@@QEAA at H@Z */
-DEFINE_THISCALL_WRAPPER(filebuf_fd_ctor, 8)
-filebuf* __thiscall filebuf_fd_ctor(filebuf* this, filedesc fd)
-{
- FIXME("(%p %d) stub\n", this, fd);
+ TRACE("(%p %p)\n", this, copy);
+ *this = *copy;
+ this->base.vtable = &MSVCP_filebuf_vtable;
return this;
}
@@ -796,7 +789,21 @@ filebuf* __thiscall filebuf_fd_ctor(filebuf* this, filedesc fd)
DEFINE_THISCALL_WRAPPER(filebuf_fd_reserve_ctor, 16)
filebuf* __thiscall filebuf_fd_reserve_ctor(filebuf* this, filedesc fd, char *buffer, int length)
{
- FIXME("(%p %d %p %d) stub\n", this, fd, buffer, length);
+ TRACE("(%p %d %p %d)\n", this, fd, buffer, length);
+ streambuf_reserve_ctor(&this->base, buffer, length);
+ this->base.vtable = &MSVCP_filebuf_vtable;
+ this->fd = fd;
+ this->close = 0;
+ return this;
+}
+
+/* ??0filebuf@@QAE at H@Z */
+/* ??0filebuf@@QEAA at H@Z */
+DEFINE_THISCALL_WRAPPER(filebuf_fd_ctor, 8)
+filebuf* __thiscall filebuf_fd_ctor(filebuf* this, filedesc fd)
+{
+ filebuf_fd_reserve_ctor(this, fd, NULL, 0);
+ this->base.unbuffered = 0;
return this;
}
@@ -805,8 +812,7 @@ filebuf* __thiscall filebuf_fd_reserve_ctor(filebuf* this, filedesc fd, char *bu
DEFINE_THISCALL_WRAPPER(filebuf_ctor, 4)
filebuf* __thiscall filebuf_ctor(filebuf* this)
{
- FIXME("(%p) stub\n", this);
- return this;
+ return filebuf_fd_ctor(this, -1);
}
/* ??1filebuf@@UAE at XZ */
@@ -814,7 +820,8 @@ filebuf* __thiscall filebuf_ctor(filebuf* this)
DEFINE_THISCALL_WRAPPER(filebuf_dtor, 4)
void __thiscall filebuf_dtor(filebuf* this)
{
- FIXME("(%p) stub\n", this);
+ TRACE("(%p)\n", this);
+ streambuf_dtor(&this->base);
}
/* ??4filebuf@@QAEAAV0 at ABV0@@Z */
@@ -822,8 +829,8 @@ void __thiscall filebuf_dtor(filebuf* this)
DEFINE_THISCALL_WRAPPER(filebuf_assign, 8)
filebuf* __thiscall filebuf_assign(filebuf* this, const filebuf *rhs)
{
- FIXME("(%p %p) stub\n", this, rhs);
- return this;
+ filebuf_dtor(this);
+ return filebuf_copy_ctor(this, rhs);
}
/* ??_Efilebuf@@UAEPAXI at Z */
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index 30941d5..8437e9c 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -22,6 +22,7 @@
#include "wine/test.h"
typedef void (*vtable_ptr)(void);
+typedef int filedesc;
typedef enum {
IOSTATE_goodbit = 0x0,
@@ -66,6 +67,13 @@ typedef struct {
CRITICAL_SECTION lock;
} streambuf;
+/* class filebuf */
+typedef struct {
+ streambuf base;
+ filedesc fd;
+ int close;
+} filebuf;
+
/* class ios */
struct _ostream;
typedef struct {
@@ -121,6 +129,12 @@ static void (*__thiscall p_streambuf_unlock)(streambuf*);
static int (*__thiscall p_streambuf_xsgetn)(streambuf*, char*, int);
static int (*__thiscall p_streambuf_xsputn)(streambuf*, const char*, int);
+/* filebuf */
+static filebuf* (*__thiscall p_filebuf_fd_ctor)(filebuf*, int);
+static filebuf* (*__thiscall p_filebuf_fd_reserve_ctor)(filebuf*, int, char*, int);
+static filebuf* (*__thiscall p_filebuf_ctor)(filebuf*);
+static void (*__thiscall p_filebuf_dtor)(filebuf*);
+
/* ios */
static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*);
static ios* (*__thiscall p_ios_ctor)(ios*);
@@ -251,6 +265,11 @@ static BOOL init(void)
SET(p_streambuf_xsgetn, "?xsgetn at streambuf@@UEAAHPEADH at Z");
SET(p_streambuf_xsputn, "?xsputn at streambuf@@UEAAHPEBDH at Z");
+ SET(p_filebuf_fd_ctor, "??0filebuf@@QEAA at H@Z");
+ SET(p_filebuf_fd_reserve_ctor, "??0filebuf@@QEAA at HPEADH@Z");
+ SET(p_filebuf_ctor, "??0filebuf@@QEAA at XZ");
+ SET(p_filebuf_dtor, "??1filebuf@@UEAA at XZ");
+
SET(p_ios_copy_ctor, "??0ios@@IEAA at AEBV0@@Z");
SET(p_ios_ctor, "??0ios@@IEAA at XZ");
SET(p_ios_sb_ctor, "??0ios@@QEAA at PEAVstreambuf@@@Z");
@@ -301,6 +320,11 @@ static BOOL init(void)
SET(p_streambuf_xsgetn, "?xsgetn at streambuf@@UAEHPADH at Z");
SET(p_streambuf_xsputn, "?xsputn at streambuf@@UAEHPBDH at Z");
+ SET(p_filebuf_fd_ctor, "??0filebuf@@QAE at H@Z");
+ SET(p_filebuf_fd_reserve_ctor, "??0filebuf@@QAE at HPADH@Z");
+ SET(p_filebuf_ctor, "??0filebuf@@QAE at XZ");
+ SET(p_filebuf_dtor, "??1filebuf@@UAE at XZ");
+
SET(p_ios_copy_ctor, "??0ios@@IAE at ABV0@@Z");
SET(p_ios_ctor, "??0ios@@IAE at XZ");
SET(p_ios_sb_ctor, "??0ios@@QAE at PAVstreambuf@@@Z");
@@ -877,6 +901,37 @@ static void test_streambuf(void)
CloseHandle(thread);
}
+static void test_filebuf(void)
+{
+ filebuf fb1, fb2, fb3;
+
+ memset(&fb1, 0xab, sizeof(filebuf));
+ memset(&fb2, 0xab, sizeof(filebuf));
+ memset(&fb3, 0xab, sizeof(filebuf));
+
+ /* constructors */
+ call_func2(p_filebuf_fd_ctor, &fb1, 1);
+ ok(fb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb1.base.allocated);
+ ok(fb1.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fb1.base.unbuffered);
+ ok(fb1.fd == 1, "wrong fd, expected 1 got %d\n", fb1.fd);
+ ok(fb1.close == 0, "wrong value, expected 0 got %d\n", fb1.close);
+ call_func4(p_filebuf_fd_reserve_ctor, &fb2, 4, NULL, 0);
+ ok(fb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb2.base.allocated);
+ ok(fb2.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fb2.base.unbuffered);
+ ok(fb2.fd == 4, "wrong fd, expected 4 got %d\n", fb2.fd);
+ ok(fb2.close == 0, "wrong value, expected 0 got %d\n", fb2.close);
+ call_func1(p_filebuf_ctor, &fb3);
+ ok(fb3.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", fb3.base.allocated);
+ ok(fb3.base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fb3.base.unbuffered);
+ ok(fb3.fd == -1, "wrong fd, expected -1 got %d\n", fb3.fd);
+ ok(fb3.close == 0, "wrong value, expected 0 got %d\n", fb3.close);
+
+ /* destructor */
+ call_func1(p_filebuf_dtor, &fb1);
+ call_func1(p_filebuf_dtor, &fb2);
+ call_func1(p_filebuf_dtor, &fb3);
+}
+
struct ios_lock_arg
{
ios *ios_obj;
@@ -1160,6 +1215,7 @@ START_TEST(msvcirt)
return;
test_streambuf();
+ test_filebuf();
test_ios();
FreeLibrary(msvcrt);
--
2.1.4
More information about the wine-patches
mailing list