[3/6] msvcirt: Implement ostrstream constructors.

Iván Matellanes matellanesivan at gmail.com
Wed Oct 19 07:00:53 CDT 2016


Signed-off-by: Iván Matellanes <matellanesivan at gmail.com>
---
 dlls/msvcirt/msvcirt.c       |  39 +++++-
 dlls/msvcirt/tests/msvcirt.c | 287 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 321 insertions(+), 5 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index ebbe442..ffa7b93 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -2951,12 +2951,28 @@ ostream* __thiscall ostream_withassign_ctor(ostream *this, BOOL virt_init)
     return this;
 }
 
+static ostream* ostrstream_internal_sb_ctor(ostream *this, strstreambuf *ssb, BOOL virt_init)
+{
+    ios *base;
+
+    if (ssb)
+        ostream_sb_ctor(this, &ssb->base, virt_init);
+    else
+        ostream_ctor(this, virt_init);
+    base = ostream_get_ios(this);
+    base->vtable = &MSVCP_ostrstream_vtable;
+    base->delbuf = 1;
+    return this;
+}
+
 /* ??0ostrstream@@QAE at ABV0@@Z */
 /* ??0ostrstream@@QEAA at AEBV0@@Z */
 DEFINE_THISCALL_WRAPPER(ostrstream_copy_ctor, 12)
 ostream* __thiscall ostrstream_copy_ctor(ostream *this, const ostream *copy, BOOL virt_init)
 {
-    FIXME("(%p %p %d) stub\n", this, copy, virt_init);
+    TRACE("(%p %p %d)\n", this, copy, virt_init);
+    ostream_withassign_copy_ctor(this, copy, virt_init);
+    ostream_get_ios(this)->vtable = &MSVCP_ostrstream_vtable;
     return this;
 }
 
@@ -2965,8 +2981,16 @@ ostream* __thiscall ostrstream_copy_ctor(ostream *this, const ostream *copy, BOO
 DEFINE_THISCALL_WRAPPER(ostrstream_buffer_ctor, 20)
 ostream* __thiscall ostrstream_buffer_ctor(ostream *this, char *buffer, int length, int mode, BOOL virt_init)
 {
-    FIXME("(%p %p %d %d %d) stub\n", this, buffer, length, mode, virt_init);
-    return this;
+    strstreambuf *ssb = MSVCRT_operator_new(sizeof(strstreambuf));
+
+    TRACE("(%p %p %d %d %d)\n", this, buffer, length, mode, virt_init);
+
+    if (ssb) {
+        strstreambuf_buffer_ctor(ssb, buffer, length, buffer);
+        if (mode & (OPENMODE_app|OPENMODE_ate))
+            ssb->base.pptr = buffer + strlen(buffer);
+    }
+    return ostrstream_internal_sb_ctor(this, ssb, virt_init);
 }
 
 /* ??0ostrstream@@QAE at XZ */
@@ -2974,8 +2998,13 @@ ostream* __thiscall ostrstream_buffer_ctor(ostream *this, char *buffer, int leng
 DEFINE_THISCALL_WRAPPER(ostrstream_ctor, 8)
 ostream* __thiscall ostrstream_ctor(ostream *this, BOOL virt_init)
 {
-    FIXME("(%p %d) stub\n", this, virt_init);
-    return this;
+    strstreambuf *ssb = MSVCRT_operator_new(sizeof(strstreambuf));
+
+    TRACE("(%p %d)\n", this, virt_init);
+
+    if (ssb)
+        strstreambuf_ctor(ssb);
+    return ostrstream_internal_sb_ctor(this, ssb, virt_init);
 }
 
 /* ?pcount at ostrstream@@QBEHXZ */
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index 7f25cd7..e656866 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -329,6 +329,14 @@ static ostream* (*__thiscall p_ostream_withassign_assign_sb)(ostream*, streambuf
 static ostream* (*__thiscall p_ostream_withassign_assign_os)(ostream*, const ostream*);
 static ostream* (*__thiscall p_ostream_withassign_assign)(ostream*, const ostream*);
 
+/* ostrstream */
+static ostream* (*__thiscall p_ostrstream_copy_ctor)(ostream*, const ostream*, BOOL);
+static ostream* (*__thiscall p_ostrstream_buffer_ctor)(ostream*, char*, int, int, BOOL);
+static ostream* (*__thiscall p_ostrstream_ctor)(ostream*, BOOL);
+static void (*__thiscall p_ostrstream_dtor)(ios*);
+static void (*__thiscall p_ostrstream_vbase_dtor)(ostream*);
+static ostream* (*__thiscall p_ostrstream_assign)(ostream*, const ostream*);
+
 /* istream */
 static istream* (*__thiscall p_istream_copy_ctor)(istream*, const istream*, BOOL);
 static istream* (*__thiscall p_istream_ctor)(istream*, BOOL);
@@ -594,6 +602,13 @@ static BOOL init(void)
         SET(p_ostream_withassign_assign_os, "??4ostream_withassign@@QEAAAEAVostream@@AEBV1@@Z");
         SET(p_ostream_withassign_assign, "??4ostream_withassign@@QEAAAEAV0 at AEBV0@@Z");
 
+        SET(p_ostrstream_copy_ctor, "??0ostrstream@@QEAA at AEBV0@@Z");
+        SET(p_ostrstream_buffer_ctor, "??0ostrstream@@QEAA at PEADHH@Z");
+        SET(p_ostrstream_ctor, "??0ostrstream@@QEAA at XZ");
+        SET(p_ostrstream_dtor, "??1ostrstream@@UEAA at XZ");
+        SET(p_ostrstream_vbase_dtor, "??_Dostrstream@@QEAAXXZ");
+        SET(p_ostrstream_assign, "??4ostrstream@@QEAAAEAV0 at AEBV0@@Z");
+
         SET(p_istream_copy_ctor, "??0istream@@IEAA at AEBV0@@Z");
         SET(p_istream_ctor, "??0istream@@IEAA at XZ");
         SET(p_istream_sb_ctor, "??0istream@@QEAA at PEAVstreambuf@@@Z");
@@ -773,6 +788,13 @@ static BOOL init(void)
         SET(p_ostream_withassign_assign_os, "??4ostream_withassign@@QAEAAVostream@@ABV1@@Z");
         SET(p_ostream_withassign_assign, "??4ostream_withassign@@QAEAAV0 at ABV0@@Z");
 
+        SET(p_ostrstream_copy_ctor, "??0ostrstream@@QAE at ABV0@@Z");
+        SET(p_ostrstream_buffer_ctor, "??0ostrstream@@QAE at PADHH@Z");
+        SET(p_ostrstream_ctor, "??0ostrstream@@QAE at XZ");
+        SET(p_ostrstream_dtor, "??1ostrstream@@UAE at XZ");
+        SET(p_ostrstream_vbase_dtor, "??_Dostrstream@@QAEXXZ");
+        SET(p_ostrstream_assign, "??4ostrstream@@QAEAAV0 at ABV0@@Z");
+
         SET(p_istream_copy_ctor, "??0istream@@IAE at ABV0@@Z");
         SET(p_istream_ctor, "??0istream@@IAE at XZ");
         SET(p_istream_sb_ctor, "??0istream@@QAE at PAVstreambuf@@@Z");
@@ -3969,6 +3991,270 @@ static void test_ostream_withassign(void)
     ok(osa1.base_ios.do_lock == 0xabababab, "expected %d got %d\n", 0xabababab, osa1.base_ios.do_lock);
 }
 
+static void test_ostrstream(void)
+{
+    ostream os1, os2, *pos, *pos2;
+    strstreambuf *pssb;
+    char buffer[32];
+
+    memset(&os1, 0xab, sizeof(ostream));
+    memset(&os2, 0xab, sizeof(ostream));
+
+    /* constructors/destructors */
+    pos = call_func2(p_ostrstream_ctor, &os1, TRUE);
+    pssb = (strstreambuf*) os1.base_ios.sb;
+    ok(pos == &os1, "wrong return, expected %p got %p\n", &os1, pos);
+    ok(os1.unknown == 0, "expected 0 got %d\n", os1.unknown);
+    ok(os1.base_ios.sb != NULL, "expected not %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, os1.base_ios.state);
+    ok(os1.base_ios.delbuf == 1, "expected 1 got %d\n", os1.base_ios.delbuf);
+    ok(os1.base_ios.tie == NULL, "expected %p got %p\n", NULL, os1.base_ios.tie);
+    ok(os1.base_ios.flags == 0, "expected 0 got %x\n", os1.base_ios.flags);
+    ok(os1.base_ios.precision == 6, "expected 6 got %d\n", os1.base_ios.precision);
+    ok(os1.base_ios.fill == ' ', "expected 32 got %d\n", os1.base_ios.fill);
+    ok(os1.base_ios.width == 0, "expected 0 got %d\n", os1.base_ios.width);
+    ok(os1.base_ios.do_lock == -1, "expected -1 got %d\n", os1.base_ios.do_lock);
+    ok(pssb->dynamic == 1, "expected 1, got %d\n", pssb->dynamic);
+    ok(pssb->increase == 1, "expected 1, got %d\n", pssb->increase);
+    ok(pssb->constant == 0, "expected 0, got %d\n", pssb->constant);
+    ok(pssb->f_alloc == NULL, "expected %p, got %p\n", NULL, pssb->f_alloc);
+    ok(pssb->f_free == NULL, "expected %p, got %p\n", NULL, pssb->f_free);
+    ok(pssb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pssb->base.allocated);
+    ok(pssb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pssb->base.unbuffered);
+    ok(pssb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pssb->base.base);
+    ok(pssb->base.ebuf == NULL, "wrong buffer end, expected %p got %p\n", NULL, pssb->base.ebuf);
+    ok(pssb->base.do_lock == -1, "expected -1 got %d\n", pssb->base.do_lock);
+    call_func1(p_ostrstream_vbase_dtor, &os1);
+    ok(os1.base_ios.sb == NULL, "expected %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_badbit, "expected %d got %d\n", IOSTATE_badbit, os1.base_ios.state);
+    os1.unknown = 0xabababab;
+    memset(&os1.base_ios, 0xab, sizeof(ios));
+    os1.base_ios.delbuf = 0;
+    pos = call_func2(p_ostrstream_ctor, &os1, FALSE);
+    pssb = (strstreambuf*) os1.base_ios.sb;
+    ok(pos == &os1, "wrong return, expected %p got %p\n", &os1, pos);
+    ok(os1.unknown == 0, "expected 0 got %d\n", os1.unknown);
+    ok(os1.base_ios.sb != NULL, "expected not %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.state);
+    ok(os1.base_ios.delbuf == 1, "expected 1 got %d\n", os1.base_ios.delbuf);
+    ok(os1.base_ios.tie == os2.base_ios.tie, "expected %p got %p\n", os2.base_ios.tie, os1.base_ios.tie);
+    ok(os1.base_ios.flags == 0xabababab, "expected %x got %x\n", 0xabababab, os1.base_ios.flags);
+    ok(os1.base_ios.precision == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.precision);
+    ok(os1.base_ios.fill == (char) 0xab, "expected -85 got %d\n", os1.base_ios.fill);
+    ok(os1.base_ios.width == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.width);
+    ok(os1.base_ios.do_lock == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.do_lock);
+    ok(pssb->dynamic == 1, "expected 1, got %d\n", pssb->dynamic);
+    ok(pssb->increase == 1, "expected 1, got %d\n", pssb->increase);
+    ok(pssb->constant == 0, "expected 0, got %d\n", pssb->constant);
+    ok(pssb->f_alloc == NULL, "expected %p, got %p\n", NULL, pssb->f_alloc);
+    ok(pssb->f_free == NULL, "expected %p, got %p\n", NULL, pssb->f_free);
+    ok(pssb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pssb->base.allocated);
+    ok(pssb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pssb->base.unbuffered);
+    ok(pssb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pssb->base.base);
+    ok(pssb->base.ebuf == NULL, "wrong buffer end, expected %p got %p\n", NULL, pssb->base.ebuf);
+    ok(pssb->base.do_lock == -1, "expected -1 got %d\n", pssb->base.do_lock);
+    call_func1(p_ostrstream_dtor, &os1.base_ios);
+    ok(os1.base_ios.sb == &pssb->base, "expected %p got %p\n", &pssb->base, os1.base_ios.sb);
+    ok(os1.base_ios.state == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.state);
+    call_func1(p_strstreambuf_dtor, pssb);
+    p_operator_delete(pssb);
+
+    memset(&os1, 0xab, sizeof(ostream));
+    pos = call_func5(p_ostrstream_buffer_ctor, &os1, buffer, 32, OPENMODE_in|OPENMODE_out, TRUE);
+    pssb = (strstreambuf*) os1.base_ios.sb;
+    ok(pos == &os1, "wrong return, expected %p got %p\n", &os1, pos);
+    ok(os1.unknown == 0, "expected 0 got %d\n", os1.unknown);
+    ok(os1.base_ios.sb != NULL, "expected not %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, os1.base_ios.state);
+    ok(os1.base_ios.delbuf == 1, "expected 1 got %d\n", os1.base_ios.delbuf);
+    ok(os1.base_ios.tie == NULL, "expected %p got %p\n", NULL, os1.base_ios.tie);
+    ok(os1.base_ios.flags == 0, "expected 0 got %x\n", os1.base_ios.flags);
+    ok(os1.base_ios.precision == 6, "expected 6 got %d\n", os1.base_ios.precision);
+    ok(os1.base_ios.fill == ' ', "expected 32 got %d\n", os1.base_ios.fill);
+    ok(os1.base_ios.width == 0, "expected 0 got %d\n", os1.base_ios.width);
+    ok(os1.base_ios.do_lock == -1, "expected -1 got %d\n", os1.base_ios.do_lock);
+    ok(pssb->dynamic == 0, "expected 0, got %d\n", pssb->dynamic);
+    ok(pssb->constant == 1, "expected 1, got %d\n", pssb->constant);
+    ok(pssb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pssb->base.allocated);
+    ok(pssb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pssb->base.unbuffered);
+    ok(pssb->base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, pssb->base.base);
+    ok(pssb->base.ebuf == buffer + 32, "wrong buffer end, expected %p got %p\n", buffer + 32, pssb->base.ebuf);
+    ok(pssb->base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, pssb->base.eback);
+    ok(pssb->base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, pssb->base.gptr);
+    ok(pssb->base.egptr == buffer, "wrong get end, expected %p got %p\n", buffer, pssb->base.egptr);
+    ok(pssb->base.pbase == buffer, "wrong put base, expected %p got %p\n", buffer, pssb->base.pbase);
+    ok(pssb->base.pptr == buffer, "wrong put pointer, expected %p got %p\n", buffer, pssb->base.pptr);
+    ok(pssb->base.epptr == buffer + 32, "wrong put end, expected %p got %p\n", buffer + 32, pssb->base.epptr);
+    ok(pssb->base.do_lock == -1, "expected -1 got %d\n", pssb->base.do_lock);
+    call_func1(p_ostrstream_vbase_dtor, &os1);
+    ok(os1.base_ios.sb == NULL, "expected %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_badbit, "expected %d got %d\n", IOSTATE_badbit, os1.base_ios.state);
+    strcpy(buffer, "Test");
+    memset(&os1, 0xab, sizeof(ostream));
+    pos = call_func5(p_ostrstream_buffer_ctor, &os1, buffer, 16, OPENMODE_ate, TRUE);
+    pssb = (strstreambuf*) os1.base_ios.sb;
+    ok(pos == &os1, "wrong return, expected %p got %p\n", &os1, pos);
+    ok(os1.unknown == 0, "expected 0 got %d\n", os1.unknown);
+    ok(os1.base_ios.sb != NULL, "expected not %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, os1.base_ios.state);
+    ok(os1.base_ios.delbuf == 1, "expected 1 got %d\n", os1.base_ios.delbuf);
+    ok(os1.base_ios.tie == NULL, "expected %p got %p\n", NULL, os1.base_ios.tie);
+    ok(os1.base_ios.flags == 0, "expected 0 got %x\n", os1.base_ios.flags);
+    ok(os1.base_ios.precision == 6, "expected 6 got %d\n", os1.base_ios.precision);
+    ok(os1.base_ios.fill == ' ', "expected 32 got %d\n", os1.base_ios.fill);
+    ok(os1.base_ios.width == 0, "expected 0 got %d\n", os1.base_ios.width);
+    ok(os1.base_ios.do_lock == -1, "expected -1 got %d\n", os1.base_ios.do_lock);
+    ok(pssb->dynamic == 0, "expected 0, got %d\n", pssb->dynamic);
+    ok(pssb->constant == 1, "expected 1, got %d\n", pssb->constant);
+    ok(pssb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pssb->base.allocated);
+    ok(pssb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pssb->base.unbuffered);
+    ok(pssb->base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, pssb->base.base);
+    ok(pssb->base.ebuf == buffer + 16, "wrong buffer end, expected %p got %p\n", buffer + 16, pssb->base.ebuf);
+    ok(pssb->base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, pssb->base.eback);
+    ok(pssb->base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, pssb->base.gptr);
+    ok(pssb->base.egptr == buffer, "wrong get end, expected %p got %p\n", buffer, pssb->base.egptr);
+    ok(pssb->base.pbase == buffer, "wrong put base, expected %p got %p\n", buffer, pssb->base.pbase);
+    ok(pssb->base.pptr == buffer + 4, "wrong put pointer, expected %p got %p\n", buffer + 4, pssb->base.pptr);
+    ok(pssb->base.epptr == buffer + 16, "wrong put end, expected %p got %p\n", buffer + 16, pssb->base.epptr);
+    ok(pssb->base.do_lock == -1, "expected -1 got %d\n", pssb->base.do_lock);
+    call_func1(p_ostrstream_vbase_dtor, &os1);
+    ok(os1.base_ios.sb == NULL, "expected %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_badbit, "expected %d got %d\n", IOSTATE_badbit, os1.base_ios.state);
+    os1.unknown = 0xabababab;
+    memset(&os1.base_ios, 0xab, sizeof(ios));
+    os1.base_ios.delbuf = 0;
+    pos = call_func5(p_ostrstream_buffer_ctor, &os1, buffer, -1, OPENMODE_app, FALSE);
+    pssb = (strstreambuf*) os1.base_ios.sb;
+    ok(pos == &os1, "wrong return, expected %p got %p\n", &os1, pos);
+    ok(os1.unknown == 0, "expected 0 got %d\n", os1.unknown);
+    ok(os1.base_ios.sb != NULL, "expected not %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.state);
+    ok(os1.base_ios.delbuf == 1, "expected 1 got %d\n", os1.base_ios.delbuf);
+    ok(os1.base_ios.tie == os2.base_ios.tie, "expected %p got %p\n", os2.base_ios.tie, os1.base_ios.tie);
+    ok(os1.base_ios.flags == 0xabababab, "expected %x got %x\n", 0xabababab, os1.base_ios.flags);
+    ok(os1.base_ios.precision == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.precision);
+    ok(os1.base_ios.fill == (char) 0xab, "expected -85 got %d\n", os1.base_ios.fill);
+    ok(os1.base_ios.width == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.width);
+    ok(os1.base_ios.do_lock == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.do_lock);
+    ok(pssb->dynamic == 0, "expected 0, got %d\n", pssb->dynamic);
+    ok(pssb->constant == 1, "expected 1, got %d\n", pssb->constant);
+    ok(pssb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pssb->base.allocated);
+    ok(pssb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pssb->base.unbuffered);
+    ok(pssb->base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, pssb->base.base);
+    ok(pssb->base.ebuf == buffer + 0x7fffffff || pssb->base.ebuf == (char*) -1,
+        "wrong buffer end, expected %p + 0x7fffffff or -1, got %p\n", buffer, pssb->base.ebuf);
+    ok(pssb->base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, pssb->base.eback);
+    ok(pssb->base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, pssb->base.gptr);
+    ok(pssb->base.egptr == buffer, "wrong get end, expected %p got %p\n", buffer, pssb->base.egptr);
+    ok(pssb->base.pbase == buffer, "wrong put base, expected %p got %p\n", buffer, pssb->base.pbase);
+    ok(pssb->base.pptr == buffer + 4, "wrong put pointer, expected %p got %p\n", buffer + 4, pssb->base.pptr);
+    ok(pssb->base.epptr == buffer + 0x7fffffff || pssb->base.epptr == (char*) -1,
+        "wrong buffer end, expected %p + 0x7fffffff or -1, got %p\n", buffer, pssb->base.epptr);
+    ok(pssb->base.do_lock == -1, "expected -1 got %d\n", pssb->base.do_lock);
+    call_func1(p_ostrstream_dtor, &os1.base_ios);
+    ok(os1.base_ios.sb == &pssb->base, "expected %p got %p\n", &pssb->base, os1.base_ios.sb);
+    ok(os1.base_ios.state == 0xabababab, "expected %d got %d\n", 0xabababab, os1.base_ios.state);
+    call_func1(p_strstreambuf_dtor, pssb);
+    p_operator_delete(pssb);
+    memset(&os1, 0xab, sizeof(ostream));
+    pos = call_func5(p_ostrstream_buffer_ctor, &os1, buffer, 0, OPENMODE_trunc, TRUE);
+    pssb = (strstreambuf*) os1.base_ios.sb;
+    ok(pos == &os1, "wrong return, expected %p got %p\n", &os1, pos);
+    ok(os1.unknown == 0, "expected 0 got %d\n", os1.unknown);
+    ok(os1.base_ios.sb != NULL, "expected not %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, os1.base_ios.state);
+    ok(os1.base_ios.delbuf == 1, "expected 1 got %d\n", os1.base_ios.delbuf);
+    ok(os1.base_ios.tie == NULL, "expected %p got %p\n", NULL, os1.base_ios.tie);
+    ok(os1.base_ios.flags == 0, "expected 0 got %x\n", os1.base_ios.flags);
+    ok(os1.base_ios.precision == 6, "expected 6 got %d\n", os1.base_ios.precision);
+    ok(os1.base_ios.fill == ' ', "expected 32 got %d\n", os1.base_ios.fill);
+    ok(os1.base_ios.width == 0, "expected 0 got %d\n", os1.base_ios.width);
+    ok(os1.base_ios.do_lock == -1, "expected -1 got %d\n", os1.base_ios.do_lock);
+    ok(pssb->dynamic == 0, "expected 0, got %d\n", pssb->dynamic);
+    ok(pssb->constant == 1, "expected 1, got %d\n", pssb->constant);
+    ok(pssb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pssb->base.allocated);
+    ok(pssb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pssb->base.unbuffered);
+    ok(pssb->base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, pssb->base.base);
+    ok(pssb->base.ebuf == buffer + 4, "wrong buffer end, expected %p got %p\n", buffer + 4, pssb->base.ebuf);
+    ok(pssb->base.eback == buffer, "wrong get base, expected %p got %p\n", buffer, pssb->base.eback);
+    ok(pssb->base.gptr == buffer, "wrong get pointer, expected %p got %p\n", buffer, pssb->base.gptr);
+    ok(pssb->base.egptr == buffer, "wrong get end, expected %p got %p\n", buffer, pssb->base.egptr);
+    ok(pssb->base.pbase == buffer, "wrong put base, expected %p got %p\n", buffer, pssb->base.pbase);
+    ok(pssb->base.pptr == buffer, "wrong put pointer, expected %p got %p\n", buffer, pssb->base.pptr);
+    ok(pssb->base.epptr == buffer + 4, "wrong put end, expected %p got %p\n", buffer + 4, pssb->base.epptr);
+    ok(pssb->base.do_lock == -1, "expected -1 got %d\n", pssb->base.do_lock);
+    call_func1(p_ostrstream_vbase_dtor, &os1);
+    ok(os1.base_ios.sb == NULL, "expected %p got %p\n", NULL, os1.base_ios.sb);
+    ok(os1.base_ios.state == IOSTATE_badbit, "expected %d got %d\n", IOSTATE_badbit, os1.base_ios.state);
+
+    os1.unknown = 0xcdcdcdcd;
+    memset(&os1.base_ios, 0xcd, sizeof(ios));
+    pos = call_func3(p_ostrstream_copy_ctor, &os2, &os1, TRUE);
+    ok(pos == &os2, "wrong return, expected %p got %p\n", &os2, pos);
+    ok(os2.unknown == 0, "expected 0 got %d\n", os2.unknown);
+    ok(os2.base_ios.sb == os1.base_ios.sb, "expected %p got %p\n", os1.base_ios.sb, os2.base_ios.sb);
+    ok(os2.base_ios.state == 0xcdcdcdc9, "expected %d got %d\n", 0xcdcdcdc9, os2.base_ios.state);
+    ok(os2.base_ios.delbuf == 0, "expected 0 got %d\n", os2.base_ios.delbuf);
+    ok(os2.base_ios.tie == os1.base_ios.tie, "expected %p got %p\n", os1.base_ios.tie, os2.base_ios.tie);
+    ok(os2.base_ios.flags == 0xcdcdcdcd, "expected %x got %x\n", 0xcdcdcdcd, os2.base_ios.flags);
+    ok(os2.base_ios.precision == (char) 0xcd, "expected -51 got %d\n", os2.base_ios.precision);
+    ok(os2.base_ios.fill == (char) 0xcd, "expected -51 got %d\n", os2.base_ios.fill);
+    ok(os2.base_ios.width == (char) 0xcd, "expected -51 got %d\n", os2.base_ios.width);
+    ok(os2.base_ios.do_lock == -1, "expected -1 got %d\n", os2.base_ios.do_lock);
+    call_func1(p_ostrstream_vbase_dtor, &os2);
+    ok(os2.base_ios.sb == NULL, "expected %p got %p\n", NULL, os2.base_ios.sb);
+    ok(os2.base_ios.state == IOSTATE_badbit, "expected %d got %d\n", IOSTATE_badbit, os2.base_ios.state);
+    os2.unknown = 0xabababab;
+    memset(&os2.base_ios, 0xab, sizeof(ios));
+    os2.base_ios.delbuf = 0;
+    pos2 = os2.base_ios.tie;
+    pos = call_func3(p_ostrstream_copy_ctor, &os2, &os1, FALSE);
+    ok(pos == &os2, "wrong return, expected %p got %p\n", &os2, pos);
+    ok(os2.unknown == 0, "expected 0 got %d\n", os2.unknown);
+    ok(os2.base_ios.sb == os1.base_ios.sb, "expected %p got %p\n", os1.base_ios.sb, os2.base_ios.sb);
+    ok(os2.base_ios.state == 0xabababab, "expected %d got %d\n", 0xabababab, os2.base_ios.state);
+    ok(os2.base_ios.delbuf == 0, "expected 0 got %d\n", os2.base_ios.delbuf);
+    ok(os2.base_ios.tie == pos2, "expected %p got %p\n", pos2, os2.base_ios.tie);
+    ok(os2.base_ios.flags == 0xabababab, "expected %x got %x\n", 0xabababab, os2.base_ios.flags);
+    ok(os2.base_ios.precision == 0xabababab, "expected %d got %d\n", 0xabababab, os2.base_ios.precision);
+    ok(os2.base_ios.fill == (char) 0xab, "expected -85 got %d\n", os2.base_ios.fill);
+    ok(os2.base_ios.width == 0xabababab, "expected %d got %d\n", 0xabababab, os2.base_ios.width);
+    ok(os2.base_ios.do_lock == 0xabababab, "expected %d got %d\n", 0xabababab, os2.base_ios.do_lock);
+    call_func1(p_ostrstream_dtor, &os2.base_ios);
+    os1.base_ios.sb = NULL;
+    memset(&os2, 0xab, sizeof(ostream));
+    pos = call_func3(p_ostrstream_copy_ctor, &os2, &os1, TRUE);
+    ok(pos == &os2, "wrong return, expected %p got %p\n", &os2, pos);
+    ok(os2.unknown == 0, "expected 0 got %d\n", os2.unknown);
+    ok(os2.base_ios.sb == NULL, "expected %p got %p\n", NULL, os2.base_ios.sb);
+    ok(os2.base_ios.state == 0xcdcdcdcd, "expected %d got %d\n", 0xcdcdcdcd, os2.base_ios.state);
+    ok(os2.base_ios.delbuf == 0, "expected 0 got %d\n", os2.base_ios.delbuf);
+    ok(os2.base_ios.tie == os1.base_ios.tie, "expected %p got %p\n", os1.base_ios.tie, os2.base_ios.tie);
+    ok(os2.base_ios.flags == 0xcdcdcdcd, "expected %x got %x\n", 0xcdcdcdcd, os2.base_ios.flags);
+    ok(os2.base_ios.precision == (char) 0xcd, "expected -51 got %d\n", os2.base_ios.precision);
+    ok(os2.base_ios.fill == (char) 0xcd, "expected -51 got %d\n", os2.base_ios.fill);
+    ok(os2.base_ios.width == (char) 0xcd, "expected -51 got %d\n", os2.base_ios.width);
+    ok(os2.base_ios.do_lock == -1, "expected -1 got %d\n", os2.base_ios.do_lock);
+    call_func1(p_ostrstream_vbase_dtor, &os2);
+
+    /* assignment */
+    os2.unknown = 0xabababab;
+    memset(&os2.base_ios, 0xab, sizeof(ios));
+    os2.base_ios.delbuf = 0;
+    pos = call_func2(p_ostrstream_assign, &os2, &os1);
+    ok(pos == &os2, "wrong return, expected %p got %p\n", &os2, pos);
+    ok(os2.unknown == 0xabababab, "expected %d got %d\n", 0xabababab, os2.unknown);
+    ok(os2.base_ios.sb == NULL, "expected %p got %p\n", NULL, os2.base_ios.sb);
+    ok(os2.base_ios.state == IOSTATE_badbit, "expected %d got %d\n", IOSTATE_badbit, os2.base_ios.state);
+    ok(os2.base_ios.delbuf == 0, "expected 0 got %d\n", os2.base_ios.delbuf);
+    ok(os2.base_ios.tie == NULL, "expected %p got %p\n", NULL, os2.base_ios.tie);
+    ok(os2.base_ios.flags == 0, "expected %x got %x\n", 0, os2.base_ios.flags);
+    ok(os2.base_ios.precision == 6, "expected 6 got %d\n", os2.base_ios.precision);
+    ok(os2.base_ios.fill == ' ', "expected 32 got %d\n", os2.base_ios.fill);
+    ok(os2.base_ios.width == 0, "expected 0 got %d\n", os2.base_ios.width);
+    ok(os2.base_ios.do_lock == 0xabababab, "expected %d got %d\n", 0xabababab, os2.base_ios.do_lock);
+}
+
 static void test_istream(void)
 {
     istream is1, is2, *pis;
@@ -6375,6 +6661,7 @@ START_TEST(msvcirt)
     test_ostream();
     test_ostream_print();
     test_ostream_withassign();
+    test_ostrstream();
     test_istream();
     test_istream_getint();
     test_istream_getdouble();
-- 
2.7.4




More information about the wine-patches mailing list