msvcirt: Add implementation of streambuf::sputc.
This commit is contained in:
parent
b08d0bc75d
commit
540f644ceb
|
@ -355,6 +355,7 @@ int __thiscall streambuf_out_waiting(const streambuf *this)
|
||||||
|
|
||||||
/* Unexported */
|
/* Unexported */
|
||||||
DEFINE_THISCALL_WRAPPER(streambuf_overflow, 8)
|
DEFINE_THISCALL_WRAPPER(streambuf_overflow, 8)
|
||||||
|
#define call_streambuf_overflow(this, c) CALL_VTBL_FUNC(this, 28, int, (streambuf*, int), (this, c))
|
||||||
int __thiscall streambuf_overflow(streambuf *this, int c)
|
int __thiscall streambuf_overflow(streambuf *this, int c)
|
||||||
{
|
{
|
||||||
return EOF;
|
return EOF;
|
||||||
|
@ -528,6 +529,15 @@ int __thiscall streambuf_sgetc(streambuf *this)
|
||||||
return call_streambuf_underflow(this);
|
return call_streambuf_underflow(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ?sputc@streambuf@@QAEHH@Z */
|
||||||
|
/* ?sputc@streambuf@@QEAAHH@Z */
|
||||||
|
DEFINE_THISCALL_WRAPPER(streambuf_sputc, 8)
|
||||||
|
int __thiscall streambuf_sputc(streambuf *this, int ch)
|
||||||
|
{
|
||||||
|
TRACE("(%p %d)\n", this, ch);
|
||||||
|
return (this->pptr < this->epptr) ? *this->pptr++ = ch : call_streambuf_overflow(this, ch);
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* ??1ios@@UAE@XZ (MSVCRTI.@)
|
* ??1ios@@UAE@XZ (MSVCRTI.@)
|
||||||
* class ios & __thiscall ios::-ios<<(void)
|
* class ios & __thiscall ios::-ios<<(void)
|
||||||
|
|
|
@ -704,8 +704,8 @@
|
||||||
@ stub -arch=win64 ?snextc@streambuf@@QEAAHXZ
|
@ stub -arch=win64 ?snextc@streambuf@@QEAAHXZ
|
||||||
@ stub -arch=win32 ?sputbackc@streambuf@@QAEHD@Z # int __thiscall streambuf::sputbackc(char)
|
@ stub -arch=win32 ?sputbackc@streambuf@@QAEHD@Z # int __thiscall streambuf::sputbackc(char)
|
||||||
@ stub -arch=win64 ?sputbackc@streambuf@@QEAAHD@Z
|
@ stub -arch=win64 ?sputbackc@streambuf@@QEAAHD@Z
|
||||||
@ stub -arch=win32 ?sputc@streambuf@@QAEHH@Z # int __thiscall streambuf::sputc(int)
|
@ thiscall -arch=win32 ?sputc@streambuf@@QAEHH@Z(ptr long) streambuf_sputc
|
||||||
@ stub -arch=win64 ?sputc@streambuf@@QEAAHH@Z
|
@ cdecl -arch=win64 ?sputc@streambuf@@QEAAHH@Z(ptr long) streambuf_sputc
|
||||||
@ stub -arch=win32 ?sputn@streambuf@@QAEHPBDH@Z # int __thiscall streambuf::sputn(char const *,int)
|
@ stub -arch=win32 ?sputn@streambuf@@QAEHPBDH@Z # int __thiscall streambuf::sputn(char const *,int)
|
||||||
@ stub -arch=win64 ?sputn@streambuf@@QEAAHPEBDH@Z
|
@ stub -arch=win64 ?sputn@streambuf@@QEAAHPEBDH@Z
|
||||||
@ stub -arch=win32 ?stdiofile@stdiobuf@@QAEPAU_iobuf@@XZ # struct _iobuf * __thiscall stdiobuf::stdiofile(void)
|
@ stub -arch=win32 ?stdiofile@stdiobuf@@QAEPAU_iobuf@@XZ # struct _iobuf * __thiscall stdiobuf::stdiofile(void)
|
||||||
|
|
|
@ -62,6 +62,7 @@ static void (*__thiscall p_streambuf_setb)(streambuf*, char*, char*, int);
|
||||||
static void (*__thiscall p_streambuf_setlock)(streambuf*);
|
static void (*__thiscall p_streambuf_setlock)(streambuf*);
|
||||||
static streambuf* (*__thiscall p_streambuf_setbuf)(streambuf*, char*, int);
|
static streambuf* (*__thiscall p_streambuf_setbuf)(streambuf*, char*, int);
|
||||||
static int (*__thiscall p_streambuf_sgetc)(streambuf*);
|
static int (*__thiscall p_streambuf_sgetc)(streambuf*);
|
||||||
|
static int (*__thiscall p_streambuf_sputc)(streambuf*, int);
|
||||||
static int (*__thiscall p_streambuf_sync)(streambuf*);
|
static int (*__thiscall p_streambuf_sync)(streambuf*);
|
||||||
static void (*__thiscall p_streambuf_unlock)(streambuf*);
|
static void (*__thiscall p_streambuf_unlock)(streambuf*);
|
||||||
|
|
||||||
|
@ -147,6 +148,7 @@ static BOOL init(void)
|
||||||
SET(p_streambuf_setbuf, "?setbuf@streambuf@@UEAAPEAV1@PEADH@Z");
|
SET(p_streambuf_setbuf, "?setbuf@streambuf@@UEAAPEAV1@PEADH@Z");
|
||||||
SET(p_streambuf_setlock, "?setlock@streambuf@@QEAAXXZ");
|
SET(p_streambuf_setlock, "?setlock@streambuf@@QEAAXXZ");
|
||||||
SET(p_streambuf_sgetc, "?sgetc@streambuf@@QEAAHXZ");
|
SET(p_streambuf_sgetc, "?sgetc@streambuf@@QEAAHXZ");
|
||||||
|
SET(p_streambuf_sputc, "?sputc@streambuf@@QEAAHH@Z");
|
||||||
SET(p_streambuf_sync, "?sync@streambuf@@UEAAHXZ");
|
SET(p_streambuf_sync, "?sync@streambuf@@UEAAHXZ");
|
||||||
SET(p_streambuf_unlock, "?unlock@streambuf@@QEAAXXZ");
|
SET(p_streambuf_unlock, "?unlock@streambuf@@QEAAXXZ");
|
||||||
} else {
|
} else {
|
||||||
|
@ -163,6 +165,7 @@ static BOOL init(void)
|
||||||
SET(p_streambuf_setbuf, "?setbuf@streambuf@@UAEPAV1@PADH@Z");
|
SET(p_streambuf_setbuf, "?setbuf@streambuf@@UAEPAV1@PADH@Z");
|
||||||
SET(p_streambuf_setlock, "?setlock@streambuf@@QAEXXZ");
|
SET(p_streambuf_setlock, "?setlock@streambuf@@QAEXXZ");
|
||||||
SET(p_streambuf_sgetc, "?sgetc@streambuf@@QAEHXZ");
|
SET(p_streambuf_sgetc, "?sgetc@streambuf@@QAEHXZ");
|
||||||
|
SET(p_streambuf_sputc, "?sputc@streambuf@@QAEHH@Z");
|
||||||
SET(p_streambuf_sync, "?sync@streambuf@@UAEHXZ");
|
SET(p_streambuf_sync, "?sync@streambuf@@UAEHXZ");
|
||||||
SET(p_streambuf_unlock, "?unlock@streambuf@@QAEXXZ");
|
SET(p_streambuf_unlock, "?unlock@streambuf@@QAEXXZ");
|
||||||
}
|
}
|
||||||
|
@ -171,7 +174,20 @@ static BOOL init(void)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int underflow_count;
|
static int overflow_count, underflow_count;
|
||||||
|
static streambuf *test_overflow_this;
|
||||||
|
|
||||||
|
#ifdef __i386__
|
||||||
|
static int __thiscall test_streambuf_overflow(int ch)
|
||||||
|
#else
|
||||||
|
static int __thiscall test_streambuf_overflow(streambuf *this, int ch)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
overflow_count++;
|
||||||
|
if (!test_overflow_this->unbuffered)
|
||||||
|
test_overflow_this->pptr = test_overflow_this->pbase + 5;
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
static int __thiscall test_streambuf_underflow(void)
|
static int __thiscall test_streambuf_underflow(void)
|
||||||
|
@ -243,10 +259,11 @@ static void test_streambuf(void)
|
||||||
ok(sb3.ebuf == NULL, "wrong ebuf pointer, expected %p got %p\n", NULL, sb3.ebuf);
|
ok(sb3.ebuf == NULL, "wrong ebuf pointer, expected %p got %p\n", NULL, sb3.ebuf);
|
||||||
|
|
||||||
memcpy(test_streambuf_vtbl, sb.vtable, sizeof(test_streambuf_vtbl));
|
memcpy(test_streambuf_vtbl, sb.vtable, sizeof(test_streambuf_vtbl));
|
||||||
|
test_streambuf_vtbl[7] = (vtable_ptr)&test_streambuf_overflow;
|
||||||
test_streambuf_vtbl[8] = (vtable_ptr)&test_streambuf_underflow;
|
test_streambuf_vtbl[8] = (vtable_ptr)&test_streambuf_underflow;
|
||||||
sb2.vtable = test_streambuf_vtbl;
|
sb2.vtable = test_streambuf_vtbl;
|
||||||
sb3.vtable = test_streambuf_vtbl;
|
sb3.vtable = test_streambuf_vtbl;
|
||||||
underflow_count = 0;
|
overflow_count = underflow_count = 0;
|
||||||
|
|
||||||
/* setlock */
|
/* setlock */
|
||||||
ok(sb.do_lock == -1, "expected do_lock value -1, got %d\n", sb.do_lock);
|
ok(sb.do_lock == -1, "expected do_lock value -1, got %d\n", sb.do_lock);
|
||||||
|
@ -430,6 +447,30 @@ static void test_streambuf(void)
|
||||||
ok(underflow_count == 3, "no call to underflow expected\n");
|
ok(underflow_count == 3, "no call to underflow expected\n");
|
||||||
ok(sb3.stored_char == 'b', "wrong stored character, expected 'b' got %c\n", sb3.stored_char);
|
ok(sb3.stored_char == 'b', "wrong stored character, expected 'b' got %c\n", sb3.stored_char);
|
||||||
|
|
||||||
|
/* sputc */
|
||||||
|
*sb.pbase = 'a';
|
||||||
|
ret = (int) call_func2(p_streambuf_sputc, &sb, 'c');
|
||||||
|
ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
|
||||||
|
ok(overflow_count == 0, "no call to overflow expected\n");
|
||||||
|
ok(*sb.pbase == 'c', "expected 'c' in the put area, got %c\n", *sb.pbase);
|
||||||
|
ok(sb.pptr == sb.pbase + 1, "wrong put pointer, expected %p got %p\n", sb.pbase + 1, sb.pptr);
|
||||||
|
test_overflow_this = &sb2;
|
||||||
|
ret = (int) call_func2(p_streambuf_sputc, &sb2, 'c');
|
||||||
|
ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
|
||||||
|
ok(overflow_count == 1, "expected call to overflow\n");
|
||||||
|
ok(sb2.pptr == sb2.pbase + 5, "wrong put pointer, expected %p got %p\n", sb2.pbase + 5, sb2.pptr);
|
||||||
|
test_overflow_this = &sb3;
|
||||||
|
ret = (int) call_func2(p_streambuf_sputc, &sb3, 'c');
|
||||||
|
ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
|
||||||
|
ok(overflow_count == 2, "expected call to overflow\n");
|
||||||
|
sb3.pbase = sb3.pptr = sb3.base;
|
||||||
|
sb3.epptr = sb3.ebuf;
|
||||||
|
ret = (int) call_func2(p_streambuf_sputc, &sb3, 'c');
|
||||||
|
ok(ret == 'c', "wrong return value, expected 'c' got %d\n", ret);
|
||||||
|
ok(overflow_count == 2, "no call to overflow expected\n");
|
||||||
|
ok(*sb3.pbase == 'c', "expected 'c' in the put area, got %c\n", *sb3.pbase);
|
||||||
|
sb3.pbase = sb3.pptr = sb3.epptr = NULL;
|
||||||
|
|
||||||
SetEvent(lock_arg.test[3]);
|
SetEvent(lock_arg.test[3]);
|
||||||
WaitForSingleObject(thread, INFINITE);
|
WaitForSingleObject(thread, INFINITE);
|
||||||
|
|
||||||
|
|
|
@ -692,8 +692,8 @@
|
||||||
@ stub -arch=win64 ?snextc@streambuf@@QEAAHXZ
|
@ stub -arch=win64 ?snextc@streambuf@@QEAAHXZ
|
||||||
@ stub -arch=win32 ?sputbackc@streambuf@@QAEHD@Z
|
@ stub -arch=win32 ?sputbackc@streambuf@@QAEHD@Z
|
||||||
@ stub -arch=win64 ?sputbackc@streambuf@@QEAAHD@Z
|
@ stub -arch=win64 ?sputbackc@streambuf@@QEAAHD@Z
|
||||||
@ stub -arch=win32 ?sputc@streambuf@@QAEHH@Z
|
@ thiscall -arch=win32 ?sputc@streambuf@@QAEHH@Z(ptr long) msvcirt.?sputc@streambuf@@QAEHH@Z
|
||||||
@ stub -arch=win64 ?sputc@streambuf@@QEAAHH@Z
|
@ cdecl -arch=win64 ?sputc@streambuf@@QEAAHH@Z(ptr long) msvcirt.?sputc@streambuf@@QEAAHH@Z
|
||||||
@ stub -arch=win32 ?sputn@streambuf@@QAEHPBDH@Z
|
@ stub -arch=win32 ?sputn@streambuf@@QAEHPBDH@Z
|
||||||
@ stub -arch=win64 ?sputn@streambuf@@QEAAHPEBDH@Z
|
@ stub -arch=win64 ?sputn@streambuf@@QEAAHPEBDH@Z
|
||||||
@ stub -arch=win32 ?stdiofile@stdiobuf@@QAEPAU_iobuf@@XZ
|
@ stub -arch=win32 ?stdiofile@stdiobuf@@QAEPAU_iobuf@@XZ
|
||||||
|
|
|
@ -764,8 +764,8 @@
|
||||||
@ stub -arch=win64 ?snextc@streambuf@@QEAAHXZ
|
@ stub -arch=win64 ?snextc@streambuf@@QEAAHXZ
|
||||||
@ stub -arch=win32 ?sputbackc@streambuf@@QAEHD@Z
|
@ stub -arch=win32 ?sputbackc@streambuf@@QAEHD@Z
|
||||||
@ stub -arch=win64 ?sputbackc@streambuf@@QEAAHD@Z
|
@ stub -arch=win64 ?sputbackc@streambuf@@QEAAHD@Z
|
||||||
@ stub -arch=win32 ?sputc@streambuf@@QAEHH@Z
|
@ thiscall -arch=win32 ?sputc@streambuf@@QAEHH@Z(ptr long) msvcirt.?sputc@streambuf@@QAEHH@Z
|
||||||
@ stub -arch=win64 ?sputc@streambuf@@QEAAHH@Z
|
@ cdecl -arch=win64 ?sputc@streambuf@@QEAAHH@Z(ptr long) msvcirt.?sputc@streambuf@@QEAAHH@Z
|
||||||
@ stub -arch=win32 ?sputn@streambuf@@QAEHPBDH@Z
|
@ stub -arch=win32 ?sputn@streambuf@@QAEHPBDH@Z
|
||||||
@ stub -arch=win64 ?sputn@streambuf@@QEAAHPEBDH@Z
|
@ stub -arch=win64 ?sputn@streambuf@@QEAAHPEBDH@Z
|
||||||
@ stub -arch=win32 ?stdiofile@stdiobuf@@QAEPAU_iobuf@@XZ
|
@ stub -arch=win32 ?stdiofile@stdiobuf@@QAEPAU_iobuf@@XZ
|
||||||
|
|
Loading…
Reference in New Issue