=?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement stdiobuf constructors and destructor.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Oct 7 10:00:47 CDT 2015


Module: wine
Branch: master
Commit: a9ad6e88d76adafb87b5c2ecbe76494280ba647c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a9ad6e88d76adafb87b5c2ecbe76494280ba647c

Author: Iván Matellanes <matellanesivan at gmail.com>
Date:   Fri Oct  2 15:03:20 2015 +0200

msvcirt: Implement stdiobuf constructors and destructor.

Signed-off-by: Iván Matellanes <matellanesivan at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>

---

 dlls/msvcirt/msvcirt.c       | 13 +++++++---
 dlls/msvcirt/tests/msvcirt.c | 58 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index cd0e7c5..3b1c03d 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -1460,7 +1460,9 @@ int __thiscall strstreambuf_underflow(strstreambuf *this)
 DEFINE_THISCALL_WRAPPER(stdiobuf_copy_ctor, 8)
 stdiobuf* __thiscall stdiobuf_copy_ctor(stdiobuf *this, const stdiobuf *copy)
 {
-    FIXME("(%p %p) stub\n", this, copy);
+    TRACE("(%p %p)\n", this, copy);
+    *this = *copy;
+    this->base.vtable = &MSVCP_stdiobuf_vtable;
     return this;
 }
 
@@ -1469,7 +1471,10 @@ stdiobuf* __thiscall stdiobuf_copy_ctor(stdiobuf *this, const stdiobuf *copy)
 DEFINE_THISCALL_WRAPPER(stdiobuf_file_ctor, 8)
 stdiobuf* __thiscall stdiobuf_file_ctor(stdiobuf *this, FILE *file)
 {
-    FIXME("(%p %p) stub\n", this, file);
+    TRACE("(%p %p)\n", this, file);
+    streambuf_reserve_ctor(&this->base, NULL, 0);
+    this->base.vtable = &MSVCP_stdiobuf_vtable;
+    this->file = file;
     return this;
 }
 
@@ -1478,7 +1483,9 @@ stdiobuf* __thiscall stdiobuf_file_ctor(stdiobuf *this, FILE *file)
 DEFINE_THISCALL_WRAPPER(stdiobuf_dtor, 4)
 void __thiscall stdiobuf_dtor(stdiobuf *this)
 {
-    FIXME("(%p) stub\n", this);
+    TRACE("(%p)\n", this);
+    call_streambuf_sync(&this->base);
+    streambuf_dtor(&this->base);
 }
 
 /* ??4stdiobuf@@QAEAAV0 at ABV0@@Z */
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index b8ec359..5158b82 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -115,6 +115,12 @@ typedef struct {
     freeFunction f_free;
 } strstreambuf;
 
+/* class stdiobuf */
+typedef struct {
+    streambuf base;
+    FILE *file;
+} stdiobuf;
+
 /* class ios */
 struct _ostream;
 typedef struct {
@@ -200,6 +206,10 @@ static streampos (*__thiscall p_strstreambuf_seekoff)(strstreambuf*, streamoff,
 static streambuf* (*__thiscall p_strstreambuf_setbuf)(strstreambuf*, char*, int);
 static int (*__thiscall p_strstreambuf_underflow)(strstreambuf*);
 
+/* stdiobuf */
+static stdiobuf* (*__thiscall p_stdiobuf_file_ctor)(stdiobuf*, FILE*);
+static void (*__thiscall p_stdiobuf_dtor)(stdiobuf*);
+
 /* ios */
 static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*);
 static ios* (*__thiscall p_ios_ctor)(ios*);
@@ -358,6 +368,9 @@ static BOOL init(void)
         SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UEAAPEAVstreambuf@@PEADH at Z");
         SET(p_strstreambuf_underflow, "?underflow at strstreambuf@@UEAAHXZ");
 
+        SET(p_stdiobuf_file_ctor, "??0stdiobuf@@QEAA at PEAU_iobuf@@@Z");
+        SET(p_stdiobuf_dtor, "??1stdiobuf@@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");
@@ -436,6 +449,9 @@ static BOOL init(void)
         SET(p_strstreambuf_setbuf, "?setbuf at strstreambuf@@UAEPAVstreambuf@@PADH at Z");
         SET(p_strstreambuf_underflow, "?underflow at strstreambuf@@UAEHXZ");
 
+        SET(p_stdiobuf_file_ctor, "??0stdiobuf@@QAE at PAU_iobuf@@@Z");
+        SET(p_stdiobuf_dtor, "??1stdiobuf@@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");
@@ -1806,6 +1822,47 @@ static void test_strstreambuf(void)
     call_func1(p_strstreambuf_dtor, &ssb2);
 }
 
+static void test_stdiobuf(void)
+{
+    stdiobuf stb1, stb2;
+    FILE *file1, *file2;
+    const char filename1[] = "stdiobuf_test1";
+    const char filename2[] = "stdiobuf_test2";
+
+    memset(&stb1, 0xab, sizeof(stdiobuf));
+    memset(&stb2, 0xab, sizeof(stdiobuf));
+
+    file1 = fopen(filename1, "w");
+    fputs("Never gonna give you up, never gonna let you down", file1);
+    fclose(file1);
+    file1 = fopen(filename1, "r");
+    ok(file1 != NULL, "Couldn't open the file named '%s'\n", filename1);
+    file2 = fopen(filename2, "w+");
+    ok(file2 != NULL, "Couldn't open the file named '%s'\n", filename2);
+
+    /* constructors/destructor */
+    call_func2(p_stdiobuf_file_ctor, &stb1, NULL);
+    ok(stb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", stb1.base.allocated);
+    ok(stb1.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", stb1.base.unbuffered);
+    ok(stb1.file == NULL, "wrong file pointer, expected %p got %p\n", NULL, stb1.file);
+    call_func1(p_stdiobuf_dtor, &stb1);
+    call_func2(p_stdiobuf_file_ctor, &stb1, file1);
+    ok(stb1.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", stb1.base.allocated);
+    ok(stb1.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", stb1.base.unbuffered);
+    ok(stb1.file == file1, "wrong file pointer, expected %p got %p\n", file1, stb1.file);
+    call_func2(p_stdiobuf_file_ctor, &stb2, file2);
+    ok(stb2.base.allocated == 0, "wrong allocate value, expected 0 got %d\n", stb2.base.allocated);
+    ok(stb2.base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", stb2.base.unbuffered);
+    ok(stb2.file == file2, "wrong file pointer, expected %p got %p\n", file2, stb2.file);
+
+    call_func1(p_stdiobuf_dtor, &stb1);
+    call_func1(p_stdiobuf_dtor, &stb2);
+    fclose(file1);
+    fclose(file2);
+    ok(_unlink(filename1) == 0, "Couldn't unlink file named '%s'\n", filename1);
+    ok(_unlink(filename2) == 0, "Couldn't unlink file named '%s'\n", filename2);
+}
+
 struct ios_lock_arg
 {
     ios *ios_obj;
@@ -2091,6 +2148,7 @@ START_TEST(msvcirt)
     test_streambuf();
     test_filebuf();
     test_strstreambuf();
+    test_stdiobuf();
     test_ios();
 
     FreeLibrary(msvcrt);




More information about the wine-cvs mailing list