[3/4] msvcirt: Implement ios::setf (try 4)

Iván Matellanes matellanesivan at gmail.com
Thu Jul 16 05:29:31 CDT 2015


---
 dlls/msvcirt/msvcirt.c       | 22 ++++++++++++++++++----
 dlls/msvcirt/tests/msvcirt.c | 20 ++++++++++++++++++++
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index 2274d77..2a2d30a 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -82,6 +82,8 @@ typedef struct {
 } ios;
 
 ios* __thiscall ios_assign(ios*, const ios*);
+void __cdecl ios_lock(ios*);
+void __cdecl ios_unlock(ios*);
 
 /* class ostream */
 typedef struct _ostream {
@@ -1086,8 +1088,14 @@ int __thiscall ios_rdstate(const ios *this)
 DEFINE_THISCALL_WRAPPER(ios_setf, 8)
 LONG __thiscall ios_setf(ios *this, LONG flags)
 {
-    FIXME("(%p %x) stub\n", this, flags);
-    return 0;
+    LONG prev = this->flags;
+
+    TRACE("(%p %x)\n", this, flags);
+
+    ios_lock(this);
+    this->flags |= flags;
+    ios_unlock(this);
+    return prev;
 }
 
 /* ?setf at ios@@QAEJJJ at Z */
@@ -1095,8 +1103,14 @@ LONG __thiscall ios_setf(ios *this, LONG flags)
 DEFINE_THISCALL_WRAPPER(ios_setf_mask, 12)
 LONG __thiscall ios_setf_mask(ios *this, LONG flags, LONG mask)
 {
-    FIXME("(%p %x %x) stub\n", this, flags, mask);
-    return 0;
+    LONG prev = this->flags;
+
+    TRACE("(%p %x %x)\n", this, flags, mask);
+
+    ios_lock(this);
+    this->flags = (this->flags & (~mask)) | (flags & mask);
+    ios_unlock(this);
+    return prev;
 }
 
 /* ?setlock at ios@@QAAXXZ */
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index faddae1..05fb84c 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -139,6 +139,8 @@ static void (*__cdecl p_ios_lockc)(void);
 static void (*__cdecl p_ios_unlockc)(void);
 static LONG (*__thiscall p_ios_flags_set)(ios*, LONG);
 static LONG (*__thiscall p_ios_flags_get)(const ios*);
+static LONG (*__thiscall p_ios_setf)(ios*, LONG);
+static LONG (*__thiscall p_ios_setf_mask)(ios*, LONG, LONG);
 
 /* Emulate a __thiscall */
 #ifdef __i386__
@@ -249,6 +251,8 @@ static BOOL init(void)
         SET(p_ios_unlockbuf, "?unlockbuf at ios@@QEAAXXZ");
         SET(p_ios_flags_set, "?flags at ios@@QEAAJJ at Z");
         SET(p_ios_flags_get, "?flags at ios@@QEBAJXZ");
+        SET(p_ios_setf, "?setf at ios@@QEAAJJ at Z");
+        SET(p_ios_setf_mask, "?setf at ios@@QEAAJJJ at Z");
     } else {
         p_operator_new = (void*)GetProcAddress(msvcrt, "??2 at YAPAXI@Z");
 
@@ -289,6 +293,8 @@ static BOOL init(void)
         SET(p_ios_unlockbuf, "?unlockbuf at ios@@QAAXXZ");
         SET(p_ios_flags_set, "?flags at ios@@QAEJJ at Z");
         SET(p_ios_flags_get, "?flags at ios@@QBEJXZ");
+        SET(p_ios_setf, "?setf at ios@@QAEJJ at Z");
+        SET(p_ios_setf_mask, "?setf at ios@@QAEJJJ at Z");
     }
     SET(p_ios_static_lock, "?x_lockc at ios@@0U_CRT_CRITICAL_SECTION@@A");
     SET(p_ios_lockc, "?lockc at ios@@KAXXZ");
@@ -1002,6 +1008,20 @@ static void test_ios(void)
     ok(ret == 0x444, "expected %x got %x\n", 0x444, ret);
     ok(ios_obj.flags == 0, "expected %x got %x\n", 0, ios_obj.flags);
 
+    /* setf */
+    ios_obj.do_lock = 0;
+    ios_obj.flags = 0x8400;
+    ret = (LONG) call_func2(p_ios_setf, &ios_obj, 0x444);
+    ok(ret == 0x8400, "expected %x got %x\n", 0x8400, ret);
+    ok(ios_obj.flags == 0x8444, "expected %x got %x\n", 0x8444, ios_obj.flags);
+    ret = (LONG) call_func3(p_ios_setf_mask, &ios_obj, 0x111, 0);
+    ok(ret == 0x8444, "expected %x got %x\n", 0x8444, ret);
+    ok(ios_obj.flags == 0x8444, "expected %x got %x\n", 0x8444, ios_obj.flags);
+    ret = (LONG) call_func3(p_ios_setf_mask, &ios_obj, 0x111, 0x105);
+    ok(ret == 0x8444, "expected %x got %x\n", 0x8444, ret);
+    ok(ios_obj.flags == 0x8541, "expected %x got %x\n", 0x8541, ios_obj.flags);
+    ios_obj.do_lock = -1;
+
     SetEvent(lock_arg.release[0]);
     SetEvent(lock_arg.release[1]);
     SetEvent(lock_arg.release[2]);
-- 
2.1.4




More information about the wine-patches mailing list