Iván Matellanes : msvcirt: Implement ios::setf.
Module: wine Branch: master Commit: 968d07dd7bac357a1dcdcb20b7f490de07433da1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=968d07dd7bac357a1dcdcb20b7... Author: Iván Matellanes <matellanesivan(a)gmail.com> Date: Thu Jul 16 13:12:40 2015 +0200 msvcirt: Implement ios::setf. --- 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 0a9dc34..f0ae115 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(a)ios@@QAEJJJ(a)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(a)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(a)ios@@QEAAXXZ"); SET(p_ios_flags_set, "?flags(a)ios@@QEAAJJ(a)Z"); SET(p_ios_flags_get, "?flags(a)ios@@QEBAJXZ"); + SET(p_ios_setf, "?setf(a)ios@@QEAAJJ(a)Z"); + SET(p_ios_setf_mask, "?setf(a)ios@@QEAAJJJ(a)Z"); } else { p_operator_new = (void*)GetProcAddress(msvcrt, "??2(a)YAPAXI@Z"); @@ -289,6 +293,8 @@ static BOOL init(void) SET(p_ios_unlockbuf, "?unlockbuf(a)ios@@QAAXXZ"); SET(p_ios_flags_set, "?flags(a)ios@@QAEJJ(a)Z"); SET(p_ios_flags_get, "?flags(a)ios@@QBEJXZ"); + SET(p_ios_setf, "?setf(a)ios@@QAEJJ(a)Z"); + SET(p_ios_setf_mask, "?setf(a)ios@@QAEJJJ(a)Z"); } SET(p_ios_static_lock, "?x_lockc(a)ios@@0U_CRT_CRITICAL_SECTION@@A"); SET(p_ios_lockc, "?lockc(a)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]);
participants (1)
-
Alexandre Julliard