msvcirt: Add implementation of streambuf::pbackfail.

This commit is contained in:
Iván Matellanes 2015-06-29 10:01:48 +02:00 committed by Alexandre Julliard
parent ec6859f7e8
commit 6cca77bf2a
2 changed files with 31 additions and 2 deletions

View File

@ -367,8 +367,10 @@ int __thiscall streambuf_overflow(streambuf *this, int c)
DEFINE_THISCALL_WRAPPER(streambuf_pbackfail, 8) DEFINE_THISCALL_WRAPPER(streambuf_pbackfail, 8)
int __thiscall streambuf_pbackfail(streambuf *this, int c) int __thiscall streambuf_pbackfail(streambuf *this, int c)
{ {
FIXME("(%p %d): stub\n", this, c); TRACE("(%p %d)\n", this, c);
return 0; if (this->gptr <= this->eback)
return EOF;
return *--this->gptr = c;
} }
/* ?seekoff@streambuf@@UAEJJW4seek_dir@ios@@H@Z */ /* ?seekoff@streambuf@@UAEJJW4seek_dir@ios@@H@Z */

View File

@ -57,6 +57,7 @@ static void (*__thiscall p_streambuf_clrclock)(streambuf*);
static int (*__thiscall p_streambuf_doallocate)(streambuf*); static int (*__thiscall p_streambuf_doallocate)(streambuf*);
static void (*__thiscall p_streambuf_gbump)(streambuf*, int); static void (*__thiscall p_streambuf_gbump)(streambuf*, int);
static void (*__thiscall p_streambuf_lock)(streambuf*); static void (*__thiscall p_streambuf_lock)(streambuf*);
static int (*__thiscall p_streambuf_pbackfail)(streambuf*, int);
static void (*__thiscall p_streambuf_pbump)(streambuf*, int); static void (*__thiscall p_streambuf_pbump)(streambuf*, int);
static int (*__thiscall p_streambuf_sbumpc)(streambuf*); static int (*__thiscall p_streambuf_sbumpc)(streambuf*);
static void (*__thiscall p_streambuf_setb)(streambuf*, char*, char*, int); static void (*__thiscall p_streambuf_setb)(streambuf*, char*, char*, int);
@ -148,6 +149,7 @@ static BOOL init(void)
SET(p_streambuf_doallocate, "?doallocate@streambuf@@MEAAHXZ"); SET(p_streambuf_doallocate, "?doallocate@streambuf@@MEAAHXZ");
SET(p_streambuf_gbump, "?gbump@streambuf@@IEAAXH@Z"); SET(p_streambuf_gbump, "?gbump@streambuf@@IEAAXH@Z");
SET(p_streambuf_lock, "?lock@streambuf@@QEAAXXZ"); SET(p_streambuf_lock, "?lock@streambuf@@QEAAXXZ");
SET(p_streambuf_pbackfail, "?pbackfail@streambuf@@UEAAHH@Z");
SET(p_streambuf_pbump, "?pbump@streambuf@@IEAAXH@Z"); SET(p_streambuf_pbump, "?pbump@streambuf@@IEAAXH@Z");
SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QEAAHXZ"); SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QEAAHXZ");
SET(p_streambuf_setb, "?setb@streambuf@@IEAAXPEAD0H@Z"); SET(p_streambuf_setb, "?setb@streambuf@@IEAAXPEAD0H@Z");
@ -170,6 +172,7 @@ static BOOL init(void)
SET(p_streambuf_doallocate, "?doallocate@streambuf@@MAEHXZ"); SET(p_streambuf_doallocate, "?doallocate@streambuf@@MAEHXZ");
SET(p_streambuf_gbump, "?gbump@streambuf@@IAEXH@Z"); SET(p_streambuf_gbump, "?gbump@streambuf@@IAEXH@Z");
SET(p_streambuf_lock, "?lock@streambuf@@QAEXXZ"); SET(p_streambuf_lock, "?lock@streambuf@@QAEXXZ");
SET(p_streambuf_pbackfail, "?pbackfail@streambuf@@UAEHH@Z");
SET(p_streambuf_pbump, "?pbump@streambuf@@IAEXH@Z"); SET(p_streambuf_pbump, "?pbump@streambuf@@IAEXH@Z");
SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QAEHXZ"); SET(p_streambuf_sbumpc, "?sbumpc@streambuf@@QAEHXZ");
SET(p_streambuf_setb, "?setb@streambuf@@IAEXPAD0H@Z"); SET(p_streambuf_setb, "?setb@streambuf@@IAEXPAD0H@Z");
@ -689,6 +692,30 @@ static void test_streambuf(void)
ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char); ok(sb3.stored_char == EOF, "wrong stored character, expected EOF got %c\n", sb3.stored_char);
ok(underflow_count == 57, "no call to underflow expected\n"); ok(underflow_count == 57, "no call to underflow expected\n");
/* pbackfail */
ret = (int) call_func2(p_streambuf_pbackfail, &sb, 'A');
ok(ret == 'A', "expected 'A' got '%c'\n", ret);
ok(sb.gptr == sb.eback + 2, "wrong get pointer, expected %p got %p\n", sb.eback + 2, sb.gptr);
ok(*sb.gptr == 'A', "expected 'A' in the get area, got %c\n", *sb.gptr);
ret = (int) call_func2(p_streambuf_pbackfail, &sb, EOF);
ok(ret == EOF, "expected EOF got '%c'\n", ret);
ok(sb.gptr == sb.eback + 1, "wrong get pointer, expected %p got %p\n", sb.eback + 1, sb.gptr);
ok(*sb.gptr == EOF, "expected EOF in the get area, got %c\n", *sb.gptr);
sb.gptr = sb.eback;
ret = (int) call_func2(p_streambuf_pbackfail, &sb, 'Z');
ok(ret == EOF, "expected EOF got '%c'\n", ret);
ok(sb.gptr == sb.eback, "wrong get pointer, expected %p got %p\n", sb.eback, sb.gptr);
ok(*sb.gptr == 'T', "expected 'T' in the get area, got %c\n", *sb.gptr);
ret = (int) call_func2(p_streambuf_pbackfail, &sb, EOF);
ok(ret == EOF, "expected EOF got '%c'\n", ret);
ok(sb.gptr == sb.eback, "wrong get pointer, expected %p got %p\n", sb.eback, sb.gptr);
ok(*sb.gptr == 'T', "expected 'T' in the get area, got %c\n", *sb.gptr);
sb2.gptr = sb2.egptr + 1;
ret = (int) call_func2(p_streambuf_pbackfail, &sb2, 'X');
ok(ret == 'X', "expected 'X' got '%c'\n", ret);
ok(sb2.gptr == sb2.egptr, "wrong get pointer, expected %p got %p\n", sb2.egptr, sb2.gptr);
ok(*sb2.gptr == 'X', "expected 'X' in the get area, got %c\n", *sb2.gptr);
SetEvent(lock_arg.test[3]); SetEvent(lock_arg.test[3]);
WaitForSingleObject(thread, INFINITE); WaitForSingleObject(thread, INFINITE);