=?UTF-8?Q?Iv=C3=A1n=20Matellanes=20?=: msvcirt: Implement filebuf:: overflow.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 17 09:01:13 CDT 2015


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

Author: Iván Matellanes <matellanesivan at gmail.com>
Date:   Mon Aug 10 20:09:20 2015 +0200

msvcirt: Implement filebuf::overflow.

---

 dlls/msvcirt/msvcirt.c       | 15 +++++++++++++--
 dlls/msvcirt/tests/msvcirt.c | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index 9dc2c63..1eb04cb 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -983,8 +983,19 @@ filebuf* __thiscall filebuf_open(filebuf *this, const char *name, ios_open_mode
 DEFINE_THISCALL_WRAPPER(filebuf_overflow, 8)
 int __thiscall filebuf_overflow(filebuf *this, int c)
 {
-    FIXME("(%p %d) stub\n", this, c);
-    return EOF;
+    TRACE("(%p %d)\n", this, c);
+    if (call_streambuf_sync(&this->base) == EOF)
+        return EOF;
+    if (this->base.unbuffered)
+        return (c == EOF) ? 1 : _write(this->fd, &c, 1);
+    if (streambuf_allocate(&this->base) == EOF)
+        return EOF;
+
+    this->base.pbase = this->base.pptr = this->base.base;
+    this->base.epptr = this->base.ebuf;
+    if (c != EOF)
+        *this->base.pptr++ = c;
+    return 1;
 }
 
 /* ?seekoff at filebuf@@UAEJJW4seek_dir at ios@@H at Z */
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index 3dccb67..1059e3a 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -160,6 +160,7 @@ static filebuf* (*__thiscall p_filebuf_close)(filebuf*);
 static int (*__thiscall p_filebuf_setmode)(filebuf*, int);
 static streambuf* (*__thiscall p_filebuf_setbuf)(filebuf*, char*, int);
 static int (*__thiscall p_filebuf_sync)(filebuf*);
+static int (*__thiscall p_filebuf_overflow)(filebuf*, int);
 
 /* ios */
 static ios* (*__thiscall p_ios_copy_ctor)(ios*, const ios*);
@@ -301,6 +302,7 @@ static BOOL init(void)
         SET(p_filebuf_setmode, "?setmode at filebuf@@QEAAHH at Z");
         SET(p_filebuf_setbuf, "?setbuf at filebuf@@UEAAPEAVstreambuf@@PEADH at Z");
         SET(p_filebuf_sync, "?sync at filebuf@@UEAAHXZ");
+        SET(p_filebuf_overflow, "?overflow at filebuf@@UEAAHH at Z");
 
         SET(p_ios_copy_ctor, "??0ios@@IEAA at AEBV0@@Z");
         SET(p_ios_ctor, "??0ios@@IEAA at XZ");
@@ -362,6 +364,7 @@ static BOOL init(void)
         SET(p_filebuf_setmode, "?setmode at filebuf@@QAEHH at Z");
         SET(p_filebuf_setbuf, "?setbuf at filebuf@@UAEPAVstreambuf@@PADH at Z");
         SET(p_filebuf_sync, "?sync at filebuf@@UAEHXZ");
+        SET(p_filebuf_overflow, "?overflow at filebuf@@UAEHH at Z");
 
         SET(p_ios_copy_ctor, "??0ios@@IAE at ABV0@@Z");
         SET(p_ios_ctor, "??0ios@@IAE at XZ");
@@ -1225,6 +1228,44 @@ static void test_filebuf(void)
     fb3.base.eback = fb3.base.gptr = fb3.base.egptr = NULL;
     fb3.base.pbase = fb3.base.pptr = fb3.base.epptr = NULL;
 
+    /* overflow */
+    ret = (int) call_func2(p_filebuf_overflow, &fb1, EOF);
+    ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
+    fb1.base.pbase = fb1.base.pptr = fb1.base.epptr = NULL;
+    fb1.base.eback = fb1.base.gptr = fb1.base.base;
+    fb1.base.egptr = fb1.base.ebuf;
+    ret = (int) call_func2(p_filebuf_overflow, &fb1, 'a');
+    ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
+    fb1.base.gptr = fb1.base.egptr = fb1.base.pbase = fb1.base.pptr = fb1.base.base + 256;
+    fb1.base.epptr = fb1.base.ebuf;
+    ret = (int) call_func3(p_streambuf_xsputn, &fb1.base, "I just want to tell you how I'm feeling", 39);
+    ok(ret == 39, "wrong return, expected 39 got %d\n", ret);
+    ret = (int) call_func2(p_filebuf_overflow, &fb1, '\n');
+    ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
+    ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
+    ok(fb1.base.pbase == fb1.base.base, "wrong put base, expected %p got %p\n", fb1.base.base, fb1.base.pbase);
+    ok(fb1.base.pptr == fb1.base.base + 1, "wrong put pointer, expected %p got %p\n", fb1.base.base + 1, fb1.base.pptr);
+    ok(fb1.base.epptr == fb1.base.ebuf, "wrong put end pointer, expected %p got %p\n", fb1.base.ebuf, fb1.base.epptr);
+    ok(*fb1.base.pbase == '\n', "wrong character, expected '\\n' got '%c'\n", *fb1.base.pbase);
+    ret = (int) call_func2(p_filebuf_overflow, &fb1, EOF);
+    ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
+    ok(fb1.base.gptr == NULL, "wrong get pointer, expected %p got %p\n", NULL, fb1.base.gptr);
+    ok(fb1.base.pbase == fb1.base.base, "wrong put base, expected %p got %p\n", fb1.base.base, fb1.base.pbase);
+    ok(fb1.base.pptr == fb1.base.base, "wrong put pointer, expected %p got %p\n", fb1.base.base, fb1.base.pptr);
+    ok(fb1.base.epptr == fb1.base.ebuf, "wrong put end pointer, expected %p got %p\n", fb1.base.ebuf, fb1.base.epptr);
+    ret = (int) call_func2(p_filebuf_overflow, &fb2, EOF);
+    ok(ret == EOF, "wrong return, expected EOF got %d\n", ret);
+    fb2.base.do_lock = 0;
+    pret = (filebuf*) call_func4(p_filebuf_open, &fb2, filename2, OPENMODE_in|OPENMODE_out, filebuf_openprot);
+    ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
+    fb2.base.do_lock = -1;
+    ret = (int) call_func2(p_filebuf_overflow, &fb2, EOF);
+    ok(ret == 1, "wrong return, expected 1 got %d\n", ret);
+    fb2.base.do_lock = 0;
+    pret = (filebuf*) call_func1(p_filebuf_close, &fb2);
+    ok(pret == &fb2, "wrong return, expected %p got %p\n", &fb2, pret);
+    fb2.base.do_lock = -1;
+
     /* close */
     pret = (filebuf*) call_func1(p_filebuf_close, &fb2);
     ok(pret == NULL, "wrong return, expected %p got %p\n", NULL, pret);




More information about the wine-cvs mailing list